From e719de59a2bdee27db8e63cc6fbfa1adfaf59e7d Mon Sep 17 00:00:00 2001
From: xcbyy <2578898740@qq.com>
Date: Sat, 17 Oct 2026 18:04:33 +0800
Subject: [PATCH] =?UTF-8?q?feat(mini):=20=E5=B9=B3=E5=8F=B0=E8=A7=84?=
=?UTF-8?q?=E8=8C=83=E4=B8=8E=E6=9C=8D=E5=8A=A1=E5=8D=8F=E8=AE=AE=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E5=8C=96=EF=BC=88=E9=A1=B5=E5=86=85=E5=88=87=E6=8D=A2?=
=?UTF-8?q?=EF=BC=8C=E6=9B=BF=E4=BB=A3=E5=BC=B9=E7=AA=97=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 个人中心'平台规范与服务协议'点击直接进入 /pages/common/protocol(不再 showActionSheet 选择)
- 协议页新增页内切换:用户服务协议 / 隐私保护指引(含暖阳主题适配)
- 新增回归护栏 protocol-page.spec.ts(76 套件/601 用例全绿)
---
pwuniapp/pages/common/protocol.vue | 69 ++++++++++++++++++++++++++++++
pwuniapp/pages/user/index.vue | 26 ++++-------
server/tests/protocol-page.spec.ts | 28 ++++++++++++
3 files changed, 106 insertions(+), 17 deletions(-)
create mode 100644 server/tests/protocol-page.spec.ts
diff --git a/pwuniapp/pages/common/protocol.vue b/pwuniapp/pages/common/protocol.vue
index f614ff0..3bc68a5 100644
--- a/pwuniapp/pages/common/protocol.vue
+++ b/pwuniapp/pages/common/protocol.vue
@@ -7,6 +7,24 @@
生效版本:v2.4.0 · 适用全平台所有注册与履约用户
+
+
+
+ 用户服务协议
+
+
+ 隐私保护指引
+
+
+
@@ -139,6 +157,15 @@ onLoad((options) => {
});
});
+// 页内切换协议类型(无需弹窗选择)
+const switchType = (t) => {
+ if (protocolType.value === t) return;
+ protocolType.value = t;
+ uni.setNavigationBarTitle({
+ title: t === 'privacy' ? '隐私保护指引' : '用户服务协议'
+ });
+};
+
onMounted(() => {
currentThemeKey.value = getCurrentThemeKey();
applyThemeToNativeUI(currentThemeKey.value);
@@ -201,6 +228,32 @@ const handleBack = () => {
}
}
+/* 协议类型切换 */
+.protocol-tabs {
+ display: flex;
+ gap: 12rpx;
+ padding: 20rpx 32rpx 0;
+ background: #10172A;
+
+ .ptab {
+ flex: 1;
+ text-align: center;
+ padding: 16rpx 0;
+ font-size: 26rpx;
+ color: #94A3B8;
+ background: rgba(255, 255, 255, 0.04);
+ border: 1px solid rgba(255, 255, 255, 0.06);
+ border-radius: 14rpx;
+
+ &.active {
+ color: #0A0F1D;
+ background: #10B981;
+ border-color: #10B981;
+ font-weight: 700;
+ }
+ }
+}
+
/* 协议主体滚动区 */
.protocol-scroll-body {
flex: 1;
@@ -349,6 +402,22 @@ const handleBack = () => {
}
}
+ .protocol-tabs {
+ background: #FFFFFF;
+
+ .ptab {
+ color: #78716C;
+ background: #F5F5F4;
+ border-color: #E7E5E4;
+
+ &.active {
+ color: #FFFFFF;
+ background: #EA580C;
+ border-color: #EA580C;
+ }
+ }
+ }
+
.protocol-scroll-body .protocol-card {
background: #FFFFFF;
border-color: #E7E5E4;
diff --git a/pwuniapp/pages/user/index.vue b/pwuniapp/pages/user/index.vue
index bc5827b..b2191b8 100644
--- a/pwuniapp/pages/user/index.vue
+++ b/pwuniapp/pages/user/index.vue
@@ -1189,23 +1189,15 @@ const openFaq = () => {
};
const openAbout = () => {
- uni.showActionSheet({
- itemList: ['用户服务协议', '隐私保护指引'],
- success: (res) => {
- const type = res.tapIndex === 1 ? 'privacy' : 'service';
- uni.navigateTo({
- url: `/pages/common/protocol?type=${type}`,
- fail: () => {
- const proto = platformConfigs.value.platform_protocol || {};
- const fullText = type === 'privacy'
- ? (proto.privacyPolicyContent || '平台全面遵守微信小程序开发者隐私规范要求,对用户数据实施高强度加密保护。')
- : (proto.userAgreementContent || '平台遵循合法合规与安全原则,所有同城活动履约均须在公开透明街区展开。');
- uni.showModal({
- title: type === 'privacy' ? (proto.privacyPolicyTitle || '隐私保护指引') : (proto.userAgreementTitle || '用户服务协议'),
- content: fullText,
- showCancel: false
- });
- }
+ // 进入独立协议页面(页内可切换"用户服务协议 / 隐私保护指引"),不再使用弹窗选择
+ uni.navigateTo({
+ url: '/pages/common/protocol?type=service',
+ fail: () => {
+ const proto = platformConfigs.value.platform_protocol || {};
+ uni.showModal({
+ title: proto.userAgreementTitle || '用户服务协议',
+ content: proto.userAgreementContent || '平台遵循合法合规与安全原则,所有同城活动履约均须在公开透明街区展开。',
+ showCancel: false
});
}
});
diff --git a/server/tests/protocol-page.spec.ts b/server/tests/protocol-page.spec.ts
new file mode 100644
index 0000000..7ed39dd
--- /dev/null
+++ b/server/tests/protocol-page.spec.ts
@@ -0,0 +1,28 @@
+// 已读取AGENTS.md
+import * as fs from 'fs';
+import * as path from 'path';
+
+/**
+ * 第六十批回归闸门:平台规范与服务协议页面化(页内切换,非弹窗)
+ */
+describe('第六十批服务协议页面化闸门', () => {
+ const rootDir = path.resolve(__dirname, '../../');
+ const protocol = fs.readFileSync(path.join(rootDir, 'pwuniapp/pages/common/protocol.vue'), 'utf-8');
+ const userIndex = fs.readFileSync(path.join(rootDir, 'pwuniapp/pages/user/index.vue'), 'utf-8');
+
+ it('协议页支持页内切换服务协议/隐私政策', () => {
+ expect(protocol).toContain('protocol-tabs');
+ expect(protocol).toContain('const switchType =');
+ expect(protocol).toContain("switchType('privacy')");
+ expect(protocol).toContain("switchType('service')");
+ });
+
+ it('个人中心直接进入协议页,不再弹窗选择', () => {
+ const start = userIndex.indexOf('const openAbout');
+ expect(start).toBeGreaterThan(-1);
+ const end = userIndex.indexOf('};', start);
+ const block = userIndex.slice(start, end + 2);
+ expect(block).toContain("url: '/pages/common/protocol?type=service'");
+ expect(block).not.toContain('showActionSheet');
+ });
+});