فهرست منبع

chore: auto bump version and changelog [skip ci]

iwt 3 روز پیش
والد
کامیت
8474223728

+ 15 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/ServiceRoleApplicationController.java

@@ -90,7 +90,11 @@ public class ServiceRoleApplicationController {
 
     @PostMapping("/admin/list")
     @Operation(summary = "管理端: 获取申请列表")
-    public Result adminList(@RequestParam(required = false, defaultValue = "0") Integer status) {
+    public Result adminList(@RequestParam(required = false, defaultValue = "0") Integer status,
+                            @RequestAttribute("role") String role) {
+        if (!"admin".equals(role) && !"operator".equals(role)) {
+            return Result.error("无权限:仅管理员/运营可查看服务角色申请列表");
+        }
         List<ServiceRoleApplication> list = serviceRoleApplicationService.listApplications(status);
         return Result.success(list);
     }
@@ -98,7 +102,11 @@ public class ServiceRoleApplicationController {
     @PostMapping("/admin/approve")
     @Operation(summary = "管理端: 批准申请")
     public Result adminApprove(@RequestBody Map<String, Object> params,
-                               @RequestAttribute("userId") Long adminId) {
+                               @RequestAttribute("userId") Long adminId,
+                               @RequestAttribute("role") String role) {
+        if (!"admin".equals(role) && !"operator".equals(role)) {
+            return Result.error("无权限:仅管理员/运营可审批服务角色申请");
+        }
         Long id = ParamUtils.getLong(params.get("id"));
         return serviceRoleApplicationService.approve(id, adminId);
     }
@@ -106,7 +114,11 @@ public class ServiceRoleApplicationController {
     @PostMapping("/admin/reject")
     @Operation(summary = "管理端: 驳回申请")
     public Result adminReject(@RequestBody Map<String, Object> params,
-                              @RequestAttribute("userId") Long adminId) {
+                              @RequestAttribute("userId") Long adminId,
+                              @RequestAttribute("role") String role) {
+        if (!"admin".equals(role) && !"operator".equals(role)) {
+            return Result.error("无权限:仅管理员/运营可审批服务角色申请");
+        }
         Long id = ParamUtils.getLong(params.get("id"));
         String reason = params.get("reason") != null ? params.get("reason").toString() : "";
         return serviceRoleApplicationService.reject(id, reason, adminId);

+ 3 - 0
cfc-frontend/pages/health/health-plan-summary.vue

@@ -1012,6 +1012,9 @@ selectedMembers: function() {
       saveHealthPlan(saveData).then(function(res) {
         self.loading = false
         if (res && res.code === 200) {
+          // 清理本次规划师选择缓存,避免下次生成方案时误用上一次的 teacherId
+          uni.removeStorageSync('healthPlan_teacherId')
+          uni.removeStorageSync('healthPlan_serviceType')
           uni.showToast({ title: '方案已生成', icon: 'none', duration: 2000 })
           setTimeout(function() { uni.navigateBack() }, 1200)
           self.taskSubmitted = true

+ 2 - 2
cfc-frontend/pages/teacher/team.vue

@@ -52,7 +52,7 @@
 </template>
 
 <script>
-import { getTeamMembers, getTeamStats, generateInviteCode } from '../../utils/api.js'
+import { getTeamMembers, getTeamStats, generateTeamInviteCode } from '../../utils/api.js'
 
 export default {
   data() {
@@ -93,7 +93,7 @@ export default {
     },
     async generateInviteCode() {
       try {
-        const res = await generateInviteCode()
+        const res = await generateTeamInviteCode()
         const code = res && res.data ? res.data.code : null
         if (!code) {
           uni.showToast({ title: '生成失败,请重试', icon: 'none' })

+ 8 - 1
cfc-frontend/utils/api.js

@@ -982,8 +982,15 @@ export const registerGuide = (data) => {
   return request('/api/guide/register', 'POST', data)
 }
 
-// 生成邀请码(团队/规划师端)
+// 生成邀请码(规划师管理端,与 getInviteCodes 同属 GuideManagementController)
 export const generateInviteCode = () => {
+  return request('/api/guide/invite-code/generate', 'POST')
+}
+
+// 生成团队邀请码(成长规划师团队端 GuideTeamController)
+// 与管理端邀请码不同:GuideTeamController.getTeamMembers 按 User.teacherNo == 邀请码 反查成员,
+// 故团队页必须用本端点生成,否则生成的码与成员查询不匹配
+export const generateTeamInviteCode = () => {
   return request('/api/guide/team/invite-code/generate', 'POST')
 }
 

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-6d4ce7236f8ddf913a93b8ced9acd339a2073a71
+729ebab885c3d3ba8385c4800b90d4e8a7c8e9ff

+ 2 - 2
cfc-web/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "cfc-web",
-  "version": "1.0.1489",
+  "version": "1.0.1490",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "cfc-web",
-      "version": "1.0.1489",
+      "version": "1.0.1490",
       "dependencies": {
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^1.0.2",

+ 2 - 0
docs/superpowers/api/API_REFERENCE.md

@@ -1413,6 +1413,8 @@ interactionType 取值:`PHONE` / `WECHAT` / `MEETING` / `OTHER`。
 | `POST /api/service-role/admin/approve` | 管理端:批准(`{ id }`) |
 | `POST /api/service-role/admin/reject` | 管理端:驳回(`{ id, reason }`) |
 
+> **权限**:`admin/list`、`admin/approve`、`admin/reject` 三个端点校验 `@RequestAttribute("role")`,仅 `role=admin` 或 `role=operator` 可访问(与 `AdminHealthPlanController` 审核类端点口径一致),其他角色返回「无权限」。前端菜单由 `perm: 'audit:service-role'` 控制。
+
 **状态语义**(`service_role_applications.status`)
 
 | 值 | 含义 |