ソースを参照

feat: allow activity_provider to create activities + scene referral binding

iwt 5 日 前
親
コミット
5bf6c8011e

+ 21 - 10
cfc-backend/src/main/java/com/etotem/cfc/controller/ActivityController.java

@@ -1,5 +1,6 @@
 package com.etotem.cfc.controller;
 
+import com.etotem.cfc.common.AdminRoles;
 import com.etotem.cfc.common.Result;
 import com.etotem.cfc.dto.ActivityDTO;
 import com.etotem.cfc.entity.Activity;
@@ -19,6 +20,11 @@ public class ActivityController {
     @Resource private ActivityRegistrationService registrationService;
     @Resource private ActivityAdminService activityAdminService;
 
+    private boolean hasActivityManageRole(String role, List<String> roles) {
+        if ("admin".equals(role) || "activity_admin".equals(role)) return true;
+        return AdminRoles.hasRole(roles, "activity_manager");
+    }
+
     @PostMapping("/list")
     public Result<Map<String, Object>> list(@RequestBody Map<String, Object> params, @RequestAttribute(value = "userId", required = false) Long userId) {
         String dimensionCode = (String) params.get("dimensionCode");
@@ -38,8 +44,9 @@ public class ActivityController {
     @PostMapping("/create")
     public Result<ActivityDTO> create(@RequestBody Activity activity,
                                        @RequestAttribute(value = "userId", required = false) Long userId,
-                                       @RequestAttribute("role") String role) {
-        if (!"admin".equals(role) && !"activity_admin".equals(role) && userId == null) {
+                                       @RequestAttribute("role") String role,
+                                       @RequestAttribute(value = "roles", required = false) List<String> roles) {
+        if (!hasActivityManageRole(role, roles) && userId == null) {
             return Result.error("普通用户需登录后创建活动");
         }
         if (userId != null) activity.setVendorId(userId);
@@ -49,8 +56,9 @@ public class ActivityController {
     @PostMapping("/update")
     public Result<ActivityDTO> update(@RequestBody Activity activity,
                                        @RequestAttribute(value = "userId", required = false) Long userId,
-                                       @RequestAttribute("role") String role) {
-        if (!"admin".equals(role) && !"activity_admin".equals(role)) {
+                                       @RequestAttribute("role") String role,
+                                       @RequestAttribute(value = "roles", required = false) List<String> roles) {
+        if (!hasActivityManageRole(role, roles)) {
             Activity existing = activityService.getById(activity.getId());
             if (existing == null) return Result.error("活动不存在");
             if (userId == null || existing.getCreatorId() == null || !existing.getCreatorId().equals(userId)) {
@@ -62,8 +70,9 @@ public class ActivityController {
 
     @PostMapping("/publish")
     public Result<String> publish(@RequestBody Map<String, Object> params,
-                                   @RequestAttribute("role") String role) {
-        if (!"admin".equals(role) && !"activity_admin".equals(role)) {
+                                   @RequestAttribute("role") String role,
+                                   @RequestAttribute(value = "roles", required = false) List<String> roles) {
+        if (!hasActivityManageRole(role, roles)) {
             return Result.error("只有管理员或活动管理员可以发布活动");
         }
         Long id = ParamUtils.getLong(params.get("id"));
@@ -78,8 +87,9 @@ public class ActivityController {
     @PostMapping("/end")
     public Result<String> end(@RequestBody Map<String, Object> params,
                                @RequestAttribute(value = "userId", required = false) Long userId,
-                               @RequestAttribute("role") String role) {
-        if (!"admin".equals(role) && !"activity_admin".equals(role)) {
+                               @RequestAttribute("role") String role,
+                               @RequestAttribute(value = "roles", required = false) List<String> roles) {
+        if (!hasActivityManageRole(role, roles)) {
             Long id = ParamUtils.getLong(params.get("id"));
             if (id == null) return Result.error("id不能为空");
             Activity existing = activityService.getById(id);
@@ -96,12 +106,13 @@ public class ActivityController {
     @PostMapping("/submit-review")
     public Result<String> submitReview(@RequestBody Map<String, Object> params,
                                         @RequestAttribute(value = "userId", required = false) Long userId,
-                                        @RequestAttribute("role") String role) {
+                                        @RequestAttribute("role") String role,
+                                        @RequestAttribute(value = "roles", required = false) List<String> roles) {
         Long id = ParamUtils.getLong(params.get("id"));
         if (id == null) return Result.error("id不能为空");
         Activity existing = activityService.getById(id);
         if (existing == null) return Result.error("活动不存在");
-        boolean isAdmin = "admin".equals(role) || "activity_admin".equals(role);
+        boolean isAdmin = hasActivityManageRole(role, roles);
         if (!isAdmin && (userId == null || existing.getCreatorId() == null || !existing.getCreatorId().equals(userId))) {
             return Result.error("只有创建人或管理员可以提交审核");
         }

+ 11 - 7
cfc-frontend/App.vue

@@ -167,7 +167,7 @@ bindReferralIfNotSelf(code).then(function(res) {
       // 同步 familyId 到 store(hasFamily getter 依赖;静默续期路径)
       this.$store.commit('setFamilyId', data.familyId)
     },
-    // 处理小程序码场景值,跳转到邀请页
+    // 处理小程序码场景值
     handleScene(options) {
       if (!options || !options.query) return
       var scene = options.query.scene
@@ -180,13 +180,17 @@ bindReferralIfNotSelf(code).then(function(res) {
         })
       } else if (sceneDecoded.indexOf('ref=') === 0) {
         var refCode = sceneDecoded.substring(4)
-        if (!refCode) {
-          console.warn('推广码场景缺少 refCode', sceneDecoded)
-          return
+        if (!refCode) return
+        // 已登录则自动绑定推荐人;未登录存入 storage 待登录后绑定
+        if (uni.getStorageSync('token')) {
+          bindReferralIfNotSelf(refCode).then(function(res) {
+            if (res && (res.code === 200 || res.code === 400)) {
+              uni.setStorageSync('boundInviteCode', refCode)
+            }
+          }).catch(function() {})
+        } else {
+          uni.setStorageSync('refCode', refCode)
         }
-        uni.navigateTo({
-          url: '/pages/invite/join?refCode=' + encodeURIComponent(refCode)
-        })
       }
     }
   }

+ 6 - 2
cfc-frontend/pages/activity/index.vue

@@ -224,8 +224,8 @@
         </view>
       </view>
 
-      <!-- Tab 4: manage (admin only) -->
-      <view v-if="currentTab === 'manage' && isAdmin">
+      <!-- Tab 4: manage (admin or activity_provider) -->
+      <view v-if="currentTab === 'manage' && (isAdmin || isActivityProvider)">
         <!-- Manage overview stats -->
         <view class="manage-overview">
           <view class="manage-stat-card">
@@ -310,6 +310,10 @@ export default {
     isAdmin: function() {
       var userInfo = uni.getStorageSync('userInfo')
       return userInfo && (userInfo.role === 'admin' || userInfo.role === 'activity_admin' || (userInfo.roles && userInfo.roles.indexOf('activity_admin') >= 0))
+    },
+    isActivityProvider: function() {
+      var userInfo = uni.getStorageSync('userInfo')
+      return userInfo && userInfo.vendorType === 'activity_provider' && userInfo.activityProviderStatus === 'approved'
     }
   },
   data() {