惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
V
V2EX
GbyAI
GbyAI
量子位
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
S
SegmentFault 最新的问题
O
OpenAI News
N
News and Events Feed by Topic
博客园 - Franky
爱范儿
爱范儿
Forbes - Security
Forbes - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V2EX - 技术
V2EX - 技术
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
Cloudbric
Cloudbric
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
Last Week in AI
Last Week in AI
罗磊的独立博客
Spread Privacy
Spread Privacy
Recent Announcements
Recent Announcements
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
The Register - Security
The Register - Security
Y
Y Combinator Blog
J
Java Code Geeks
I
Intezer

Dr34m's Blog

I Expect You To Die(我希望你死) 1,2,3 完整中文攻略 Linux换国内源 && docker安装 && 换加速镜像 Vue3 + Element-Plus 极简速查 随笔 pyinstaller打包的程序执行报错Failed to extract xxxx decompression resulted in return code -1 taoSync排除项简易教程 apscheduler的cron配置项 如何在绿联NAS中使用TaoSync同步我的文件到各个网盘 GB28181抓包记录 JS计算字节大小,把字节转换为KB/MB/GB/TB等 在Python中使用onvif管理摄像头,包括设备发现,获取RTSP地址,获取设备信息,截图,云台控制与缩放,设置时间 编写bat脚本实现对vue项目构建并压缩 内网穿透工具frp快速使用 CentOS 7.9 安装基础开发环境jdk redis nacos nginx mysql Pyinstaller 逆向 VUE实现复制与粘贴_获取剪切板内容 Electron + xterm.js + node-pty + vue 实现本地终端 child_process exec 中文乱码 Windows&Linux 解决方法 yum 更新 gcc CentOS安装并使用conda 将fluid主题博客的静态资源由第三方改为本地存储 python批量转化doc到docx SpringBoot单元测试注入空指针 TensorFlow 预测出现NaN的一种可能以及解决方法 随笔 python归一化数据 windows下python安装sasl遇到的问题及解决 将对象List中的某个字段放到新的List中[转载] Python http.server 本地服务支持跨域 TensorFlow入门 Flink学习笔记 windows本地配置spark开发环境 dataX使用 Apache Hive 学习笔记 hadoop学习笔记 element-ui 自带事件添加自定义参数 windows 11安装安卓应用程序 centos7安装zookeeper centos7安装jdk8 用idea开发spring项目过程中热重启 docker学习笔记 CentOS7安装k8s集群 通过Github Actions部署静态网站到腾讯云COS,并自动刷新CDN 用Typora编写Hexo博客时图片的处理 Hexo + Github Actions 提交代码自动部署 云服务器 腾讯云COS github-pages 常用的Linux进程基本命令 python实现微信jsapi签名 VsCode开发Python常用配置 mysql获取当期日期是该年第几周 LocalDate获取当前周周一日期 删除node_modules重新安装 基于firewalld端口转发 pip 安装 tensorflow MemoryError Java过滤html标签 mysql清空表,并让自增从0开始 JavaScript获取当前周或下n周的周n的日期 java复制不同实体类中相同的字段 前端下载二进制文件 mysql获取最近一段时间数据 python - pip换源 svn提交后jenkins自动部署 常见nginx反向代理配置 h5实现一种自动滚动的告警列表 nginx代理网站子目录到本地目录 centos下hexo + svn + jenkins实现博客自动部署 centos中jenkins配置环境变量 centos安装jenkins centos安装svn服务器 Ubuntu 20.04 换国内源 Vs Code编写md文件实现实时预览 Python自动处理依赖 海滨校园助手api使用文档 hexo-yilia主题相册 Java实现文件重命名,Java文件追加写入,java读取图片尺寸 Hexo安装配置并托管至github 新起点,新征程 在ubuntu安装jdk并配置环境变量 一个不到300行的C语言消灭敌机游戏 搭建L(Linux)+A(Apache)+M(MySQL)+P(PHP)网站环境,并安装Discuz 搭建L(Linux)+N(Nginx)+M(MySQL)+P(PHP)网站环境,并安装Wordpress NSA工具包验证之RDP漏洞利用 NSA工具包验证之IIS6.0漏洞利用 NSA工具包验证之SMB漏洞利用 SEO Ultimate 7.6.5.9汉化版(中文版)免费下载 在腾讯云服务器搭建FBCTF平台 FBCTF汉化简体中文免费下载,FBCTF更新缓存代码 wordpress发送邮件设置以及常见问题解决 短网址 一个小白的自学建站史(菜鸟建站入门) 危山 水调歌头 水调歌头
一个上手即用的通用公众号/小程序/h5/app框架
Dr3@m · 2022-06-10 · via Dr34m's Blog

源码地址:https://github.com/dr34m-cn/uniapp-demo

框架后期或有更新,请以源码中README.md文档为准

本通用框架基于uniappuView UI 2.0.31,封装了日常开发中最常用的接口请求、数据中心、环境配置等操作,上手即用。

1. 运维

1.1 构建

1
2
3
4
5
6
7
8
# H5 生产
npm run build

# H5 dev
npm run build:dev

# 微信小程序
npm run build:mp-weixin

其他平台构建,例如快应用、支付宝小程序等详见uniapp官方文档

1.2 H5修改前缀

修改/src/manifest.json,例如修改前缀为/h5如下

1
2
3
4
5
6
"h5" : {
"title" : "标题",
"router" : {
"base" : "/h5/"
}
}

更多配置详见uniapp官方文档

1.3 配置文件

配置文件在/src/config/index.js

2. 开发

2.1 启动

1
2
3
4
5
# 安装依赖
npm install

# 运行
npm run serve

其他平台运行,例如快应用、支付宝小程序等详见uniapp官方文档

2.2 说明

2.2.1 配置

通用配置请放在/src/config/index.js中,例如后端地址。

2.2.2 数据中心

数据中心统一管理需要在全局使用的数据,可以临时存储(h5刷新页面、小程序/app退出等操作数据就会丢失)或者持久化存储。

在这里定义和存储的数据是全局动态响应的,这让您无需繁琐地写监听方法。

配置文件在/src/store/index.js,建议命名为vuex_开头,以便与页面数据区分避免冲突。

2.2.2.1 定义
2.2.2.1.1 临时存储

直接在/src/store/index.js中定义,如下边的vuex_tmp

1
2
3
4
5
6
7
8
9
const store = new Vuex.Store({
state: {
vuex_token: lifeData.vuex_token ? lifeData.vuex_token : null,
vuex_tmp: null
},

...

})

2.2.2.1.2 持久化存储

/src/store/index.js中定义,并写入saveStateKeys中,如下边的vuex_token,定义的时候格式为vuex_token: lifeData.vuex_token ? lifeData.vuex_token : null

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 需要永久存储,且下次APP启动需要取出的,在state中的变量名
let saveStateKeys = ['vuex_token'];

...

const store = new Vuex.Store({
state: {
vuex_token: lifeData.vuex_token ? lifeData.vuex_token : null,
vuex_tmp: null
},

...

})

2.2.2.2 使用
2.2.2.2.1 取值
  • 页面<template>中取值{{ vuex_token }}
  • js代码(包括App.vue页面)<script>中取值this.vuex_token
  • 拦截器等通用组件中(须获取上下文vm)取值vm.vuex_token
2.2.2.2.2 设值

可以设定值的类型为基本数据类型可以进行序列化的对象/列表等

1
2
3
4
5
6
7
8
// 字符串
this.$u.vuex('vuex_token', "xxxxx");
// 对象
this.$u.vuex('vuex_token', {
id: 1,
key: 'token',
value: 'xxxxx'
});

2.2.3 接口

接口基于luch-requestuView对其简单封装,本示例使用的是uView封装后的,对最常用的场景做了说明,更详细的文档见uView的http请求

2.2.3.1 统一拦截器

接口拦截器在/src/utils/request.js中,可以根据需要自行修改;

对于请求:

  • 凡是不以/login开头,且当前已有token的(数据中心vuex_token字段值非null),将自动在请求头header.token存入已有的token值;

对于响应:

  • 响应值response.statusCode200的,将拦截,弹框提示并抛出异常,可在接口catch中捕获;
  • 响应数据存在response.data.code字段的,判断code值:
    • 值为401将拦截并抛出异常,可在接口catch中捕获,建议在拦截器中统一处理;
    • 值非200且非401将拦截,弹框提示并抛出异常,可在接口catch中捕获;
    • 值为200的,将返回response.data,可在接口then中获取;
  • 响应数据不存在response.data.code字段的,将返回response.data,可在接口then中获取。
2.2.3.2 api集中管理

提示:get请求第一个参数是配置,post请求第一个参数是请求值,第二个才是配置

/src/api/目录下新建api.js文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const http = uni.$u.http

// get请求
export const getMenu1 = () => http.get(`/ebapi/public_api/index`)

// get请求
export const getMenu2 = (id) => http.get(`/ebapi/public_api/index/${id}`)

// get请求
export const getMenu3 = (params) => http.get('/ebapi/public_api/index', {params})

// get请求(带header等配置)
export const getMenu4 = (params) => http.get('/ebapi/public_api/index', {
params,
header: {
token: '1111'
}
})

// post请求
export const postMenu = (data) => http.post('/ebapi/public_api/index', data)

// post请求(带header等)
export const postMenu = (data) => http.post('/ebapi/public_api/index', data, {
header: {
token: '1111'
},
responseType: 'arraybuffer'
})

// 更多请求使用
uni.$u.http.get(url[, config])
uni.$u.http.post(url[, data[, config]])
uni.$u.http.delete(url[, data[, config]])
uni.$u.http.put(url[, data[, config]])
uni.$u.http.middleware(config)
uni.$u.http.request(config)
uni.$u.http.upload(url[, config])
uni.$u.http.head(url[, data[, config]])
uni.$u.http.connect(url[, data[, config]])
uni.$u.http.options(url[, data[, config]])
uni.$u.http.trace(url[, data[, config]])

2.2.3.3 api使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import {
getMenu2,
getMenu3
} from '@/api/api.js';

getMenu2(1).then(res => {
// 经过拦截器的处理,进入到这里的请求都是成功请求,无需考虑请求失败的情况
console.log('res',res)
}).catch(err=>{
// 多数情况下,不需要写catch,因为拦截器已经进行了弹窗提示等操作
// 但当页面需要对错误进行处理时(例如关闭加载动画,取消按钮loading等),就需要在catch中操作
console.log('err',err)
})

getMenu3({
id: 1
}).then(
...
).catch(
...
)

postMenu({
id: 1
}).then(
...
).catch(
...
)

2.2.4 全局过滤器

2.2.4.1 定义

全局过滤器定义在/src/utils/filters.js中,可参照其增加自己的过滤规则,常用定义方式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 0-男,1-女
const sexFilter = (value) => {
let sexList = ['男', '女'];
return sexList[value] ? sexList[value] : "--";
}

// xx-小学及以下,cz-初中,gz-高中及以上
const educationFilter = (value) => {
switch (value) {
case 'xx':
return '小学及以下';
case 'cz':
return '初中';
case 'gz':
return '高中及以上';
default:
return '--';
}
}

export default {
sexFilter,
educationFilter
}

2.2.4.2 使用

因为已经在main.js中定义如下

1
2
import filters from '@/utils/filters';
Object.keys(filters).forEach(k => Vue.filter(k, filters[k]));

所以页面中无需引入,如下直接使用

1
<view>过滤器-性别:{{ sex | sexFilter }}</view>

效果:当sex0,页面输出;当sex1,页面输出

参考 uViewuniapp