From 3df06d7515db396b34ed1d088502556484df6527 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 11 七月 2024 10:55:01 +0800
Subject: [PATCH] 教师管理

---
 src/views/login/index.vue       |    4 
 src/views/user/teacher/list.vue |  131 ++++++++++++++++++
 src/router.js                   |   13 +
 src/views/user/admin/edit.vue   |   48 +++++-
 src/views/user/teacher/edit.vue |  166 +++++++++++++++++++++++
 src/views/user/student/edit.vue |    2 
 6 files changed, 352 insertions(+), 12 deletions(-)

diff --git a/src/router.js b/src/router.js
index 0059a0d..0391f7c 100644
--- a/src/router.js
+++ b/src/router.js
@@ -111,6 +111,19 @@
         hidden: true
       },
       {
+        path: 'teacher/list',
+        component: () => import('@/views/user/teacher/list'),
+        name: 'UserTeacherPageList',
+        meta: { title: '鏁欏笀鍒楄〃', noCache: true }
+      },
+      {
+        path: 'teacher/edit',
+        component: () => import('@/views/user/teacher/edit'),
+        name: 'UserTeacherEdit',
+        meta: { title: '鏁欏笀缂栬緫', noCache: true, activeMenu: '/user/teacher/list' },
+        hidden: true
+      },
+      {
         path: 'admin/list',
         component: () => import('@/views/user/admin/list'),
         name: 'UserAdminPageList',
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 019ad5a..a194d26 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -115,8 +115,8 @@
         remember: false
       },
       loginRules: {
-        userName: [{ required: true, trigger: 'blur', validator: validateUsername }],
-        password: [{ required: true, trigger: 'blur', validator: validatePassword }]
+        userName: [{ required: true, trigger: 'blur'}],
+        password: [{ required: true, trigger: 'blur'}]
       },
       passwordType: 'password',
       capsTooltip: false,
diff --git a/src/views/user/admin/edit.vue b/src/views/user/admin/edit.vue
index 40d73a9..ac6dc9f 100644
--- a/src/views/user/admin/edit.vue
+++ b/src/views/user/admin/edit.vue
@@ -2,14 +2,17 @@
   <div class="app-container">
 
     <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
-      <el-form-item label="鐢ㄦ埛鍚嶏細"  prop="userName" required>
+      <el-form-item label="鐪熷疄濮撳悕锛�" prop="realName" required>
+        <el-input v-model="form.realName"></el-input>
+      </el-form-item>
+      <el-form-item label="鎵嬫満鍙风爜锛�" prop="phone" required>
+        <el-input v-model="form.phone"></el-input>
+      </el-form-item>
+      <el-form-item label="鐧诲綍璐﹀彿锛�" prop="userName" required>
         <el-input v-model="form.userName"></el-input>
       </el-form-item>
-      <el-form-item label="瀵嗙爜锛�" required>
-        <el-input v-model="form.password"></el-input>
-      </el-form-item>
-      <el-form-item label="鐪熷疄濮撳悕锛�" prop="realName"   required>
-        <el-input v-model="form.realName"></el-input>
+      <el-form-item label="鐧诲綍瀵嗙爜锛�" prop="password" required>
+        <el-input v-model="form.password" show-password></el-input>
       </el-form-item>
       <el-form-item label="骞撮緞锛�">
         <el-input v-model="form.age"></el-input>
@@ -21,9 +24,6 @@
       </el-form-item>
       <el-form-item label="鍑虹敓鏃ユ湡锛�">
         <el-date-picker v-model="form.birthDay" value-format="yyyy-MM-dd" type="date" placeholder="閫夋嫨鏃ユ湡"/>
-      </el-form-item>
-      <el-form-item label="鎵嬫満锛�">
-        <el-input v-model="form.phone"></el-input>
       </el-form-item>
       <el-form-item label="鐘舵�侊細" required>
         <el-select v-model="form.status" placeholder="鐘舵��">
@@ -44,6 +44,30 @@
 
 export default {
   data () {
+    var validatePassword = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error('璇疯緭鍏ュ瘑鐮�'))
+      } else if (!/[A-Z]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓ぇ鍐欏瓧姣�'))
+      } else if (!/[a-z]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓皬鍐欏瓧姣�'))
+      } else if (!/[0-9]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓暟瀛�'))
+      } else {
+        callback()
+      }
+    }
+    var validatePhone = (rule, value, callback) => {
+      // 鎵嬫満鍙烽獙璇侀�昏緫
+      const phoneRegex = /^1[3-9]\d{9}$/;
+      if (!value) {
+        callback(new Error('璇疯緭鍏ユ墜鏈哄彿'));
+      } else if (!phoneRegex.test(value)) {
+        callback(new Error('鎵嬫満鍙锋牸寮忎笉姝g‘'));
+      } else {
+        callback();
+      }
+    }
     return {
       form: {
         id: null,
@@ -64,6 +88,12 @@
         ],
         realName: [
           { required: true, message: '璇疯緭鍏ョ湡瀹炲鍚�', trigger: 'blur' }
+        ],
+        password: [
+          { validator: validatePassword, trigger: 'blur' }
+        ],
+        phone: [
+          { validator: validatePhone, trigger: 'blur' }
         ]
       }
     }
diff --git a/src/views/user/student/edit.vue b/src/views/user/student/edit.vue
index 6323e4d..e686016 100644
--- a/src/views/user/student/edit.vue
+++ b/src/views/user/student/edit.vue
@@ -5,7 +5,7 @@
       <el-form-item label="鐪熷疄濮撳悕锛�" prop="realName" required>
         <el-input v-model="form.realName"></el-input>
       </el-form-item>
-      <el-form-item label="鎵嬫満锛�" prop="phone" required>
+      <el-form-item label="鎵嬫満鍙风爜锛�" prop="phone" required>
         <el-input v-model="form.phone"></el-input>
       </el-form-item>
       <el-form-item label="鐧诲綍璐﹀彿锛�" prop="userName" required>
diff --git a/src/views/user/teacher/edit.vue b/src/views/user/teacher/edit.vue
new file mode 100644
index 0000000..e9c9774
--- /dev/null
+++ b/src/views/user/teacher/edit.vue
@@ -0,0 +1,166 @@
+<template>
+  <div class="app-container">
+
+    <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
+      <el-form-item label="鐪熷疄濮撳悕锛�" prop="realName" required>
+        <el-input v-model="form.realName"></el-input>
+      </el-form-item>
+      <el-form-item label="鎵嬫満鍙风爜锛�" prop="phone" required>
+        <el-input v-model="form.phone"></el-input>
+      </el-form-item>
+      <el-form-item label="鐧诲綍璐﹀彿锛�" prop="userName" required>
+        <el-input v-model="form.userName"></el-input>
+      </el-form-item>
+      <el-form-item label="鐧诲綍瀵嗙爜锛�" prop="password" required>
+        <el-input v-model="form.password" show-password></el-input>
+      </el-form-item>
+      <el-form-item label="骞撮緞锛�">
+        <el-input v-model="form.age"></el-input>
+      </el-form-item>
+      <el-form-item label="鎬у埆锛�">
+        <el-select v-model="form.sex" placeholder="鎬у埆" clearable>
+          <el-option v-for="item in sexEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鍑虹敓鏃ユ湡锛�">
+        <el-date-picker v-model="form.birthDay" value-format="yyyy-MM-dd" type="date" placeholder="閫夋嫨鏃ユ湡"/>
+      </el-form-item>
+      <el-form-item label="鐘舵�侊細" required>
+        <el-select v-model="form.status" placeholder="鐘舵��">
+          <el-option v-for="item in statusEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
+        <el-button @click="resetForm">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { mapGetters, mapState, mapActions } from 'vuex'
+import userApi from '@/api/user'
+
+export default {
+  data () {
+    var validatePassword = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error('璇疯緭鍏ュ瘑鐮�'))
+      } else if (!/[A-Z]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓ぇ鍐欏瓧姣�'))
+      } else if (!/[a-z]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓皬鍐欏瓧姣�'))
+      } else if (!/[0-9]/.test(value)) {
+        callback(new Error('瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓暟瀛�'))
+      } else {
+        callback()
+      }
+    }
+    var validatePhone = (rule, value, callback) => {
+      // 鎵嬫満鍙烽獙璇侀�昏緫
+      const phoneRegex = /^1[3-9]\d{9}$/;
+      if (!value) {
+        callback(new Error('璇疯緭鍏ユ墜鏈哄彿'));
+      } else if (!phoneRegex.test(value)) {
+        callback(new Error('鎵嬫満鍙锋牸寮忎笉姝g‘'));
+      } else {
+        callback();
+      }
+    }
+    return {
+      form: {
+        id: null,
+        userName: '',
+        password: '',
+        realName: '',
+        role: 2,
+        status: 1,
+        age: '',
+        sex: '',
+        birthDay: null,
+        phone: null
+      },
+      formLoading: false,
+      rules: {
+        userName: [
+          { required: true, message: '璇疯緭鍏ョ敤鎴峰悕', trigger: 'blur' }
+        ],
+        realName: [
+          { required: true, message: '璇疯緭鍏ョ湡瀹炲鍚�', trigger: 'blur' }
+        ],
+        password: [
+          { validator: validatePassword, trigger: 'blur' }
+        ],
+        phone: [
+          { validator: validatePhone, trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  created () {
+    let id = this.$route.query.id
+    let _this = this
+    if (id && parseInt(id) !== 0) {
+      _this.formLoading = true
+      userApi.selectUser(id).then(re => {
+        _this.form = re.data
+        _this.formLoading = false
+      })
+    }
+  },
+  methods: {
+    submitForm () {
+      let _this = this
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.formLoading = true
+          userApi.createUser(this.form).then(data => {
+            if (data.code === 1) {
+              _this.$message.success(data.message)
+              _this.delCurrentView(_this).then(() => {
+                _this.$router.push('/user/teacher/list')
+              })
+            } else {
+              _this.$message.error(data.message)
+              _this.formLoading = false
+            }
+          }).catch(e => {
+            _this.formLoading = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    resetForm () {
+      let lastId = this.form.id
+      this.$refs['form'].resetFields()
+      this.form = {
+        id: null,
+        userName: '',
+        password: '',
+        realName: '',
+        role: 2,
+        status: 1,
+        age: '',
+        sex: '',
+        birthDay: null,
+        phone: null
+      }
+      this.form.id = lastId
+    },
+    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
+  },
+  computed: {
+    ...mapGetters('enumItem', [
+      'enumFormat'
+    ]),
+    ...mapState('enumItem', {
+      sexEnum: state => state.user.sexEnum,
+      roleEnum: state => state.user.roleEnum,
+      statusEnum: state => state.user.statusEnum
+    })
+  }
+}
+</script>
diff --git a/src/views/user/teacher/list.vue b/src/views/user/teacher/list.vue
new file mode 100644
index 0000000..b858e87
--- /dev/null
+++ b/src/views/user/teacher/list.vue
@@ -0,0 +1,131 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParam" ref="queryForm" :inline="true">
+      <el-form-item label="鐢ㄦ埛鍚嶏細">
+        <el-input v-model="queryParam.userName"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="submitForm">鏌ヨ</el-button>
+        <router-link :to="{path:'/user/teacher/edit'}" class="link-left">
+          <el-button type="primary">娣诲姞</el-button>
+        </router-link>
+      </el-form-item>
+    </el-form>
+
+    <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
+      <el-table-column prop="id" label="Id" />
+      <el-table-column prop="userName" label="鐢ㄦ埛鍚�"/>
+      <el-table-column prop="realName" label="鐪熷疄濮撳悕" />
+      <el-table-column prop="sex" label="鎬у埆" width="60px;" :formatter="sexFormatter"/>
+      <el-table-column prop="phone" label="鎵嬫満鍙�"/>
+      <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="160px"/>
+      <el-table-column label="鐘舵��" prop="status" width="70px">
+        <template slot-scope="{row}">
+          <el-tag :type="statusTagFormatter(row.status)">
+            {{ statusFormatter(row.status) }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column width="220px" label="鎿嶄綔" align="center">
+        <template slot-scope="{row}">
+          <el-button size="mini"   @click="changeStatus(row)" class="link-left">
+            {{ statusBtnFormatter(row.status) }}
+          </el-button>
+          <router-link :to="{path:'/user/teacher/edit', query:{id:row.id}}" class="link-left">
+            <el-button size="mini">缂栬緫</el-button>
+          </router-link>
+          <el-button size="mini" type="danger"  @click="deleteUser(row)" class="link-left">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
+                @pagination="search"/>
+  </div>
+</template>
+
+<script>
+import { mapGetters, mapState } from 'vuex'
+import Pagination from '@/components/Pagination'
+import userApi from '@/api/user'
+
+export default {
+  components: { Pagination },
+  data () {
+    return {
+      queryParam: {
+        userName: '',
+        role: 2,
+        pageIndex: 1,
+        pageSize: 10
+      },
+      listLoading: true,
+      tableData: [],
+      total: 0
+    }
+  },
+  created () {
+    this.search()
+  },
+  methods: {
+    search () {
+      this.listLoading = true
+      userApi.getUserPageList(this.queryParam).then(data => {
+        const re = data.data
+        this.tableData = re.list
+        this.total = re.total
+        this.queryParam.pageIndex = re.pageNum
+        this.listLoading = false
+      })
+    },
+    changeStatus (row) {
+      let _this = this
+      userApi.changeStatus(row.id).then(re => {
+        if (re.code === 1) {
+          row.status = re.data
+          _this.$message.success(re.message)
+        } else {
+          _this.$message.error(re.message)
+        }
+      })
+    },
+    deleteUser (row) {
+      let _this = this
+      userApi.deleteUser(row.id).then(re => {
+        if (re.code === 1) {
+          _this.search()
+          _this.$message.success(re.message)
+        } else {
+          _this.$message.error(re.message)
+        }
+      })
+    },
+    submitForm () {
+      this.queryParam.pageIndex = 1
+      this.search()
+    },
+    sexFormatter  (row, column, cellValue, index) {
+      return this.enumFormat(this.sexEnum, cellValue)
+    },
+    statusFormatter (status) {
+      return this.enumFormat(this.statusEnum, status)
+    },
+    statusTagFormatter (status) {
+      return this.enumFormat(this.statusTag, status)
+    },
+    statusBtnFormatter (status) {
+      return this.enumFormat(this.statusBtn, status)
+    }
+  },
+  computed: {
+    ...mapGetters('enumItem', [
+      'enumFormat'
+    ]),
+    ...mapState('enumItem', {
+      sexEnum: state => state.user.sexEnum,
+      statusEnum: state => state.user.statusEnum,
+      statusTag: state => state.user.statusTag,
+      statusBtn: state => state.user.statusBtn
+    })
+  }
+}
+</script>

--
Gitblit v1.8.0