• 通用后台管理系统前端界面Ⅺ——信息列表页(弹窗复用增改、CRUD前端基础实现)


    因为需求发生了点变化,所以把之前的代码稍改一下,把之前的信息列表全复制到用户列表中,最后效果一样。UserList.vue

    1. <template>
    2. <div class="UserList">
    3. <el-form :inline="true" :model="formInline" class="demo-form-inline" size="small">
    4. <el-form-item label="姓名">
    5. <el-input v-model="formInline.name" placeholder="请输入姓名">el-input>
    6. el-form-item>
    7. <el-form-item>
    8. <el-button type="primary" @click="find()">查询el-button>
    9. el-form-item>
    10. <el-form-item>
    11. <el-button type="danger" @click="refresh()">刷新el-button>
    12. el-form-item>
    13. el-form>
    14. <el-table
    15. :data="compData"
    16. height="450"
    17. border
    18. style="width: 100%"
    19. :default-sort="{ prop: 'number', order: 'Ascending' }"
    20. >
    21. <el-table-column type="selection" width="55"> el-table-column>
    22. <el-table-column prop="number" label="学号" align="center" sortable>
    23. el-table-column>
    24. <el-table-column prop="name" label="姓名" align="center">
    25. el-table-column>
    26. <el-table-column prop="sex_text" label="性别" align="center">
    27. el-table-column>
    28. <el-table-column prop="age" label="年龄" align="center" sortable>
    29. el-table-column>
    30. <el-table-column prop="class" label="班级" align="center">
    31. el-table-column>
    32. <el-table-column prop="state_text" label="状态" align="center">
    33. el-table-column>
    34. <el-table-column prop="address" label="地址" align="center">
    35. el-table-column>
    36. <el-table-column prop="phone" label="联系方式" align="center">
    37. el-table-column>
    38. <el-table-column fixed="right" label="操作" align="center">
    39. <template slot-scope="scope">
    40. <el-button
    41. @click="del(scope.row)"
    42. icon="el-icon-delete"
    43. type="danger"
    44. size="mini"
    45. circle
    46. >el-button>
    47. <el-button
    48. type="primary"
    49. icon="el-icon-edit"
    50. size="mini"
    51. circle
    52. >el-button>
    53. template>
    54. el-table-column>
    55. el-table>
    56. <el-pagination
    57. @size-change="handleSizeChange"
    58. @current-change="handleCurrentChange"
    59. :current-page="currentPage"
    60. :page-sizes="[5, 10, 20, 30, 50]"
    61. :page-size="pageSize"
    62. layout="total, sizes, prev, pager, next, jumper"
    63. :total="total"
    64. >
    65. el-pagination>
    66. div>
    67. template>
    68. <script>
    69. import { Info, InfoDel } from "@/api/api.js";
    70. export default {
    71. data() {
    72. return {
    73. tableData: [],
    74. currentPage: 1, //当前页数
    75. pageSize: 10, //每页显示条数
    76. total: 0,
    77. formInline: {
    78. name: ''
    79. }
    80. };
    81. },
    82. created() {
    83. this.getData();
    84. },
    85. computed: {
    86. compData() {
    87. return this.tableData.slice(
    88. (this.currentPage - 1) * this.pageSize,
    89. this.currentPage * this.pageSize
    90. );
    91. },
    92. },
    93. methods: {
    94. find(){
    95. this.getData(this.formInline)
    96. },
    97. refresh(){
    98. this.formInline = {}
    99. this.getData(this.formInline)
    100. },
    101. handleSizeChange(val) {
    102. this.pageSize = val;
    103. this.currentPage = 1;
    104. },
    105. handleCurrentChange(val) {
    106. this.currentPage = val;
    107. },
    108. getData(params) {
    109. Info(params).then((res) => {
    110. console.log(res.data);
    111. if (res.data.status === 200) {
    112. this.total = res.data.total;
    113. this.tableData = res.data.data;
    114. this.tableData.forEach((item) => {
    115. item.sex === 1 ? (item.sex_text = "男") : (item.sex_text = "女");
    116. item.state === "1"
    117. ? (item.state_text = "已入校")
    118. : item.state === "2"
    119. ? (item.state_text = "未入校")
    120. : (item.state_text = "休学中");
    121. });
    122. }
    123. });
    124. },
    125. del(row) {
    126. console.log(row);
    127. InfoDel(row.id).then((res) => {
    128. if (res.data.status === 200) {
    129. this.$message({ message: res.data.message, type: "success" });
    130. this.getData();
    131. }
    132. });
    133. },
    134. },
    135. };
    136. script>
    137. <style lang="scss">
    138. .UserList {
    139. .demo-form-inline {
    140. text-align: left;
    141. }
    142. .el-pagination {
    143. text-align: left;
    144. margin-top: 20x;
    145. }
    146. }
    147. style>

    调整一下页面元素布局和样式:按钮、图标等。调整后

    UserList.vue

    1. <template>
    2. <div class="UserList">
    3. <el-form
    4. :inline="true"
    5. :model="formInline"
    6. class="demo-form-inline"
    7. size="small"
    8. >
    9. <el-form-item>
    10. <el-input
    11. v-model="formInline.name"
    12. placeholder="请输入姓名"
    13. prefix-icon="el-icon-search"
    14. >el-input>
    15. el-form-item>
    16. <el-form-item>
    17. <el-button type="primary" @click="find()" plain round>查询el-button>
    18. el-form-item>
    19. <el-form-item>
    20. <el-button type="success" @click="refresh()" round>刷新el-button>
    21. el-form-item>
    22. el-form>
    23. <el-table
    24. :data="compData"
    25. height="450"
    26. border
    27. style="width: 100%"
    28. :default-sort="{ prop: 'number', order: 'Ascending' }"
    29. >
    30. <el-table-column type="selection" width="55"> el-table-column>
    31. <el-table-column prop="number" label="学号" align="center" sortable>
    32. el-table-column>
    33. <el-table-column prop="name" label="姓名" align="center">
    34. el-table-column>
    35. <el-table-column prop="sex_text" label="性别" align="center">
    36. el-table-column>
    37. <el-table-column prop="age" label="年龄" align="center" sortable>
    38. el-table-column>
    39. <el-table-column prop="class" label="班级" align="center">
    40. el-table-column>
    41. <el-table-column prop="state_text" label="状态" align="center">
    42. el-table-column>
    43. <el-table-column prop="address" label="地址" align="center">
    44. el-table-column>
    45. <el-table-column prop="phone" label="联系方式" align="center">
    46. el-table-column>
    47. <el-table-column fixed="right" label="操作" align="center" width="100">
    48. <template slot-scope="scope">
    49. <el-button
    50. type="primary"
    51. icon="el-icon-edit"
    52. size="mini"
    53. circle
    54. >el-button>
    55. <el-button
    56. @click="del(scope.row)"
    57. icon="el-icon-delete"
    58. type="danger"
    59. size="mini"
    60. circle plain
    61. >el-button>
    62. template>
    63. el-table-column>
    64. el-table>
    65. <el-pagination
    66. @size-change="handleSizeChange"
    67. @current-change="handleCurrentChange"
    68. :current-page="currentPage"
    69. :page-sizes="[5, 10, 20, 30, 50]"
    70. :page-size="pageSize"
    71. layout="total, sizes, prev, pager, next, jumper"
    72. :total="total"
    73. >
    74. el-pagination>
    75. div>
    76. template>
    77. <script>
    78. import { Info, InfoDel } from "@/api/api.js";
    79. export default {
    80. data() {
    81. return {
    82. tableData: [],
    83. currentPage: 1, //当前页数
    84. pageSize: 10, //每页显示条数
    85. total: 0,
    86. formInline: {
    87. name: "",
    88. },
    89. };
    90. },
    91. created() {
    92. this.getData();
    93. },
    94. computed: {
    95. compData() {
    96. return this.tableData.slice(
    97. (this.currentPage - 1) * this.pageSize,
    98. this.currentPage * this.pageSize
    99. );
    100. },
    101. },
    102. methods: {
    103. find() {
    104. this.getData(this.formInline);
    105. },
    106. refresh() {
    107. this.formInline = {};
    108. this.getData(this.formInline);
    109. },
    110. handleSizeChange(val) {
    111. this.pageSize = val;
    112. this.currentPage = 1;
    113. },
    114. handleCurrentChange(val) {
    115. this.currentPage = val;
    116. },
    117. getData(params) {
    118. Info(params).then((res) => {
    119. console.log(res.data);
    120. if (res.data.status === 200) {
    121. this.total = res.data.total;
    122. this.tableData = res.data.data;
    123. this.tableData.forEach((item) => {
    124. item.sex === 1 ? (item.sex_text = "男") : (item.sex_text = "女");
    125. item.state === "1"
    126. ? (item.state_text = "已入校")
    127. : item.state === "2"
    128. ? (item.state_text = "未入校")
    129. : (item.state_text = "休学中");
    130. });
    131. }
    132. });
    133. },
    134. del(row) {
    135. console.log(row);
    136. InfoDel(row.id).then((res) => {
    137. if (res.data.status === 200) {
    138. this.$message({ message: res.data.message, type: "success" });
    139. this.getData();
    140. }
    141. });
    142. },
    143. },
    144. };
    145. script>
    146. <style lang="scss">
    147. .UserList {
    148. .demo-form-inline {
    149. text-align: left;
    150. }
    151. .el-pagination {
    152. text-align: left;
    153. margin-top: 20x;
    154. }
    155. }
    156. style>

    信息列表页实现

    根据接口返回来的的数据进行修改表头及调整样式 

     InfoList.vue

    1. <template>
    2. <div class="InfoList">
    3. <el-form
    4. :inline="true"
    5. :model="formInline"
    6. class="demo-form-inline"
    7. size="small"
    8. >
    9. <el-form-item>
    10. <el-input
    11. v-model="formInline.name"
    12. prefix-icon="el-icon-search"
    13. placeholder="请输入姓名"
    14. >el-input>
    15. el-form-item>
    16. <el-form-item>
    17. <el-button
    18. @click="find()"
    19. type="primary"
    20. icon="el-icon-search"
    21. circle
    22. size="small"
    23. >el-button>
    24. el-form-item>
    25. <el-form-item>
    26. <el-button
    27. type="success"
    28. @click="add()"
    29. circle
    30. size="small"
    31. icon="el-icon-circle-plus-outline"
    32. >el-button>
    33. el-form-item>
    34. <el-form-item>
    35. <el-button
    36. type="success"
    37. plain
    38. @click="refresh()"
    39. circle
    40. size="small"
    41. icon="el-icon-refresh"
    42. >el-button>
    43. el-form-item>
    44. <el-form-item>
    45. <el-button
    46. type="danger"
    47. plain
    48. @click="delPitch()"
    49. circle
    50. size="small"
    51. icon="el-icon-delete"
    52. >el-button>
    53. el-form-item>
    54. el-form>
    55. <el-table
    56. :data="compData"
    57. height="450"
    58. border
    59. style="width: 100%"
    60. :default-sort="{ prop: 'number', order: 'Ascending' }"
    61. >
    62. <el-table-column type="selection" width="55"> el-table-column>
    63. <el-table-column prop="number" label="学号" align="center" sortable>
    64. el-table-column>
    65. <el-table-column prop="name" label="姓名" align="center">
    66. el-table-column>
    67. <el-table-column prop="sex_text" label="性别" align="center">
    68. el-table-column>
    69. <el-table-column prop="age" label="年龄" align="center" sortable>
    70. el-table-column>
    71. <el-table-column prop="father" label="父亲" align="center">
    72. el-table-column>
    73. <el-table-column prop="mather" label="母亲" align="center">
    74. el-table-column>
    75. <el-table-column prop="time" label="入校时间" align="center">
    76. el-table-column>
    77. <el-table-column prop="address" label="家庭住址" align="center">
    78. el-table-column>
    79. <el-table-column prop="phone" label="联系方式" align="center">
    80. el-table-column>
    81. <el-table-column fixed="right" label="操作" width="100" align="center">
    82. <template slot-scope="scope">
    83. <el-button
    84. @click="edit(scope.row)"
    85. type="primary"
    86. icon="el-icon-edit"
    87. circle
    88. size="mini"
    89. >el-button>
    90. <el-button
    91. @click="del(scope.row)"
    92. type="danger"
    93. icon="el-icon-delete"
    94. circle
    95. size="mini"
    96. >el-button>
    97. template>
    98. el-table-column>
    99. el-table>
    100. <el-pagination
    101. @size-change="handleSizeChange"
    102. @current-change="handleCurrentChange"
    103. :current-page="currentPage"
    104. :page-sizes="[5, 10, 20, 30, 50]"
    105. :page-size="pageSize"
    106. layout="total, sizes, prev, pager, next, jumper"
    107. :total="total"
    108. >
    109. el-pagination>
    110. div>
    111. template>
    112. <script>
    113. import { Info, InfoDel } from "@/api/api.js";
    114. export default {
    115. data() {
    116. return {
    117. tableData: [],
    118. currentPage: 1, //当前页数
    119. pageSize: 10, //每页显示条数
    120. total: 0,
    121. formInline: {
    122. name: "",
    123. },
    124. };
    125. },
    126. created() {
    127. this.getData();
    128. },
    129. computed: {
    130. compData() {
    131. return this.tableData.slice(
    132. (this.currentPage - 1) * this.pageSize,
    133. this.currentPage * this.pageSize
    134. );
    135. },
    136. },
    137. methods: {
    138. find() {
    139. this.getData(this.formInline);
    140. },
    141. refresh() {
    142. this.formInline = {};
    143. this.getData(this.formInline);
    144. },
    145. del(row) {
    146. console.log(row);
    147. InfoDel(row.id).then((res) => {
    148. if (res.data.status === 200) {
    149. this.$message({ message: res.data.message, type: "success" });
    150. this.getData();
    151. }
    152. });
    153. },
    154. handleSizeChange(val) {
    155. this.pageSize = val;
    156. this.currentPage = 1;
    157. },
    158. handleCurrentChange(val) {
    159. this.currentPage = val;
    160. },
    161. getData(params) {
    162. Info(params).then((res) => {
    163. console.log(res.data);
    164. if (res.data.status === 200) {
    165. this.total = res.data.total;
    166. this.tableData = res.data.data;
    167. this.tableData.forEach((item) => {
    168. item.sex === 1 ? (item.sex_text = "男") : (item.sex_text = "女");
    169. item.state === "1"
    170. ? (item.state_text = "已入校")
    171. : item.state === "2"
    172. ? (item.state_text = "未入校")
    173. : (item.state_text = "休学中");
    174. });
    175. }
    176. });
    177. },
    178. },
    179. };
    180. script>
    181. <style lang="scss">
    182. .InfoList {
    183. .demo-form-inline {
    184. text-align: left;
    185. }
    186. .el-pagination {
    187. text-align: left;
    188. margin-top: 20x;
    189. }
    190. }
    191. style>

     弹窗复用新增功能

    1、找

     2、触发式组件放置在页面最下面,再按需修改

             ①实现基本弹窗效果(隐藏,点击后显示)

            ② 修改表单内容

    1、修改用户需要填的内容,为提用户体验,实现更加良好的用户交互性,性别填写采用单选框、入校时间采用DatePicker日期选择器 

    2、定义表单校验规则,使用v-model实现表单数据的双向绑定

     表单效果:

     调整样式:

            ①规划左侧label

      调整前                                                        调整后

                                   

     ②调整弹窗dialog的宽度

    3、完善表单的校验规则

    ps:敏感词校验没有引入使用、还有待完善。

    1. <template>
    2. <div class="InfoList">
    3. <el-form
    4. :inline="true"
    5. :model="formInline"
    6. class="demo-form-inline"
    7. size="small"
    8. >
    9. <el-form-item>
    10. <el-input
    11. v-model="formInline.name"
    12. prefix-icon="el-icon-search"
    13. placeholder="请输入姓名"
    14. >el-input>
    15. el-form-item>
    16. <el-form-item>
    17. <el-button
    18. @click="find()"
    19. type="primary"
    20. icon="el-icon-search"
    21. circle
    22. size="small"
    23. >el-button>
    24. el-form-item>
    25. <el-form-item>
    26. <el-button
    27. type="success"
    28. @click="addUser()"
    29. circle
    30. size="small"
    31. icon="el-icon-circle-plus-outline"
    32. >el-button>
    33. el-form-item>
    34. <el-form-item>
    35. <el-button
    36. type="success"
    37. plain
    38. @click="refresh()"
    39. circle
    40. size="small"
    41. icon="el-icon-refresh"
    42. >el-button>
    43. el-form-item>
    44. <el-form-item>
    45. <el-button
    46. type="danger"
    47. plain
    48. @click="delPitch()"
    49. circle
    50. size="small"
    51. icon="el-icon-delete"
    52. >el-button>
    53. el-form-item>
    54. el-form>
    55. <el-table
    56. :data="compData"
    57. height="450"
    58. border
    59. style="width: 100%"
    60. :default-sort="{ prop: 'number', order: 'Ascending' }"
    61. >
    62. <el-table-column type="selection" width="55"> el-table-column>
    63. <el-table-column prop="id" label="id" align="center" sortable>
    64. el-table-column>
    65. <el-table-column prop="name" label="姓名" align="center">
    66. el-table-column>
    67. <el-table-column prop="sex_text" label="性别" align="center">
    68. el-table-column>
    69. <el-table-column prop="age" label="年龄" align="center" sortable>
    70. el-table-column>
    71. <el-table-column prop="father" label="父亲" align="center">
    72. el-table-column>
    73. <el-table-column prop="mather" label="母亲" align="center">
    74. el-table-column>
    75. <el-table-column prop="time" label="入校时间" align="center">
    76. el-table-column>
    77. <el-table-column prop="address" label="家庭住址" align="center">
    78. el-table-column>
    79. <el-table-column prop="phone" label="联系方式" align="center">
    80. el-table-column>
    81. <el-table-column fixed="right" label="操作" width="100" align="center">
    82. <template slot-scope="scope">
    83. <el-button
    84. @click="edit(scope.row)"
    85. type="primary"
    86. icon="el-icon-edit"
    87. circle
    88. size="mini"
    89. >el-button>
    90. <el-button
    91. @click="del(scope.row)"
    92. type="danger"
    93. icon="el-icon-delete"
    94. circle
    95. size="mini"
    96. >el-button>
    97. template>
    98. el-table-column>
    99. el-table>
    100. <el-pagination
    101. @size-change="handleSizeChange"
    102. @current-change="handleCurrentChange"
    103. :current-page="currentPage"
    104. :page-sizes="[5, 10, 20, 30, 50]"
    105. :page-size="pageSize"
    106. layout="total, sizes, prev, pager, next, jumper"
    107. :total="total"
    108. >
    109. el-pagination>
    110. <el-dialog
    111. title="新增用户信息"
    112. :visible.sync="dialogFormVisible"
    113. width="500px"
    114. >
    115. <el-form :model="newUserForm" :rules="rules" ref="newUserForm">
    116. <el-form-item label="姓名" :label-width="formLabelWidth" prop="name">
    117. <el-input v-model="newUserForm.name" autocomplete="off">el-input>
    118. el-form-item>
    119. <el-form-item
    120. label="性别"
    121. :label-width="formLabelWidth"
    122. prop="sex"
    123. icon="el-icon-male"
    124. >
    125. <el-radio v-model="newUserForm.sex" label="1"
    126. ><i class="el-icon-male">i>男
    127. >
    128. <el-radio v-model="newUserForm.sex" label="2"
    129. ><i class="el-icon-female">i>女
    130. >
    131. el-form-item>
    132. <el-form-item label="年龄" :label-width="formLabelWidth" prop="age">
    133. <el-input v-model="newUserForm.age" autocomplete="off">el-input>
    134. el-form-item>
    135. <el-form-item
    136. label="父亲姓名"
    137. :label-width="formLabelWidth"
    138. prop="father"
    139. >
    140. <el-input v-model="newUserForm.father" autocomplete="off">el-input>
    141. el-form-item>
    142. <el-form-item
    143. label="母亲姓名"
    144. :label-width="formLabelWidth"
    145. prop="mather"
    146. >
    147. <el-input v-model="newUserForm.mather" autocomplete="off">el-input>
    148. el-form-item>
    149. <el-form-item
    150. label="入校时间"
    151. :label-width="formLabelWidth"
    152. prop="time"
    153. >
    154. <el-date-picker
    155. v-model="newUserForm.time"
    156. align="right"
    157. format="yyyy 年 MM 月 dd 日"
    158. value-format="yyyy/MM/dd"
    159. type="date"
    160. placeholder="选择入校日期"
    161. :picker-options="pickAfter"
    162. >
    163. el-date-picker>
    164. el-form-item>
    165. <el-form-item
    166. label="家庭住址"
    167. :label-width="formLabelWidth"
    168. prop="address"
    169. >
    170. <el-input v-model="newUserForm.address" autocomplete="off">el-input>
    171. el-form-item>
    172. <el-form-item
    173. label="联系方式"
    174. :label-width="formLabelWidth"
    175. prop="phone"
    176. >
    177. <el-input v-model="newUserForm.phone" autocomplete="off">el-input>
    178. el-form-item>
    179. el-form>
    180. <div slot="footer" class="dialog-footer">
    181. <el-button @click="dialogFormVisible = false">取 消el-button>
    182. <el-button type="primary" @click="comfirm('newUserForm')"
    183. >确 定
    184. >
    185. div>
    186. el-dialog>
    187. div>
    188. template>
    189. <script>
    190. import { infoList, UserDel, addInfo } from "@/api/api.js";
    191. import {
    192. NotNullRule,
    193. newUsernameRule,
    194. ageRule,
    195. phoneRule,
    196. } from "@/utils/validate";
    197. export default {
    198. data() {
    199. return {
    200. tableData: [],
    201. currentPage: 1, //当前页数
    202. pageSize: 10, //每页显示条数
    203. total: 0,
    204. dialogFormVisible: false,
    205. formInline: {
    206. name: "",
    207. },
    208. newUserForm: {
    209. name: "",
    210. sex: "1",
    211. age: "",
    212. father: "",
    213. mather: "",
    214. time: "",
    215. address: "",
    216. phone: "",
    217. },
    218. pickAfter: {
    219. disabledDate(time) {
    220. return time.getTime() > Date.now() // 如果没有后面的-8.64e7就是不可以选择今天的
    221. },
    222. },
    223. rules: {
    224. name: [{ validator: newUsernameRule, trigger: "blur", required:true }],
    225. sex: [{ validator: NotNullRule, trigger: "blur", required:true }],
    226. age: [{ validator: ageRule, trigger: "blur", required:true }],
    227. time: [{ validator: NotNullRule, trigger: "blur", required:true }],
    228. address: [{ validator: NotNullRule, trigger: "blur", required:true }],
    229. phone: [{ validator: phoneRule, trigger: "blur", required:true }],
    230. },
    231. formLabelWidth: "80px",
    232. };
    233. },
    234. created() {
    235. this.getData();
    236. },
    237. computed: {
    238. compData() {
    239. return this.tableData.slice(
    240. (this.currentPage - 1) * this.pageSize,
    241. this.currentPage * this.pageSize
    242. );
    243. },
    244. // copDate() {
    245. // return new Date().toLocaleDateString();
    246. // }
    247. },
    248. methods: {
    249. addUser() {
    250. this.dialogFormVisible = true;
    251. },
    252. comfirm(newUserForm) {
    253. console.log(newUserForm, this.newUserForm);
    254. this.$refs[newUserForm].validate(valid => {
    255. if(valid){
    256. console.log(newUserForm, this.newUserForm)
    257. addInfo(this.newUserForm).then(res => {
    258. if(res.data.status === 200){
    259. this.dialogFormVisible = false
    260. this.$message({type: 'success', message: res.data.message}
    261. )
    262. }
    263. })
    264. }
    265. })
    266. },
    267. find() {
    268. this.getData(this.formInline);
    269. },
    270. refresh() {
    271. this.formInline = {};
    272. this.getData(this.formInline);
    273. },
    274. del(row) {
    275. console.log(row);
    276. UserDel(row.id).then((res) => {
    277. if (res.data.status === 200) {
    278. this.$message({ message: res.data.message, type: "success" });
    279. this.getData();
    280. }
    281. });
    282. },
    283. getData(params) {
    284. infoList(params).then((res) => {
    285. console.log(res.data);
    286. if (res.data.status === 200) {
    287. this.total = res.data.total;
    288. this.tableData = res.data.data;
    289. this.tableData.forEach((item) => {
    290. item.sex === 1 ? (item.sex_text = "男") : (item.sex_text = "女");
    291. item.state === "1"
    292. ? (item.state_text = "已入校")
    293. : item.state === "2"
    294. ? (item.state_text = "未入校")
    295. : (item.state_text = "休学中");
    296. });
    297. }
    298. });
    299. },
    300. handleSizeChange(val) {
    301. this.pageSize = val;
    302. this.currentPage = 1;
    303. },
    304. handleCurrentChange(val) {
    305. this.currentPage = val;
    306. },
    307. },
    308. };
    309. script>
    310. <style lang="scss">
    311. .InfoList {
    312. .demo-form-inline {
    313. text-align: left;
    314. }
    315. .el-pagination {
    316. text-align: left;
    317. margin-top: 20x;
    318. }
    319. }
    320. style>
    1. //信息列表的
    2. //通用校验——判空
    3. export function NotNullRule(rule, value, callback) {
    4. if (value === "") {
    5. callback(new Error("此处不能为空"));
    6. } else {
    7. callback();
    8. }
    9. }
    10. //新增用户的姓名校验
    11. export function newUsernameRule(rule, value, callback) {
    12. let CName = /^(?:[\u4e00-\u9fa5·]{2,16})$/;
    13. let EName = /(^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$)/;
    14. if (value === "") {
    15. callback(new Error("请输入姓名"));
    16. } else if (!(CName.test(value) || EName.test(value))) {
    17. callback(new Error("请输入中文姓名或者20位字母以内的英文名"));
    18. } else{
    19. // forbiddenStrRule(rule, value, callback);
    20. callback();
    21. }
    22. }
    23. //新增用户的联系方式校验
    24. export function phoneRule(rule, value, callback) {
    25. let phone = /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/
    26. if (value === "") {
    27. callback(new Error("请输入手机号"));
    28. } else if(!phone.test(value)) {
    29. callback(new Error("请输入正确的手机号格式"));
    30. }else{
    31. callback();
    32. }
    33. }
    34. //新增用户的年龄校验
    35. export function ageRule(rule, value, callback) {
    36. // 6-12位密码需要包含大小写字母和数字以及特殊符号
    37. let age = /^([1-3]|[0-9]{2})$/;
    38. if (value === "") {
    39. callback(new Error("请输入年龄"));
    40. } else if (!age.test(value)) {
    41. callback(new Error("用户年龄不合理"));
    42. } else {
    43. callback();
    44. }
    45. }
    46. //敏感词过滤
    47. export function forbiddenStrRule(rule, value, callback) {
    48. //定义敏感字符
    49. let forbiddenArray = ['xx', '<', '>', '黄色', 'sb', 'fuck', 'md', 'laji', '靠', 'nm', 'tm', 'tmd', 'c'];
    50. for (var i = 0; i < forbiddenArray.length; i++) {
    51. if(value.indexOf(forbiddenArray[i])){
    52. // value = value.replace(forbiddenArray[i], "*");
    53. callback(new Error("有敏感词,请重新输入。"));
    54. }else{
    55. return callback();
    56. }
    57. }
    58. }
    59. //新增用户的入校时间校验
    60. export function timeRule(rule, value, callback) {
    61. console.log(value)
    62. let time = new Date();
    63. // value.join(" ");
    64. let year = time.getFullYear().toString();
    65. let month = (time.getMonth() + 1).toString();
    66. let date = time.getDate().toString();
    67. let dateValue = value.split("/");
    68. console.log(dateValue)
    69. if (value === "") {
    70. callback(new Error("请输入入校时间"));
    71. } else if (year === dateValue[0]) {
    72. if (month === dateValue[1] && date >= dateValue[2]) {
    73. console.log("1")
    74. callback();
    75. } else if (month > dateValue[1]) {
    76. console.log("2")
    77. callback();
    78. }
    79. } else if (year > dateValue[0]) {
    80. console.log(year)
    81. console.log(dateValue[0])
    82. console.log("3")
    83. callback();
    84. } else {
    85. callback(new Error("用户选择的时间错误,还未到时间"));
    86. }
    87. }

     4、封装api请求接口、连接后端

    创建点击事件,对传递数据对象——新建用户信息,进行打印查看。

    点击确定,校验表单:

    发送请求:

     确认后端数据接口添加成功后,应该刷新表单,所以完善一下信息列表的查询接口,与用户列表查询接口相似

    注意这里的性别格式转换的显示问题:因为sex为string类型,所以这里要加 ‘’

    演示:

      弹窗复用修改功能

    ps:动态加载的没有(),不是function,在computed里监控。所以

    连接后端

     由于新增和修改用的是同一个表单,点击的确定按钮 ,就需要先判断是新增还是修改来像后端发起请求,也就是可以根据forrm表单title的状态:真就是修改,假就是新增。

    测试:

    再修改时,不将数据绑定而是备份,避免不了解计算机原理的用户,在修改表单数据时,列表数据也在同时发生变化,没有点击确定,误以为数据已经修改成功。所以不直接赋值:

    取消按钮:

    InfoList.vue: 

    1. <template>
    2. <div class="InfoList">
    3. <el-form
    4. :inline="true"
    5. :model="formInline"
    6. class="demo-form-inline"
    7. size="small"
    8. >
    9. <el-form-item>
    10. <el-input
    11. v-model="formInline.name"
    12. prefix-icon="el-icon-search"
    13. placeholder="请输入姓名"
    14. >el-input>
    15. el-form-item>
    16. <el-form-item>
    17. <el-button
    18. @click="find()"
    19. type="primary"
    20. icon="el-icon-search"
    21. circle
    22. size="small"
    23. >el-button>
    24. el-form-item>
    25. <el-form-item>
    26. <el-button
    27. type="success"
    28. @click="addUser()"
    29. circle
    30. size="small"
    31. icon="el-icon-circle-plus-outline"
    32. >el-button>
    33. el-form-item>
    34. <el-form-item>
    35. <el-button
    36. type="success"
    37. plain
    38. @click="refresh()"
    39. circle
    40. size="small"
    41. icon="el-icon-refresh"
    42. >el-button>
    43. el-form-item>
    44. <el-form-item>
    45. <el-button
    46. type="danger"
    47. plain
    48. @click="delPitch()"
    49. circle
    50. size="small"
    51. icon="el-icon-delete"
    52. >el-button>
    53. el-form-item>
    54. el-form>
    55. <el-table
    56. :data="compData"
    57. height="450"
    58. border
    59. style="width: 100%"
    60. :default-sort="{ prop: 'number', order: 'Ascending' }"
    61. >
    62. <el-table-column type="selection" width="55"> el-table-column>
    63. <el-table-column prop="name" label="姓名" align="center">
    64. el-table-column>
    65. <el-table-column prop="sex_text" label="性别" align="center">
    66. el-table-column>
    67. <el-table-column prop="age" label="年龄" align="center" sortable>
    68. el-table-column>
    69. <el-table-column prop="father" label="父亲" align="center">
    70. el-table-column>
    71. <el-table-column prop="mather" label="母亲" align="center">
    72. el-table-column>
    73. <el-table-column prop="time" label="入校时间" align="center">
    74. el-table-column>
    75. <el-table-column prop="address" label="家庭住址" align="center">
    76. el-table-column>
    77. <el-table-column prop="phone" label="联系方式" align="center">
    78. el-table-column>
    79. <el-table-column fixed="right" label="操作" width="100" align="center">
    80. <template slot-scope="scope">
    81. <el-button
    82. @click="edit(scope.row)"
    83. type="primary"
    84. icon="el-icon-edit"
    85. circle
    86. size="mini"
    87. >el-button>
    88. <el-button
    89. @click="del(scope.row)"
    90. type="danger"
    91. icon="el-icon-delete"
    92. circle
    93. size="mini"
    94. >el-button>
    95. template>
    96. el-table-column>
    97. el-table>
    98. <el-pagination
    99. @size-change="handleSizeChange"
    100. @current-change="handleCurrentChange"
    101. :current-page="currentPage"
    102. :page-sizes="[5, 10, 20, 30, 50]"
    103. :page-size="pageSize"
    104. layout="total, sizes, prev, pager, next, jumper"
    105. :total="total"
    106. >
    107. el-pagination>
    108. <el-dialog
    109. :title="compTitle"
    110. :visible.sync="dialogFormVisible"
    111. width="500px"
    112. >
    113. <el-form :model="newUserForm" :rules="rules" ref="newUserForm">
    114. <el-form-item label="姓名" :label-width="formLabelWidth" prop="name">
    115. <el-input v-model="newUserForm.name" autocomplete="off">el-input>
    116. el-form-item>
    117. <el-form-item
    118. label="性别"
    119. :label-width="formLabelWidth"
    120. prop="sex"
    121. icon="el-icon-male"
    122. >
    123. <el-radio v-model="newUserForm.sex" label="1"
    124. ><i class="el-icon-male">i>男
    125. >
    126. <el-radio v-model="newUserForm.sex" label="2"
    127. ><i class="el-icon-female">i>女
    128. >
    129. el-form-item>
    130. <el-form-item label="年龄" :label-width="formLabelWidth" prop="age">
    131. <el-input v-model="newUserForm.age" autocomplete="off">el-input>
    132. el-form-item>
    133. <el-form-item
    134. label="父亲姓名"
    135. :label-width="formLabelWidth"
    136. prop="father"
    137. >
    138. <el-input v-model="newUserForm.father" autocomplete="off">el-input>
    139. el-form-item>
    140. <el-form-item
    141. label="母亲姓名"
    142. :label-width="formLabelWidth"
    143. prop="mather"
    144. >
    145. <el-input v-model="newUserForm.mather" autocomplete="off">el-input>
    146. el-form-item>
    147. <el-form-item
    148. label="入校时间"
    149. :label-width="formLabelWidth"
    150. prop="time"
    151. >
    152. <el-date-picker
    153. v-model="newUserForm.time"
    154. align="right"
    155. format="yyyy 年 MM 月 dd 日"
    156. value-format="yyyy/MM/dd"
    157. type="date"
    158. placeholder="选择入校日期"
    159. :picker-options="pickAfter"
    160. >
    161. el-date-picker>
    162. el-form-item>
    163. <el-form-item
    164. label="家庭住址"
    165. :label-width="formLabelWidth"
    166. prop="address"
    167. >
    168. <el-input v-model="newUserForm.address" autocomplete="off">el-input>
    169. el-form-item>
    170. <el-form-item
    171. label="联系方式"
    172. :label-width="formLabelWidth"
    173. prop="phone"
    174. >
    175. <el-input v-model="newUserForm.phone" autocomplete="off">el-input>
    176. el-form-item>
    177. el-form>
    178. <div slot="footer" class="dialog-footer">
    179. <el-button @click="closeForm('newUserForm')">取 消el-button>
    180. <el-button type="primary" @click="comfirm('newUserForm')"
    181. >确 定
    182. >
    183. div>
    184. el-dialog>
    185. div>
    186. template>
    187. <script>
    188. import { infoList, UserDel, addInfo, updateInfo } from "@/api/api.js";
    189. import {
    190. NotNullRule,
    191. newUsernameRule,
    192. ageRule,
    193. phoneRule,
    194. } from "@/utils/validate";
    195. export default {
    196. data() {
    197. return {
    198. tableData: [],
    199. currentPage: 1, //当前页数
    200. pageSize: 10, //每页显示条数
    201. total: 0,
    202. dialogFormVisible: false,
    203. formInline: {
    204. name: "",
    205. },
    206. newUserForm: {
    207. name: "",
    208. sex: "1",
    209. age: "",
    210. father: "",
    211. mather: "",
    212. time: "",
    213. address: "",
    214. phone: "",
    215. },
    216. pickAfter: {
    217. disabledDate(time) {
    218. return time.getTime() > Date.now(); // 如果没有后面的-8.64e7就是不可以选择今天的
    219. },
    220. },
    221. rules: {
    222. name: [{ validator: newUsernameRule, trigger: "blur", required: true }],
    223. sex: [{ validator: NotNullRule, trigger: "blur", required: true }],
    224. age: [{ validator: ageRule, trigger: "blur", required: true }],
    225. time: [{ validator: NotNullRule, trigger: "blur", required: true }],
    226. address: [{ validator: NotNullRule, trigger: "blur", required: true }],
    227. phone: [{ validator: phoneRule, trigger: "blur", required: true }],
    228. },
    229. formLabelWidth: "80px",
    230. formState: true,
    231. };
    232. },
    233. created() {
    234. this.getData();
    235. },
    236. computed: {
    237. compData() {
    238. return this.tableData.slice(
    239. (this.currentPage - 1) * this.pageSize,
    240. this.currentPage * this.pageSize
    241. );
    242. },
    243. compTitle() {
    244. return this.formState ? "修改用户信息" : "新增用户信息";
    245. },
    246. },
    247. methods: {
    248. addUser() {
    249. this.formState = false;
    250. this.dialogFormVisible = true;
    251. this.newUserForm = {
    252. name: "",
    253. sex: "1",
    254. age: "",
    255. father: "",
    256. mather: "",
    257. time: "",
    258. address: "",
    259. phone: "",
    260. };
    261. },
    262. edit(row) {
    263. this.formState = true;
    264. this.dialogFormVisible = true;
    265. // this.newUserForm = row;
    266. this.newUserForm = { ...row };
    267. },
    268. comfirm(newUserForm) {
    269. this.$refs[newUserForm].validate((valid) => {
    270. if (valid) {
    271. if (this.formState) {
    272. updateInfo(this.newUserForm).then((res) => {
    273. if (res.data.status === 200) {
    274. this.getData();
    275. this.dialogFormVisible = false;
    276. this.$message({ type: "success", message: res.data.message });
    277. }
    278. });
    279. } else {
    280. addInfo(this.newUserForm).then((res) => {
    281. if (res.data.status === 200) {
    282. this.getData();
    283. this.dialogFormVisible = false;
    284. this.$message({ type: "success", message: res.data.message });
    285. }
    286. });
    287. }
    288. }
    289. });
    290. },
    291. closeForm(newUserForm) {
    292. this.$refs[newUserForm].resetFields();
    293. this.dialogFormVisible = false;
    294. },
    295. find() {
    296. this.getData(this.formInline);
    297. },
    298. refresh() {
    299. this.formInline = {};
    300. this.getData(this.formInline);
    301. },
    302. del(row) {
    303. console.log(row);
    304. UserDel(row.id).then((res) => {
    305. if (res.data.status === 200) {
    306. this.$message({ message: res.data.message, type: "success" });
    307. this.getData();
    308. }
    309. });
    310. },
    311. getData(params) {
    312. infoList(params).then((res) => {
    313. console.log(res.data);
    314. if (res.data.status === 200) {
    315. this.total = res.data.total;
    316. this.tableData = res.data.data;
    317. this.tableData.forEach((item) => {
    318. item.sex === '1' ? (item.sex_text = "男") : (item.sex_text = "女");
    319. });
    320. }
    321. });
    322. },
    323. handleSizeChange(val) {
    324. this.pageSize = val;
    325. this.currentPage = 1;
    326. },
    327. handleCurrentChange(val) {
    328. this.currentPage = val;
    329. },
    330. },
    331. };
    332. script>
    333. <style lang="scss">
    334. .InfoList {
    335. .demo-form-inline {
    336. text-align: left;
    337. }
    338. .el-pagination {
    339. text-align: left;
    340. margin-top: 20x;
    341. }
    342. }
    343. style>

     api.js

    1. //信息列表
    2. //查询
    3. export function infoList(param){
    4. return service({
    5. method: 'get',
    6. url: '/info',
    7. param
    8. })
    9. }
    10. //新增用户接口
    11. export function addInfo(data){
    12. data = qs.stringify(data)
    13. return service({
    14. method: 'post',
    15. url: '/info',
    16. data
    17. })
    18. }
    19. //修改信息接口
    20. export function updateInfo(data){
    21. data = qs.stringify(data)
    22. return service({
    23. method: 'put',
    24. url: '/info',
    25. data
    26. })
    27. }

    查询、删除单个按钮功能

     

     InfoList.vue

    1. <el-table>
    2. <el-table-column fixed="right" label="操作" width="100" align="center">
    3. <template slot-scope="scope">
    4. <el-button
    5. @click="del(scope.row)"
    6. type="danger"
    7. icon="el-icon-delete"
    8. circle
    9. size="mini"
    10. >el-button>
    11. template>
    12. el-table-column>
    13. el-table>
    1. del(row) {
    2. console.log(row);
    3. this.$alert("你确定要删除吗?", "提示", {
    4. confirmButtonText: "确定",
    5. callback: () => {
    6. delInfo(row.id).then((res) => {
    7. if (res.data.status === 200) {
    8. this.$message({ message: res.data.message, type: "success" });
    9. this.getData();
    10. }
    11. });
    12. },
    13. });
    14. },

     api.js

    1. //删除信息接口
    2. export function delInfo(id){
    3. return service({
    4. method: 'delete',
    5. url: `/info/${id}`
    6. })
    7. }

    封装新增和修改信息的 api接口:

    上面有个小问题:

    测试: 

     信息列表的条件查询和批删除因为后端没有写,所以这里只有按钮没有真实现。

  • 相关阅读:
    运维理想和现实,你是?
    React升级到18版本
    SpringCloud - Spring Cloud Netflix 之 Hystrix ;turbine(十)
    一台抵得上多种测量仪器-B1500A半导体参数分析仪
    Fabric.js在vue2中使用
    C#定时任务框架Quartz.NET 简单Demo
    一个AI板卡电脑--香橙派 AIpro
    Docker Compose安装部署Jenkins
    在 ASP.NET Core Web API 中处理 Patch 请求
    (七)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • 原文地址:https://blog.csdn.net/qq_45947664/article/details/128048772