feat(miniprogram): 用户协议 + 隐私政策页面,登录需勾选同意
- 新增 legal/user-agreement 和 legal/privacy-policy 页面 - 登录页增加协议勾选复选框(未勾选时拦截登录/绑定) - 协议链接可点击跳转查看全文 - RichText 渲染 HTML 格式协议内容
This commit is contained in:
@@ -19,6 +19,8 @@ export default defineAppConfig({
|
||||
'pages/profile/followups/index',
|
||||
'pages/profile/medication/index',
|
||||
'pages/profile/settings/index',
|
||||
'pages/legal/user-agreement',
|
||||
'pages/legal/privacy-policy',
|
||||
],
|
||||
tabBar: {
|
||||
color: '#94A3B8',
|
||||
|
||||
46
apps/miniprogram/src/pages/legal/index.scss
Normal file
46
apps/miniprogram/src/pages/legal/index.scss
Normal file
@@ -0,0 +1,46 @@
|
||||
@import '../../styles/variables.scss';
|
||||
|
||||
.legal-page {
|
||||
min-height: 100vh;
|
||||
background: $card;
|
||||
padding: 32px 24px;
|
||||
padding-bottom: 60px;
|
||||
}
|
||||
|
||||
.legal-content {
|
||||
font-size: 28px;
|
||||
color: $tx;
|
||||
line-height: 1.8;
|
||||
|
||||
h3 {
|
||||
font-size: 34px;
|
||||
font-weight: bold;
|
||||
color: $tx;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 30px;
|
||||
font-weight: bold;
|
||||
color: $tx;
|
||||
margin-top: 24px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 26px;
|
||||
color: $tx2;
|
||||
margin-bottom: 8px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
}
|
||||
|
||||
.legal-footer {
|
||||
margin-top: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.legal-footer-text {
|
||||
font-size: 24px;
|
||||
color: $tx3;
|
||||
}
|
||||
58
apps/miniprogram/src/pages/legal/privacy-policy.tsx
Normal file
58
apps/miniprogram/src/pages/legal/privacy-policy.tsx
Normal file
@@ -0,0 +1,58 @@
|
||||
import { View, Text, RichText } from '@tarojs/components';
|
||||
import './index.scss';
|
||||
|
||||
const PRIVACY_CONTENT = `
|
||||
<h3>隐私政策</h3>
|
||||
<p>更新日期:2026年4月24日</p>
|
||||
<p>生效日期:2026年4月24日</p>
|
||||
|
||||
<h4>一、我们收集的信息</h4>
|
||||
<p>为向您提供健康管理服务,我们会收集以下信息:</p>
|
||||
<p>1. <b>注册信息</b>:微信授权获取的 openid、手机号码</p>
|
||||
<p>2. <b>健康数据</b>:您主动录入的血压、血糖、心率、体重等健康指标</p>
|
||||
<p>3. <b>就诊信息</b>:预约记录、就诊人信息、体检报告</p>
|
||||
<p>4. <b>设备信息</b>:设备型号、操作系统版本</p>
|
||||
|
||||
<h4>二、信息使用目的</h4>
|
||||
<p>我们收集的信息将用于:</p>
|
||||
<p>1. 提供健康数据记录与趋势分析服务</p>
|
||||
<p>2. 在线预约挂号与就诊提醒</p>
|
||||
<p>3. 体检报告查看与解读</p>
|
||||
<p>4. 随访管理与用药提醒</p>
|
||||
<p>5. 服务改进与安全保障</p>
|
||||
|
||||
<h4>三、信息存储与保护</h4>
|
||||
<p>1. 您的信息存储在中华人民共和国境内的安全服务器中</p>
|
||||
<p>2. 我们采用加密传输(HTTPS)和加密存储等安全措施</p>
|
||||
<p>3. 严格的内部数据访问权限控制</p>
|
||||
<p>4. Token 等敏感凭证采用混淆加密存储</p>
|
||||
|
||||
<h4>四、信息共享</h4>
|
||||
<p>未经您的同意,我们不会与任何第三方共享您的个人信息,以下情况除外:</p>
|
||||
<p>1. 获得您的明确同意后</p>
|
||||
<p>2. 基于法律法规的要求</p>
|
||||
<p>3. 与授权医疗机构共享(仅限您预约的医生)</p>
|
||||
|
||||
<h4>五、您的权利</h4>
|
||||
<p>您有权:</p>
|
||||
<p>1. 查看和修改您的个人信息</p>
|
||||
<p>2. 删除您的账号和相关数据</p>
|
||||
<p>3. 撤回授权同意</p>
|
||||
|
||||
<h4>六、未成年人保护</h4>
|
||||
<p>我们高度重视对未成年人个人信息的保护。若您是未满14周岁的未成年人,请在监护人指导下使用本服务。</p>
|
||||
|
||||
<h4>七、联系我们</h4>
|
||||
<p>如对本隐私政策有任何疑问,请通过平台内的意见反馈功能联系我们。</p>
|
||||
`;
|
||||
|
||||
export default function PrivacyPolicy() {
|
||||
return (
|
||||
<View className='legal-page'>
|
||||
<RichText className='legal-content' nodes={PRIVACY_CONTENT} />
|
||||
<View className='legal-footer'>
|
||||
<Text className='legal-footer-text'>如有疑问,请联系客服</Text>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
44
apps/miniprogram/src/pages/legal/user-agreement.tsx
Normal file
44
apps/miniprogram/src/pages/legal/user-agreement.tsx
Normal file
@@ -0,0 +1,44 @@
|
||||
import { View, Text, RichText } from '@tarojs/components';
|
||||
import './index.scss';
|
||||
|
||||
const AGREEMENT_CONTENT = `
|
||||
<h3>用户服务协议</h3>
|
||||
<p>更新日期:2026年4月24日</p>
|
||||
<p>生效日期:2026年4月24日</p>
|
||||
|
||||
<h4>一、服务条款的确认和接纳</h4>
|
||||
<p>本平台(以下简称"本平台")由健康管理平台运营。用户在注册及使用本平台服务前,请务必仔细阅读并充分理解本协议。</p>
|
||||
|
||||
<h4>二、服务内容</h4>
|
||||
<p>本平台为用户提供以下健康管理服务:</p>
|
||||
<p>1. 健康数据记录与查看(血压、血糖、心率等)</p>
|
||||
<p>2. 在线预约挂号</p>
|
||||
<p>3. 体检报告查看</p>
|
||||
<p>4. 随访管理</p>
|
||||
<p>5. 健康资讯阅读</p>
|
||||
<p>6. 用药提醒</p>
|
||||
|
||||
<h4>三、用户账号</h4>
|
||||
<p>用户通过微信授权方式注册账号。用户应妥善保管账号信息,因用户保管不善造成的损失由用户自行承担。</p>
|
||||
|
||||
<h4>四、隐私保护</h4>
|
||||
<p>我们重视用户隐私保护,具体隐私政策请参阅《隐私政策》。我们将严格按照隐私政策收集、使用和保护您的个人信息。</p>
|
||||
|
||||
<h4>五、免责声明</h4>
|
||||
<p>1. 本平台提供的健康数据仅供参考,不构成医疗诊断建议。如有健康问题,请及时就医。</p>
|
||||
<p>2. 因不可抗力导致的服务中断,本平台不承担责任。</p>
|
||||
|
||||
<h4>六、协议修改</h4>
|
||||
<p>本平台有权根据需要修改本协议条款,修改后的协议一经公布即替代原协议。</p>
|
||||
`;
|
||||
|
||||
export default function UserAgreement() {
|
||||
return (
|
||||
<View className='legal-page'>
|
||||
<RichText className='legal-content' nodes={AGREEMENT_CONTENT} />
|
||||
<View className='legal-footer'>
|
||||
<Text className='legal-footer-text'>如有疑问,请联系客服</Text>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
@@ -63,3 +63,44 @@
|
||||
.login-body {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.agreement-row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
margin-top: 32px;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border: 2px solid rgba(255, 255, 255, 0.6);
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.checkbox.checked {
|
||||
background: white;
|
||||
border-color: white;
|
||||
}
|
||||
|
||||
.check-mark {
|
||||
font-size: 22px;
|
||||
color: $pri;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.agreement-text {
|
||||
font-size: 24px;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.agreement-link {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@@ -6,9 +6,14 @@ import './index.scss';
|
||||
|
||||
export default function Login() {
|
||||
const [needBind, setNeedBind] = useState(false);
|
||||
const [agreed, setAgreed] = useState(false);
|
||||
const { login, bindPhone, loading } = useAuthStore();
|
||||
|
||||
const handleWechatLogin = async () => {
|
||||
if (!agreed) {
|
||||
Taro.showToast({ title: '请先阅读并同意用户协议', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const { code } = await Taro.login();
|
||||
const success = await login(code);
|
||||
@@ -24,6 +29,10 @@ export default function Login() {
|
||||
};
|
||||
|
||||
const handleGetPhone = async (e: { detail: { errMsg: string; encryptedData: string; iv: string } }) => {
|
||||
if (!agreed) {
|
||||
Taro.showToast({ title: '请先阅读并同意用户协议', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
if (e.detail.errMsg !== 'getPhoneNumber:ok') {
|
||||
Taro.showToast({ title: '需要授权手机号', icon: 'none' });
|
||||
return;
|
||||
@@ -63,6 +72,18 @@ export default function Login() {
|
||||
</Button>
|
||||
)}
|
||||
</View>
|
||||
|
||||
<View className='agreement-row'>
|
||||
<View className={`checkbox ${agreed ? 'checked' : ''}`} onClick={() => setAgreed(!agreed)}>
|
||||
{agreed && <Text className='check-mark'>✓</Text>}
|
||||
</View>
|
||||
<Text className='agreement-text'>
|
||||
我已阅读并同意
|
||||
<Text className='agreement-link' onClick={() => Taro.navigateTo({ url: '/pages/legal/user-agreement' })}>《用户服务协议》</Text>
|
||||
和
|
||||
<Text className='agreement-link' onClick={() => Taro.navigateTo({ url: '/pages/legal/privacy-policy' })}>《隐私政策》</Text>
|
||||
</Text>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user