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

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

查看文件

@@ -0,0 +1,119 @@
const PAGE_PATH = '/pages/API/interceptor/interceptor'
const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase()
const isMP = platformInfo.startsWith('mp')
const isDom2 = process.env.UNI_APP_X_DOM2 === "true"
describe('interceptor', () => {
let page
beforeEach(async () => {
page = await program.reLaunch(PAGE_PATH)
await page.waitFor('view')
})
if (!isMP) {
// 小程序不支持拦截navigator组件
it('no Interceptor', async () => {
const newPage = await program.navigateTo('./page1')
await newPage.waitFor('text')
const num = (await newPage.data('data')).page
await program.navigateBack()
expect(num).toBe(1)
// 新增 navigator 元素
const elementNavigatorButton = await page.$('.navigatorButton')
await elementNavigatorButton.tap()
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/API/interceptor/page1')
await program.navigateBack()
})
it('addInterceptor', async () => {
await page.callMethod('addInterceptor')
const newPage = await program.navigateTo('./page1')
await newPage.waitFor('text')
const num = (await newPage.data('data')).page
await program.navigateBack()
expect(num).toBe(2)
// 新增 navigator 元素
const elementNavigatorButton = await page.$('.navigatorButton')
await elementNavigatorButton.tap()
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/API/interceptor/page2')
await program.navigateBack()
})
it('removeInterceptor', async () => {
await page.callMethod('removeInterceptor')
const newPage = await program.navigateTo('./page1')
await newPage.waitFor('text')
const num = (await newPage.data('data')).page
await program.navigateBack()
expect(num).toBe(1)
// 新增 navigator 元素
const elementNavigatorButton = await page.$('.navigatorButton')
await elementNavigatorButton.tap()
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/API/interceptor/page1')
await program.navigateBack()
})
}
it('addInterceptor navigateTo api', async () => {
page = await program.reLaunch(PAGE_PATH)
await page.waitFor('view')
await page.callMethod('addInterceptor')
await page.callMethod('navigateTo')
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/API/interceptor/page2')
await program.navigateBack()
})
it('removeInterceptor', async () => {
page = await program.reLaunch(PAGE_PATH)
await page.waitFor('view')
await page.callMethod('addInterceptor')
await page.callMethod('removeInterceptor')
await page.callMethod('navigateTo')
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/API/interceptor/page1')
await program.navigateBack()
})
if (!isDom2) {
// dom2 tabbar 页面暂时为页面+组件实现,没有真正的 tabbar 故无法 switchTab
it('addSwitchTabInterceptor', async () => {
await page.callMethod('addSwitchTabInterceptor')
await page.callMethod('switchTab')
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/tabBar/API')
})
it('removeSwitchTabInterceptor', async () => {
await page.callMethod('addSwitchTabInterceptor')
await page.callMethod('removeSwitchTabInterceptor')
await page.callMethod('switchTab')
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/tabBar/component')
})
}
it('preventNavigateTo', async () => {
await page.callMethod('preventNavigateTo')
await page.waitFor(500)
const currentPage = await program.currentPage()
expect(currentPage.path).toBe('pages/API/interceptor/interceptor')
})
})

查看文件

@@ -0,0 +1,143 @@
<template>
<view style="flex: 1">
<button @click="addInterceptor">添加路由拦截器</button>
<button @click="removeInterceptor">移除路由拦截器</button>
<text>点击下方按钮{{ msg }}</text>
<button @click="navigateTo">navigatorTo API跳转到测试页面</button>
<button @click="preventNavigateTo">拦截器阻止 navigatorTo 执行</button>
<!-- #ifndef MP -->
<navigator url="./page1">
<button class="navigatorButton">navigator组件跳转到测试页面</button>
</navigator>
<!-- #endif -->
<button @click="addSwitchTabInterceptor">添加switchTab拦截器</button>
<button @click="removeSwitchTabInterceptor">移除switchTab拦截器</button>
<button @click="switchTab">switchTab API</button>
</view>
</template>
<script setup lang="uts">
const navigateToInterceptor = {
invoke: function (options : NavigateToOptions) {
console.log('拦截 navigateTo 接口传入参数为:', options)
const url = './page2'
uni.showToast({
title: `重定向到页面:${url}`
})
options.url = url
},
success: function (res : NavigateToSuccess) {
console.log('拦截 navigateTo 接口 success 返回参数为:', res)
},
fail: function (err : NavigateToFail) {
console.log('拦截 navigateTo 接口 fail 返回参数为:', err)
},
complete: function (res : NavigateToComplete) {
console.log('拦截 navigateTo 接口 complete 返回参数为:', res)
}
} as AddInterceptorOptions
const switchTabInterceptor = {
invoke: function (options : SwitchTabOptions) {
console.log('拦截 switchTab 接口传入参数为:', options)
options.url = '/pages/tabBar/API'
},
success: function (res : SwitchTabSuccess) {
console.log('拦截 switchTab 接口 success 返回参数为:', res)
},
fail: function (err : SwitchTabFail) {
console.log('拦截 switchTab 接口 fail 返回参数为:', err)
},
complete: function (res : SwitchTabComplete) {
console.log('拦截 switchTab 接口 complete 返回参数为:', res)
}
} as AddInterceptorOptions
const msg = ref("会跳转到测试页面1")
const addInterceptor = () => {
uni.addInterceptor('navigateTo', navigateToInterceptor)
uni.showToast({
title: '页面跳转/切换tabbar已拦截'
})
msg.value = ",路由被劫持到测试页面2"
}
const removeInterceptor = () => {
uni.removeInterceptor('navigateTo', navigateToInterceptor)
uni.showToast({
title: '拦截器已移除'
})
msg.value = "会跳转到测试页面1"
}
const addSwitchTabInterceptor = () => {
uni.addInterceptor('switchTab', switchTabInterceptor)
}
const removeSwitchTabInterceptor = () => {
uni.removeInterceptor('switchTab', switchTabInterceptor)
}
const navigateTo = () => {
uni.navigateTo({
url: './page1',
success(res) {
console.log('res:', res)
},
fail(err) {
console.error('err:', err)
},
complete(res) {
console.log('res:', res)
}
})
}
const preventNavigateTo = () => {
const preventNavigateToInterceptor = {
invoke: function (options : NavigateToOptions) {
console.log('通过 return false 方式阻止 navigateTo 执行,传入参数为:', options)
uni.showToast({
title: '拦截器已阻止跳转'
})
return false
}
} as AddInterceptorOptions
uni.addInterceptor('navigateTo',preventNavigateToInterceptor)
navigateTo()
uni.removeInterceptor('navigateTo',preventNavigateToInterceptor)
}
const switchTab = () => {
uni.switchTab({
url: '/pages/tabBar/component',
success(res) {
console.log('res:', res)
},
fail(err) {
console.error('err:', err)
},
complete(res) {
console.log('res:', res)
}
})
}
onUnload(() => {
// 移除 navigateTo 所有拦截器
uni.removeInterceptor('navigateTo')
uni.removeInterceptor('switchTab')
})
defineExpose({
addInterceptor,
removeInterceptor,
addSwitchTabInterceptor,
removeSwitchTabInterceptor,
navigateTo,
switchTab,
preventNavigateTo
})
</script>

查看文件

@@ -0,0 +1,23 @@
<template>
<view style="flex: 1;">
<text style="text-align: center;">测试页面 1</text>
</view>
</template>
<script setup lang="uts">
type DataType = {
page : number;
}
const data = reactive({
page: 1
} as DataType)
defineExpose({data})
</script>
<style>
</style>

查看文件

@@ -0,0 +1,23 @@
<template>
<view style="flex: 1;">
<text style="text-align: center;">测试页面 2</text>
</view>
</template>
<script setup lang="uts">
type DataType = {
page : number;
}
const data = reactive({
page: 2
} as DataType)
defineExpose({data})
</script>
<style>
</style>