From bc35d48bada733a0a4677cce54f3aa5ce3080be6 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期四, 20 六月 2024 17:33:35 +0800 Subject: [PATCH] 提交 --- src/api/onlineEducation/company.js | 5 src/components/scrollSelect/index.vue | 102 ++++++ src/views/onlineEducation/systemManage/banner/index.vue | 136 ++++++++ src/layout/components/Sidebar/menu.js | 62 +++ src/views/homePage.vue | 11 src/store/modules/user.js | 8 src/api/onlineEducation/user.js | 24 + src/utils/directive.ts | 26 + src/views/onlineEducation/systemManage/user/index.vue | 9 src/api/onlineEducation/banner.js | 54 +++ src/views/onlineEducation/systemManage/banner/components/bannerDialog.vue | 238 ++++++++++++++ src/router/index.js | 2 src/utils/selectLoadMoreDirective.ts | 2 .env.development | 2 src/views/onlineEducation/systemManage/user/components/userDialog.vue | 224 +++++++++---- 15 files changed, 789 insertions(+), 116 deletions(-) diff --git a/.env.development b/.env.development index a9649dd..93ecf68 100644 --- a/.env.development +++ b/.env.development @@ -9,7 +9,7 @@ #VITE_APP_BASE_API = 'http://192.168.0.47:8085' #孔哥 -VITE_APP_BASE_API = 'http://192.168.0.77:8082/api' +VITE_APP_BASE_API = 'http://192.168.2.15:8082/api' #线上 #VITE_APP_BASE_API = 'http://106.15.95.149:8088/api' diff --git a/src/api/onlineEducation/banner.js b/src/api/onlineEducation/banner.js new file mode 100644 index 0000000..2d78f45 --- /dev/null +++ b/src/api/onlineEducation/banner.js @@ -0,0 +1,54 @@ +import request from '@/utils/request' + + +export function delPic(path) { + return request({ + url: '/system/common/removeFile', + method: 'delete', + params: path, + timeout: 20000 + }) +} + + + +export function getBanner(params) { + return request({ + url: '/system/carousel/list', + method: 'get', + params: params + }) +} + +export function addBanner(data) { + return request({ + url: '/system/carousel', + method: 'post', + data: data + }) +} + +export function editBanner(params) { + return request({ + url: `/system/carousel`, + method: 'put', + data: params + }) +} + +export function delBanner(data) { + return request({ + url: `/system/carousel/` + data, + method: 'delete' + }) +} + +export function getBannerById(params) { + return request({ + url: '/system/carousel/' +params , + method: 'get', + params: params + }) +} + + diff --git a/src/api/onlineEducation/company.js b/src/api/onlineEducation/company.js index e29c7b6..d4828a4 100644 --- a/src/api/onlineEducation/company.js +++ b/src/api/onlineEducation/company.js @@ -1,9 +1,10 @@ import request from '@/utils/request' -export function getCompany() { +export function getCompany(params) { return request({ url: '/system/company/list', - method: 'get' + method: 'get', + params: params }) } diff --git a/src/api/onlineEducation/user.js b/src/api/onlineEducation/user.js index 231619f..25bacd6 100644 --- a/src/api/onlineEducation/user.js +++ b/src/api/onlineEducation/user.js @@ -1,9 +1,10 @@ import request from '@/utils/request' -export function getUser() { +export function getUser(param) { return request({ url: '/system/user/list', - method: 'get' + method: 'get', + params: param }) } @@ -22,18 +23,25 @@ data: data }) } - -export function editCompany(params) { +export function editUser(params) { return request({ - url: `/system/company`, + url: `system/user`, method: 'put', data: params }) } -export function delCompany(data) { +export function resetPwd(params) { return request({ - url: `system/company/` + data, - method: 'delete' + url: `/system/user/resetPwd`, + method: 'put', + data: params + }) +} + +export function delUser(userId) { + return request({ + url: '/system/user/' + userId, + method: 'put' }) } diff --git a/src/components/scrollSelect/index.vue b/src/components/scrollSelect/index.vue new file mode 100644 index 0000000..2be32c7 --- /dev/null +++ b/src/components/scrollSelect/index.vue @@ -0,0 +1,102 @@ +<template> + <el-select v-if="isMounted" v-bind="$attrs" :remote-method="remoteMethod" @change="selectValueUser"> + <div v-infinite-scroll="loadMore" style="overflow: hidden"> + <el-option v-for="dict in list" :key="dict.id" :label="dict.name" :value="dict.name" /> + </div> + </el-select> +</template> + +<script lang="ts" setup> +import {defineEmits, onMounted, ref} from 'vue' +import {debounce} from "@/utils"; + + +const props = defineProps({ + // 传入对应的列表加载api + methods: { + type: Function, + default: '' + }, + // 传入查询关键字 + searchKey: { + type: String, + default: '' + }, +}) + +const list = ref([ + { + id: '', + name: '无上级账号' + } +]) +const queryFrom = ref({ + pageNum: 1, + totlePage: 1, + pageSize: 10, + userType: null, + companyId: null +}) + +const isMounted = ref(false) +onMounted(() => { + isMounted.value = true +}) + +const emit = defineEmits(["getval"]); +const selectValueUser = (val) => { + list.value.forEach(item => { + if(item.name === val){ + emit('getval',item.id) + } + }) +} +// 自定义远程搜索方法 +const remoteMethod = (query: string) => { + queryFrom.value.pageNum = 1 + list.value = [] + queryFrom.value[props.searchKey] = query + getList(param.value,'') +} + +// 调用props.methods获取下拉数据 +const param = ref(); +const getList = (val,type) => { + if(val){ + param.value = val; + queryFrom.value.userType = val.userType; + queryFrom.value.companyId = val.companyId; + props.methods(queryFrom.value).then(res => { + const obj = { + id: '', + name: '无上级账号' + } + if(type === 'change'){ + list.value = res.data.list + list.value.unshift(obj) + }else { + list.value = [...list.value, ...res.data.list] + if(queryFrom.value.pageNum === 1){ + list.value.unshift(obj) + } + + } + queryFrom.value.totlePage = res.data.totalPage + }) + } +} + +// 获取初始数据 +// getList(param.value,'') + +// 无限滚动触底加载 +const loadMore = debounce(() => { + if (queryFrom.value.pageNum >= queryFrom.value.totlePage) return + queryFrom.value.pageNum++ + getList(param.value,'') +}, 200) + +defineExpose({ + getList +}); +</script> diff --git a/src/layout/components/Sidebar/menu.js b/src/layout/components/Sidebar/menu.js index a2b73d0..c319557 100644 --- a/src/layout/components/Sidebar/menu.js +++ b/src/layout/components/Sidebar/menu.js @@ -64,27 +64,61 @@ ] }, ], - agencyMenu: [ + companyMenu: [ { - path: '/project', - name: 'Project', - meta: { title: '项目管理',icon: 'form',affix: true } + path: '/course', + name: 'Course', + meta: { title: '课程管理',icon: 'documentation',affix: true } }, { - path: '/projectSupplement', - name: 'projectSupplement', - meta: { title: '项目补录',icon: 'form',affix: true } + path: '/question', + name: 'Question', + meta: { title: '题库管理',icon: 'build',affix: true } }, - { - path: '/userManage', - redirect: '/userManage/supervise', - meta: { title: '用户管理',icon: 'peoples'}, + path: '/class', + name: 'Class', + meta: { title: '课时批次',icon: 'education',affix: true } + }, + { + path: '/group', + name: 'Group', + meta: { title: '组卷考试分配',icon: 'job',affix: true } + }, + { + path: '/offline', + name: 'Offline', + meta: { title: '线下教育登记',icon: 'log',affix: true } + }, + { + path: '/people', + name: 'People', + meta: { title: '人员管理',icon: 'peoples',affix: true } + }, + { + path: '/count', + name: 'Count', + meta: { title: '数据统计',icon: 'server',affix: true } + }, + { + path: '/systemManage', + redirect: '/systemManage/courseClassification', + meta: { title: '系统管理',icon: 'dict'}, children: [ { - path: 'expertUsers', - name: 'expertUsers', - meta: { title: '专家用户管理',icon: 'logininfor'} + path: 'courseClassification', + name: 'courseClassification', + meta: { title: '课程分类',icon: 'form'} + } , + { + path: 'user', + name: 'user', + meta: { title: '用户管理',icon: 'logininfor'} + } , + { + path: 'banner', + name: 'banner', + meta: { title: '轮播图管理',icon: 'druid'} } , ] }, diff --git a/src/router/index.js b/src/router/index.js index 14ddf33..575203d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -44,7 +44,7 @@ }, { path: "/:pathMatch(.*)*", - component: () => import('@/views/error/404'), + component: () => import('@/views/homePage'), hidden: true }, { diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 3421f46..9276e82 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -2,7 +2,7 @@ import { getToken, setToken, removeToken } from '@/utils/auth' import defAva from '@/assets/images/profile.jpg' import Cookies from "js-cookie"; -import {getUserById} from "@/api/sysUsers"; +import {getUserById} from "@/api/onlineEducation/user"; const useUserStore = defineStore( 'user', { @@ -25,7 +25,11 @@ return new Promise( (resolve, reject) => { login(username, password, code, uuid, identity).then( async res => { setToken(res.data.token) - Cookies.set('userInfo',JSON.stringify(res.data)) + if(res.data && res.data.id){ + const info = await getUserById(res.data.id); + if(info.data.code === 200){} + Cookies.set('userInfo',JSON.stringify(info.data)) + } this.token = res.data.token resolve() }).catch(error => { diff --git a/src/utils/directive.ts b/src/utils/directive.ts new file mode 100644 index 0000000..c3ceb1a --- /dev/null +++ b/src/utils/directive.ts @@ -0,0 +1,26 @@ +import { Directive, DirectiveBinding } from 'vue' + +const loadMore: Directive = { + beforeMount(el: any, binding: DirectiveBinding) { + let arg = binding.arg as any + if (!arg) return + const selectDom = document.querySelector(`.${arg.name} .el-select-dropdown .el-select-dropdown__wrap`) + function loadMores(this: any) { + const isBase = this.scrollHeight - this.scrollTop <= this.clientHeight + if (isBase) { + binding.value && binding.value(arg) + } + } + el.selectDomInfo = selectDom + el.userLoadMore = loadMores + selectDom?.addEventListener('scroll', loadMores) + }, + beforeUnmount(el: any) { + if (el.userLoadMore) { + el.selectDomInfo.removeEventListener('scroll', el.userLoadMore) + delete el.selectDomInfo + delete el.userLoadMore + } + } +} +export default loadMore diff --git a/src/utils/selectLoadMoreDirective.ts b/src/utils/selectLoadMoreDirective.ts index dd52340..1fd8295 100644 --- a/src/utils/selectLoadMoreDirective.ts +++ b/src/utils/selectLoadMoreDirective.ts @@ -1,7 +1,7 @@ import {Directive, DirectiveBinding, nextTick} from 'vue' const loadMore: Directive = { beforeMount(el: any, binding: DirectiveBinding) { - console.log(el) + console.log('111',el) const selectDom = (document.querySelector(".more_select_dropdown") as any).querySelector(".el-select-dropdown .el-select-dropdown__wrap"); console.log(selectDom, 'selectDom++++++++++++++'); function loadMores(this: any) { diff --git a/src/views/homePage.vue b/src/views/homePage.vue index 49cec3e..1128c01 100644 --- a/src/views/homePage.vue +++ b/src/views/homePage.vue @@ -168,9 +168,14 @@ // sidebarRouters.value = menu.agencyMenu // Cookies.set('routers',JSON.stringify(sidebarRouters.value)) // } - - sidebarRouters.value = menu.adminMenu - Cookies.set('routers',JSON.stringify(sidebarRouters.value)) + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.userType === 0) { + sidebarRouters.value = menu.adminMenu + Cookies.set('routers',JSON.stringify(sidebarRouters.value)) + }else { + sidebarRouters.value = menu.companyMenu + Cookies.set('routers',JSON.stringify(sidebarRouters.value)) + } let path = "" if(sidebarRouters.value[0].children && sidebarRouters.value[0].children.length > 0){ path = sidebarRouters.value[0].path + '/'+ sidebarRouters.value[0].children[0].path diff --git a/src/views/onlineEducation/systemManage/banner/components/bannerDialog.vue b/src/views/onlineEducation/systemManage/banner/components/bannerDialog.vue new file mode 100644 index 0000000..7603368 --- /dev/null +++ b/src/views/onlineEducation/systemManage/banner/components/bannerDialog.vue @@ -0,0 +1,238 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="title" + width="550px" + :before-close="handleClose" + > + <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="100px" > + <el-form-item label="标题:" prop="title" > + <el-input v-model.trim="state.form.title"></el-input> + </el-form-item> + <el-form-item prop="imgUrl" label="图片:"> + <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.imgLimit' v-model:file-list="state.imgList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证书')" > + <el-icon><Plus /></el-icon> + <template #tip> + <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div> + </template> + </el-upload> + </el-form-item> + <el-form-item label="地址:" prop="webUrl"> + <el-input v-model.trim="state.form.webUrl"></el-input> + </el-form-item> + <el-form-item label="跳转方式:" prop="carouselTarget" > + <el-radio-group v-model="state.form.carouselTarget" > + <el-radio :label="0">新窗口打开</el-radio> + <el-radio :label="1">内部打开</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="排序:" prop="sort" > + <el-input-number v-model="state.form.sort" /> + </el-form-item> + <el-form-item label="状态" prop="status" > + <el-switch + v-model="state.form.status" + class="ml-2" + /> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs} from 'vue' +import Editor from "@/components/Editor/index.vue"; +import {ElMessage} from "element-plus"; +import {addNotice} from "@/api/backManage/notice"; +import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate"; +import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company"; +import {verifyPhone} from "@/utils/validate"; +import {addBanner, delPic, editBanner, getBannerById} from "@/api/onlineEducation/banner"; +import {getToken} from "@/utils/auth"; +import {getUserById} from "@/api/onlineEducation/user"; + +const dialogVisible = ref(false); +const title = ref(""); +const busRef = ref(); +const length = ref() +const emit = defineEmits(["getList"]); +const startUsername = ref(''); +const startPhone = ref(''); +const state = reactive({ + form: { + id: '', + title: '', + imgUrl: '', + webUrl: '', + carouselTarget: 0, + sort: 0, + status: true, + }, + formRules:{ + title: [{ required: true, message: '请输入广告标题', trigger: 'blur' }], + imgUrl: [{ required: true, message: '请上传图片', trigger: 'blur' }], + webUrl: [{ required: true, message: '请输入地址', trigger: 'blur' }], + }, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization:getToken() + }, + imgLimit: 1, + imgList: [] +}) + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + state.form.imgUrl = res.data.path + }else{ + state.imgList = [] + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + return false + } +}; +const handleRemove = async (file, uploadFiles) => { + let path = state.form.imgUrl; + await delPic({path: path}).then(res => { + if(res.code == 200){ + // ElMessage({ + // type: 'success', + // message: '文件已删除' + // }) + state.form.imgUrl = '' + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + }).catch(() => { + state.form.imgUrl = '' + }); +} + +const openDialog = async (type, value) => { + length.value = value.listLength + title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '' ; + if(type === 'edit') { + const res = await getBannerById(value.id); + if(res.code === 200){ + state.form = res.data + console.log("11",res.data) + state.form.carouselTarget = parseInt(res.data.carouselTarget) + state.form.status = res.data.status == 0 + if(res.data.imgUrl) { + const obj = { + url: import.meta.env.VITE_APP_BASE_API + "/" + res.data.imgUrl, + name: '' + } + state.imgList = [obj] + } + console.log('imgList',state.imgList) + }else{ + ElMessage.warning(res.message) + } + + } + dialogVisible.value = true; +} + +const onSubmit = async () => { + const valid = await busRef.value.validate(); + if(valid){ + if(title.value === '新增'){ + const {id, ...data} = JSON.parse(JSON.stringify(state.form)) + data.status = data.status ? 0 : 1 + const res = await addBanner(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '新增成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + }else if(title.value === '编辑'){ + const {...data} = JSON.parse(JSON.stringify(state.form)) + data.status = data.status ? 0 : 1 + const res = await editBanner(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '编辑成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + } + } +} + +const handleClose = () => { + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + emit("getList") + +} +const reset = () => { + state.form = { + id: '', + title: '', + imgUrl: '', + webUrl: '', + carouselTarget: 0, + sort: 0, + status: true, + } + state.imgList = [] +} +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } + .file { + display: flex; + flex-direction: column; + align-items: flex-start; + } +} +</style> diff --git a/src/views/onlineEducation/systemManage/banner/index.vue b/src/views/onlineEducation/systemManage/banner/index.vue index 34c2a8b..bd41546 100644 --- a/src/views/onlineEducation/systemManage/banner/index.vue +++ b/src/views/onlineEducation/systemManage/banner/index.vue @@ -1,12 +1,134 @@ <template> -<div>轮播图管理</div> + <div class="app-container"> + <div style="margin-bottom: 10px"> + <el-button + type="primary" + plain + icon="Plus" + @click="openDialog('add',{})" + >新增</el-button> + </div> + <!-- 表格数据 --> + <el-table v-loading="loading" :data="dataList" :border="true"> + <el-table-column label="序号" type="index" align="center" width="80" /> + <el-table-column label="标题" prop="title" align="center" /> + <el-table-column label="图片" prop="imgUrl" align="center" > + <template #default="scope"> + <div class="demo-image__preview" v-if="scope.row.imgUrl && scope.row.imgUrl.length>0"> + <el-image + style="width: 100px; height: 100px" + :src= "scope.row.imgUrl[0]" + :zoom-rate="1.2" + :max-scale="7" + :min-scale="0.2" + :preview-src-list="scope.row.imgUrl" + :initial-index="0" + fit="cover" + :preview-teleported=true + /> + </div> + </template> + </el-table-column> + <el-table-column label="地址" prop="webUrl" align="center" /> + <el-table-column label="跳转方式" prop="carouselTarget" align="center" > + <template #default="scope"> + <span>{{scope.row.carouselTarget == 0 ? '新窗口打开' : '内部打开' }}</span> + </template> + </el-table-column> + <el-table-column label="排序" prop="sort" align="center"/> + <el-table-column label="状态" prop="status" align="center" width="150"/> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > + <template #default="scope"> + <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + <banner-dialog ref="dialogRef" @getList=getList></banner-dialog> + </div> </template> + <script setup> +import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; +import {ElMessage, ElMessageBox} from "element-plus"; +import {delCompany, getCompany} from "@/api/onlineEducation/company"; +import bannerDialog from './components/bannerDialog.vue' +import {delBanner, getBanner} from "@/api/onlineEducation/banner"; +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const dialogRef = ref(); +const data = reactive({ + queryParams: { + pageNum: 1, + pageSize: 10, + }, + total: 0, + dataList: [] +}); + +const { queryParams, total, dataList } = toRefs(data); + +onMounted(()=>{ + getList() +}) + +onUnmounted(()=>{ + +}) + +const getList = async () => { + loading.value = true + const res = await getBanner(data.queryParams) + if(res.code == 200){ + data.dataList = res.data.list.map(item => { + return { + ...item, + status: item.status === 0 ? '正常' : '停用', + imgUrl: item.imgUrl ?[import.meta.env.VITE_APP_BASE_API + "/" + item.imgUrl] : [] + } + }) + console.log("ddd",data.dataList) + data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } + loading.value = false +} + +const openDialog = (type, value) => { + dialogRef.value.openDialog(type, value); +} + +/** 重置新增的表单以及其他数据 */ +function reset() { + proxy.resetForm("roleRef"); +} +const handleDelete = (val) => { + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delBanner(val.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) +} </script> - - - -<style scoped lang="scss"> - -</style> diff --git a/src/views/onlineEducation/systemManage/user/components/userDialog.vue b/src/views/onlineEducation/systemManage/user/components/userDialog.vue index 2c8a5a8..71dd1e2 100644 --- a/src/views/onlineEducation/systemManage/user/components/userDialog.vue +++ b/src/views/onlineEducation/systemManage/user/components/userDialog.vue @@ -11,7 +11,13 @@ <el-input v-model.trim="state.form.username" :disabled="state.title =='编辑' || state.title =='查看'" placeholder="请输入用户名" ></el-input> </el-form-item> <el-form-item label="名称:" prop="name" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.name" :disabled="state.title =='编辑' || state.title =='查看'" placeholder="请输入公司、部门或者车间岗位名"></el-input> + <el-input v-model.trim="state.form.name" :disabled="disabled" placeholder="请输入公司、部门或者车间岗位名"></el-input> + </el-form-item> + <el-form-item label="性别:" prop="sex" v-if="state.title !== '修改密码'"> + <el-radio-group v-model="state.form.sex" :disabled="disabled"> + <el-radio :label="0">男</el-radio> + <el-radio :label="1">女</el-radio> + </el-radio-group> </el-form-item> <el-form-item label="密码:" prop="password" v-if="state.title == '新增' || state.title == '修改密码'"> <el-input v-model.trim="state.form.password" type="password" show-password placeholder="请输入密码"></el-input> @@ -23,47 +29,46 @@ <el-input v-model.trim="state.form.phone" :maxlength="11" :disabled="disabled" placeholder="请输入手机号"></el-input> </el-form-item> <el-form-item label="用户类型:" v-if="state.title !== '修改密码'"> - <el-radio-group v-model="state.form.userType" :disabled="disabled"> - <el-radio :label="0">管理员</el-radio> + <el-radio-group v-model="state.form.userType" :disabled="disabled" @change="changeType"> + <el-radio :label="0" v-if="state.isAdmin">管理员</el-radio> <el-radio :label="1">企业级</el-radio> <el-radio :label="2">部门级</el-radio> <el-radio :label="3">车间(岗位)级</el-radio> <el-radio :label="4">其他</el-radio> </el-radio-group> </el-form-item> - <el-form-item label="选择所属父级账号:" prop="companyId" v-if="state.title !== '修改密码'"> - <el-select - v-model="state.form.companyName" - @change="selectValue" - style="width: 45%" - v-loadMore="loadMore" - class="m-2" - placeholder="请选择所属企业" - popper-class="more_select_dropdown" - > - <el-option - v-for="item in state.companyList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> - <el-select - v-if="state.form.userType === 2 || state.form.userType === 3 " - v-model="state.form.userName" - @change="selectValueUser" - style="width: 45%;margin-left: 10px" - class="m-2" - placeholder="请选择所属上级账号" - popper-class="more_select_dropdown" - > - <el-option - v-for="item in state.userList" - :key="item.id" - :label="item.name" - :value="item.name" - /> - </el-select> + <el-form-item label="选择所属父级账号:" prop="companyId" v-if="state.title !== '修改密码' && state.form.userType !== 0"> + <el-select + v-if="state.isAdmin" + v-model="state.form.companyName" + @change="selectValue" + style="width: 45%" + v-loadMore="loadMore" + class="m-2" + placeholder="请选择所属企业" + popper-class="more_select_dropdown" + > + <el-option + v-for="item in state.companyList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> + <el-input v-else disabled style="width: 45%" v-model="state.form.companyName"></el-input> + <scorllSelect + ref="scrollRef" + v-if="UisMounted && (state.form.userType === 2 || state.form.userType === 3)" + v-model="state.form.parentName" + @getval = "getSelectUser" + placeholder="请选择" + clearable + style="width: 45%;margin-left: 10px" + filterable + remote + searchKey="name" + :methods="getUser"> + </scorllSelect> </el-form-item> </el-form> <template #footer v-if="state.title !='查看'"> @@ -76,22 +81,27 @@ </div> </template> <script setup> -import {reactive, ref, toRefs, defineEmits, nextTick} from 'vue' +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' import { View } from "@element-plus/icons-vue"; +import scorllSelect from '@/components/scrollSelect/index.vue' import {ElMessage} from "element-plus"; import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate"; import { checkUserName, checkPhone } from "@/api/login" -import {getUserById} from "@/api/onlineEducation/user" +import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" import {Base64} from "js-base64" import {resetUserPwd} from "../../../../../api/sysUsers"; import {getInstitutionDetail} from "@/api/backManage/insitution"; import {getCompany} from "@/api/onlineEducation/company"; import {get} from "@vueuse/core"; -import {getUser} from "@/api/system/user"; +import {getUser} from "@/api/onlineEducation/user"; +import {debounce} from "@/utils"; +import Cookies from "js-cookie"; const emit = defineEmits(["getList"]); const dialogVisible = ref(false) const superRef = ref(null) +const scrollRef = ref(null) + const equalToPassword = (rule, value, callback) => { if (state.form.password !== value) { @@ -135,6 +145,7 @@ confirmPassword: '', username: '', userType: 0, + sex: 0, companyId: null, parentId: null }, @@ -146,16 +157,40 @@ phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }], }, companyList: [], - userList: [], + userList: [ + + ], + keyword:'', + pageNum: 1, - pageSize: 10 + pageSize: 10, + cloading:false, + totlePage: 0, + userParam: {}, + isAdmin: false }) +const UisMounted = ref(false); +onMounted(() => { + UisMounted.value = true; + +}); const disabled = ref(false); const openDialog = async (type, value) => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + console.log("userInfo",userInfo) + if(userInfo.userType === 0){ + state.isAdmin = true; + state.form.userType = 0; + }else { + state.isAdmin = false; + state.form.companyId = userInfo.companyId; + state.form.companyName = userInfo.companyName; + state.form.userType = 1; + } + await getCompanyList('open') - await getUserList() state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ; if(type === 'edit' || type === 'view') { if( type === 'view'){ @@ -164,12 +199,23 @@ const res = await getUserById(value.id); if(res.code === 200){ state.form = res.data + if(res.data.userType === 2|| res.data.userType === 3){ + if(!res.data.parentId){ + state.form.parentId = '' + state.form.parentName = '无上级账号' + } + } } } if(type == 'pwd'){ state.form.id = value.id } dialogVisible.value = true + if(type === 'edit' && state.form && (state.form.userType === 2||state.form.userType === 3)){ + await nextTick(() => { + doGetUser() + }) + } } const finshed = ref(false) @@ -199,31 +245,21 @@ console.log("state.companyList",state.companyList) } } -const getUserList = async () => { - const queryParams = { - userType: state.form.userType - } - const res = await getUser(queryParams) - if (res.code == 200) { - debugger - } else { - ElMessage.warning(res.message) - } -} - const onSubmit = async () => { const valid = await superRef.value.validate(); if(valid){ + if((state.form.userType ===1 && state.form.companyId ===null) || ((state.form.userType ===2 ||state.form.userType ===3) && (state.form.parentId ===null ||state.form.companyId===null))){ + ElMessage.warning('请选择所属父级账号') + return; + } if(state.title == '新增'){ const {confirmPassword,id,...data} = state.form data.password = Base64.encode(data.password) - const res = await addMonitor(data) + const res = await addUser(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') - state.form.userType = 0 - superRef.value.clearValidate(); - superRef.value.resetFields(); + handleClose() dialogVisible.value = false; }else{ ElMessage.warning(res.message) @@ -231,14 +267,11 @@ }else if(state.title == '编辑'){ const {confirmPassword,...data} = state.form data.password = Base64.encode(data.password) - const res = await editMonitor(data) + const res = await editUser(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') - state.form.userType = 0 - superRef.value.clearValidate(); - superRef.value.resetFields(); - dialogVisible.value = false; + handleClose() }else{ ElMessage.warning(res.message) } @@ -246,22 +279,57 @@ const {id,password} = state.form const data = {id,password} data.password = Base64.encode(data.password) - const res = await resetUserPwd(data) + const res = await resetPwd(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') - superRef.value.clearValidate(); - superRef.value.resetFields(); - dialogVisible.value = false; + handleClose() }else{ ElMessage.warning(res.message) } } } } +const doGetUser = () => { + const param = { + userType: state.form.userType-1, + companyId: state.form.companyId, + } + scrollRef.value.getList(param,'change'); +} +const changeType = () => { + if(state.isAdmin){ + state.form.companyId = null; + state.form.companyName = ''; + } + state.form.parentId = null; + state.form.parentName = ''; + if(state.form.userType === 2 || state.form.userType === 3 ){ + const param = { + userType: state.form.userType-1, + companyId: state.form.companyId, + } + scrollRef.value.getList(param,'change'); + } +} const handleClose = () => { - state.form.userType = 0 + state.form = { + id: null, + name: '', + phone: '', + password: '', + confirmPassword: '', + username: '', + userType: 0, + sex: 0, + companyId: null, + parentId: null + } + state.userList = []; + state.companyList = []; + state.pageNum = 1; + state.pageSize = 10; superRef.value.clearValidate(); superRef.value.resetFields() dialogVisible.value = false; @@ -276,24 +344,32 @@ getCompanyList('') }, 500) } + const selectValue = (val) => { + state.form.parentId = null; + state.form.parentName = null; state.companyList.forEach(item => { if(item.name === val){ state.form.companyId = item.id + if(state.form.userType === 2 || state.form.userType === 3 ){ + const param = { + userType: state.form.userType-1, + companyId: state.form.companyId, + } + scrollRef.value.getList(param,'change'); + } } }) } -const selectValueUser = (val) => { - state.userList.forEach(item => { - if(item.name === val){ - state.form.parentId = item.id - } - }) +const getSelectUser = (val) => { + console.log("valllllllll",val) + state.form.parentId = val; } + defineExpose({ openDialog }); diff --git a/src/views/onlineEducation/systemManage/user/index.vue b/src/views/onlineEducation/systemManage/user/index.vue index 4a0f330..5649baf 100644 --- a/src/views/onlineEducation/systemManage/user/index.vue +++ b/src/views/onlineEducation/systemManage/user/index.vue @@ -41,7 +41,9 @@ import {ElMessage, ElMessageBox} from "element-plus"; import {delCompany, getCompany} from "@/api/onlineEducation/company"; import userDialog from './components/userDialog.vue' -import {getUser} from "@/api/onlineEducation/user"; +import {delUser, getUser} from "@/api/onlineEducation/user"; +import Cookies from "js-cookie"; + const { proxy } = getCurrentInstance(); const loading = ref(false); @@ -52,7 +54,8 @@ pageSize: 10, }, total: 0, - dataList: [] + dataList: [], + }); const { queryParams, total, dataList } = toRefs(data); @@ -100,7 +103,7 @@ type: 'warning', }) .then( async() => { - const res = await delCompany(val.id) + const res = await delUser(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getList() -- Gitblit v1.9.2