Selaa lähdekoodia

feat: adapt frontend menus and user management for RBAC roles

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
wangkangyjy 2 kuukautta sitten
vanhempi
commit
c15de95102

+ 5 - 5
frontend/src/components/MainLayout.vue

@@ -50,19 +50,19 @@
 
           <div class="menu-group-title" v-show="!isCollapse">系统管理</div>
 
-          <el-menu-item index="/org" v-if="auth.isAdmin">
+          <el-menu-item index="/org" v-if="auth.isHrAdminOrAbove">
             <el-icon><OfficeBuilding /></el-icon>
             <span>组织架构</span>
           </el-menu-item>
-          <el-menu-item index="/kpi/templates" v-if="auth.isAdmin">
+          <el-menu-item index="/kpi/templates" v-if="auth.isHrAdminOrAbove">
             <el-icon><SetUp /></el-icon>
             <span>绩效模板</span>
           </el-menu-item>
-          <el-menu-item index="/system/dimensions" v-if="auth.isAdmin">
+          <el-menu-item index="/system/dimensions" v-if="auth.isHrAdminOrAbove">
             <el-icon><Histogram /></el-icon>
             <span>考核维度</span>
           </el-menu-item>
-          <el-menu-item index="/system/logs" v-if="auth.isAdmin">
+          <el-menu-item index="/system/logs" v-if="auth.isHrAdminOrAbove">
             <el-icon><Document /></el-icon>
             <span>操作日志</span>
           </el-menu-item>
@@ -111,7 +111,7 @@
                 </div>
               </div>
             </el-popover>
-            <span class="user-info">{{ auth.user?.realName }} · {{ auth.user?.position || auth.user?.role === 'SUPER_ADMIN' ? '管理员' : '员工' }}</span>
+            <span class="user-info">{{ auth.user?.realName }} · {{ auth.roleLabel }}</span>
             <el-button text type="danger" @click="handleLogout">退出</el-button>
           </div>
         </el-header>

+ 6 - 1
frontend/src/stores/auth.js

@@ -10,7 +10,12 @@ export const useAuthStore = defineStore('auth', {
   getters: {
     isLoggedIn: state => !!state.accessToken,
     isAdmin: state => state.user?.role === 'SUPER_ADMIN',
-    hasSubordinates: state => true // determined by API calls
+    isHrAdminOrAbove: state => ['SUPER_ADMIN', 'HR_ADMIN'].includes(state.user?.role),
+    isDeptLeaderOrAbove: state => ['SUPER_ADMIN', 'HR_ADMIN', 'DEPT_LEADER'].includes(state.user?.role),
+    roleLabel: state => {
+      const map = { EMPLOYEE: '员工', TEAM_LEADER: '团队主管', DEPT_LEADER: '部门负责人', HR_ADMIN: 'HR管理员', SUPER_ADMIN: '管理员' }
+      return map[state.user?.role] || '员工'
+    }
   },
   actions: {
     async login(username, password) {

+ 8 - 5
frontend/src/views/org/OrgView.vue

@@ -113,11 +113,14 @@
             <el-option v-for="u in users.filter(x => x.id !== editingUser?.id)" :key="u.id" :label="u.realName" :value="u.id" />
           </el-select>
         </el-form-item>
-        <el-form-item label="角色">
-          <el-radio-group v-model="userForm.role">
-            <el-radio value="EMPLOYEE">普通员工</el-radio>
-            <el-radio value="SUPER_ADMIN">超级管理员</el-radio>
-          </el-radio-group>
+        <el-form-item label="角色" prop="role">
+          <el-select v-model="userForm.role" placeholder="请选择角色">
+            <el-option label="普通员工" value="EMPLOYEE" />
+            <el-option label="团队主管" value="TEAM_LEADER" />
+            <el-option label="部门负责人" value="DEPT_LEADER" />
+            <el-option label="HR管理员" value="HR_ADMIN" />
+            <el-option label="超级管理员" value="SUPER_ADMIN" />
+          </el-select>
         </el-form-item>
       </el-form>
       <template #footer>