Browse Source

feat: 2.1.1需求制作

bill 2 năm trước cách đây
mục cha
commit
c01feac6b6

+ 8 - 5
src/api/constant.ts

@@ -48,13 +48,16 @@ export const GET_MEMBER_LIST = '/smart-site/projectTeam/list'
 export const CHECK_MEMBER_PHONE = '/smart-site/projectTeam/checkUserName'
 export const ADD_MEMBER = '/smart-site/projectTeam/addUser'
 export const DEL_MEMBER = '/smart-site/projectTeam/deleteUser'
-export const UPDATE_MEBER = '/smart-site/projectTeam/updateRemark'
+export const UPDATE_MEBER = '/smart-site/projectTeam/updateUser'
 
 // 标注
-export const GET_TAGGING_LIST = '/smart-site/projectTeam/list'
+export const GET_TAGGING_LIST = '/smart-site/marking/list'
 
 // 角色
-export const GET_ROLE_LIST = '/smart-site/projectRole/list'
-export const ADD_ROLE = '/smart-site/projectRole/addUser'
+export const GET_ROLE_LIST = '/smart-site/role/list'
+export const ADD_ROLE = '/smart-site/role/addOrUpdate'
 export const DEL_ROLE = '/smart-site/projectRole/deleteUser'
-export const UPDATE_ROLE = '/smart-site/projectRole/updateRemark'
+export const UPDATE_ROLE = '/smart-site/role/addOrUpdate'
+export const ROLE_OPTIONS = '/smart-site/menu/treeselect/all'
+export const USER_ROLE_OPTIONS = '/smart-site/menu/treeselect'
+export const SELECT_OPTIONS = '/smart-site/role/select'

+ 9 - 5
src/api/instance.ts

@@ -1,7 +1,7 @@
 import { axiosFactory } from './setup'
 import { message } from 'ant-design-vue'
 import { showLoading, hideLoading } from '@/components/loading'
-import { ResCode, ResCodeDesc, POST_LOGIN } from './constant'
+import { ResCode, ResCodeDesc, POST_LOGIN, GET_PROJECT } from './constant'
 import { baseURL } from '@/env'
 import { router, RoutesName } from '@/router'
 
@@ -52,11 +52,15 @@ addResErrorHandler((response, data) => {
 })
 
 addHook({
-  before: () => {
-    showLoading()
+  before: config => {
+    if (config?.url !== GET_PROJECT) {
+      showLoading()
+    }
   },
-  after: () => {
-    hideLoading()
+  after: config => {
+    if (config?.url !== GET_PROJECT) {
+      hideLoading()
+    }
   }
 })
 

+ 10 - 5
src/api/member.ts

@@ -11,11 +11,12 @@ import type { PageResult, PageRequest, Project, Role } from './'
 export interface Member {
   teamId: number
   userName: string
+  nickName: string
   projectName?: Project['projectName']
   projectId: Project['projectId']
   roleName?: Role['roleName']
-  roleId: Role['roleId']
-  ddUserName: string
+  roles: Role[]
+  bindAccount: string
   remark: string
 }
 
@@ -30,11 +31,15 @@ export const fetchMembers = (
 export const deleteMember = (teamId: Member['teamId']) =>
   axios.post(DEL_MEMBER, { teamId })
 
-export const addMember = (member: Omit<Member, 'teamId'>) =>
+export type SetMemberProps = Omit<PartialPart<Member, 'teamId'>, 'roles'> & {
+  roles: Role['roleId'][]
+}
+export const addMember = (member: SetMemberProps) =>
   axios.post(ADD_MEMBER, { ...member })
 
-export const updateMember = (member: PartialPart<Member, 'userName'>) =>
-  axios.post(UPDATE_MEBER, member)
+export const updateMember = (
+  member: Omit<SetMemberProps, 'projectId'> & { teamId: Member['teamId'] }
+) => axios.post(UPDATE_MEBER, member)
 
 export const checkMemberUserName = (userName: Member['userName']) =>
   axios.get(CHECK_MEMBER_PHONE, { params: { userName } })

+ 27 - 2
src/api/role.ts

@@ -1,5 +1,13 @@
 import axios from './instance'
-import { GET_ROLE_LIST, ADD_ROLE, DEL_ROLE, UPDATE_ROLE } from './constant'
+import {
+  GET_ROLE_LIST,
+  ADD_ROLE,
+  DEL_ROLE,
+  UPDATE_ROLE,
+  ROLE_OPTIONS,
+  USER_ROLE_OPTIONS,
+  SELECT_OPTIONS
+} from './constant'
 import type { PageResult, PageRequest, Project } from './'
 import { RoutesName } from '@/router'
 
@@ -7,10 +15,20 @@ export interface Role {
   roleId: number
   roleName: string
   remark: string
-  roleMenus: RoutesName[]
+  defaultRole?: boolean
+  projectName: string
+  menuIds: RoleOption['id'][]
   createTime: string
 }
 
+export interface RoleOption {
+  id: number
+  label: string
+  path: RoutesName
+  children: RoleOption[]
+}
+
+export type RoleOptions = RoleOption[]
 export type Roles = Role[]
 
 export const fetchRoles = (
@@ -28,3 +46,10 @@ export const addRole = (
 ) => axios.post(ADD_ROLE, { projectId, ...role })
 
 export const updateRole = (role: Role) => axios.post(UPDATE_ROLE, role)
+
+export const fetchRoleOptions = () => axios.post<RoleOptions>(ROLE_OPTIONS, {})
+export const fetchUserRoleOptions = () =>
+  axios.post<RoleOptions>(USER_ROLE_OPTIONS, {})
+
+export const fetchRoleSelects = (projectId: Project['projectId']) =>
+  axios.post<Roles>(SELECT_OPTIONS, { projectId })

+ 16 - 13
src/api/tagging.ts

@@ -3,10 +3,10 @@ import { GET_TAGGING_LIST } from './constant'
 import type { PageResult, PageRequest, Project } from './'
 
 export enum TaggingStatus {
-  pending,
-  progress,
-  unsolved,
-  solved
+  pending = 1,
+  progress = 2,
+  unsolved = 3,
+  solved = 4
 }
 
 export const TaggingStatusDesc = {
@@ -17,19 +17,22 @@ export const TaggingStatusDesc = {
 }
 
 export interface Tagging {
-  status: TaggingStatus
-  teamId: number
-  userName: string
+  markingStatus: TaggingStatus
+  markingTitle: string
+  markingId: number
+  lastUpdateBy: string
+  createBy: string
+  updateTime: string
+  users: { userId: number; nickName: string }[]
   remark: string
 }
 
 export type Taggings = Tagging[]
 
-export type FetchTaggingsProps = PageRequest<
-  Pick<Tagging, 'userName'> & {
-    projectId: Project['projectId']
-    status?: Tagging['status']
-  }
->
+export type FetchTaggingsProps = PageRequest<{
+  markingTitle: Tagging['markingTitle']
+  projectId: Project['projectId']
+  markingStatus?: Tagging['markingStatus']
+}>
 export const fetchTaggings = (params: FetchTaggingsProps) =>
   axios.post<PageResult<Tagging>>(GET_TAGGING_LIST, params)

+ 1 - 16
src/api/user.ts

@@ -15,7 +15,6 @@ export interface User {
   phone: string
   avatar: string
   email: string
-  role: Role
 }
 
 type SUser = {
@@ -23,27 +22,13 @@ type SUser = {
   nickName: string
   userName: string
   email: string
-  role: Role
 }
 
 const toLocal = (data: SUser): User => ({
   nickname: data.nickName,
   avatar: data.head,
   phone: data.userName,
-  email: data.email,
-  role: {
-    roleId: 1,
-    roleName: '',
-    remark: '',
-    createTime: '',
-    roleMenus: [
-      RoutesName.projectMembers,
-      RoutesName.projectRoles,
-      RoutesName.projectTaggings,
-      RoutesName.projectScenes,
-      RoutesName.personal
-    ]
-  }
+  email: data.email
 })
 
 export const fetchUser = async (): Promise<User> => {

+ 1 - 0
src/assets/iconfont/demo.css

@@ -159,6 +159,7 @@
 .markdown img {
   vertical-align: middle;
   max-width: 100%;
+  object-fit: cover;
 }
 
 .markdown h1 {

+ 14 - 2
src/helper/index.ts

@@ -1,7 +1,8 @@
 import { app } from '@/main'
 import { genMount } from './mount'
 import LocaleEnv from '@/components/locale-env/index.vue'
-import { h } from 'vue'
+import { getCurrentInstance, h, onDeactivated, onUnmounted, watch } from 'vue'
+import { router } from '@/router'
 
 export const mount = genMount(app)
 
@@ -30,6 +31,17 @@ export const renderModal = <P>(
       destroy && destroy()
     }
   } as P
-
   const destroy = renderCompoent(comp, props)
+
+  watch(
+    () => router.currentRoute.value?.name,
+    () => {
+      destroy()
+    }
+  )
+
+  if (getCurrentInstance()) {
+    onUnmounted(destroy)
+    onDeactivated(destroy)
+  }
 }

+ 2 - 1
src/layout/sider.vue

@@ -37,7 +37,8 @@ const userStore = useUserStore()
 const allMenus = [RoutesName.personal, RoutesName.projects] as const
 
 const menus = computed(() => {
-  const roleMenus = userStore.current.role.roleMenus
+  const roleMenus = userStore.roleMenus
+  console.log(roleMenus)
   return allMenus.filter(menu => roleMenus.includes(menu))
 })
 const selectMenu: MenuProps['onSelect'] = ({ key }) => {

+ 1 - 1
src/main.ts

@@ -14,7 +14,7 @@ app.mount('#app')
 const userStore = useUserStore(pinia)
 
 watch(
-  () => userStore.$state.current.role.roleMenus,
+  () => userStore.roleMenus,
   nMenus => {
     enableRouteNames([...nMenus])
   },

+ 2 - 2
src/router/constant.ts

@@ -6,8 +6,8 @@ export enum RoutesName {
   projectScenes = 'projectScenes',
   projectMembers = 'projectMembers',
   projectMaterial = 'projectInfos',
-  projectTaggings = 'projectTaggings',
-  projectRoles = 'projectRoles'
+  projectTaggings = 'projectMarking',
+  projectRoles = 'projectRole'
 }
 
 export const routesPaths = {

+ 1 - 0
src/store/index.ts

@@ -4,6 +4,7 @@ export * from './user'
 export * from './scene'
 export * from './project'
 export * from './constant'
+export * from './roles'
 
 export const pinia = createPinia()
 export default pinia

+ 51 - 0
src/store/roles.ts

@@ -0,0 +1,51 @@
+import { defineStore } from 'pinia'
+import { routesMetas, RoutesName } from '@/router'
+import { fetchRoleOptions, RoleOption } from '@/api'
+import type { RoleOptions } from '@/api'
+
+export type { RoleOptions, RoleOption } from '@/api'
+export { fetchRoleOptions } from '@/api'
+
+type MenuTree = { key: RoleOption['id']; title: string; children: MenuTree[] }
+const transformMenuTree = (roleOptions: RoleOptions): MenuTree[] => {
+  return roleOptions.map(role => ({
+    title: routesMetas[role.path].title,
+    key: role.id,
+    children: role.children ? transformMenuTree(role.children) : []
+  }))
+}
+
+export const useRoleStore = defineStore('role', {
+  state: () => ({
+    list: [] as RoleOptions
+  }),
+  getters: {
+    getRole: state => (name: RoutesName) =>
+      state.list.find(role => role.path === name)!,
+    getRoles() {
+      return (names: RoutesName[]) => names.map(name => this.getRole(name))
+    },
+    getRoleId() {
+      return (name: RoutesName) => this.getRole(name).id
+    },
+    getRoleIds() {
+      return (names: RoutesName[]) => names.map(name => this.getRoleId(name))
+    },
+    getName: state => (id: RoleOption['id']) =>
+      state.list.find(role => role.id === id)!.path,
+    getNames() {
+      return (ids: RoleOption['id'][]) => ids.map(this.getName)
+    },
+    menuTree: state => {
+      console.log(state.list)
+      const tree = transformMenuTree(state.list)
+      console.log(tree)
+      return tree
+    }
+  },
+  actions: {
+    async fetch() {
+      this.list = await fetchRoleOptions()
+    }
+  }
+})

+ 30 - 28
src/store/user.ts

@@ -4,7 +4,9 @@ import {
   postLogin,
   postLogout,
   setToken,
-  delToken
+  delToken,
+  fetchUserRoleOptions,
+  RoleOptions
 } from '@/api'
 import { defineStore } from 'pinia'
 
@@ -18,49 +20,48 @@ const defState = {
     nickname: '游客',
     phone: '',
     email: '',
-    avatar: 'https://4dkk.4dage.com/head/18819272208/head_1662022947583.png',
-    role: {
-      roleId: 1,
-      roleName: '',
-      remark: '',
-      createTime: '',
-      roleMenus: LeastMenus
-    }
+    avatar: 'https://4dkk.4dage.com/head/18819272208/head_1662022947583.png'
   } as User,
   meta: {
     projectCount: 0,
     projectFileCount: 0,
     projectSceneCount: 0,
     projectOverCount: 0
-  } as UserMeta
+  } as UserMeta,
+  roleMenus: LeastMenus
 }
 
-const userStorage = localStorage.getItem('user')
-if (userStorage) {
+const userRolesStorage = localStorage.getItem('user-roles')
+if (userRolesStorage) {
   try {
-    defState.current = JSON.parse(userStorage)
+    defState.roleMenus = JSON.parse(userRolesStorage)
   } catch {}
 }
 
+const transformRoleOptions = (options: RoleOptions) => {
+  const names: RoutesName[] = []
+  for (const option of options) {
+    names.push(option.path)
+    if (option.children) {
+      names.push(...transformRoleOptions(option.children))
+    }
+  }
+  return names
+}
+
 export const useUserStore = defineStore('user', {
   state: () => defState,
   actions: {
-    initUser(user: User) {
-      const storeUser = {
-        ...user,
-        role: {
-          ...user.role,
-          roleMenus: Array.from(
-            new Set([...LeastMenus, ...user.role.roleMenus])
-          )
-        }
-      }
-      localStorage.setItem('user', JSON.stringify(storeUser))
-      this.current = storeUser
+    async fetchRoles() {
+      const options = await fetchUserRoleOptions()
+      this.roleMenus = Array.from(
+        new Set([...LeastMenus, ...transformRoleOptions(options)])
+      )
+      localStorage.setItem('user-roles', JSON.stringify(this.roleMenus))
     },
     async fetchUser() {
-      const user = await fetchUser()
-      this.initUser(user)
+      this.current = await fetchUser()
+      await this.fetchRoles()
     },
     async fetchMeta() {
       this.meta = await fetchUserMeta()
@@ -73,8 +74,9 @@ export const useUserStore = defineStore('user', {
         phone: state.phone,
         password: state.password
       })
-      this.initUser(user)
+      this.current = user
       setToken(token)
+      await this.fetchRoles()
     },
     async logout() {
       await postLogout()

+ 4 - 2
src/views/material/edit.vue

@@ -55,7 +55,7 @@ import { ref, defineProps, toRaw } from 'vue'
 import type { Member } from '@/api'
 import type { FormInstance } from 'ant-design-vue'
 
-export type EditMember = PartialPart<Member, 'teamId'>
+export type EditMember = PartialPart<Member, 'teamId' | 'projectId'>
 
 defineOptions<{ name: 'edit-member' }>()
 
@@ -66,7 +66,9 @@ const props = defineProps<{
 }>()
 
 const editMember = ref<EditMember>(
-  props.member ? { ...props.member } : { userName: '', remark: '' }
+  props.member
+    ? { ...props.member }
+    : { userName: '', remark: '', bindAccount: '', roles: [] }
 )
 const fromRef = ref<FormInstance>()
 const visible = ref(true)

+ 14 - 11
src/views/member/columns.ts

@@ -1,5 +1,6 @@
 import type { Member } from '@/api'
 import type { ColumnsType } from 'ant-design-vue/es/table'
+import { h } from 'vue'
 
 export const memberColumns: ColumnsType<Member> = [
   // {
@@ -10,8 +11,8 @@ export const memberColumns: ColumnsType<Member> = [
   // },
   {
     title: '成员名称',
-    dataIndex: 'userName',
-    key: 'userName'
+    dataIndex: 'nickName',
+    key: 'nickName'
   },
   {
     title: '账号',
@@ -19,19 +20,21 @@ export const memberColumns: ColumnsType<Member> = [
     key: 'userName'
   },
   {
-    title: '邀请项目',
-    dataIndex: 'projectName',
-    key: 'projectName'
-  },
-  {
     title: '项目角色',
-    dataIndex: 'roleName',
-    key: 'roleName'
+    dataIndex: 'roles',
+    key: 'roles',
+    customRender(data) {
+      return h(
+        'span',
+        null,
+        data.record.roles.map(role => role.roleName).join('、')
+      )
+    }
   },
   {
     title: '绑定账号',
-    dataIndex: 'ddUserName',
-    key: 'ddUserName'
+    dataIndex: 'bindAccount',
+    key: 'bindAccount'
   },
   {
     title: '备注',

+ 26 - 35
src/views/member/edit.vue

@@ -39,31 +39,20 @@
         />
       </a-form-item>
       <a-form-item
-        name="projectId"
-        label="邀请项目"
-        :rules="[{ required: true, message: '请选择由我创建的项目' }]"
+        name="nickName"
+        label="成员名称"
+        :rules="[{ required: true, message: '请输入成员名称' }]"
       >
-        <a-select
-          v-model:value="editMember.projectId"
-          placeholder="请选择由我创建的项目"
-        >
-          <a-select-option
-            v-for="project in projectOptions"
-            :key="project.projectId"
-            :value="project.projectId"
-            >{{ project.projectName }}</a-select-option
-          >
-        </a-select>
+        <a-input
+          v-model:value="editMember.nickName"
+          placeholder="请输入成员名称"
+        />
       </a-form-item>
       <a-form-item
-        name="roleId"
         label="项目角色"
         :rules="[{ required: true, message: '请选择项目角色' }]"
       >
-        <a-select
-          v-model:value="editMember.roleId"
-          placeholder="请选择项目角色"
-        >
+        <a-select v-model:value="currentRole" placeholder="请选择项目角色">
           <a-select-option
             v-for="role in roleOptions"
             :key="role.roleId"
@@ -72,10 +61,10 @@
           >
         </a-select>
       </a-form-item>
-      <a-form-item name="ddUserName" label="绑定账号">
+      <a-form-item name="bindAccount" label="绑定账号" :rules="[phoneRule]">
         <a-input
-          v-model:value="editMember.ddUserName"
-          placeholder="请输入当前用户绑定的钉钉账号"
+          v-model:value="editMember.bindAccount"
+          placeholder="请输入当前用户绑定的手机号"
         />
       </a-form-item>
       <a-form-item
@@ -96,13 +85,14 @@
 
 <script lang="ts" setup>
 import { ref, defineProps, toRaw, onMounted, computed } from 'vue'
-import { fetchProjects, fetchRoles } from '@/api'
+import { fetchRoleSelects } from '@/api'
 import router from '@/router'
+import { phoneRule } from '@/views/system/shared'
 
-import type { Member, Project, Role } from '@/api'
+import type { Role, SetMemberProps } from '@/api'
 import type { FormInstance } from 'ant-design-vue'
 
-export type EditMember = PartialPart<Member, 'teamId'>
+export type EditMember = PartialPart<SetMemberProps, 'projectId'>
 
 defineOptions<{ name: 'edit-member' }>()
 
@@ -112,7 +102,7 @@ const props = defineProps<{
   onCancel: () => void
 }>()
 
-const projectOptions = ref<Pick<Project, 'projectId' | 'projectName'>[]>([])
+const currentRole = ref<number>()
 const roleOptions = ref<Pick<Role, 'roleId' | 'roleName'>[]>()
 const currentProjectId = computed(() =>
   Number(router.currentRoute.value.params.id)
@@ -122,31 +112,32 @@ const editMember = ref<EditMember>(
     ? { ...props.member }
     : {
         userName: '',
+        nickName: '',
         remark: '',
-        roleId: null as unknown as number,
-        ddUserName: '',
-        projectId: currentProjectId.value
+        roles: [],
+        bindAccount: ''
       }
 )
+
+currentRole.value = editMember.value.roles[0]
+
 const fromRef = ref<FormInstance>()
 const visible = ref(true)
 
 const saveHandler = async () => {
+  console.log(editMember.value)
   await fromRef.value?.validate()
   await props.onSave({
     ...toRaw(editMember.value),
     remark: editMember.value.remark || '',
-    ddUserName: editMember.value.ddUserName || ''
+    bindAccount: editMember.value.bindAccount || '',
+    roles: currentRole.value ? [currentRole.value] : []
   })
   visible.value = false
 }
 
 onMounted(async () => {
-  const allParams = { pageNum: 1, pageSize: 100000 }
-  projectOptions.value = (await fetchProjects(allParams)).list
-  roleOptions.value = (
-    await fetchRoles({ ...allParams, projectId: currentProjectId.value })
-  ).list
+  roleOptions.value = await fetchRoleSelects(currentProjectId.value)
 })
 </script>
 

+ 6 - 3
src/views/member/list.vue

@@ -68,13 +68,16 @@ const { list, pagination, updateList } = usePaging(fetchMembers, params)
 
 const setMember = (member?: Member) => {
   renderModal(EditMember, {
-    member,
+    member: member && {
+      ...member,
+      roles: member.roles.map(role => role.roleId)
+    },
     async onSave(member) {
       if (member.teamId) {
-        await updateMember(member as Member)
+        await updateMember(member as any)
       } else {
         await checkMemberUserName(member.userName)
-        await addMember(member)
+        await addMember({ ...member, projectId: params.projectId })
       }
       await updateList()
     }

+ 1 - 0
src/views/personal/index.vue

@@ -66,6 +66,7 @@ const getGreet = () => {
     flex: none;
     margin-right: var(--padding);
     display: block;
+    object-fit: cover;
     border-radius: 50%;
   }
 }

+ 1 - 1
src/views/project/columns.ts

@@ -74,7 +74,7 @@ export const projectColumns: ColumnsType<SimpleProject> = [
         RoutesName.projectMembers,
         RoutesName.projectRoles
       ]
-      const roleMenus = userStore.$state.current.role.roleMenus
+      const roleMenus = userStore.roleMenus
       const targetMenu = allMenus.find(menu => roleMenus.includes(menu))
       const onManage = () => {
         router.push({

+ 1 - 1
src/views/project/detailed.vue

@@ -77,7 +77,7 @@ const allOptions = [
 const tabOptions = ref(allOptions)
 
 watch(
-  () => useUserStore().$state.current.role.roleMenus,
+  () => useUserStore().roleMenus,
   enables => {
     tabOptions.value = allOptions.filter(option => enables.includes(option.key))
   },

+ 2 - 2
src/views/role/columns.ts

@@ -15,8 +15,8 @@ export const roleColumns: ColumnsType<Role> = [
   },
   {
     title: '所属项目',
-    dataIndex: 'userName',
-    key: 'userName'
+    dataIndex: 'roleName',
+    key: 'roleName'
   },
   {
     title: '备注',

+ 17 - 40
src/views/role/edit.vue

@@ -52,10 +52,11 @@
       <a-form-item name="roleMenus" label="菜单分配">
         <div class="menu-layer ant-input">
           <a-tree
-            v-model:checkedKeys="editRole.roleMenus"
+            v-if="roleStore.menuTree.length"
+            v-model:checkedKeys="editRole.menuIds"
             default-expand-all
             checkable
-            :tree-data="roleMenusTree"
+            :tree-data="roleStore.menuTree"
           />
         </div>
       </a-form-item>
@@ -64,11 +65,12 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, defineProps, toRaw } from 'vue'
-import { RoutesName, routesMetas } from '@/router'
+import { ref, defineProps, toRaw, onMounted } from 'vue'
+import { RoutesName } from '@/router'
+import { useRoleStore, useProject } from '@/store'
 
-import type { Role } from '@/api'
-import type { FormInstance, TreeProps } from 'ant-design-vue'
+import { Role } from '@/api'
+import type { FormInstance } from 'ant-design-vue'
 
 export type EditRole = PartialPart<Role, 'roleId' | 'createTime'>
 
@@ -79,43 +81,17 @@ const props = defineProps<{
   onSave: (data: EditRole) => void
   onCancel: () => void
 }>()
-
-const roleMenusTree: TreeProps['treeData'] = [
-  {
-    title: routesMetas[RoutesName.personal].title,
-    key: RoutesName.personal
-  },
-  {
-    title: routesMetas[RoutesName.project].title,
-    key: RoutesName.project,
-    children: [
-      {
-        title: routesMetas[RoutesName.projectScenes].title,
-        key: RoutesName.projectScenes
-      },
-      {
-        title: routesMetas[RoutesName.projectTaggings].title,
-        key: RoutesName.projectTaggings
-      },
-      {
-        title: routesMetas[RoutesName.projectMembers].title,
-        key: RoutesName.projectMembers
-      },
-      {
-        title: routesMetas[RoutesName.projectRoles].title,
-        key: RoutesName.projectRoles
-      }
-    ]
-  }
-]
+const roleStore = useRoleStore()
+const projectStore = useProject()
 
 const editRole = ref<EditRole>(
   props.role
     ? { ...props.role }
     : {
+        projectName: projectStore.current?.projectName || '',
         remark: '',
         roleName: '',
-        roleMenus: [RoutesName.projectRoles, RoutesName.projectMembers]
+        menuIds: []
       }
 )
 const fromRef = ref<FormInstance>()
@@ -126,10 +102,14 @@ const saveHandler = async () => {
   await props.onSave({
     ...toRaw(editRole.value),
     remark: editRole.value.remark || '',
-    roleMenus: editRole.value.roleMenus || []
+    menuIds: editRole.value.menuIds || []
   })
   visible.value = false
 }
+
+onMounted(async () => {
+  roleStore.fetch()
+})
 </script>
 
 <style lang="scss" scoped>
@@ -144,7 +124,4 @@ const saveHandler = async () => {
     font-size: 14px;
   }
 }
-
-.menu-layer {
-}
 </style>

+ 1 - 1
src/views/role/list.vue

@@ -20,7 +20,7 @@
     >
       <template #bodyCell="{ column, record }">
         <template v-if="column.key === 'action'">
-          <div class="table-actions">
+          <div v-if="!record.defaultRole" class="table-actions">
             <a @click="setRole(record)">编辑</a>
             <a class="warn" @click="delRoleHandler(record)">删除</a>
           </div>

+ 15 - 12
src/views/taggings/columns.ts

@@ -11,36 +11,39 @@ export const taggingColumns: ColumnsType<Tagging> = [
   //   customRender: ({ index }) => index + 1
   // },
   {
-    title: '备注名称',
-    key: 'remark',
-    dataIndex: 'remark'
+    title: '场景标注',
+    key: 'markingTitle',
+    dataIndex: 'markingTitle'
   },
   {
     title: '创建人',
-    dataIndex: 'userName',
-    key: 'userName'
+    dataIndex: 'createBy',
+    key: 'createBy'
   },
   {
     title: '涉及的成员',
-    dataIndex: 'userName',
-    key: 'userName'
+    dataIndex: 'users',
+    key: 'users',
+    customRender(data) {
+      return data.record.users.map(user => user.nickName).join('、')
+    }
   },
   {
     title: '状态',
     dataIndex: 'status',
     key: 'status',
     customRender(data) {
-      return h('span', TaggingStatusDesc[data.record.status] || '未知')
+      return h('span', TaggingStatusDesc[data.record.markingStatus] || '未知')
     }
   },
   {
     title: '最后修改人',
-    dataIndex: 'userName',
-    key: 'userName'
+    dataIndex: 'lastUpdateBy',
+    key: 'lastUpdateBy'
   },
   {
     title: '最后修改时间',
-    dataIndex: 'createTime',
-    key: 'createTime'
+    dataIndex: 'updateTime',
+    key: 'updateTime'
   }
 ]

+ 4 - 4
src/views/taggings/list.vue

@@ -12,7 +12,7 @@
       <a-input-search
         v-model:value="filterName"
         style="width: 280px"
-        placeholder="请输入资料名称或备注关键字"
+        placeholder="请输入注关键字"
         @search="updateMaterials"
       />
     </div>
@@ -75,13 +75,13 @@ const pagination = reactive({
 
 const [materials, updateMaterials] = useRealtime(async () => {
   const params: FetchTaggingsProps = {
-    userName: filterName.value,
+    markingTitle: filterName.value,
     projectId: projectId.value,
     pageNum: pagination.current,
     pageSize: pagination.pageSize
   }
   if (type.value !== 'all') {
-    params.status = type.value
+    params.markingStatus = type.value
   }
   const result = await fetchTaggings(params)
   pagination.total = result.total
@@ -89,5 +89,5 @@ const [materials, updateMaterials] = useRealtime(async () => {
   return result.list
 }, [])
 
-watch(type, updateMaterials)
+watch(() => type.value + filterName.value, updateMaterials)
 </script>

+ 5 - 0
vite.config.ts

@@ -14,6 +14,11 @@ export default ({ mode }) => {
       target: 'https://test.4dkankan.com',
       changeOrigin: true,
       rewrite: path => path.replace(/^\/api/, '')
+    },
+    '/local': {
+      target: 'http://192.168.0.152:8111',
+      changeOrigin: true,
+      rewrite: path => path.replace(/^\/local/, '')
     }
   }