refactor: 确立独立子工程架构 (backend, admin, mpuniapp) 并同步更新 AGENTS.md 规范

这个提交包含在:
wikiboss
2026-09-20 17:05:22 +08:00
父节点 de3cf8b870
当前提交 9fa1d1fbd0
共有 1679 个文件被更改,包括 204798 次插入 和 16817 次删除

查看文件

@@ -0,0 +1,60 @@
const PAGE_PATH = '/pages/API/get-app/get-app'
const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase()
const isAndroid = platformInfo.startsWith('android')
const isMP = platformInfo.startsWith('mp')
const isDom2 = process.env.UNI_APP_X_DOM2 === "true"
describe('getApp', () => {
let page = null
beforeAll(async () => {
page = await program.navigateTo(PAGE_PATH)
await page.waitFor('view')
})
it('globalData', async () => {
await page.callMethod('getGlobalData')
let data = await page.data('data')
expect(data.originGlobalData.str).toBe('default globalData str')
expect(data.originGlobalData.num).toBe(0)
expect(data.originGlobalData.bool).toBe(false)
expect(data.originGlobalData.obj).toEqual({
bool: false,
num: 0,
str: 'default globalData obj str',
})
expect(data.originGlobalData.arr).toEqual([])
expect(data.originGlobalData.set).toEqual([])
expect(data.originGlobalData.map).toEqual({})
expect(data.originGlobalDataFuncRes).toBe('globalData fun')
await page.callMethod('setGlobalData')
data = await page.data('data')
expect(data.newGlobalData.str).toBe('new globalData str')
expect(data.newGlobalData.num).toBe(100)
expect(data.newGlobalData.bool).toBe(true)
expect(data.newGlobalData.obj).toEqual({
bool: true,
num: 200,
str: 'new globalData obj str',
})
expect(data.newGlobalData.arr).toEqual([1, 2, 3])
expect(data.newGlobalData.set).toEqual(['a', 'b', 'c'])
expect(data.newGlobalData.map).toEqual({
a: 1,
b: 2,
c: 3
})
expect(data.newGlobalDataFuncRes).toBe('new globalData fun')
})
it('method', async () => {
const oldLifeCycleNum = await page.data('data.lifeCycleNum')
await page.callMethod('_increaseLifeCycleNum')
const newLifeCycleNum = await page.data('data.lifeCycleNum')
expect(newLifeCycleNum - oldLifeCycleNum).toBe(100)
await page.callMethod('setLifeCycleNumFunc', oldLifeCycleNum)
})
if (isAndroid && !isDom2) {
it('getAndroidApplication', async () => {
const res = await page.callMethod('getAndroidApplication')
expect(res).toBe(isAndroid)
})
}
})

查看文件

@@ -0,0 +1,215 @@
<template>
<!-- #ifdef APP -->
<scroll-view style="flex: 1; padding-bottom: 20px">
<!-- #endif -->
<view>
<page-head title="getApp"></page-head>
<view class="uni-padding-wrap">
<button @click="getGlobalData">get globalData</button>
<template v-if="data.originGlobalData.str.length">
<text class="uni-common-mt bold">初始的 globalData:</text>
<text class="uni-common-mt">globalData string: {{ data.originGlobalData.str }}</text>
<text class="uni-common-mt">globalData number: {{ data.originGlobalData.num }}</text>
<text class="uni-common-mt">globalData boolean: {{ data.originGlobalData.bool }}</text>
<text class="uni-common-mt">globalData object: {{ data.originGlobalData.obj }}</text>
<text class="uni-common-mt">globalData null: {{ data.originGlobalData.null }}</text>
<text class="uni-common-mt">globalData array: {{ data.originGlobalData.arr }}</text>
<text class="uni-common-mt">globalData Set: {{ data.originGlobalData.set }}</text>
<text class="uni-common-mt">globalData Map: {{ data.originGlobalData.map }}</text>
<text class="uni-common-mt">globalData fun 返回值: {{ data.originGlobalDataFuncRes }}</text>
</template>
<button @click="setGlobalData" class="uni-common-mt">
set globalData
</button>
<template v-if="data.newGlobalData.bool">
<text class="uni-common-mt bold">更新后的 globalData:</text>
<text class="uni-common-mt">globalData string: {{ data.newGlobalData.str }}</text>
<text class="uni-common-mt">globalData number: {{ data.newGlobalData.num }}</text>
<text class="uni-common-mt">globalData boolean: {{ data.newGlobalData.bool }}</text>
<text class="uni-common-mt">globalData object: {{ data.newGlobalData.obj }}</text>
<text class="uni-common-mt">globalData null: {{ data.newGlobalData.null }}</text>
<text class="uni-common-mt">globalData array: {{ data.newGlobalData.arr }}</text>
<text class="uni-common-mt">globalData Set: {{ data.newGlobalData.set }}</text>
<text class="uni-common-mt">globalData Map: {{ data.newGlobalData.map }}</text>
<text class="uni-common-mt">globalData fun 返回值: {{ data.newGlobalDataFuncRes }}</text>
</template>
<text class="uni-common-mt">点击按钮调用 App.uvue methods</text>
<text class="uni-common-mt">increaseLifeCycleNum 方法</text>
<button class="uni-common-mt" @click="_increaseLifeCycleNum">
increase lifeCycleNum
</button>
<text class="uni-common-mt">lifeCycleNum: {{ data.lifeCycleNum }}</text>
<!-- #ifdef APP-ANDROID && !VUE3-VAPOR -->
<button class="uni-common-mt" @click="getAndroidApplication">
getAndroidApplication
</button>
<text class="uni-common-mt">androidApplication is null: {{ data.androidApplication == null }}</text>
<!-- #endif -->
</view>
</view>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
</template>
<script setup lang="uts">
import { state, setLifeCycleNum, updateGlobalData } from '@/store/index.uts'
type MyGlobalData = {
str : string,
num : number,
bool : boolean,
obj : UTSJSONObject,
null : string | null,
arr : number[],
set : string[],
map : UTSJSONObject,
fun : () => string
}
type DataType = {
originGlobalData: MyGlobalData;
originGlobalDataFuncRes: string;
newGlobalData: MyGlobalData;
newGlobalDataFuncRes: string;
lifeCycleNum: number;
androidApplication: any | null;
}
const data = reactive({
originGlobalData: {
str: '',
num: 0,
bool: false,
obj: {
str: '',
num: 0,
bool: false
},
null: null,
arr: [] as number[],
set: [] as string[],
map: {},
fun: () : string => ''
},
originGlobalDataFuncRes: '',
newGlobalData: {
str: '',
num: 0,
bool: false,
obj: {
str: '',
num: 0,
bool: false
},
null: null,
arr: [] as number[],
set: [] as string[],
map: {},
fun: () : string => ''
},
newGlobalDataFuncRes: '',
lifeCycleNum: 0,
androidApplication: null
} as DataType)
const getGlobalData = () => {
data.originGlobalData.str = state.globalData.str
data.originGlobalData.num = state.globalData.num
data.originGlobalData.bool = state.globalData.bool
data.originGlobalData.obj = state.globalData.obj
data.originGlobalData.null = state.globalData.null
data.originGlobalData.arr = state.globalData.arr
state.globalData.set.forEach((value : string) => {
data.originGlobalData.set.push(value)
})
state.globalData.map.forEach((value : any, key : string) => {
data.originGlobalData.map[key] = value
})
data.originGlobalData.fun = state.globalData.fun
data.originGlobalDataFuncRes = data.originGlobalData.fun()
}
const setGlobalData = () => {
updateGlobalData('str', 'new globalData str')
updateGlobalData('num', 100)
updateGlobalData('bool', true)
updateGlobalData('obj',{
str: 'new globalData obj str',
num: 200,
bool: true
})
updateGlobalData('null', 'not null')
updateGlobalData('arr', [1, 2, 3])
updateGlobalData('set', new Set(['a', 'b', 'c']))
updateGlobalData('map', new Map<string, any>([
['a', 1],
['b', 2],
['c', 3]
]))
updateGlobalData('fun', () : string => {
return 'new globalData fun'
})
data.newGlobalData.str = state.globalData.str
data.newGlobalData.num = state.globalData.num
data.newGlobalData.bool = state.globalData.bool
data.newGlobalData.obj = state.globalData.obj
data.newGlobalData.null = state.globalData.null
data.newGlobalData.arr = state.globalData.arr
console.log('state.globalData.arr',state.globalData.arr)
console.log('state.globalData.set',state.globalData.set)
state.globalData.set.forEach((value : string) => {
data.newGlobalData.set.push(value)
})
state.globalData.map.forEach((value : any, key : string) => {
data.newGlobalData.map[key] = value
})
data.newGlobalData.fun = state.globalData.fun
data.newGlobalDataFuncRes = data.newGlobalData.fun()
}
const _increaseLifeCycleNum = () => {
const app = getApp()
app.vm!.increaseLifeCycleNum()
data.lifeCycleNum = state.lifeCycleNum
}
// 自动化测试
const setLifeCycleNumFunc = (num : number) => {
setLifeCycleNum(num)
}
// #ifdef APP-ANDROID && !VUE3-VAPOR
const getAndroidApplication = () : boolean => {
const app = getApp()
data.androidApplication = app.getAndroidApplication()
return data.androidApplication !== null
}
// #endif
onReady(() => {
data.lifeCycleNum = state.lifeCycleNum
})
defineExpose({
data,
getGlobalData,
setGlobalData,
_increaseLifeCycleNum,
setLifeCycleNumFunc,
// #ifdef APP-ANDROID && !VUE3-VAPOR
getAndroidApplication
// #endif
})
</script>
<style>
.bold {
font-weight: bold;
}
.hr {
border-bottom: 1px solid #ccc;
}
</style>