Browse Source

Merge remote-tracking branch 'origin/cfclub' into cfclub

asus 1 month ago
parent
commit
4cd6353316

+ 27 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/UserService.java

@@ -1315,6 +1315,30 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
         user.setUpdatedAt(new Date());
         userMapper.updateById(user);
         log.info("安全兜底:为用户 {} 自动创建家庭 {}", user.getId(), family.getId());
+        // 创建人自己也是家庭成员
+        addCreatorAsMember(user, family.getId());
+    }
+
+    private void addCreatorAsMember(User user, Long familyId) {
+        // 已存在则跳过(兜底幂等)
+        LambdaQueryWrapper<FamilyMember> check = new LambdaQueryWrapper<FamilyMember>()
+                .eq(FamilyMember::getFamilyId, familyId)
+                .eq(FamilyMember::getUserId, user.getId());
+        if (familyMemberMapper.selectCount(check) > 0) {
+            return;
+        }
+        FamilyMember member = new FamilyMember();
+        member.setFamilyId(familyId);
+        member.setUserId(user.getId());
+        member.setNickname(user.getNickname() != null ? user.getNickname() : "我");
+        member.setPhone(user.getPhone());
+        member.setAvatar(user.getAvatar());
+        member.setGender(user.getGender());
+        member.setGeneration(0);
+        member.setTotalPoints(0);
+        member.setCreatedAt(new Date());
+        member.setUpdatedAt(new Date());
+        familyMemberMapper.insert(member);
     }
 
     /**
@@ -1342,6 +1366,7 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
         Family family = new Family();
         family.setName(familyName);
         family.setInviteCode(generateInviteCode());
+        family.setCreatorId(userId);
         family.setCreatedAt(new Date());
         family.setUpdatedAt(new Date());
         familyMapper.insert(family);
@@ -1349,6 +1374,8 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
         user.setFamilyId(family.getId());
         user.setUpdatedAt(new Date());
         userMapper.updateById(user);
+        // 创建人自己也是家庭成员(generation=0 表示创建者)
+        addCreatorAsMember(user, family.getId());
         return family.getId();
     }
 

+ 1 - 1
cfc-frontend/pages/invite/join.vue

@@ -331,7 +331,7 @@ export default {
 
       this.acceptLoading = true
       try {
-        var res = await requestJoinByCode(this.token)
+        var res = await requestJoinByCode(this.token, familyRole)
         if (res && res.code === 200) {
           this.requestSubmitted = true
           this.requestStatus = 'pending'

+ 37 - 14
cfc-frontend/pages/profile-extra/family-members.vue

@@ -32,7 +32,6 @@
     </view>
 
     <!-- ===== 分享邀请卡海报 ===== -->
-    <SharePoster v-if="hasFamily" :show="showPoster" :referralCode="inviteCode" :qrCodeBase64="inviteQrCode" :nickname="userNickname" :userAvatar="userAvatar" @close="showPoster = false" />
     <view v-else class="empty-tip">暂无家庭成员,正在为您创建家庭...</view>
 
     <!-- ===== 成员详情弹窗 ===== -->
@@ -110,27 +109,27 @@ import {
   switchToFamilyMember,
   kickFamilyMemberById,
   generateFamilyInviteQrCode,
+  generateFamilyInvite,
   getFamilyMembers,
   updateFamilyMember
 } from '../../utils/api.js'
 import store from '../../store/index.js'
-import SharePoster from '@/components/SharePoster.vue'
 import { ensureFamily } from '../../utils/api.js'
 
 export default {
-  components: { SharePoster },
+  components: {},
   data() {
     return {
       userId: 0,
       familyId: 0,
       familyName: '',
-      inviteCode: '',
-      inviteQrCode: '',
+
+
       creatorId: null,
       members: [],
       isAdmin: false,
       loading: false,
-      showPoster: false,
+
       showMemberDetailModal: false,
       detailMember: null,
       memberScores: {},
@@ -204,7 +203,7 @@ export default {
           var data = res.data
           this.familyId = data.familyId
           this.familyName = data.familyName
-          this.inviteCode = data.inviteCode || ''
+          // inviteCode no longer needed
           this.creatorId = data.creatorId
           this.isAdmin = this.creatorId === this.userId
         } else if (res.code === 5001 || (res.message && res.message.indexOf('未加入家庭') >= 0)) {
@@ -276,21 +275,45 @@ export default {
       }
     },
     async onInvite() {
-      this.inviteQrCode = ''
-      this.inviteCode = ''
       uni.showLoading({ title: '生成邀请...' })
       try {
-        var res = await generateFamilyInviteQrCode()
+        var res = await generateFamilyInvite()
         if (res.code === 200 && res.data) {
-          this.inviteCode = res.data.inviteCode
-          this.inviteQrCode = res.data.qrCodeBase64
-          this.showPoster = true
+          var token = res.data.token
+          var qrCode = res.data.qrCodeBase64
+          // 分享小程序码
+          uni.share({
+            provider: 'weixin',
+            scene: 'WXSceneSession',
+            type: 5,
+            imageUrl: qrCode ? qrCode.replace('data:image/png;base64,', '') : '',
+            miniProgram: {
+              id: '',
+              path: 'pages/invite/join?token=' + token,
+              type: 0,
+              webUrl: 'https://cfc.etotem.com.cn/invite/join?token=' + token
+            },
+            success: function(shareRes) {
+              uni.hideLoading()
+              uni.showToast({ title: '分享成功', icon: 'success' })
+            },
+            fail: function(err) {
+              uni.hideLoading()
+              // 如果分享失败,复制链接
+              uni.setClipboardData({
+                data: 'https://cfc.etotem.com.cn/invite/join?token=' + token,
+                success: function() {
+                  uni.showToast({ title: '链接已复制', icon: 'success' })
+                }
+              })
+            }
+          })
         } else {
           uni.showToast({ title: res.message || '生成失败', icon: 'none' })
+          uni.hideLoading()
         }
       } catch (e) {
         uni.showToast({ title: '生成失败', icon: 'none' })
-      } finally {
         uni.hideLoading()
       }
     },

+ 2 - 2
cfc-frontend/utils/api.js

@@ -1246,8 +1246,8 @@ export const transferFamilyAdmin = (newAdminId) => {
 }
 
 // 通过邀请码申请加入家庭(需管理员审批)
-export const requestJoinByCode = (inviteCode) => {
-  return request('/api/family/invite/request-join-by-code', 'POST', { inviteCode: inviteCode })
+export const requestJoinByCode = (inviteCode, familyRole) => {
+  return request('/api/family/invite/request-join-by-code', 'POST', { inviteCode: inviteCode, familyRole: familyRole || '' })
 }
 
 // 查询待审批加入请求(管理员)

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-cb55c00ccecf4225e53fbe8b56b80c9a1b34c80a
+b223f85ba27aa39a76bb1f053d6fa5b86a1dbaa9

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

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

+ 1 - 1
cfc-web/package.json

@@ -1,6 +1,6 @@
 {
   "name": "cfc-web",
-  "version": "1.0.871",
+  "version": "1.0.872",
   "private": true,
   "scripts": {
     "dev": "vue-cli-service serve",

+ 7 - 0
cfc-web/public/CHANGELOG-v1.0.md

@@ -4,6 +4,13 @@
 
 ---
 
+## v1.0.872 (2026-08-08)
+
+### Bug 修复
+- 修复邀请流程 - 传递familyRole、改用小程序分享
+- 创建家庭时自动将创建人加入为家庭成员(修复空心家庭问题)
+
+
 ## v1.0.871 (2026-08-08)
 
 ### Bug 修复

+ 8 - 1
cfc-web/public/CHANGELOG.md

@@ -1,6 +1,6 @@
 # 更新日志
 
-> 当前版本: v1.0.871
+> 当前版本: v1.0.872
 
 ## 历史版本
 
@@ -8,6 +8,13 @@
 
 ---
 
+## v1.0.872 (2026-08-08)
+
+### Bug 修复
+- 修复邀请流程 - 传递familyRole、改用小程序分享
+- 创建家庭时自动将创建人加入为家庭成员(修复空心家庭问题)
+
+
 ## v1.0.871 (2026-08-08)
 
 ### Bug 修复