Merge branch 'yongxu-dev' into devlop

# Conflicts:
#	miniprogram/pages/profile-edit/profile-edit.js
#	miniprogram/pages/profile-edit/profile-edit.wxml
#	miniprogram/pages/settings/settings.js
#	miniprogram/utils/ruleEngine.js
#	soul-admin/src/pages/distribution/DistributionPage.tsx
#	soul-admin/src/pages/users/UsersPage.tsx
#	soul-api/.env.production
#	soul-api/.gitignore
#	soul-api/internal/handler/db_ckb_leads.go
#	soul-api/internal/handler/miniprogram.go
#	soul-api/internal/handler/referral.go
#	开发文档/1、需求/archive/链接人与事-存客宝同步-需求规划.md
#	开发文档/1、需求/archive/链接人与事-实现方案.md
This commit is contained in:
Alex-larget
2026-03-20 14:48:02 +08:00
247 changed files with 8990 additions and 6983 deletions

View File

@@ -0,0 +1,32 @@
# 挖矿病毒排查与服务器操作 Skills 创建
**日期**2026-03-20
## 背景
基于 agent 记录3b9e0fa0、bc781e1b、1c1a81c3 等中挖矿病毒排查经验以及本地部署脚本devloy.py、master.py、soul-admin/deploy.py、Cunkebao/miner_guard_install.py 等),将经验吸收转化为 Skills。
## 新增 Skills
### 1. security-miner-guard
- **路径**`.cursor/skills/security-miner-guard/SKILL.md`
- **触发词**挖矿病毒、xmrig、服务器被入侵、miner_guard、安全排查、杀挖矿
- **内容**挖矿病毒特征、入侵链路、排查脚本、加固建议、miner_guard 安装与检查
### 2. security-server-ops
- **路径**`.cursor/skills/security-server-ops/SKILL.md`
- **触发词**部署、服务器操作、SSH、宝塔、devloy、master、Cunkebao 部署
- **内容**:服务器索引、部署脚本索引、环境变量一览、常用操作(不含明文密码)
## 配置更新
- `paths.py`:新增 `AGENT_SECURITY``ROLE_TO_AGENT["安全工程师"]`
- `老板分身-索引.mdc`:经验自动收集推断增加「挖矿/安全/服务器操作→安全工程师」
- `soul-project-boundary.mdc`:按语义触发词增加安全工程师及对应 Skills
## 安全提醒
- Skills 中**不写入明文密码**,仅说明配置来源(环境变量、脚本 get_cfg()
- 建议将 master.py、devloy.py 等中的默认密码迁移到环境变量

View File

@@ -0,0 +1,26 @@
# 管理端部署触发词约定
**日期**2026-03-20
## 场景
用户说「管理端帮我部署到xx环境」时安全工程师应语义化解析 xx直接执行对应部署脚本。
## 解决方案
- **触发词**管理端帮我部署到xx环境语义化理解意图即可
- **脚本映射**
- 含「正式」「线上」「生产」→ `cd soul-admin && python master.py`(正式环境,/www/wwwroot/self/soul-admin
- 含「测试」「dev」→ `cd soul-admin && python deploy.py`(测试环境,/www/wwwroot/self/soul-admin-dev
## soul-admin 部署脚本
| 脚本 | 环境 | 目标目录 | 构建命令 |
|------|------|----------|----------|
| master.py | 正式 | soul-admin | pnpm build |
| deploy.py | 测试 | soul-admin-dev | pnpm run build:dev |
## 已升级 Skills
1. **security-server-ops**何时使用表、2.2 soul-admin 脚本索引、4.4/4.5 常用操作
2. **soul-project-boundary**:按场景触发词表新增

View File

@@ -0,0 +1,18 @@
# 部署 API 触发词约定
**日期**2026-03-20
## 场景
用户说「帮我部署api到线上」时安全工程师应直接执行部署脚本无需再询问或选择。
## 解决方案
- **触发词**帮我部署api到线上
- **动作**:直接执行 `cd soul-api && python master.py`
- **脚本**`soul-api/master.py`soul-api 正式环境部署)
## 已升级 Skills
1. **security-server-ops**:何时使用表新增该触发词,明确直接执行命令
2. **soul-project-boundary**:按场景触发词表新增,加载 security-server-ops 后执行

View File

@@ -0,0 +1,9 @@
# 安全工程师 经验索引
> 挖矿病毒排查、服务器加固、部署与运维相关经验。
| 日期 | 摘要 | 文件 |
|------|------|------|
| 2026-03-20 | 挖矿病毒排查经验转化为 Skills服务器操作 Skill 创建 | 2026-03-20-挖矿与服务器Skills.md |
| 2026-03-20 | 「帮我部署api到线上」→ 执行 soul-api/master.py | 2026-03-20-部署API触发词.md |
| 2026-03-20 | 「管理端帮我部署到xx环境」→ 语义化解析正式→master.py测试→deploy.py | 2026-03-20-管理端部署触发词.md |

View File

@@ -0,0 +1,41 @@
# 原生按钮覆盖定位,避免样式干扰
**日期**2026-03-19
**场景**:小程序中需在头像、图片等区域触发 `open-type="chooseAvatar"` 等原生能力,用 `<button>` 包裹会导致原生样式(灰色矩形、边框等)影响界面。
**方案****不用 button 包裹**,改为 **button 绝对定位覆盖** 在目标区域上方。
## 正确结构
```html
<!-- 外层position: relative 作为定位参考 -->
<view class="avatar-wrap">
<!-- 实际展示内容:头像、徽章等 -->
<view class="avatar-inner">...</view>
<view class="vip-badge">VIP</view>
<!-- 透明 button 覆盖在上方,同级而非包裹 -->
<button class="avatar-overlay-btn" open-type="chooseAvatar" bindchooseavatar="onChooseAvatar"></button>
</view>
```
```css
.avatar-wrap { position: relative; }
.avatar-overlay-btn {
position: absolute; top: 0; left: 0;
width: 130rpx; height: 130rpx; /* 与头像一致 */
padding: 0; margin: 0;
background: transparent; border: none;
}
.avatar-overlay-btn::after { border: none; }
```
## 要点
- **同级关系**button 与展示元素是 sibling不是 parent-child
- **绝对定位**`position: absolute` 覆盖在目标区域上,不参与文档流
- **透明无内容**button 仅负责点击事件,样式完全透明
- **适用**chooseAvatar、open-type 等需 button 触发的原生能力
## 升级 Skill
已写入 `miniprogram-dev` SKILL §12。

View File

@@ -0,0 +1,39 @@
# 手机号一键登录与登录弹窗公用组件
> 日期2026-03-20 | 角色:小程序开发工程师
## 问题与场景
1. **getPhoneNumber 不弹窗**:点击手机号登录按钮时,无法弹出手机号选择界面,也无法获取手机号
2. **登录弹窗重复**read、my、gift-pay/detail 三处各自维护一套登录弹窗,逻辑重复、维护成本高
3. **登录后手机号未同步**:手机号登录后若响应中 user.phone 为空,本地 userInfo 未更新
## 解决方案
### 1. getPhoneNumber 必须与隐私协议耦合
- **open-type**`open-type="getPhoneNumber|agreePrivacyAuthorization"`(基础库 2.32.3+
- **onNeedPrivacyAuthorization**app.js 中需将使用 getPhoneNumber 的页面加入支持列表,否则会 `resolve({ event: 'disagree' })` 导致获取失败
- **支持页面**avatar-nickname、profile-edit、read、my、gift-pay/detail、index、settings
- **隐私弹窗**:当 onNeedPrivacyAuthorization 触发时,页面需有 `showPrivacyModal` + `<button open-type="agreePrivacyAuthorization">` 供用户同意
### 2. 登录弹窗公用组件
- **组件路径**`components/login-modal/`
- **使用方式**`<login-modal show="{{showLoginModal}}" desc="..." showPrivacyModal="{{showPrivacyModal}}" showCancel="{{true}}" bind:close="..." bind:success="..." bind:privacyagree="..." />`
- **适用页面**read、my、gift-pay/detail
- **app.json**:全局注册 `"login-modal": "/components/login-modal/login-modal"`
### 3. 登录后手机号同步
- **loginWithPhone 后**:若 `user.phone` 为空,调用 `_syncPhoneFromProfileAfterLogin(userId)` 从 profile 拉取最新
- **checkLoginStatus 恢复缓存时**:若 `userInfo.phone` 为空,调用 `_refreshUserInfoIfPhoneEmpty()` 静默刷新
## 管理后台配置
- **隐私保护指引**:小程序管理后台 → 设置 → 用户隐私保护指引,必须声明「收集你选择的手机号」
- **主体限制**:个人主体小程序无法使用 getPhoneNumber
## 升级 Skill
- miniprogram-dev SKILL §8 补充 getPhoneNumber 耦合与 onNeedPrivacyAuthorization 页面支持

View File

@@ -13,3 +13,5 @@
| 2026-03-14 | 我的页设置入口隐藏;资料修改引导场景梳理(登录后、@某人、找伙伴、链接卡若) | [2026-03-14.md](./2026-03-14.md) |
| 2026-03-16 | 编辑资料页分享名片:转发/朋友圈特殊处理Canvas 绘制封面,标题「昵称+为您分享名片」 | [2026-03-16.md](./2026-03-16.md) |
| 2026-03-17 | 代付美团式:读页→代付页→分享;详情页双态(发起人/好友);目录 loading、最新新增 5 条折叠 | [2026-03-17.md](./2026-03-17.md) |
| 2026-03-19 | 原生按钮覆盖定位chooseAvatar 等用绝对定位 overlay 覆盖,禁止 button 包裹,避免原生样式影响 | [2026-03-19-原生按钮覆盖定位.md](./2026-03-19-原生按钮覆盖定位.md) |
| 2026-03-20 | 手机号一键登录与公用组件getPhoneNumber 耦合 agreePrivacyAuthorizationlogin-modal 组件;登录后手机号同步 | [2026-03-20-手机号登录与公用组件.md](./2026-03-20-手机号登录与公用组件.md) |

View File

@@ -53,6 +53,10 @@
| 2026-03-17 | 后端、团队 | 架构/最佳实践 | api-dev SKILL | Redis 缓存parts/hot/recommended/stats/config/章节 content容灾回退 DBOSS 上传;/health 返回 database/redis 状态 |
| 2026-03-18 | 小程序、团队 | 业务规则/最佳实践 | - | 分享链路兼容好友/朋友圈 singlePage单页模式能力降级不支付/不自动领取),引导点击底部“前往小程序”进入完整版 |
| 2026-03-18 | 产品、后端、管理端、测试 | 文档归档/需求口径 | - | 文档归档整理:以《以界面定需求》为基准,各角色重整“功能需求+验收口径+风险点”并写入各自经验库;补齐《项目落地推进表》 |
| 2026-03-19 | 小程序 | 最佳实践 | miniprogram-dev SKILL §11 | 原生按钮覆盖定位chooseAvatar 等用绝对定位 overlay 覆盖,禁止 button 包裹,避免原生样式影响(灰色矩形等) |
| 2026-03-20 | 安全工程师 | 触发词约定 | security-server-ops、soul-project-boundary | 「帮我部署api到线上」→ 直接执行 soul-api/master.py |
| 2026-03-20 | 安全工程师 | 触发词约定 | security-server-ops、soul-project-boundary | 「管理端帮我部署到xx环境」→ 语义化解析正式→master.py测试→deploy.py |
| 2026-03-20 | 小程序 | 最佳实践 | miniprogram-dev SKILL §8 | 手机号登录getPhoneNumber 需耦合 agreePrivacyAuthorizationonNeedPrivacyAuthorization 支持页面;登录弹窗公用组件 login-modal |
---
@@ -63,4 +67,4 @@
---
**最后更新**2026-03-18
**最后更新**2026-03-20

View File

@@ -6,7 +6,7 @@
## 项目总结
Soul 创业派对产品定位:面向创业者的社区/工具型小程序。核心需求文档在 `开发文档/1、需求/需求汇总.md`,项目推进表在 `开发文档/10、项目管理/项目落地推进表.md`,临时需求/分析在 `临时需求池/`
Soul 创业派对产品定位:面向创业者的社区/工具型小程序。核心需求文档在 `开发文档/1、需求/`(按日期命名,以最新为主;见 `1、需求/索引.md`,项目推进表在 `开发文档/10、项目管理/项目落地推进表.md`,临时需求/分析在 `临时需求池/`
---

View File

@@ -31,9 +31,11 @@ Soul 创业派对全项目架构与约定路由隔离miniprogram/admin/db
| 2026-03-17 | 性能优化与 Redis 缓存方案落地Redis 容灾回退 DB、OSS 上传容灾;/health 返回 database/redis 状态 | 已完成 |
| 2026-03-18 | 吸收经验:分享进入链路需兼容朋友圈 singlePage单页模式不执行支付/自动领取等强动作并引导“前往小程序” | 已完成 |
| 2026-03-18 | 会议:超级个体开通后自动创建@人统一走 Person幂等键绑定 userId默认资料 flags 后端输出 | 已完成 |
| 2026-03-20 | 「帮我部署api到线上」→ 安全工程师执行 soul-api/master.pysecurity-server-ops、soul-project-boundary 触发词升级 | 已完成 |
| 2026-03-20 | 「管理端帮我部署到xx环境」→ 语义化解析:正式/线上/生产→master.py测试/dev→deploy.pysoul-admin 部署脚本索引 | 已完成 |
> **格式说明**:每次架构级讨论后在此追加一行,日期格式 YYYY-MM-DD
---
**最后更新**2026-03-18
**最后更新**2026-03-20

View File

@@ -41,9 +41,11 @@
| 2026-03-17 | 会议收尾:源码优化 5 项全部完成;开发环境测试通过 | 已完成 |
| 2026-03-18 | 吸收经验:分享链路需兼容好友/朋友圈 singlePage单页模式能力降级并引导“前往小程序”进入完整版 | 已完成 |
| 2026-03-18 | 会议:支付超级个体前/开通后资料默认校验,跳转 avatar-nickname 引导页(仅头像+昵称) | 已完成 |
| 2026-03-19 | 吸收经验原生按钮覆盖定位chooseAvatar 用绝对定位 overlay 覆盖头像,禁止 button 包裹,已升级 SKILL §11 | 已完成 |
| 2026-03-20 | 手机号一键登录getPhoneNumber 耦合 agreePrivacyAuthorizationonNeedPrivacyAuthorization 支持 read/my/gift-pay/index/settings登录弹窗公用组件 components/login-modal登录后手机号同步 _syncPhoneFromProfileAfterLogin | 已完成 |
> **格式说明**:每次开发后在此追加一行,日期格式 YYYY-MM-DD状态用已完成 / 进行中 / 待续 / 搁置
---
**最后更新**2026-03-18
**最后更新**2026-03-20

View File

@@ -53,6 +53,7 @@ AGENT_BACKEND = AGENT / "后端工程师"
AGENT_PRODUCT = AGENT / "产品经理"
AGENT_TEST = AGENT / "软件测试"
AGENT_TEAM = AGENT / "团队"
AGENT_SECURITY = AGENT / "安全工程师"
# ========== 常用文件 ==========
RULE_MAIN = RULES / "老板分身-索引.mdc"
@@ -80,6 +81,9 @@ ROLE_TO_AGENT = {
"软件测试": "软件测试",
"测试": "软件测试",
"测试人员": "软件测试",
# 安全
"安全工程师": "安全工程师",
"安全": "安全工程师",
# 通用
"团队": "团队",
}

View File

@@ -12,5 +12,5 @@ alwaysApply: false
### 行为摘要(供模型快速理解,完整流程以 SKILL 文件为准)
1. **文档同步**:从对话中提炼结论/待办/变更 → 写入 `开发文档/1、需求/需求汇总.md`、`开发文档/10、项目管理/运营与变更.md`、`临时需求池/` 等对应文档
1. **文档同步**:从对话中提炼结论/待办/变更 → 写入 `开发文档/1、需求/YYYY-MM-DD-需求.md`(当日文件,以日期最新为主)、`开发文档/10、项目管理/运营与变更.md`、`临时需求池/` 等对应文档
2. **经验入库**:提炼经验 → 写入 `agent/{角色}/evolution/YYYY-MM-DD.md` → 更新 `agent/开发助理/项目索引/{索引名}.md`(写日期)→ 更新 `agent/开发助理/经验清单.md` → 升级对应 SKILL

View File

@@ -20,6 +20,13 @@ alwaysApply: true
| 预览/参考 | next-project/ | 仅预览,非线上 | 不依赖 |
| **新版管理端** | **new-soul/soul-admin/** | 新版参考实现,迁移时对照 | soul-api |
## 需求目录与命名约定
- **需求目录**`开发文档/1、需求/`
- **命名**`YYYY-MM-DD-需求.md` 或 `YYYY-MM-DD-简短描述.md`
- **主需求**:以日期最新的需求文件为主;同步需求时新建/更新当日文件,并更新 `1、需求/索引.md`
- **基准**`以界面定需求.md` 为界面级需求基准,新增/改版界面或业务规则时先更新该文档
## 核心原则
- 小程序只调 `/api/miniprogram/*`;管理端只调 `/api/admin/*`、`/api/db/*`;禁止混用。
@@ -50,6 +57,7 @@ alwaysApply: true
| 小程序、miniprogram、C 端、微信小程序 | 小程序开发工程师 | `e:\Gongsi\Mycontent\.cursor\skills\miniprogram-dev\SKILL.md` |
| 产品、需求、验收、排期、需求文档 | 产品经理 | `e:\Gongsi\Mycontent\.cursor\skills\product-manager\SKILL.md` |
| 测试、测试用例、回归测试、功能测试、QA | 测试人员 | `e:\Gongsi\Mycontent\.cursor\skills\testing\SKILL.md` |
| 挖矿、安全、服务器操作、部署、miner_guard、xmrig、入侵排查 | 安全工程师 | `e:\Gongsi\Mycontent\.cursor\skills\security-miner-guard\SKILL.md`、`e:\Gongsi\Mycontent\.cursor\skills\security-server-ops\SKILL.md` |
### 按场景触发词
@@ -63,5 +71,7 @@ alwaysApply: true
| 会议结束、散会、会开完了 | `e:\Gongsi\Mycontent\.cursor\skills\assistant-doc-sync\SKILL.md`(会议收尾) |
| **加个需求**、加个需求xxx | `e:\Gongsi\Mycontent\.cursor\skills\product-manager\SKILL.md`(产品经理三端分析 → 功能规划 → 指派) |
| **新版分析**、版本对比、迁移分析、甲方代码分析、快速分析新版、抽取需求 | `e:\Gongsi\Mycontent\.cursor\skills\new-version-analyze\SKILL.md`(新版快速分析 → 差异清单 → 接口冲突 → 迁移迭代) |
| **帮我部署api到线上** | `e:\Gongsi\Mycontent\.cursor\skills\security-server-ops\SKILL.md`(安全工程师 → 执行 soul-api/master.py |
| **管理端帮我部署到xx环境** | `e:\Gongsi\Mycontent\.cursor\skills\security-server-ops\SKILL.md`(安全工程师 → 语义化解析 xx正式/线上/生产→master.py测试/dev→deploy.py |
**注意**:「必须 Read」= 使用 Read 工具读取**绝对路径**的完整文件内容后执行,不可跳过或仅凭记忆。

View File

@@ -39,6 +39,7 @@ alwaysApply: true
- 产品/需求/config→**产品经理**
- 测试/自检/QA→**软件测试**
- 架构/选型/路由约定/三端协同→**团队**
- 挖矿/安全/服务器操作/部署/入侵排查→**安全工程师**
- 无法判断→**通用**(写入开发助理)
3. **若可写文件**
- **有明确目标角色**:写入 `.cursor/agent/{角色}/evolution/YYYY-MM-DD-简短描述.md`,并更新该目录下的 `索引.md`

View File

@@ -30,7 +30,7 @@ description: 开发团队文档同步与经验升级。小橙、橙子、讨论
| 要点类型 | 写入位置 | 示例 |
|----------|----------|------|
| 需求清单项 | `开发文档/1、需求/需求汇总.md` 需求清单表 | 会员分润差异化、VIP 手动设置 |
| 需求清单项 | `开发文档/1、需求/YYYY-MM-DD-需求.md`(当日文件,以日期最新为主) | 会员分润差异化、VIP 手动设置;同步后更新 `1、需求/索引.md` |
| 近期讨论 | `开发文档/10、项目管理/运营与变更.md` | 第五部分或新增节 |
| 技术分析 | `临时需求池/``开发文档/8、部署/` | 分润需求-技术分析.md |
| 项目推进 | `开发文档/10、项目管理/项目落地推进表.md` | 第十二节永平落地表 |
@@ -83,6 +83,7 @@ description: 开发团队文档同步与经验升级。小橙、橙子、讨论
| 后端开发 | `agent/后端工程师/evolution/` | `agent/开发助理/项目索引/后端.md` |
| 产品经理 | `agent/产品经理/evolution/` | `agent/开发助理/项目索引/产品.md` |
| 测试人员 | `agent/软件测试/evolution/` | `agent/开发助理/项目索引/测试.md` |
| 安全工程师 | `agent/安全工程师/evolution/` | `agent/开发助理/项目索引/团队.md` |
| 助理橙子 | `agent/开发助理/evolution/` | `agent/开发助理/项目索引/助理橙子.md` |
| 跨角色/团队 | `agent/团队/evolution/` | `agent/开发助理/项目索引/团队.md` |
@@ -129,7 +130,10 @@ description: 开发团队文档同步与经验升级。小橙、橙子、讨论
```
开发文档/
├── 1、需求/需求汇总.md # 需求清单、业务需求
├── 1、需求/
│ ├── 索引.md # 主需求 = 日期最新的需求文件
│ ├── YYYY-MM-DD-需求.md # 需求文件按日期命名,以最新为主
│ └── 以界面定需求.md # 界面级需求基准
├── 8、部署/ # 技术方案、部署说明
├── 10、项目管理/
│ ├── 项目落地推进表.md # 里程碑、永平落地
@@ -152,7 +156,7 @@ description: 开发团队文档同步与经验升级。小橙、橙子、讨论
**小橙**执行:
1. 提炼VIP 手动设置已完成;会员分润差异化待实现;好友优惠仅针对文章
2. 更新 `需求汇总.md`:新增「需求清单」行
2. 更新 `1、需求/YYYY-MM-DD-需求.md`(当日文件):新增「需求清单」行;同步后更新 `1、需求/索引.md`
3. 更新 `运营与变更.md`:第五部分追加近期讨论
4. 回复:已记录并更新开发文档,详见 xxx

View File

@@ -79,6 +79,8 @@ description: Soul 创业派对小程序开发规范。在 miniprogram/ 下编辑
## 8. 平台合规与能力检测2025 起)
- **隐私按需授权**:涉及用户信息的接口(登录、手机号、位置等)必须在用户**实际触发功能时**再请求授权,禁止在 `app.onLaunch` 中集中请求。需配置《小程序用户隐私保护指引》,使用 `<button open-type="agreePrivacyAuthorization">` 获取同意。
- **getPhoneNumber 必须耦合**`open-type="getPhoneNumber|agreePrivacyAuthorization"`(基础库 2.32.3+),否则无法弹窗获取手机号。同时需在 app.js 的 `onNeedPrivacyAuthorization` 中将该页面加入支持列表,并提供 `showPrivacyModal` + 同意按钮,否则会 resolve(disagree) 导致失败。
- **登录弹窗**:使用公用组件 `components/login-modal`read/my/gift-pay 等页面引入,避免重复实现。
- **能力检测**:使用新 API 前用 `wx.canIUse('api.xxx')` 检测,低版本做降级。
- **Skyline可选**:性能敏感页面可在 `page.json` 中配置 `"renderer": "skyline"`,仍使用 WXML/WXSS。
@@ -104,7 +106,24 @@ description: Soul 创业派对小程序开发规范。在 miniprogram/ 下编辑
---
## 11. 何时使用本 Skill
## 11. 原生按钮覆盖定位(避免样式干扰)
- **场景**:在头像、图片等区域需触发 `open-type="chooseAvatar"` 等原生能力时,**禁止用 button 包裹**目标元素,否则会受原生样式影响(灰色矩形、边框等)。
- **正确做法**:用 **button 绝对定位覆盖** 在目标区域上方,与展示元素为同级关系。
- **结构示例**
```html
<view class="avatar-wrap">
<view class="avatar-inner">...</view>
<view class="vip-badge">VIP</view>
<button class="avatar-overlay-btn" open-type="chooseAvatar" bindchooseavatar="onChooseAvatar"></button>
</view>
```
- **样式**`.avatar-wrap { position: relative; }``.avatar-overlay-btn { position: absolute; top: 0; left: 0; width/height 与目标一致; background: transparent; border: none; }``::after { border: none; }`。
- **口诀**:同级覆盖,绝对定位,透明按钮。
---
## 12. 何时使用本 Skill
- 在 **miniprogram/** 下新增或修改页面、组件、utils 时。
- 在小程序内新增或修改任何网络请求路径时(必须保持 `/api/miniprogram/...`)。
@@ -114,5 +133,6 @@ description: Soul 创业派对小程序开发规范。在 miniprogram/ 下编辑
- 做个人中心、设置页布局时(遵循 §7卡片区边距 16rpx
- 做阅读、文章等需长按复制的文本时(遵循 §9text 加 user-select
- 做编辑资料页分享名片时(遵循 §10
- 做头像上传、chooseAvatar 等需 button 触发的原生能力时(遵循 §11用绝对定位覆盖禁止 button 包裹)。
遵循本 Skill 可保证小程序只与 soul-api 的 miniprogram 路由组对接,避免与管理端或 next-project 接口混用。

View File

@@ -192,10 +192,10 @@ description: 新版快速分析 Skill。甲方/第三方 AI 写的新版本,
2. 排除:技术债、规则不清、与稳定版冲突的部分
3. 按**最小功能**拆分,保证每个任务迁移后能完整运行
4. 排期顺序:**界面修改优先** → 大逻辑排后P0逻辑不通→ P1功能缺失→ P2优化
5. 写入需求汇总,形成迁移任务清单
5. 写入需求清单(当日需求文件),形成迁移任务清单
**产出**
- `开发文档/1、需求/需求汇总.md` 追加需求
- `开发文档/1、需求/YYYY-MM-DD-需求.md` 追加需求(当日文件,以日期最新为主;同步后更新 `1、需求/索引.md`
- `开发文档/新版迁移-开发方案与清单.md` 或等价迁移清单
---
@@ -259,7 +259,7 @@ description: 新版快速分析 Skill。甲方/第三方 AI 写的新版本,
4. **逻辑分层**:每个功能过三层(界面/接口/数据)
5. **体验评估**:补充空态、错误态、边界处理
6. **接口规范与冲突**:产出接口规范与冲突清单
7. **抽取需求**:写入需求汇总,形成迁移任务清单
7. **抽取需求**:写入需求清单(当日需求文件),形成迁移任务清单
8. **需求评审(迁移前必做)**:列出功能点 + 样式变更,逐一确认,产出评审清单
9. **回复用户**:给出分析摘要 + 文档路径 + 建议执行顺序;**迁移须在需求评审通过后开始**
@@ -273,7 +273,7 @@ description: 新版快速分析 Skill。甲方/第三方 AI 写的新版本,
| 接口规范与冲突 | `开发文档/新版迁移-接口规范与冲突清单.md` |
| 迁移方案/清单 | `开发文档/新版迁移-开发方案与清单.md``新版功能迁移到稳定版方案.md` |
| **需求评审清单** | `开发文档/新版迁移-需求评审清单.md`(功能点 + 样式变更,含确认状态) |
| 需求汇总 | `开发文档/1、需求/需求汇总.md` |
| 需求清单 | `开发文档/1、需求/YYYY-MM-DD-需求.md`(以日期最新为主) |
若已有同名文档,在其基础上**追加或更新**,不重复创建。

View File

@@ -42,7 +42,7 @@ description: Soul 创业派对产品经理需求与验收。需求分析、需
### 0.3 功能规划与协调变更
1. **输出需求分析**:写入 `临时需求池/YYYY-MM-DD-需求简述.md` 或追加到 `需求汇总.md` 需求清单
1. **输出需求分析**:写入 `临时需求池/YYYY-MM-DD-需求简述.md` 或追加到 `开发文档/1、需求/YYYY-MM-DD-需求.md` 需求清单(以日期最新为主,同步后更新 `1、需求/索引.md`
2. **三端任务拆分**:按上表列出「小程序任务」「管理端任务」「后端任务」
3. **协调变更**:若需更新《以界面定需求》,同步更新界面清单与业务逻辑
4. **指派**:明确各任务对应角色(小程序开发工程师、管理端开发工程师、后端工程师),并给出执行顺序建议(通常:后端 → 小程序;管理端视依赖可并行或后置)
@@ -73,7 +73,7 @@ description: Soul 创业派对产品经理需求与验收。需求分析、需
| 职责 | 说明 | 产出 |
|------|------|------|
| 需求分析 | 业务需求拆解、优先级、技术可行性 | 需求分析文档、临时需求池 |
| 需求文档 | 需求清单、业务规则、验收标准 | 需求汇总.md、运营与变更.md |
| 需求文档 | 需求清单、业务规则、验收标准 | 1、需求/YYYY-MM-DD-需求.md以最新为主、运营与变更.md |
| 验收 | 功能验收、回归检查 | 验收清单、项目推进表 |
| 协调 | 与开发沟通、排期、变更 | 运营与变更、项目落地推进表 |
@@ -83,7 +83,7 @@ description: Soul 创业派对产品经理需求与验收。需求分析、需
| 文档 | 说明 |
|------|------|
| `开发文档/1、需求/需求汇总.md` | 需求清单、业务需求 |
| `开发文档/1、需求/` | 需求清单(按日期命名,以最新为主)、业务需求;见 `1、需求/索引.md` |
| `临时需求池/` | 需求分析、技术分析 |
| `开发文档/10、项目管理/项目落地推进表.md` | 里程碑、永平落地 |
| `开发文档/10、项目管理/运营与变更.md` | 近期讨论、变更记录 |

View File

@@ -0,0 +1,112 @@
---
description: Soul 挖矿病毒排查与防护。xmrig、kdevtmpfsi、kinsing、minerd、miner_guard。Use when 挖矿病毒、xmrig、服务器被入侵、miner_guard、安全排查、杀挖矿.
---
# SKILL - 挖矿病毒排查与防护(安全工程师)
> 基于 Soul 项目历史排查经验沉淀,用于快速识别、清理挖矿病毒并加固服务器。
## 何时使用
| 触发词 | 动作 |
|--------|------|
| 挖矿病毒、xmrig、服务器被入侵 | 执行排查与清理流程 |
| miner_guard、安装挖矿守护 | 安装/检查 miner_guard |
| 安全排查、杀挖矿 | 按本 Skill 执行 |
---
## 一、挖矿病毒特征Soul 项目实测)
### 1.1 进程/路径关键词
| 关键词 | 说明 |
|--------|------|
| xmrig | 门罗币挖矿程序,最常见 |
| xmr-stak, minerd, cpuminer | 其他 CPU 挖矿 |
| kdevtmpfsi, kinsing | Linux 常见挖矿木马 |
| stratum | 矿池协议 |
| libprocesshider, watchbog, ddgs, trace | 隐藏/持久化相关 |
### 1.2 常见路径
- `/tmp/xmrig``/tmp/config.json``/tmp/.x`
- `/tmp/kdevtmpfsi``/tmp/kinsing`
- `/www/wwwroot/**/xmrig*`(宝塔站点目录下残留)
- `/www/wwwroot/self/wanzhi/tongzhi/xmrig-*`(历史发现)
### 1.3 入侵链路Soul 项目根因分析)
```
公网访问宝塔 9988 → 弱口令/漏洞 → 进入面板 → www 用户执行命令
→ 下载 xmrig 到 /tmp → 运行挖矿
```
**最可能入口**:宝塔面板 9988 对公网开放 + 弱口令/历史漏洞。
---
## 二、排查与清理脚本soul-api 目录)
| 脚本 | 用途 |
|------|------|
| `miner_guard_check.py` | 检查 miner_guard 安装状态,手动执行一次脚本,查看日志 |
| `miner_guard_install.py` | 安装挖矿守护到服务器(上传 miner_guard.sh + 配置 cron/systemd |
| `miner_guard.sh` | 守护脚本本体(杀进程、删文件、扫 /tmp、/www/wwwroot |
| `remove_xmrig_self.py` | 删除固定路径 `/www/wwwroot/self/wanzhi/tongzhi/xmrig-6.24.0` |
### 2.1 快速检查(本地执行)
```powershell
cd e:\Gongsi\Mycontent\soul-api
python miner_guard_check.py
```
依赖:`pip install paramiko`。配置来源:`master.py``get_cfg()` 或环境变量 `DEPLOY_HOST``DEPLOY_PASSWORD` 等。
### 2.2 安装挖矿守护
```powershell
cd e:\Gongsi\Mycontent\soul-api
python miner_guard_install.py --yes
```
- 上传 `miner_guard.sh``/root/miner_guard.sh`
- 优先写入 `/etc/cron.d/miner_guard`(每 30 分钟),失败则尝试 crontab 或 systemd timer
- 日志:`/var/log/miner_guard.log`
### 2.3 Cunkebao 服务器
```powershell
cd e:\Gongsi\Mycontent\Cunkebao
python miner_guard_install.py --yes
```
使用 Cunkebao 内嵌配置(非 root 用户,日志在 `~/miner_guard.log`)。
---
## 三、加固建议(防止再次入侵)
| 优先级 | 措施 |
|--------|------|
| 1 | 宝塔面板9988 仅允许指定 IP 访问;改非常规端口(如 29988强密码 |
| 2 | 修改所有密码root、宝塔、宝塔 API、MySQL、Redis |
| 3 | Redis`bind 127.0.0.1`,设置 `requirepass` |
| 4 | 敏感信息:密码/API Key 用环境变量,不提交到 Git |
---
## 四、miner_guard.sh 行为摘要
1. **杀进程**`pgrep -f xmrig|kdevtmpfsi|kinsing|...``kill -9`
2. **删已知路径**`/tmp/xmrig``/tmp/config.json`
3. **扫 /tmp、/var/tmp、/dev/shm**:含挖矿关键词的可执行文件 → `rm -f`
4. **扫 /www/wwwroot**:含 xmrig 的目录/文件 → `rm -rf` / `rm -f`
5. **检查 www 用户 crontab**:可疑项仅提示,不自动删
---
## 五、注意事项
- 脚本会按关键词删除,可能与业务目录重叠,部署前确认扫描范围
- `master.py``devloy.py` 等含默认密码,应改为环境变量并确保 `.env` 不入库

View File

@@ -0,0 +1,147 @@
---
description: Soul 服务器操作与部署。部署脚本、SSH、宝塔、环境变量。Use when 部署、服务器操作、SSH、宝塔、devloy、master、Cunkebao 部署.
---
# SKILL - 服务器操作与部署(安全工程师)
> Soul 项目部署脚本索引与服务器操作规范。**密码等敏感信息仅通过环境变量或脚本内 get_cfg() 读取,不在此文档明文列出。**
## 何时使用
| 触发词 | 动作 |
|--------|------|
| **帮我部署api到线上** | **直接执行 `cd soul-api && python master.py`** |
| **管理端帮我部署到xx环境** | **语义化解析 xx直接执行**:含「正式」「线上」「生产」→ `cd soul-admin && python master.py`含「测试」「dev」→ `cd soul-admin && python deploy.py` |
| 部署、服务器操作、SSH | 按本 Skill 选择对应脚本 |
| 宝塔、devloy、master | 查阅部署配置与命令 |
| Cunkebao 部署 | 使用 Cunkebao 专用脚本 |
---
## 一、服务器与配置来源
### 1.1 配置读取优先级
各部署脚本统一约定:
1. **环境变量**(推荐):`DEPLOY_HOST``DEPLOY_USER``DEPLOY_PASSWORD``DEPLOY_SSH_PORT``BT_API_KEY`
2. **脚本内 get_cfg()**:无环境变量时使用脚本默认值
3. **master.py**soul-api 的 miner_guard_check、remove_xmrig_self 等从 `soul-api/master.py``get_cfg()` 读取
### 1.2 服务器索引(配置来源,不含明文密码)
| 项目 | 主机 | 端口 | 用户 | 配置来源 |
|------|------|------|------|----------|
| soul-api 正式 | 43.139.27.93 | 22022 | root | master.py / 环境变量 |
| soul-api 测试 | 43.139.27.93 | 22022 | root | devloy.py / 环境变量 |
| soul-admin 正式 | 43.139.27.93 | 22022 | root | soul-admin/master.py / 环境变量 |
| soul-admin 测试 | 43.139.27.93 | 22022 | root | soul-admin/deploy.py / 环境变量 |
| Cunkebao | 42.194.245.239 | 6523 | yongpxu | Cunkebao/miner_guard_install.py 内嵌 |
**密码**:从 `DEPLOY_PASSWORD` 或各脚本 `get_cfg()` 默认值读取,**不在此文档记录**。
---
## 二、部署脚本索引
### 2.1 soul-api
| 脚本 | 用途 | 命令示例 |
|------|------|----------|
| `soul-api/devloy.py` | 测试环境部署binary/docker/runner | `python devloy.py --mode runner` |
| `soul-api/master.py` | 正式环境部署 | `python master.py` |
| `soul-api/deploy/runner-init.sh` | Runner 容器首次初始化 | `bash deploy/runner-init.sh` |
| `soul-api/deploy/docker-deploy-remote.sh` | 服务器上执行蓝绿切换 | 由 devloy 自动调用 |
| `soul-api/deploy/deploy-runner-remote.sh` | Runner 模式部署包拷贝 | 由 devloy 自动调用 |
**devloy 模式**
- `--mode runner`:容器内红蓝切换,宝塔固定 9001
- `--mode docker`:宿主机蓝绿,需 Nginx 切换
- `--mode binary`Go 二进制 + 宝塔 soulDev
### 2.2 soul-admin
| 脚本 | 用途 | 命令示例 |
|------|------|----------|
| `soul-admin/master.py` | 正式环境部署soul-adminpnpm build | `python master.py` |
| `soul-admin/deploy.py` | 测试环境部署soul-admin-devpnpm build:dev | `python deploy.py` |
### 2.3 挖矿防护
| 脚本 | 用途 | 命令示例 |
|------|------|----------|
| `soul-api/miner_guard_install.py` | 安装挖矿守护soul 服务器) | `python miner_guard_install.py --yes` |
| `Cunkebao/miner_guard_install.py` | 安装挖矿守护Cunkebao | `cd Cunkebao && python miner_guard_install.py --yes` |
---
## 三、环境变量一览
| 变量 | 说明 | 默认来源 |
|------|------|----------|
| DEPLOY_HOST | SSH 主机 | 各脚本 get_cfg() |
| DEPLOY_USER | SSH 用户 | root |
| DEPLOY_PASSWORD | SSH 密码 | 脚本默认 / 需设置 |
| DEPLOY_SSH_KEY | SSH 私钥路径 | 空 |
| DEPLOY_SSH_PORT | SSH 端口 | 22022 |
| BT_PANEL_URL | 宝塔面板 URL | https://{host}:9988 |
| BT_API_KEY | 宝塔 API 密钥 | 脚本内默认 |
| BT_GO_PROJECT_NAME | 宝塔 Go 项目名 | soulDev / soulApi |
| DEPLOY_DOCKER_PATH | 部署目录 | /www/wwwroot/self/soul-dev |
| DEPLOY_NGINX_CONF | Nginx 配置路径 | 空(可自动探测) |
---
## 四、常用操作
### 4.1 SSH 连接(示例,密码从环境变量读取)
```powershell
# 设置环境变量后
$env:DEPLOY_HOST="43.139.27.93"
$env:DEPLOY_PASSWORD="<从安全存储读取>"
ssh -p 22022 root@43.139.27.93
```
### 4.2 部署 soul-api 测试环境Runner 模式)
```powershell
cd e:\Gongsi\Mycontent\soul-api
python devloy.py --mode runner
```
### 4.3 部署 soul-api 正式环境
```powershell
cd e:\Gongsi\Mycontent\soul-api
python master.py
```
### 4.4 部署 soul-admin 正式环境
```powershell
cd e:\Gongsi\Mycontent\soul-admin
python master.py
```
### 4.5 部署 soul-admin 测试环境
```powershell
cd e:\Gongsi\Mycontent\soul-admin
python deploy.py
```
### 4.6 检查挖矿守护
```powershell
cd e:\Gongsi\Mycontent\soul-api
python miner_guard_check.py
```
---
## 五、安全提醒
- **不要将密码提交到 Git**master.py、devloy.py 等中的默认密码应迁移到环境变量
- **宝塔 API 密钥**BT_API_KEY 若泄露需在宝塔面板重新生成
- **敏感文件**`.env``master.py` 等应加入 `.gitignore` 或使用 `.env.example` 模板