sys5923812@126.com 1 month ago
parent
commit
eae71c1512
36 changed files with 3563 additions and 249 deletions
  1. 33 0
      src/api/system/logininfor.js
  2. 26 0
      src/api/system/operlog.js
  3. 63 0
      src/api/xjc-platform/classmanager.js
  4. 44 0
      src/api/xjc-platform/office.js
  5. 44 0
      src/api/xjc-platform/studentmanager.js
  6. 44 0
      src/api/xjc-platform/teachermanager.js
  7. 1 0
      src/assets/icons/svg/client.svg
  8. 1 0
      src/assets/icons/svg/nacos.svg
  9. 1 0
      src/assets/icons/svg/sentinel.svg
  10. BIN
      src/assets/images/index/0.png
  11. BIN
      src/assets/images/index/1.png
  12. BIN
      src/assets/images/index/2.png
  13. BIN
      src/assets/images/index/3.png
  14. BIN
      src/assets/images/index/4.png
  15. BIN
      src/assets/images/index/5.png
  16. BIN
      src/assets/images/index/6.png
  17. 52 106
      src/layout/index.vue
  18. 152 143
      src/router/index.js
  19. 10 0
      src/router/router_cognize.js
  20. 9 0
      src/router/router_decision.js
  21. 9 0
      src/router/router_environment.js
  22. 9 0
      src/router/router_plan.js
  23. 9 0
      src/router/router_wakeup.js
  24. 229 0
      src/views/system/logininfor/index.vue
  25. 311 0
      src/views/system/operlog/index.vue
  26. 13 0
      src/views/xjc-integratedmachine/cognize/index.vue
  27. 13 0
      src/views/xjc-integratedmachine/decision/index.vue
  28. 13 0
      src/views/xjc-integratedmachine/environment/index.vue
  29. 13 0
      src/views/xjc-integratedmachine/plan/index.vue
  30. 13 0
      src/views/xjc-integratedmachine/wakeup/index.vue
  31. 487 0
      src/views/xjc-platform/classmanager/index.vue
  32. 369 0
      src/views/xjc-platform/office/index.vue
  33. 430 0
      src/views/xjc-platform/studentmanager/index.vue
  34. 382 0
      src/views/xjc-platform/teachermanager/index.vue
  35. 367 0
      src/views/xjccomponents/class_component.vue
  36. 416 0
      src/views/xjccomponents/office_component.vue

+ 33 - 0
src/api/system/logininfor.js

@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+
+// 查询登录日志列表
+export function list(query) {
+  return request({
+    url: '/system/logininfor/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 删除登录日志
+export function delLogininfor(infoId) {
+  return request({
+    url: '/system/logininfor/' + infoId,
+    method: 'delete'
+  })
+}
+
+// 解锁用户登录状态
+export function unlockLogininfor(userName) {
+  return request({
+    url: '/system/logininfor/unlock/' + userName,
+    method: 'get'
+  })
+}
+// 清空登录日志
+export function cleanLogininfor() {
+  return request({
+    url: '/system/logininfor/clean',
+    method: 'delete'
+  })
+}

+ 26 - 0
src/api/system/operlog.js

@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+// 查询操作日志列表
+export function list(query) {
+  return request({
+    url: '/system/operlog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 删除操作日志
+export function delOperlog(operId) {
+  return request({
+    url: '/system/operlog/' + operId,
+    method: 'delete'
+  })
+}
+
+// 清空操作日志
+export function cleanOperlog() {
+  return request({
+    url: '/system/operlog/clean',
+    method: 'delete'
+  })
+}

+ 63 - 0
src/api/xjc-platform/classmanager.js

@@ -0,0 +1,63 @@
+import request from '@/utils/request'
+
+// 查询班级管理列表
+export function listClassmanager(query) {
+    return request({
+        url: '/platform/classmanager/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询班级管理列表
+export function listClassmanagerBy(query) {
+    return request({
+        url: '/platform/classmanager/listBy',
+        method: 'post',
+        data: query
+    })
+}
+
+// 查询班级管理详细
+export function getClassmanager(id) {
+    return request({
+        url: '/platform/classmanager/' + id,
+        method: 'get'
+    })
+}
+
+// 新增班级管理
+export function addClassmanager(data) {
+    return request({
+        url: '/platform/classmanager',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改班级管理
+export function updateClassmanager(data) {
+    return request({
+        url: '/platform/classmanager',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除班级管理
+export function delClassmanager(id) {
+    return request({
+        url: '/platform/classmanager/' + id,
+        method: 'delete'
+    })
+}
+
+//------------
+//批量增加
+export function addClassmanagerBach(data) {
+    return request({
+        url: '/platform/classmanager/bachAdd',
+        method: 'post',
+        data: data
+    })
+}

+ 44 - 0
src/api/xjc-platform/office.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询学校管理列表
+export function listOffice(query) {
+  return request({
+    url: '/platform/office/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询学校管理详细
+export function getOffice(id) {
+  return request({
+    url: '/platform/office/' + id,
+    method: 'get'
+  })
+}
+
+// 新增学校管理
+export function addOffice(data) {
+  return request({
+    url: '/platform/office',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改学校管理
+export function updateOffice(data) {
+  return request({
+    url: '/platform/office',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除学校管理
+export function delOffice(id) {
+  return request({
+    url: '/platform/office/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/xjc-platform/studentmanager.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询学生管理列表
+export function listStudentmanager(query) {
+  return request({
+    url: '/xjc-platform/studentmanager/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询学生管理详细
+export function getStudentmanager(id) {
+  return request({
+    url: '/xjc-platform/studentmanager/' + id,
+    method: 'get'
+  })
+}
+
+// 新增学生管理
+export function addStudentmanager(data) {
+  return request({
+    url: '/xjc-platform/studentmanager',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改学生管理
+export function updateStudentmanager(data) {
+  return request({
+    url: '/xjc-platform/studentmanager',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除学生管理
+export function delStudentmanager(id) {
+  return request({
+    url: '/xjc-platform/studentmanager/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/xjc-platform/teachermanager.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询教师管理列表
+export function listTeachermanager(query) {
+  return request({
+    url: '/platform/teachermanager/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询教师管理详细
+export function getTeachermanager(id) {
+  return request({
+    url: '/platform/teachermanager/' + id,
+    method: 'get'
+  })
+}
+
+// 新增教师管理
+export function addTeachermanager(data) {
+  return request({
+    url: '/platform/teachermanager',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改教师管理
+export function updateTeachermanager(data) {
+  return request({
+    url: '/platform/teachermanager',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除教师管理
+export function delTeachermanager(id) {
+  return request({
+    url: '/platform/teachermanager/' + id,
+    method: 'delete'
+  })
+}

File diff suppressed because it is too large
+ 1 - 0
src/assets/icons/svg/client.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/icons/svg/nacos.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/icons/svg/sentinel.svg


BIN
src/assets/images/index/0.png


BIN
src/assets/images/index/1.png


BIN
src/assets/images/index/2.png


BIN
src/assets/images/index/3.png


BIN
src/assets/images/index/4.png


BIN
src/assets/images/index/5.png


BIN
src/assets/images/index/6.png


+ 52 - 106
src/layout/index.vue

@@ -1,114 +1,60 @@
 <template>
-  <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
-    <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
-    sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
-    <br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s<br>s
-    <!--<sidebar v-if="!sidebar.hide" class="sidebar-container" />-->
-    <!--<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">-->
-      <!--<div :class="{ 'fixed-header': fixedHeader }">-->
-        <!--<navbar @setLayout="setLayout" />-->
-        <!--<tags-view v-if="needTagsView" />-->
-      <!--</div>-->
-      <!--<app-main />-->
-      <!--<settings ref="settingRef" />-->
-    <!--</div>-->
-  </div>
+    <div class="main">
+        <div class="top">
+            <img src="@/assets/images/index/0.png">
+        </div>
+        <div class="center">
+            <div class="c1">
+                <img src="@/assets/images/index/1.png">
+                <img src="@/assets/images/index/2.png" @click="indexJump('/integratedmachine/wakeup/index')">
+                <img src="@/assets/images/index/3.png">
+            </div>
+            <div class="c2">
+                <img src="@/assets/images/index/4.png">
+                <img src="@/assets/images/index/5.png">
+                <img src="@/assets/images/index/6.png">
+            </div>
+        </div>
+    </div>
 </template>
 
 <script setup>
-import { useWindowSize } from '@vueuse/core'
-import Sidebar from './components/Sidebar/index.vue'
-import { AppMain, Navbar, Settings, TagsView } from './components'
-import useAppStore from '@/store/modules/app'
-import useSettingsStore from '@/store/modules/settings'
-
-const settingsStore = useSettingsStore()
-const theme = computed(() => settingsStore.theme)
-const sideTheme = computed(() => settingsStore.sideTheme)
-const sidebar = computed(() => useAppStore().sidebar)
-const device = computed(() => useAppStore().device)
-const needTagsView = computed(() => settingsStore.tagsView)
-const fixedHeader = computed(() => settingsStore.fixedHeader)
-
-const classObj = computed(() => ({
-  hideSidebar: !sidebar.value.opened,
-  openSidebar: sidebar.value.opened,
-  withoutAnimation: sidebar.value.withoutAnimation,
-  mobile: device.value === 'mobile'
-}))
-
-const { width, height } = useWindowSize()
-const WIDTH = 992 // refer to Bootstrap's responsive design
-
-watch(() => device.value, () => {
-  if (device.value === 'mobile' && sidebar.value.opened) {
-    useAppStore().closeSideBar({ withoutAnimation: false })
-  }
-})
-
-watchEffect(() => {
-  if (width.value - 1 < WIDTH) {
-    useAppStore().toggleDevice('mobile')
-    useAppStore().closeSideBar({ withoutAnimation: true })
-  } else {
-    useAppStore().toggleDevice('desktop')
-  }
-})
-
-function handleClickOutside() {
-  useAppStore().closeSideBar({ withoutAnimation: false })
-}
-
-const settingRef = ref(null)
-function setLayout() {
-  settingRef.value.openSetting()
-}
+    const router = useRouter()
+
+    function indexJump(path) {
+        router.push({
+            path: path,
+            query: {name: 123}
+        })
+    }
 </script>
 
 <style lang="scss" scoped>
-@use "@/assets/styles/mixin.scss" as mix;
-@use "@/assets/styles/variables.module.scss" as vars;
-
-.app-wrapper {
-  @include mix.clearfix;
-  position: relative;
-  height: 100%;
-  width: 100%;
-
-  &.mobile.openSidebar {
-    position: fixed;
-    top: 0;
-  }
-}
-
-.drawer-bg {
-  background: #000;
-  opacity: 0.3;
-  width: 100%;
-  top: 0;
-  height: 100%;
-  position: absolute;
-  z-index: 999;
-}
-
-.fixed-header {
-  position: fixed;
-  top: 0;
-  right: 0;
-  z-index: 9;
-  width: calc(100% - #{vars.$base-sidebar-width});
-  transition: width 0.28s;
-}
-
-.hideSidebar .fixed-header {
-  width: calc(100% - 54px);
-}
-
-.sidebarHide .fixed-header {
-  width: 100%;
-}
-
-.mobile .fixed-header {
-  width: 100%;
-}
+    .main {
+        align-items: center;
+        display: flex;
+        flex-direction: column;
+    }
+
+    .top {
+        height: 20vh;
+    }
+
+    .center {
+        display: flex;
+        flex-direction: column;
+        height: 80vh;
+    }
+
+    .c1 {
+        height: 50vh;
+        display: flex;
+        flex-direction: row;
+    }
+
+    .c2 {
+        height: 50vh;
+        display: flex;
+        flex-direction: row;
+    }
 </style>

+ 152 - 143
src/router/index.js

@@ -1,6 +1,149 @@
-import { createWebHistory, createRouter } from 'vue-router'
+import {createWebHistory, createRouter} from 'vue-router'
 /* Layout */
 import Layout from '@/layout'
+import router_wakeup from '@/router/router_wakeup.js'
+import router_cognize from '@/router/router_cognize.js'
+import router_decision from '@/router/router_decision.js'
+import router_environment from '@/router/router_environment.js'
+import router_plan from '@/router/router_plan.js'
+
+// 公共路由
+export const constantRoutes = [
+    {
+        path: '/redirect',
+        component: Layout,
+        hidden: true,
+        children: [
+            {
+                path: '/redirect/:path(.*)',
+                component: () => import('@/views/redirect/index.vue')
+            }
+        ]
+    },
+    {
+        path: '/login',
+        component: () => import('@/views/login'),
+        hidden: true
+    },
+    {
+        path: '/register',
+        component: () => import('@/views/register'),
+        hidden: true
+    },
+    {
+        path: "/:pathMatch(.*)*",
+        component: () => import('@/views/error/404'),
+        hidden: true
+    },
+    {
+        path: '/401',
+        component: () => import('@/views/error/401'),
+        hidden: true
+    },
+    {
+        path: '',
+        component: Layout,
+        redirect: '/index',
+        children: [
+            {
+                path: '/index',
+                component: () => import('@/views/index'),
+                name: 'Index',
+                meta: {title: '首页', icon: 'dashboard', affix: true}
+            }
+        ]
+    },
+    {
+        path: '/user',
+        component: Layout,
+        hidden: true,
+        redirect: 'noredirect',
+        children: [
+            {
+                path: 'profile/:activeTab?',
+                component: () => import('@/views/system/user/profile/index'),
+                name: 'Profile',
+                meta: {title: '个人中心', icon: 'user'}
+            }
+        ]
+    }
+]
+
+// 动态路由,基于用户权限动态去加载
+export const dynamicRoutes = [
+    {
+        path: '/system/user-auth',
+        component: Layout,
+        hidden: true,
+        permissions: ['system:user:edit'],
+        children: [
+            {
+                path: 'role/:userId(\\d+)',
+                component: () => import('@/views/system/user/authRole'),
+                name: 'AuthRole',
+                meta: {title: '分配角色', activeMenu: '/system/user'}
+            }
+        ]
+    },
+    {
+        path: '/system/role-auth',
+        component: Layout,
+        hidden: true,
+        permissions: ['system:role:edit'],
+        children: [
+            {
+                path: 'user/:roleId(\\d+)',
+                component: () => import('@/views/system/role/authUser'),
+                name: 'AuthUser',
+                meta: {title: '分配用户', activeMenu: '/system/role'}
+            }
+        ]
+    },
+    {
+        path: '/system/dict-data',
+        component: Layout,
+        hidden: true,
+        permissions: ['system:dict:list'],
+        children: [
+            {
+                path: 'index/:dictId(\\d+)',
+                component: () => import('@/views/system/dict/data'),
+                name: 'Data',
+                meta: {title: '字典数据', activeMenu: '/system/dict'}
+            }
+        ]
+    },
+    {
+        path: '/monitor/job-log',
+        component: Layout,
+        hidden: true,
+        permissions: ['monitor:job:list'],
+        children: [
+            {
+                path: 'index/:jobId(\\d+)',
+                component: () => import('@/views/monitor/job/log'),
+                name: 'JobLog',
+                meta: {title: '调度日志', activeMenu: '/monitor/job'}
+            }
+        ]
+    },
+    {
+        path: '/tool/gen-edit',
+        component: Layout,
+        hidden: true,
+        permissions: ['tool:gen:edit'],
+        children: [
+            {
+                path: 'index/:tableId(\\d+)',
+                component: () => import('@/views/tool/gen/editTable'),
+                name: 'GenEdit',
+                meta: {title: '修改生成配置', activeMenu: '/tool/gen'}
+            }
+        ]
+    }
+]
+const routerArrs = [...router_wakeup.router, ...router_cognize.router, ...router_decision.router,
+    ...router_environment.router, ...router_plan.router,...constantRoutes]
 
 /**
  * Note: 路由配置项
@@ -24,151 +167,17 @@ import Layout from '@/layout'
   }
  */
 
-// 公共路由
-export const constantRoutes = [
-  {
-    path: '/redirect',
-    component: Layout,
-    hidden: true,
-    children: [
-      {
-        path: '/redirect/:path(.*)',
-        component: () => import('@/views/redirect/index.vue')
-      }
-    ]
-  },
-  {
-    path: '/login',
-    component: () => import('@/views/login'),
-    hidden: true
-  },
-  {
-    path: '/register',
-    component: () => import('@/views/register'),
-    hidden: true
-  },
-  {
-    path: "/:pathMatch(.*)*",
-    component: () => import('@/views/error/404'),
-    hidden: true
-  },
-  {
-    path: '/401',
-    component: () => import('@/views/error/401'),
-    hidden: true
-  },
-  {
-    path: '',
-    component: Layout,
-    redirect: '/index',
-    children: [
-      {
-        path: '/index',
-        component: () => import('@/views/index'),
-        name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
-      }
-    ]
-  },
-  {
-    path: '/user',
-    component: Layout,
-    hidden: true,
-    redirect: 'noredirect',
-    children: [
-      {
-        path: 'profile/:activeTab?',
-        component: () => import('@/views/system/user/profile/index'),
-        name: 'Profile',
-        meta: { title: '个人中心', icon: 'user' }
-      }
-    ]
-  }
-]
 
-// 动态路由,基于用户权限动态去加载
-export const dynamicRoutes = [
-  {
-    path: '/system/user-auth',
-    component: Layout,
-    hidden: true,
-    permissions: ['system:user:edit'],
-    children: [
-      {
-        path: 'role/:userId(\\d+)',
-        component: () => import('@/views/system/user/authRole'),
-        name: 'AuthRole',
-        meta: { title: '分配角色', activeMenu: '/system/user' }
-      }
-    ]
-  },
-  {
-    path: '/system/role-auth',
-    component: Layout,
-    hidden: true,
-    permissions: ['system:role:edit'],
-    children: [
-      {
-        path: 'user/:roleId(\\d+)',
-        component: () => import('@/views/system/role/authUser'),
-        name: 'AuthUser',
-        meta: { title: '分配用户', activeMenu: '/system/role' }
-      }
-    ]
-  },
-  {
-    path: '/system/dict-data',
-    component: Layout,
-    hidden: true,
-    permissions: ['system:dict:list'],
-    children: [
-      {
-        path: 'index/:dictId(\\d+)',
-        component: () => import('@/views/system/dict/data'),
-        name: 'Data',
-        meta: { title: '字典数据', activeMenu: '/system/dict' }
-      }
-    ]
-  },
-  {
-    path: '/monitor/job-log',
-    component: Layout,
-    hidden: true,
-    permissions: ['monitor:job:list'],
-    children: [
-      {
-        path: 'index/:jobId(\\d+)',
-        component: () => import('@/views/monitor/job/log'),
-        name: 'JobLog',
-        meta: { title: '调度日志', activeMenu: '/monitor/job' }
-      }
-    ]
-  },
-  {
-    path: '/tool/gen-edit',
-    component: Layout,
-    hidden: true,
-    permissions: ['tool:gen:edit'],
-    children: [
-      {
-        path: 'index/:tableId(\\d+)',
-        component: () => import('@/views/tool/gen/editTable'),
-        name: 'GenEdit',
-        meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
-      }
-    ]
-  }
-]
 
 const router = createRouter({
-  history: createWebHistory(),
-  routes: constantRoutes,
-  scrollBehavior(to, from, savedPosition) {
-    if (savedPosition) {
-      return savedPosition
-    }
-    return { top: 0 }
-  },
+    history: createWebHistory(),
+    routes: routerArrs,
+    scrollBehavior(to, from, savedPosition) {
+        if (savedPosition) {
+            return savedPosition
+        }
+        return {top: 0}
+    },
 })
 
 export default router

+ 10 - 0
src/router/router_cognize.js

@@ -0,0 +1,10 @@
+const router = [
+    {
+        path: '/integratedmachine/cognize/index',
+        component: () => import('@/views/xjc-integratedmachine/cognize/index'),
+    }
+]
+
+export default  {
+    router
+}

+ 9 - 0
src/router/router_decision.js

@@ -0,0 +1,9 @@
+const router=[
+    {
+        path: '/integratedmachine/decision/index',
+        component: () => import('@/views/xjc-integratedmachine/decision/index'),
+    }
+]
+export default {
+    router
+}

+ 9 - 0
src/router/router_environment.js

@@ -0,0 +1,9 @@
+const router = [
+    {
+        path: '/integratedmachine/environment/index',
+        component: () => import('@/views/xjc-integratedmachine/environment/index'),
+    }
+]
+export default{
+    router
+}

+ 9 - 0
src/router/router_plan.js

@@ -0,0 +1,9 @@
+const router = [
+    {
+        path: '/integratedmachine/plan/index',
+        component: () => import('@/views/xjc-integratedmachine/plan/index'),
+    }
+]
+export default{
+    router
+}

+ 9 - 0
src/router/router_wakeup.js

@@ -0,0 +1,9 @@
+const router = [
+    {
+        path: '/integratedmachine/wakeup/index',
+        component: () => import('@/views/xjc-integratedmachine/wakeup/index'),
+    }
+]
+export default{
+    router
+}

+ 229 - 0
src/views/system/logininfor/index.vue

@@ -0,0 +1,229 @@
+<template>
+   <div class="app-container">
+      <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+         <el-form-item label="登录地址" prop="ipaddr">
+            <el-input
+               v-model="queryParams.ipaddr"
+               placeholder="请输入登录地址"
+               clearable
+               style="width: 240px;"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="用户名称" prop="userName">
+            <el-input
+               v-model="queryParams.userName"
+               placeholder="请输入用户名称"
+               clearable
+               style="width: 240px;"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="状态" prop="status">
+            <el-select
+               v-model="queryParams.status"
+               placeholder="登录状态"
+               clearable
+               style="width: 240px"
+            >
+               <el-option
+                  v-for="dict in sys_common_status"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+               />
+            </el-select>
+         </el-form-item>
+         <el-form-item label="登录时间" style="width: 308px">
+            <el-date-picker
+               v-model="dateRange"
+               value-format="YYYY-MM-DD HH:mm:ss"
+               type="daterange"
+               range-separator="-"
+               start-placeholder="开始日期"
+               end-placeholder="结束日期"
+               :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
+            ></el-date-picker>
+         </el-form-item>
+         <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+         </el-form-item>
+      </el-form>
+
+      <el-row :gutter="10" class="mb8">
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="Delete"
+               :disabled="multiple"
+               @click="handleDelete"
+               v-hasPermi="['system:logininfor:remove']"
+            >删除</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="Delete"
+               @click="handleClean"
+               v-hasPermi="['system:logininfor:remove']"
+            >清空</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="primary"
+               plain
+               icon="Unlock"
+               :disabled="single"
+               @click="handleUnlock"
+               v-hasPermi="['system:logininfor:unlock']"
+            >解锁</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="warning"
+               plain
+               icon="Download"
+               @click="handleExport"
+               v-hasPermi="['system:logininfor:export']"
+            >导出</el-button>
+         </el-col>
+         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+
+      <el-table ref="logininforRef" v-loading="loading" :data="logininforList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
+         <el-table-column type="selection" width="55" align="center" />
+         <el-table-column label="访问编号" align="center" prop="infoId" />
+         <el-table-column label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
+         <el-table-column label="登录状态" align="center" prop="status">
+            <template #default="scope">
+               <dict-tag :options="sys_common_status" :value="scope.row.status" />
+            </template>
+         </el-table-column>
+         <el-table-column label="描述" align="center" prop="msg" :show-overflow-tooltip="true" />
+         <el-table-column label="访问时间" align="center" prop="accessTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180">
+            <template #default="scope">
+               <span>{{ parseTime(scope.row.accessTime) }}</span>
+            </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"
+      />
+   </div>
+</template>
+
+<script setup name="Logininfor">
+import { list, delLogininfor, cleanLogininfor, unlockLogininfor } from "@/api/system/logininfor"
+
+const { proxy } = getCurrentInstance()
+const { sys_common_status } = proxy.useDict("sys_common_status")
+
+const logininforList = ref([])
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const selectName = ref("")
+const total = ref(0)
+const dateRange = ref([])
+const defaultSort = ref({ prop: "accessTime", order: "descending" })
+
+// 查询参数
+const queryParams = ref({
+  pageNum: 1,
+  pageSize: 10,
+  ipaddr: undefined,
+  userName: undefined,
+  status: undefined,
+  orderByColumn: undefined,
+  isAsc: undefined
+})
+
+/** 查询登录日志列表 */
+function getList() {
+  loading.value = true
+  list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
+    logininforList.value = response.rows
+    total.value = response.total
+    loading.value = false
+  })
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  dateRange.value = []
+  proxy.resetForm("queryRef")
+  queryParams.value.pageNum = 1
+  proxy.$refs["logininforRef"].sort(defaultSort.value.prop, defaultSort.value.order)
+}
+
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.infoId)
+  multiple.value = !selection.length
+  single.value = selection.length != 1
+  selectName.value = selection.map(item => item.userName)
+}
+
+/** 排序触发事件 */
+function handleSortChange(column, prop, order) {
+  queryParams.value.orderByColumn = column.prop
+  queryParams.value.isAsc = column.order
+  getList()
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const infoIds = row.infoId || ids.value
+  proxy.$modal.confirm('是否确认删除访问编号为"' + infoIds + '"的数据项?').then(function () {
+    return delLogininfor(infoIds)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("删除成功")
+  }).catch(() => {})
+}
+
+/** 清空按钮操作 */
+function handleClean() {
+  proxy.$modal.confirm("是否确认清空所有登录日志数据项?").then(function () {
+    return cleanLogininfor()
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("清空成功")
+  }).catch(() => {})
+}
+
+/** 解锁按钮操作 */
+function handleUnlock() {
+  const username = selectName.value
+  proxy.$modal.confirm('是否确认解锁用户"' + username + '"数据项?').then(function () {
+    return unlockLogininfor(username)
+  }).then(() => {
+    proxy.$modal.msgSuccess("用户" + username + "解锁成功")
+  }).catch(() => {})
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download("system/logininfor/export", {
+    ...queryParams.value,
+  }, `logininfor_${new Date().getTime()}.xlsx`)
+}
+
+getList()
+</script>

+ 311 - 0
src/views/system/operlog/index.vue

@@ -0,0 +1,311 @@
+<template>
+   <div class="app-container">
+      <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+         <el-form-item label="操作地址" prop="operIp">
+            <el-input
+               v-model="queryParams.operIp"
+               placeholder="请输入操作地址"
+               clearable
+               style="width: 240px;"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="系统模块" prop="title">
+            <el-input
+               v-model="queryParams.title"
+               placeholder="请输入系统模块"
+               clearable
+               style="width: 240px;"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="操作人员" prop="operName">
+            <el-input
+               v-model="queryParams.operName"
+               placeholder="请输入操作人员"
+               clearable
+               style="width: 240px;"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="类型" prop="businessType">
+            <el-select
+               v-model="queryParams.businessType"
+               placeholder="操作类型"
+               clearable
+               style="width: 240px"
+            >
+               <el-option
+                  v-for="dict in sys_oper_type"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+               />
+            </el-select>
+         </el-form-item>
+         <el-form-item label="状态" prop="status">
+            <el-select
+               v-model="queryParams.status"
+               placeholder="操作状态"
+               clearable
+               style="width: 240px"
+            >
+               <el-option
+                  v-for="dict in sys_common_status"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+               />
+            </el-select>
+         </el-form-item>
+         <el-form-item label="操作时间" style="width: 308px">
+            <el-date-picker
+               v-model="dateRange"
+               value-format="YYYY-MM-DD HH:mm:ss"
+               type="daterange"
+               range-separator="-"
+               start-placeholder="开始日期"
+               end-placeholder="结束日期"
+               :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
+            ></el-date-picker>
+         </el-form-item>
+         <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+         </el-form-item>
+      </el-form>
+
+      <el-row :gutter="10" class="mb8">
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="Delete"
+               :disabled="multiple"
+               @click="handleDelete"
+               v-hasPermi="['system:operlog:remove']"
+            >删除</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="Delete"
+               @click="handleClean"
+               v-hasPermi="['system:operlog:remove']"
+            >清空</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="warning"
+               plain
+               icon="Download"
+               @click="handleExport"
+               v-hasPermi="['system:operlog:export']"
+            >导出</el-button>
+         </el-col>
+         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+
+      <el-table ref="operlogRef" v-loading="loading" :data="operlogList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
+         <el-table-column type="selection" width="50" align="center" />
+         <el-table-column label="日志编号" align="center" prop="operId" />
+         <el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" />
+         <el-table-column label="操作类型" align="center" prop="businessType">
+            <template #default="scope">
+               <dict-tag :options="sys_oper_type" :value="scope.row.businessType" />
+            </template>
+         </el-table-column>
+         <el-table-column label="请求方式" align="center" prop="requestMethod" />
+         <el-table-column label="操作人员" align="center" prop="operName" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
+         <el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
+         <el-table-column label="操作状态" align="center" prop="status">
+            <template #default="scope">
+               <dict-tag :options="sys_common_status" :value="scope.row.status" />
+            </template>
+         </el-table-column>
+         <el-table-column label="操作日期" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']">
+            <template #default="scope">
+               <span>{{ parseTime(scope.row.operTime) }}</span>
+            </template>
+         </el-table-column>
+         <el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']">
+            <template #default="scope">
+               <span>{{ scope.row.costTime }}毫秒</span>
+            </template>
+         </el-table-column>
+         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template #default="scope">
+               <el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)" v-hasPermi="['system:operlog:query']">详细</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"
+      />
+
+      <!-- 操作日志详细 -->
+      <el-dialog title="操作日志详细" v-model="open" width="800px" append-to-body>
+         <el-form :model="form" label-width="100px">
+            <el-row>
+               <el-col :span="12">
+                  <el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
+                  <el-form-item
+                    label="登录信息:"
+                  >{{ form.operName }} / {{ form.operIp }} </el-form-item>
+               </el-col>
+               <el-col :span="12">
+                  <el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item>
+                  <el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item>
+               </el-col>
+               <el-col :span="24">
+                  <el-form-item label="操作方法:">{{ form.method }}</el-form-item>
+               </el-col>
+               <el-col :span="24">
+                  <el-form-item label="请求参数:">{{ form.operParam }}</el-form-item>
+               </el-col>
+               <el-col :span="24">
+                  <el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item>
+               </el-col>
+               <el-col :span="8">
+                  <el-form-item label="操作状态:">
+                     <div v-if="form.status === 0">正常</div>
+                     <div v-else-if="form.status === 1">失败</div>
+                  </el-form-item>
+               </el-col>
+               <el-col :span="8">
+                  <el-form-item label="消耗时间:">{{ form.costTime }}毫秒</el-form-item>
+               </el-col>
+               <el-col :span="8">
+                  <el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item>
+               </el-col>
+               <el-col :span="24">
+                  <el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
+               </el-col>
+            </el-row>
+         </el-form>
+         <template #footer>
+            <div class="dialog-footer">
+               <el-button @click="open = false">关 闭</el-button>
+            </div>
+         </template>
+      </el-dialog>
+   </div>
+</template>
+
+<script setup name="Operlog">
+import { list, delOperlog, cleanOperlog } from "@/api/system/operlog"
+
+const { proxy } = getCurrentInstance()
+const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type", "sys_common_status")
+
+const operlogList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+const dateRange = ref([])
+const defaultSort = ref({ prop: "operTime", order: "descending" })
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    operIp: undefined,
+    title: undefined,
+    operName: undefined,
+    businessType: undefined,
+    status: undefined
+  }
+})
+
+const { queryParams, form } = toRefs(data)
+
+/** 查询登录日志 */
+function getList() {
+  loading.value = true
+  list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
+    operlogList.value = response.rows
+    total.value = response.total
+    loading.value = false
+  })
+}
+
+/** 操作日志类型字典翻译 */
+function typeFormat(row, column) {
+  return proxy.selectDictLabel(sys_oper_type.value, row.businessType)
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  dateRange.value = []
+  proxy.resetForm("queryRef")
+  queryParams.value.pageNum = 1
+  proxy.$refs["operlogRef"].sort(defaultSort.value.prop, defaultSort.value.order)
+}
+
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.operId)
+  multiple.value = !selection.length
+}
+
+/** 排序触发事件 */
+function handleSortChange(column, prop, order) {
+  queryParams.value.orderByColumn = column.prop
+  queryParams.value.isAsc = column.order
+  getList()
+}
+
+/** 详细按钮操作 */
+function handleView(row) {
+  open.value = true
+  form.value = row
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const operIds = row.operId || ids.value
+  proxy.$modal.confirm('是否确认删除日志编号为"' + operIds + '"的数据项?').then(function () {
+    return delOperlog(operIds)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("删除成功")
+  }).catch(() => {})
+}
+
+/** 清空按钮操作 */
+function handleClean() {
+  proxy.$modal.confirm("是否确认清空所有操作日志数据项?").then(function () {
+    return cleanOperlog()
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("清空成功")
+  }).catch(() => {})
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download("system/operlog/export",{
+    ...queryParams.value,
+  }, `config_${new Date().getTime()}.xlsx`)
+}
+
+getList()
+</script>

+ 13 - 0
src/views/xjc-integratedmachine/cognize/index.vue

@@ -0,0 +1,13 @@
+<template>
+    自我认知首页
+</template>
+
+<script>
+    export default {
+        name: "index"
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 13 - 0
src/views/xjc-integratedmachine/decision/index.vue

@@ -0,0 +1,13 @@
+<template>
+    生涯决策首页
+</template>
+
+<script>
+    export default {
+        name: "index"
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 13 - 0
src/views/xjc-integratedmachine/environment/index.vue

@@ -0,0 +1,13 @@
+<template>
+    环境探索首页
+</template>
+
+<script>
+    export default {
+        name: "index"
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 13 - 0
src/views/xjc-integratedmachine/plan/index.vue

@@ -0,0 +1,13 @@
+<template>
+    规划管理首页
+</template>
+
+<script>
+    export default {
+        name: "index"
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 13 - 0
src/views/xjc-integratedmachine/wakeup/index.vue

@@ -0,0 +1,13 @@
+<template>
+    生涯唤醒首页
+</template>
+
+<script>
+    export default {
+        name: "index"
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 487 - 0
src/views/xjc-platform/classmanager/index.vue

@@ -0,0 +1,487 @@
+<template>
+    <div class="app-container">
+
+        <el-row :gutter="20">
+            <splitpanes class="class-theme">
+                <!--部门数据-->
+                <pane size="16">
+                    <el-col>
+                        <div class="head-container">
+                            <el-input v-model="deptName" placeholder="请输入部门名称" clearable prefix-icon="Search"
+                                      style="margin-bottom: 20px"/>
+                        </div>
+                        <div class="head-container">
+                            <el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }"
+                                     :expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef"
+                                     node-key="id" highlight-current default-expand-all @node-click="handleNodeClick"/>
+                        </div>
+                    </el-col>
+                </pane>
+                <pane size="84">
+                    <el-col>
+                        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"
+                                 label-width="68px">
+                            <el-form-item label="年级" prop="gradeYear">
+                                <el-select v-model="queryParams.gradeYear" placeholder="请选择年级" clearable
+                                           style="width: 168px">
+                                    <el-option
+                                            v-for="dict in sys_user_grade"
+                                            :key="dict.value"
+                                            :label="dict.label"
+                                            :value="dict.value"
+                                    />
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item label="名称" prop="name">
+                                <el-input
+                                        v-model="queryParams.name"
+                                        placeholder="请输入名称"
+                                        clearable
+                                        @keyup.enter="handleQuery"
+                                />
+                            </el-form-item>
+                            <el-form-item label="班主任" prop="teacherId">
+                                <el-input
+                                        v-model="queryParams.teacherId"
+                                        placeholder="请输入班主任"
+                                        clearable
+                                        @keyup.enter="handleQuery"
+                                />
+                            </el-form-item>
+                            <el-form-item label="班级编码" prop="classCode">
+                                <el-input
+                                        v-model="queryParams.classCode"
+                                        placeholder="请输入班级编码"
+                                        clearable
+                                        @keyup.enter="handleQuery"
+                                />
+                            </el-form-item>
+
+                            <el-form-item>
+                                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                            </el-form-item>
+                        </el-form>
+
+                        <el-row :gutter="10" class="mb8">
+                            <el-col :span="1.5">
+                                <el-button
+                                        type="primary"
+                                        plain
+                                        icon="Plus"
+                                        @click="handleAdd"
+                                        v-hasPermi="['platform:classmanager:add']"
+                                >新增
+                                </el-button>
+                            </el-col>
+                            <el-col :span="1.5">
+                                <el-button
+                                        type="success"
+                                        plain
+                                        icon="Edit"
+                                        :disabled="single"
+                                        @click="handleUpdate"
+                                        v-hasPermi="['platform:classmanager:edit']"
+                                >修改
+                                </el-button>
+                            </el-col>
+                            <el-col :span="1.5">
+                                <el-button
+                                        type="danger"
+                                        plain
+                                        icon="Delete"
+                                        :disabled="multiple"
+                                        @click="handleDelete"
+                                        v-hasPermi="['platform:classmanager:remove']"
+                                >删除
+                                </el-button>
+                            </el-col>
+                            <el-col :span="1.5">
+                                <el-button
+                                        type="warning"
+                                        plain
+                                        icon="Download"
+                                        @click="handleExport"
+                                        v-hasPermi="['platform:classmanager:export']"
+                                >导出
+                                </el-button>
+                            </el-col>
+                            <el-col :span="1.5">
+                                <el-button
+                                        type="success"
+                                        plain
+                                        icon="Edit"
+                                        @click="handleAddBach"
+                                        v-hasPermi="['platform:classmanager:bachadd']"
+                                >批量增加
+                                </el-button>
+                            </el-col>
+
+                            <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+                        </el-row>
+
+                        <el-table v-loading="loading" :data="classmanagerList"
+                                  @selection-change="handleSelectionChange">
+                            <el-table-column type="selection" width="55" align="center"/>
+                            <el-table-column label="年级" align="center" prop="gradeYear">
+                                <template #default="scope">
+                                    <dict-tag :options="sys_user_grade" :value="scope.row.gradeYear"/>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="名称" align="center" prop="name"/>
+                            <el-table-column label="班主任" align="center" prop="teacherId"/>
+                            <el-table-column label="班级编码" align="center" prop="classCode"/>
+                            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                                <template #default="scope">
+                                    <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                                               v-hasPermi="['platform:classmanager:edit']">修改
+                                    </el-button>
+                                    <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                                               v-hasPermi="['platform:classmanager:remove']">删除
+                                    </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"
+                        />
+                    </el-col>
+                </pane>
+            </splitpanes>
+        </el-row>
+        <!-- 添加或修改班级管理对话框 -->
+        <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+            <el-form ref="classmanagerRef" :model="form" :rules="rules" label-width="80px">
+                <el-form-item label="学校" prop="officeId">
+                    <el-input v-model="form.officeName" placeholder="请选择学校" @click="handleOfficeComponentSelect"/>
+                </el-form-item>
+                <el-form-item label="年级" prop="gradeYear">
+                    <el-select v-model="form.gradeYear" placeholder="请选择年级">
+                        <el-option
+                                v-for="dict in sys_user_grade"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="parseInt(dict.value)"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="名称" prop="name">
+                    <el-input v-model="form.name" placeholder="请输入名称"/>
+                </el-form-item>
+                <el-form-item label="班主任" prop="teacherId">
+                    <el-input v-model="form.teacherId" placeholder="请输入班主任"/>
+                </el-form-item>
+                <el-form-item label="班级编码" prop="classCode">
+                    <el-input v-model="form.classCode" placeholder="请输入班级编码"/>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+            <office-component :isRadio="1" ref="office_component"
+                              @onSelected="onOfficeComponentSelect"></office-component>
+        </el-dialog>
+
+        <el-dialog title="批量增加班级" v-model="openBach" width="500px" append-to-body>
+            <el-form ref="classmanagerAddBachRef" :model="form" :rules="rules" label-width="80px">
+                <el-form-item label="学校" prop="officeId">
+                    <el-input v-model="bachForm.officeName" placeholder="请选择学校" @click="handleOfficeComponentSelect_bach"/>
+                </el-form-item>
+                <el-form-item label="年级" prop="gradeYear">
+                    <el-select v-model="bachForm.gradeYear" placeholder="请选择年级">
+                        <el-option
+                                v-for="dict in sys_user_grade"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="parseInt(dict.value)"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="班级数量" prop="classCode">
+                    <el-input-number v-model="bachForm.bachaddSum" :min="1" :max="100" placeholder="数量"/>
+                </el-form-item>
+            </el-form>
+            <office-component :isRadio="1" ref="office_component_bach"
+                              @onSelected="onOfficeComponentSelect_bach"></office-component>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitFormBach">确 定</el-button>
+                    <el-button @click="cancelBach">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup name="Classmanager">
+    import {
+        listClassmanager,
+        listClassmanagerBy,
+        getClassmanager,
+        delClassmanager,
+        addClassmanager,
+        addClassmanagerBach,
+        updateClassmanager
+    } from "@/api/xjc-platform/classmanager"
+    import officeComponent from '@/views/xjccomponents/office_component.vue'
+
+
+    import {deptTreeSelect, deptTreeSelectDataScope} from "@/api/system/user"
+
+
+    const {proxy} = getCurrentInstance()
+    const {sys_user_grade} = proxy.useDict('sys_user_grade')
+
+    const classmanagerList = ref([])
+    const open = ref(false)
+    const openBach = ref(false)
+    const loading = ref(true)
+    const showSearch = ref(true)
+    const ids = ref([])
+    const single = ref(true)
+    const multiple = ref(true)
+    const total = ref(0)
+    const title = ref("")
+
+    const deptOptions = ref(undefined)
+    const enabledDeptOptions = ref(undefined)
+
+    const data = reactive({
+        form: {},
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            officeId: null,
+            gradeYear: null,
+            name: null,
+            teacherId: null,
+            classCode: null,
+            stageCode: null,
+            studentnumset: null,
+            samesubjects: null
+        },
+        rules: {},
+        //
+        bachForm: {}
+    })
+
+    const {queryParams, form, bachForm, rules} = toRefs(data)
+
+    const office_component = ref(null)
+    const office_component_bach = ref(null)
+
+    //显示学校选择器
+    function handleOfficeComponentSelect() {
+        office_component.value.setIsRadio("1")
+        office_component.value.show()
+    }
+
+    function onOfficeComponentSelect(row) {
+        data.form.officeId = row.id
+        data.form.officeName = row.name
+    }
+    //显示学校选择器_bach
+    function handleOfficeComponentSelect_bach() {
+        office_component_bach.value.setIsRadio("1")
+        office_component_bach.value.show()
+    }
+
+    function onOfficeComponentSelect_bach(row) {
+        data.bachForm.officeId = row.id
+        data.bachForm.officeName = row.name
+    }
+
+    /** 查询班级管理列表 */
+    function getList() {
+        loading.value = true
+        listClassmanagerBy(queryParams.value).then(response => {
+            classmanagerList.value = response.rows
+            total.value = response.total
+            loading.value = false
+        })
+    }
+
+    // 取消按钮
+    function cancel() {
+        open.value = false
+        reset()
+    }
+
+    // 表单重置
+    function reset() {
+        form.value = {
+            id: null,
+            officeId: null,
+            gradeYear: null,
+            name: null,
+            teacherId: null,
+            classCode: null,
+            stageCode: null,
+            delFlag: null,
+            updateBy: null,
+            updateTime: null,
+            createBy: null,
+            createTime: null,
+            studentnumset: null,
+            samesubjects: null
+        }
+        proxy.resetForm("classmanagerRef")
+        //
+    }
+
+    function resetAddBach() {
+        bachForm.value = {
+            bachaddSum: 1
+        }
+        proxy.resetForm("classmanagerAddBachRef")
+        //
+    }
+
+    /** 搜索按钮操作 */
+    function handleQuery() {
+        queryParams.value.pageNum = 1
+        getList()
+    }
+
+    /** 重置按钮操作 */
+    function resetQuery() {
+        proxy.resetForm("queryRef")
+        handleQuery()
+    }
+
+    // 多选框选中数据
+    function handleSelectionChange(selection) {
+        ids.value = selection.map(item => item.id)
+        single.value = selection.length != 1
+        multiple.value = !selection.length
+    }
+
+    /** 新增按钮操作 */
+    function handleAdd() {
+        reset()
+        open.value = true
+        title.value = "添加班级管理"
+    }
+
+
+    /** 修改按钮操作 */
+    function handleUpdate(row) {
+        reset()
+        const _id = row.id || ids.value
+        getClassmanager(_id).then(response => {
+            form.value = response.data
+            open.value = true
+            title.value = "修改班级管理"
+        })
+    }
+
+    /** 提交按钮 */
+    function submitForm() {
+        proxy.$refs["classmanagerRef"].validate(valid => {
+            if (valid) {
+                if (form.value.id != null) {
+                    updateClassmanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("修改成功")
+                        open.value = false
+                        getList()
+                    })
+                } else {
+                    addClassmanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("新增成功")
+                        open.value = false
+                        getList()
+                    })
+                }
+            }
+        })
+    }
+
+
+    /** 删除按钮操作 */
+    function handleDelete(row) {
+        const _ids = row.id || ids.value
+        proxy.$modal.confirm('是否确认删除班级管理编号为"' + _ids + '"的数据项?').then(function () {
+            return delClassmanager(_ids)
+        }).then(() => {
+            getList()
+            proxy.$modal.msgSuccess("删除成功")
+        }).catch(() => {
+        })
+    }
+
+    /** 导出按钮操作 */
+    function handleExport() {
+        proxy.download('platform/classmanager/export', {
+            ...queryParams.value
+        }, `classmanager_${new Date().getTime()}.xlsx`)
+    }
+
+    /** 查询部门下拉树结构 */
+    function getDeptTree() {
+        deptTreeSelectDataScope().then(response => {
+            deptOptions.value = response.data
+            enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(response.data)))
+        })
+    }
+
+    /** 过滤禁用的部门 */
+    function filterDisabledDept(deptList) {
+        return deptList.filter(dept => {
+            if (dept.disabled) {
+                return false
+            }
+            if (dept.children && dept.children.length) {
+                dept.children = filterDisabledDept(dept.children)
+            }
+            return true
+        })
+    }
+
+    /** 节点单击事件 */
+    function handleNodeClick(data) {
+        queryParams.value.deptId = data.id
+        handleQuery()
+    }
+
+    onMounted(() => {
+        getDeptTree()
+        getList()
+    })
+
+    //批量增加
+    function handleAddBach() {
+        resetAddBach()
+        openBach.value = true
+    }
+
+    //批量增加
+    function submitFormBach() {
+        addClassmanagerBach(bachForm.value).then(response => {
+            proxy.$modal.msgSuccess("新增成功")
+            openBach.value = false
+            getList()
+        })
+    }
+
+    function cancelBach() {
+        openBach.value = false
+        resetAddBach()
+    }
+
+
+</script>
+
+<style>
+    .class-theme {
+        display: flex;
+        flex-direction: row;
+    }
+</style>

+ 369 - 0
src/views/xjc-platform/office/index.vue

@@ -0,0 +1,369 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+            <el-form-item label="学校名称" prop="name">
+                <el-input
+                        v-model="queryParams.name"
+                        placeholder="请输入学校名称"
+                        clearable
+                        @keyup.enter="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item label="区域" prop="areaId">
+                <el-select v-model="queryParams.areaId" placeholder="请选择区域" clearable style="width: 168px">
+                    <el-option
+                            v-for="dict in gk_province"
+                            :key="dict.value"
+                            :label="dict.label"
+                            :value="dict.value"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="学校编码" prop="code">
+                <el-input
+                        v-model="queryParams.code"
+                        placeholder="请输入学校编码"
+                        clearable
+                        @keyup.enter="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item label="学段" prop="grade" style="width: 168px">
+                <el-select v-model="queryParams.grade" placeholder="请选择学段" clearable>
+                    <el-option
+                            v-for="dict in rank"
+                            :key="dict.value"
+                            :label="dict.label"
+                            :value="dict.value"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+                <el-button
+                        type="primary"
+                        plain
+                        icon="Plus"
+                        @click="handleAdd"
+                        v-hasPermi="['platform:office:add']"
+                >新增
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="success"
+                        plain
+                        icon="Edit"
+                        :disabled="single"
+                        @click="handleUpdate"
+                        v-hasPermi="['platform:office:edit']"
+                >修改
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="danger"
+                        plain
+                        icon="Delete"
+                        :disabled="multiple"
+                        @click="handleDelete"
+                        v-hasPermi="['platform:office:remove']"
+                >删除
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="warning"
+                        plain
+                        icon="Download"
+                        @click="handleExport"
+                        v-hasPermi="['platform:office:export']"
+                >导出
+                </el-button>
+            </el-col>
+            <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="officeList" @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55" align="center"/>
+            <el-table-column label="学校名称" align="center" prop="name"/>
+            <el-table-column label="区域" align="center" prop="areaId">
+                <template #default="scope">
+                    <dict-tag :options="gk_province" :value="scope.row.areaId"/>
+                </template>
+            </el-table-column>
+            <el-table-column label="学校编码" align="center" prop="code"/>
+            <el-table-column label="学段" align="center" prop="grade">
+                <template #default="scope">
+                    <dict-tag :options="rank" :value="scope.row.grade"/>
+                </template>
+            </el-table-column>
+            <el-table-column label="LOGO" align="center" prop="logo" width="100">
+                <template #default="scope">
+                    <image-preview :src="scope.row.logo" :width="50" :height="50"/>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                <template #default="scope">
+                    <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                               v-hasPermi="['platform:office:edit']">修改
+                    </el-button>
+                    <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                               v-hasPermi="['platform:office:remove']">删除
+                    </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"
+        />
+
+        <!-- 添加或修改学校对话框 -->
+        <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+            <el-form ref="officeRef" :model="form" :rules="rules" label-width="80px">
+                <el-form-item label="学校名称" prop="name">
+                    <el-input v-model="form.name" placeholder="请输入学校名称"/>
+                </el-form-item>
+                <el-form-item label="顺序" prop="sort">
+                    <el-input v-model="form.sort" placeholder="请输入顺序"/>
+                </el-form-item>
+                <el-form-item label="区域" prop="areaId">
+                    <el-select v-model="form.areaId" placeholder="请选择区域">
+                        <el-option
+                                v-for="dict in gk_province"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="学校编码" prop="code">
+                    <el-input v-model="form.code" placeholder="请输入学校编码"/>
+                </el-form-item>
+                <el-form-item label="学段" prop="grade">
+                    <el-select v-model="form.grade" placeholder="请选择学段">
+                        <el-option
+                                v-for="dict in rank"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="LOGO" prop="logo">
+                    <image-upload v-model="form.logo"/>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup name="Office">
+    import {listOffice, getOffice, delOffice, addOffice, updateOffice} from "@/api/xjc-platform/office"
+
+    const {proxy} = getCurrentInstance()
+    const {rank, gk_province} = proxy.useDict('rank', 'gk_province')
+
+    const officeList = ref([])
+    const open = ref(false)
+    const loading = ref(true)
+    const showSearch = ref(true)
+    const ids = ref([])
+    const single = ref(true)
+    const multiple = ref(true)
+    const total = ref(0)
+    const title = ref("")
+
+    const data = reactive({
+        form: {},
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            parentId: null,
+            parentIds: null,
+            name: null,
+            sort: null,
+            areaId: null,
+            code: null,
+            type: null,
+            grade: null,
+            address: null,
+            zipCode: null,
+            master: null,
+            phone: null,
+            fax: null,
+            email: null,
+            useable: null,
+            primaryPerson: null,
+            deputyPerson: null,
+            remarks: null,
+            category: null,
+            vip: null,
+            rank: null,
+            xjc: null,
+            xiaoyang: null,
+            xiaoyangid: null,
+            xyprefix: null,
+            logo: null,
+            xlpt: null,
+            fromtype: null,
+            xiaoyangsite: null
+        },
+        rules: {}
+    })
+
+    const {queryParams, form, rules} = toRefs(data)
+
+    /** 查询学校列表 */
+    function getList() {
+        loading.value = true
+        listOffice(queryParams.value).then(response => {
+            officeList.value = response.rows
+            total.value = response.total
+            loading.value = false
+        })
+    }
+
+    // 取消按钮
+    function cancel() {
+        open.value = false
+        reset()
+    }
+
+    // 表单重置
+    function reset() {
+        form.value = {
+            id: null,
+            parentId: null,
+            parentIds: null,
+            name: null,
+            sort: null,
+            areaId: null,
+            code: null,
+            type: null,
+            grade: null,
+            address: null,
+            zipCode: null,
+            master: null,
+            phone: null,
+            fax: null,
+            email: null,
+            useable: null,
+            primaryPerson: null,
+            deputyPerson: null,
+            createBy: null,
+            createTime: null,
+            updateBy: null,
+            updateTime: null,
+            remarks: null,
+            delFlag: null,
+            category: null,
+            vip: null,
+            rank: null,
+            xjc: null,
+            xiaoyang: null,
+            xiaoyangid: null,
+            xyprefix: null,
+            logo: null,
+            xlpt: null,
+            fromtype: null,
+            xiaoyangsite: null
+        }
+        proxy.resetForm("officeRef")
+    }
+
+    /** 搜索按钮操作 */
+    function handleQuery() {
+        queryParams.value.pageNum = 1
+        getList()
+    }
+
+    /** 重置按钮操作 */
+    function resetQuery() {
+        proxy.resetForm("queryRef")
+        handleQuery()
+    }
+
+    // 多选框选中数据
+    function handleSelectionChange(selection) {
+        ids.value = selection.map(item => item.id)
+        single.value = selection.length != 1
+        multiple.value = !selection.length
+    }
+
+    /** 新增按钮操作 */
+    function handleAdd() {
+        reset()
+        open.value = true
+        title.value = "添加学校"
+    }
+
+    /** 修改按钮操作 */
+    function handleUpdate(row) {
+        reset()
+        const _id = row.id || ids.value
+        getOffice(_id).then(response => {
+            form.value = response.data
+            open.value = true
+            title.value = "修改学校"
+        })
+    }
+
+    /** 提交按钮 */
+    function submitForm() {
+        proxy.$refs["officeRef"].validate(valid => {
+            if (valid) {
+                if (form.value.id != null) {
+                    updateOffice(form.value).then(response => {
+                        proxy.$modal.msgSuccess("修改成功")
+                        open.value = false
+                        getList()
+                    })
+                } else {
+                    addOffice(form.value).then(response => {
+                        proxy.$modal.msgSuccess("新增成功")
+                        open.value = false
+                        getList()
+                    })
+                }
+            }
+        })
+    }
+
+    /** 删除按钮操作 */
+    function handleDelete(row) {
+        const _ids = row.id || ids.value
+        proxy.$modal.confirm('是否确认删除学校编号为"' + _ids + '"的数据项?').then(function () {
+            return delOffice(_ids)
+        }).then(() => {
+            getList()
+            proxy.$modal.msgSuccess("删除成功")
+        }).catch(() => {
+        })
+    }
+
+    /** 导出按钮操作 */
+    function handleExport() {
+        proxy.download('platform/office/export', {
+            ...queryParams.value
+        }, `office_${new Date().getTime()}.xlsx`)
+    }
+
+    getList()
+</script>

+ 430 - 0
src/views/xjc-platform/studentmanager/index.vue

@@ -0,0 +1,430 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+            <el-form-item label="性别" prop="gender">
+                <el-select v-model="queryParams.gender" placeholder="请选择性别" clearable style="width: 186px;">
+                    <el-option
+                            v-for="dict in sys_user_sex"
+                            :key="dict.value"
+                            :label="dict.label"
+                            :value="dict.value"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+                <el-button
+                        type="primary"
+                        plain
+                        icon="Plus"
+                        @click="handleAdd"
+                        v-hasPermi="['xjc-platform:studentmanager:add']"
+                >新增
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="success"
+                        plain
+                        icon="Edit"
+                        :disabled="single"
+                        @click="handleUpdate"
+                        v-hasPermi="['xjc-platform:studentmanager:edit']"
+                >修改
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="danger"
+                        plain
+                        icon="Delete"
+                        :disabled="multiple"
+                        @click="handleDelete"
+                        v-hasPermi="['xjc-platform:studentmanager:remove']"
+                >删除
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="warning"
+                        plain
+                        icon="Download"
+                        @click="handleExport"
+                        v-hasPermi="['xjc-platform:studentmanager:export']"
+                >导出
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button type="info" plain icon="Upload" @click="handleImport"
+                           v-hasPermi="['xjc-platform:studentmanager:import']">导入
+                </el-button>
+            </el-col>
+            <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="studentmanagerList" @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55" align="center"/>
+            <el-table-column label="姓名 " align="center" prop="userName"/>
+            <el-table-column label="账号 " align="center" prop="nickName"/>
+            <el-table-column label="年级 " align="center" prop="gradeYear"/>
+            <el-table-column label="班级 " align="center" prop="className"/>
+            <el-table-column label="学校" align="center" prop="officeName"/>
+            <el-table-column label="性别" align="center" prop="gender">
+                <template #default="scope">
+                    <dict-tag :options="sys_user_sex" :value="scope.row.gender"/>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                <template #default="scope">
+                    <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                               v-hasPermi="['xjc-platform:studentmanager:edit']">修改
+                    </el-button>
+                    <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                               v-hasPermi="['xjc-platform:studentmanager:remove']">删除
+                    </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"
+        />
+
+        <!-- 添加或修改学生管理对话框 -->
+        <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+            <el-form ref="studentmanagerRef" :model="form" :rules="rules" label-width="80px">
+                <el-form-item label="学校" prop="officeId">
+                    <el-input v-model="form.officeName" placeholder="请选择学校" @click="handleOfficeComponentSelect"/>
+                </el-form-item>
+                <el-form-item label="年级" prop="gradeYear">
+                    <el-select v-model="form.gradeYear" placeholder="请选择年级">
+                        <el-option
+                                v-for="dict in sys_user_grade"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="parseInt(dict.value)"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+
+                <el-form-item label="班级 " prop="classid">
+                    <el-input v-model="form.className" placeholder="请选择班级 " @click="handleClassComponentSelect"/>
+                </el-form-item>
+                <el-form-item label="姓名" prop="officeId">
+                    <el-input v-model="form.nickName" placeholder="请输入学校"/>
+                </el-form-item>
+                <el-form-item label="账号" prop="officeId" v-if="form.userId == null">
+                    <el-input v-model="form.userName" placeholder="请输入账号"/>
+                </el-form-item>
+                <el-form-item label="性别" prop="gender">
+                    <el-select v-model="form.gender" placeholder="请选择性别">
+                        <el-option
+                                v-for="dict in sys_user_sex"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+            <office-component :isRadio="1" ref="office_component"
+                              @onSelected="onOfficeComponentSelect"></office-component>
+            <class-component :isRadio="1" ref="class_component" :officeId="data.form.officeId"
+                             :gradeYear="data.form.gradeYear"
+                             @onSelected="onClassComponentSelect"></class-component>
+        </el-dialog>
+
+
+        <!-- 学生导入对话框 -->
+        <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+            <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+                       :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+                       :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false"
+                       drag>
+                <el-icon class="el-icon--upload">
+                    <upload-filled/>
+                </el-icon>
+                <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                <template #tip>
+                    <div class="el-upload__tip text-center">
+                        <div class="el-upload__tip">
+                            <el-checkbox v-model="upload.updateSupport"/>
+                            是否更新已经存在的用户数据
+                        </div>
+                        <span>仅允许导入xls、xlsx格式文件。</span>
+                        <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
+                                 @click="importTemplate">下载模板
+                        </el-link>
+                    </div>
+                </template>
+            </el-upload>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitFileForm">确 定</el-button>
+                    <el-button @click="upload.open = false">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+
+
+    </div>
+</template>
+
+<script setup name="Studentmanager">
+    import {getToken} from "@/utils/auth"
+    import {
+        listStudentmanager,
+        getStudentmanager,
+        delStudentmanager,
+        addStudentmanager,
+        updateStudentmanager
+    } from "@/api/xjc-platform/studentmanager"
+    import officeComponent from '@/views/xjccomponents/office_component.vue'
+    import classComponent from '@/views/xjccomponents/class_component.vue'
+
+    const {proxy} = getCurrentInstance()
+    const {sys_user_sex, sys_user_grade} = proxy.useDict('sys_user_sex', 'sys_user_grade')
+
+    const studentmanagerList = ref([])
+    const open = ref(false)
+    const loading = ref(true)
+    const showSearch = ref(true)
+    const ids = ref([])
+    const single = ref(true)
+    const multiple = ref(true)
+    const total = ref(0)
+    const title = ref("")
+
+
+    /*** 用户导入参数 */
+    const upload = reactive({
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: {Authorization: "Bearer " + getToken()},
+        // 上传的地址
+        url: import.meta.env.VITE_APP_BASE_API + "/xjc-platform/studentmanager/importData"
+    })
+
+
+    const data = reactive({
+        form: {},
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            studentnum: null,
+            classid: null,
+            studentno: null,
+            gender: null,
+            aliasLoginName: null,
+            originalClassid: null,
+            userName: null,
+            nickName: null
+        },
+        rules: {}
+    })
+
+    const {queryParams, form, rules} = toRefs(data)
+
+    const office_component = ref(null)
+    const class_component = ref(null)
+
+    /** 查询学生管理列表 */
+    function getList() {
+        loading.value = true
+        listStudentmanager(queryParams.value).then(response => {
+            studentmanagerList.value = response.rows
+            total.value = response.total
+            loading.value = false
+        })
+    }
+
+    // 取消按钮
+    function cancel() {
+        open.value = false
+        reset()
+    }
+
+    // 表单重置
+    function reset() {
+        form.value = {
+            id: null,
+            studentnum: null,
+            classid: null,
+            studentno: null,
+            gender: null,
+            aliasLoginName: null,
+            delFlag: null,
+            updateBy: null,
+            updateTime: null,
+            createBy: null,
+            createTime: null,
+            originalClassid: null
+        }
+        proxy.resetForm("studentmanagerRef")
+    }
+
+    /** 搜索按钮操作 */
+    function handleQuery() {
+        queryParams.value.pageNum = 1
+        getList()
+    }
+
+    /** 重置按钮操作 */
+    function resetQuery() {
+        proxy.resetForm("queryRef")
+        handleQuery()
+    }
+
+    // 多选框选中数据
+    function handleSelectionChange(selection) {
+        ids.value = selection.map(item => item.id)
+        single.value = selection.length != 1
+        multiple.value = !selection.length
+    }
+
+    /** 新增按钮操作 */
+    function handleAdd() {
+        reset()
+        open.value = true
+        title.value = "添加学生管理"
+    }
+
+    /** 修改按钮操作 */
+    function handleUpdate(row) {
+        reset()
+        const _id = row.id || ids.value
+        getStudentmanager(_id).then(response => {
+            form.value = response.data
+            open.value = true
+            title.value = "修改学生管理"
+        })
+    }
+
+    /** 提交按钮 */
+    function submitForm() {
+        proxy.$refs["studentmanagerRef"].validate(valid => {
+            if (valid) {
+                if (form.value.id != null) {
+                    updateStudentmanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("修改成功")
+                        open.value = false
+                        getList()
+                    })
+                } else {
+                    addStudentmanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("新增成功")
+                        open.value = false
+                        getList()
+                    })
+                }
+            }
+        })
+    }
+
+    /** 删除按钮操作 */
+    function handleDelete(row) {
+        const _ids = row.id || ids.value
+        proxy.$modal.confirm('是否确认删除学生管理编号为"' + _ids + '"的数据项?').then(function () {
+            return delStudentmanager(_ids)
+        }).then(() => {
+            getList()
+            proxy.$modal.msgSuccess("删除成功")
+        }).catch(() => {
+        })
+    }
+
+    /** 导出按钮操作 */
+    function handleExport() {
+        proxy.download('xjc-platform/studentmanager/export', {
+            ...queryParams.value
+        }, `studentmanager_${new Date().getTime()}.xlsx`)
+    }
+
+    getList()
+    //添加业务
+    //显示学校选择器
+    function handleOfficeComponentSelect() {
+        office_component.value.setIsRadio("1")
+        office_component.value.show()
+    }
+
+    function onOfficeComponentSelect(row) {
+        form.value.officeId = row.id
+        form.value.officeName = row.name
+        form.value.deptId = row.deptId
+    }
+
+    //显示班级选择器
+
+    function handleClassComponentSelect() {
+        if (form.value.gradeYear == undefined || form.value.officeId == undefined) {
+            proxy.$modal.msgError("请选择学校和年级")
+        } else {
+            class_component.value.setIsRadio("1")
+            class_component.value.setGradeYear(data.form.gradeYear)
+            class_component.value.setOfficeId(data.form.officeId)
+            class_component.value.getList()
+            class_component.value.show()
+        }
+    }
+
+    function onClassComponentSelect(row) {
+        form.value.classid = row.id
+        form.value.className = row.name
+        form.value.officeId = row.officeId
+    }
+
+    /** 导入按钮操作 */
+    function handleImport() {
+        upload.title = "学生导入"
+        upload.open = true
+    }
+    /** 下载模板操作 */
+    function importTemplate() {
+        proxy.download("xjc-platform/studentmanager/importTemplate", {}, `studentmanager_template_${new Date().getTime()}.xlsx`)
+    }
+
+    /**文件上传中处理 */
+    const handleFileUploadProgress = (event, file, fileList) => {
+        upload.isUploading = true
+    }
+
+    /** 文件上传成功处理 */
+    const handleFileSuccess = (response, file, fileList) => {
+        upload.open = false
+        upload.isUploading = false
+        proxy.$refs["uploadRef"].handleRemove(file)
+        proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true})
+        getList()
+    }
+
+    /** 提交上传文件 */
+    function submitFileForm() {
+        proxy.$refs["uploadRef"].submit()
+    }
+
+
+</script>

+ 382 - 0
src/views/xjc-platform/teachermanager/index.vue

@@ -0,0 +1,382 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+            <el-form-item label="年级" prop="gradeYear">
+                <el-select style="width: 186px" v-model="queryParams.gradeYear" placeholder="请选择年级" clearable>
+                    <el-option
+                            v-for="dict in sys_user_grade"
+                            :key="dict.value"
+                            :label="dict.label"
+                            :value="dict.value"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="生日" prop="birth">
+                <el-date-picker clearable
+                                v-model="queryParams.birth"
+                                type="date"
+                                value-format="YYYY-MM-DD"
+                                placeholder="请选择生日">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item label="性别" prop="gender" style="width: 186px">
+                <el-select v-model="queryParams.gender" placeholder="请选择性别" clearable>
+                    <el-option
+                            v-for="dict in sys_user_sex"
+                            :key="dict.value"
+                            :label="dict.label"
+                            :value="dict.value"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="身份" prop="identity">
+                <el-input
+                        v-model="queryParams.identity"
+                        placeholder="请输入身份"
+                        clearable
+                        @keyup.enter="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item>
+                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+                <el-button
+                        type="primary"
+                        plain
+                        icon="Plus"
+                        @click="handleAdd"
+                        v-hasPermi="['platform:teachermanager:add']"
+                >新增
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="success"
+                        plain
+                        icon="Edit"
+                        :disabled="single"
+                        @click="handleUpdate"
+                        v-hasPermi="['platform:teachermanager:edit']"
+                >修改
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="danger"
+                        plain
+                        icon="Delete"
+                        :disabled="multiple"
+                        @click="handleDelete"
+                        v-hasPermi="['platform:teachermanager:remove']"
+                >删除
+                </el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-button
+                        type="warning"
+                        plain
+                        icon="Download"
+                        @click="handleExport"
+                        v-hasPermi="['platform:teachermanager:export']"
+                >导出
+                </el-button>
+            </el-col>
+            <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="teachermanagerList" @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55" align="center"/>
+            <el-table-column label="年级" align="center" prop="gradeYear">
+                <template #default="scope">
+                    <dict-tag :options="sys_user_grade" :value="scope.row.gradeYear"/>
+                </template>
+            </el-table-column>
+            <el-table-column label="性别" align="center" prop="gender">
+                <template #default="scope">
+                    <dict-tag :options="sys_user_sex" :value="scope.row.gender"/>
+                </template>
+            </el-table-column>
+            <el-table-column label="身份" align="center" prop="identity"/>
+            <el-table-column label="学校" align="center" prop="officeName"/>
+            <el-table-column label="用户账号" align="center" prop="userName"/>
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                <template #default="scope">
+                    <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                               v-hasPermi="['platform:teachermanager:edit']">修改
+                    </el-button>
+                    <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                               v-hasPermi="['platform:teachermanager:remove']">删除
+                    </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"
+        />
+
+        <!-- 添加或修改教师管理对话框 -->
+        <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+            <el-form ref="teachermanagerRef" :model="form" :rules="rules" label-width="80px">
+                <el-form-item label="学校" prop="officeId">
+                    <el-input v-model="form.officeName" placeholder="请选择学校" @click="handleOfficeComponentSelect"/>
+                </el-form-item>
+                <office-component :isRadio="1" ref="office_component"
+                                  @onSelected="onOfficeComponentSelect"></office-component>
+                <el-form-item label="姓名" prop="officeId">
+                    <el-input v-model="form.nickName" placeholder="请输入学校"/>
+                </el-form-item>
+                <el-form-item label="账号" prop="officeId">
+                    <el-input v-model="form.userName" placeholder="请输入账号"/>
+                </el-form-item>
+                <el-form-item label="性别" prop="gender">
+                    <el-select v-model="form.gender" placeholder="请选择性别">
+                        <el-option
+                                v-for="dict in sys_user_sex"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="身份(角色)" prop="identity">
+                    <el-select v-model="form.identity" placeholder="请选择身份" @change="identityChange">
+                        <el-option
+                                v-for="(item,index) in roleList"
+                                :key="index"
+                                :label="item.roleName"
+                                :value="item.roleId"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="年级" prop="gradeYear" v-show="showgradeYear">
+                    <el-select v-model="form.gradeYear" placeholder="请选择年级">
+                        <el-option
+                                v-for="dict in sys_user_grade"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="parseInt(dict.value)"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup name="Teachermanager">
+    import {
+        listTeachermanager,
+        getTeachermanager,
+        delTeachermanager,
+        addTeachermanager,
+        updateTeachermanager
+    } from "@/api/xjc-platform/teachermanager"
+    import {listRole} from "@/api/system/role"
+    import officeComponent from '@/views/xjccomponents/office_component.vue'
+
+    const {proxy} = getCurrentInstance()
+    const {sys_user_sex, sys_user_grade} = proxy.useDict('sys_user_sex', 'sys_user_grade')
+
+    const teachermanagerList = ref([])
+    const open = ref(false)
+    const loading = ref(true)
+    const showSearch = ref(true)
+    const ids = ref([])
+    const single = ref(true)
+    const multiple = ref(true)
+    const total = ref(0)
+    const title = ref("")
+
+    //角色
+    const roleList = ref([])
+    const showgradeYear = ref(false)
+
+    const data = reactive({
+        form: {},
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            gradeYear: null,
+            birth: null,
+            gender: null,
+            resume: null,
+            honor: null,
+            aliasLoginName: null,
+            updateDate: null,
+            createDate: null,
+            identity: null,
+            officeId: null,
+            deptId: null,
+            userId: null
+        },
+        rules: {}
+    })
+
+    const {queryParams, form, rules} = toRefs(data)
+    const office_component = ref(null)
+
+    /** 查询教师管理列表 */
+    function getList() {
+        loading.value = true
+        listTeachermanager(queryParams.value).then(response => {
+            teachermanagerList.value = response.rows
+            total.value = response.total
+            loading.value = false
+        })
+    }
+
+    // 取消按钮
+    function cancel() {
+        open.value = false
+        reset()
+    }
+
+    // 表单重置
+    function reset() {
+        form.value = {
+            id: null,
+            gradeYear: null,
+            birth: null,
+            gender: null,
+            resume: null,
+            honor: null,
+            aliasLoginName: null,
+            delFlag: null,
+            updateBy: null,
+            updateDate: null,
+            createBy: null,
+            createDate: null,
+            identity: null,
+            officeId: null,
+            deptId: null,
+            userId: null,
+            userName: null,
+            nickName: null
+        }
+        proxy.resetForm("teachermanagerRef")
+    }
+
+    /** 搜索按钮操作 */
+    function handleQuery() {
+        queryParams.value.pageNum = 1
+        getList()
+    }
+
+    /** 重置按钮操作 */
+    function resetQuery() {
+        proxy.resetForm("queryRef")
+        handleQuery()
+    }
+
+    // 多选框选中数据
+    function handleSelectionChange(selection) {
+        ids.value = selection.map(item => item.id)
+        single.value = selection.length != 1
+        multiple.value = !selection.length
+    }
+
+    /** 新增按钮操作 */
+    function handleAdd() {
+        getRoleList()
+        reset()
+        open.value = true
+        title.value = "添加教师管理"
+    }
+
+    /** 修改按钮操作 */
+    function handleUpdate(row) {
+        reset()
+        const _id = row.id || ids.value
+        getTeachermanager(_id).then(response => {
+            form.value = response.data
+            open.value = true
+            title.value = "修改教师管理"
+        })
+    }
+
+    /** 提交按钮 */
+    function submitForm() {
+        proxy.$refs["teachermanagerRef"].validate(valid => {
+            if (valid) {
+                if (form.value.id != null) {
+                    updateTeachermanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("修改成功")
+                        open.value = false
+                        getList()
+                    })
+                } else {
+                    addTeachermanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("新增成功")
+                        open.value = false
+                        getList()
+                    })
+                }
+            }
+        })
+    }
+
+    /** 删除按钮操作 */
+    function handleDelete(row) {
+        const _ids = row.id || ids.value
+        proxy.$modal.confirm('是否确认删除教师管理编号为"' + _ids + '"的数据项?').then(function () {
+            return delTeachermanager(_ids)
+        }).then(() => {
+            getList()
+            proxy.$modal.msgSuccess("删除成功")
+        }).catch(() => {
+        })
+    }
+
+    /** 导出按钮操作 */
+    function handleExport() {
+        proxy.download('platform/teachermanager/export', {
+            ...queryParams.value
+        }, `teachermanager_${new Date().getTime()}.xlsx`)
+    }
+
+    getList()
+    //添加业务
+    //显示学校选择器
+    function handleOfficeComponentSelect() {
+        office_component.value.setIsRadio("1")
+        office_component.value.show()
+    }
+
+    function onOfficeComponentSelect(row) {
+        data.form.officeId = row.id
+        data.form.officeName = row.name
+        data.form.deptId = row.deptId
+    }
+
+    /** 查询角色列表 */
+    function getRoleList() {
+        listRole(null).then(response => {
+            roleList.value = response.rows
+        })
+    }
+    function identityChange(e){
+        if(e == 120){
+            showgradeYear.value = true
+        }else{
+            showgradeYear.value = false
+            form.value.gradeYear = null
+        }
+    }
+
+</script>

+ 367 - 0
src/views/xjccomponents/class_component.vue

@@ -0,0 +1,367 @@
+<template>
+    <el-dialog title="班级选择" v-model="data.showFlag">
+        <div class="app-container">
+            <el-row :gutter="20">
+                <splitpanes class="class-theme">
+                    <!--部门数据-->
+                    <pane size="16">
+                        <el-col>
+                            <div class="head-container">
+                                <el-input v-model="deptName" placeholder="请输入部门名称" clearable prefix-icon="Search"
+                                          style="margin-bottom: 20px"/>
+                            </div>
+                            <div class="head-container">
+                                <el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }"
+                                         :expand-on-click-node="false" :filter-node-method="filterNode"
+                                         ref="deptTreeRef"
+                                         node-key="id" highlight-current default-expand-all
+                                         @node-click="handleNodeClick"/>
+                            </div>
+                        </el-col>
+                    </pane>
+                    <pane size="84">
+                        <el-col>
+                            <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"
+                                     label-width="68px">
+                                <el-form-item label="年级" prop="gradeYear">
+                                    <el-select v-model="queryParams.gradeYear" placeholder="请选择年级" clearable
+                                               style="width: 168px">
+                                        <el-option
+                                                v-for="dict in sys_user_grade"
+                                                :key="dict.value"
+                                                :label="dict.label"
+                                                :value="dict.value"
+                                        />
+                                    </el-select>
+                                </el-form-item>
+                                <el-form-item label="名称" prop="name">
+                                    <el-input
+                                            v-model="queryParams.name"
+                                            placeholder="请输入名称"
+                                            clearable
+                                            @keyup.enter="handleQuery"
+                                    />
+                                </el-form-item>
+                                <el-form-item label="班主任" prop="teacherId">
+                                    <el-input
+                                            v-model="queryParams.teacherId"
+                                            placeholder="请输入班主任"
+                                            clearable
+                                            @keyup.enter="handleQuery"
+                                    />
+                                </el-form-item>
+                                <el-form-item label="班级编码" prop="classCode">
+                                    <el-input
+                                            v-model="queryParams.classCode"
+                                            placeholder="请输入班级编码"
+                                            clearable
+                                            @keyup.enter="handleQuery"
+                                    />
+                                </el-form-item>
+
+                                <el-form-item>
+                                    <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                                    <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                                </el-form-item>
+                            </el-form>
+
+
+                            <el-table v-loading="loading" :data="classmanagerList"
+                                      @selection-change="handleSelectionChange">
+                                <el-table-column width="55" align="center" v-if="isRadio=='1'" fixed>
+                                    <template v-slot="scope">
+                                        <el-radio-group v-model="scope.row.selected">
+                                            <el-radio :value="scope.row.id" @click="handleRowChange(scope.row)">
+                                            </el-radio>
+                                        </el-radio-group>
+
+                                    </template>
+                                </el-table-column>
+
+
+                                <el-table-column label="年级" align="center" prop="gradeYear">
+                                    <template #default="scope">
+                                        <dict-tag :options="sys_user_grade" :value="scope.row.gradeYear"/>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column label="名称" align="center" prop="name"/>
+                                <el-table-column label="班主任" align="center" prop="teacherId"/>
+                                <el-table-column label="班级编码" align="center" prop="classCode"/>
+                                <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                                    <template #default="scope">
+                                        <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                                                   v-hasPermi="['platform:classmanager:edit']">修改
+                                        </el-button>
+                                        <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                                                   v-hasPermi="['platform:classmanager:remove']">删除
+                                        </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"
+                            />
+                        </el-col>
+                    </pane>
+                </splitpanes>
+            </el-row>
+        </div>
+    </el-dialog>
+
+</template>
+
+<script setup name="Classmanager">
+    import {
+        listClassmanager,
+        listClassmanagerBy,
+        getClassmanager,
+        delClassmanager,
+        addClassmanager,
+        updateClassmanager
+    } from "@/api/xjc-platform/classmanager"
+
+    import {deptTreeSelect, deptTreeSelectDataScope} from "@/api/system/user"
+
+    defineExpose({
+        show, setIsRadio, setGradeYear, setOfficeId,getList
+    })
+    const emit = defineEmits(["onSelected"])
+
+    const props = defineProps({
+        isRadio: Number,
+        officeId: String,
+        gradeYear: Number
+    })
+
+    function show() {
+        data.showFlag = true
+        classmanagerList.value.forEach(function (item, index) {
+            item.selected = false
+        })
+    }
+
+    function setIsRadio(value) {
+        data.isRadio = value
+    }
+
+    function setGradeYear(value) {
+        data.queryParams.gradeYear = value
+    }
+
+    function setOfficeId(value) {
+        data.queryParams.officeId = value
+    }
+
+
+    const {proxy} = getCurrentInstance()
+    const {sys_user_grade} = proxy.useDict('sys_user_grade')
+
+    const classmanagerList = ref([])
+    const open = ref(false)
+    const loading = ref(true)
+    const showSearch = ref(true)
+    const ids = ref([])
+    const single = ref(true)
+    const multiple = ref(true)
+    const total = ref(0)
+    const title = ref("")
+
+    const deptOptions = ref(undefined)
+    const enabledDeptOptions = ref(undefined)
+
+    const data = reactive({
+        showFlag: false,
+        form: {},
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            officeId: null,
+            gradeYear: null,
+            name: null,
+            teacherId: null,
+            classCode: null,
+            stageCode: null,
+            studentnumset: null,
+            samesubjects: null
+        },
+        rules: {},
+    })
+
+    const {queryParams, form, rules} = toRefs(data)
+
+
+    /** 查询班级管理列表 */
+    function getList() {
+        loading.value = true
+        listClassmanagerBy(queryParams.value).then(response => {
+            classmanagerList.value = response.rows
+            classmanagerList.value.forEach(function (item,index) {
+                item.selected = false
+            })
+            total.value = response.total
+            loading.value = false
+        })
+    }
+
+    // 取消按钮
+    function cancel() {
+        open.value = false
+        reset()
+    }
+
+    // 表单重置
+    function reset() {
+        form.value = {
+            id: null,
+            officeId: null,
+            gradeYear: null,
+            name: null,
+            teacherId: null,
+            classCode: null,
+            stageCode: null,
+            delFlag: null,
+            updateBy: null,
+            updateTime: null,
+            createBy: null,
+            createTime: null,
+            studentnumset: null,
+            samesubjects: null
+        }
+        proxy.resetForm("classmanagerRef")
+        //
+    }
+
+    /** 搜索按钮操作 */
+    function handleQuery() {
+        queryParams.value.pageNum = 1
+        getList()
+    }
+
+    /** 重置按钮操作 */
+    function resetQuery() {
+        proxy.resetForm("queryRef")
+        handleQuery()
+    }
+
+    // 多选框选中数据
+    function handleSelectionChange(selection) {
+        ids.value = selection.map(item => item.id)
+        single.value = selection.length != 1
+        multiple.value = !selection.length
+    }
+
+    /** 新增按钮操作 */
+    function handleAdd() {
+        reset()
+        open.value = true
+        title.value = "添加班级管理"
+    }
+
+
+    /** 修改按钮操作 */
+    function handleUpdate(row) {
+        reset()
+        const _id = row.id || ids.value
+        getClassmanager(_id).then(response => {
+            form.value = response.data
+            open.value = true
+            title.value = "修改班级管理"
+        })
+    }
+
+    /** 提交按钮 */
+    function submitForm() {
+        proxy.$refs["classmanagerRef"].validate(valid => {
+            if (valid) {
+                if (form.value.id != null) {
+                    updateClassmanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("修改成功")
+                        open.value = false
+                        getList()
+                    })
+                } else {
+                    addClassmanager(form.value).then(response => {
+                        proxy.$modal.msgSuccess("新增成功")
+                        open.value = false
+                        getList()
+                    })
+                }
+            }
+        })
+    }
+
+
+    /** 删除按钮操作 */
+    function handleDelete(row) {
+        const _ids = row.id || ids.value
+        proxy.$modal.confirm('是否确认删除班级管理编号为"' + _ids + '"的数据项?').then(function () {
+            return delClassmanager(_ids)
+        }).then(() => {
+            getList()
+            proxy.$modal.msgSuccess("删除成功")
+        }).catch(() => {
+        })
+    }
+
+    /** 导出按钮操作 */
+    function handleExport() {
+        proxy.download('platform/classmanager/export', {
+            ...queryParams.value
+        }, `classmanager_${new Date().getTime()}.xlsx`)
+    }
+
+    /** 查询部门下拉树结构 */
+    function getDeptTree() {
+        deptTreeSelectDataScope().then(response => {
+            deptOptions.value = response.data
+            enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(response.data)))
+        })
+    }
+
+    /** 过滤禁用的部门 */
+    function filterDisabledDept(deptList) {
+        return deptList.filter(dept => {
+            if (dept.disabled) {
+                return false
+            }
+            if (dept.children && dept.children.length) {
+                dept.children = filterDisabledDept(dept.children)
+            }
+            return true
+        })
+    }
+
+    /** 节点单击事件 */
+    function handleNodeClick(data) {
+        queryParams.value.deptId = data.id
+        handleQuery()
+    }
+
+    function handleRowChange(row) {
+        row.selected = true
+        data.showFlag = false
+        emit('onSelected', row)
+    }
+
+    onMounted(() => {
+        nextTick(() => {
+            getDeptTree()
+        })
+        // getList()
+        loading.value = false
+    })
+
+
+</script>
+
+<style>
+    .class-theme {
+        display: flex;
+        flex-direction: row;
+    }
+</style>

+ 416 - 0
src/views/xjccomponents/office_component.vue

@@ -0,0 +1,416 @@
+<template>
+    <el-dialog title="学校选择" v-model="data.showFlag">
+        <div class="app-container">
+            <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+                <el-form-item label="学校名称" prop="name">
+                    <el-input
+                            v-model="queryParams.name"
+                            placeholder="请输入学校名称"
+                            clearable
+                            @keyup.enter="handleQuery"
+                    />
+                </el-form-item>
+                <el-form-item label="区域" prop="areaId">
+                    <el-select v-model="queryParams.areaId" placeholder="请选择区域" clearable style="width: 168px">
+                        <el-option
+                                v-for="dict in gk_province"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                        />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="学校编码" prop="code">
+                    <el-input
+                            v-model="queryParams.code"
+                            placeholder="请输入学校编码"
+                            clearable
+                            @keyup.enter="handleQuery"
+                    />
+                </el-form-item>
+                <el-form-item label="学段" prop="grade" style="width: 168px">
+                    <el-select v-model="queryParams.grade" placeholder="请选择学段" clearable>
+                        <el-option
+                                v-for="dict in rank"
+                                :key="dict.value"
+                                :label="dict.label"
+                                :value="dict.value"
+                        />
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                    <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                </el-form-item>
+            </el-form>
+
+            <el-row :gutter="10" class="mb8">
+                <el-col :span="1.5">
+                    <el-button
+                            type="primary"
+                            plain
+                            icon="Plus"
+                            @click="handleAdd"
+                            v-hasPermi="['platform:office:add']"
+                    >新增
+                    </el-button>
+                </el-col>
+                <el-col :span="1.5">
+                    <el-button
+                            type="success"
+                            plain
+                            icon="Edit"
+                            :disabled="single"
+                            @click="handleUpdate"
+                            v-hasPermi="['platform:office:edit']"
+                    >修改
+                    </el-button>
+                </el-col>
+                <el-col :span="1.5">
+                    <el-button
+                            type="danger"
+                            plain
+                            icon="Delete"
+                            :disabled="multiple"
+                            @click="handleDelete"
+                            v-hasPermi="['platform:office:remove']"
+                    >删除
+                    </el-button>
+                </el-col>
+                <el-col :span="1.5">
+                    <el-button
+                            type="warning"
+                            plain
+                            icon="Download"
+                            @click="handleExport"
+                            v-hasPermi="['platform:office:export']"
+                    >导出
+                    </el-button>
+                </el-col>
+                <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+            </el-row>
+
+            <el-table v-loading="loading" :data="officeList" @selection-change="handleSelectionChange">
+
+                <el-table-column width="55" align="center" v-if="isRadio=='1'" fixed>
+                    <template v-slot="scope">
+                        <el-radio-group v-model="scope.row.selected">
+                            <el-radio :value="scope.row.id" @click="handleRowChange(scope.row)">
+                            </el-radio>
+                        </el-radio-group>
+
+                    </template>
+                </el-table-column>
+                <el-table-column type="selection" width="55" align="center" v-if="isRadio!='1'"/>
+                <el-table-column label="学校名称" align="center" prop="name"/>
+                <el-table-column label="区域" align="center" prop="areaId">
+                    <template #default="scope">
+                        <dict-tag :options="gk_province" :value="scope.row.areaId"/>
+                    </template>
+                </el-table-column>
+                <el-table-column label="学校编码" align="center" prop="code"/>
+                <el-table-column label="学段" align="center" prop="grade">
+                    <template #default="scope">
+                        <dict-tag :options="rank" :value="scope.row.grade"/>
+                    </template>
+                </el-table-column>
+                <el-table-column label="LOGO" align="center" prop="logo" width="100">
+                    <template #default="scope">
+                        <image-preview :src="scope.row.logo" :width="50" :height="50"/>
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                    <template #default="scope">
+                        <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                                   v-hasPermi="['platform:office:edit']">修改
+                        </el-button>
+                        <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                                   v-hasPermi="['platform:office:remove']">删除
+                        </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"
+            />
+
+            <!-- 添加或修改学校对话框 -->
+            <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+                <el-form ref="officeRef" :model="form" :rules="rules" label-width="80px">
+                    <el-form-item label="学校名称" prop="name">
+                        <el-input v-model="form.name" placeholder="请输入学校名称"/>
+                    </el-form-item>
+                    <el-form-item label="顺序" prop="sort">
+                        <el-input v-model="form.sort" placeholder="请输入顺序"/>
+                    </el-form-item>
+                    <el-form-item label="区域" prop="areaId">
+                        <el-select v-model="form.areaId" placeholder="请选择区域">
+                            <el-option
+                                    v-for="dict in gk_province"
+                                    :key="dict.value"
+                                    :label="dict.label"
+                                    :value="dict.value"
+                            ></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="学校编码" prop="code">
+                        <el-input v-model="form.code" placeholder="请输入学校编码"/>
+                    </el-form-item>
+                    <el-form-item label="学段" prop="grade">
+                        <el-select v-model="form.grade" placeholder="请选择学段">
+                            <el-option
+                                    v-for="dict in rank"
+                                    :key="dict.value"
+                                    :label="dict.label"
+                                    :value="dict.value"
+                            ></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="LOGO" prop="logo">
+                        <image-upload v-model="form.logo"/>
+                    </el-form-item>
+                </el-form>
+                <template #footer>
+                    <div class="dialog-footer">
+                        <el-button type="primary" @click="submitForm">确 定</el-button>
+                        <el-button @click="cancel">取 消</el-button>
+                    </div>
+                </template>
+            </el-dialog>
+        </div>
+    </el-dialog>
+</template>
+
+<script setup name="Office">
+    import {listOffice, getOffice, delOffice, addOffice, updateOffice} from "@/api/xjc-platform/office"
+
+    const {proxy} = getCurrentInstance()
+    const {rank, gk_province} = proxy.useDict('rank', 'gk_province')
+
+    const officeList = ref([])
+    const open = ref(false)
+    const loading = ref(true)
+    const showSearch = ref(true)
+    const ids = ref([])
+    const single = ref(true)
+    const multiple = ref(true)
+    const total = ref(0)
+    const title = ref("")
+
+    defineExpose({
+        show, setIsRadio
+    })
+    const emit = defineEmits(["onSelected"])
+
+    const shouShowRadio = (row) => {
+        return false
+    }
+    const data = reactive({
+
+        showFlag: false,
+
+        form: {},
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            parentId: null,
+            parentIds: null,
+            name: null,
+            sort: null,
+            areaId: null,
+            code: null,
+            type: null,
+            grade: null,
+            address: null,
+            zipCode: null,
+            master: null,
+            phone: null,
+            fax: null,
+            email: null,
+            useable: null,
+            primaryPerson: null,
+            deputyPerson: null,
+            remarks: null,
+            category: null,
+            vip: null,
+            rank: null,
+            xjc: null,
+            xiaoyang: null,
+            xiaoyangid: null,
+            xyprefix: null,
+            logo: null,
+            xlpt: null,
+            fromtype: null,
+            xiaoyangsite: null
+        },
+        rules: {}
+    })
+
+    const {queryParams, form, rules} = toRefs(data)
+
+    const props = defineProps({
+        isRadio : Number
+    })
+
+    function show() {
+        data.showFlag = true
+        officeList.value.forEach(function (item,index) {
+            item.selected = false
+        })
+    }
+
+    function setIsRadio(value) {
+        data.isRadio = value
+    }
+
+    function handleRowChange(row) {
+        row.selected = true
+        data.showFlag = false
+        emit('onSelected', row)
+    }
+
+    /** 查询学校列表 */
+    function getList() {
+        loading.value = true
+        listOffice(queryParams.value).then(response => {
+            officeList.value = response.rows
+            officeList.value.forEach(function (item,index) {
+                item.selected = false
+            })
+            total.value = response.total
+            loading.value = false
+        })
+    }
+
+    // 取消按钮
+    function cancel() {
+        open.value = false
+        reset()
+    }
+
+    // 表单重置
+    function reset() {
+        form.value = {
+            id: null,
+            parentId: null,
+            parentIds: null,
+            name: null,
+            sort: null,
+            areaId: null,
+            code: null,
+            type: null,
+            grade: null,
+            address: null,
+            zipCode: null,
+            master: null,
+            phone: null,
+            fax: null,
+            email: null,
+            useable: null,
+            primaryPerson: null,
+            deputyPerson: null,
+            createBy: null,
+            createTime: null,
+            updateBy: null,
+            updateTime: null,
+            remarks: null,
+            delFlag: null,
+            category: null,
+            vip: null,
+            rank: null,
+            xjc: null,
+            xiaoyang: null,
+            xiaoyangid: null,
+            xyprefix: null,
+            logo: null,
+            xlpt: null,
+            fromtype: null,
+            xiaoyangsite: null
+        }
+        proxy.resetForm("officeRef")
+    }
+
+    /** 搜索按钮操作 */
+    function handleQuery() {
+        queryParams.value.pageNum = 1
+        getList()
+    }
+
+    /** 重置按钮操作 */
+    function resetQuery() {
+        proxy.resetForm("queryRef")
+        handleQuery()
+    }
+
+    // 多选框选中数据
+    function handleSelectionChange(selection) {
+        ids.value = selection.map(item => item.id)
+        single.value = selection.length != 1
+        multiple.value = !selection.length
+    }
+
+    /** 新增按钮操作 */
+    function handleAdd() {
+        reset()
+        open.value = true
+        title.value = "添加学校"
+    }
+
+    /** 修改按钮操作 */
+    function handleUpdate(row) {
+        reset()
+        const _id = row.id || ids.value
+        getOffice(_id).then(response => {
+            form.value = response.data
+            open.value = true
+            title.value = "修改学校"
+        })
+    }
+
+    /** 提交按钮 */
+    function submitForm() {
+        proxy.$refs["officeRef"].validate(valid => {
+            if (valid) {
+                if (form.value.id != null) {
+                    updateOffice(form.value).then(response => {
+                        proxy.$modal.msgSuccess("修改成功")
+                        open.value = false
+                        getList()
+                    })
+                } else {
+                    addOffice(form.value).then(response => {
+                        proxy.$modal.msgSuccess("新增成功")
+                        open.value = false
+                        getList()
+                    })
+                }
+            }
+        })
+    }
+
+    /** 删除按钮操作 */
+    function handleDelete(row) {
+        const _ids = row.id || ids.value
+        proxy.$modal.confirm('是否确认删除学校编号为"' + _ids + '"的数据项?').then(function () {
+            return delOffice(_ids)
+        }).then(() => {
+            getList()
+            proxy.$modal.msgSuccess("删除成功")
+        }).catch(() => {
+        })
+    }
+
+    /** 导出按钮操作 */
+    function handleExport() {
+        proxy.download('platform/office/export', {
+            ...queryParams.value
+        }, `office_${new Date().getTime()}.xlsx`)
+    }
+
+    getList()
+</script>