Prechádzať zdrojové kódy

添加机构状态修改和资源状态修改的API接口;更新组件以响应状态更改事件并进行状态更新;重构路由配置,将路由集中管理;删除不再使用的路由文件;修复相关组件中方法名称与调用的一致性。

张涛 1 rok pred
rodič
commit
5df1273b5f

+ 8 - 0
src/apis/permission/org.js

@@ -12,6 +12,14 @@ export function QueryDeptDetail(deptId) {
   });
 }
 
+// 修改机构状态
+export function UpdateDeptStatus(data) {
+  return request({
+    url: `${prefix}/status`,
+    method: 'put',
+    data
+  });
+}
 // 修改机构
 export function UpdateDept(data) {
   return request({

+ 9 - 0
src/apis/permission/resource.js

@@ -18,6 +18,15 @@ export function QueryResourceDetail(menuId) {
   });
 }
 
+// 资源状态修改
+export function UpdateResourceStatus(data) {
+  return request({
+    url: `${prefix}/status`,
+    method: 'put',
+    data
+  });
+}
+
 // 修改菜单
 export function UpdateResource(data) {
   return request({

+ 1 - 0
src/index.js

@@ -18,6 +18,7 @@ import WujieVue from 'wujie-vue3';
 import App from './App.vue';
 
 import router from './router'; // 路由
+import './router/guard';
 import directive from './directive'; // 指令
 import { setupI18n } from './i18n';
 

+ 8 - 1
src/modules/permission/org/OrgForm.vue

@@ -4,7 +4,8 @@
       <a-input v-model="org_form.parentName" />
     </a-form-item>
     <a-form-item field="status" label="机构状态">
-      <a-switch checked-value="1" unchecked-value="0" v-model="org_form.status"></a-switch>
+      <a-switch v-model="org_form.status" @change="statusChange(org_form.status)" checked-value="1"
+        unchecked-value="0"></a-switch>
     </a-form-item>
     <a-form-item field="deptName" label="机构名称"
       :rules="[{ required: true, message: '机构名称必填' }, { maxLength: 50, message: '长度不超过50' }]">
@@ -32,6 +33,8 @@
 <script setup>
 import { toRefs } from 'vue';
 
+const emit = defineEmits(['statusChange']);
+
 // 接收父组件传入的参数
 const props = defineProps({
   org_form: {
@@ -51,6 +54,10 @@ const props = defineProps({
 // 将 props 解构
 const { org_form } = toRefs(props);
 
+const statusChange = (status) => {
+  emit('statusChange', status);
+}
+
 </script>
 
 <style lang="css" scoped></style>

+ 25 - 9
src/modules/permission/org/index.vue

@@ -10,16 +10,17 @@
     </div>
     <div class="right">
       <a-card title="详情" style="height: 100%">
-        <OrgForm :org_form="org_form" @save="orgFromSave" @reset="orgFromReset">
+        <OrgForm :org_form="org_form" @statusChange="resourceFromStatusChange" @save="resourceFromSave"
+          @reset="resourceFromReset">
           <template #actions>
-            <a-button v-hasPerm="'system:dept:edit'" @click="orgFromSave">保存</a-button>
-            <a-button @click="orgFromReset">重置</a-button>
+            <a-button v-hasPerm="'system:dept:edit'" @click="resourceFromSave">保存</a-button>
+            <a-button @click="resourceFromReset">重置</a-button>
           </template>
         </OrgForm>
       </a-card>
     </div>
 
-    <Modal :visible.sync="org_visible" @ok="orgFromSave" @cancel="orgFromCancel" :title="'新增'">
+    <Modal :visible.sync="org_visible" @ok="resourceFromSave" @cancel="resourceFromCancel" :title="'新增'">
       <OrgForm :org_form="org_form"></OrgForm>
     </Modal>
   </div>
@@ -32,7 +33,7 @@ import TreeParts from '../TreeParts.vue';
 import OrgForm from './OrgForm.vue';
 import Modal from '../Modal.vue';
 import { hasPermission } from '../../../utils/permission';
-import { QueryDeptDetail, UpdateDept, UpdateDeptParent, CreateDept, DeleteDept } from '../../../apis/permission/org';
+import { QueryDeptDetail, UpdateDept, UpdateDeptParent, UpdateDeptStatus, CreateDept, DeleteDept } from '../../../apis/permission/org';
 import { QueryDeptTree } from '../../../apis/permission/common';
 
 const org_visible = ref(false);
@@ -105,10 +106,25 @@ const onDeleteBtnClick = async ({ deptId }) => {
   getDeptTree();
 };
 
-const orgFromSave = async () => {
+const resourceFromStatusChange = async (status) => {
+  const data = {
+    deptId: org_form.deptId[0],
+    status,
+  }
+  const { code } = await UpdateDeptStatus(data);
+  if (code === 200) {
+    Message.success({
+      title: '状态更新',
+      content: '状态更新成功',
+    });
+    getDeptTree();
+  }
+}
+
+const resourceFromSave = async () => {
   const data = {
     ...org_form,
-    deptId: is_edit_mode.value && org_form.deptId ? org_form.deptId[0] : null
+    deptId: (is_edit_mode.value && org_form.deptId) ? org_form.deptId[0] : null
   };
 
   const apiCall = is_edit_mode.value ? UpdateDept : CreateDept;
@@ -126,7 +142,7 @@ const orgFromSave = async () => {
   }
 };
 
-const orgFromReset = () => {
+const resourceFromReset = () => {
   org_form.deptId = null;
   org_form.parentName = '';
   org_form.status = 0;
@@ -136,7 +152,7 @@ const orgFromReset = () => {
   org_form.address = '';
 };
 
-const orgFromCancel = () => {
+const resourceFromCancel = () => {
   is_edit_mode.value = true;
   org_visible.value = false;
 };

+ 7 - 1
src/modules/permission/resource/ResourceForm.vue

@@ -4,7 +4,8 @@
       <a-input v-model="resource_form.parentName" />
     </a-form-item>
     <a-form-item field="status" label="资源状态">
-      <a-switch checked-value="1" unchecked-value="0" v-model="resource_form.status"></a-switch>
+      <a-switch v-model="resource_form.status" @change="statusChange(resource_form.status)" checked-value="1"
+        unchecked-value="0"></a-switch>
     </a-form-item>
     <a-form-item field="menuName" label="资源名称"
       :rules="[{ required: true, message: '资源名称必填' }, { maxLength: 50, message: '长度不超过50' }]">
@@ -49,6 +50,8 @@ const uploadAction = '/api/v1/llm/upload'; // 替换为你的上传API
 const fileList = ref([]);
 const imageUrls = ref([]);
 
+const emit = defineEmits(['statusChange']);
+
 // 接收父组件传入的参数
 const props = defineProps({
   resource_form: {
@@ -101,6 +104,9 @@ const handleSuccess = (urls) => {
   });
   imageUrls.value = urlsArr; // 拿到上传的图片地址
 };
+const statusChange = (status) => {
+  emit('statusChange', status);
+}
 
 </script>
 

+ 17 - 4
src/modules/permission/resource/index.vue

@@ -11,7 +11,8 @@
 
     <div class="right">
       <a-card title="详情" style="height: 100%;">
-        <ResourceForm :resource_form="resource_form" @save="orgFromSave" @reset="orgFromReset">
+        <ResourceForm :resource_form="resource_form" @statusChange="orgFromStatusChange" @save="orgFromSave"
+          @reset="orgFromReset">
           <template #actions>
             <a-button v-hasPerm="'system:resource:edit'" @click="orgFromSave">保存</a-button>
             <a-button @click="orgFromReset">重置</a-button>
@@ -34,7 +35,7 @@ import ResourceForm from './ResourceForm.vue';
 import Modal from '../Modal.vue';
 import { hasPermission } from '../../../utils/permission';
 import {
-  QueryResourceTree, QueryResourceDetail, UpdateResource, CreateResource, DeleteResource
+  QueryResourceTree, QueryResourceDetail, UpdateResourceStatus, UpdateResource, CreateResource, DeleteResource,
 } from '../../../apis/permission/resource';
 
 const resourcevisible = ref(false);
@@ -117,10 +118,22 @@ const onDeleteBtnClick = async ({ menuId }) => {
   }
   getResourceTree();
 }
+const orgFromStatusChange = async (status) => {
+  const data = {
+    menuId: resource_form.resourceId[0],
+    status,
+  }
+  const { code } = await UpdateResourceStatus(data);
+  if (code === 200) {
+    Message.success({
+      title: '状态更新',
+      content: '状态更新成功',
+    });
+    getResourceTree();
+  }
+}
 
 const orgFromSave = async () => {
-  console.log('is_edit_mode.value', is_edit_mode.value)
-  console.log('resource_form.resourceId', resource_form.resourceId)
   const data = {
     ...resource_form,
     menuId: (is_edit_mode.value && resource_form.resourceId) ? resource_form.resourceId[0] : null

+ 5 - 6
src/modules/permission/role/index.vue

@@ -294,7 +294,7 @@ const handlePermissionConfigSave = async (checked_menu) => {
   permission_config_visible.value = false;
   const params = {
     roleId: edit_form.roleId,
-    menuIds: checked_menu,
+    resources: checked_menu,
     editType: 2
   };
   const { code } = await UpdateRole(params);
@@ -311,15 +311,14 @@ const handleDeptConfig = async (record, visible) => {
   if (record) {
     edit_form.roleId = record.roleId;
     current_record.value = record;
-    // const { code, data: { rows } } = await QueryUserDept(record.roleId);
-    // if (code === 200) {
-    //   console.log('rows', rows)
-    //   // dept_list.value = rows;
-    // }
   }
   dept_config_visible.value = visible;
 };
 
+// 资源状态修改无效
+// 菜单级别没有返回
+// 用户下菜单权限不对
+
 const handleDeptConfigSave = async (dept_ids) => {
   dept_config_visible.value = false;
   const params = {

+ 0 - 14
src/router.js

@@ -1,14 +0,0 @@
-import { createWebHashHistory, createRouter } from 'vue-router';
-
-import routes from './router/index.js';
-
-/**
- * 配置路由方案
- * @see https://router.vuejs.org/zh/guide/#%E5%88%9B%E5%BB%BA%E8%B7%AF%E7%94%B1%E5%99%A8%E5%AE%9E%E4%BE%8B
- */
-const router = createRouter({
-  history: createWebHashHistory(),
-  routes
-});
-
-export default router;

+ 25 - 7
src/router/guard.js

@@ -1,8 +1,26 @@
-import router from './route';
-import { localST_RoutesList } from './base/storage';
+import router from './index';
+import { localST_RoutesList, kuky_Authorization } from '../base/storage';
 
-console.log('router', JSON.parse(localST_RoutesList.getItem()));
-
-router.beforeEach((to, from, next) => {
-  const routesList = JSON.parse(localST_RoutesList.getItem());
-});
+// /** 免登录白名单 */
+const whiteList = ['/login', '/reg'];
+// router.beforeEach((to, from, next) => {
+//   if (kuky_Authorization.get()) {
+//     if (to.path === '/login') {
+//       // 如果已经登录,并准备进入 Login 页面,则重定向到主页
+//       next();
+//     } else {
+//       // 如果已经登录,但准备进入其他页面,则判断是否有访问权限
+//       const accessRoutes = JSON.parse(localST_RoutesList.getItem());
+//       console.log('accessRoutes', accessRoutes);
+//     }
+//   } else {
+//     // 如果没有 Token
+//     if (whiteList.includes(to.path)) {
+//       // 如果在免登录的白名单中,则直接进入
+//       next();
+//     } else {
+//       // 其他没有访问权限的页面将被重定向到登录页面
+//       next('/login');
+//     }
+//   }
+// });

+ 8 - 51
src/router/index.js

@@ -1,53 +1,10 @@
-import Home from '../views/Home.vue';
+import { createRouter, createWebHashHistory } from 'vue-router';
+import { systemRoutes } from './route';
 
-/**
- * 路由表配置
- */
-const routes = [
-  { path: '/', component: Home, redirect: '/chat/qa' },
+const router = createRouter({
+  history: createWebHashHistory(),
+  routes: [...systemRoutes],
+  scrollBehavior: () => ({ left: 0, top: 0 })
+});
 
-  // 登录与注册
-  { path: '/login', component: () => import('../views/Login.vue') },
-  { path: '/reg', component: () => import('../views/Register.vue') },
-
-  // 会话
-  { path: '/chat', component: () => import('../views/Conversation.vue') },
-  { path: '/chat/qa', component: () => import('../views/ConversationQA.vue') },
-  { path: '/chat/history', component: () => import('../views/ConversationHistory.vue') },
-  { path: '/chat/board', component: () => import('../views/ConversationBoard.vue') },
-
-  // 知识库
-  { path: '/knowledge', component: () => import('../views/Knowledge.vue') },
-  { path: '/knowledge/detail', component: () => import('../views/KnowledgeDetail.vue') },
-  // 模型
-  { path: '/model', component: () => import('../views/Model.vue') },
-  // Agent
-  { path: '/agent', component: () => import('../views/Agent.vue') },
-  // 智能体
-  { path: '/intelligent', component: () => import('../views/Intelligent.vue') },
-  // dify智能体详情
-  { path: '/intelligent/detail', component: () => import('../views/difyDetail.vue') },
-
-  // 权限管理
-  {
-    path: '/permission',
-    component: () => import('../views/layout/LayoutPermission.vue'),
-    children: [
-      { path: '/permission/account', component: () => import('../views/PermissionAccount.vue') },
-      { path: '/permission/org', component: () => import('../views/PermissionOrganization.vue') },
-      { path: '/permission/resource', component: () => import('../views/PermissionResource.vue') },
-      { path: '/permission/role', component: () => import('../views/PermissionRole.vue') },
-      { path: '/permission/group', component: () => import('../views/PermissionGroup.vue') }
-    ]
-  },
-
-  // 个人中心
-  { path: '/profile', component: () => import('../views/Profiles.vue') },
-  { path: '/setting', component: () => import('../views/Settings.vue') },
-
-  { path: '/xiaoshu', component: () => import('../views/Xiaoshu.vue') },
-
-  { path: '/about', component: () => import('../views/About.vue') }
-];
-
-export default routes;
+export default router;

+ 1 - 3
src/router/route.js

@@ -3,7 +3,7 @@ import Home from '../views/Home.vue';
 /**
  * 路由表配置
  */
-const routes = [
+export const systemRoutes = [
   { path: '/', component: Home, redirect: '/chat/qa' },
 
   // 登录与注册
@@ -49,5 +49,3 @@ const routes = [
 
   { path: '/about', component: () => import('../views/About.vue') }
 ];
-
-export default routes;