merge(gitea/devlop): 同步远端;冲突保留 GitHub 侧小程序与核心 API/后台页

Made-with: Cursor
This commit is contained in:
卡若
2026-03-22 08:36:15 +08:00
12 changed files with 94 additions and 239 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -651,10 +651,11 @@
gap: 10rpx;
}
.super-avatar {
position: relative;
width: 108rpx;
height: 108rpx;
border-radius: 50%;
overflow: hidden;
overflow: visible;
background: rgba(0,206,209,0.1);
display: flex;
align-items: center;
@@ -665,10 +666,33 @@
border: 3rpx solid #FFD700;
box-shadow: 0 0 12rpx rgba(255,215,0,0.3);
}
.super-avatar-pinned {
border: 3rpx solid #38bdac;
box-shadow: 0 0 16rpx rgba(56, 189, 172, 0.4);
}
.super-item-pinned .super-name {
color: #38bdac;
}
.pinned-badge {
position: absolute;
bottom: -4rpx;
right: -4rpx;
width: 28rpx;
height: 28rpx;
background: #38bdac;
border-radius: 50%;
font-size: 18rpx;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
line-height: 1;
}
.super-avatar-img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
.super-avatar-text {
font-size: 40rpx;

59
project.config.json Normal file
View File

@@ -0,0 +1,59 @@
{
"compileType": "miniprogram",
"miniprogramRoot": "miniprogram/",
"description": "Soul创业派对 - 来自派对房的真实商业故事",
"appid": "wxb8bbb2b10dec74aa",
"setting": {
"urlCheck": false,
"es6": true,
"enhance": true,
"postcss": true,
"preloadBackgroundData": false,
"minified": true,
"newFeature": true,
"coverView": true,
"nodeModules": false,
"autoAudits": false,
"showShadowRootInWxmlPanel": true,
"scopeDataCheck": false,
"uglifyFileName": false,
"checkInvalidKey": true,
"checkSiteMap": true,
"uploadWithSourceMap": true,
"compileHotReLoad": true,
"lazyloadPlaceholderEnable": false,
"useMultiFrameRuntime": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"enableEngineNative": false,
"useIsolateContext": true,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true,
"disableUseStrict": false,
"minifyWXML": true,
"showES6CompileOption": false,
"useCompilerPlugins": false,
"ignoreUploadUnusedFiles": true,
"compileWorklet": false,
"localPlugins": false,
"condition": false,
"swc": false,
"disableSWC": true
},
"condition": {},
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
},
"simulatorPluginLibVersion": {},
"packOptions": {
"ignore": [],
"include": []
}
}

View File

@@ -29,6 +29,7 @@ export interface PersonItem {
startTime?: string
endTime?: string
deviceGroups?: string
isPinned?: boolean
}
export interface LinkTagItem {

View File

@@ -388,8 +388,8 @@ export function ChapterTree({
)
}
// 2026每日派对干货独立篇章带六点拖拽、可拖可放(以 part_id 识别,标题来自 DB
const is2026Daily = part.id === 'part-2026-daily'
// 2026每日派对干货独立篇章带六点拖拽、可拖可放
const is2026Daily = part.title === '2026每日派对干货' || part.title.includes('2026每日派对干货')
if (is2026Daily) {
const partDragOver = isDragOver('part', part.id)
return (

View File

@@ -40,6 +40,8 @@ type Person struct {
// PersonSource 来源:空=后台手工添加vip_sync=超级个体自动同步(共用统一计划)
PersonSource string `gorm:"column:person_source;size:32;default:''" json:"personSource"`
IsPinned bool `gorm:"column:is_pinned;default:false" json:"isPinned"` // 置顶到小程序首页
CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"`
UpdatedAt time.Time `gorm:"column:updated_at" json:"updatedAt"`
}

View File

@@ -117,6 +117,8 @@ func Setup(cfg *config.Config) *gin.Engine {
admin.GET("/super-individual/stats", handler.AdminSuperIndividualStats)
admin.GET("/user/track", handler.UserTrackGet)
admin.GET("/track/stats", handler.AdminTrackStats)
admin.GET("/dashboard/leads", handler.AdminDashboardLeads)
admin.GET("/ckb/plan-check", handler.AdminCKBPlanCheck)
}
// ----- 鉴权 -----
@@ -210,6 +212,8 @@ func Setup(cfg *config.Config) *gin.Engine {
db.GET("/link-tags", handler.DBLinkTagList)
db.POST("/link-tags", handler.DBLinkTagSave)
db.DELETE("/link-tags", handler.DBLinkTagDelete)
db.PUT("/persons/pin", handler.DBPersonPin)
db.GET("/persons/pinned", handler.DBPersonPinnedList)
db.GET("/ckb-leads", handler.DBCKBLeadList)
db.GET("/ckb-person-leads", handler.DBCKBPersonLeads)
db.GET("/ckb-plan-stats", handler.CKBPlanStats)
@@ -364,6 +368,7 @@ func Setup(cfg *config.Config) *gin.Engine {
miniprogram.GET("/mentors/:id", handler.MiniprogramMentorsDetail)
miniprogram.POST("/mentors/:id/book", handler.MiniprogramMentorsBook)
miniprogram.GET("/about/author", handler.MiniprogramAboutAuthor)
miniprogram.GET("/persons/pinned", handler.DBPersonPinnedList)
// 埋点
miniprogram.POST("/track", handler.MiniprogramTrackPost)
// 规则引擎(用户旅程引导)

Binary file not shown.

View File

@@ -1,236 +0,0 @@
# Soul 创业派对 · 全站测试报告
**测试日期**2026-03-15
**测试范围**管理端前端20+ 页面) + 后端 API35 端点) + 小程序代码审查25 页面) + 数据库25 张表)
**测试原则**:只检测不修改,不做任何部署
---
## 一、测试覆盖总览
| 测试维度 | 覆盖量 | 通过 | 问题 |
|---------|-------|------|------|
| 管理端页面(浏览器截图) | 20+ 页面/子Tab | 18 | 2 |
| API 端点测试 | 35 端点 | 29 | 6 |
| 小程序代码审查 | 25 页面 + 8 工具文件 | 核心流程完整 | 32 |
| 数据库检查 | 25 张表 | 数据一致 | 2 |
| **合计** | **全站** | — | **42 个问题** |
---
## 二、问题清单(按严重程度排序)
### 🔴 严重Critical— 必须修复 · 共 11 个
| # | 模块 | 问题 | 文件/位置 | 解决方案 |
|---|------|------|----------|---------|
| C1 | API/安全 | **OSS accessKeySecret 明文返回前端** | `db.go` AdminSettingsGet | 后端返回 ossConfig 时脱敏处理accessKeySecret 返回 `****` |
| C2 | 小程序 | **payment.js API 路径全部错误**:使用不存在的 `app.globalData.apiBase``/payment/create` 等非标准路径 | `utils/payment.js` 全文件 | 若已不使用应删除;若要用需改为 `baseUrl` + `/api/miniprogram/*` |
| C3 | 小程序 | **payment.js 调用不存在的 `app.getUserInfo()`** | `utils/payment.js:188,201` | 改为 `app.globalData.userInfo` |
| C4 | 小程序 | **找伙伴跳转路径错误**`pages/catalog/catalog` 不存在 | `pages/match/match.js:311` | 改为 `pages/chapters/chapters` |
| C5 | 小程序 | **`wx.getUserProfile()` 已废弃**2022年后不可用 | `pages/settings/settings.js:251` | 改用 `<button open-type="chooseAvatar">` |
| C6 | 小程序 | **ES Module 语法与 CommonJS 混用**`export default` 在小程序默认环境不支持 | `utils/chapterAccessManager.js:209` | 统一为 `module.exports` 或确认构建工具可转译 |
| C7 | 小程序 | **同上 ES Module 问题** | `utils/readingTracker.js:249` | 同 C6 |
| C8 | 小程序 | **import/require 混用** | `pages/read/read.js:16-17` | 统一模块导入方式 |
| C9 | 小程序 | **import 语法问题** | `pages/vip/vip.js:1` | 同 C8 |
| C10 | 管理端 | **首次访问无登录验证**:直接打开 / 跳转到仪表盘无需登录 | 前端路由守卫 | 添加路由守卫:未登录强制跳转 `/login` |
| C11 | 数据库 | **stats API 免费章节数不一致**stats 返回 2all-chapters 实际 3 个 `isFree=true` | `book.go` BookStats | 核查 `is_free` 字段查询条件 |
### 🟠 高High— 优先修复 · 共 13 个
| # | 模块 | 问题 | 文件/位置 | 解决方案 |
|---|------|------|----------|---------|
| H1 | 小程序 | **废弃 Canvas API**`wx.createCanvasContext()` 将被移除 | `read.js:1377` | 迁移到 Canvas 2D 接口 |
| H2 | 小程序 | **baseUrl 硬编码生产环境 URL** | `app.js:11` | 通过环境变量或配置文件管理 |
| H3 | 小程序 | **appId/mchId 硬编码** | `app.js:17,22` | 移至配置文件或从 API 获取 |
| H4 | 小程序 | **匹配 API 失败时伪装成功**:显示 `joinSuccess: true` | `match.js:656-662` | 移除伪装逻辑,正确显示错误 |
| H5 | 小程序 | **生产环境残留测试模式购买逻辑** | `match.js:741-753` | 删除测试模式代码 |
| H6 | 小程序 | **客服微信号硬编码** | `read.js:1158,1207` | 从系统配置 API 获取 |
| H7 | 小程序 | **goToMatch() 方法重复定义**,后者覆盖前者 | `my.js:784,801` | 删除重复定义 |
| H8 | 小程序 | **payment.js 未被任何页面引用**,支付逻辑在 read.js 直接实现 | `utils/payment.js` | 删除无用文件或统一支付入口 |
| H9 | 管理端 | **仪表盘新注册用户列表用户名显示为"-"** | 仪表盘页面 | 改为显示昵称或手机号(脱敏) |
| H10 | 管理端 | **分类标签点击统计无数据**,提示"暂无点击数据" | 仪表盘页面 | 确认埋点数据源或改进空状态提示 |
| H11 | API | **admin/chapters 分页参数被忽略**:无论 pageSize 多大,返回结构不含分页数据 | `db_book.go` | 添加 page/pageSize 参数支持 |
| H12 | API | **admin/users 实际返回管理员列表**而非普通用户 | `db.go` | 确认是否需要独立的普通用户管理 API |
| H13 | 数据库 | **persons 表数据为空**0条记录但管理端"链接人与事"有展示 | 数据同步 | 检查 persons 数据来源和同步逻辑 |
### 🟡 中Medium— 建议修复 · 共 12 个
| # | 模块 | 问题 | 文件/位置 | 解决方案 |
|---|------|------|----------|---------|
| M1 | 小程序 | `totalSections: 62` 硬编码 | `app.js:32` | 从 API 获取 |
| M2 | 小程序 | `appendixList` 硬编码 3 个附录条目 | `chapters.js:31-35` | 从 API 获取 |
| M3 | 小程序 | `getSectionTitle()` 硬编码部分章节 ID→标题映射 | `read.js:351-366` | 从 API 获取 |
| M4 | 小程序 | 热门搜索关键词硬编码 | `search.js:17` | 从配置 API 获取 |
| M5 | 小程序 | `startDate = new Date('2025-01-01')` 动态价格逻辑硬编码 | `payment.js:163` | 若文件保留,改为配置驱动 |
| M6 | 小程序 | 大量 `console.log` 调试日志未清理 | `referral.js` 约50+行 | 生产环境前清理 |
| M7 | 小程序 | `generateMockMatch()` 模拟数据残留 | `match.js:470-496` | 删除模拟数据 |
| M8 | 小程序 | `data` 对象末尾悬空逗号 | `referral.js:68` | 修复语法 |
| M9 | 小程序 | Token 明文存储 `wx.setStorageSync` | `app.js:515` | 小程序环境可接受,建议加密存储 |
| M10 | 管理端 | 订单内容文字过长被截断,无 hover 提示 | 仪表盘最近订单 | 添加 tooltip 或点击查看详情 |
| M11 | 管理端 | 数据刷新按钮文字过长 | 仪表盘 | 简化为图标+tooltip |
| M12 | API | 热度 Top20 中有 8/20 条零点击数 | `/api/book/hot` | 检查 reading_progress 数据是否完整 |
### 🟢 低Low— 可优化 · 共 6 个
| # | 模块 | 问题 | 文件/位置 |
|---|------|------|----------|
| L1 | 小程序 | 文件顶部 console.log 调试输出 | `index.js:7` |
| L2 | 小程序 | `mockLogin()` 已废弃但未删除 | `app.js:600-603` |
| L3 | 小程序 | `loadLatestChapters()` 重复请求 `all-chapters` | `index.js:494` |
| L4 | 小程序 | `catch {}` 空 catch 块无日志 | `ruleEngine.js:45,53` |
| L5 | 管理端 | 错误提示在输入正确凭据后仍短暂可见 | 登录页 |
| L6 | API | `version` 返回 `0.0.0`,建议使用实际版本号 | `/health` |
---
## 三、核心功能流程评估
| 流程 | 状态 | 评估 |
|------|------|------|
| 登录/注册 | ✅ 完整 | wx.login + 手机号双通道,协议勾选,单页模式兜底 |
| 付费购买章节 | ✅ 完整 | 权限状态机→预支付→wx.requestPayment→同步→解锁 |
| VIP 购买 | ✅ 完整 | VIP 状态查询→支付→同步权益→刷新全局 |
| 钱包充值 | ✅ 完整 | 选金额→创建订单→支付→确认→刷新余额 |
| 分销/推广 | ✅ 完整 | 邀请码→分享带ref→绑定→收益→提现→微信零钱 |
| 找伙伴/匹配 | ⚠️ 有缺陷 | 路径错误(C4)、失败伪装成功(H4)、测试模式残留(H5) |
| 搜索 | ✅ 完整 | 关键词搜索→API 查询→结果展示→跳转阅读 |
| 阅读章节 | ✅ 完整 | 多入口(scene/mid/id)→权限判断→内容解析→进度追踪 |
---
## 四、管理端页面测试详情
### 已测试页面清单(全部截图)
| 模块 | 子页面/Tab | 状态 | 关键数据 |
|------|-----------|------|---------|
| 登录 | 登录页 | ✅ | 错误凭据有提示,正确登录跳转仪表盘 |
| 仪表盘 | 数据概览 | ✅ | 149用户, ¥2007.75收入, 29订单, 10.7%转化率 |
| 内容管理 | 章节管理 | ✅ | 8篇 · 90节内容 |
| 内容管理 | 内容排行榜 | ✅ | 90节排行预览比例20% |
| 内容管理 | 内容搜索 | ✅ | 搜索框正常 |
| 内容管理 | 链接人与事 | ✅ | AI列表token/位置/类型展示 |
| 内容管理 | 链接标签 | ✅ | 3个标签卡若创业派对/碎片时间/神仙团队) |
| 用户管理 | 用户列表 | ✅ | 149位用户筛选/搜索/分页正常 |
| 用户管理 | 用户旅程 | ✅ | 8阶段漏斗149→4→12→10→14→0→0→0 |
| 找伙伴 | 数据统计 | ✅ | 总匹配63, 17用户, AI线索51 |
| 找伙伴 | 匹配记录 | ✅ | 63条记录 |
| 找伙伴 | 匹配池设置 | ✅ | VIP 6人, 完善资料 7人, 全部 13人 |
| 找伙伴 | 资源对接 | ✅ | 0条记录 |
| 找伙伴 | 导师管理 | ✅ | 1位导师卡若3种价格方案 |
| 找伙伴 | 团队招募 | ✅ | 4条记录 |
| 推广中心 | 数据概览 | ✅ | 累计: 1025点击, 41绑定, 2转化, ¥2007.75 |
| 推广中心 | 订单管理 | ✅ | 444条订单记录 |
| 推广中心 | 绑定管理 | ✅ | 41条绑定关系 |
| 推广中心 | 提现审核 | ✅ | 3条记录含已拒绝/已完成) |
| 推广中心 | 推广设置 | ✅ | 好友收益/推广者收益/提现规则 |
| 系统设置 | 系统设置 | ✅ | 功能开关/价格/小程序/OSS均有配置 |
| 系统设置 | 作者详情 | ✅ | 基本信息/统计数据/亮点标签 |
| 系统设置 | 管理员 | ✅ | 1个管理员admin/卡若/超级管理员) |
| 系统设置 | API文档 | ✅ | 完整的接口文档 |
---
## 五、API 端点测试详情
### 全部 35 端点测试结果
| 端点 | 状态码 | 数据 | 问题 |
|------|-------|------|------|
| GET /health | 200 | ok, version 0.0.0 | L6: version 未设置 |
| GET /api/config | 200 | 配置完整 | ✅ |
| GET /api/book/all-chapters | 200 | 90 条 | ✅ |
| GET /api/book/hot | 200 | 20 条 | M12: 8条零点击 |
| GET /api/book/recommended | 200 | 数据完整 | ✅ |
| GET /api/book/search?q=创业 | 200 | 20 条 | ✅ |
| GET /api/book/search?q= | 200 | 0 条 | ✅ 空搜索正确处理 |
| GET /api/book/search?q=xxx | 200 | 0 条 | ✅ 无结果正确处理 |
| GET /api/book/stats | 200 | 90章/2免费/209624字/149用户 | C11: 免费数量可能不准 |
| GET /api/miniprogram/config | 200 | 配置完整 | ✅ |
| GET /api/miniprogram/book/hot | 200 | 数据完整 | ✅ |
| GET /api/miniprogram/book/stats | 200 | 同 stats | ✅ |
| GET /api/miniprogram/mentors | 200 | 1 条 | ✅ |
| GET /api/miniprogram/vip/members | 200 | 数据完整 | ✅ |
| GET /api/admin/dashboard/stats | 200 | 149用户/30付费/¥2008.75 | ✅ |
| GET /api/admin/chapters | 200 | 章节数据 | H11: 无分页支持 |
| GET /api/admin/users | 200 | 1条(管理员) | H12: 返回管理员非用户 |
| GET /api/admin/orders | 200 | 448笔/¥2008.75 | ✅ |
| GET /api/admin/track/stats | 200 | 追踪数据 | ✅ |
| GET /api/admin/settings | 200 | 完整设置 | C1: OSS密钥明文 |
| GET /api/admin/referral-settings | 200 | 推广配置 | ✅ |
| GET /api/admin/author-settings | 200 | 作者配置 | ✅ |
| GET /api/db/book?action=list | 200 | 数据 | ✅ |
| GET /api/db/ckb-leads | 200 | 0 条 | ✅ |
| GET /api/db/ckb-plan-stats | 200 | 数据 | ✅ |
| GET /api/db/vip-roles | 200 | 10 条 | ✅ |
| GET /api/db/mentors | 200 | 1 条 | ✅ |
| GET /api/db/persons | 200 | 0 条 | H13: 空数据 |
| 无Token→admin/settings | 401 | 拒绝 | ✅ 鉴权正常 |
| 错误Token→admin/settings | 401 | 拒绝 | ✅ 鉴权正常 |
| POST /api/admin 空body | 错误 | 有提示 | ✅ |
| search 无 q 参数 | 200 | 空结果 | ✅ |
| upload 非图片 | 400 | 拒绝 | ✅ |
| upload 图片(OSS) | 200 | OSS签名URL | ✅ |
---
## 六、数据库检查结果
### 6.1 表结构25 张表)
users, chapters, orders, persons, mentors, mentor_consultations, vip_roles, link_tags, user_balances, balance_transactions, gift_unlocks, system_config, admin_users, match_records, referral_bindings, referral_visits, user_tracks, user_rules, reading_progress, withdrawals, wechat_callback_logs, ckb_submit_records, ckb_lead_records, user_addresses, author_config
### 6.2 数据量
| 表 | 数据量 | 说明 |
|---|-------|------|
| chapters | 90 | 8篇, 0无标题, 0零字数 |
| users | 149 | dashboard 显示 |
| orders | 448 | 含已支付/待支付/其他 |
| match_records | 63 | 匹配记录 |
| referral_bindings | 41 | 推广绑定 |
| vip_roles | 10 | VIP 角色定义 |
| mentors | 1 | 导师(卡若) |
| persons | 0 | ⚠️ 空 |
| ckb_lead_records | 0 | ⚠️ 空 |
### 6.3 数据一致性
| 检查项 | 结果 |
|--------|------|
| 章节数 stats vs all-chapters | ✅ 一致90 |
| 收入 orders vs dashboard | ✅ 一致¥2008.75 |
| 用户数 stats vs dashboard | ✅ 一致149 |
| 订单无重复 | ✅ 无重复订单号 |
| 免费章节数 | ⚠️ stats=2, 实际可能=3 |
---
## 七、优先修复路线图
### 第一批:安全问题(紧急)
1. **C1** OSS 密钥脱敏 — 后端 AdminSettingsGet 返回 ossConfig 时隐藏 accessKeySecret
2. **C10** 管理端登录守卫 — 前端路由添加 token 检查
### 第二批:功能修复(高优先)
3. **C4** match.js 跳转路径修正
4. **H4+H5** 移除匹配失败伪装成功 + 测试模式购买逻辑
5. **C5** 移除废弃 wx.getUserProfile()
6. **C2+C3+H8** 清理或修复 payment.js
7. **C6-C9** 统一模块导入方式
### 第三批:数据优化
8. **C11** 修正免费章节计数
9. **H9** 仪表盘用户名显示
10. **H11+H12** API 分页和用户列表修正
11. **M12** 热度数据零点击检查
### 第四批:代码清理
12. **M6+M7** 清理调试日志和模拟数据
13. **H6+M1-M5** 消除硬编码
14. **L1-L6** 低优先优化
---
**测试结论**:项目核心功能链路(登录→阅读→购买→分销)基本完整可用,管理端 UI 质量良好。主要风险集中在安全层面OSS 密钥泄露、登录守卫缺失)和小程序代码质量(废弃 API、模块语法混用、调试残留。建议按优先级路线图逐批修复。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB