# uniapp-frame **Repository Path**: wanchuang_software/uniapp-frame ## Basic Information - **Project Name**: uniapp-frame - **Description**: 基于vue3+ts+uview-pro+webscoket搭建的uniapp开发框架 - **Primary Language**: TypeScript - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 3 - **Created**: 2026-06-26 - **Last Updated**: 2026-07-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于vue3+ts+uview-pro+webscoket搭建的uniapp开发框架(更新完善中...) ## 安装依赖 ```javascript npm install node 版本号 22.20.00 ``` ## 相关文档 api文档:[uniapp](https://uniapp.dcloud.net.cn/)、[uview-pro](https://uviewpro.cn/zh/guide/intro.html)、[z-paging](https://z-paging.zxlee.cn/)、[day.js](https://dayjs.fenxianglu.cn/)、[uni-app 路由管理](https://mengxi-studio.github.io/uni-router/)、[Pinia 持久化插件](https://socket.dev/npm/package/@rdeam/pinia-plugin-uni-persist-next) ## 目录结构 ```javascript |-api //接口相关文件 |-components //自定义组件 |-config //配置文件 |-hooks //组合函数文件 |-node_modules //依赖 |-pages //业务页面 |-server //封装的http请求 |-static //静态资源 |-store //全局内存 |-unpackage //运行包忽略 |-.gitignore //git配置文件 |-App.vue //应用根组件 |-index.html //网页入口模板-不需要任何操作 |-main.js //入口文件 |-manifest.json //应用配置文件 |-package.json //项目依赖清单 |-package-lock.json //依赖版本锁文件 |-pages.json //页面路由配置 |-tsconfig.json //TypeScript 配置 |-uni.promisify.adaptor.js //uni-app 适配器(vue3适配uniapp) |-uni.scss //全局样式变量 |-README.md ``` ## 代码使用 - request请求方式,在api目录下创建 ***.ts文件,并引入http方法,可用的http请求方法有 post、get、delete、put ```javascript import { http } from 'uview-pro'; export const 接口名称= (data: any) => http.get('接口地址', data) export const 接口名称= (data: any) => http.post('接口地址', data) export const 接口名称= (data: any) => http.delete('接口地址', data) export const 接口名称= (data: any) => http.put('接口地址', data) ``` - request请求中去除默认的loading和toast ```javascript import { http } from 'uview-pro'; export const 接口名称= (data: any) => http.get('接口地址', data, {meta: { toast: false, loading: false }}) ``` - webscoke使用 ```javascript import { watch } from 'vue'; import { useWebSocket } from '@/hooks/useWebSocket' const userStore = useUserStore() const { reconnect, initWS, isConnected, send, onMessage, close, lastMessage } = useWebSocket() initWS() //初始化webscoket并开启 close() //关闭webscoket lastMessage //心跳数据 watch(lastMessage, (newVal) => { if (newVal) { console.log('消息更新了:', newVal) // 追加到列表中 // messages.value.push(newVal) } }) ``` - 使用Pinia + 持久化@rdeam/pinia-plugin-uni-persist-next插件,实现自动store持久化存储 ```javascript import { useUserStore } from '@/store'; import { storeToRefs } from 'pinia' const userStore = useUserStore() // 使用 storeToRefs 保持响应式 const { token, isLoggedIn } = storeToRefs(userStore) userStore.setToken('your_jwt_token_here') ``` 核心配置选项详解 | 选项 | 类型 | 默认值 | 说明 | | -------- | -------- | --------| -------- | | enabled | boolean | false | 是否开启持久化 | | async | boolean| true | 是否使用异步写入(默认异步,性能更好) | | strategies| PersistStrategy[]| [{ key: store.$id }]| 存储策略数组 | | beforeRestore| (ctx) => void| undefined | 恢复数据前的钩子函数 | | afterRestore| (ctx) => void| undefined | 恢复数据后的钩子函数 | strategies 中每个策略的配置 | 选项 | 类型 | 说明 | | -------- | --------| -------- | | key| string | 本地存储的 key 名称 | | paths| string[]| 需要持久化的顶层字段列表 | async| boolean | 覆盖全局的 async 设置 | - z-paging分页组件基本使用(vue3) 更多可查看官网[z-paging](https://z-paging.zxlee.cn/) ```html ``` ```javascript import { ref } from 'vue'; const paging = ref(null) const dataList = ref([]) const queryList = (pageNo, pageSize) => { // 这里的pageNo和pageSize会自动计算好,直接传给服务器即可 // 这里的请求只是演示,请替换成自己的项目的网络请求,并在网络请求回调中通过paging.value.complete(请求回来的数组)将请求结果传给z-paging request.queryList({ pageNo,pageSize }).then(res => { // 请勿在网络请求回调中给dataList赋值!!只需要调用complete就可以了 paging.value.complete(res.data.list); }).catch(res => { // 如果请求失败写paging.value.complete(false),会自动展示错误页面 // 注意,每次都需要在catch中写这句话很麻烦,z-paging提供了方案可以全局统一处理 // 在底层的网络请求抛出异常时,写uni.$emit('z-paging-error-emit');即可 paging.value.complete(false); }) } ``` - day.js日期格式格式化 简单用法 更多可查看官网[day.js](https://dayjs.fenxianglu.cn/) ```javascript dayjs().format(); // 2020-09-08T13:42:32+08:00 dayjs().format('YYYY-MM-DD'); // 2020-09-08 dayjs().format('YYYY-MM-DD HH:mm:ss'); // 2020-09-08 13:47:12 dayjs(1318781876406).format('YYYY-MM-DD HH:mm:ss'); // 2011-10-17 00:17:56 ``` - uni-app 路由管理基本使用 [uni-app 路由管理](https://mengxi-studio.github.io/uni-router/) ```json // 如何添加路由,按照uniapp正常添加页面,只需要按照创建路由器功能增加需要用的属性 // 因为引入了@meng-xi/vite-plugin组件会自动生成 router.config.ts路由配置文件(不推荐修改)如需修改可直接在pages.json文件修改对应路由 "pages": [ { "path": "pages/index/index", "name": "home", //路由名称 "meta": { "isTab": true, "title": '首页', "requireAuth": true } "style": { "navigationBarTitleText": "uni-app" } }, ] ``` ```html ``` ```javascript import { useRouter } from '@meng-xi/uni-router' const router = useRouter() function goToRouter() { router.push({ name: 'pagesRouterRouter' }) } // 注:在pages.json增加路由后需要重新运行项目才会自动生成路由配置文件 ``` 也可以直接用RouterLink组件 ```html 关于 详情 详情 ``` - 增加正则表达式库 ```javascript import { isMobile, isEmail, maskPhone } from '@/utils/regex' // 表单校验示例 const phone = ref('13812345678') const isValid = isMobile(phone.value) // true // 脱敏显示 const masked = maskPhone(phone.value) // 138\*\*\*\*5678 ``` - 微信小程序检测更新 ```javascript // 在app.vue中使用 import { onLaunch, onShow, onHide, onThemeChange } from '@dcloudio/uni-app'; import { useWebSocket } from '@/hooks/useWebSocket' import { checkUpdate, silentUpdate } from '@/utils/updateManager/update-mp-weixin' const { initWS } = useWebSocket() onLaunch(() => { console.log('App Launch'); // 标准提示更新(非强制) checkUpdate() // 如果需要强制更新,可以传参: // checkUpdate({ force: true, title: '强制更新', content: '修复重要问题' }) // 带回调监听更新状态(例如埋点) // checkUpdate({}, (status) => { // if (status.type === 'check' && status.hasUpdate) { // // 上报:有新版本 // } else if (status.type === 'ready') { // // 上报:下载完成 // } // }) }); onShow(() => { console.log('App Show'); // 从后台切回前台时再次检查(覆盖热启动场景) checkUpdate() // 如果希望某些版本使用静默更新,可以调用: // silentUpdate() }); onHide(() => { console.log('App Hide'); }); onThemeChange(res => { console.log('[App.vue] system theme changed', res); }); ``` ## 组件使用 - 如何在项目中使用components中的组件,在components组件命名方式com-xxx,组件目录是com-xxx/com-xxx,不一定是com开头随意,在uniapp中asycom是默认开启的在引用组件时可简化引入流程 ```html ``` - com-list组件如何使用 ```html ``` ```javascript import { anyapi } from '@/api/anyapi' // 子组件中所需参数 // showAvatar 骨架屏是否展示头像 // showTitle 骨架屏是否显示大标题 // refresherEnabled 是否开启下拉刷新 // method 请求数据所用的方法 // text 缺省页显示的文本 ```