diff --git a/.cursor/skills/dukang-release/SKILL.md b/.cursor/skills/dukang-release/SKILL.md new file mode 100644 index 0000000..61eede8 --- /dev/null +++ b/.cursor/skills/dukang-release/SKILL.md @@ -0,0 +1,89 @@ +--- +name: dukang-release +description: >- + 杜康好客生产发布流程:dev_jacy 提交合并到 dev,并用 deploy.sh 发版。 + Use when the user says 发布、上传、deploy、上线、发版, or @杜康发布 / @dukang-release. +--- + +# 杜康发布 + +将已完成改动发到生产(`aliyun-smarthr`)。**仅用户明确要求发布时执行。** + +## 分支约定 + +| 分支 | 用途 | +|------|------| +| `dev_jacy` | 日常开发 / 提交 | +| `dev` | **发布分支**(服务器拉这个) | + +默认:`dev_jacy` → merge → `dev` → 部署。勿 force push `main`/`dev`。 + +## 标准流程(Windows) + +PowerShell 下 **分支名必须加引号**(否则 `checkout` 与 `dev` 会被粘成 `checkoutdev`)。 + +### 1. 提交(在 `dev_jacy`) + +```powershell +git status -sb +git add +git commit -m @" +fix(scope): summary + +Optional body. +"@ +``` + +- Conventional Commits;不提交 `.env` / `dist` / `node_modules` +- 用户未要求 commit 时不要擅自提交 + +### 2. 推送并合并到 `dev` + +```powershell +git push -u origin HEAD +git checkout "dev" +git pull origin "dev" +git merge "dev_jacy" -m "merge(dev_jacy): <简述>" +git push origin "dev" +git checkout "dev_jacy" +``` + +### 3. 远程发版 + +本机无 WSL bash 时用 **Git Bash**: + +```powershell +& "C:\Program Files\Git\bin\bash.exe" "/deploy/deploy.sh" --branch "dev" -- --skip-db +``` + +- 默认加 `--skip-db`(无迁移时) +- 有 Prisma 迁移时去掉 `--skip-db`,按用户确认是否 `--seed` / `--accept-data-loss` +- `deploy/deploy.env` 提供 `DEPLOY_HOST` 等(勿提交密钥) + +### 4. 等待完成 + +后台跑部署时轮询终端输出,成功标志: + +- 出现 `发版完成` +- `exit_code: 0` +- `mini-user(h5): 200`(或对应前端 200) + +说明:API 健康检查短暂 `FAIL`/`000` 多为重启中,以 `发版完成` + `exit_code: 0` 为准。 + +### 5. 回复用户 + +一句说明:已合并 commit、发版结果、建议微信强刷验证。 + +## 常用变体 + +| 场景 | 做法 | +|------|------| +| 仅部署已推送的 `dev` | 跳过 commit/merge,直接跑 `deploy.sh --branch "dev" -- --skip-db` | +| 检查服务器 | `deploy.sh --branch "dev" --check` | +| 含 DB | `deploy.sh --branch "dev" --`(无 skip-db)或按用户给 seed 参数 | + +## 禁止 + +- 不 amend 已推送 commit;不 force push `main`/`master`/`dev` +- 不把 `.env` / 私钥打进仓库 +- 用户只说「修好」未说发布时 → **只改代码,不发版** diff --git a/AGENTS.md b/AGENTS.md index d5ac38f..a150ea3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,6 +90,7 @@ Mock 验证码:`123456`。测试账号见 [`README.md`](./README.md)。 | 需求 Skill | `.cursor/skills/dukang-project/` | @dukang-project | | preV1 Skill | `.cursor/skills/dukang-prev1/` | Mock / Feature Flag | | 任务卡 Skill | `.cursor/skills/dukang-task-card/` | DLV-W* / P1-* / M*-* | +| 发布 Skill | `.cursor/skills/dukang-release/` | @杜康发布 / @dukang-release | ## 子 Agent(按职责选用) @@ -115,6 +116,7 @@ Mock 验证码:`123456`。测试账号见 [`README.md`](./README.md)。 | `dukang-project` | PRD/需求评审、原型对照、任务卡规划(**不用于日常编码**) | | `dukang-prev1` | Mock 开关、preV1 裁剪、Feature Flag | | `dukang-task-card` | 领取任务卡 `DLV-W*-*` / `P1-*` / `M*-*` 并按 DoD 交付 | +| `dukang-release`(杜康发布) | `dev_jacy`→`dev` 合并 + `deploy.sh` 发版 | ## 快速指令 diff --git a/apps/h5-partner/src/PartnerAppRoutes.tsx b/apps/h5-partner/src/PartnerAppRoutes.tsx index 981ab3f..4b4f3d4 100644 --- a/apps/h5-partner/src/PartnerAppRoutes.tsx +++ b/apps/h5-partner/src/PartnerAppRoutes.tsx @@ -50,10 +50,11 @@ function SubAccountRoutes() { }> } /> - } /> } /> } /> + {/* 与主账号一致:录入门店全屏,避免 sticky 底栏被 TabBar 挡住 */} + } /> } /> ); diff --git a/apps/h5-partner/src/pages/PartnerMePage.tsx b/apps/h5-partner/src/pages/PartnerMePage.tsx index d3f53e8..b93cb88 100644 --- a/apps/h5-partner/src/pages/PartnerMePage.tsx +++ b/apps/h5-partner/src/pages/PartnerMePage.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; import { PARTNER_STAFF_ROLE_LABELS, type PartnerStaffRole } from '@dukang/shared-types'; import { request } from '../lib/api'; import { usePartnerSession } from '../contexts/PartnerSessionContext'; @@ -43,59 +44,91 @@ export default function PartnerMePage() { } return ( -
-
+
+
+

杜康好客

+
+ +
person
-

{account?.name || '我的'}

-

{roleLabel}

- {account?.companyName ? ( -

{account.companyName}

- ) : null} +
+

{account?.name || '合伙人'}

+ {roleLabel} +
+
+ location_on + {account?.companyName || '—'} +
+

{account?.phone || ''}

-
- - setName(e.target.value)} - placeholder="请输入姓名" - maxLength={32} - /> +
+

账号资料

+
+ + setName(e.target.value)} + placeholder="请输入姓名" + maxLength={32} + /> - - -

手机号由管理员维护,如需修改请联系总部

+ + +

+ 手机号由管理员维护,如需修改请联系总部 +

+ + +
-
- - +
+

快捷入口

+
+ +
+
store
+ 门店管理 +
+ chevron_right + + +
+
add_business
+ 录入新门店 +
+ chevron_right + +
+
+ + + +
+

传承千年 · 杜康好客

); diff --git a/apps/h5-partner/src/pages/StoreCreatePage.tsx b/apps/h5-partner/src/pages/StoreCreatePage.tsx index 51d01cc..363c0f4 100644 --- a/apps/h5-partner/src/pages/StoreCreatePage.tsx +++ b/apps/h5-partner/src/pages/StoreCreatePage.tsx @@ -20,7 +20,6 @@ import { fetchPartnerCities, type OpenCityOption } from '../lib/upload'; import { isWechatEnv, weixinSdk } from '../lib/weixin'; import { usePartnerSession } from '../contexts/PartnerSessionContext'; -import { isSubAccount } from '../lib/partnerAccess'; import { @@ -82,8 +81,6 @@ export default function StoreCreatePage() { const { account, refresh } = usePartnerSession(); - const subAccountLayout = isSubAccount(account); - const accountId = account?.id; const wechatReady = !!account?.hasWechat; @@ -610,7 +607,7 @@ export default function StoreCreatePage() { return ( -
+
navigate('/stores')} /> @@ -1094,7 +1091,7 @@ export default function StoreCreatePage() { -