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