Sfoglia il codice sorgente

refactor: 角色仅仅用来做权限分配,不做登录

wuwenyi 2 settimane fa
parent
commit
1b757a6a65

+ 1 - 12
src/router/index.ts

@@ -154,8 +154,6 @@ const router = createRouter({
 
 const publicPaths = new Set(['/login'])
 
-const roleAllowedPaths = new Set(['/', '/dashboard', '/login', '/profile', '/approval/todo', '/approval/handled', '/approval/mine', '/approval/execute', '/approval/cc'])
-
 // 按员工类型限制的路径
 const permissionPaths: Record<string, Set<string>> = {
   common_user: new Set(['/', '/dashboard', '/login', '/profile', '/approval/todo', '/approval/handled', '/approval/mine', '/approval/execute', '/approval/cc']),
@@ -203,16 +201,7 @@ router.beforeEach(async (to, from, next) => {
         fetchingUserInfo = null
       }
     }
-    // 角色用户路由限制
-    if (userStore.isRoleUser) {
-      if (!isPathAllowed(roleAllowedPaths, to.path)) {
-        next('/approval/todo')
-        return
-      }
-      next()
-      return
-    }
-    // 普通用户按 employeeType 限制
+    // 按 employeeType 限制
     const employeeType = userStore.userInfo?.employeeType || 'common_user'
     const allowedPaths = permissionPaths[employeeType] || permissionPaths['common_user']
     if (!isPathAllowed(allowedPaths, to.path)) {

+ 0 - 7
src/stores/user-store.ts

@@ -7,10 +7,8 @@ import type { LoginData, User } from '@/types/system'
 export const useUserStore = defineStore('user', () => {
   const token = ref<string | undefined>(getToken())
   const userInfo = ref<User | null>(null)
-  const userType = ref<string>('SYSTEM')
 
   const isLoggedIn = computed(() => !!token.value)
-  const isRoleUser = computed(() => userType.value === 'ROLE')
 
   async function loginAction(data: LoginData) {
     const res = await login(data)
@@ -22,7 +20,6 @@ export const useUserStore = defineStore('user', () => {
   async function fetchUserInfo() {
     const res = await getUserInfo()
     userInfo.value = res
-    userType.value = res.userType || 'SYSTEM'
     return res
   }
 
@@ -34,19 +31,15 @@ export const useUserStore = defineStore('user', () => {
     }
     token.value = undefined
     userInfo.value = null
-    userType.value = 'SYSTEM'
     removeToken()
     localStorage.removeItem('login_username')
     localStorage.removeItem('login_remember')
-    localStorage.removeItem('login_type')
   }
 
   return {
     token,
     userInfo,
-    userType,
     isLoggedIn,
-    isRoleUser,
     loginAction,
     fetchUserInfo,
     logoutAction

+ 0 - 4
src/types/system.ts

@@ -21,10 +21,7 @@ export interface Role {
   id: number
   roleCode: string
   roleName: string
-  username?: string
-  password?: string
   roleScope?: string
-  phone?: string
   parentId?: number
   deptId?: number
   deptName?: string
@@ -50,7 +47,6 @@ export interface Dept {
 export interface LoginData {
   username: string
   password: string
-  loginType?: string // SYSTEM / ROLE
 }
 
 export interface LoginResult {

+ 3 - 19
src/views/login/index.vue

@@ -2,10 +2,6 @@
   <div class="login-container">
     <el-card class="login-box">
       <h2 class="login-title">通用型流程审批系统</h2>
-      <el-radio-group v-model="loginType" class="login-type-switch">
-        <el-radio-button label="SYSTEM">系统用户登录</el-radio-button>
-        <el-radio-button label="ROLE">角色用户登录</el-radio-button>
-      </el-radio-group>
       <el-form
         ref="loginFormRef"
         :model="loginForm"
@@ -15,7 +11,7 @@
         <el-form-item prop="username">
           <el-input
             v-model="loginForm.username"
-            :placeholder="loginType === 'ROLE' ? '角色账号 / 手机号' : '用户名 / 手机号'"
+            placeholder="用户名 / 手机号"
             :prefix-icon="User"
             size="large"
           />
@@ -50,7 +46,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, onMounted, watch } from 'vue'
+import { ref, reactive, onMounted } from 'vue'
 import { useRouter, useRoute } from 'vue-router'
 import { User, Lock } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
@@ -63,7 +59,6 @@ const userStore = useUserStore()
 
 const loginFormRef = ref<FormInstance>()
 const loading = ref(false)
-const loginType = ref<'SYSTEM' | 'ROLE'>('SYSTEM')
 
 const loginForm = reactive({
   username: '',
@@ -77,27 +72,20 @@ const loginRules: FormRules = {
   password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
 }
 
-watch(loginType, (newType) => {
-  loginForm.username = ''
-  loginForm.password = ''
-})
-
 async function handleLogin() {
   const valid = await loginFormRef.value?.validate().catch(() => false)
   if (!valid) return
 
   loading.value = true
   try {
-    await userStore.loginAction({ ...loginForm, loginType: loginType.value })
+    await userStore.loginAction({ ...loginForm })
     await userStore.fetchUserInfo()
     if (remember.value) {
       localStorage.setItem('login_username', loginForm.username)
       localStorage.setItem('login_remember', 'true')
-      localStorage.setItem('login_type', loginType.value)
     } else {
       localStorage.removeItem('login_username')
       localStorage.removeItem('login_remember')
-      localStorage.removeItem('login_type')
     }
     ElMessage.success('登录成功')
     const redirect = route.query.redirect as string
@@ -112,13 +100,9 @@ async function handleLogin() {
 onMounted(() => {
   const savedUsername = localStorage.getItem('login_username')
   const savedRemember = localStorage.getItem('login_remember')
-  const savedType = localStorage.getItem('login_type')
   if (savedRemember === 'true' && savedUsername) {
     loginForm.username = savedUsername
     remember.value = true
-    if (savedType === 'ROLE' || savedType === 'SYSTEM') {
-      loginType.value = savedType as 'SYSTEM' | 'ROLE'
-    }
   }
 })
 </script>

+ 1 - 26
src/views/system/role/index.vue

@@ -59,13 +59,6 @@
             <el-table-column type="index" label="序号" width="60" />
             <el-table-column prop="roleCode" label="角色编码" />
             <el-table-column prop="roleName" label="角色名称" />
-            <el-table-column prop="username" label="登录账号" />
-            <el-table-column prop="phone" label="手机号">
-              <template #default="{ row }">
-                <span v-if="row.phone">{{ row.phone }}</span>
-                <span v-else class="text-gray">未填写</span>
-              </template>
-            </el-table-column>
             <el-table-column prop="deptName" label="所属部门" />
             <el-table-column prop="roleScope" label="描述" />
             <el-table-column prop="wecomUserId" label="企微账号" width="120">
@@ -114,15 +107,6 @@
         <el-form-item label="角色名称" prop="roleName">
           <el-input v-model="form.roleName" />
         </el-form-item>
-        <el-form-item label="登录账号" prop="username">
-          <el-input v-model="form.username" placeholder="角色登录账号" />
-        </el-form-item>
-        <el-form-item label="手机号" prop="phone">
-          <el-input v-model="form.phone" placeholder="请输入手机号" />
-        </el-form-item>
-        <el-form-item label="密码" prop="password">
-          <el-input v-model="form.password" type="password" show-password :placeholder="isEdit ? '不填表示不修改密码' : '请输入密码'" />
-        </el-form-item>
         <el-form-item label="所属部门" prop="deptId">
           <el-tree-select
             v-model="form.deptId"
@@ -264,9 +248,6 @@ const form = reactive<Partial<Role>>({
   id: undefined,
   roleCode: '',
   roleName: '',
-  username: '',
-  phone: '',
-  password: '',
   roleScope: '',
   deptId: undefined,
   status: 1
@@ -368,9 +349,6 @@ function handleAdd() {
     id: undefined,
     roleCode: '',
     roleName: '',
-    username: '',
-    phone: '',
-    password: '',
     roleScope: '',
     deptId: selectedDeptId.value,
     status: 1
@@ -381,10 +359,7 @@ function handleAdd() {
 function handleEdit(row: Role) {
   isEdit.value = true
   dialogTitle.value = '编辑角色'
-  Object.assign(form, {
-    ...row,
-    phone: row.phone || ''
-  })
+  Object.assign(form, { ...row })
   dialogVisible.value = true
 }
 

+ 15 - 0
src/views/system/user/index.vue

@@ -33,6 +33,16 @@
             {{ adminEmployeeTypeLabel(row.employeeType) }}
           </template>
         </el-table-column>
+        <el-table-column label="关联角色" min-width="150">
+          <template #default="{ row }">
+            <template v-if="row.roleIds && row.roleIds.length > 0">
+              <el-tag v-for="rid in row.roleIds" :key="rid" size="small" style="margin-right: 4px; margin-bottom: 2px;">
+                {{ getRoleName(rid) }}
+              </el-tag>
+            </template>
+            <span v-else class="text-gray">未分配</span>
+          </template>
+        </el-table-column>
         <el-table-column prop="deptName" label="部门" />
         <el-table-column prop="email" label="邮箱" />
         <el-table-column prop="phone" label="手机号" />
@@ -317,6 +327,11 @@ async function loadAllRoles() {
   } catch { /* ignore */ }
 }
 
+function getRoleName(roleId: number): string {
+  const role = allRoles.value.find(r => r.id === roleId)
+  return role ? role.roleName : `角色#${roleId}`
+}
+
 function handleAssignRole(row: User) {
   assigningUserId.value = row.id
   selectedRoleIds.value = row.roleIds ? [...row.roleIds] : []