feat(auth): create dedicated official standard WeChat login page and remove popup modal
这个提交包含在:
@@ -130,7 +130,7 @@ describe('ContentSecurityService & Compliance Architecture (TDD 微信内容安
|
||||
const raw = fs.readFileSync(pagesJsonPath, 'utf-8');
|
||||
const config = JSON.parse(raw);
|
||||
expect(Array.isArray(config.pages)).toBe(true);
|
||||
expect(config.pages.length).toBe(14);
|
||||
expect(config.pages.length).toBe(15);
|
||||
|
||||
for (const pageItem of config.pages) {
|
||||
const vueFilePath = path.join(rootDir, 'pwuniapp', `${pageItem.path}.vue`);
|
||||
@@ -377,20 +377,17 @@ describe('ContentSecurityService & Compliance Architecture (TDD 微信内容安
|
||||
});
|
||||
|
||||
describe('10. 个人中心未登录游客态、退出登录及切换账号门禁验证 (用户体验闭环与安全防范)', () => {
|
||||
it('个人中心页面必须包含退出登录、切换账号与登录弹窗入口', () => {
|
||||
it('个人中心页面必须包含退出登录、切换账号与独立登录页跳转入口', () => {
|
||||
const userIndexPath = path.join(rootDir, 'pwuniapp', 'pages', 'user', 'index.vue');
|
||||
const content = fs.readFileSync(userIndexPath, 'utf-8');
|
||||
expect(content).toContain('handleLogout');
|
||||
expect(content).toContain('switchDemoAccount');
|
||||
expect(content).toContain('openLoginModal');
|
||||
expect(content).toContain('/pages/auth/login');
|
||||
expect(content).toContain('isLoggedIn');
|
||||
expect(content).toContain('account-actions-card');
|
||||
expect(content).toContain('login-modal-mask');
|
||||
expect(content).toContain('退出当前登录');
|
||||
expect(content).toContain('切换账号');
|
||||
expect(content).toContain('一键授权快捷登录');
|
||||
expect(content).toContain('open-type="getPhoneNumber"');
|
||||
expect(content).toContain('@getphonenumber="handleGetPhoneNumber"');
|
||||
expect(content).toContain('立即登录 / 注册');
|
||||
});
|
||||
|
||||
it('个人中心核心交互必须包含未登录拦截守护 ensureLoggedIn', () => {
|
||||
@@ -445,6 +442,38 @@ describe('ContentSecurityService & Compliance Architecture (TDD 微信内容安
|
||||
expect(emojiRegex.test(content)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('12. 微信小程序官方标准登录/注册专属独立页面验证 (pages/auth/login.vue)', () => {
|
||||
it('pages.json 必须成功注册 pages/auth/login 且物理文件必须存在', () => {
|
||||
const loginPath = path.join(rootDir, 'pwuniapp', 'pages', 'auth', 'login.vue');
|
||||
expect(fs.existsSync(loginPath)).toBe(true);
|
||||
const pagesJsonPath = path.join(rootDir, 'pwuniapp', 'pages.json');
|
||||
const pagesJson = fs.readFileSync(pagesJsonPath, 'utf-8');
|
||||
expect(pagesJson).toContain('pages/auth/login');
|
||||
expect(pagesJson).toContain('账号登录与注册');
|
||||
});
|
||||
|
||||
it('登录页面必须符合微信官方头像昵称与手机号快捷授权标准', () => {
|
||||
const loginPath = path.join(rootDir, 'pwuniapp', 'pages', 'auth', 'login.vue');
|
||||
const content = fs.readFileSync(loginPath, 'utf-8');
|
||||
expect(content).toContain('open-type="chooseAvatar"');
|
||||
expect(content).toContain('@chooseavatar="onChooseAvatar"');
|
||||
expect(content).toContain('type="nickname"');
|
||||
expect(content).toContain('open-type="getPhoneNumber"');
|
||||
expect(content).toContain('@getphonenumber="handleGetPhoneNumber"');
|
||||
expect(content).toContain('一键授权快捷登录');
|
||||
expect(content).toContain('DEMO_ACCOUNTS');
|
||||
expect(content).toContain('用户服务协议');
|
||||
expect(content).toContain('隐私保护指引');
|
||||
});
|
||||
|
||||
it('登录注册页面代码严禁包含任何系统 Emoji', () => {
|
||||
const loginPath = path.join(rootDir, 'pwuniapp', 'pages', 'auth', 'login.vue');
|
||||
const content = fs.readFileSync(loginPath, 'utf-8');
|
||||
const emojiRegex = /(?:\p{Extended_Pictographic}|\p{Emoji_Presentation}|[\u2600-\u27BF])/u;
|
||||
expect(emojiRegex.test(content)).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
在新工单中引用
屏蔽一个用户