当前位置:   article > 正文

SSM+VUE+Element——CRUD快速上手模板_ssm+vue+element 增删改查

ssm+vue+element 增删改查

前言:

SSM环境下的基本的增删改查,快速上手模板!这篇主要是补充前端代码部分。后端在SSM+redis快速搭建那篇已经详细介绍了!以书籍为案例!

目录

一、后端

1、搭建后台

2、数据库

二、前端

1、创建项目

2、项目结构

 3、书籍首页

4、路由

5、请求封装

6、main.js

三、结束


一、后端

1、搭建后台

https://blog.csdn.net/weixin_49789131/article/details/122025036

2、数据库

表:

 

二、前端

1、创建项目

https://blog.csdn.net/weixin_49789131/article/details/122480464

2、项目结构

 3、书籍首页

BookList.vue。业务界面都一般放在view文件夹中

  1. <template>
  2. <div>
  3. <div>
  4. <el-form :inline="true" :model="formSearch" class="demo-form-inline">
  5. <el-form-item label="书籍名称">
  6. <el-input v-model="formSearch.bookname" placeholder="书籍名称"></el-input>
  7. </el-form-item>
  8. <el-form-item>
  9. <el-button type="primary" @click="onSubmit">查询</el-button>
  10. </el-form-item>
  11. </el-form>
  12. <button @click="dialogAdd">增加书籍</button>
  13. </div>
  14. <el-table :data="books" border style="width: 60%;margin-left: 300px;">
  15. <el-table-column prop="id" label="ID" width="120">
  16. </el-table-column>
  17. <el-table-column prop="bookname" label="书籍名" width="200">
  18. </el-table-column>
  19. <el-table-column prop="price" label="价格" width="150">
  20. </el-table-column>
  21. <el-table-column prop="booktype" label="类型" width="200">
  22. </el-table-column>
  23. <el-table-column label="操作" width="">
  24. <template slot-scope="scope">
  25. <el-button @click="dialogUpd(scope.row)" type="text" size="small">修改</el-button>
  26. <el-button @click="bookDel(scope.row)" type="text" size="small">删除</el-button>
  27. </template>
  28. </el-table-column>
  29. </el-table>
  30. <el-dialog :title="title" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
  31. <el-form :model="form" :rules="rules" ref="form" label-width="100px" class="demo-ruleForm">
  32. <input :value="form.id" hidden="true" />
  33. <el-form-item label="书籍名称" prop="bookname">
  34. <el-input v-model="form.bookname"></el-input>
  35. </el-form-item>
  36. <el-form-item label="书籍价格" prop="price">
  37. <el-input v-model="form.price"></el-input>
  38. </el-form-item>
  39. <el-form-item label="书籍类型" prop="booktype">
  40. <el-input v-model="form.booktype"></el-input>
  41. </el-form-item>
  42. <el-form-item>
  43. <el-button type="primary" @click="submitForm('form')">提交</el-button>
  44. <el-button @click="clear()">重置</el-button>
  45. </el-form-item>
  46. </el-form>
  47. </el-dialog>
  48. </div>
  49. </template>
  50. <script>
  51. export default {
  52. data: function() {
  53. return {
  54. /** 查询表单 **/
  55. formSearch: {
  56. bookName: ''
  57. },
  58. /** 增加、修改表单 **/
  59. form: {
  60. id: 0,
  61. bookname: '',
  62. price: null,
  63. booktype: ''
  64. },
  65. /** 增加提交表单验证 **/
  66. rules: {
  67. bookname: [{
  68. required: true,
  69. message: '请输入书籍名称',
  70. trigger: 'blur'
  71. }],
  72. price: [{
  73. required: true,
  74. message: '请输入书籍价格',
  75. trigger: 'blur'
  76. }],
  77. booktype: [{
  78. required: true,
  79. message: '请输入书籍类型',
  80. trigger: 'blur'
  81. }]
  82. },
  83. /** 书籍集合 **/
  84. books: [],
  85. /** 对话框开关 **/
  86. dialogVisible: false,
  87. /** 对话框标题 **/
  88. title: ''
  89. };
  90. },
  91. methods: {
  92. /* 查询按钮提交 */
  93. onSubmit() {
  94. this.bookList();
  95. },
  96. /* 修改对话框处理 */
  97. dialogUpd(row) {
  98. this.title = '修改';
  99. this.dialogVisible = true;
  100. this.setFiled(this.form, row);
  101. },
  102. /* 增加对话框处理 */
  103. dialogAdd(row) {
  104. this.title = '增加';
  105. this.dialogVisible = true;
  106. },
  107. /* 根据书籍id删除书籍 */
  108. bookDel(row) {
  109. let url = this.axios.urls.BOOKDEL;
  110. this.axios.post(url, {
  111. id: row.id
  112. }).then(res => {
  113. if (res.data.code == 200) {
  114. this.$message({
  115. message: res.data.message,
  116. type: 'success'
  117. });
  118. }
  119. this.clear();
  120. this.bookList();
  121. })
  122. },
  123. /*
  124. *对话框表单提交
  125. * url:访问路径(增加?修改?)
  126. */
  127. bookChange(url) {
  128. this.axios.post(url, this.form).then(res => {
  129. if (res.data.code == 200) {
  130. this.$message({
  131. message: res.data.message,
  132. type: 'success'
  133. });
  134. }
  135. this.clear();
  136. this.bookList();
  137. this.dialogVisible = false;
  138. })
  139. },
  140. /* 对话框表单提交 , 根据form.id 来判断是增加还是修改*/
  141. submitForm(formName) {
  142. this.$refs[formName].validate((valid) => {
  143. if (valid) {
  144. let url = '';
  145. if(this.form.id == 0 || this.form.id == null){
  146. url = this.axios.urls.BOOKADD;
  147. }else{
  148. url = this.axios.urls.BOOKUPD
  149. }
  150. this.bookChange(url);
  151. } else {
  152. console.log('error submit!!');
  153. return false;
  154. }
  155. });
  156. },
  157. /* 清空form对象属性 */
  158. clear() {
  159. Object.keys(this.form).forEach(f => {
  160. this.form[f] = null;
  161. })
  162. },
  163. /* 对话框关闭 */
  164. handleClose(done) {
  165. this.$confirm('确认关闭?')
  166. .then(_ => {
  167. done();
  168. this.clear();
  169. })
  170. .catch(_ => {});
  171. },
  172. /* 书籍模糊查询 */
  173. bookList() {
  174. let url = this.axios.urls.BOOKLIST;
  175. this.axios.get(url, {
  176. params: {
  177. bookName: this.formSearch.bookname
  178. }
  179. }).then(res => {
  180. this.books = res.data.data
  181. })
  182. },
  183. /*
  184. * row赋值给form操作
  185. *
  186. * 说明:
  187. * 通过测试可知,获取表格当前行row传过来的是当前行对象引用,
  188. * 在修改回显直接 this.form = row 赋值,其实是修改了当前行对象引用指向
  189. * 对话框的重置功能不仅会将对话框数据清空也会将表格当前行数据情况!
  190. * bug!!!关闭对象框会发现当前行数据都消失了!
  191. */
  192. setFiled(oldObj, newObj) {
  193. Object.keys(newObj).forEach(f => {
  194. oldObj[f] = newObj[f];
  195. })
  196. }
  197. },
  198. created() {
  199. this.bookList();
  200. }
  201. }
  202. </script>
  203. <style>
  204. </style>

查询方法为get提交请求,一般后台仅需要基本类型的参数,如果用post方式提交会出现后台接收

不到参数的情况!!

get -->基本类型参数传输

post-->对象传输

post写法如下:

this.axios.post(url,this.form}.then(res => {})

post直接传入参数,不需要定义param

4、路由

 index.js

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import BookList from '@/views/BookList'
  4. Vue.use(Router)
  5. export default new Router({
  6. routes: [
  7. {
  8. path: '/',
  9. name: 'BookList',
  10. component: BookList
  11. }
  12. ]
  13. })

5、请求封装

action.js

  1. /**
  2. * 对后台请求的地址的封装,URL格式如下:
  3. * 模块名_实体名_操作
  4. */
  5. export default {
  6. //服务器
  7. 'SERVER': 'http://localhost:8080/ssm',
  8. 'BOOKLIST': '/bookList',
  9. 'BOOKDEL': '/bookDel' ,
  10. 'BOOKUPD': '/bookUpd',
  11. 'BOOKADD': '/bookAdd',
  12. //获得请求的完整地址,用于mockjs测试时使用
  13. 'getFullPath': k => {
  14. return this.SERVER + this[k];
  15. }
  16. }

http.js

  1. /**
  2. * vue项目对axios的全局配置
  3. */
  4. import axios from 'axios'
  5. import qs from 'qs'
  6. //引入action模块,并添加至axios的类属性urls上
  7. import action from '@/api/action'
  8. axios.urls = action
  9. // axios默认配置
  10. axios.defaults.timeout = 10000; // 超时时间
  11. // axios.defaults.baseURL = 'http://localhost:8080/crm'; // 默认地址
  12. axios.defaults.baseURL = action.SERVER;
  13. //整理数据
  14. // 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据
  15. axios.defaults.transformRequest = function(data) {
  16. data = qs.stringify(data);
  17. return data;
  18. };
  19. // 请求拦截器
  20. axios.interceptors.request.use(function(config) {
  21. // let jwt = sessionStorage.getItem('jwt');
  22. // if (jwt) {
  23. // config.headers['jwt'] = jwt;
  24. // }
  25. return config;
  26. }, function(error) {
  27. return Promise.reject(error);
  28. });
  29. // 响应拦截器
  30. axios.interceptors.response.use(function(response) {
  31. // let jwt = response.headers['jwt'];
  32. // if (jwt) {
  33. // sessionStorage.setItem('jwt', jwt);
  34. // }
  35. return response;
  36. }, function(error) {
  37. return Promise.reject(error);
  38. });
  39. // // 路由请求拦截
  40. // // http request 拦截器
  41. // axios.interceptors.request.use(
  42. // config => {
  43. // //config.data = JSON.stringify(config.data);
  44. // //config.headers['Content-Type'] = 'application/json;charset=UTF-8';
  45. // //config.headers['Token'] = 'abcxyz';
  46. // //判断是否存在ticket,如果存在的话,则每个http header都加上ticket
  47. // // if (cookie.get("token")) {
  48. // // //用户每次操作,都将cookie设置成2小时
  49. // // cookie.set("token", cookie.get("token"), 1 / 12)
  50. // // cookie.set("name", cookie.get("name"), 1 / 12)
  51. // // config.headers.token = cookie.get("token");
  52. // // config.headers.name = cookie.get("name");
  53. // // }
  54. // return config;
  55. // },
  56. // error => {
  57. // return Promise.reject(error.response);
  58. // });
  59. // // 路由响应拦截
  60. // // http response 拦截器
  61. // axios.interceptors.response.use(
  62. // response => {
  63. // if (response.data.resultCode == "404") {
  64. // console.log("response.data.resultCode是404")
  65. // // 返回 错误代码-1 清除ticket信息并跳转到登录页面
  66. // // cookie.del("ticket")
  67. // // window.location.href='http://login.com'
  68. // return
  69. // } else {
  70. // return response;
  71. // }
  72. // },
  73. // error => {
  74. // return Promise.reject(error.response) // 返回接口返回的错误信息
  75. // });
  76. export default axios;

6、main.js

  1. // The Vue build version to load with the `import` command
  2. // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
  3. import Vue from 'vue'
  4. import ElementUI from 'element-ui' //新添加1
  5. import 'element-ui/lib/theme-chalk/index.css' //新添加2,避免后期打包样式不同,要放在import App from './App';之前
  6. import axios from '@/api/http' //vue项目对axios的全局配置
  7. import App from './App'
  8. import router from './router'
  9. import VueAxios from 'vue-axios'
  10. Vue.use(VueAxios,axios)
  11. Vue.use(ElementUI) //新添加3
  12. Vue.config.productionTip = false
  13. /* eslint-disable no-new */
  14. new Vue({
  15. el: '#app',
  16. router,
  17. components: { App },
  18. template: '<App/>'
  19. })

三、结束

该篇主要为快速上手模板,为有一定基础人提供参考!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/568516
推荐阅读
相关标签
  

闽ICP备14008679号