From e9b85e9e61b5c9804681a0fca2e03d92d0d5a2b1 Mon Sep 17 00:00:00 2001 From: Karlcarlo Date: Wed, 11 Nov 2026 10:54:25 +0800 Subject: [PATCH] =?UTF-8?q?chore(App):=20=E4=B8=8A=E6=9E=B6=E5=90=88?= =?UTF-8?q?=E8=A7=84=E6=89=93=E5=8C=85=E9=85=8D=E7=BD=AE=EF=BC=88=E9=9A=90?= =?UTF-8?q?=E7=A7=81=E5=BC=B9=E7=AA=97/=E6=9D=83=E9=99=90/targetSdk/?= =?UTF-8?q?=E5=A4=87=E6=A1=88=E5=8F=B7/keystore=20=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ androidPrivacy.json | 42 +++++++++++++++++----------------- config/legal.js | 30 ++++++++++++++++++++++++ manifest.json | 38 ++++++++++++++++-------------- pages/users/login/index.vue | 15 ++++++++++++ pages/users/user_set/index.vue | 38 +++++++++++++++++++++++++++++- 6 files changed, 127 insertions(+), 39 deletions(-) create mode 100644 config/legal.js diff --git a/.gitignore b/.gitignore index 2778c02..858d4c7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ unpackage project.config.json .hbuilderx /config/app.js + +# Android 签名证书(私钥,禁止入库;见 manifest.json app-plus.distribute.android.keystore) +keystore/ diff --git a/androidPrivacy.json b/androidPrivacy.json index 917e0f4..5257f39 100644 --- a/androidPrivacy.json +++ b/androidPrivacy.json @@ -1,28 +1,28 @@ { - "version" : "1", - "prompt" : "template", - "title" : "用户协议与隐私政策", - "message" : "\t请务必审慎阅读、充分理解“用户协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。
- 你可以阅读 《用户协议》与 《隐私政策》了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。", - "buttonAccept" : "同意并接受", - "buttonRefuse" : "暂不同意", - "second" : { - "title" : "确认提示", - "message" : "进入应用前,你需先同意《用户协议》与《隐私政策》,否则将退出应用。", - "buttonAccept" : "同意并继续", - "buttonRefuse" : "退出应用" + "version": "1", + "prompt": "template", + "title": "用户协议与隐私政策", + "message": "\t请务必审慎阅读、充分理解“用户协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。
你可以阅读 《用户协议》与 《隐私政策》了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。", + "buttonAccept": "同意并接受", + "buttonRefuse": "暂不同意", + "backToExit": "true", + "second": { + "title": "确认提示", + "message": "进入应用前,你需先同意《用户协议》与《隐私政策》,否则将退出应用。", + "buttonAccept": "同意并继续", + "buttonRefuse": "退出应用" }, - "styles" : { - "backgroundColor" : "#fff", - "borderRadius" : "5px", - "title" : { - "color" : "#000" + "styles": { + "backgroundColor": "#fff", + "borderRadius": "5px", + "title": { + "color": "#000" }, - "buttonAccept" : { - "color" : "#fff" + "buttonAccept": { + "color": "#fff" }, - "buttonRefuse" : { - "color" : "#ccc" + "buttonRefuse": { + "color": "#ccc" } } } diff --git a/config/legal.js b/config/legal.js new file mode 100644 index 0000000..48d688b --- /dev/null +++ b/config/legal.js @@ -0,0 +1,30 @@ +// +---------------------------------------------------------------------- +// | 合规展示信息(主体 / 备案号) +// +---------------------------------------------------------------------- +// | 用途:小米、华为等商店硬性要求「应用内可见 APP 备案号」(截图要体现), +// | 而备案号在开发期还不存在 —— 统一收在这一个文件,号下来只改这里。 +// | +// | 为什么不放 config/app.js:那个文件在 .gitignore 里(本地私有配置), +// | 放进去等于不进仓库、换个环境就丢;也不写死在页面里:同一个号要出现在 +// | 设置页与登录页两处,写死两份必然不同步。 +// | +// | 使用位置: +// | pages/users/user_set/index.vue 「我的 → 设置」底部的关于区块 +// | pages/users/login/index.vue 登录页页脚(未登录也能看到) +// | ⚠️ 两处展示都包在 #ifdef APP-PLUS 里:小程序 / H5 的界面与行为不受影响。 +// +---------------------------------------------------------------------- + +module.exports = { + /** + * APP 备案号:ICP 备案号 + 「-序号A」后缀,例:京ICP备17065521号-3A + * 空字符串 = 不展示该行(备案号下发前保持为空,避免截图里出现占位文案被商店挑刺) + * ⚠️ 号码下发后填这里 → 重新出包;不要去改页面。 + */ + APP_BEIAN_NO: '', + + /** 网站/主体 ICP 备案号(已有,官网与小程序在用) */ + WEBSITE_ICP_NO: '京ICP备17065521号', + + /** 备案主体 = 软著著作权人(北京臻惠网络科技有限公司)—— 三处必须一致,改名要同步软著与备案 */ + SUBJECT: '北京臻惠网络科技有限公司' +}; diff --git a/manifest.json b/manifest.json index 2749dc3..966dc2a 100644 --- a/manifest.json +++ b/manifest.json @@ -8,6 +8,11 @@ "sassImplementationName" : "node-sass", /* 5+App特有相关 */ "app-plus" : { + /* 隐私政策提示框开关:template = 启动时在 splash 层弹原生隐私框(上架硬性要求)。 + 提示框内容/样式在同目录 androidPrivacy.json,两者必须同时存在且 JSON 合法。 */ + "privacy" : { + "prompt" : "template" + }, "usingComponents" : true, "nvueCompiler" : "uni-app", "nvueStyleCompiler" : "uni-app", @@ -19,6 +24,11 @@ "distribute" : { /* android打包配置 */ "android" : { + "packagename" : "com.yizhezhe.douba", + "keystore" : "keystore/douba-shop.keystore", + "password" : "douba@2026", + "aliasname" : "douba", + "schemes" : "douba", "permissions" : [ "", "", @@ -26,24 +36,18 @@ "", "", "", - "", "", - "", "", "", "", "", "", - "", - "", - "", "", "", "", - "", - "" + "" ], - "abiFilters" : [ "armeabi-v7a" ], + "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ], "permissionExternalStorage" : { "request" : "none", "prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。" @@ -53,8 +57,8 @@ "prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许" }, "minSdkVersion" : 21, - "targetSdkVersion" : 30, // 建议设置为 30 或更高 - "compileSdkVersion" : 30 + "targetSdkVersion" : 34, // 商店普遍要求 30+,34 为稳妥档(36 需同步验证);API 34 起前台服务/权限更严 + "compileSdkVersion" : 36 // HBuilderX 4.81+ 适配 16KB page size 要求 36 }, /* ios打包配置 */ "ios" : { @@ -82,8 +86,8 @@ "payment" : { "weixin" : { "__platform__" : [ "ios", "android" ], - "appid" : "wx3e14a895971fbea6", - "UniversalLinks" : "https://pro.crmeb.net/uni-universallinks/__UNI__7E0054B/" + "appid" : "wxbe5081d4835af21b", + "UniversalLinks" : "https://mp.yizhezhe.com/uni-universallinks/__UNI__52BA861/" }, "alipay" : { "__platform__" : [ "ios", "android" ] @@ -91,8 +95,8 @@ }, "share" : { "weixin" : { - "appid" : "wx3e14a895971fbea6", - "UniversalLinks" : "https://pro.crmeb.net/uni-universallinks/__UNI__7E0054B/" + "appid" : "wxbe5081d4835af21b", + "UniversalLinks" : "https://mp.yizhezhe.com/uni-universallinks/__UNI__52BA861/" } }, "push" : {}, @@ -104,9 +108,9 @@ }, "oauth" : { "weixin" : { - "appid" : "wx3e14a895971fbea6", - "appsecret" : "ee83a6c94edbc5dd7a5b4614316d85a7", - "UniversalLinks" : "https://pro.crmeb.net/uni-universallinks/__UNI__7E0054B/" + "appid" : "wxbe5081d4835af21b", + "appsecret" : "5dafb0ed5b106eb8f56f70824893f7ec", + "UniversalLinks" : "https://mp.yizhezhe.com/uni-universallinks/__UNI__52BA861/" }, "apple" : {} }, diff --git a/pages/users/login/index.vue b/pages/users/login/index.vue index 806f367..bf54c5e 100644 --- a/pages/users/login/index.vue +++ b/pages/users/login/index.vue @@ -78,6 +78,10 @@ 《用户协议》 与《隐私协议》 + + + APP 备案号:{{ beianNo }} + @@ -116,6 +120,7 @@ import colors from '@/mixins/color.js'; import Verify from '../components/verify/verify.vue'; import { HTTP_REQUEST_URL, CAPTCHA_TYPE } from '@/config/app'; + import legal from '@/config/legal.js'; export default { name: "Login", components: { @@ -147,6 +152,8 @@ appleShow: false, // 苹果登录版本必须要求ios13以上的 keyLock: true, copyrightContext:'', + // App 备案号(商店要求应用内可见):号未下发时为空 → 该行不渲染 + beianNo: legal.APP_BEIAN_NO, }; }, watch: { @@ -798,6 +805,14 @@ color: var(--view-theme); } + /* App 备案号:字号比协议再小一档,避免抢协议勾选的视觉重心 */ + .beian { + margin-top: 14rpx; + font-size: 20rpx; + line-height: 28rpx; + color: #b5b5b5; + } + .trembling { animation: shake 0.6s; } diff --git a/pages/users/user_set/index.vue b/pages/users/user_set/index.vue index ed278f2..698b660 100644 --- a/pages/users/user_set/index.vue +++ b/pages/users/user_set/index.vue @@ -5,6 +5,7 @@ import { mapGetters, mapMutations } from 'vuex'; import colors from '@/mixins/color.js'; import tuiModal from '@/components/tui-modal/index.vue'; import NavBar from '@/components/NavBar.vue'; +import legal from '@/config/legal.js'; export default { computed: mapGetters(['isLogin']), data() { @@ -15,7 +16,11 @@ export default { loginType: 'h5', showModal: false, version: '', - fileSizeString: '' + fileSizeString: '', + // 关于区块的合规信息(App 内必须可见备案号):统一取 config/legal.js + beianNo: legal.APP_BEIAN_NO, + icpNo: legal.WEBSITE_ICP_NO, + subject: legal.SUBJECT }; }, mixins: [colors], @@ -149,6 +154,28 @@ export default { + + + + + 当前版本 + {{ version || '—' }} + + + APP 备案号 + {{ beianNo }} + + + ICP 备案号 + {{ icpNo }} + + + 开发者 + {{ subject }} + + + @@ -230,6 +257,15 @@ export default { } } + /* 右侧纯文本值(版本号 / 备案号 / 主体):备案号可能较长,允许换行 */ + .value { + color: #999; + font-size: 26rpx; + max-width: 60%; + text-align: right; + word-break: break-all; + } + /deep/.uni-switch-input { width: 84rpx; height: 48rpx;