docs: retire conflicting UI baselines
This commit is contained in:
@@ -1,47 +0,0 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { resolve } from 'node:path'
|
||||
|
||||
const root = resolve(import.meta.dirname, '..')
|
||||
const read = (file) => readFileSync(resolve(root, file), 'utf8')
|
||||
const theme = read('admin-web/src/theme/index.css')
|
||||
const layout = read('admin-web/src/layouts/MainLayout.vue')
|
||||
|
||||
for (const token of ['--admin-sidebar-bg', '--admin-page-bg', '--admin-primary', '--admin-card-radius']) {
|
||||
assert.ok(theme.includes(token), `缺少管理端令牌 ${token}`)
|
||||
}
|
||||
|
||||
for (const group of [
|
||||
'工作台',
|
||||
'用户与资料审核',
|
||||
'匹配与活动服务',
|
||||
'公益咨询与转介',
|
||||
'服务站、预约与专项服务',
|
||||
'Banner 与内容运营',
|
||||
'举报、申诉与审计',
|
||||
'组织、人员与权限',
|
||||
'数据统计',
|
||||
]) {
|
||||
assert.ok(layout.includes(group), `缺少菜单组 ${group}`)
|
||||
}
|
||||
|
||||
assert.ok(layout.includes('/brand/logo-mark.png'), '管理端未使用正式品牌标志')
|
||||
assert.ok(layout.includes('globalSearch'), '管理端顶部搜索没有可操作状态')
|
||||
assert.ok(layout.includes('showNotifications'), '管理端通知入口没有可操作反馈')
|
||||
|
||||
for (const file of [
|
||||
'admin-web/src/views/LoginView.vue',
|
||||
'admin-web/src/views/DashboardView.vue',
|
||||
'admin-web/src/modules/user/UserManagementView.vue',
|
||||
'admin-web/src/modules/user/UserDetailView.vue',
|
||||
'admin-web/src/modules/review/ReviewView.vue',
|
||||
]) {
|
||||
const source = read(file)
|
||||
assert.ok(
|
||||
source.includes('page-shell') || source.includes('login-shell'),
|
||||
`${file} 未接入样板布局`,
|
||||
)
|
||||
assert.doesNotMatch(source, /[\u{1F300}-\u{1FAFF}]/u, `${file} 仍包含 Emoji`)
|
||||
}
|
||||
|
||||
console.log('Admin redesign contracts passed')
|
||||
+14
-19
@@ -18,10 +18,14 @@ function assertInOrder(source, labels, scope) {
|
||||
const appConfig = JSON.parse(read('miniapp/app.json'))
|
||||
assert.equal(appConfig.pages.length, 63, '小程序页面清单必须完整覆盖 63 页')
|
||||
const redesignMatrix = read('docs/UI_REDESIGN_PAGE_MATRIX_V1.1.md')
|
||||
for (const page of appConfig.pages) {
|
||||
assert.ok(redesignMatrix.includes(`\`/${page}\``), `页面矩阵遗漏 /${page}`)
|
||||
for (const page of [
|
||||
'pages/index/index', 'pages/discover/discover', 'pages/messages/messages',
|
||||
'pages/activity/activity', 'pages/mine/mine', 'pages/matchmaker/matchmaker',
|
||||
'pages/counseling-intro/counseling-intro', 'pages/premarital-intro/premarital-intro',
|
||||
'pages/content/content', 'pages/anti-fraud/anti-fraud', 'pages/service-station/service-station',
|
||||
]) {
|
||||
assert.ok(redesignMatrix.includes(`\`/${page}\``), `首批页面矩阵遗漏 /${page}`)
|
||||
}
|
||||
assert.equal(appConfig.window.backgroundColor.toUpperCase(), '#FAFAF8', '小程序页面背景必须为暖白 #FAFAF8')
|
||||
assert.deepEqual(
|
||||
appConfig.tabBar.list.map((item) => item.text),
|
||||
['首页', '找对象', '消息', '活动', '我的'],
|
||||
@@ -41,26 +45,22 @@ const requiredPages = [
|
||||
]
|
||||
for (const page of requiredPages) {
|
||||
assert.ok(appConfig.pages.includes(page), `小程序未注册页面 ${page}`)
|
||||
for (const extension of ['js', 'json', 'wxml', 'wxss']) {
|
||||
for (const extension of ['json', 'wxml', 'wxss']) {
|
||||
assert.ok(existsSync(resolve(root, `miniapp/${page}.${extension}`)), `小程序页面文件缺失:${page}.${extension}`)
|
||||
}
|
||||
assert.ok(
|
||||
existsSync(resolve(root, `miniapp/${page}.ts`)) || existsSync(resolve(root, `miniapp/${page}.js`)),
|
||||
`小程序页面缺少 TypeScript 或 JavaScript 逻辑源:${page}`,
|
||||
)
|
||||
}
|
||||
|
||||
const appStyle = read('miniapp/app.wxss')
|
||||
assert.match(appStyle, /--color-bg-page:\s*#FAFAF8/i, '全局背景令牌必须为 #FAFAF8')
|
||||
assert.match(appStyle, /--spacing-section:\s*48rpx/i, '模块间距必须为 24px(48rpx)')
|
||||
|
||||
const sharedServiceStyle = read('miniapp/styles/service-page.wxss')
|
||||
assert.doesNotMatch(sharedServiceStyle, /@import\s+["']\.\.\/\.\.\/app\.wxss["']/, '共享页面样式不能错误导入 ../../app.wxss')
|
||||
const homeMarkup = read('miniapp/pages/index/index.wxml')
|
||||
assert.doesNotMatch(homeMarkup, /<[^>]+wx:elif="\{\{recommendations\.length\}\}"[^>]+wx:for=/, '推荐条件分支与循环必须分离,避免 wx:else 失联')
|
||||
assert.match(homeMarkup, /<block wx:elif="\{\{recommendations\.length\}\}">/, '推荐列表必须使用 block 条件分支')
|
||||
assertInOrder(homeMarkup, [
|
||||
'品牌区', '用户状态条', 'Banner 轮播', '8个核心入口', '今日推荐',
|
||||
'善缘公益服务', '近期公益活动', '善缘服务站', '婚恋课堂', '安全提醒',
|
||||
], '首页')
|
||||
assert.match(homeMarkup, /wx:elif="\{\{recommendations\.length\}\}"/, '推荐列表必须有独立条件分支')
|
||||
|
||||
const homeLogic = read('miniapp/pages/index/index.js')
|
||||
const homeLogic = read('miniapp/pages/index/index.ts')
|
||||
assertInOrder(homeLogic, [
|
||||
"label: '找对象'", "label: '公益红娘'", "label: '公益活动'", "label: '婚恋咨询'",
|
||||
"label: '婚恋课堂'", "label: '婚前辅导'", "label: '婚恋反诈'", "label: '善缘服务站'",
|
||||
@@ -72,13 +72,8 @@ assert.doesNotMatch(activityDetailMarkup, /页面:\s*activity-detail/, '活动
|
||||
assert.match(activityDetailMarkup, /活动信息/, '活动详情页必须展示活动信息')
|
||||
assert.match(activityDetailMarkup, /报名须知/, '活动详情页必须展示报名须知')
|
||||
|
||||
const adminTheme = read('admin-web/src/theme/index.css')
|
||||
assert.match(adminTheme, /--sidebar-width:\s*220px/, '管理后台侧栏展开宽度必须为 220px')
|
||||
assert.match(adminTheme, /--color-bg-page:\s*#FAFAF8/i, '管理后台页面背景必须使用暖白体系')
|
||||
|
||||
const adminLayout = read('admin-web/src/layouts/MainLayout.vue')
|
||||
assert.match(adminLayout, /善缘丹阳/, '后台品牌名称必须为善缘丹阳')
|
||||
assert.doesNotMatch(adminLayout, /#304156/i, '后台不得继续使用旧式深蓝侧栏')
|
||||
|
||||
const adminApiContracts = [
|
||||
['admin-web/src/modules/banner/BannerManagementView.vue', '/operator/banners'],
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import { existsSync, readFileSync } from 'node:fs'
|
||||
import { resolve } from 'node:path'
|
||||
|
||||
const root = resolve(import.meta.dirname, '..')
|
||||
const read = (path) => readFileSync(resolve(root, path), 'utf8')
|
||||
const spec = 'docs/superpowers/specs/2026-09-13-reference-driven-dual-client-ui-redesign-design.md'
|
||||
|
||||
const obsolete = [
|
||||
'docs/superpowers/specs/2026-09-10-ui-v11-fidelity-design.md',
|
||||
'docs/superpowers/specs/2026-09-11-codex-baseline-cleanup-design.md',
|
||||
'docs/superpowers/specs/2026-09-11-dual-client-full-ui-redesign-design.md',
|
||||
'docs/superpowers/plans/2026-09-10-ui-v11-fidelity.md',
|
||||
'docs/superpowers/plans/2026-09-11-codex-baseline-cleanup.md',
|
||||
'docs/superpowers/plans/2026-09-11-admin-full-ui-redesign.md',
|
||||
'docs/superpowers/plans/2026-09-11-miniapp-full-ui-redesign.md',
|
||||
'docs/superpowers/plans/2026-09-11-ui-foundation-and-pilot.md',
|
||||
'docs/UI-V11-Visual-Acceptance-2026-09-10.md',
|
||||
'docs/善缘丹阳 V1.1 前端 UI-UX 高保真原型修订说明.md',
|
||||
'design-qa.md',
|
||||
'artifacts/phase07-miniapp-home.png',
|
||||
'artifacts/phase07-miniapp-discover.png',
|
||||
'artifacts/phase07-home-comparison.png',
|
||||
'artifacts/phase07-discover-comparison.png',
|
||||
'artifacts/ui-v11/admin-counselor-1366.png',
|
||||
'artifacts/ui-v11/admin-dashboard-1440.png',
|
||||
'artifacts/ui-v11/admin-station-1366.png',
|
||||
'artifacts/ui-v11/miniapp-home-320.png',
|
||||
'artifacts/ui-v11/miniapp-home-375.png',
|
||||
'artifacts/ui-v11/miniapp-home-390.png',
|
||||
'artifacts/ui-v11/miniapp-home-430.png',
|
||||
'artifacts/ui-v11/miniapp-home-preview.html',
|
||||
'artifacts/tabbar-icons-preview.png',
|
||||
'ui-tests/admin-redesign-contracts.mjs',
|
||||
'ui-tests/miniapp-redesign-contracts.mjs',
|
||||
]
|
||||
|
||||
const agents = read('AGENTS.md')
|
||||
assert.ok(agents.includes(spec), 'AGENTS.md 未指向唯一视觉规格')
|
||||
assert.doesNotMatch(agents, /善缘丹阳 V1\.1 前端 UI-UX 高保真原型修订说明\.md/, 'AGENTS.md 仍引用旧高保真规范')
|
||||
for (const file of obsolete) {
|
||||
assert.equal(existsSync(resolve(root, file)), false, `旧视觉入口仍存在: ${file}`)
|
||||
}
|
||||
|
||||
const status = read('docs/STATUS.md')
|
||||
const backlog = read('docs/JIRA_BACKLOG.md')
|
||||
const phase07 = read('docs/Phase-07-V11-Recovery-Completion-Report-2026-09-13.md')
|
||||
const matrix = read('docs/UI_REDESIGN_PAGE_MATRIX_V1.1.md')
|
||||
|
||||
assert.match(status, /Phase 07[^\n]*(视觉否决|视觉待重新实现|UI 待重新实现)/, 'STATUS 未标记 Phase 07 视觉失效')
|
||||
assert.match(backlog, /Phase 07[^\n]*(视觉否决|重新打开|REOPENED)/, 'JIRA 未重新打开 Phase 07 UI')
|
||||
assert.match(phase07, /视觉结论已失效/, 'Phase 07 报告未保留业务证据并撤销视觉结论')
|
||||
assert.match(matrix, /小程序首批 11 个核心页面/, '页面矩阵未切换到当前首批范围')
|
||||
assert.doesNotMatch(matrix, /63 个页面.*(全部|全量).*重构/, '页面矩阵仍要求本批全量重构')
|
||||
|
||||
console.log('UI document baseline contracts passed')
|
||||
Reference in New Issue
Block a user