Vue.js + Spring Boot example | Spring Data JPA + REST + MariaDB CRUD

vue-spring-boot-mariadb-example-spring-data-rest-mariadb-crud-example-feature-image

Tutorial: Vue.js SpringBoot CRUD MariaDB Example | Spring Data JPA + REST + MariaDB CRUD

In this Vue.js SpringBoot tutorial, we show you Vue.js Http Client & Spring Boot Server example that uses Spring JPA to do CRUD with MariaDB and Vue.js as a front-end technology to make request and receive response.

Related Posts:
MariaDB – How to use Spring JPA MariaDB | Spring Boot
Vue Router example – with Nav Bar, Dynamic Route & Nested Routes
Reactjs JWT Authentication Example

Technologies – Vuejs SpringBoot MariaDB

– Java 1.8
– Maven 3.3.9
– Spring Tool Suite – Version 3.8.4.RELEASE
– Spring Boot: 2.0.5.RELEASE

– Vue 2.5.17
– Vue Router 3
– Axios 0.18.0

Overview – Vue.js Spring Boot CRUD MariaDB Example

This is full-stack Architecture:

vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-architecture
vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-architecture

Demo

1. Implement Spring Boot CRUD MariaDB Server

vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-spring-server-architecture
vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-spring-server-architecture

2. Vue.js RestAPI CRUD Client

vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-vue-client-ui
vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-vue-client-ui

Practice – Vue.js Spring Boot CRUD MariaDB Example

1. Spring Boot Server

vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-spring-server-structure

Customer class corresponds to entity and table customer.
CustomerRepository is an interface extends CrudRepository, will be autowired in CustomerController for implementing repository methods and custom finder methods.
CustomerController is a REST Controller which has request mapping methods for RESTful requests such as: getAllCustomers, postCustomer, deleteCustomer, findByAge, updateCustomer.
– Configuration for Spring Datasource and Spring JPA properties in application.properties
Dependencies for Spring Boot and MariaDB in pom.xml

1.1 Dependency


<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.mariadb.jdbc</groupId>
	<artifactId>mariadb-java-client</artifactId>
</dependency>

1.2 Data Model

model/Customer.java


package com.ozenero.spring.restapi.mariadb.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "customer")
public class Customer {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;

	@Column(name = "name")
	private String name;

	@Column(name = "age")
	private int age;

	@Column(name = "active")
	private boolean active;

	public Customer() {
	}

	public Customer(String name, int age) {
		this.name = name;
		this.age = age;
		this.active = false;
	}

	public long getId() {
		return id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return this.name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getAge() {
		return this.age;
	}

	public boolean isActive() {
		return active;
	}

	public void setActive(boolean active) {
		this.active = active;
	}

	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", age=" + age + ", active=" + active + "]";
	}
}

1.3 JPA Repository

repo/CustomerRepository.java


package com.ozenero.spring.restapi.mariadb.repo;

import java.util.List;

import org.springframework.data.repository.CrudRepository;

import com.ozenero.spring.restapi.mariadb.model.Customer;

public interface CustomerRepository extends CrudRepository {
	List findByAge(int age);
}

1.4 REST Controller

controller/CustomerController.java


package com.ozenero.spring.restapi.mariadb.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.ozenero.spring.restapi.mariadb.model.Customer;
import com.ozenero.spring.restapi.mariadb.repo.CustomerRepository;

@CrossOrigin(origins = "http://localhost:4200")
@RestController
@RequestMapping("/api")
public class CustomerController {

	@Autowired
	CustomerRepository repository;

	@GetMapping("/customers")
	public List getAllCustomers() {
		System.out.println("Get all Customers...");

		List customers = new ArrayList<>();
		repository.findAll().forEach(customers::add);

		return customers;
	}

	@PostMapping("/customer")
	public Customer postCustomer(@RequestBody Customer customer) {

		Customer _customer = repository.save(new Customer(customer.getName(), customer.getAge()));
		return _customer;
	}

	@DeleteMapping("/customer/{id}")
	public ResponseEntity deleteCustomer(@PathVariable("id") long id) {
		System.out.println("Delete Customer with ID = " + id + "...");

		repository.deleteById(id);

		return new ResponseEntity<>("Customer has been deleted!", HttpStatus.OK);
	}

	@GetMapping("customers/age/{age}")
	public List findByAge(@PathVariable int age) {

		List customers = repository.findByAge(age);
		return customers;
	}

	@PutMapping("/customer/{id}")
	public ResponseEntity updateCustomer(@PathVariable("id") long id, @RequestBody Customer customer) {
		System.out.println("Update Customer with ID = " + id + "...");

		Optional customerData = repository.findById(id);

		if (customerData.isPresent()) {
			Customer _customer = customerData.get();
			_customer.setName(customer.getName());
			_customer.setAge(customer.getAge());
			_customer.setActive(customer.isActive());
			return new ResponseEntity<>(repository.save(_customer), HttpStatus.OK);
		} else {
			return new ResponseEntity<>(HttpStatus.NOT_FOUND);
		}
	}
}

1.5 Configuration for Spring Datasource & JPA properties

application.properties


spring.datasource.url=jdbc:mariadb://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.generate-ddl=true

2. Vue.js Client

vue-spring-boot-mariadb-example-spring-data-mariadb-rest-api-vue-client-structure

package.json with 3 main modules: vue, vue-router, axios.
– 4 components: CustomersList, Customer, AddCustomer, SearchCustomer.
router.js defines routes, each route has a path and maps to a component.
http-common.js initializes HTTP Client with baseUrl and headers for axios HTTP methods.
vue.config.js configures port for Vue App.

For more details about how to use Vue Router in this example, please visit:
Vue Router example – with Nav Bar, Dynamic Route & Nested Routes

2.0 Setup Vue Project & Router

Init Project

Point cmd to the folder you want to save Project folder, run command:
vue create vue-springboot

You will see 2 options, choose default:

vue-create-project-config

Add Vue Router to Project

– Run command: npm install vue-router.
– Import router to src/main.js:


import Vue from "vue";
import App from "./App.vue";
import router from './router'

Vue.config.productionTip = false;

new Vue({
  router, // inject the router to make whole app router-aware
  render: h => h(App)
}).$mount("#app");
Define Routes

src/router.js:


import Vue from "vue";
import Router from "vue-router";
import CustomersList from "./components/CustomersList.vue";
import AddCustomer from "./components/AddCustomer.vue";
import SearchCustomers from "./components/SearchCustomers.vue";
import Customer from "./components/Customer.vue";

Vue.use(Router);

export default new Router({
  mode: "history",
  routes: [
    {
      path: "/",
      name: "customers",
      alias: "/customer",
      component: CustomersList,
      children: [
        {
          path: "/customer/:id",
          name: "customer-details",
          component: Customer,
          props: true
        }
      ]
    },
    {
      path: "/add",
      name: "add",
      component: AddCustomer
    },
    {
      path: "/search",
      name: "search",
      component: SearchCustomers
    }
  ]
});
App template with Navbar and router-view

src/App.vue:


<template>
    <div id="app" class="container-fluid">
        <div class="site-info">
            <h1>ozenero</h1>
            <h2>Vue SpringBoot example</h2>
        </div>
        <nav>
            <router-link class="btn btn-primary" to="/">Customers</router-link>
            <router-link class="btn btn-primary" to="/add">Add</router-link>
            <router-link class="btn btn-primary" to="/search">Search</router-link>
        </nav>
        <br/>
        <router-view/>
    </div>
</template>

<script>
export default {
  name: "app"
};
</script>

<style>
.site-info {
  color: blue;
  margin-bottom: 20px;
}

.btn-primary {
  margin-right: 5px;
}

.container-fluid {
  text-align: center;
}
</style>

2.1 Initialize HTTP Client

Install axios with command: npm install axios.
Then create http-common.js file:


import axios from "axios";

export default axios.create({
  baseURL: "http://localhost:8080/api",
  headers: {
    "Content-type": "application/json",
  }
});

2.2 Components

List of Items

components/CustomersList.vue


<template>
    <div class="list row">
        <div class="col-md-6">
            <h3>Customers List</h3>
            <ul>
                <li v-for="(customer, index) in customers" :key="index">
                    <router-link :to="{
                            name: 'customer-details',
                            params: { customer: customer, id: customer.id }
                        }">
                            {{customer.name}}
                    </router-link>
                </li>
            </ul>
        </div>
        <div class="col-md-6">
            <router-view @refreshData="refreshList"></router-view>
        </div>
    </div>
</template>

<script>
import http from "../http-common";

export default {
  name: "customers-list",
  data() {
    return {
      customers: []
    };
  },
  methods: {
    /* eslint-disable no-console */
    retrieveCustomers() {
      http
        .get("/customers")
        .then(response => {
          this.customers = response.data; // JSON are parsed automatically.
          console.log(response.data);
        })
        .catch(e => {
          console.log(e);
        });
    },
    refreshList() {
      this.retrieveCustomers();
    }
    /* eslint-enable no-console */
  },
  mounted() {
    this.retrieveCustomers();
  }
};
</script>

<style>
.list {
  text-align: left;
  max-width: 450px;
  margin: auto;
}
</style>
Item Details

components/Customer.vue


<template>
  <div v-if="this.customer">
    <h3>Customer</h3>
    <div>
      <label>Name: </label> {{this.customer.name}}
    </div>
    <div>
      <label>Age: </label> {{this.customer.age}}
    </div>
    <div>
      <label>Active: </label> {{this.customer.active}}
    </div>
  
    <span v-if="this.customer.active"
      v-on:click="updateActive(false)"
      class="button is-small btn-primary">Inactive</span>
    <span v-else
      v-on:click="updateActive(true)"
      class="button is-small btn-primary">Active</span>
  
    <span class="button is-small btn-danger" v-on:click="deleteCustomer()">Delete</span>
  </div>
  <div v-else>
    <br/>
    <p>Please click on a Customer...</p>
  </div>
</template>

<script>
import http from "../http-common";

export default {
  name: "customer",
  props: ["customer"],
  methods: {
    /* eslint-disable no-console */
    updateActive(status) {
      var data = {
        id: this.customer.id,
        name: this.customer.name,
        age: this.customer.age,
        active: status
      };

      http
        .put("/customer/" + this.customer.id, data)
        .then(response => {
          this.customer.active = response.data.active;
          console.log(response.data);
        })
        .catch(e => {
          console.log(e);
        });
    },
    deleteCustomer() {
      http
        .delete("/customer/" + this.customer.id)
        .then(response => {
          console.log(response.data);
          this.$emit("refreshData");
          this.$router.push('/');
        })
        .catch(e => {
          console.log(e);
        });
    }
    /* eslint-enable no-console */
  }
};
</script>
Add Item

components/AddCustomer.vue


<template>
  <div class="submitform">
    <div v-if="!submitted">
        <div class="form-group">
          <label for="name">Name</label>
          <input type="text" class="form-control" id="name" required v-model="customer.name" name="name">
        </div>
    
        <div class="form-group">
          <label for="age">Age</label>
          <input type="number" class="form-control" id="age" required v-model="customer.age" name="age">
        </div>
    
        <button v-on:click="saveCustomer" class="btn btn-success">Submit</button>
    </div>
    
    <div v-else>
      <h3>You submitted successfully!</h3>
      <button class="btn btn-success" v-on:click="newCustomer">Add</button>
    </div>
  </div>
</template>

<script>
import http from "../http-common";

export default {
  name: "add-customer",
  data() {
    return {
      customer: {
        id: 0,
        name: "",
        age: 0,
        active: false
      },
      submitted: false
    };
  },
  methods: {
    /* eslint-disable no-console */
    saveCustomer() {
      var data = {
        name: this.customer.name,
        age: this.customer.age
      };

      http
        .post("/customer", data)
        .then(response => {
          this.customer.id = response.data.id;
          console.log(response.data);
        })
        .catch(e => {
          console.log(e);
        });

      this.submitted = true;
    },
    newCustomer() {
      this.submitted = false;
      this.customer = {};
    }
    /* eslint-enable no-console */
  }
};
</script>

<style>
.submitform {
  max-width: 300px;
  margin: auto;
}
</style>
Search Items

components/SearchCustomers.vue


<template>
  <div class="searchform">
    <h3>Find by Age</h3>
    <div class="form-group">
      <input type="number" class="form-control" id="age" required v-model="age" name="age">
    </div>
 
    <div class="btn-group">
      <button v-on:click="searchCustomers" class="btn btn-success">Search</button>
    </div>

    <ul class="search-result">
      <li v-for="(customer, index) in customers" :key="index">
        <h5>{{customer.name}} ({{customer.age}})</h5>
      </li>
    </ul>
  </div>
</template>

<script>
import http from "../http-common";

export default {
  name: "search-customer",
  data() {
    return {
      age: 0,
      customers: []
    };
  },
  methods: {
    /* eslint-disable no-console */
    searchCustomers() {
      http
        .get("/customers/age/" + this.age)
        .then(response => {
          this.customers = response.data; // JSON are parsed automatically.
          console.log(response.data);
        })
        .catch(e => {
          console.log(e);
        });
    }
    /* eslint-enable no-console */
  }
};
</script>

<style>
.searchform {
  max-width: 300px;
  margin: auto;
}
.search-result {
  margin-top: 20px;
  text-align: left;
}
</style>
</code></pre>
<h4>2.3 Configure Port for Vue App</h4>
<em>vue.config.js</em>
<pre><code class="language-java">
module.exports = {
  devServer: {
    port: 4200
  }
}

Run

– Spring Boot Server: mvn clean install and mvn spring-boot:run.
– Vue.js Client: npm run serve.

Open Browser with Url: http://localhost:4200/.

Source Code for Vue.js and SpringBoot

SpringBootRestMariaDB
vue-springboot

Further Reading

Vuejs Guide
Reactjs JWT Authentication Example

87 thoughts on “Vue.js + Spring Boot example | Spring Data JPA + REST + MariaDB CRUD”

  1. Hello would you mind letting me know which web host you’re working with?
    I’ve loaded your blog in 3 completely different web browsers and I must say this blog loads a lot
    quicker then most. Can you recommend a good hosting provider at a
    fair price? Thanks, I appreciate it!

  2. After I originally left a comment I seem to have clicked the -Notify me when new comments are added- checkbox and from now on whenever a comment is added I recieve four emails
    with the exact same comment. Perhaps there is a way you are able to remove
    me from that service? Cheers!

  3. Simply want to say your article is as amazing. The clarity in your post is just nice and i can assume you’re an expert on this subject.
    Fine with your permission allow me to grab your RSS feed to keep
    up to date with forthcoming post. Thanks a million and please carry on the rewarding work.

  4. You actually make it appear so easy with your presentation but I find
    this topic to be actually something that I think I might never understand.
    It sort of feels too complex and very extensive for me. I am having a look forward
    for your next submit, I’ll try to get the hold of it!

  5. Simply want to say your article is as astounding. The clarity in your post is
    simply excellent and i could assume you are an expert
    on this subject. Well with your permission let me to grab your feed to keep updated with forthcoming post.

    Thanks a million and please carry on the enjoyable work.

  6. Great article! This is the type of information that should be shared across the internet.

    Disgrace on Google for now not positioning this put up higher!
    Come on over and consult with my website . Thanks =)

  7. I’m not that much of a online reader to be honest but your blogs really nice, keep it up!
    I’ll go ahead and bookmark your website to come back later.

    Many thanks

  8. Howdy I am so thrilled I found your site, I really found you by mistake, while I was
    searching on Yahoo for something else, Anyhow I am here now and would just like to say many thanks for a
    fantastic post and a all round exciting blog (I also love the theme/design), I don’t have time
    to go through it all at the minute but I have bookmarked it and
    also added in your RSS feeds, so when I have time I will be back to read a lot more, Please do keep up the fantastic work.

  9. Good day! This is my first visit to your blog! We are a group of volunteers and starting
    a new project in a community in the same niche.
    Your blog provided us useful information to work on. You have
    done a extraordinary job!

  10. Awesome blog! Do you have any helpful hints for aspiring writers?
    I’m hoping to start my own website soon but I’m a little lost on everything.
    Would you propose starting with a free platform like WordPress or go for a paid option? There are so many choices out there that I’m completely overwhelmed ..
    Any tips? Thanks!

  11. Hi there would you mind stating which blog platform you’re
    using? I’m looking to start my own blog in the near future but I’m having a difficult time deciding
    between BlogEngine/Wordpress/B2evolution and
    Drupal. The reason I ask is because your layout seems different then most blogs and I’m looking for something completely
    unique. P.S Apologies for getting off-topic
    but I had to ask!

  12. Hello there, I discovered your blog by way of Google even as searching for a comparable topic, your site came up,
    it seems good. I have bookmarked it in my google bookmarks.

    Hello there, simply changed into aware of your blog through Google, and located that
    it’s truly informative. I am gonna watch out for brussels.
    I’ll appreciate when you proceed this in future.
    A lot of other people will be benefited out of your writing.
    Cheers!

  13. Oh my goodness! Incredible article dude! Thank you so
    much, However I am having troubles with your RSS.
    I don’t understand why I cannot subscribe to it. Is there
    anybody else getting the same RSS problems? Anybody who knows the solution can you kindly respond?

    Thanx!!

  14. Please let me know if you’re looking for a article writer for your blog.

    You have some really great posts and I think I would be a good asset.

    If you ever want to take some of the load off, I’d absolutely love to write
    some articles for your blog in exchange for a link back
    to mine. Please blast me an e-mail if interested. Many thanks!

  15. Wow that was unusual. I just wrote an incredibly long comment but after I clicked submit my comment didn’t show up.
    Grrrr… well I’m not writing all that over again. Anyway, just wanted to say excellent blog!

  16. I do not even know how I finished up right here, but I believed
    this post used to be good. I don’t realize
    who you’re however certainly you’re going to a famous
    blogger when you are not already. Cheers!

  17. It’s really very complex in this full of activity life
    to listen news on TV, so I just use world wide web for that reason, and
    get the hottest news.

  18. Howdy would you mind letting me know which hosting company you’re
    using? I’ve loaded your blog in 3 completely different internet browsers and I must say this blog loads a lot quicker then most.
    Can you suggest a good web hosting provider at a reasonable price?

    Kudos, I appreciate it!

  19. Hey this is kinda of off topic but I was wondering
    if blogs use WYSIWYG editors or if you have to manually code
    with HTML. I’m starting a blog soon but have
    no coding knowledge so I wanted to get advice from someone with
    experience. Any help would be enormously appreciated!

  20. I have been exploring for a little bit for any
    high-quality articles or blog posts in this sort of house
    . Exploring in Yahoo I at last stumbled upon this web site.
    Reading this information So i’m satisfied to
    express that I have a very good uncanny feeling I discovered exactly what I needed.
    I most certainly will make certain to don?t omit
    this site and give it a look on a constant basis.

  21. An outstanding share! I have just forwarded this onto a coworker who has been conducting a
    little research on this. And he in fact ordered me breakfast due to the fact that I found it for
    him… lol. So let me reword this…. Thanks for the meal!!
    But yeah, thanks for spending the time to talk about this topic here on your site.

  22. Great beat ! I would like to apprentice while you
    amend your web site, how could i subscribe for a blog website?
    The account helped me a acceptable deal. I had been a little bit acquainted of this your broadcast offered
    bright clear concept

  23. I have been surfing online more than 2 hours today, yet I never found any interesting article like yours.

    It’s pretty worth enough for me. In my view, if all site owners and bloggers made good content as you
    did, the net will be much more useful than ever before.

  24. A fascinating discussion is worth comment. There’s no doubt that that you ought to
    write more on this issue, it might not be a taboo matter but typically folks don’t discuss such issues.
    To the next! Best wishes!!

  25. This is really interesting, You’re a very skilled blogger.
    I’ve joined your rss feed and look forward to seeking more of your fantastic post.

    Also, I have shared your site in my social networks!

  26. Hello! This is my first visit to your blog! We are a collection of volunteers and starting a new initiative
    in a community in the same niche. Your blog provided us valuable information to work
    on. You have done a extraordinary job!

  27. Hi there just wanted to give you a quick heads up.
    The text in your content seem to be running off the screen in Firefox.
    I’m not sure if this is a format issue or something to do with internet browser
    compatibility but I thought I’d post to let you know.

    The design and style look great though! Hope you get the problem resolved
    soon. Cheers

  28. Just wish to say your article is as astounding.
    The clearness in your post is simply cool and i can assume you are
    an expert on this subject. Well with your permission let me to grab
    your feed to keep up to date with forthcoming post.
    Thanks a million and please keep up the gratifying work.

  29. Hi there! This article couldn’t be written much better!
    Looking through this article reminds me of my previous roommate!
    He constantly kept preaching about this. I will send this article to him.

    Fairly certain he’s going to have a great read. I appreciate you for sharing!

  30. Excellent blog here! Also your web site loads up fast!
    What host are you using? Can I get your
    affiliate link to your host? I wish my web site loaded up as fast as yours lol

  31. Good day! I know this is kinda off topic however I’d figured I’d
    ask. Would you be interested in trading links or maybe guest
    authoring a blog post or vice-versa? My website goes over a lot of the same
    subjects as yours and I feel we could greatly benefit from each other.
    If you happen to be interested feel free to send me an email.

    I look forward to hearing from you! Wonderful blog by the way!

  32. Hi there, I found your site by means of Google at the same time as looking for a comparable topic, your website got here
    up, it seems to be great. I’ve bookmarked it in my google bookmarks.

    Hello there, just was alert to your weblog through Google, and found
    that it is really informative. I am going to be careful for brussels.
    I will appreciate should you continue this in future. Lots of other people will be benefited out of your writing.
    Cheers!

  33. Great blog! Do you have any helpful hints for aspiring writers?
    I’m hoping to start my own blog soon but I’m a little lost
    on everything. Would you propose starting with a free
    platform like WordPress or go for a paid option? There are
    so many choices out there that I’m completely overwhelmed ..
    Any suggestions? Thanks!

  34. Hi, i think that i saw you visited my site thus i came to “return the favor”.I’m attempting to find things
    to improve my website!I suppose its ok to use some of your ideas!!

  35. Can I just say what a relief to discover someone
    that genuinely knows what they are talking about on the net.
    You certainly realize how to bring an issue to light and make it important.
    More and more people really need to check this out and understand this side of your story.
    I was surprised you’re not more popular because you most certainly have the gift.

  36. Thanks a bunch for sharing this with all of us you really understand
    what you’re talking approximately! Bookmarked. Please also discuss with my
    site =). We could have a hyperlink change arrangement between us

  37. Howdy are using WordPress for your blog platform? I’m new to the blog world
    but I’m trying to get started and set up my own. Do you need any coding expertise
    to make your own blog? Any help would be really appreciated!

  38. Have you ever thought about publishing an e-book or guest authoring on other websites?
    I have a blog centered on the same subjects you discuss and would really like to have you
    share some stories/information. I know my viewers would value your work.
    If you are even remotely interested, feel free to
    shoot me an e mail.

  39. obviously like your web-site however you need to take a look at the spelling on quite a few of your posts.
    Many of them are rife with spelling problems and I to find it very troublesome to inform
    the reality then again I will surely come again again.

  40. Hello! I just would like to offer you a big thumbs up for your great info you have got here
    on this post. I am returning to your site for more
    soon.

  41. An outstanding share! I have just forwarded this onto a colleague who has been doing a little homework on this. And he in fact bought me dinner because I stumbled upon it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanx for spending the time to talk about this issue here on your site.

  42. Woah! I’m really enjoying the template/theme of this website. It’s simple, yet effective. A lot of times it’s tough to get that “perfect balance” between usability and appearance. I must say you’ve done a fantastic job with this. Additionally, the blog loads very fast for me on Firefox. Exceptional Blog!

Leave a Reply

Your email address will not be published. Required fields are marked *