提交 9cbde977 编写于 作者: VK1688's avatar VK1688

1.16.2

上级 5d797e1f
## 1.16.2(2023-06-01)
* 1、【升级】`vk-unicloud-admin-ui` 包升级至 `1.16.15`
* 2、【修复】`缓存管理` 页面添加缓存后,`vk.globalDataCache.get(key);` 无法获取到数据的问题(需要手动替换目录`router/service/admin/system_uni/global-data/`
* 3、【优化】`素材管理` 上传素材时的进度条样式
* 4、【优化】`万能表格` 新增 `needAlert` 属性,设为false可以取消默认的错误弹窗(默认为true)
##### 框架更新步骤 [点击查看](https://vkdoc.fsq.pub/admin/1/update.html)
##### 框架学习Q群:`22466457` 欢迎萌新和大佬来使用和共同改进框架
##### 如果你觉得框架对你有用,可以在下方进行评论或赞赏。
## 1.16.1(2023-05-17)
* 1、【升级】`vk-unicloud-admin-ui` 包升级至 `1.16.9`
* 2、【优化】`万能表格` 右侧按钮支持属性 icon、plain、round、circle、loading
......
* 1、【升级】`vk-unicloud-admin-ui` 包升级至 `1.16.12`
* 2、【优化】`素材管理` 上传素材时的进度条样式
* 1、【升级】`vk-unicloud-admin-ui` 包升级至 `1.16.15`
* 2、【修复】`缓存管理` 页面添加缓存后,`vk.globalDataCache.get(key);` 无法获取到数据的问题(需要手动替换目录`router/service/admin/system_uni/global-data/`
* 3、【优化】`素材管理` 上传素材时的进度条样式
* 4、【优化】`万能表格` 新增 `needAlert` 属性,设为false可以取消默认的错误弹窗(默认为true)
##### 框架更新步骤 [点击查看](https://vkdoc.fsq.pub/admin/1/update.html)
......
......@@ -104,9 +104,9 @@
}
},
"vk-unicloud-admin-ui": {
"version": "1.16.12",
"resolved": "https://registry.npmjs.org/vk-unicloud-admin-ui/-/vk-unicloud-admin-ui-1.16.12.tgz",
"integrity": "sha512-bcseNjlZMrzs1fnji/KRiZVyshB46KaTIO/f5aLm26LUSXU4K7ulIrSPPEnhTtQYWpNto1F4G0XEBRVVB/9iyA=="
"version": "1.16.15",
"resolved": "https://registry.npmjs.org/vk-unicloud-admin-ui/-/vk-unicloud-admin-ui-1.16.15.tgz",
"integrity": "sha512-b+r7xWiUbpc8VJ1Rf6cbYPrQH7xpUEr2Ntn1373gHHgKL4fpsEjGPaFGDucyLJcmoSY6ka/9FuXF/qIPd19RLA=="
},
"vuedraggable": {
"version": "2.24.3",
......
{
"id": "vk-unicloud-admin",
"name": "vk-unicloud-admin",
"version": "1.16.1",
"version": "1.16.2",
"displayName": "【开箱即用】vk-unicloud-admin-快速开发框架-打造unicloud最好用的admin",
"description": "vk-unicloud-admin是基于uniapp+unicloud+uni-id+vk-router+element的一套快速PC admin企业级开发框架。小白几分钟即完成一个页面CRUD。",
"keywords": [
......@@ -22,7 +22,7 @@
"dependencies": {
"element-ui": "2.15.13",
"umy-ui": "1.1.6",
"vk-unicloud-admin-ui": "^1.16.12"
"vk-unicloud-admin-ui": "^1.16.15"
},
"engines": {
"HBuilderX": "^3.1.10"
......
......@@ -45,6 +45,7 @@
{ "path": "form/form-array-object" },
{ "path": "form/form-basic" },
{ "path": "form/form-cert" , "style": { "topWindow": false,"leftWindow": false } },
{ "path": "form/form-pay-cert" , "style": { "topWindow": false,"leftWindow": false } },
{ "path": "form/form-inline" },
{ "path": "form/form-dialog" },
{ "path": "form/form-pro" },
......
......@@ -111,14 +111,15 @@ export default {
action: "",
// 表单字段显示规则
columns: [
{ key: "key", title: "健名", type: "text", placeholder: "请输入健名" },
{ key: "value", title: "健值", type: "json", placeholder: "请输入健值" },
{ key: "key", title: "键名", type: "text", placeholder: "请输入键名", disabled:["update"], tips: "键名唯一,且不能修改" },
{ key: "value", title: "键值", type: "json", placeholder: "请输入键值" },
{ key: "expired_at", title: "过期时间", type: "date", dateType: "datetime", placeholder: "请选择过期时间", tips: "若不设置过期时间则代表永不过期" },
{ key: "comment", title: "备注", type: "textarea", placeholder: "请输入备注" }
],
// 表单验证规则
rules: {
key: [{ required: true, message: "名不能为空", trigger: "blur" }],
value: [{ required: true, message: "值不能为空", trigger: "change" }]
key: [{ required: true, message: "名不能为空", trigger: "blur" }],
value: [{ required: true, message: "值不能为空", trigger: "change" }]
},
// add 代表添加 update 代表修改
formType: "",
......
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="证书转换"
subTitle="快速将证书内容变成1行字符串"
></vk-data-page-header>
<view class="page-body" style="width: 100%">
<view style="color: red;font-size: 12px;">全程无网络请求(打开此页面后无网状态也能执行),直接在前端解析证书,没有证书泄露风险</view>
<el-table :data="certList" style="width: 100%">
<el-table-column prop="tips" label="说明" minWidth="300"> </el-table-column>
<el-table-column prop="name" label="选择证书" minWidth="300">
<template slot-scope="scope">
<text style="margin-right: 20px;">{{ scope.row.name }}</text>
<el-button type="success" @click="upload(scope.row)" size="mini" plain> {{ scope.row.content ? '' : ''}}选择 {{ scope.row.file }} </el-button>
<text style="margin-left: 20px;color: #c2e7b0;" v-if="scope.row.content && scope.row.file === scope.row.name"></text>
<text style="margin-left: 20px;color: red;" v-if="scope.row.content && scope.row.file !== scope.row.name"> × </text>
</template>
</el-table-column>
<el-table-column prop="key4" label="选择后可复制" minWidth="200" >
<template slot-scope="scope">
<el-button type="success" @click="copy(scope.row.name)" size="mini" plain v-if="scope.row.content && scope.row.file === scope.row.name"> 复制 </el-button>
</template>
</el-table-column>
</el-table>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1">
<view style="font-size: 14px;">证书内容</view>
<pre>
{{ form1 }}
</pre>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
certList: [
{
name: 'apiclient_cert.p12',
tips: '微信支付v2需要用到的证书(wxpay.pfx)的值',
file: '',
content: '',
key: 'wxpay.pfx'
},
{
name: 'apiclient_cert.pem',
tips: '微信支付v3需要用到的证书(wxpay.appCertContent)的值',
file: '',
content: '',
key: 'wxpay.appCertContent'
},
{
name: 'apiclient_key.pem',
tips: '微信支付v3需要用到的证书(wxpay.appPrivateKeyContent)的值',
file: '',
content: '',
key: 'wxpay.appPrivateKeyContent'
},
{
name: 'alipayCertPublicKey_RSA2.crt',
tips: '支付宝支付 - 支付宝公钥证书(alipay.alipayPublicCertContent)的值',
file: '',
content: '',
key: 'alipay.alipayPublicCertContent'
},
{
name: 'alipayRootCert.crt',
tips: '支付宝支付 - 支付宝根证书(alipay.alipayRootCertContent)的值',
file: '',
content: '',
key: 'alipay.alipayRootCertContent'
},
{
name: 'appCertPublicKey.crt',
tips: '支付宝支付 - 应用公钥证书(alipay.appCertContent)的值',
file: '',
content: '',
key: 'alipay.appCertContent'
}
],
// 表单相关开始-----------------------------------------------------------
form1: {
wxpay: {
pfx: "",
appCertContent: "",
appPrivateKeyContent: "",
},
alipay: {
alipayPublicCertContent: "",
alipayRootCertContent: "",
appCertContent: ""
}
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
upload(item={}){
let { name, key } = item;
let index = this.certList.findIndex((certItem) => {
return name === certItem.name;
});
let suffix = name.substring(name.lastIndexOf(".") + 1);
uni.chooseFile({
count: 1, //默认100
extension: [suffix],
success: (res) => {
let tempFile = res.tempFiles[0];
if (name === "apiclient_cert.p12") {
vk.pubfn.fileToBase64({
file: tempFile,
success: (base64) => {
let base64Index = base64.indexOf("base64,");
base64 = base64.substring(base64Index+"base64,".length);
this.form1.wxpay.pfx = base64;
this.certList[index].content = base64;
this.certList[index].file = tempFile.name;
}
});
} else {
const reader = new FileReader();
reader.onload = () => {
let result = reader.result;
result = result.replace(/\r\n/g, "\n");
vk.pubfn.setData(this.form1, key, result);
this.certList[index].content = result;
};
reader.readAsText(res.tempFiles[0]);
if (tempFile.name.indexOf("appCertPublicKey_") == 0) {
tempFile.name = "appCertPublicKey.crt";
}
this.certList[index].file = tempFile.name;
}
}
});
},
copy(name){
let contentItem = this.certList.find((item) => {
return name === item.name;
});
let content = contentItem.content;
uni.setClipboardData({
data: content,
success: () => {
vk.toast("复制成功");
}
});
}
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 定义不需要永久存储的目录,即下次APP启动数据会自动清空,值为在modules目录下的文件名
let notSaveStateKeys = ['$error'];
let lifeData = uni.getStorageSync('lifeData') || {};
/* 以下代码请勿改动,除非你知道改动带来的效果 */
const modulesFiles = require.context('./modules', true, /\.js$/);
const modulesTemp = {};
let lifeData = uni.getStorageSync('lifeData') || {};
// #ifdef VUE2
const modulesFiles = require.context('./modules', true, /\.js$/);
modulesFiles.keys().map((modulePath, index) => {
let moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
if(notSaveStateKeys.indexOf(moduleName) === -1) {
if(!lifeData[moduleName]) lifeData[moduleName] = {};
}
modulesTemp[moduleName] = modulesFiles(modulePath).default;
});
// #endif
// #ifdef VUE3
const modulesFiles = import.meta.globEager('./modules/**/*.js');
for (const modulePath in modulesFiles) {
const moduleName = modulePath.replace(/^\.\/modules\/(.*)\.\w+$/, '$1')
modulesTemp[moduleName] = modulesFiles[modulePath].default;
}
// #endif
const modules = {};
for (let moduleName in modulesTemp) {
const moduleItem = modulesTemp[moduleName];
if (moduleItem && moduleItem.namespaced) {
let moduleNameArr = moduleName.split("/");
let lastName = moduleNameArr[moduleNameArr.length - 1];
if (lastName === "index") {
moduleName = moduleName.replace(/\/index$/, '');
}
modules[moduleName] = moduleItem;
}
}
for (let moduleName in modules) {
if (notSaveStateKeys.indexOf(moduleName) === -1) {
if (!lifeData[moduleName]) lifeData[moduleName] = {};
}
}
uni.setStorageSync('lifeData', lifeData);
// 保存变量到本地存储中
const saveLifeData = function(key, value){
const saveLifeData = function(key, value) {
// 判断变量名是否在需要存储的数组中
if(notSaveStateKeys.indexOf(key) === -1) {
if (notSaveStateKeys.indexOf(key) === -1) {
// 获取本地存储的lifeData对象,将变量添加到对象中
let tmp = uni.getStorageSync('lifeData');
// 第一次打开APP,不存在lifeData变量,故放一个{}空对象
......@@ -32,13 +56,12 @@ const saveLifeData = function(key, value){
}
}
// 加载modules目录下所有文件(分模块)
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
const value = modulesFiles(modulePath)
modules[moduleName] = value.default
return modules
}, {});
// #ifndef VUE3
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
modules,
// 如果是开发环境,则开启严格模式
......@@ -47,15 +70,50 @@ const store = new Vuex.Store({
mutations: {
updateStore(state, payload) {
// 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1
if(typeof payload.value === "undefined") payload.value = "";
if (typeof payload.value === "undefined") payload.value = "";
let nameArr = payload.name.split('.');
let saveKey = '';
let len = nameArr.length;
if (len >= 2) {
let obj = state[nameArr[0]];
for (let i = 1; i < len - 1; i++) {
let keyName = nameArr[i];
if (typeof obj[keyName] !== "object") obj[keyName] = {};
obj = obj[keyName];
}
obj[nameArr[len - 1]] = JSON.parse(JSON.stringify(payload.value));
saveKey = nameArr[0];
} else {
// 单层级变量,在state就是一个普通变量的情况
state[payload.name] = JSON.parse(JSON.stringify(payload.value));
saveKey = payload.name;
}
// 保存变量到本地,见顶部函数定义
saveLifeData(saveKey, state[saveKey])
}
}
})
// #endif
// #ifdef VUE3
import { createStore } from 'vuex'
const store = createStore({
modules,
// 如果是开发环境,则开启严格模式
strict: process.env.NODE_ENV === 'development',
// 公共 mutations
mutations: {
updateStore(state, payload) {
// 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1
if (typeof payload.value === "undefined") payload.value = "";
let nameArr = payload.name.split('.');
let saveKey = '';
let len = nameArr.length;
if(len >= 2) {
if (len >= 2) {
let obj = state[nameArr[0]];
for(let i = 1; i < len - 1; i ++) {
for (let i = 1; i < len - 1; i++) {
let keyName = nameArr[i];
if(typeof obj[keyName] !== "object") obj[keyName] = {};
if (typeof obj[keyName] !== "object") obj[keyName] = {};
obj = obj[keyName];
}
obj[nameArr[len - 1]] = JSON.parse(JSON.stringify(payload.value));
......@@ -70,5 +128,6 @@ const store = new Vuex.Store({
}
}
})
// #endif
export default store
\ No newline at end of file
......@@ -4,51 +4,56 @@ module.exports = {
* 添加
* @url admin/system_uni/global-data/sys/add 前端调用的url参数地址
* data 请求参数 说明
* @param {String} key 键名
* @param {不限制} value 键值
* @param {不限制} comment 备注
* @param {String} key 键名
* @param {any} value 键值
* @param {time} expired_at 过期时间
* @param {String} comment 备注
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
let {
key,
value,
expired_at,
comment
} = data;
if (!expired_at) expired_at = 0;
// 参数合法校验
let formRulesRes = await formRules.add(event);
if(formRulesRes.code !== 0){
if (formRulesRes.code !== 0) {
return formRulesRes;
}
let dbName = "vk-global-data";
// 检测key是否已存在
let num = await vk.baseDao.count({
dbName:dbName,
whereJson:{
key,
dbName,
whereJson: {
key
}
});
if(num > 0){
return { code : -1, msg : `键值【${key}】不能重复!` };
if (num > 0) {
return { code: -1, msg: `键值【${key}】不能重复!` };
}
// 执行数据库API请求
res.id = await vk.baseDao.add({
dbName:dbName,
dataJson:{
dbName,
dataJson: {
_id: key, // 此处将_id也设置为key,方便使用doc查询提高性能
key,
value,
expired_at,
comment
}
});
return res;
}
}
}
\ No newline at end of file
......@@ -5,52 +5,43 @@ module.exports = {
* @url admin/system_uni/global-data/sys/update 前端调用的url参数地址
* data 请求参数 说明
* @param {String} key 键名
* @param {不限制} value 键值
* @param {不限制} comment 备注
* @param {any} value 键值
* @param {time} expired_at 过期时间
* @param {any} comment 备注
* @param {String} _id id
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
* @param {String} msg 详细信息
*/
main: async (event) => {
let { data = {}, userInfo, util, filterResponse, originalParam } = event;
let { customUtil, uniID, config, pubFun, vk , db, _ } = util;
let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code : 0, msg : '' };
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
_id,
key,
value,
expired_at,
comment
} = data;
if (typeof expired_at !== "undefined" && !expired_at) expired_at = 0;
// 参数合法校验
let formRulesRes = await formRules.update(event);
if(formRulesRes.code !== 0){
if (formRulesRes.code !== 0) {
return formRulesRes;
}
let dbName = "vk-global-data";
// 检测key是否已存在
let num = await vk.baseDao.count({
dbName:dbName,
whereJson:{
key,
_id : _.neq(_id)
}
});
if(num > 0){
return { code : -1, msg : `键值【${key}】不能重复!` };
}
// 执行数据库API请求
res.num = await vk.baseDao.update({
dbName:dbName,
whereJson:{
_id
dbName: dbName,
whereJson: {
_id: key
},
dataJson:{
key,
dataJson: {
value,
expired_at,
comment
}
});
......@@ -58,4 +49,4 @@ module.exports = {
return res;
}
}
}
\ No newline at end of file
......@@ -4,31 +4,31 @@
*/
class Util {
constructor() {
}
/**
* 添加
*/
async add(event){
async add(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code : 0, msg : '' };
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
key: [
{ required: true, message: '名不能为空', trigger: 'blur' },
{ required: true, message: '名不能为空', trigger: 'blur' },
],
value: [
{ required: true, message: '值不能为空', trigger: 'change' }
{ required: true, message: '值不能为空', trigger: 'change' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data : data,
rules : rules
data: data,
rules: rules
});
// 返回验证结果
return res;
......@@ -36,8 +36,29 @@ class Util {
/**
* 修改
*/
async update(event){
return this.add(event);
async update(event) {
let { data = {}, userInfo, util } = event;
let { vk } = util;
let res = { code: 0, msg: '' };
// 验证规则开始 -----------------------------------------------------------
let rules = {
key: [
{ required: true, message: '键名不能为空', trigger: 'blur' },
],
value: [
{ required: true, message: '键值不能为空', trigger: 'change' }
]
};
// 验证规则结束 -----------------------------------------------------------
// 开始进行验证
res = vk.pubfn.formValidate({
data: data,
rules: rules
});
// 返回验证结果
return res;
}
}
module.exports = new Util
\ No newline at end of file
......@@ -16,15 +16,13 @@ module.exports = {
path
} = data;
res = await vk.openapi.qq.acode.getMiniCode({
path
});
res = await vk.openapi.qq.acode.getMiniCode(data);
if (typeof res === "object" && res.code) {
return res;
}
try {
// 二进制转base64
let base64 = Buffer.from(res, 'binary').toString('base64')
let base64 = Buffer.from(res, 'binary').toString('base64');
return {
code: 0,
base64: `data:image/png;base64,${base64}`
......
......@@ -24,6 +24,7 @@ module.exports = {
} = data;
// 超过180天有10万个限制,故这里强制设为90天
res = await vk.openapi.weixin.urlscheme.generate({
...data,
// 跳转到的目标小程序信息。
jump_wxa: {
path, // 小程序页面路径
......
......@@ -24,6 +24,7 @@ module.exports = {
} = data;
// 超过180天有10万个限制,故这里强制设为90天
res = await vk.openapi.weixin.urllink.generate({
...data,
path,
query,
env_version,
......
......@@ -6,6 +6,11 @@ module.exports = {
* data 请求参数 说明
* @param {String} email 邮箱
* @param {String} code 邮箱收到的验证码
* @param {String} type 指定操作类型,不传:存在则登录不存在则注册 login:只能登录 register:只能注册
* @param {String} password 密码,当前用户为新注册时生效
* @param {String} myInviteCode 设置当前注册用户自己的邀请码,当前用户为新注册时生效(不传会自动生成)
* @param {Boolean} needPermission 设置为true时会在checkToken时返回用户权限(permission),如果是在admin端,需传true
* @param {Array} role 设定用户角色,当前用户为新注册时生效
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
......@@ -18,13 +23,15 @@ module.exports = {
let { uid } = data;
let res = {};
// 业务逻辑开始-----------------------------------------------------------
let { email, code, type, password, needPermission } = data;
let { email, code, type, password, needPermission, myInviteCode, role } = data;
res = await uniID.loginByEmail({
email,
code,
type,
password,
needPermission
myInviteCode,
needPermission,
role
});
if (res.token) {
if (!res.msg) {
......@@ -42,4 +49,4 @@ module.exports = {
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
}
\ No newline at end of file
......@@ -6,6 +6,12 @@ module.exports = {
* data 请求参数 说明
* @param {String} mobile 手机号
* @param {String} code 验证码
* @param {String} type 指定操作类型,不传:存在则登录不存在则注册 login:只能登录 register:只能注册
* @param {String} password 密码,当前用户为新注册时生效
* @param {String} inviteCode 邀请人的邀请码,当前用户为新注册时生效
* @param {String} myInviteCode 设置当前注册用户自己的邀请码,当前用户为新注册时生效(不传会自动生成)
* @param {Boolean} needPermission 设置为true时会在checkToken时返回用户权限(permission),如果是在admin端,需传true
* @param {Array} role 设定用户角色,当前用户为新注册时生效
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
......@@ -18,14 +24,16 @@ module.exports = {
let { uid } = data;
let res = {};
// 业务逻辑开始-----------------------------------------------------------
let { mobile, code, password, inviteCode, needPermission, type } = data;
let { mobile, code, password, inviteCode, myInviteCode, needPermission, role, type } = data;
res = await uniID.loginBySms({
type,
mobile,
code,
type,
password,
inviteCode,
needPermission
myInviteCode,
needPermission,
role
});
// 修改用户昵称为:手机尾号xxxx用户
if (res.token) {
......@@ -55,4 +63,4 @@ module.exports = {
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
}
\ No newline at end of file
## 2.14.2(2023-06-01)
* 1、【优化】`user/kh/addUploadRecord` 细节
* 2、【优化】`vk.importObject` 支持 `importObjectOptions` 参数 [传送门](https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#uni-vk-importobject%E7%9A%84%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95)
* 3、【优化】vuex模块化支持多级目录
* 4、【优化】微信公众号登录后不能跳回登录前页面的问题。
* 5、【调整】`vk.pubfn.test(str, 'username')` 检测的长度调整为3-32位
* 完整框架项目地址:`https://ext.dcloud.net.cn/plugin?id=2204`[点击查看](https://ext.dcloud.net.cn/plugin?id=2204)
## 2.14.1(2023-05-17)
* 1、【新增】QQ小程序API [详情](https://vkdoc.fsq.pub/client/uniCloud/plus/qq.html#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6)
* 2、【新增】抖音小程序API [详情](https://vkdoc.fsq.pub/client/uniCloud/plus/douyin.html)
......
{
"id": "vk-unicloud",
"displayName": "vk-unicloud-router开发框架核心库 - 已集成uni-id 框架内置了众多API。",
"version": "2.14.1",
"version": "2.14.2",
"description": "此为vk-unicloud-router框架核心库(新手建议下载完整框架项目)已集成uni-id支持云函数url化。众多现成API,内置小白也能轻松上手的数据库API。使你项目刚起步进度就是百分之50",
"keywords": [
"vk-unicloud-router",
......
......@@ -236,8 +236,8 @@ pubfn.test = function(str, type = "") {
return new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(str);
case 'mobilecode': //6位数字验证码
return new RegExp(/^[0-9]{6}$/).test(str);
case 'username': //账号以字母开头,长度在6~18之间,只能包含字母、数字和下划线
return new RegExp(/^[a-zA-Z]([-_a-zA-Z0-9]{5,17})$/).test(str)
case 'username': //账号以字母开头,长度在3~32之间,只能包含字母、数字和下划线
return new RegExp(/^[a-zA-Z]([-_a-zA-Z0-9]{2,31})$/).test(str)
case 'pwd': //密码长度在6~18之间,只能包含字母、数字和下划线和@
return new RegExp(/^([a-zA-Z0-9_@]){6,18}$/).test(str)
case 'password': //密码长度在6~18之间,只能包含字母、数字和下划线和@
......
......@@ -13,7 +13,7 @@ async test(){
});
}
*/
var importObject = function(name) {
var importObject = function(name, importObjectOptions = {}) {
const newObj = new Proxy(importObject, {
get: function(target, key, receiver) {
/**
......@@ -24,7 +24,19 @@ var importObject = function(name) {
* @param {Object} loading 与title二选一,格式为 { name: "loading", that: that } name是变量名,that是数据源,当发起请求时,自动that[name] = true; 请求结束后,自动that[name] = false;
*/
return async function(options) {
// 如果importObjectOptions中指定了easy为true,代表options的值就是请求参数
if (importObjectOptions.easy) {
delete importObjectOptions.easy;
options = {
data: options
}
}
// 如果importObjectOptions中指定了data,代表有默认请求参数,需要加到请求参数中
if (importObjectOptions.data) {
options.data = Object.assign(importObjectOptions.data, options.data)
}
return uni.vk.callFunction({
...importObjectOptions,
...options,
url: `${name}.${key}`
});
......@@ -41,4 +53,4 @@ var importObject = function(name) {
return newObj;
};
export default importObject;
export default importObject;
\ No newline at end of file
......@@ -816,7 +816,9 @@ class CallFunctionUtil {
errMsg = globalErrorCode["cloudfunction-timeout"] || "请求超时,请重试!";
} else if (errMsg.indexOf("reaches burst limit") > -1) {
errMsg = globalErrorCode["cloudfunction-reaches-burst-limit"] || "系统繁忙,请稍后再试。";
}
} else if (res.code === "InternalServerError") {
sysErr = true;
}
let runKey = true;
if (typeof that.interceptor.fail == "function") {
runKey = that.interceptor.fail({
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册