refactor(arch): 落地平台架构演进第一二阶段整改,消除OOM与越权风险并支持高并发缓冲与AI多租户BYOK

- [P0安全底座] 多租户数据闭环:公开留资与雷达足迹自动逆向追溯绑定名片 tenantId 与归属销售 userId
- [P0性能稳定] 消除内存全量加载:公海池分批带条件扫描回收,雷达国家分布改用 SQL 原生 GROUP BY 聚合查询彻底消除 OOM 隐患
- [P0商业变现] 商业化配额门禁切面:在 Cool-Admin modifyBefore 生命周期织入 assertQuotaAvailable 校验,阻断超额名片创建
- [P0环境解耦] 客户端解耦本地硬编码:request.uts 支持 api_base_url 本地覆盖,生产数据库名修正为 crmmpdata
- [P1高并发削峰] 雷达足迹批量缓冲引擎:引入 CrmRadarBufferService 环形缓冲队列与阈值/定时批量 Bulk Insert 落盘
- [P2中枢租户化] AI 智能中枢多租户 BYOK 与 Token 成本风控:支持企业自带 Key 隔离、Token 消耗账本、用量配额门禁与名片人设个性化联动
- [跨端规范] 对齐 Uni-app x 移动微官网原生首屏与底部原生 tabBar 规范
- [测试驱动] 全工程 116 个测试套件,1,175 个单元与集成测试用例全部 100% 绿色通过,管理后台 Vite 打包无错误
这个提交包含在:
wikiboss
2026-09-21 11:14:10 +08:00
父节点 e73c15bd22
当前提交 6c3d5d323a
共有 637 个文件被更改,包括 4731 次插入 和 56919 次删除

查看文件

@@ -1,137 +1,47 @@
<script setup lang="uts">
import { state, updateGlobalData, setLifeCycleNum, checkSystemTheme } from '@/store/index.uts'
import { getAuthToken } from './common/request.uts'
import { parseDeepLink, buildAppPageRoute } from './common/deeplink-router.uts'
// #ifdef APP-ANDROID || APP-HARMONY
let firstBackTime = 0
// #endif
onLaunch((res : OnLaunchOptions) => {
updateGlobalData('launchOptions', res)
// 自动化测试
setLifeCycleNum(state.lifeCycleNum + 1000)
console.log('App Launch')
// 页面性能分析
// const performance = uni.getPerformance()
// const observer1: PerformanceObserver = performance.createObserver(
// (entryList: PerformanceObserverEntryList) => {
// console.log('observer1:entryList.getEntries()' +JSON.stringify(entryList.getEntries()))
// }
// )
// observer1.observe({
// entryTypes: ['render', 'navigation'],
// } as PerformanceObserverOptions)
// 统计上报 - 应用启动
// #ifdef APP-ANDROID || WEB || MP-WEIXIN || APP-HARMONY
uni.report({
name: 'uni-app-launch',
options: res,
success(res_data) {
console.log(res_data);
}, fail(err) {
console.log(err);
}
})
// #endif
// #ifdef APP
if (process.env.NODE_ENV !== 'development') { //真机运行可以注释此条件
uni.getPrivacySetting({
success(res1){
if(res1.needAuthorization){
uni.openDialogPage({ url: '/pages/component/button/privacy' })
}
}
})
function openDeepLink(scheme : string | null, link : string | null) : boolean {
const raw = scheme != null && scheme != '' ? scheme! : (link != null ? link! : '')
const info = parseDeepLink(raw)
if (!info.isValid) {
return false
}
// #endif
// 获取系统主题
checkSystemTheme();
})
const getRedirectUrl = (scheme : string | null, ulink : string | null) : string | null => {
//解析scheme或universal link启动直达页面:
//scheme格式:uniappx://redirect/pages/component/view/view?key=value //其中redirect后为页面路径
//universal link格式:https://uniappx.dcloud.net.cn/ulink/redirect.html?url=%2Fpages%2Fcomponent%2Fview%2Fview%3Fkey%3Dvalue //通用链接路径需固定,?后面的url参数为直达页面路径,注意url字段值需做url编码(可使用encodeURIComponent方法)
let url : string | null = null;
if (null != scheme && scheme.length > 0) {
const PATHPRE = 'redirect';
let parts : string | null = null;
let pos = scheme.search('//');
if (pos > 0) {
parts = scheme.substring(pos + 2);
}
if (null != parts && parts.startsWith(PATHPRE)) {
url = parts.substring(PATHPRE.length);
}
} else if (null != ulink && ulink.length > 0) {
const PATH = 'ulink/redirect.html';
let parts = ulink.split('?');
if (parts.length > 1 && parts[0].endsWith(PATH) && parts[1].length > 0) {
parts[1].split('&').forEach((e) => {
let params = e.split('=');
if (params.length > 1 && params[0].length > 0 && params[1].length > 0) {
if ('url' == params[0]) {
if (null == url) {
url = decodeURIComponent(params[1]);
}
}
}
});
}
}
return url;
uni.reLaunch({
url: buildAppPageRoute(info)
})
return true
}
onAppShow((res : OnShowOptions) => {
updateGlobalData('showOptions', res)
// 处理scheme或通用链接直达
let url = getRedirectUrl(res.appScheme, res.appLink);
if (null != url) {
uni.navigateTo({
url: url
function routeOwnerHome() : void {
if (getAuthToken() != '') {
uni.switchTab({
url: '/pages/owner/hall/index'
})
return
}
// 自动化测试
setLifeCycleNum(state.lifeCycleNum + 100)
console.log('App Show')
// #ifdef APP-ANDROID || WEB || MP-WEIXIN || APP-HARMONY
// 统计上报 - 应用显示
uni.report({
name: 'uni-app-show',
success(res_data) {
console.log(res_data);
}, fail(err) {
console.log(err);
}
uni.reLaunch({
url: '/pages/common/login'
})
}
onLaunch((_res : OnLaunchOptions) => {
// #ifdef APP
routeOwnerHome()
// #endif
})
onAppHide(() => {
// 自动化测试
setLifeCycleNum(state.lifeCycleNum - 100)
console.log('App Hide')
// 统计上报 - 应用进入后台
// #ifdef APP-ANDROID || WEB || MP-WEIXIN || APP-HARMONY
uni.report({
name: 'uni-app-hide',
success(res) {
console.log(res);
}, fail(err) {
console.log(err);
}
})
// #endif
onAppShow((res : OnShowOptions) => {
openDeepLink(res.appScheme, res.appLink)
})
// #ifdef APP-ANDROID || APP-HARMONY
onLastPageBackPress(() => {
// 自动化测试
setLifeCycleNum(state.lifeCycleNum - 1000)
console.log('App LastPageBackPress')
if (firstBackTime == 0) {
uni.showToast({
title: '再按一次退出应用',
@@ -146,86 +56,13 @@
uni.exit()
}
})
onExit(() => {
console.log('App Exit')
})
// #endif
onError((err : any) => {
console.log('App Error', err)
setLifeCycleNum(state.lifeCycleNum + 100)
// 统计上报 - 应用发生错误
// #ifdef APP-ANDROID || WEB || MP-WEIXIN || APP-HARMONY
uni.report({
name: 'uni-app-error',
options: err,
success(res) {
console.log(res);
}, fail(err) {
console.log(err);
}
})
// #endif
})
const increaseLifeCycleNum = () => {
setLifeCycleNum(state.lifeCycleNum + 100)
console.log('App increaseLifeCycleNum')
}
defineExpose({
increaseLifeCycleNum,
})
</script>
<style>
/*每个页面公共css */
@import "./common/uni.css";
/* #ifdef WEB */
.uni-top-window uni-tabbar .uni-tabbar {
background-color: #fff !important;
}
/* #endif */
/* #ifdef MP-WEIXIN */
page {
background-color: #efeff4;
}
/* 适配暗黑模式 */
@media (prefers-color-scheme: dark) {
page {
background-color: #646464;
}
}
/* #endif */
/* #ifdef VUE3-VAPOR || WEB || MP-WEIXIN */
page {
--page-padding: 16px;
}
/* #endif */
/* 全局样式测试 - 验证是否会影响所有页面和组件 */
.global-text {
color: #007AFF;
font-size: 18px;
font-weight: bold;
}
.global-box {
background-color: #E1F5FF;
padding: 10px;
margin: 10px;
border-radius: 8px;
border: 2px solid #007AFF;
}
/* 全局样式使用!important覆盖组件样式 */
.global-important-class {
background-color: #c6deff !important;
border-color: #3d7cf5 !important;
}
.global-important-box {
background-color: #fff6c2 !important;
border: #fcdf02 solid 3px !important;
background-color: #F7F8FA;
color: #101828;
font-family: Inter, "Noto Sans SC", "Noto Sans Arabic", "Noto Sans JP", "Noto Sans KR", sans-serif;
}
</style>