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

推荐订阅源

Schneier on Security
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
Latest news
Latest news
S
Schneier on Security
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
Spread Privacy
Spread Privacy
Cisco Talos Blog
Cisco Talos Blog
T
Troy Hunt's Blog
S
Secure Thoughts
C
Cisco Blogs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
O
OpenAI News
L
LINUX DO - 最新话题
T
Threat Research - Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园_首页
月光博客
月光博客
博客园 - 【当耐特】
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
D
DataBreaches.Net
美团技术团队
B
Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
有赞技术团队
有赞技术团队
D
Docker
Jina AI
Jina AI
The GitHub Blog
The GitHub Blog
H
Hacker News: Front Page
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
AI
AI
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
小众软件
小众软件

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