index.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <template>
  2. <a-card class="account-page-card">
  3. <Action :btn_text="'新建用户组'" @searchClick="searchClick" @resetClick="resetClick" @createClick="createClick"
  4. @sizeChange="tableSizeChange" @refreshClick="refreshClick"></Action>
  5. <DataTable :data="table_data" :columns="table_columns" row-key="groupId" :size="table_size" :loading="table_loading"
  6. :pagination="pagination_props" @pageChange="handlePageChange">
  7. <template #status="{ record }">
  8. <a-switch v-model="record.status" @change="statusChange(record)" checked-value="1" unchecked-value="0" />
  9. </template>
  10. <template #operationSlot="{ record }">
  11. <a-button type="text" @click="handleEdit(record, true)">编辑</a-button>
  12. <a-button type="text" @click="handleMembertConfig(record, true)">成员管理</a-button>
  13. <a-button type="text" @click="handlePermissionConfig(record, true)">权限管理</a-button>
  14. <a-popconfirm content="确定删除该条数据吗?" type="warning" @ok="handleDelete(record.groupId)">
  15. <a-button type="text" status="warning">删除</a-button>
  16. </a-popconfirm>
  17. </template>
  18. </DataTable>
  19. </a-card>
  20. <Modal :visible.sync="edit_visible" @ok="modalSave" @cancel="handleEdit(null, false)"
  21. :title="is_edit_mode ? '编辑' : '新增'">
  22. <GroupForm :edit_form="edit_form" :is_edit_mode="is_edit_mode" />
  23. </Modal>
  24. <MembertConfigModal :visible.sync="membert_config_visible" :memberList="memberList"
  25. :selectedMemberList="selectedMemberList" @ok="membertConfigModalSave"
  26. @update:selectedMemberList="updateSelectedMemberList" @cancel="handleMembertConfig(null, false)"
  27. @close="handleMembertConfig(null, false)" />
  28. <!-- TODO -->
  29. <PermissionConfigModal :visible.sync="permission_config_visible" :knowledge_list="knowledge_list"
  30. :agents_list="agents_list" :model_list="model_list" :record="current_record"
  31. @getActiveTab="handlePermissionModalTab" @ok="handlePermissionConfigSave"
  32. @cancel="handlePermissionConfig(null, false)" />
  33. </template>
  34. <script setup>
  35. import { ref, reactive, onMounted } from 'vue';
  36. import { Message } from '@arco-design/web-vue';
  37. import DataTable from '../../../views/permission/DataTable.vue';
  38. import Action from '../../../views/permission/Action.vue';
  39. import Modal from '../Modal.vue';
  40. import GroupForm from './GroupForm.vue';
  41. import MembertConfigModal from './MembertConfigModal.vue';
  42. import PermissionConfigModal from './PermissionConfigModal.vue';
  43. import { QueryGroupList, QueryGroupUsers, SaveGroupUsers, ConfigGroupResource, GroupStatusSwitch, DeleteGroup, CreateGroup, UpdateGroup } from '../../../apis/permission/gruop';
  44. // TODO接口 模型tabs接口还没有
  45. import { QueryAllKnowledgeList, QueryAllDialogList } from '../../../apis/permission/common';
  46. const keywords = ref('');
  47. // 表格相关
  48. const table_data = ref([]);
  49. const table_columns = ref([
  50. { title: '序号', width: 80, slotName: 'index' },
  51. { title: '组名称', dataIndex: 'groupName', width: 150, titleSlotName: 'groupName' },
  52. { title: '描述', dataIndex: 'description', ellipsis: true, tooltip: true, titleSlotName: 'description' },
  53. { title: '状态', dataIndex: 'status', slotName: 'status' },
  54. { title: '操作', dataIndex: 'operation', slotName: 'operationSlot' },
  55. ]);
  56. const pagination_props = ref({
  57. total: 10,
  58. current: 1,
  59. pageSize: 12,
  60. })
  61. const table_size = ref('medium');
  62. const table_loading = ref(false);
  63. const current_record = ref(null);
  64. // 编辑表单相关
  65. const edit_visible = ref(false);
  66. const is_edit_mode = ref(false);
  67. const edit_form = reactive({
  68. groupName: '',
  69. description: '',
  70. });
  71. // 成员管理相关
  72. const membert_config_visible = ref(false);
  73. const memberList = ref([]);
  74. const selectedMemberList = ref([]);
  75. // 权限管理相关
  76. const permission_config_visible = ref(false);
  77. const knowledge_list = ref([]);
  78. const agents_list = ref([]);
  79. const model_list = ref([]);
  80. const getGroupList = async () => {
  81. const params = {
  82. keyword: keywords.value,
  83. current: pagination_props.value.current,
  84. pageSize: pagination_props.value.pageSize,
  85. };
  86. table_loading.value = true
  87. const { code, data } = await QueryGroupList(params);
  88. if (code === 200) {
  89. pagination_props.value.total = data.total;
  90. table_data.value = data.items;
  91. table_loading.value = false
  92. } else {
  93. table_loading.value = false
  94. }
  95. }
  96. const searchClick = (value) => {
  97. keywords.value = value;
  98. getGroupList();
  99. }
  100. const resetClick = () => {
  101. keywords.value = '';
  102. getGroupList();
  103. }
  104. const createClick = () => {
  105. edit_form.groupName = '';
  106. edit_form.description = '';
  107. is_edit_mode.value = false;
  108. edit_visible.value = true;
  109. }
  110. const refreshClick = () => {
  111. console.log('刷新')
  112. }
  113. // 切换页码
  114. const handlePageChange = (current) => {
  115. pagination_props.value.current = current;
  116. getGroupList();
  117. };
  118. // TODO功能 状态切换拦截
  119. const beforeStatusChange = async () => {
  120. await new Promise((resolve, reject) => setTimeout(() => {
  121. resolve()
  122. }, 1000))
  123. }
  124. // 用户状态切换
  125. const statusChange = async (record) => {
  126. const params = {
  127. id: record.groupId,
  128. status: record.status,
  129. };
  130. const { code } = await GroupStatusSwitch(params)
  131. if (code === 200) {
  132. Message.success({
  133. title: '成功',
  134. content: '状态切换成功.',
  135. });
  136. }
  137. };
  138. const handleEdit = (record, visible) => {
  139. if (record) {
  140. edit_form.groupId = record.groupId;
  141. edit_form.groupName = record.groupName;
  142. edit_form.description = record.description;
  143. is_edit_mode.value = true;
  144. }
  145. edit_visible.value = visible;
  146. }
  147. // 成员管理
  148. const handleMembertConfig = async (record, visible) => {
  149. if (record) {
  150. const { code, data: { inGroup, notInGroup } } = await QueryGroupUsers(record.groupId);
  151. if (code === 200) {
  152. const allUsers = [...inGroup, ...notInGroup];
  153. memberList.value = allUsers.map((item) => {
  154. return {
  155. label: item.userName,
  156. value: item.userId,
  157. };
  158. });
  159. selectedMemberList.value = inGroup.map((item) => item.userId);
  160. }
  161. }
  162. membert_config_visible.value = visible;
  163. }
  164. // 成员管理保存
  165. const membertConfigModalSave = async (selectedMemberList) => {
  166. const data = {
  167. id: current_record.value.groupId,
  168. userList: selectedMemberList,
  169. };
  170. const { code } = await SaveGroupUsers(data);
  171. if (code === 200) {
  172. Message.success({
  173. title: '成员管理',
  174. content: '成员修改成功',
  175. });
  176. membert_config_visible.value = false;
  177. getGroupList();
  178. }
  179. }
  180. const updateSelectedMemberList = (newSelection) => {
  181. selectedMemberList.value = newSelection;
  182. };
  183. // 权限配置
  184. const handlePermissionConfig = async (record, visible) => {
  185. if (record) {
  186. current_record.value = record;
  187. edit_form.groupId = record.groupId;
  188. getConfigList('1');
  189. }
  190. permission_config_visible.value = visible;
  191. }
  192. const handlePermissionModalTab = (tab) => {
  193. if (tab.key) getConfigList(tab.key);
  194. }
  195. const handlePermissionConfigSave = async ({ checkedKeys }) => {
  196. permission_config_visible.value = false;
  197. const { knowledge, agents, model } = checkedKeys;
  198. const data = {
  199. id: edit_form.groupId,
  200. knowledges: knowledge,
  201. dialogs: agents,
  202. llms: model,
  203. };
  204. const { code } = await ConfigGroupResource(data);
  205. if (code === 200) {
  206. Message.success({
  207. title: '权限配置',
  208. content: '权限配置成功',
  209. });
  210. getGroupList();
  211. }
  212. }
  213. // 删除用户
  214. const handleDelete = async (groupId) => {
  215. const { code } = await DeleteGroup(groupId);
  216. if (code === 200) {
  217. Message.success({
  218. title: '删除用户',
  219. content: '删除成功',
  220. });
  221. getGroupList();
  222. }
  223. }
  224. const modalSave = async () => {
  225. edit_visible.value = false;
  226. const data = {
  227. id: is_edit_mode.value ? edit_form.groupId : undefined,
  228. ...edit_form
  229. };
  230. const apiCall = is_edit_mode.value ? UpdateGroup : CreateGroup;
  231. const { code } = await apiCall(data);
  232. if (code === 200) {
  233. const action = is_edit_mode.value ? '编辑' : '新增';
  234. Message.success({
  235. title: `${action}用户`,
  236. content: `${action}成功`,
  237. });
  238. getGroupList();
  239. }
  240. }
  241. const tableSizeChange = (size) => {
  242. table_size.value = size;
  243. }
  244. const getConfigList = async (tabsKey) => {
  245. if (tabsKey === '1') {
  246. const { code, data: { rows } } = await QueryAllKnowledgeList();
  247. if (code === 200) {
  248. knowledge_list.value = rows;
  249. }
  250. }
  251. if (tabsKey === '2') {
  252. const { code, data: { rows } } = await QueryAllDialogList();
  253. if (code === 200) {
  254. agents_list.value = rows;
  255. }
  256. }
  257. if (tabsKey === '3') {
  258. // const { code, data: { rows } } = await QueryAllDialogList();
  259. // if (code === 200) {
  260. // agents_list.value = rows;
  261. // }
  262. }
  263. }
  264. onMounted(() => {
  265. getGroupList()
  266. })
  267. </script>
  268. <style lang="css" scoped>
  269. .account-page-card {
  270. height: calc(100% - 40px);
  271. }
  272. </style>