chore: rename product to 聆界短信平台
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# CMPP 平台仓库开发约束
|
# 聆界短信平台仓库开发约束
|
||||||
|
|
||||||
本文件适用于整个仓库。进入子目录工作时,如果存在更具体的 `AGENTS.md`,还应同时遵守子目录规范。
|
本文件适用于整个仓库。进入子目录工作时,如果存在更具体的 `AGENTS.md`,还应同时遵守子目录规范。
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -26,8 +26,8 @@ async function bootstrap() {
|
|||||||
configureHttpBodyParsers(app);
|
configureHttpBodyParsers(app);
|
||||||
|
|
||||||
const swaggerConfig = new DocumentBuilder()
|
const swaggerConfig = new DocumentBuilder()
|
||||||
.setTitle('CMPP Platform API')
|
.setTitle('聆界短信平台 API')
|
||||||
.setDescription('First-version CMPP SMS platform API')
|
.setDescription('聆界短信平台 API')
|
||||||
.setVersion('0.1.0')
|
.setVersion('0.1.0')
|
||||||
.build();
|
.build();
|
||||||
const document = SwaggerModule.createDocument(app, swaggerConfig);
|
const document = SwaggerModule.createDocument(app, swaggerConfig);
|
||||||
@@ -36,7 +36,7 @@ async function bootstrap() {
|
|||||||
const clientDocument = SwaggerModule.createDocument(
|
const clientDocument = SwaggerModule.createDocument(
|
||||||
app,
|
app,
|
||||||
new DocumentBuilder()
|
new DocumentBuilder()
|
||||||
.setTitle('CMPP短信平台 HTTP 客户接口')
|
.setTitle('聆界短信平台 HTTP 客户接口')
|
||||||
.setDescription('单条短信发送、短信状态查询、上行短信查询及回调验签接口')
|
.setDescription('单条短信发送、短信状态查询、上行短信查询及回调验签接口')
|
||||||
.setVersion('1.0.0')
|
.setVersion('1.0.0')
|
||||||
.build(),
|
.build(),
|
||||||
|
|||||||
@@ -63,5 +63,5 @@ export function renderHttpGuide(markdown: string, origin: string) {
|
|||||||
if (line.trim() && !/^---+$/.test(line)) current.body.push(`<p>${inline(line.replace(/^>\s?/, '').replace(/^- /, '• '))}</p>`);
|
if (line.trim() && !/^---+$/.test(line)) current.body.push(`<p>${inline(line.replace(/^>\s?/, '').replace(/^- /, '• '))}</p>`);
|
||||||
}
|
}
|
||||||
closeTable();
|
closeTable();
|
||||||
return `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>聆界短信 · HTTP 接入文档</title><style>${asset('reader.css')}</style></head><body class="http-developer-docs"><header class="http-doc-header"><div><strong>聆界短信 · 开发者文档</strong><h1>HTTP 接口接入文档</h1><p>${escapeHtml(httpDocVersion(markdown))} · 基础地址 ${escapeHtml(origin || '当前环境')}/api/openapi/v1</p></div><div class="http-doc-actions"><a href="/api/client-docs?format=md" download="client-http-api-guide.md">下载 MD</a><a href="/api/client-docs-json" target="_blank" rel="noreferrer">OpenAPI JSON</a></div></header><div class="http-doc-layout"><nav aria-label="文档目录"><details open><summary>目录</summary>${sections.map((section) => `<a href="#${section.id}">${inline(section.title)}</a>`).join('')}</details><label for="doc-search">错误码 / 文档检索</label><input id="doc-search" type="search" placeholder="输入错误码或关键词"><p id="search-status" role="status"></p></nav><main>${sections.map((section) => `<section id="${section.id}" data-doc-section><div class="http-doc-body"><h2>${inline(section.title)}</h2>${section.body.join('')}</div></section>`).join('')}<p id="no-results" hidden>没有匹配的文档内容,请更换关键词。</p></main></div><p class="http-doc-copy-status" role="status" id="copy-status"></p><script>${asset('reader.js')}</script></body></html>`;
|
return `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>聆界短信平台 · HTTP 接入文档</title><style>${asset('reader.css')}</style></head><body class="http-developer-docs"><header class="http-doc-header"><div><strong>聆界短信平台 · 开发者文档</strong><h1>HTTP 接口接入文档</h1><p>${escapeHtml(httpDocVersion(markdown))} · 基础地址 ${escapeHtml(origin || '当前环境')}/api/openapi/v1</p></div><div class="http-doc-actions"><a href="/api/client-docs?format=md" download="client-http-api-guide.md">下载 MD</a><a href="/api/client-docs-json" target="_blank" rel="noreferrer">OpenAPI JSON</a></div></header><div class="http-doc-layout"><nav aria-label="文档目录"><details open><summary>目录</summary>${sections.map((section) => `<a href="#${section.id}">${inline(section.title)}</a>`).join('')}</details><label for="doc-search">错误码 / 文档检索</label><input id="doc-search" type="search" placeholder="输入错误码或关键词"><p id="search-status" role="status"></p></nav><main>${sections.map((section) => `<section id="${section.id}" data-doc-section><div class="http-doc-body"><h2>${inline(section.title)}</h2>${section.body.join('')}</div></section>`).join('')}<p id="no-results" hidden>没有匹配的文档内容,请更换关键词。</p></main></div><p class="http-doc-copy-status" role="status" id="copy-status"></p><script>${asset('reader.js')}</script></body></html>`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -313,7 +313,7 @@ export class ReportChannelExportService {
|
|||||||
missingFields: detail.missingFields,
|
missingFields: detail.missingFields,
|
||||||
});
|
});
|
||||||
const workbook = new ExcelJS.Workbook();
|
const workbook = new ExcelJS.Workbook();
|
||||||
workbook.creator = 'CMPP短信平台';
|
workbook.creator = '聆界短信平台';
|
||||||
const sheet = workbook.addWorksheet('签名报备', { views: [{ state: 'frozen', ySplit: 1 }] });
|
const sheet = workbook.addWorksheet('签名报备', { views: [{ state: 'frozen', ySplit: 1 }] });
|
||||||
sheet.columns = detail.fields.map((field) => ({
|
sheet.columns = detail.fields.map((field) => ({
|
||||||
header: field.exportName || field.name,
|
header: field.exportName || field.name,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export class ReportOfficialExportService {
|
|||||||
|
|
||||||
async buildOfficialTemplate(reportType: 'signature' | 'drainage', operatorId?: string) {
|
async buildOfficialTemplate(reportType: 'signature' | 'drainage', operatorId?: string) {
|
||||||
const workbook = new ExcelJS.Workbook();
|
const workbook = new ExcelJS.Workbook();
|
||||||
workbook.creator = 'CMPP短信平台';
|
workbook.creator = '聆界短信平台';
|
||||||
const sheet = workbook.addWorksheet(reportType === 'signature' ? '签名资料' : '引流信息', { views: [{ state: 'frozen', ySplit: 1 }] });
|
const sheet = workbook.addWorksheet(reportType === 'signature' ? '签名资料' : '引流信息', { views: [{ state: 'frozen', ySplit: 1 }] });
|
||||||
const headers = reportType === 'signature'
|
const headers = reportType === 'signature'
|
||||||
? ['短信签名', '用途说明', '营业执照图片', '授权书图片', '备注']
|
? ['短信签名', '用途说明', '营业执照图片', '授权书图片', '备注']
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# 聆界短信 HTTP API 参考手册
|
# 聆界短信平台 HTTP API 参考手册
|
||||||
|
|
||||||
**接口版本:v1 · 文档日期:2026-09-15**
|
**接口版本:v1 · 文档日期:2026-09-15**
|
||||||
|
|
||||||
## 1. API 概览
|
## 1. API 概览
|
||||||
|
|
||||||
聆界短信 HTTP API 提供单条短信发送、发送结果查询和用户回复查询。平台还可将短信回执和用户回复主动推送到客户系统。
|
聆界短信平台 HTTP API 提供单条短信发送、发送结果查询和用户回复查询。平台还可将短信回执和用户回复主动推送到客户系统。
|
||||||
|
|
||||||
### 1.1 服务地址与数据格式
|
### 1.1 服务地址与数据格式
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# CMPP 短信平台第一版开发需求文档
|
# 聆界短信平台第一版开发需求文档
|
||||||
|
|
||||||
## 0. 文档前提
|
## 0. 文档前提
|
||||||
|
|
||||||
@@ -2317,3 +2317,7 @@ Webhook需在当前受支持Node运行时通过真实HTTPS投递;SSRF校验后
|
|||||||
## 2026-09-15 HTTP调试工具与合并整改
|
## 2026-09-15 HTTP调试工具与合并整改
|
||||||
|
|
||||||
继续前述新签名规则,客户端与运营端新增HTTP签名计算页:输入方法、路径、秒时间戳、nonce、AccessSecret和POST原始正文,本地生成HMAC-SHA256并复制,不上传/存储密钥、不发短信。修改输入使旧结果失效。运营端签名与引流报备统一三运营商列组件;客户端企业认证仅隐藏新申请入口,保留状态/进度。HTTP发送按独立HTTP总开关/发送能力校验,不能依赖CMPP开关。上行手机号过滤须1开头11位,接入号1–21位数字,非法返回400。设计及真实验收边界见http-api-assessment-20260910.md的2026-09-15补充。
|
继续前述新签名规则,客户端与运营端新增HTTP签名计算页:输入方法、路径、秒时间戳、nonce、AccessSecret和POST原始正文,本地生成HMAC-SHA256并复制,不上传/存储密钥、不发短信。修改输入使旧结果失效。运营端签名与引流报备统一三运营商列组件;客户端企业认证仅隐藏新申请入口,保留状态/进度。HTTP发送按独立HTTP总开关/发送能力校验,不能依赖CMPP开关。上行手机号过滤须1开头11位,接入号1–21位数字,非法返回400。设计及真实验收边界见http-api-assessment-20260910.md的2026-09-15补充。
|
||||||
|
|
||||||
|
## 2026-09-16 产品名称统一
|
||||||
|
|
||||||
|
产品正式名称为“聆界短信平台”,页面标题、API文档品牌名称、导出表格作者和充值回执替代文本统一。产品3.0、工程3.0.0不变;CMPP协议名称及技术标识保持兼容。名称调整仅涉及展示文案和导出作者元数据,不改变布局、业务流程、协议、接口地址或工程版本;版本元数据属于独立变更。
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# CMPP 短信平台第一版系统功能测试用例
|
# 聆界短信平台第一版系统功能测试用例
|
||||||
|
|
||||||
## 1. 用例说明
|
## 1. 用例说明
|
||||||
|
|
||||||
@@ -5564,3 +5564,8 @@ CLIENT-0914-01~07 的模板样式/顺序、文档归属与检索、中文状
|
|||||||
- 回调:成功单次;503 自动重试成功;400 单次终止;超时达到隔离配置两次上限。真实 HTTPS 接收与原字节 HMAC 验证 16/16,保留两项预期失败,不人工重投。
|
- 回调:成功单次;503 自动重试成功;400 单次终止;超时达到隔离配置两次上限。真实 HTTPS 接收与原字节 HMAC 验证 16/16,保留两项预期失败,不人工重投。
|
||||||
- 收尾:25 条消息终态、25 个批次终态、23 个发送 Outbox dispatched;12 条送达按 325 内部单位计费,失败退款 325,最终余额 996100,冻结/释放相抵,三个消费组无积压。专用测试配置停用后数据和余额保留。
|
- 收尾:25 条消息终态、25 个批次终态、23 个发送 Outbox dispatched;12 条送达按 325 内部单位计费,失败退款 325,最终余额 996100,冻结/释放相抵,三个消费组无积压。专用测试配置停用后数据和余额保留。
|
||||||
- 测试环境浏览器 UI 及独立验证码策略不计通过,见 [2026-09-15 记录](http-api-acceptance-20260915.md)。
|
- 测试环境浏览器 UI 及独立验证码策略不计通过,见 [2026-09-15 记录](http-api-acceptance-20260915.md)。
|
||||||
|
|
||||||
|
## 产品名称统一验收(2026-09-16)
|
||||||
|
|
||||||
|
- TC-BRAND-20260916-01:浏览器标题、平台Swagger、客户OpenAPI及HTTP文档展示“聆界短信平台”;充值回执图片替代文本、两类报备导出工作簿作者一致。源码检查与构建结果见测试进度,真实页面/API/导出验收单独记录。
|
||||||
|
- TC-BRAND-20260916-02:产品3.0/工程3.0.0、客户接口独立版本、CMPP协议、API路径、签名规则、工程包名和基础设施标识保持不变;已有工作区修改不被覆盖。
|
||||||
|
|||||||
@@ -5058,3 +5058,16 @@ CUA本轮可用,实际后端文档三尺寸1600×1000/1366×768/390×844无页
|
|||||||
代码 c781313 与补充修复 cbc4a03 已提交推送,测试环境精确运行 cbc4a033251c7496414b1e7aa6233ed49bd108ec(17:36 核验)。包含最新签名协议、双端计算页、报备三列及认证入口隐藏,未遗漏前序范围。最终后端 830/830、前端 158/158,类型/构建/质量门禁通过;最终真实参数回归 78/78,前序独立配置回归 15/15,引流六分支复测通过。25 条隔离记录、13 次模拟 Submit,账务余额与流水一致、冻结净额 0、队列 pending/lag 均 0。Webhook 成功/503 重试/400 终止/超时上限及上行已验收,16 次业务回调 HMAC 正确。专用配置、凭据和模拟器已停用,hosts 精确恢复,未发送至真实运营商。
|
代码 c781313 与补充修复 cbc4a03 已提交推送,测试环境精确运行 cbc4a033251c7496414b1e7aa6233ed49bd108ec(17:36 核验)。包含最新签名协议、双端计算页、报备三列及认证入口隐藏,未遗漏前序范围。最终后端 830/830、前端 158/158,类型/构建/质量门禁通过;最终真实参数回归 78/78,前序独立配置回归 15/15,引流六分支复测通过。25 条隔离记录、13 次模拟 Submit,账务余额与流水一致、冻结净额 0、队列 pending/lag 均 0。Webhook 成功/503 重试/400 终止/超时上限及上行已验收,16 次业务回调 HMAC 正确。专用配置、凭据和模拟器已停用,hosts 精确恢复,未发送至真实运营商。
|
||||||
|
|
||||||
最终标准 verify 唯一提示为业务计数 +6 条短信/+2 次 Submit,已与本轮六个引流用例逐条核对,工具状态保留 deployed-needs-review,不伪造全绿。浏览器连接超时,测试环境登录后 UI 尚未验收;独立“验证码限制”的具体规则仍需明确。预生产未操作,容量治理未完成。完整证据、失败记录、时间、版本与恢复资产见 [HTTP 接口联合验收记录](http-api-acceptance-20260915.md)。
|
最终标准 verify 唯一提示为业务计数 +6 条短信/+2 次 Submit,已与本轮六个引流用例逐条核对,工具状态保留 deployed-needs-review,不伪造全绿。浏览器连接超时,测试环境登录后 UI 尚未验收;独立“验证码限制”的具体规则仍需明确。预生产未操作,容量治理未完成。完整证据、失败记录、时间、版本与恢复资产见 [HTTP 接口联合验收记录](http-api-acceptance-20260915.md)。
|
||||||
|
|
||||||
|
## 2026-09-16 产品统一更名为聆界短信平台(本地完成)
|
||||||
|
|
||||||
|
- 用户要求将项目产品名称由CMPP平台更名为“聆界短信平台”。设计与兼容边界维护于version-3.0-baseline.md“产品名称统一”,需求及TC-BRAND-20260916-01/02同步。
|
||||||
|
- 已更新浏览器标题、登录页标题/Logo替代文本、双端AppShell品牌名称、充值回执替代文本、平台Swagger/客户OpenAPI名称、HTTP文档页面与MD、两类报备导出工作簿作者,以及当前根规范/UI规范/需求/测试用例/版本基线名称。历史实施记录不追溯改写;CMPP协议、工程包名、服务/存储标识、目录路径、业务逻辑和接口签名不变,工程版本保持3.0.0。
|
||||||
|
- 11:27 CST验证:前端33文件158项通过,后端76套831项通过;前端tsc --noEmit及最终Vite生产构建、API tsc -p tsconfig.build.json通过;结构质量检查、包体预算检查、git diff --check通过。构建HTML标题与编译后的HTTP文档渲染函数确认新名称。当前终端npm不在PATH,直接调用仓库node_modules内对应CLI完成等价验证,未改全局环境。
|
||||||
|
- 质量门禁遗留:定向ESLint在official-export.service.ts报告47个原有未使用导入错误,另有LoginPage/RechargeReceiptDialog共3个既有警告;Prettier在official-export.service.ts和RechargeReceiptDialog.tsx报告原有格式问题。已将名称替换在内存中还原后复核,两文件修改前格式检查仍失败、official-export修改前仍47个lint错误;未以整文件格式化扩大范围,不能宣称全部门禁通过。初次Vite构建存在既有大chunk提示。
|
||||||
|
- 真实浏览器三尺寸、登录后页面、Swagger真实API及报备导出验收未执行;当前项目无可解析的Playwright依赖,未安装依赖或将隔离测试冒充真实业务验收。未连接/修改线上服务,未发送、补发、重投短信或改业务配置。
|
||||||
|
- Git核验main/实际远端仍为86cb9aea36f7759eef9cc4f0949a9bca7f85617b,暂存区空。已有metrics、发布工具、部署脚本、版本及文档草稿保留,仅对共享文档精确替换名称/追加本轮记录。本地修改完成;本地提交、推送、测试部署、预生产部署均未执行。
|
||||||
|
|
||||||
|
### 2026-09-16 更名本地提交范围核对
|
||||||
|
|
||||||
|
用户追加授权本地提交。本次精确暂存更名代码、规范标题及需求/用例/进度中的更名段落;package及lock版本、main.ts的Swagger版本变更和既有未跟踪version-3.0-baseline.md草稿不纳入本次提交。3.0.0版本元数据仍留在工作区,提交不代表版本标识已发布。前述测试为本地工作区结果,不冒称隔离候选精确提交的全量验证。既有metrics、发布工具、部署脚本与其他文档改动保留。推送、测试部署及预生产部署未执行。
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# CMPP 平台 UI 设计规范
|
# 聆界短信平台 UI 设计规范
|
||||||
|
|
||||||
## 设计原则
|
## 设计原则
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" href="/logo/fav.ico" />
|
<link rel="icon" href="/logo/fav.ico" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>聆界短信管理平台</title>
|
<title>聆界短信平台</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|||||||
@@ -86,9 +86,9 @@ export function LoginPage({ portal }: LoginPageProps) {
|
|||||||
{!isAdmin ? <ClientLoginCanvas /> : null}
|
{!isAdmin ? <ClientLoginCanvas /> : null}
|
||||||
<section className="login-panel">
|
<section className="login-panel">
|
||||||
<div className="login-brand">
|
<div className="login-brand">
|
||||||
<img alt={isAdmin ? 'CMPP 运营端 logo' : 'CMPP 客户端 logo'} src="/logo/logo1.png" />
|
<img alt={isAdmin ? '聆界短信平台运营端 logo' : '聆界短信平台客户端 logo'} src="/logo/logo1.png" />
|
||||||
<div>
|
<div>
|
||||||
<h1>短信服务平台</h1>
|
<h1>聆界短信平台</h1>
|
||||||
<p>{isAdmin ? '运营端登录' : '客户端登录'}</p>
|
<p>{isAdmin ? '运营端登录' : '客户端登录'}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export function RechargeReceiptDialog({
|
|||||||
<article className={['recharge-receipt', isCorrection ? 'recharge-receipt--correction' : ''].filter(Boolean).join(' ')}>
|
<article className={['recharge-receipt', isCorrection ? 'recharge-receipt--correction' : ''].filter(Boolean).join(' ')}>
|
||||||
<header className="recharge-receipt__header">
|
<header className="recharge-receipt__header">
|
||||||
<img
|
<img
|
||||||
alt="聆界短信服务平台"
|
alt="聆界短信平台"
|
||||||
className="recharge-receipt__logo"
|
className="recharge-receipt__logo"
|
||||||
src="/logo/logo1.png"
|
src="/logo/logo1.png"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ function AdminAuthenticatedLayout({ session }: { session: LoginSession }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<AppShell
|
<AppShell
|
||||||
title="CMPP 运营端"
|
title="聆界短信平台运营端"
|
||||||
subtitle="平台运营管理中心"
|
subtitle="平台运营管理中心"
|
||||||
workspaceName="平台运营工作区"
|
workspaceName="平台运营工作区"
|
||||||
loginPath="/admin/login"
|
loginPath="/admin/login"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export function ClientLayout() {
|
|||||||
function ClientAuthenticatedLayout({ session }: { session: import('@/api/session').LoginSession }) {
|
function ClientAuthenticatedLayout({ session }: { session: import('@/api/session').LoginSession }) {
|
||||||
return (
|
return (
|
||||||
<AppShell
|
<AppShell
|
||||||
title="短信服务平台"
|
title="聆界短信平台客户端"
|
||||||
subtitle="短信服务控制台"
|
subtitle="短信服务控制台"
|
||||||
workspaceName={session.user.tenantName ?? '企业客户空间'}
|
workspaceName={session.user.tenantName ?? '企业客户空间'}
|
||||||
loginPath="/client/login"
|
loginPath="/client/login"
|
||||||
|
|||||||
Reference in New Issue
Block a user