diff --git a/.gitignore b/.gitignore index b43a8de3..6cc16b40 100644 --- a/.gitignore +++ b/.gitignore @@ -175,3 +175,11 @@ uploadfile *.json .vscode .cursor + +!package.json +!**/package.json + +# Do not ignore env and json files inside manager-mobile +!main/manager-mobile/**/env/ +!main/manager-mobile/**/.env* +!main/manager-mobile/**/*.json \ No newline at end of file diff --git a/docs/images/manager-mobile/打包发行步骤1.png b/docs/images/manager-mobile/打包发行步骤1.png new file mode 100644 index 00000000..88cabf48 Binary files /dev/null and b/docs/images/manager-mobile/打包发行步骤1.png differ diff --git a/docs/images/manager-mobile/打包发行步骤2.png b/docs/images/manager-mobile/打包发行步骤2.png new file mode 100644 index 00000000..747b5ffb Binary files /dev/null and b/docs/images/manager-mobile/打包发行步骤2.png differ diff --git a/docs/images/manager-mobile/本地运行.png b/docs/images/manager-mobile/本地运行.png new file mode 100644 index 00000000..c3c5b6ea Binary files /dev/null and b/docs/images/manager-mobile/本地运行.png differ diff --git a/docs/images/manager-mobile/生成appid.png b/docs/images/manager-mobile/生成appid.png new file mode 100644 index 00000000..73e6357e Binary files /dev/null and b/docs/images/manager-mobile/生成appid.png differ diff --git a/docs/images/manager-mobile/重新识别项目.png b/docs/images/manager-mobile/重新识别项目.png new file mode 100644 index 00000000..0e9c1c9f Binary files /dev/null and b/docs/images/manager-mobile/重新识别项目.png differ diff --git a/main/manager-mobile/LICENSE b/main/manager-mobile/LICENSE index 9e91d10b..8738d3b5 100644 --- a/main/manager-mobile/LICENSE +++ b/main/manager-mobile/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 菲鸽 +Copyright (c) 2025 Junsen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/main/manager-mobile/README.md b/main/manager-mobile/README.md index d5354b15..1886be80 100644 --- a/main/manager-mobile/README.md +++ b/main/manager-mobile/README.md @@ -1,36 +1,169 @@ -# 智控台移动版 -manager-mobile是智控台手机版本,方便在手机上管理智能体。 +## 智控台移动版(manager-mobile) +基于 uni-app v3 + Vue 3 + Vite 的跨端移动管理端,支持 App(Android & iOS)和微信小程序。 -## 平台兼容性 +### 平台兼容性 -| H5 | IOS | 安卓 | 微信小程序 | 字节小程序 | 快手小程序 | 支付宝小程序 | 钉钉小程序 | 百度小程序 | -| --- | --- | ---- | ---------- | ---------- | ---------- | ------------ | ---------- | ---------- | -| √ | √ | √ | √ | √ | √ | √ | √ | √ | +| H5 | iOS | Android | 微信小程序 | 字节小程序 | 快手小程序 | 支付宝小程序 | 钉钉小程序 | 百度小程序 | +| -- | --- | ------- | ---------- | ---------- | ---------- | ------------ | ---------- | ---------- | +| × | √ | √ | √ | × | × | × | × | × | -注意每种 `UI框架` 支持的平台有所不同,详情请看各 `UI框架` 的官网,也可以看 `unibest` 文档。 +提示:不同 UI 组件在不同平台的适配度略有差异,请以对应组件库文档为准。 -## ⚙️ 环境 +### 开发环境要求 +- Node >= 18 +- pnpm >= 7.30(建议使用项目中声明的 `pnpm@10.x`) +- 可选:HBuilderX(App 调试/打包)、微信开发者工具(微信小程序) -- node>=18 -- pnpm>=7.30 -- Vue Official>=2.1.10 -- TypeScript>=5.0 +### 快速开始 +1) 配置环境变量 + - 复制 `env/.env.example` 为 `env/.env.development` + - 根据实际情况修改配置项(特别是 `VITE_SERVER_BASEURL`、`VITE_UNI_APPID`、`VITE_WX_APPID`) -## 📂 快速开始 +2) 安装依赖 -执行 `pnpm create unibest` 创建项目 -执行 `pnpm i` 安装依赖 -执行 `pnpm dev` 运行 `H5` -执行 `pnpm dev:mp` 运行 `微信小程序` +```bash +pnpm i +``` -## 📦 运行(支持热更新) +3) 本地开发(热更新) +- 微信小程序:`pnpm dev:mp` 或 `pnpm dev:mp-weixin`,然后用微信开发者工具导入 `dist/dev/mp-weixin` +- App:用 HBuilderX 导入 `manager-mobile`,然后参考下面的教程就能运行了 -- web平台: `pnpm dev:h5`, 然后打开 [http://localhost:9000/](http://localhost:9000/)。 -- weixin平台:`pnpm dev:mp` 然后打开微信开发者工具,导入本地文件夹,选择本项目的`dist/dev/mp-weixin` 文件。 -- APP平台:`pnpm dev:app`, 然后打开 `HBuilderX`,导入刚刚生成的`dist/dev/app` 文件夹,选择运行到模拟器(开发时优先使用),或者运行的安卓/ios基座。 +### 环境变量与配置 +项目使用自定义 `env` 目录存放环境文件,按 Vite 规范命名:`.env.development`、`.env.production` 等。 -## 🔗 发布 +关键变量(部分): +- VITE_APP_TITLE:应用名称(写入 `manifest.config.ts`) +- VITE_UNI_APPID:uni-app 应用 appid(App) +- VITE_WX_APPID:微信小程序 appid(mp-weixin) +- VITE_FALLBACK_LOCALE:默认语言,如 `zh-Hans` +- VITE_SERVER_BASEURL:服务端基础地址(HTTP 请求 baseURL) +- VITE_DELETE_CONSOLE:构建时是否移除 console(`true`/`false`) +- VITE_SHOW_SOURCEMAP:是否生成 sourcemap(默认关闭) +- VITE_LOGIN_URL:未登录跳转的登录页路径(路由拦截器使用) -- web平台: `pnpm build:h5`,打包后的文件在 `dist/build/h5`,可以放到web服务器,如nginx运行。如果最终不是放在根目录,可以在 `manifest.config.ts` 文件的 `h5.router.base` 属性进行修改。 -- weixin平台:`pnpm build:mp`, 打包后的文件在 `dist/build/mp-weixin`,然后通过微信开发者工具导入,并点击右上角的“上传”按钮进行上传。 -- APP平台:`pnpm build:app`, 然后打开 `HBuilderX`,导入刚刚生成的`dist/build/app` 文件夹,选择发行 - APP云打包。 +示例(`env/.env.development`): +```env +VITE_APP_TITLE=小智 +VITE_FALLBACK_LOCALE=zh-Hans +VITE_UNI_APPID= +VITE_WX_APPID= + +VITE_SERVER_BASEURL=http://localhost:8080 + +VITE_DELETE_CONSOLE=false +VITE_SHOW_SOURCEMAP=false +VITE_LOGIN_URL=/pages/login/index +``` + +说明: +- `manifest.config.ts` 会从 `env` 读取标题、appid、语言等配置。 + +### 重要注意事项 +⚠️ **部署前必须修改的配置项:** + +1. **应用 ID 配置** + - `VITE_UNI_APPID`:需要在 [DCloud 开发者中心](https://dev.dcloud.net.cn/) 创建应用并获取 AppID + - `VITE_WX_APPID`:需要在 [微信公众平台](https://mp.weixin.qq.com/) 注册小程序并获取 AppID + +2. **服务端地址** + - `VITE_SERVER_BASEURL`:修改为您的实际服务端地址 + +3. **应用信息** + - `VITE_APP_TITLE`:修改为您的应用名称 + - 更新 `src/static/logo.png` 等图标资源 + +4. **其他配置** + - 检查 `manifest.config.ts` 中的应用配置信息 + - 根据需要修改 `src/layouts/fg-tabbar/tabbarList.ts` 中的 tabbar 配置 + +### 详细操作指南 + +#### 1. 获取 uni-app AppID +![生成AppID](../../docs/images/manager-mobile/生成appid.png) +- 复制生成的 AppID 到环境变量 `VITE_UNI_APPID` 中 + +#### 2. 本地运行步骤 +![本地运行](../../docs/images/manager-mobile/本地运行.png) + +**App 本地调试:** +1. 用 HBuilderX 导入 `manager-mobile` 目录 +2. 重新识别项目 +3. 连接手机或使用模拟器进行真机调试 + +**项目识别问题解决:** +![重新识别项目](../../docs/images/manager-mobile/重新识别项目.png) + +如果 HBuilderX 无法正确识别项目类型: +- 在项目根目录右键选择"重新识别项目类型" +- 确保项目被识别为 "uni-app" 项目 + +### 路由与鉴权 +- 在 `src/main.ts` 中注册了路由拦截插件 `routeInterceptor`。 +- 黑名单拦截:仅对配置为需要登录的页面进行校验(来源 `@/utils` 的 `getNeedLoginPages`)。 +- 登录判断:基于用户信息(`pinia` 的 `useUserStore`),未登录将跳转到 `VITE_LOGIN_URL`,并附带重定向回原页面的参数。 + +### 网络请求 +- 基于 `alova` + `@alova/adapter-uniapp`,统一在 `src/http/request/alova.ts` 创建实例。 +- `baseURL` 读取环境配置(`getEnvBaseUrl`),可通过 `method.config.meta.domain` 动态切换域名。 +- 认证:默认从本地 `token`(`uni.getStorageSync('token')`)注入 `Authorization` 头,缺失则重定向登录。 +- 响应:统一处理 `statusCode !== 200` 的 HTTP 错误与业务 `code !== 0` 的错误;`401` 会清除 token 并跳转登录。 + +### 构建与发布 + +**微信小程序:** +1. 确保已配置正确的 `VITE_WX_APPID` +2. 运行 `pnpm build:mp`,产物在 `dist/build/mp-weixin` +3. 用微信开发者工具导入项目目录,并上传代码 +4. 在微信公众平台提交审核 + +**Android & iOS App:** + +#### 3. App 打包发行步骤 + +**步骤一:准备打包** +![打包发行步骤1](../../docs/images/manager-mobile/打包发行步骤1.png) + +1. 确保已配置正确的 `VITE_UNI_APPID` +2. 运行 `pnpm build:app`,产物在 `dist/build/app` +3. 用 HBuilderX 导入项目目录 +4. 在 HBuilderX 中点击"发行" → "原生App-云打包" + +**步骤二:配置打包参数** +![打包发行步骤2](../../docs/images/manager-mobile/打包发行步骤2.png) + +1. **应用图标和启动图**:上传应用图标和启动页面图片 +2. **应用版本号**:设置版本号和版本名称 +3. **签名证书**: + - Android:上传 keystore 证书文件 + - iOS:配置开发者证书和描述文件 +4. **包名配置**:设置应用的包名(Bundle ID) +5. **打包类型**:选择测试包或正式包 +6. 点击"打包"开始云打包流程 + +**发布到应用商店:** +- **Android**:将生成的 APK 文件上传到各大 Android 应用市场 +- **iOS**:将生成的 IPA 文件通过 App Store Connect 上传到 App Store(需要 Apple 开发者账号) + +### 约定与工程化 +- 页面与分包:由 `@uni-helper/vite-plugin-uni-pages` 与 `pages.config.ts` 统一生成;tabbar 配置在 `src/layouts/fg-tabbar/tabbarList.ts`。 +- 组件与 hooks 自动导入:见 `vite.config.ts` 中 `unplugin-auto-import` 与 `@uni-helper/vite-plugin-uni-components`。 +- 样式:使用 UnoCSS 与 `src/style/index.scss`。 +- 状态管理:`pinia` + `pinia-plugin-persistedstate`。 +- 代码规范:内置 `eslint`、`husky`、`lint-staged`,提交前自动格式化(`lint-staged`)。 + +### 常用脚本 +```bash +# 开发 +pnpm dev:mp # 等价 dev:mp-weixin + +# 构建 +pnpm build:mp # 等价 build:mp-weixin + +# 其他 +pnpm type-check +pnpm lint && pnpm lint:fix +``` + +### License +MIT diff --git a/main/manager-mobile/env/.env b/main/manager-mobile/env/.env new file mode 100644 index 00000000..e0f4eea6 --- /dev/null +++ b/main/manager-mobile/env/.env @@ -0,0 +1,19 @@ +VITE_APP_TITLE = '小智' +VITE_APP_PORT = 9000 + +VITE_UNI_APPID = '__UNI__36A515E' +VITE_WX_APPID = 'wxa2abb91f64032a2b' + +# h5部署网站的base,配置到 manifest.config.ts 里的 h5.router.base +VITE_APP_PUBLIC_BASE=/ + +# 登录页面 +VITE_LOGIN_URL = '/pages/login/index' +# 第一个请求地址 +VITE_SERVER_BASEURL = 'https://2662r3426b.vicp.fun/xiaozhi' + +VITE_UPLOAD_BASEURL = '/otaMag/upload' + +# h5是否需要配置代理 +VITE_APP_PROXY=true +VITE_APP_PROXY_PREFIX = '/xiaozhi' \ No newline at end of file diff --git a/main/manager-mobile/env/.env.development b/main/manager-mobile/env/.env.development new file mode 100644 index 00000000..04fa2739 --- /dev/null +++ b/main/manager-mobile/env/.env.development @@ -0,0 +1,6 @@ +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV = 'development' +# 是否去除console 和 debugger +VITE_DELETE_CONSOLE = false +# 是否开启sourcemap +VITE_SHOW_SOURCEMAP = true diff --git a/main/manager-mobile/env/.env.production b/main/manager-mobile/env/.env.production new file mode 100644 index 00000000..8a1b50ca --- /dev/null +++ b/main/manager-mobile/env/.env.production @@ -0,0 +1,6 @@ +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV = 'development' +# 是否去除console 和 debugger +VITE_DELETE_CONSOLE = true +# 是否开启sourcemap +VITE_SHOW_SOURCEMAP = false diff --git a/main/manager-mobile/env/.env.test b/main/manager-mobile/env/.env.test new file mode 100644 index 00000000..e22f765a --- /dev/null +++ b/main/manager-mobile/env/.env.test @@ -0,0 +1,4 @@ +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV = 'development' +# 是否去除console 和 debugger +VITE_DELETE_CONSOLE = false diff --git a/main/manager-mobile/openapi-ts-request.config.ts b/main/manager-mobile/openapi-ts-request.config.ts deleted file mode 100644 index 05195d1a..00000000 --- a/main/manager-mobile/openapi-ts-request.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { GenerateServiceProps } from 'openapi-ts-request' - -export default [ - { - schemaPath: 'http://petstore.swagger.io/v2/swagger.json', - serversPath: './src/service/app', - requestLibPath: `import request from '@/utils/request';\n import { CustomRequestOptions } from '@/http/interceptor';`, - requestOptionsType: 'CustomRequestOptions', - isGenReactQuery: true, - reactQueryMode: 'vue', - isGenJavaScript: false, - }, -] as GenerateServiceProps[] diff --git a/main/manager-mobile/package.json b/main/manager-mobile/package.json new file mode 100644 index 00000000..62fae5f0 --- /dev/null +++ b/main/manager-mobile/package.json @@ -0,0 +1,161 @@ +{ + "name": "xiaozhi-mobile-admin", + "type": "commonjs", + "version": "3.4.0", + "unibest-version": "3.4.0", + "packageManager": "pnpm@10.10.0", + "description": "xiaozhi-esp32-server的移动端管理后台", + "generate-time": "2025-08-04", + "author": { + "name": "huangjunsen", + "zhName": "黄俊森", + "email": "huangjunsen@xiaozhi.com", + "github": "https://github.com/huangjunsen0406", + "gitee": "https://gitee.com/huang-jun-sen" + }, + "license": "MIT", + "homepage": "https://github.com/xinnan-tech/xiaozhi-esp32-server", + "repository": "https://github.com/xinnan-tech/xiaozhi-esp32-server", + "bugs": { + "url": "https://github.com/xinnan-tech/xiaozhi-esp32-server/issues" + }, + "engines": { + "node": ">=18", + "pnpm": ">=7.30" + }, + "scripts": { + "preinstall": "npx only-allow pnpm", + "uvm": "npx @dcloudio/uvm@latest", + "uvm-rm": "node ./scripts/postupgrade.js", + "postuvm": "echo upgrade uni-app success!", + "dev:app": "uni -p app", + "dev:app-android": "uni -p app-android", + "dev:app-ios": "uni -p app-ios", + "dev:custom": "uni -p", + "dev": "uni", + "dev:h5": "uni", + "dev:h5:ssr": "uni --ssr", + "dev:mp": "uni -p mp-weixin", + "dev:mp-alipay": "uni -p mp-alipay", + "dev:mp-baidu": "uni -p mp-baidu", + "dev:mp-jd": "uni -p mp-jd", + "dev:mp-kuaishou": "uni -p mp-kuaishou", + "dev:mp-lark": "uni -p mp-lark", + "dev:mp-qq": "uni -p mp-qq", + "dev:mp-toutiao": "uni -p mp-toutiao", + "dev:mp-weixin": "uni -p mp-weixin", + "dev:mp-xhs": "uni -p mp-xhs", + "dev:quickapp-webview": "uni -p quickapp-webview", + "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei", + "dev:quickapp-webview-union": "uni -p quickapp-webview-union", + "build:app": "uni build -p app", + "build:app-android": "uni build -p app-android", + "build:app-ios": "uni build -p app-ios", + "build:custom": "uni build -p", + "build:h5": "uni build", + "build": "uni build", + "build:h5:ssr": "uni build --ssr", + "build:mp-alipay": "uni build -p mp-alipay", + "build:mp": "uni build -p mp-weixin", + "build:mp-baidu": "uni build -p mp-baidu", + "build:mp-jd": "uni build -p mp-jd", + "build:mp-kuaishou": "uni build -p mp-kuaishou", + "build:mp-lark": "uni build -p mp-lark", + "build:mp-qq": "uni build -p mp-qq", + "build:mp-toutiao": "uni build -p mp-toutiao", + "build:mp-weixin": "uni build -p mp-weixin", + "build:mp-xhs": "uni build -p mp-xhs", + "build:quickapp-webview": "uni build -p quickapp-webview", + "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei", + "build:quickapp-webview-union": "uni build -p quickapp-webview-union", + "type-check": "vue-tsc --noEmit", + "openapi-ts-request": "openapi-ts", + "prepare": "git init && husky", + "lint": "eslint", + "lint:fix": "eslint --fix" + }, + "dependencies": { + "@alova/adapter-uniapp": "^2.0.14", + "@alova/shared": "^1.3.1", + "@dcloudio/uni-app": "3.0.0-4060620250520001", + "@dcloudio/uni-app-harmony": "3.0.0-4060620250520001", + "@dcloudio/uni-app-plus": "3.0.0-4060620250520001", + "@dcloudio/uni-components": "3.0.0-4060620250520001", + "@dcloudio/uni-h5": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-alipay": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-baidu": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-harmony": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-jd": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-kuaishou": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-lark": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-qq": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-toutiao": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-weixin": "3.0.0-4060620250520001", + "@dcloudio/uni-mp-xhs": "3.0.0-4060620250520001", + "@dcloudio/uni-quickapp-webview": "3.0.0-4060620250520001", + "@tanstack/vue-query": "^5.62.16", + "abortcontroller-polyfill": "^1.7.8", + "alova": "^3.3.3", + "dayjs": "1.11.10", + "js-cookie": "^3.0.5", + "pinia": "2.0.36", + "pinia-plugin-persistedstate": "3.2.1", + "vue": "^3.4.21", + "wot-design-uni": "^1.9.1", + "z-paging": "2.8.7" + }, + "devDependencies": { + "@alova/wormhole": "^1.0.8", + "@antfu/eslint-config": "^4.15.0", + "@commitlint/cli": "^19.8.1", + "@commitlint/config-conventional": "^19.8.1", + "@dcloudio/types": "^3.4.8", + "@dcloudio/uni-automator": "3.0.0-4060620250520001", + "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001", + "@dcloudio/uni-stacktracey": "3.0.0-4060620250520001", + "@dcloudio/uni-uts-v1": "3.0.0-4060620250520001", + "@dcloudio/vite-plugin-uni": "3.0.0-4060620250520001", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@iconify-json/carbon": "^1.2.4", + "@rollup/rollup-darwin-x64": "^4.28.0", + "@types/node": "^20.17.9", + "@types/wechat-miniprogram": "^3.4.8", + "@uni-helper/eslint-config": "^0.4.0", + "@uni-helper/uni-types": "1.0.0-alpha.3", + "@uni-helper/unocss-preset-uni": "^0.2.11", + "@uni-helper/vite-plugin-uni-components": "0.2.0", + "@uni-helper/vite-plugin-uni-layouts": "0.1.10", + "@uni-helper/vite-plugin-uni-manifest": "0.2.8", + "@uni-helper/vite-plugin-uni-pages": "0.2.28", + "@uni-helper/vite-plugin-uni-platform": "0.0.4", + "@uni-ku/bundle-optimizer": "^1.3.3", + "@unocss/eslint-plugin": "^66.2.3", + "@unocss/preset-legacy-compat": "^0.59.4", + "@vue/runtime-core": "^3.4.21", + "@vue/tsconfig": "^0.1.3", + "autoprefixer": "^10.4.20", + "eslint": "^9.29.0", + "eslint-plugin-format": "^1.0.1", + "husky": "^9.1.7", + "lint-staged": "^15.2.10", + "openapi-ts-request": "^1.1.2", + "postcss": "^8.4.49", + "postcss-html": "^1.7.0", + "postcss-scss": "^4.0.9", + "rollup-plugin-visualizer": "^5.12.0", + "sass": "1.77.8", + "typescript": "^5.7.2", + "unocss": "65.4.2", + "unplugin-auto-import": "^0.17.8", + "vite": "5.2.8", + "vite-plugin-restart": "^0.4.2", + "vue-tsc": "^2.2.10" + }, + "resolutions": { + "bin-wrapper": "npm:bin-wrapper-china" + }, + "lint-staged": { + "*": "eslint --fix" + } +} diff --git a/main/manager-mobile/pnpm-lock.yaml b/main/manager-mobile/pnpm-lock.yaml index c18c0131..9faf80cd 100644 --- a/main/manager-mobile/pnpm-lock.yaml +++ b/main/manager-mobile/pnpm-lock.yaml @@ -240,8 +240,6 @@ importers: specifier: ^2.2.10 version: 2.2.10(typescript@5.7.2) - src/uni_modules/uni-wifi: {} - packages: '@alova/adapter-uniapp@2.0.14': @@ -1298,7 +1296,6 @@ packages: '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} - cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.24.2': @@ -1316,7 +1313,6 @@ packages: '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} - cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.24.2': @@ -2207,7 +2203,6 @@ packages: '@rollup/rollup-darwin-x64@4.41.1': resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} - cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.41.1': diff --git a/main/manager-mobile/src/manifest.json b/main/manager-mobile/src/manifest.json new file mode 100644 index 00000000..67225dc8 --- /dev/null +++ b/main/manager-mobile/src/manifest.json @@ -0,0 +1,124 @@ +{ + "name": "小智", + "appid": "__UNI__36A515E", + "description": "", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + "app-plus": { + "usingComponents": true, + "nvueStyleCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "modules": {}, + "distribute": { + "android": { + "permissions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "minSdkVersion": 30, + "targetSdkVersion": 30, + "abiFilters": [ + "armeabi-v7a", + "arm64-v8a" + ] + }, + "ios": {}, + "sdkConfigs": {}, + "icons": { + "android": { + "hdpi": "unpackage/res/icons/72x72.png", + "xhdpi": "unpackage/res/icons/96x96.png", + "xxhdpi": "unpackage/res/icons/144x144.png", + "xxxhdpi": "unpackage/res/icons/192x192.png" + }, + "ios": { + "appstore": "unpackage/res/icons/1024x1024.png", + "ipad": { + "app": "unpackage/res/icons/76x76.png", + "app@2x": "unpackage/res/icons/152x152.png", + "notification": "unpackage/res/icons/20x20.png", + "notification@2x": "unpackage/res/icons/40x40.png", + "proapp@2x": "unpackage/res/icons/167x167.png", + "settings": "unpackage/res/icons/29x29.png", + "settings@2x": "unpackage/res/icons/58x58.png", + "spotlight": "unpackage/res/icons/40x40.png", + "spotlight@2x": "unpackage/res/icons/80x80.png" + }, + "iphone": { + "app@2x": "unpackage/res/icons/120x120.png", + "app@3x": "unpackage/res/icons/180x180.png", + "notification@2x": "unpackage/res/icons/40x40.png", + "notification@3x": "unpackage/res/icons/60x60.png", + "settings@2x": "unpackage/res/icons/58x58.png", + "settings@3x": "unpackage/res/icons/87x87.png", + "spotlight@2x": "unpackage/res/icons/80x80.png", + "spotlight@3x": "unpackage/res/icons/120x120.png" + } + } + } + }, + "compatible": { + "ignoreVersion": true + } + }, + "quickapp": {}, + "mp-weixin": { + "appid": "wxa2abb91f64032a2b", + "setting": { + "urlCheck": false, + "es6": true, + "minified": true + }, + "usingComponents": true, + "optimization": { + "subPackages": true + }, + "permission": { + "scope.userLocation": { + "desc": "WiFi配网功能需要获取位置权限" + } + }, + "requiredPrivateInfos": [ + "getLocation" + ] + }, + "mp-alipay": { + "usingComponents": true, + "styleIsolation": "shared" + }, + "mp-baidu": { + "usingComponents": true + }, + "mp-toutiao": { + "usingComponents": true + }, + "uniStatistics": { + "enable": false + }, + "vueVersion": "3", + "h5": { + "router": {} + } +} \ No newline at end of file diff --git a/main/manager-mobile/src/pages.json b/main/manager-mobile/src/pages.json new file mode 100644 index 00000000..5ddd6f53 --- /dev/null +++ b/main/manager-mobile/src/pages.json @@ -0,0 +1,158 @@ +{ + "globalStyle": { + "navigationStyle": "default", + "navigationBarTitleText": "小智", + "navigationBarBackgroundColor": "#f8f8f8", + "navigationBarTextStyle": "black", + "backgroundColor": "#FFFFFF" + }, + "easycom": { + "autoscan": true, + "custom": { + "^fg-(.*)": "@/components/fg-$1/fg-$1.vue", + "^wd-(.*)": "wot-design-uni/components/wd-$1/wd-$1.vue", + "^(?!z-paging-refresh|z-paging-load-more)z-paging(.*)": "z-paging/components/z-paging$1/z-paging$1.vue" + } + }, + "tabBar": { + "custom": false, + "color": "#e6e6e6", + "selectedColor": "#667dea", + "backgroundColor": "#fff", + "borderStyle": "black", + "height": "50px", + "fontSize": "10px", + "iconWidth": "24px", + "spacing": "3px", + "list": [ + { + "iconPath": "static/tabbar/robot.png", + "selectedIconPath": "static/tabbar/robot_activate.png", + "pagePath": "pages/index/index", + "text": "首页", + "icon": "home", + "iconType": "uiLib" + }, + { + "iconPath": "static/tabbar/network.png", + "selectedIconPath": "static/tabbar/network_activate.png", + "pagePath": "pages/device-config/index", + "text": "配网", + "icon": "i-carbon-network-3", + "iconType": "uiLib" + }, + { + "iconPath": "static/tabbar/system.png", + "selectedIconPath": "static/tabbar/system_activate.png", + "pagePath": "pages/settings/index", + "text": "系统", + "icon": "i-carbon-settings", + "iconType": "uiLib" + } + ] + }, + "pages": [ + { + "path": "pages/index/index", + "type": "home", + "layout": "tabbar", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "首页" + } + }, + { + "path": "pages/agent/edit", + "type": "page" + }, + { + "path": "pages/agent/index", + "type": "page", + "layout": "default", + "style": { + "navigationBarTitleText": "智能体", + "navigationStyle": "custom" + } + }, + { + "path": "pages/agent/tools", + "type": "page", + "layout": "default", + "style": { + "navigationBarTitleText": "编辑功能", + "navigationStyle": "custom" + } + }, + { + "path": "pages/chat-history/detail", + "type": "page", + "layout": "default", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "聊天详情" + } + }, + { + "path": "pages/chat-history/index", + "type": "page" + }, + { + "path": "pages/device/index", + "type": "page" + }, + { + "path": "pages/device-config/index", + "type": "page", + "style": { + "navigationBarTitleText": "设备配网", + "navigationStyle": "custom" + } + }, + { + "path": "pages/login/index", + "type": "page", + "layout": "default", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "登陆" + } + }, + { + "path": "pages/register/index", + "type": "page", + "layout": "default", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "注册" + } + }, + { + "path": "pages/settings/index", + "type": "page", + "layout": "default", + "style": { + "navigationBarTitleText": "设置", + "navigationStyle": "custom" + } + }, + { + "path": "pages/voiceprint/index", + "type": "page" + } + ], + "subPackages": [ + { + "root": "pages-sub", + "pages": [ + { + "path": "demo/index", + "type": "page", + "layout": "default", + "style": { + "navigationBarTitleText": "分包页面" + } + } + ] + } + ] +} diff --git a/main/manager-mobile/src/pages/settings/index.vue b/main/manager-mobile/src/pages/settings/index.vue index 948d4e66..c64ba4a6 100644 --- a/main/manager-mobile/src/pages/settings/index.vue +++ b/main/manager-mobile/src/pages/settings/index.vue @@ -12,6 +12,7 @@ import { computed, onMounted, reactive, ref } from 'vue' import { useToast } from 'wot-design-uni' import { clearServerBaseUrlOverride, getEnvBaseUrl, getServerBaseUrlOverride, setServerBaseUrlOverride } from '@/utils' +import { isMp } from '@/utils/platform' defineOptions({ name: 'SettingsPage', @@ -171,7 +172,10 @@ function showAbout() { } onMounted(async () => { - loadServerBaseUrl() + // 仅在非小程序环境加载服务端地址设置 + if (!isMp) { + loadServerBaseUrl() + } getCacheInfo() }) @@ -181,8 +185,8 @@ onMounted(async () => { - - + + 网络设置 diff --git a/main/manager-mobile/src/utils/request.ts b/main/manager-mobile/src/utils/request.ts deleted file mode 100644 index 8b169257..00000000 --- a/main/manager-mobile/src/utils/request.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { CustomRequestOptions } from '@/http/interceptor' - -/** - * 请求方法: 主要是对 uni.request 的封装,去适配 openapi-ts-request 的 request 方法 - * @param options 请求参数 - * @returns 返回 Promise 对象 - */ -function http(options: CustomRequestOptions) { - // 1. 返回 Promise 对象 - return new Promise((resolve, reject) => { - uni.request({ - ...options, - dataType: 'json', - // #ifndef MP-WEIXIN - responseType: 'json', - // #endif - // 响应成功 - success(res) { - // 状态码 2xx,参考 axios 的设计 - if (res.statusCode >= 200 && res.statusCode < 300) { - // 2.1 提取核心数据 res.data - resolve(res.data as T) - } - else if (res.statusCode === 401) { - // 401错误 -> 清理用户信息,跳转到登录页 - // userStore.clearUserInfo() - // uni.navigateTo({ url: '/pages/login/login' }) - reject(res) - } - else { - // 其他错误 -> 根据后端错误信息轻提示 - !options.hideErrorToast - && uni.showToast({ - icon: 'none', - title: (res.data as T & { msg?: string })?.msg || '请求错误', - }) - reject(res) - } - }, - // 响应失败 - fail(err) { - uni.showToast({ - icon: 'none', - title: '网络错误,换个网络试试', - }) - reject(err) - }, - }) - }) -} - -/* - * openapi-ts-request 工具的 request 跨客户端适配方法 - */ -export default function request( - url: string, - options: Omit & { - params?: Record - headers?: Record - }, -) { - const requestOptions = { - url, - ...options, - } - - if (options.params) { - requestOptions.query = requestOptions.params - delete requestOptions.params - } - - if (options.headers) { - requestOptions.header = options.headers - delete requestOptions.headers - } - - return http(requestOptions) -} diff --git a/main/manager-mobile/tsconfig.json b/main/manager-mobile/tsconfig.json new file mode 100644 index 00000000..22a48c5d --- /dev/null +++ b/main/manager-mobile/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "composite": true, + "lib": ["esnext", "dom"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "Node", + "paths": { + "@/*": ["./src/*"], + "@img/*": ["./src/static/*"] + }, + "resolveJsonModule": true, + "types": [ + "@dcloudio/types", + "@uni-helper/uni-types", + "@types/wechat-miniprogram", + "wot-design-uni/global.d.ts", + "z-paging/types", + "./src/typings.d.ts" + ], + "allowJs": true, + "noImplicitThis": true, + "outDir": "dist", + "sourceMap": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + }, + "vueCompilerOptions": { + "plugins": ["@uni-helper/uni-types/volar-plugin"] + }, + "include": [ + "src/**/*.ts", + "src/**/*.js", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.jsx", + "src/**/*.vue", + "src/**/*.json" + ], + "exclude": ["node_modules"] +}