From 51253b8fff80924124a2119f62449b0fe3d67ff3 Mon Sep 17 00:00:00 2001 From: 龚焕茏 <2842157468@qq.com> Date: 星期一, 06 五月 2024 18:04:48 +0800 Subject: [PATCH] 新增标签菜单添加、查询、删除、修改,学生绑定、展示、修改 --- src/api/user.js | 9 + src/views/user/student/list.vue | 26 ++++ src/views/user/tag/list.vue | 166 +++++++++++++++++++++++++++ src/router.js | 13 ++ src/views/user/student/edit.vue | 28 ++++ src/views/user/tag/edit.vue | 92 +++++++++++++++ 6 files changed, 328 insertions(+), 6 deletions(-) diff --git a/src/api/user.js b/src/api/user.js index 03a9197..aeb2081 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,14 +1,21 @@ -import { post } from '@/utils/request' +import { get,post } from '@/utils/request' export default { getUserPageList: query => post('/api/admin/user/page/list', query), getUserEventPageList: query => post('/api/admin/user/event/page/list', query), + getTagList: query => post('/api/admin/tag/page/list', query), + tagList: query => get('/api/admin/tag/list', query), createUser: query => post('/api/admin/user/edit', query), + createTag: query => post('/api/admin/tag/edit', query), selectUser: id => post('/api/admin/user/select/' + id), + selectTag: id => post('/api/admin/tag/select/' + id), + selectCount: id => post('/api/admin/tag/selectCount/' + id), getCurrentUser: () => post('/api/admin/user/current'), updateUser: query => post('/api/admin/user/update', query), + updateTag: query => post('/api/admin/tag/update', query), changeStatus: id => post('/api/admin/user/changeStatus/' + id), deleteUser: id => post('/api/admin/user/delete/' + id), + deleteTag: id => post('/api/admin/tag/delete/' + id), selectByUserName: query => post('/api/admin/user/selectByUserName', query), addMeetin:query => post('/api/admin/video/add', query), delMeetin:query => post('/api/admin/video/clear', query) diff --git a/src/router.js b/src/router.js index a4c18b1..cf03701 100644 --- a/src/router.js +++ b/src/router.js @@ -70,6 +70,19 @@ name: 'UserAdminEdit', meta: { title: '绠$悊鍛樼紪杈�', noCache: true, activeMenu: '/user/admin/list' }, hidden: true + }, + { + path: 'tag/list', + component: () => import('@/views/user/tag/list'), + name: 'TagAdminPageList', + meta: { title: '鏍囩鍒楄〃', noCache: true } + }, + { + path: 'tag/edit', + component: () => import('@/views/user/tag/edit'), + name: 'TagAdminEdit', + meta: { title: '鏍囩缂栬緫', noCache: true, activeMenu: '/user/tag/list' }, + hidden: true } ] }, diff --git a/src/views/user/student/edit.vue b/src/views/user/student/edit.vue index f1b4acb..428e7ab 100644 --- a/src/views/user/student/edit.vue +++ b/src/views/user/student/edit.vue @@ -19,8 +19,8 @@ <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" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" /> + <el-form-item label="鍑虹敓鏃ユ湡锛�" prop="birthDay"> + <el-date-picker v-model="form.birthDay" required type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" /> </el-form-item> <el-form-item label="鎵嬫満锛�"> <el-input v-model="form.phone"></el-input> @@ -28,6 +28,11 @@ <el-form-item label="閮ㄩ棬锛�" prop="deptIds" required> <el-select v-model="form.deptIds" multiple collapse-tags placeholder="閮ㄩ棬"> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> + </el-select> + </el-form-item> + <el-form-item label="鏍囩锛�" prop="tagIds"> + <el-select v-model="form.tagIds" multiple collapse-tags placeholder="鏍囩"> + <el-option v-for="item in tags" :key="item.id" :value="item.id" :label="item.name"></el-option> </el-select> </el-form-item> <el-form-item label="鐘舵�侊細" required> @@ -50,6 +55,7 @@ export default { data () { return { + tags: [], value2:[], form: { id: null, @@ -62,7 +68,8 @@ sex: '', birthDay: null, phone: null, - deptIds: [] + deptIds: [], + tagIds: [] }, formLoading: false, rules: { @@ -74,11 +81,16 @@ ], deptIds: [ { required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change' } + ], + birthDay: [ + { required: true, message: '璇烽�夋嫨鍑虹敓鏃ユ湡', trigger: 'blur' } ] } } }, created () { + this.getTags(); + console.log(this.levelEnum) let id = this.$route.query.id let _this = this @@ -102,12 +114,19 @@ } }, methods: { + getTags () { + userApi.tagList(null).then(data => { + this.tags = data.response + }) + }, submitForm () { + console.log("this.form", this.form) let _this = this this.form.deptIds = this.form.deptIds.join(',') this.$refs.form.validate((valid) => { if (valid) { this.formLoading = true + console.log("this.form", this.form) userApi.createUser(this.form).then(data => { if (data.code === 1) { _this.$message.success(data.message) @@ -140,7 +159,8 @@ sex: '', birthDay: null, phone: null, - deptIds: [] + deptIds: [], + tagIds: [] } this.form.id = lastId }, diff --git a/src/views/user/student/list.vue b/src/views/user/student/list.vue index d8272e9..ba9feba 100644 --- a/src/views/user/student/list.vue +++ b/src/views/user/student/list.vue @@ -30,6 +30,11 @@ <el-table-column prop="userName" label="鐢ㄦ埛鍚�"/> <el-table-column prop="realName" label="鐪熷疄濮撳悕" /> <el-table-column prop="deptNames" label="閮ㄩ棬" /> + <el-table-column label="鏍囩" prop="tagNames"> + <template slot-scope="{row}"> + <el-tag style="margin-right: 5px;" v-for="(item,index) in row.tagNames" :key="index">{{ item }}</el-tag> + </template> + </el-table-column> <el-table-column prop="sex" label="鎬у埆" width="60px;" :formatter="sexFormatter"/> <el-table-column prop="phone" label="鎵嬫満鍙�"/> <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="160px"/> @@ -40,7 +45,7 @@ </el-tag> </template> </el-table-column> - <el-table-column width="270px" label="鎿嶄綔" align="center"> + <el-table-column width="340px" label="鎿嶄綔" align="center"> <template slot-scope="{row}"> <el-button size="mini" @click="changeStatus(row)" class="link-left"> {{ statusBtnFormatter(row.status) }} @@ -51,12 +56,23 @@ <router-link :to="{path:'/log/user/list', query:{userId:row.id}}" class="link-left"> <el-button size="mini" >鏃ュ織</el-button> </router-link> + <el-button size="mini" @click="status(row.id)" class="link-left">鐘舵��</el-button> <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"/> + + + + <el-dialog :visible.sync="statusVisible" append-to-body :close-on-click-modal="false" style="width: 100%;height: 100%" :show-close="false" center> + 111 + <span slot="footer" class="dialog-footer"> + <el-button type="primary" @click="statusConfirm">纭� 瀹�</el-button> + <el-button @click="statusVisible = false">鍙� 娑�</el-button> + </span> + </el-dialog> </div> </template> @@ -69,6 +85,8 @@ components: { Pagination }, data () { return { + form: {}, + statusVisible: false, upLoadUrl:'/api/admin/user/import', fileList:[], queryParam: { @@ -86,6 +104,12 @@ this.search() }, methods: { + status(id) { + this.statusVisible = true; + }, + statusConfirm() { + this.form; + }, handlePreview(e){ console.log(e) if (e.code==1){ diff --git a/src/views/user/tag/edit.vue b/src/views/user/tag/edit.vue new file mode 100644 index 0000000..7ff9f50 --- /dev/null +++ b/src/views/user/tag/edit.vue @@ -0,0 +1,92 @@ +<template> + <div class="app-container"> + + <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules"> + <el-form-item label="鏍囩鍚嶏細" prop="name" required> + <el-input v-model="form.name"></el-input> + </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 () { + return { + form: { + id: null, + name: '' + }, + formLoading: false, + rules: { + name: [ + { required: true, message: '璇疯緭鍏ユ爣绛惧悕', trigger: 'blur' } + ] + } + } + }, + created () { + let id = this.$route.query.id + let _this = this + if (id && parseInt(id) !== 0) { + _this.formLoading = true + userApi.selectTag(id).then(re => { + _this.form = re.response + _this.formLoading = false + }) + } + }, + methods: { + submitForm () { + let _this = this + this.$refs.form.validate((valid) => { + if (valid) { + this.formLoading = true + userApi.createTag(this.form).then(data => { + if (data.code === 1) { + _this.$message.success(data.message) + _this.delCurrentView(_this).then(() => { + _this.$router.push('/user/tag/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, + name: '' + } + 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/tag/list.vue b/src/views/user/tag/list.vue new file mode 100644 index 0000000..1968043 --- /dev/null +++ b/src/views/user/tag/list.vue @@ -0,0 +1,166 @@ +<template> + <div class="app-container"> + <el-form :model="queryParam" ref="queryForm" :inline="true"> + <el-form-item label="鏍囩鍚嶏細"> + <el-input v-model="queryParam.name"></el-input> + </el-form-item> + <el-form-item> + <div style="display: flex"> + <el-button type="primary" @click="submitForm">鏌ヨ</el-button> + <router-link :to="{ path: '/user/tag/edit' }" class="link-left"> + <el-button type="primary">娣诲姞</el-button> + </router-link> + </div> + </el-form-item> + </el-form> + + <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%"> + <el-table-column prop="name" label="鏍囩鍚�" /> + <el-table-column width="270px" label="鎿嶄綔" align="center"> + <template slot-scope="{row}"> + <router-link :to="{ path: '/user/tag/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 { + upLoadUrl: '/api/admin/user/import', + fileList: [], + queryParam: { + name: '', + role: 1, + pageIndex: 1, + pageSize: 10 + }, + listLoading: true, + tableData: [], + total: 0 + } + }, + created() { + this.search() + }, + methods: { + handlePreview(e) { + console.log(e) + if (e.code == 1) { + this.search() + this.$message.success(e.message) + } else { + this.$message.error(e.message) + } + }, + beforeAvatarUpload(file) { + let legalName = ['xlsx', 'xls'] + // 鎷垮埌鍚庣紑鍚� + let name = file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length) + if (legalName.includes(name)) { + // console.log(legalName.includes(name)); + } else { + this.$message.warning('鏂囦欢鏍煎紡涓嶅锛屼粎闄恱ls鍜寈lsx') + return false + } + // console.log(file) + // const isJPG = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + // // const isLt2M = file.size / 1024 / 1024 < 2; + // + // if (!isJPG) { + // this.$message.error('涓婁紶鏂囦欢鍙兘鏄疎xcel!'); + // } + // // if (!isLt2M) { + // // this.$message.error('涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 2MB!'); + // // } + // return isJPG ; + }, + search() { + this.listLoading = true + userApi.getTagList(this.queryParam).then(data => { + const re = data.response + 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.response + _this.$message.success(re.message) + } else { + _this.$message.error(re.message) + } + }) + }, + deleteUser(row) { + userApi.selectCount(row.id).then(re => { + if (re.response.length > 0) { + this.$message.warning(re.response.length + '浣嶇敤鎴锋鍦ㄤ娇鐢ㄨ鏍囩锛屾棤娉曞垹闄�') + } else { + let _this = this + userApi.deleteTag(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() + }, + levelFormatter(row, column, cellValue, index) { + return this.enumFormat(this.levelEnum, cellValue) + }, + 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, + levelEnum: state => state.user.levelEnum + }) + } +} +</script> +<style lang="scss" scoped> +.upload-demo { + margin-left: 5px; +} +</style> -- Gitblit v1.8.0