• ElementUI结合Vue完成主页的CUD(增删改)&表单验证


    目录

    一、CUD

    ( 1 )  CU讲述

    ( 2 )  编写

    1. CU

    2. 删除

    二、验证

    前端整合代码 :


    一、CUD

    以下的代码基于我博客中的代码进行续写 : 

    使用ElementUI结合Vue导航菜单和后台数据分页查询

    ( 1 )  CU讲述

    在CRUD操作中,CU代表创建(Create)和更新(Update)。

    1. 创建(Create):创建操作用于在数据库中创建新的数据记录。它通常涉及向数据库中插入新的数据行或文档。例如,在关系型数据库中,可以使用INSERT语句来创建新的数据行。在文档数据库中,可以直接插入新的文档。

    2. 更新(Update):更新操作用于修改数据库中已存在的数据记录。它可以用于更改数据行或文档中的一个或多个属性的值。例如,在关系型数据库中,可以使用UPDATE语句来更新数据行的值。在文档数据库中,可以使用更新操作符来修改文档的属性。

    这两个操作通常是CRUD操作中最常用的。创建操作用于添加新的数据记录,而更新操作用于修改已存在的数据记录。它们可以在应用程序中用于实现用户注册、添加新的产品、更新用户信息等功能。

    ( 2 )  编写

    1. CU

    在项目中的src文件下api中找到action.js进行配置数据访问的地址:

    1. /**
    2. * 对后台请求的地址的封装,URL格式如下:
    3. * 模块名_实体名_操作
    4. */
    5. export default {
    6. 'SERVER': 'http://localhost:8080/ssm', //服务器地址
    7. 'SYSTEM_USER_DOLOGIN': '/user/userLogin', //登陆请求
    8. 'SYSTEM_USER_DOREG': '/user/userRegister', //注册请求
    9. 'SYSTEM_MENU': '/module/queryRootNode', //左侧菜单导航数据请求
    10. 'SYSTEM_BookList': '/book/queryBookPager', //书籍的后端数据请求
    11. 'SYSTEM_BookAdd': '/book/addBook', //书籍增加的数据请求
    12. 'SYSTEM_BookEdit': '/book/editBook', //书籍修改的数据请求
    13. 'SYSTEM_BookDel': '/book/delBook', //书籍删除的数据请求
    14. 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    15. return this.SERVER + this[k];
    16. }
    17. }

    在BookList.vue组件中进行编写增加修改的代

    ElementUI里面找到弹出窗进行编写增加修改的弹窗

    1. <el-dialog :title="title" :visible.sync="dialogFormVisible" :before-close="close">
    2. <el-form :model="book" :rules="rules" ref="book">
    3. <el-form-item label="书籍编号 :" :label-width="formLabelWidth">
    4. <el-input v-model="book.id" autocomplete="off">el-input>
    5. el-form-item>
    6. <el-form-item label="书籍名称 :" prop="bookname" :label-width="formLabelWidth">
    7. <el-input v-model="book.bookname" autocomplete="off">el-input>
    8. el-form-item>
    9. <el-form-item label="书籍价格 :" prop="price" :label-width="formLabelWidth">
    10. <el-input v-model="book.price" autocomplete="off">el-input>
    11. el-form-item>
    12. <el-form-item label="书籍类型 :" prop="booktype" :label-width="formLabelWidth">
    13. <el-select v-model="book.booktype" placeholder="请选择书籍类型">
    14. <el-option v-for="t in types" :label="t.tname" :value="t.tname" :key="'key'+t.tid">el-option>
    15. el-select>
    16. el-form-item>
    17. el-form>
    18. <div slot="footer" class="dialog-footer">
    19. <el-button @click="close">取 消el-button>
    20. <el-button type="primary" @click="submit">确 定el-button>
    21. div>
    22. el-dialog>
    23. div>

     在script标签中编写方法进行数据增加修改实现,在data中编写属性:

    1. data() {
    2. return {
    3. bookname: '',
    4. tableData: [],
    5. rows: 10,
    6. total: 0,
    7. page: 1,
    8. formLabelWidth: '120px', //弹出窗输入框前的文字宽度
    9. title: '书籍新增', //弹出窗标题
    10. dialogFormVisible: false, //默认关闭
    11. book: {
    12. id: '',
    13. bookname: '',
    14. price: '',
    15. booktype: ''
    16. },
    17. types: [],
    18. }
    19. },

    在script标签中编写方法进行数据增加修改实现,在methods中编写方法:

    1. submit() {
    2. //获取值
    3. let params = {
    4. id: this.book.id,
    5. bookname: this.book.bookname,
    6. price: this.book.price,
    7. booktype: this.book.booktype
    8. }
    9. console.log(params);
    10. //获取配置的方法请求地址
    11. let url = this.axios.urls.SYSTEM_BookAdd;
    12. //如果是书籍编辑就将请求地址修改为书籍修改的请求地址
    13. if (this.title == '书籍编辑') {
    14. url = this.axios.urls.SYSTEM_BookEdit;
    15. }
    16. //请求后端地址进行书籍的新增或修改
    17. this.axios.post(url, params).then(d => {
    18. // console.log(url);
    19. // console.log(d);
    20. this.close();
    21. this.query({});
    22. }).catch(e => {});
    23. },
    24. //弹出窗取消,值初始化
    25. close() {
    26. this.book = {
    27. id: '',
    28. bookname: '',
    29. price: '',
    30. booktype: ''
    31. };
    32. this.dialogFormVisible = false;
    33. },
    34. //打开弹出窗,进行书籍的编辑
    35. open(index, row) {
    36. this.dialogFormVisible = true;
    37. if (row) {
    38. this.title = '书籍编辑';
    39. this.book.id = row.id;
    40. this.book.bookname = row.bookname
    41. this.book.price = row.price;
    42. this.book.booktype = row.booktype;
    43. }
    44. },

    在created中初始化数据

    1. created() {
    2. this.query({});
    3. //初始书籍类型的书籍
    4. this.types = [{
    5. tid: 1,
    6. tname: '玄幻'
    7. }, {
    8. tid: 2,
    9. tname: '爽文'
    10. }, {
    11. tid: 3,
    12. tname: '爱情'
    13. }, {
    14. tid: 4,
    15. tname: '动作'
    16. }, {
    17. tid: 5,
    18. tname: '都市'
    19. }];
    20. }

    增加表格操作 :

    1. <el-table-column label="操作">
    2. <template slot-scope="scope">
    3. <el-button size="mini" @click="open(scope.$index,scope.row)">编辑el-button>
    4. <el-button size="mini" type="danger" @click="Del(scope.row)">删除el-button>
    5. template>
    6. el-table-column>

    增加效果 :

    修改效果 : 

    2. 删除

    在script标签中编写方法进行数据删除实现,在methods中编写方法:

    1. //书籍删除的方法
    2. Del(r) {
    3. this.$confirm('你确定将编号为' + r.id + '的书籍永久删除, 是否继续?', '提示', {
    4. confirmButtonText: '确定',
    5. cancelButtonText: '取消',
    6. type: 'warning'
    7. }).then(() => {
    8. //获取配置的书籍删除方法请求地址
    9. let url = this.axios.urls.SYSTEM_BookDel;
    10. //请求后端地址进行书籍的新增或修改
    11. this.axios.post(url, {
    12. id: r.id
    13. }).then(d => {
    14. this.$message({
    15. type: 'success',
    16. message: '书籍删除成功!'
    17. });
    18. this.query({});
    19. }).catch(e => {});
    20. }).catch(() => {
    21. this.$message({
    22. type: 'info',
    23. message: '已取消删除'
    24. });
    25. });
    26. }

    删除效果 : 

    二、验证

    在表单中增加以下两个属性 :

    :rules="rules" ref="book"

     在script标签中编写方法进行数据增加修改实现,在data中编写属性:

    1. data() {
    2. return {
    3. bookname: '',
    4. tableData: [],
    5. rows: 10,
    6. total: 0,
    7. page: 1,
    8. formLabelWidth: '120px', //弹出窗输入框前的文字宽度
    9. title: '书籍新增', //弹出窗标题
    10. dialogFormVisible: false, //默认关闭
    11. book: {
    12. id: '',
    13. bookname: '',
    14. price: '',
    15. booktype: ''
    16. },
    17. types: [],
    18. //增加表单验证
    19. rules: {
    20. bookname: [{
    21. required: true,
    22. message: '请输入书籍的名称',
    23. trigger: 'blur'
    24. },
    25. {
    26. min: 2,
    27. max: 10,
    28. message: '书籍名称长度在 2 到 10 个字符',
    29. trigger: 'blur'
    30. }
    31. ],
    32. price: [{
    33. required: true,
    34. message: '请填写书籍价格',
    35. trigger: 'blur'
    36. }],
    37. booktype: [{
    38. required: true,
    39. message: '请选择书籍类型',
    40. trigger: 'blur'
    41. }]
    42. }
    43. }
    44. },

    在script标签中编写方法,在methods中编写submit()方法:

    1. submit() {
    2. //获取值
    3. let params = {
    4. id: this.book.id,
    5. bookname: this.book.bookname,
    6. price: this.book.price,
    7. booktype: this.book.booktype
    8. }
    9. console.log(params);
    10. //获取配置的方法请求地址
    11. let url = this.axios.urls.SYSTEM_BookAdd;
    12. //如果是书籍编辑就将请求地址修改为书籍修改的请求地址
    13. if (this.title == '书籍编辑') {
    14. url = this.axios.urls.SYSTEM_BookEdit;
    15. }
    16. //请求前必须通过表单验证
    17. this.$refs['book'].validate((valid) => {
    18. console.log(valid);
    19. if (valid) {
    20. //请求后端地址进行书籍的新增或修改
    21. this.axios.post(url, params).then(d => {
    22. // console.log(url);
    23. // console.log(d);
    24. this.close();
    25. this.query({});
    26. }).catch(e => {});
    27. } else {
    28. this.$message('有必输入项或者没有按要求输入,请正确填写!!');
    29. return false;
    30. }
    31. });
    32. }

    表单验证的效果  :

    前端整合代码 :

    BookList.vue 所有代码如下  :

    1. <template>
    2. <div class="Book" style="padding: 30px;">
    3. <el-form :inline="true" class="demo-form-inline">
    4. <el-form-item label="书籍名称 : ">
    5. <el-input v-model="bookname" placeholder="书籍名称">el-input>
    6. el-form-item>
    7. <el-form-item>
    8. <el-button type="primary" plain @click="onSubmit">查询el-button>
    9. el-form-item>
    10. <el-form-item>
    11. <el-button type="primary" plain @click="open">新增el-button>
    12. el-form-item>
    13. el-form>
    14. <el-table :data="tableData" style="width: 100%">
    15. <el-table-column prop="id" label="书籍ID">el-table-column>
    16. <el-table-column prop="bookname" label="书籍名称">el-table-column>
    17. <el-table-column prop="price" label="书籍价格">el-table-column>
    18. <el-table-column prop="booktype" label="书籍类型">el-table-column>
    19. <el-table-column label="操作">
    20. <template slot-scope="scope">
    21. <el-button size="mini" @click="open(scope.$index,scope.row)">编辑el-button>
    22. <el-button size="mini" type="danger" @click="Del(scope.row)">删除el-button>
    23. template>
    24. el-table-column>
    25. el-table>
    26. <div class="block" style="padding: 20px;">
    27. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"
    28. background :page-sizes="[10, 20, 30, 40]" :page-size="rows" layout="total, sizes, prev, pager, next, jumper"
    29. :total="total">
    30. el-pagination>
    31. div>
    32. <el-dialog :title="title" :visible.sync="dialogFormVisible" :before-close="close">
    33. <el-form :model="book" :rules="rules" ref="book">
    34. <el-form-item label="书籍编号 :" :label-width="formLabelWidth">
    35. <el-input v-model="book.id" autocomplete="off">el-input>
    36. el-form-item>
    37. <el-form-item label="书籍名称 :" prop="bookname" :label-width="formLabelWidth">
    38. <el-input v-model="book.bookname" autocomplete="off">el-input>
    39. el-form-item>
    40. <el-form-item label="书籍价格 :" prop="price" :label-width="formLabelWidth">
    41. <el-input v-model="book.price" autocomplete="off">el-input>
    42. el-form-item>
    43. <el-form-item label="书籍类型 :" prop="booktype" :label-width="formLabelWidth">
    44. <el-select v-model="book.booktype" placeholder="请选择书籍类型">
    45. <el-option v-for="t in types" :label="t.tname" :value="t.tname" :key="'key'+t.tid">el-option>
    46. el-select>
    47. el-form-item>
    48. el-form>
    49. <div slot="footer" class="dialog-footer">
    50. <el-button @click="close">取 消el-button>
    51. <el-button type="primary" @click="submit">确 定el-button>
    52. div>
    53. el-dialog>
    54. div>
    55. template>
    56. <script>
    57. export default {
    58. data() {
    59. return {
    60. bookname: '',
    61. tableData: [],
    62. rows: 10,
    63. total: 0,
    64. page: 1,
    65. formLabelWidth: '120px', //弹出窗输入框前的文字宽度
    66. title: '书籍新增', //弹出窗标题
    67. dialogFormVisible: false, //默认关闭
    68. book: {
    69. id: '',
    70. bookname: '',
    71. price: '',
    72. booktype: ''
    73. },
    74. types: [],
    75. //增加表单验证
    76. rules: {
    77. bookname: [{
    78. required: true,
    79. message: '请输入书籍的名称',
    80. trigger: 'blur'
    81. },
    82. {
    83. min: 2,
    84. max: 10,
    85. message: '书籍名称长度在 2 到 10 个字符',
    86. trigger: 'blur'
    87. }
    88. ],
    89. price: [{
    90. required: true,
    91. message: '请填写书籍价格',
    92. trigger: 'blur'
    93. }],
    94. booktype: [{
    95. required: true,
    96. message: '请选择书籍类型',
    97. trigger: 'blur'
    98. }]
    99. }
    100. }
    101. },
    102. methods: {
    103. //书籍删除的方法
    104. Del(r) {
    105. this.$confirm('你确定将编号为' + r.id + '的书籍永久删除, 是否继续?', '提示', {
    106. confirmButtonText: '确定',
    107. cancelButtonText: '取消',
    108. type: 'warning'
    109. }).then(() => {
    110. //获取配置的书籍删除方法请求地址
    111. let url = this.axios.urls.SYSTEM_BookDel;
    112. //请求后端地址进行书籍的新增或修改
    113. this.axios.post(url, {
    114. id: r.id
    115. }).then(d => {
    116. this.$message({
    117. type: 'success',
    118. message: '书籍删除成功!'
    119. });
    120. this.query({});
    121. }).catch(e => {});
    122. }).catch(() => {
    123. this.$message({
    124. type: 'info',
    125. message: '已取消删除'
    126. });
    127. });
    128. },
    129. submit() {
    130. //获取值
    131. let params = {
    132. id: this.book.id,
    133. bookname: this.book.bookname,
    134. price: this.book.price,
    135. booktype: this.book.booktype
    136. }
    137. console.log(params);
    138. //获取配置的方法请求地址
    139. let url = this.axios.urls.SYSTEM_BookAdd;
    140. //如果是书籍编辑就将请求地址修改为书籍修改的请求地址
    141. if (this.title == '书籍编辑') {
    142. url = this.axios.urls.SYSTEM_BookEdit;
    143. }
    144. //请求前必须通过表单验证
    145. this.$refs['book'].validate((valid) => {
    146. console.log(valid);
    147. if (valid) {
    148. //请求后端地址进行书籍的新增或修改
    149. this.axios.post(url, params).then(d => {
    150. // console.log(url);
    151. // console.log(d);
    152. this.close();
    153. this.query({});
    154. }).catch(e => {});
    155. } else {
    156. this.$message('有必输入项或者没有按要求输入,请正确填写!!');
    157. return false;
    158. }
    159. });
    160. },
    161. //弹出窗取消,值初始化
    162. close() {
    163. this.book = {
    164. id: '',
    165. bookname: '',
    166. price: '',
    167. booktype: ''
    168. };
    169. this.dialogFormVisible = false;
    170. },
    171. //打开弹出窗,进行书籍的编辑
    172. open(index, row) {
    173. this.dialogFormVisible = true;
    174. if (row) {
    175. this.title = '书籍编辑';
    176. this.book.id = row.id;
    177. this.book.bookname = row.bookname
    178. this.book.price = row.price;
    179. this.book.booktype = row.booktype;
    180. }
    181. },
    182. handleSizeChange(r) {
    183. //当页大小发生变化
    184. let params = {
    185. bookname: this.bookname,
    186. rows: r,
    187. page: this.page
    188. }
    189. // console.log(params)
    190. this.query(params);
    191. },
    192. handleCurrentChange(p) {
    193. //当前页码大小发生变化
    194. let params = {
    195. bookname: this.bookname,
    196. rows: this.rows,
    197. page: p
    198. }
    199. // console.log(params)
    200. this.query(params);
    201. },
    202. query(params) {
    203. //获取后台请求书籍数据的地址
    204. let url = this.axios.urls.SYSTEM_BookList;
    205. this.axios.get(url, {
    206. params: params
    207. }).then(d => {
    208. // console.log(url)
    209. this.tableData = d.data.rows;
    210. this.total = d.data.total;
    211. }).catch(e => {});
    212. },
    213. onSubmit() {
    214. let params = {
    215. bookname: this.bookname
    216. }
    217. // console.log(params)
    218. this.query(params);
    219. this.bookname = ''
    220. }
    221. },
    222. created() {
    223. this.query({});
    224. //初始书籍类型的书籍
    225. this.types = [{
    226. tid: 1,
    227. tname: '玄幻'
    228. }, {
    229. tid: 2,
    230. tname: '爽文'
    231. }, {
    232. tid: 3,
    233. tname: '爱情'
    234. }, {
    235. tid: 4,
    236. tname: '动作'
    237. }, {
    238. tid: 5,
    239. tname: '都市'
    240. }];
    241. }
    242. }
    243. script>
    244. <style>
    245. style>

     

  • 相关阅读:
    美国SAFECOM发布《采用公共安全云计算的注意事项》指南
    Django笔记二十五之数据库函数之日期函数
    9.基于SpringBoot3+MybatisPlus定制化代码生成器类
    iMAP——论文解析
    Centos7环境下搭建Rabbitmq 集群
    分享一个口碑炸裂的Python可视化模块,简单快速入手!!
    某医院基于超融合架构的规划设计和应用实践
    欢迎入坑单目深度估计
    关于构造方法
    【prometheus】监控MySQL并实现可视化
  • 原文地址:https://blog.csdn.net/SAME_LOVE/article/details/133465278