Просмотр исходного кода

feat:新增权限相关API及调整角色管理功能,优化输入组件样式,修正变量名及事件处理,完善权限配置模态框功能。

张涛 1 год назад
Родитель
Сommit
21ea2be5b3

+ 27 - 0
src/apis/permission/common.js

@@ -0,0 +1,27 @@
+import request from '../../base/ajax';
+
+// 知识库列表
+export function QueryknowledgeList() {
+  const params = {
+    current: 1,
+    pageSize: 999
+  };
+  return request({
+    url: '/api/knowledge/list',
+    method: 'get',
+    params
+  });
+}
+
+// 智能体列表
+export function QueryDialogList() {
+  const params = {
+    current: 1,
+    pageSize: 999
+  };
+  return request({
+    url: '/api/dialog/list',
+    method: 'get',
+    params
+  });
+}

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

@@ -0,0 +1,11 @@
+import request from '../../base/ajax';
+
+const prefix = '/api/menu';
+
+// 查询角色列表
+export function QueryMenuTree() {
+  return request({
+    url: `${prefix}/tree_select`,
+    method: 'get'
+  });
+}

+ 34 - 1
src/apis/permission/role.js

@@ -2,7 +2,7 @@ import request from '../../base/ajax';
 
 const prefix = '/api/role';
 
-// 获取用角色列表
+// 查询角色列表
 export function QueryRoleList(params) {
   return request({
     url: `${prefix}/list`,
@@ -10,3 +10,36 @@ export function QueryRoleList(params) {
     params
   });
 }
+// 创建角色
+export function CreateRole(data) {
+  return request({
+    url: `${prefix}/add_role`,
+    method: 'post',
+    data
+  });
+}
+// 编辑角色
+export function UpdateRole(data) {
+  return request({
+    url: `${prefix}/edit_role`,
+    method: 'put',
+    data
+  });
+}
+
+// 切换用户状态
+export function RoleStatusSwitch(data) {
+  return request({
+    url: `${prefix}/change_status`,
+    method: 'put',
+    data
+  });
+}
+
+// 删除角色
+export function DeleteRole(userId) {
+  return request({
+    url: `${prefix}/delete_role/${userId}`,
+    method: 'delete'
+  });
+}

+ 10 - 28
src/modules/intelligent/TopSetting.vue

@@ -1,12 +1,7 @@
 <template>
   <a-space size="large">
-    <a-input
-      v-model="searchText"
-      :placeholder="$t('management.search')"
-      style="width: 300px"
-      allow-clear
-      @input="handleSearch"
-    >
+    <a-input v-model="searchText" :placeholder="$t('management.search')" style="width: 300px" allow-clear
+      @input="handleSearch">
       <template #prefix>
         <icon-search />
       </template>
@@ -18,26 +13,14 @@
       {{ $t('management.createIntelligent') }}
     </a-button>
   </a-space>
-  <ModalAddIntel
-    v-model:visible="visible"
-    @add_intelligent="addIntelligent"
-    @createRAGFLOWIntelligent="createRAGFLOWIntelligent"
-  ></ModalAddIntel>
-  <ModelAddItem
-    v-model:show_model_item="show_model_item"
-    :target_icon="target_icon"
-    :target_intell_type="target_intell_type"
-    @select_icon="selectIcon"
-    @updateIntelligentList="updateIntelligentList"
-  ></ModelAddItem>
+  <ModalAddIntel v-model:visible="visible" @add_intelligent="addIntelligent"
+    @createRAGFLOWIntelligent="createRAGFLOWIntelligent"></ModalAddIntel>
+  <ModelAddItem v-model:show_model_item="show_model_item" :target_icon="target_icon"
+    :target_intell_type="target_intell_type" @select_icon="selectIcon" @updateIntelligentList="updateIntelligentList">
+  </ModelAddItem>
   <ModelSelectIcon v-model:show_select_icon="show_select_icon" @sendIcon="sendIcon"></ModelSelectIcon>
-  <AgentConfig
-    v-model:show_rg_config="show_rg_config"
-    ref="editAgentKuai"
-    :typeAngint="add_type"
-    :formData="itemObj"
-    @queryList="queryList"
-  ></AgentConfig>
+  <AgentConfig v-model:show_rg_config="show_rg_config" ref="editAgentKuai" :typeAngint="add_type" :formData="itemObj"
+    @queryList="queryList"></AgentConfig>
 </template>
 
 <script setup>
@@ -144,8 +127,7 @@ bus_intelligentEdit.on((item) => {
   }
 });
 </script>
-<style scoped lang="scss"></style>
-<style>
+<style scoped lang="css">
 .arco-input-wrapper {
   background-color: var(--color-bg-5);
 }

+ 3 - 9
src/modules/knowledge/TopSetting.vue

@@ -1,12 +1,7 @@
 <template>
   <a-space size="large">
-    <a-input
-      v-model="searchText"
-      :placeholder="$t('management.search')"
-      style="width: 300px"
-      allow-clear
-      @input="handleSearch"
-    >
+    <a-input v-model="searchText" :placeholder="$t('management.search')" style="width: 300px" allow-clear
+      @input="handleSearch">
       <template #prefix>
         <icon-search />
       </template>
@@ -43,8 +38,7 @@ const handleCreate = () => {
   visible.value = true;
 };
 </script>
-<style scoped lang="scss"></style>
-<style>
+<style scoped lang="css">
 .arco-input-wrapper {
   background-color: var(--color-bg-5);
 }

+ 3 - 10
src/modules/permission/account/AccountForm.vue

@@ -32,7 +32,7 @@
     </a-row>
     <a-row :gutter="24">
       <!-- 编辑则不显示密码 -->
-      <a-col v-if="!edit_mode" :span="12">
+      <a-col v-if="!is_edit_mode" :span="12">
         <a-form-item field="pwd" label="密码">
           <a-input v-model="edit_form.pwd" type="pwd" />
         </a-form-item>
@@ -52,14 +52,11 @@ import { toRefs } from 'vue';
 
 const props = defineProps({
   edit_form: Object,
-  edit_mode: Boolean,
+  is_edit_mode: Boolean,
   roles: Array,
 });
 
-// 事件发射器
-const emit = defineEmits(['ok', 'cancel']);
-
-const { edit_form, edit_mode, roles } = toRefs(props);
+const { edit_form, is_edit_mode, roles } = toRefs(props);
 
 // 角色变化处理
 const roleChange = (selectedRoles) => {
@@ -67,7 +64,3 @@ const roleChange = (selectedRoles) => {
   edit_form.role = selectedRoles;
 }
 </script>
-
-<style lang="css" scoped>
-/* 这里可以添加自定义样式 */
-</style>

+ 14 - 12
src/modules/permission/account/index.vue

@@ -1,6 +1,6 @@
 <template>
   <a-card class="account-page-card">
-    <Action :btn_text="'新建用户组'" @searchClick="searchClick" @resetClick="resetClick" @createClick="createClick"
+    <Action :btn_text="'新建账号'" @searchClick="searchClick" @resetClick="resetClick" @createClick="createClick"
       @sizeChange="table_size_change" @refreshClick="refreshClick"></Action>
     <DataTable :data="table_data" :columns="table_columns" row-key="userId" :size="table_size" :loading="table_loading"
       :pagination="pagination_props" @pageChange="handlePageChange">
@@ -21,9 +21,9 @@
     </DataTable>
   </a-card>
 
-  <Modal :visible.sync="edit_visible" @ok="editModalSave" @cancel="handleEdit(null, false)"
-    :title="edit_mode ? '编辑' : '新增'">
-    <AccountForm :edit_form="edit_form" :edit_mode="edit_mode" />
+  <Modal :visible.sync="edit_visible" @ok="modalSave" @cancel="handleEdit(null, false)"
+    :title="is_edit_mode ? '编辑' : '新增'">
+    <AccountForm :edit_form="edit_form" :is_edit_mode="is_edit_mode" />
   </Modal>
 
   <ViewPermission :visible.sync="view_permission_visible" @cancel="handleView(null, false)"
@@ -69,7 +69,7 @@ const table_loading = ref(false);
 
 // 编辑表单相关
 const edit_visible = ref(false);
-const edit_mode = ref(false);
+const is_edit_mode = ref(false);
 const edit_form = reactive({
   userName: '',
   userName: '',
@@ -269,7 +269,7 @@ const createClick = () => {
   edit_form.email = '';
   edit_form.pwd = '';
   edit_form.role = [];
-  edit_mode.value = false;
+  is_edit_mode.value = false;
   edit_visible.value = true;
 }
 const refreshClick = () => {
@@ -304,7 +304,11 @@ const statusChange = async (record) => {
       });
     }
   } else {
-
+    record.status = '0';
+    Message.warning({
+      title: '提示',
+      content: '如想启用用户,需进行部门配置.',
+    });
   }
 };
 //重置密码
@@ -319,9 +323,7 @@ const handleResetPassword = async (record) => {
 }
 
 const handleEdit = (record, visible) => {
-
   if (record) {
-
     edit_form.userName = record.userName;
     edit_form.loginName = record.loginName;
     edit_form.phone = record.phone;
@@ -329,7 +331,7 @@ const handleEdit = (record, visible) => {
     edit_form.pwd = record.pwd;
     edit_form.role = record.role;
 
-    edit_mode.value = true;
+    is_edit_mode.value = true;
   }
 
   edit_visible.value = visible;
@@ -371,12 +373,12 @@ const handleDelete = async (userId) => {
   if (code === 200) {
     Message.success({
       title: '删除用户',
-      content: '该用户已删除',
+      content: '删除成功',
     });
     getUserList();
   }
 }
-const editModalSave = () => {
+const modalSave = () => {
   edit_visible.value = false;
 }
 const table_size_change = (size) => {

+ 158 - 29
src/modules/permission/role/PermissionConfigModal.vue

@@ -9,19 +9,64 @@
     </a-tabs>
     <div style="display: flex;">
       <a-card class="card-body" :title="getCurrentTabTitle" hoverable>
-        <a-tree :data="dept_list" v-model:checked-keys="checked_keys" v-model:expanded-keys="expand_kdys"
-          :checkable="true" :show-line="true" @check="onCheck" :fieldNames="{
-            key: 'deptId',
-            title: 'deptName',
+        <a-tree v-if="selected_tab_key === '1'" :data="menu_list" v-model="checked_menu"
+          v-model:expanded-keys="expand_kdys" :checkable="true" :show-line="true" @check="onCheck" :fieldNames="{
+            key: 'menuId',
+            title: 'menuName',
             children: 'children',
           }">
         </a-tree>
+
+        <a-checkbox-group v-if="selected_tab_key === '2'" v-model="checked_knowledge" @change="onCheckKnowledge">
+          <a-checkbox v-for="(knowledg, index) of knowledge_list" :value="knowledg.id" :lable="knowledg.name"
+            style="width:150px">
+            {{ knowledg.name }}
+          </a-checkbox>
+        </a-checkbox-group>
+
+        <a-checkbox-group v-if="selected_tab_key === '3'" v-model="checked_agents" @change="onCheckAgents">
+          <a-checkbox v-for="(agents, index) of agents_list" :value="agents.id" :lable="agents.name"
+            style="width:150px">
+            {{ agents.name }}
+          </a-checkbox>
+        </a-checkbox-group>
+
+        <a-checkbox-group v-if="selected_tab_key === '4'" v-model="checked_model" @change="onCheckModel">
+          <a-checkbox v-for="(model, index) of model_list" :value="model.id" :lable="model.name" style="width:150px">
+            {{ model.name }}
+          </a-checkbox>
+        </a-checkbox-group>
+
       </a-card>
       <a-card class="card-body" title="角色所有权限">
-        <div style="margin-bottom: 8px;">菜单功能:</div>
+        <div style="margin: 8px 0;">菜单功能:</div>
+        <a-space wrap>
+          <a-tag v-for="(tag, index) of checked_menu_list" :key="tag.menuId">
+            {{ tag.menuName }}
+          </a-tag>
+        </a-space>
+        <a-divider />
+
+        <div style="margin: 8px 0;">知识库功能:</div>
+        <a-space wrap>
+          <a-tag v-for="(tag, index) of checked_knowledge_list" :key="tag.id">
+            {{ tag.name }}
+          </a-tag>
+        </a-space>
+        <a-divider />
+
+        <div style="margin: 8px 0;">智能体功能:</div>
+        <a-space wrap>
+          <a-tag v-for="(tag, index) of checked_agents_list" :key="tag.id">
+            {{ tag.name }}
+          </a-tag>
+        </a-space>
+        <a-divider />
+
+        <div style="margin: 8px 0;">模型功能:</div>
         <a-space wrap>
-          <a-tag v-for="(tag, index) of check_strictly" :key="tag.deptId">
-            {{ tag.deptName }}
+          <a-tag v-for="(tag, index) of checked_model_list" :key="tag.id">
+            {{ tag.name }}
           </a-tag>
         </a-space>
       </a-card>
@@ -35,14 +80,26 @@ import { ref, toRefs, onMounted, computed } from 'vue';
 // 定义组件的 props 和 emits
 const props = defineProps({
   visible: Boolean,
-  dept_list: {
+  menu_list: {
+    type: Array,
+    default: () => []
+  },
+  knowledge_list: {
+    type: Array,
+    default: () => []
+  },
+  agents_list: {
+    type: Array,
+    default: () => []
+  },
+  model_list: {
     type: Array,
     default: () => []
   },
   record: Object
 });
 
-const { visible, dept_list, record } = toRefs(props);
+const { visible, menu_list, knowledge_list, agents_list, model_list, record } = toRefs(props);
 
 const emit = defineEmits(['getActiveTab', 'close', 'ok']);
 
@@ -55,16 +112,24 @@ const tabs = [
 const selected_tab_key = ref(tabs[0].key);
 
 // 组件内部状态
-const checked_keys = ref([]);
 // 默认展开第一节
 const expand_kdys = ref(['0']);
-const check_strictly = ref([]);
+
+const checked_menu = ref([]);
+const checked_menu_list = ref([]);
+const checked_knowledge = ref([]);
+const checked_knowledge_list = ref([]);
+const checked_agents = ref([]);
+const checked_agents_list = ref([])
+const checked_model = ref([]);
+const checked_model_list = ref([])
+
 
 // 递归取消所有子节点的选择
 const cancelChildSelection = (node, selectedNodes) => {
   if (node.children && node.children.length > 0) {
     node.children.forEach(child => {
-      const childIndex = selectedNodes.findIndex(val => val.deptId === child.deptId);
+      const childIndex = selectedNodes.findIndex(val => val.menuId === child.menuId);
       if (childIndex !== -1) {
         // 取消子节点的选择
         selectedNodes.splice(childIndex, 1);
@@ -77,19 +142,75 @@ const cancelChildSelection = (node, selectedNodes) => {
 
 // 处理树形组件的勾选变化
 const onCheck = (newCheckedKeys, event) => {
-  const o = { deptId: event.node.deptId, deptName: event.node.deptName };
+  const node = event.node;
+  const menuItem = { menuId: node.menuId, menuName: node.menuName, children: node.children };
   if (event.checked) {
-    // 添加部门
-    check_strictly.value.push(o);
+    // 递归勾选部门所有子节点
+    function addChildren(menuItem) {
+      // 首先将当前menuItem添加到数组中
+      checked_menu_list.value.push(menuItem);
+
+      // 检查menuItem是否有children属性,并且它是一个数组
+      if (menuItem.children && Array.isArray(menuItem.children)) {
+        // 遍历children,对每个子项递归调用addChildren函数
+        menuItem.children.forEach(child => {
+          addChildren(child);
+        });
+      }
+    }
+    addChildren(menuItem);
   } else {
     // 移除部门
-    const deptIndex = check_strictly.value.findIndex((val) => val.deptId === event.node.deptId);
-    check_strictly.value.splice(deptIndex, 1);
+    const deptIndex = checked_menu_list.value.findIndex((val) => val.menuId === event.node.menuId);
+    checked_menu_list.value.splice(deptIndex, 1);
+
+    // 递归移除子节点的勾选
+    function cancelChildSelection(node, selectedNodes) {
+      if (node.children && node.children.length > 0) {
+        node.children.forEach(child => {
+          const childIndex = selectedNodes.findIndex(val => val.menuId === child.menuId);
+          if (childIndex !== -1) {
+            // 取消子节点的选择
+            selectedNodes.splice(childIndex, 1);
+            // 递归取消子节点的选择
+            cancelChildSelection(child, selectedNodes);
+          }
+        });
+      }
+    }
     // 递归取消所有子节点的选择
-    cancelChildSelection(event.node, check_strictly.value);
+    cancelChildSelection(event.node, checked_menu_list.value);
+  }
+};
+
+const onCheckboxCheck = (newCheckedKeys, event, collection) => {
+  let o = {
+    id: event.target.value,
+    name: event.target.labels[0].innerText,
+  };
+  if (event.target.checked) {
+    collection.value.push(o);
+  } else {
+    collection.value.forEach((val, idx, array) => {
+      if (val['id'] == event.target.value) {
+        collection.value.splice(idx, 1);
+        return true;
+      }
+    });
   }
 };
 
+const onCheckKnowledge = (newCheckedKeys, event) => {
+  onCheckboxCheck(newCheckedKeys, event, checked_knowledge_list);
+
+};
+const onCheckAgents = (newCheckedKeys, event) => {
+  onCheckboxCheck(newCheckedKeys, event, checked_agents_list);
+};
+const onCheckModel = (newCheckedKeys, event) => {
+  onCheckboxCheck(newCheckedKeys, event, checked_model_list);
+};
+
 const handleTabChange = (key) => {
   const currentTab = tabs.find(tab => tab.key === key);
   emit('getActiveTab', currentTab);
@@ -102,7 +223,14 @@ const handleCancel = () => {
 
 // 处理确认事件
 const editDeptHandleOk = () => {
-  emit('ok', { checkedKeys: checked_keys.value });
+  emit('ok', {
+    checkedKeys: {
+      menu: checked_menu.value,
+      knowledge: checked_knowledge.value,
+      agents: checked_agents.value,
+      model: checked_model.value
+    }
+  });
 };
 
 const getCurrentTabTitle = computed(() => {
@@ -112,16 +240,17 @@ const getCurrentTabTitle = computed(() => {
 
 onMounted(() => {
   // 处理传入的部门数据
-  if (record?.dept) {
-    record.dept.forEach((val) => {
-      check_strictly.value.push({
-        deptId: val.deptId,
-        deptName: val.deptName
-      });
-      checked_keys.value.push(val.deptId);
-      expand_kdys.value.push(val.deptId);
-    });
-  }
+  // TODO功能 回显
+  // if (record?.dept) {
+  //   record.dept.forEach((val) => {
+  //     checked_menu_list.value.push({
+  //       menuId: val.menuId,
+  //       menuName: val.menuName
+  //     });
+  //     checked_menu.value.push(val.menuId);
+  //     expand_kdys.value.push(val.menuId);
+  //   });
+  // }
 
 });
 </script>

+ 31 - 0
src/modules/permission/role/RoleForm.vue

@@ -0,0 +1,31 @@
+<template>
+  <a-form :model="edit_form" auto-label-width>
+    <a-row :gutter="24">
+      <a-col :span="22">
+        <a-form-item field="roleName" label="用户名" :rules="[
+          { required: true, message: '用户名必填' },
+        ]">
+          <a-input v-model="edit_form.roleName" />
+        </a-form-item>
+      </a-col>
+    </a-row>
+    <a-row :gutter="24">
+      <a-col :span="22">
+        <a-form-item field="remark" label="备注">
+          <a-textarea v-model="edit_form.remark" />
+        </a-form-item>
+      </a-col>
+    </a-row>
+  </a-form>
+</template>
+
+<script setup>
+import { toRefs } from 'vue';
+const props = defineProps({
+  edit_form: Object,
+  is_edit_mode: Boolean,
+  roles: Array,
+});
+
+const { edit_form } = toRefs(props);
+</script>

+ 119 - 82
src/modules/permission/role/index.vue

@@ -1,32 +1,32 @@
 <template>
   <a-card class="account-page-card">
-    <Action :btn_text="'新建用户组'" @searchClick="searchClick" @resetClick="resetClick" @createClick="createClick"
+    <Action :btn_text="'新建角色'" @searchClick="searchClick" @resetClick="resetClick" @createClick="createClick"
       @sizeChange="table_size_change" @refreshClick="refreshClick"></Action>
-    <DataTable :data="table_data" :columns="table_columns" row-key="userId" :size="table_size" :loading="table_loading"
+    <DataTable :data="table_data" :columns="table_columns" row-key="roleId" :size="table_size" :loading="table_loading"
       :pagination="pagination_props" @pageChange="handlePageChange">
       <template #status="{ record }">
         <a-switch v-model="record.status" @change="statusChange(record)" checked-value="1" unchecked-value="0" />
       </template>
       <template #operationSlot="{ record }">
-        <a-popconfirm content="确定重置该账号密码吗?" @ok="handleResetPassword(record)">
-          <a-button type="text">重制密码</a-button>
-        </a-popconfirm>
         <a-button type="text" @click="handleEdit(record, true)">编辑</a-button>
         <a-button type="text" @click="handlePermissionConfig(record, true)">权限配置</a-button>
         <a-button type="text" @click="handleDeptConfig(record, true)">部门配置</a-button>
-        <a-popconfirm content="确定删除该条数据吗?" type="warning" @ok="handleDelete(record.userId)">
+        <a-popconfirm content="确定删除该条数据吗?" type="warning" @ok="handleDelete(record.roleId)">
           <a-button type="text" status="warning">删除</a-button>
         </a-popconfirm>
       </template>
     </DataTable>
   </a-card>
 
-  <Modal :visible.sync="edit_visible" @ok="editModalSave" @cancel="handleEdit(null, false)" :title="'编辑'">
-    <AccountForm :edit_form="edit_form" />
+  <Modal :visible.sync="edit_visible" @ok="modalSave" @cancel="handleEdit(null, false)"
+    :title="is_edit_mode ? '编辑' : '新增'">
+    <RoleForm :edit_form="edit_form" :is_edit_mode="is_edit_mode" />
   </Modal>
 
   <!-- TODO -->
-  <PermissionConfigModal :visible.sync="permission_config_visible" @cancel="handlePermissionConfig(null, false)" />
+  <PermissionConfigModal :visible.sync="permission_config_visible" :menu_list="menu_list"
+    :knowledge_list="knowledge_list" :agents_list="agents_list" @getActiveTab="handlePermissionModalTab"
+    @ok="handlePermissionConfigSave" @cancel="handlePermissionConfig(null, false)" />
 
   <DeptConfigModal :visible.sync="dept_config_visible" :dept_list="dept_list" :record="current_record" @ok=""
     @cancel="handleDeptConfig(null, false)" />
@@ -39,20 +39,21 @@ import { Message } from '@arco-design/web-vue';
 import DataTable from '../../../views/permission/DataTable.vue';
 import Action from '../../../views/permission/Action.vue';
 import Modal from '../Modal.vue';
-import AccountForm from './AccountForm.vue';
+import RoleForm from './RoleForm.vue';
 import PermissionConfigModal from './PermissionConfigModal.vue';
 import DeptConfigModal from './DeptConfigModal.vue';
 
-import { QueryRoleList, } from '../../../apis/permission/role';
+import { QueryRoleList, RoleStatusSwitch, DeleteRole, CreateRole, UpdateRole } from '../../../apis/permission/role';
+import { QueryMenuTree } from '../../../apis/permission/resource';
+// TODO接口 模型tabs接口还没有
+import { QueryknowledgeList, QueryDialogList } from '../../../apis/permission/common';
 
 const keywords = ref('');
 // 表格相关
 const table_data = ref([]);
 const table_columns = ref([
   { title: '序号', slotName: 'index' },
-  { title: '用户名', dataIndex: 'userName', titleSlotName: 'userName' },
-  { title: '角色', dataIndex: 'roleName', titleSlotName: 'roleName' },
-  { title: '所属部门', dataIndex: 'deptName', titleSlotName: 'deptName' },
+  { title: '角色名', dataIndex: 'roleName', titleSlotName: 'roleName' },
   { title: '状态', dataIndex: 'status', slotName: 'status' },
   { title: '操作', dataIndex: 'operation', slotName: 'operationSlot' },
 ]);
@@ -66,21 +67,17 @@ const table_loading = ref(false);
 
 // 编辑表单相关
 const edit_visible = ref(false);
+const is_edit_mode = ref(false);
 const edit_form = reactive({
-  userName: '',
-  userName: '',
-  phone: '',
-  email: '',
-  pwd: '',
-  role: []
+  roleName: '',
+  remark: '',
 });
 
 // 权限配置相关
 const permission_config_visible = ref(false);
-const menu_permissions_list = ref([])
-const knowledge_permissions_list = ref([])
-const dialog_permissions_list = ref([])
-const agent_permissions_list = ref([])
+const menu_list = ref([]);
+const knowledge_list = ref([]);
+const agents_list = ref([]);
 
 // 部门配置相关
 const dept_config_visible = ref(false);
@@ -211,7 +208,7 @@ const dept_list = ref([
   }
 ]);
 
-const getUserList = async () => {
+const gerRoleList = async () => {
   const params = {
     keyword: keywords.value,
     current: pagination_props.value.current,
@@ -232,19 +229,16 @@ const getUserList = async () => {
 
 const searchClick = (value) => {
   keywords.value = value;
-  getUserList();
+  gerRoleList();
 }
 const resetClick = () => {
   keywords.value = '';
-  getUserList();
+  gerRoleList();
 }
 const createClick = () => {
-  edit_form.userName = '';
-  edit_form.loginName = '';
-  edit_form.phone = '';
-  edit_form.email = '';
-  edit_form.pwd = '';
-  edit_form.role = [];
+  edit_form.roleName = '';
+  edit_form.remark = '';
+  is_edit_mode.value = false;
   edit_visible.value = true;
 }
 const refreshClick = () => {
@@ -254,7 +248,7 @@ const refreshClick = () => {
 // 切换页码
 const handlePageChange = (current) => {
   pagination_props.value.current = current;
-  getUserList();
+  gerRoleList();
 };
 
 // TODO功能 状态切换拦截
@@ -266,41 +260,26 @@ const beforeStatusChange = async () => {
 
 // 用户状态切换
 const statusChange = async (record) => {
-  if (record?.dept) {
-    const params = {
-      userId: record.userId,
-      status: record.status,
-    };
-    const { code } = await UserStatusSwitch(params)
-    if (code === 200) {
-      Message.success({
-        title: '成功',
-        content: '状态切换成功.',
-      });
-    }
-  } else {
-
-  }
-};
-//重置密码
-const handleResetPassword = async (record) => {
-  const { code } = await ResetPassword(record.userId);
+  const params = {
+    roleId: record.roleId,
+    status: record.status,
+  };
+  const { code } = await RoleStatusSwitch(params)
   if (code === 200) {
     Message.success({
-      title: '重置密码',
-      content: '该用户密码重置为000000',
+      title: '成功',
+      content: '状态切换成功.',
     });
   }
-}
+};
 
 const handleEdit = (record, visible) => {
   if (record) {
-    edit_form.userName = record.userName;
-    edit_form.loginName = record.loginName;
-    edit_form.phone = record.phone;
-    edit_form.email = record.email;
-    edit_form.pwd = record.pwd;
-    edit_form.role = record.role;
+    edit_form.roleId = record.roleId;
+    edit_form.roleName = record.roleName;
+    edit_form.remark = record.remark;
+
+    is_edit_mode.value = true;
   }
 
   edit_visible.value = visible;
@@ -308,51 +287,109 @@ const handleEdit = (record, visible) => {
 // 权限配置
 const handlePermissionConfig = async (record, visible) => {
   if (record) {
-    const { code, data } = await QueryUserPermission(record.userId);
-    if (code === 200) {
-      const { knowledge, menu, dialog } = data;
-      if (dialog && dialog.length > 0) dialog_permissions_list.value = dialog
-      if (menu && menu.length > 0) menu_permissions_list.value = menu
-      if (knowledge && knowledge.length > 0) knowledge_permissions_list.value = knowledge
-    }
+    edit_form.roleId = record.roleId;
+    getConfigList('1');
   }
   permission_config_visible.value = visible;
 }
+
+const handlePermissionModalTab = (tab) => {
+  if (tab.key) getConfigList(tab.key);
+}
+
+const handlePermissionConfigSave = async (data) => {
+  permission_config_visible.value = false;
+  console.log('data', data)
+  const { menu, knowledge, agents, model } = data.checkedKeys;
+  // TODO询问 接口
+  // const params = {
+  //   roleId: edit_form.roleId,
+  //   menuIds: menu_list.value.map((item) => item.menuId).join(','),
+  //   knowledgeIds: knowledge_list.value.map((item) => item.knowledgeId).join(','),
+  //   agentIds: agents_list.value.map((item) => item.agentId).join(','),
+  // };
+  // const { code } = await UpdateRole(params);
+  // if (code === 200) {
+  //   Message.success({
+  //     title: '权限配置',
+  //     content: '权限配置成功',
+  //   });
+  // }
+}
+
 // 部门配置
 const handleDeptConfig = async (record, visible) => {
   if (record) {
-    current_record.value = record;
-    const { code, data: { rows } } = await QueryUserDept(record.userId);
-    if (code === 200) {
-      // TODO接口 机构接上再接这个
-      console.log('rows', rows)
-      // dept_list.value = rows;
-    }
+    // 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 handleDelete = async (userId) => {
-  const { code } = await DeleteUser(userId);
+const handleDelete = async (roleId) => {
+  const { code } = await DeleteRole(roleId);
   if (code === 200) {
     Message.success({
       title: '删除用户',
-      content: '该用户已删除',
+      content: '删除成功',
     });
-    getUserList();
+    gerRoleList();
   }
 }
-const editModalSave = () => {
+const modalSave = async () => {
   edit_visible.value = false;
+  const data = {
+    roleId: is_edit_mode.value ? edit_form.roleId : undefined,
+    roleName: edit_form.roleName,
+    editType: is_edit_mode.value ? 1 : undefined,
+    remark: edit_form.remark,
+  };
+
+  const apiCall = is_edit_mode.value ? UpdateRole : CreateRole;
+  const { code } = await apiCall(data);
+
+  if (code === 200) {
+    const action = is_edit_mode.value ? '编辑' : '新增';
+    Message.success({
+      title: `${action}用户`,
+      content: `${action}成功`,
+    });
+    gerRoleList();
+  }
 }
+
 const table_size_change = (size) => {
   table_size.value = size;
 }
 
+const getConfigList = async (tabsKey) => {
+  if (tabsKey === '1') {
+    const { code, data: { rows } } = await QueryMenuTree();
+    if (code === 200) {
+      menu_list.value = rows;
+    }
+  }
+  if (tabsKey === '2') {
+    const { code, data: { rows } } = await QueryknowledgeList();
+    if (code === 200) {
+      knowledge_list.value = rows;
+    }
+  }
+  if (tabsKey === '3') {
+    const { code, data: { rows } } = await QueryDialogList();
+    if (code === 200) {
+      agents_list.value = rows;
+    }
+  }
+}
 
 onMounted(() => {
-  getUserList()
+  gerRoleList()
 })
 </script>
 

+ 2 - 1
src/views/PermissionRole.vue

@@ -1,7 +1,7 @@
 <template>
   <ContentContainer>
     <BreadCrumbMenu :current_label="'角色'" />
-    <div class="permission-role">权限管理: 角色</div>
+    <RolePage />
   </ContentContainer>
 </template>
 
@@ -9,4 +9,5 @@
 import ContentContainer from './layout/ContentContainer.vue';
 import BreadCrumbMenu from './common/BreadCrumbMenu.vue';
 
+import RolePage from '../modules/permission/role/index.vue';
 </script>