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

1.15.0

上级 c83d268f
* 1、【升级】`vk-unicloud-admin-ui` 包升级至 `1.15.2`
* 2、【重要】应用管理内置 `生成统一发布页` [传送门 - 应用管理](https://vkdoc.fsq.pub/admin/6/app.html)
* 3、【重要】新增自定义图标库 [传送门 - 拓展教程](https://vkdoc.fsq.pub/admin/components2/1%E3%80%81vk-data-icon.html#%E5%A6%82%E4%BD%95%E6%89%A9%E5%B1%95%E5%9B%BE%E6%A0%87%E5%BA%93)
* 4、【优化】`万能表单` 图标选择组件支持图标过滤 [传送门 - 组件文档](https://vkdoc.fsq.pub/admin/components/26%E3%80%81icon.html#filter)
* 5、【新增】`万能表格` 支持视频预览,设置 `type``file` 即可
**本次更新除了常规升级框架外,还需要下载最新版框架示例项目,从最新版中复制 以下文件 替换 你项目中的对应文件。**
* 1、`router/service/admin/system/app/`(替换整个目录)
* 2、`根目录/pages_plugs/system/app/`(替换整个目录)
##### 框架更新步骤 [点击查看](https://vkdoc.fsq.pub/admin/1/update.html)
##### 框架学习Q群:`22466457` 欢迎萌新和大佬来使用和共同改进框架
##### 如果你觉得框架对你有用,可以在下方进行评论,也可以进行赞赏。
## 1.15.0(2022-10-10)
* 1、【升级】`vk-unicloud-admin-ui` 包升级至 `1.15.2`
* 2、【重要】应用管理内置 `生成统一发布页` [传送门 - 应用管理](https://vkdoc.fsq.pub/admin/6/app.html)
* 3、【重要】新增自定义图标库 [传送门 - 拓展教程](https://vkdoc.fsq.pub/admin/components2/1%E3%80%81vk-data-icon.html#%E5%A6%82%E4%BD%95%E6%89%A9%E5%B1%95%E5%9B%BE%E6%A0%87%E5%BA%93)
* 4、【优化】`万能表单` 图标选择组件支持图标过滤 [传送门 - 组件文档](https://vkdoc.fsq.pub/admin/components/26%E3%80%81icon.html#filter)
* 5、【新增】`万能表格` 支持视频预览,设置 `type``file` 即可
**本次更新除了常规升级框架外,还需要下载最新版框架示例项目,从最新版中复制 以下文件 替换 你项目中的对应文件。**
* 1、`router/service/admin/system/app/`(替换整个目录)
* 2、`根目录/pages_plugs/system/app/`(替换整个目录)
##### 框架更新步骤 [点击查看](https://vkdoc.fsq.pub/admin/1/update.html)
##### 框架学习Q群:`22466457` 欢迎萌新和大佬来使用和共同改进框架
##### 如果你觉得框架对你有用,可以在下方进行评论,也可以进行赞赏。
## 1.14.4(2022-10-07)
* 1、【升级】`vk-unicloud-admin-ui` 包升级至 `1.14.4`
* 2、【优化】`万能表单` 针对 `type``object` 且多层嵌套时的内部细节处理优化。(现在可以无限嵌套)
......
{
"name": "vk-unicloud-admin",
"version": "1.14.3",
"version": "1.14.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
......@@ -104,9 +104,9 @@
}
},
"vk-unicloud-admin-ui": {
"version": "1.14.4",
"resolved": "https://registry.npmjs.org/vk-unicloud-admin-ui/-/vk-unicloud-admin-ui-1.14.4.tgz",
"integrity": "sha512-TPUlJKrMYKLlxGWuzzmeJMzGWR4Gdaf0a4LdpIJKZEH+RO/3CE7PcVCPzqdaCFht/Q2FJS9EuVAZfQe7jTWB1A=="
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/vk-unicloud-admin-ui/-/vk-unicloud-admin-ui-1.15.2.tgz",
"integrity": "sha512-q0J+kj6gvt51y1Q3k7vXzReF+Bj4pspVEZW4AEJQQiAPTBxNCAutbujyfYfXNlqdtF0nQKVbyO9dtLs4pqf4vg=="
},
"vuedraggable": {
"version": "2.24.3",
......
{
"id": "vk-unicloud-admin",
"name": "vk-unicloud-admin",
"version": "1.14.4",
"version": "1.15.0",
"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.7",
"umy-ui": "1.1.6",
"vk-unicloud-admin-ui": "^1.14.4"
"vk-unicloud-admin-ui": "^1.15.2"
},
"engines": {
"HBuilderX": "^3.1.10"
......
......@@ -20,13 +20,13 @@
{ "path": "system/role/list" },
{ "path": "system/permission/list" },
{ "path": "system/menu/list" },
{ "path": "system/app/list" },
{ "path": "system/app/list" },
{ "path": "system/app-upgrade-center/list" },
{ "path": "system_uni/vk-global-data" },
{ "path": "system_uni/vk-global-data" },
{ "path": "system_uni/uni-id-log" },
{ "path": "system_uni/opendb-admin-log" },
{ "path": "system_uni/vk-components-dynamic" },
{ "path": "system_uni/uni-id-files/list" }
{ "path": "system_uni/uni-id-files/list" }
]
},
......@@ -39,9 +39,9 @@
{ "path": "icons/element-icons-page", "style": { "topWindow": false,"leftWindow": false } },
{ "path": "table/table-basic" },
{ "path": "table/table-easy" },
{ "path": "table/table-query" },
{ "path": "table/table-expand" },
{ "path": "form/form-array-object" },
{ "path": "table/table-query" },
{ "path": "table/table-expand" },
{ "path": "form/form-array-object" },
{ "path": "form/form-basic" },
{ "path": "form/form-cert" , "style": { "topWindow": false,"leftWindow": false } },
{ "path": "form/form-inline" },
......
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
center
@open="onOpen"
@closed="onClose"
>
<view class="uni-container">
<h3 class="text-separated" style="padding: 0 0 20rpx 0;">步骤1:了解“统一发布页”</h3>
<view style="margin-top: 20rpx;">
<view class="text-separated">
<text class="strong">uni-portal </text>
<text>是 uni-app 提供的一套开箱即用的“统一发布页”。</text>
</view>
<view class="text-separated">
<text class="strong">uni-portal </text>
<text>可作为面向用户的统一业务名片,在一个页面集中展现:App下载地址、小程序二维码、H5访问链接等信息。</text>
</view>
<!-- #ifdef H5 -->
<view class="text-separated">
<text style="font-size: 16px;">uni-app 官方示例的发布页就是基于<text class="strong">uni-portal </text> 制作的,<a
href="https://hellouniapp.dcloud.net.cn/portal" target="_blank" class="a-label">点击体验</a>
</text>
</view>
<!-- #endif -->
</view>
<h3 class="text-separated" style="padding: 40rpx 0 20rpx 0;">步骤2:获取“统一发布页”</h3>
<view class="flex text-separated" style="margin-top: 20rpx;">
<text>
<view class="strong">uni-portal </view> 可根据「应用管理」中所填写的应用信息,一键生成发布页:
</text>
<button class="custom-button" size="mini" type="primary" @click="publish"
style="margin: 0;">生成并下载发布页</button>
</view>
<h3 class="text-separated" style="padding: 40rpx 0 20rpx 0;">步骤3:上传“统一发布页”</h3>
<view style="margin-top: 20rpx;">
<view class="text-separated">
<text>
步骤2下载的“统一发布页”,是一个静态HTML页面,你可以直接在本地浏览器中打开访问。
</text>
</view>
<view class="text-separated">
<text>
为了让用户访问到这个“统一发布页”,你需要将该静态HTML文件上传到你的服务器中;推荐使用<a href="https://uniapp.dcloud.io/uniCloud/hosting"
target="_blank" class="a-label" style="padding: 5px;">前端网页托管</a>,因为前端网页托管具备使用更简单、价格更便宜、访问更快等优点。
</text>
</view>
</view>
</view>
<template v-slot:footer>
<el-button :loading="page.loading" type="primary" size="small" style="width: 80px;" @click="close">{{ page.submitText }}</el-button>
</template>
</vk-data-dialog>
</template>
<script>
var vk = uni.vk; // vk实例
var download = function(content, filename) {
let eleLink = document.createElement('a');
eleLink.download = filename;
eleLink.style.display = 'none';
let blob = new Blob([content]);
eleLink.href = URL.createObjectURL(blob);
document.body.appendChild(eleLink);
eleLink.click();
document.body.removeChild(eleLink);
};
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
item: {},
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "生成统一发布页",
submitText: "关闭",
top: "5vh",
width: "800px",
loading: false
},
id: ""
};
},
mounted() {
this.init();
},
methods: {
// 初始化
init() {
let { value } = this;
this.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
let { value = {} } = this;
let { item={} } = value;
this.id = item._id;
},
// 监听 - 页面关闭
onClose() {
},
close(){
this.$emit("input", false);
},
publish() {
if (!this.id) {
uni.showModal({
content: '页面出错,请返回重进',
showCancel: false,
success(res) {
uni.redirectTo({
url: '/pages/system/app/list'
})
}
})
return
}
vk.callFunction({
url: 'admin/system/app/sys/createPublishHtml',
title: '生成中...',
data: {
id: this.id
},
success: (res) => {
if ('download' in document.createElement('a')) {
download(res.body, 'uni-publish.html');
} else {
vk.toast('浏览器不支持');
}
}
});
}
},
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
.strong {
padding: 10rpx;
display: inline-block;
color: #c7254e;
}
.a-label {
text-decoration: none;
color: #0366d6;
font-weight: bold;
padding: 10rpx;
}
.text-separated {
line-height: 2em;
color: #2c3e50;
}
.tip {
display: flex;
flex-direction: column;
align-items: flex-start;
background-color: #f3f5f7;
color: #2c3e50;
padding: 10px;
font-size: 32rpx;
border: {
color: #409EFF;
left-width: 8px;
left-style: solid;
}
text {
margin-right: 15px;
}
.custom-button {
margin-left: 0px;
}
}
</style>
......@@ -36,6 +36,8 @@
<!-- 添加或编辑 -->
<addUpdate v-model="formDatas.addUpdate" @success="refresh"></addUpdate>
<!-- 生成发布页 -->
<createPublishHtml v-model="formDatas.createPublishHtml" @success="refresh"></createPublishHtml>
<!-- 页面内容结束 -->
</view>
......@@ -46,9 +48,11 @@
var vk = uni.vk; // vk实例
import addUpdate from './form/addUpdate.vue'
import createPublishHtml from './form/createPublishHtml.vue'
export default {
components:{
addUpdate,
createPublishHtml,
},
data() {
// 页面数据变量
......@@ -79,7 +83,7 @@
{
title: '发布页管理', type: 'primary',
onClick:(item)=>{
vk.toast(`敬请期待`);
vk.pubfn.openForm('createPublishHtml',{ item });
},
disabled:"enable_upgrade_center!=true",
},
......
'use strict';
const createPublishHtml = require('../util/createPublishHtml/index.js')
module.exports = {
/**
* 生成发布页HTML
* @url admin/system/app/sys/createPublishHtml 前端调用的url参数地址
* data 请求参数
* @param {String} params1 参数1
*/
main: async (event) => {
let { data = {}, userInfo, util } = event;
let { vk, db, _ } = util;
let res = { code: 0, msg: "" };
// 业务逻辑开始-----------------------------------------------------------
let { id } = data;
res = await createPublishHtml({
id
});
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}
const fs = require('fs')
const path = require('path')
const TE = require('./lib/art-template.js');
// 标准语法的界定符规则
TE.defaults.openTag = '{@'
TE.defaults.closeTag = '@}'
const success = {
code: 0,
success: true,
}
const fail = {
code: -1,
success: false
}
async function translateTCB(_fileList = []) {
if (!_fileList.length) return _fileList
// 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回
const {
fileList
} = await uniCloud.getTempFileURL({
fileList: _fileList
});
return fileList.map((item, index) => item.tempFileURL ? item.tempFileURL : _fileList[index])
}
function hasValue(value) {
if (typeof value !== 'object') return !!value
if (value instanceof Array) return !!value.length
return !!(value && Object.keys(value).length && value.enable)
}
module.exports = async function(data = {}) {
let {
id,
template
} = data;
if (!id) {
return {
...fail,
code: -1,
errMsg: 'id required'
};
}
// 方式一:使用网络资源
let templatePage;
if (template) {
try {
let htmlBuffer = await vk.request({
url: template,
method: "GET",
dataType: "default"
});
templatePage = htmlBuffer.toString("utf8");
} catch (err) {
return {
...fail,
code: -2,
errMsg: 'page template no found',
err
};
}
} else {
// 方式二:使用本地资源
templatePage = fs.readFileSync(path.resolve(__dirname, './template.html'), 'utf8');
if (!templatePage) {
return {
...fail,
code: -2,
errMsg: 'page template no found'
};
}
}
let appInfo = await vk.baseDao.findById({
dbName: "opendb-app-list",
id: id
});
if (appInfo) {
const defaultOptions = {
hasApp: false,
hasMP: false,
hasH5: false,
hasQuickApp: false
}
defaultOptions.mpNames = {
'mp_weixin': '微信',
'mp_alipay': '支付宝',
'mp_baidu': '百度',
'mp_toutiao': '字节',
'mp_qq': 'QQ',
'mp_dingtalk': '钉钉',
'mp_kuaishou': '快手',
'mp_lark': '飞书',
'mp_jd': '京东'
}
const imageList = [];
['app_android'].forEach(key => {
if (!hasValue(appInfo[key])) return
imageList.push({
key,
urlKey: 'url',
url: appInfo[key].url
})
})
Object.keys(defaultOptions.mpNames).concat('quickapp').forEach(key => {
if (!hasValue(appInfo[key])) return
imageList.push({
key,
urlKey: 'qrcode_url',
url: appInfo[key].qrcode_url
})
});
['icon_url'].forEach(key => {
if (!hasValue(appInfo[key])) return
imageList.push({
key,
url: appInfo[key]
})
})
const filelist = await translateTCB(imageList.map(item => item.url))
imageList.forEach((item, index) => {
if (item.urlKey) {
appInfo[item.key][item.urlKey] = filelist[index]
} else {
appInfo[item.key] = filelist[index]
}
})
if (hasValue(appInfo.screenshot)) {
appInfo.screenshot = await translateTCB(appInfo.screenshot)
}
{
const appInfoKeys = Object.keys(appInfo)
if (appInfoKeys.some(key => {
return key.indexOf('app_') !== -1 && hasValue(appInfo[key])
})) {
defaultOptions.hasApp = true
}
if (appInfoKeys.some(key => {
return key.indexOf('mp') !== -1 && hasValue(appInfo[key])
})) {
defaultOptions.hasMP = true
}
if (appInfo.h5 && appInfo.h5.url) {
defaultOptions.hasH5 = true
}
if (appInfo.quickapp && appInfo.quickapp.qrcode_url) {
defaultOptions.hasQuickApp = true
}
// app
if (defaultOptions.hasApp && appInfo.app_android && appInfo.app_android.url) {
defaultOptions.android_url = appInfo.app_android.url
} else {
defaultOptions.android_url = ''
}
if (defaultOptions.hasApp && appInfo.app_ios && appInfo.app_ios.url) {
defaultOptions.ios_url = appInfo.app_ios.url
} else {
defaultOptions.ios_url = ''
}
// mp
defaultOptions.mpKeys = Object.keys(appInfo).filter(key => {
return key.indexOf('mp') !== -1 && hasValue(appInfo[key])
})
}
const html = TE.render(templatePage)(Object.assign({}, appInfo, defaultOptions));
if (!(defaultOptions.hasApp || defaultOptions.hasH5 || defaultOptions.hasMP || defaultOptions
.hasQuickApp)) {
return {
...fail,
code: -100,
errMsg: '缺少应用信息,App、小程序、H5、快应用请至少填写一项'
}
}
return {
...success,
mpserverlessComposedResponse: true, // 使用阿里云返回集成响应是需要此字段为true
statusCode: 200,
headers: {
'content-type': 'text/html'
},
body: html
};
}
return {
...fail,
code: -3,
errMsg: 'no record'
};
}
/*!art-template - Template Engine | http://aui.github.com/artTemplate/*/
!function(){function a(a){return a.replace(t,"").replace(u,",").replace(v,"").replace(w,"").replace(x,"").split(y)}function b(a){return"'"+a.replace(/('|\\)/g,"\\$1").replace(/\r/g,"\\r").replace(/\n/g,"\\n")+"'"}function c(c,d){function e(a){return m+=a.split(/\n/).length-1,k&&(a=a.replace(/\s+/g," ").replace(/<!--[\w\W]*?-->/g,"")),a&&(a=s[1]+b(a)+s[2]+"\n"),a}function f(b){var c=m;if(j?b=j(b,d):g&&(b=b.replace(/\n/g,function(){return m++,"$line="+m+";"})),0===b.indexOf("=")){var e=l&&!/^=[=#]/.test(b);if(b=b.replace(/^=[=#]?|[\s;]*$/g,""),e){var f=b.replace(/\s*\([^\)]+\)/,"");n[f]||/^(include|print)$/.test(f)||(b="$escape("+b+")")}else b="$string("+b+")";b=s[1]+b+s[2]}return g&&(b="$line="+c+";"+b),r(a(b),function(a){if(a&&!p[a]){var b;b="print"===a?u:"include"===a?v:n[a]?"$utils."+a:o[a]?"$helpers."+a:"$data."+a,w+=a+"="+b+",",p[a]=!0}}),b+"\n"}var g=d.debug,h=d.openTag,i=d.closeTag,j=d.parser,k=d.compress,l=d.escape,m=1,p={$data:1,$filename:1,$utils:1,$helpers:1,$out:1,$line:1},q="".trim,s=q?["$out='';","$out+=",";","$out"]:["$out=[];","$out.push(",");","$out.join('')"],t=q?"$out+=text;return $out;":"$out.push(text);",u="function(){var text=''.concat.apply('',arguments);"+t+"}",v="function(filename,data){data=data||$data;var text=$utils.$include(filename,data,$filename);"+t+"}",w="'use strict';var $utils=this,$helpers=$utils.$helpers,"+(g?"$line=0,":""),x=s[0],y="return new String("+s[3]+");";r(c.split(h),function(a){a=a.split(i);var b=a[0],c=a[1];1===a.length?x+=e(b):(x+=f(b),c&&(x+=e(c)))});var z=w+x+y;g&&(z="try{"+z+"}catch(e){throw {filename:$filename,name:'Render Error',message:e.message,line:$line,source:"+b(c)+".split(/\\n/)[$line-1].replace(/^\\s+/,'')};}");try{var A=new Function("$data","$filename",z);return A.prototype=n,A}catch(B){throw B.temp="function anonymous($data,$filename) {"+z+"}",B}}var d=function(a,b){return"string"==typeof b?q(b,{filename:a}):g(a,b)};d.version="3.0.0",d.config=function(a,b){e[a]=b};var e=d.defaults={openTag:"<%",closeTag:"%>",escape:!0,cache:!0,compress:!1,parser:null},f=d.cache={};d.render=function(a,b){return q(a,b)};var g=d.renderFile=function(a,b){var c=d.get(a)||p({filename:a,name:"Render Error",message:"Template not found"});return b?c(b):c};d.get=function(a){var b;if(f[a])b=f[a];else if("object"==typeof document){var c=document.getElementById(a);if(c){var d=(c.value||c.innerHTML).replace(/^\s*|\s*$/g,"");b=q(d,{filename:a})}}return b};var h=function(a,b){return"string"!=typeof a&&(b=typeof a,"number"===b?a+="":a="function"===b?h(a.call(a)):""),a},i={"<":"&#60;",">":"&#62;",'"':"&#34;","'":"&#39;","&":"&#38;"},j=function(a){return i[a]},k=function(a){return h(a).replace(/&(?![\w#]+;)|[<>"']/g,j)},l=Array.isArray||function(a){return"[object Array]"==={}.toString.call(a)},m=function(a,b){var c,d;if(l(a))for(c=0,d=a.length;d>c;c++)b.call(a,a[c],c,a);else for(c in a)b.call(a,a[c],c)},n=d.utils={$helpers:{},$include:g,$string:h,$escape:k,$each:m};d.helper=function(a,b){o[a]=b};var o=d.helpers=n.$helpers;d.onerror=function(a){var b="Template Error\n\n";for(var c in a)b+="<"+c+">\n"+a[c]+"\n\n";"object"==typeof console&&console.error(b)};var p=function(a){return d.onerror(a),function(){return"{Template Error}"}},q=d.compile=function(a,b){function d(c){try{return new i(c,h)+""}catch(d){return b.debug?p(d)():(b.debug=!0,q(a,b)(c))}}b=b||{};for(var g in e)void 0===b[g]&&(b[g]=e[g]);var h=b.filename;try{var i=c(a,b)}catch(j){return j.filename=h||"anonymous",j.name="Syntax Error",p(j)}return d.prototype=i.prototype,d.toString=function(){return i.toString()},h&&b.cache&&(f[h]=d),d},r=n.$each,s="break,case,catch,continue,debugger,default,delete,do,else,false,finally,for,function,if,in,instanceof,new,null,return,switch,this,throw,true,try,typeof,var,void,while,with,abstract,boolean,byte,char,class,const,double,enum,export,extends,final,float,goto,implements,import,int,interface,long,native,package,private,protected,public,short,static,super,synchronized,throws,transient,volatile,arguments,let,yield,undefined",t=/\/\*[\w\W]*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|"(?:[^"\\]|\\[\w\W])*"|'(?:[^'\\]|\\[\w\W])*'|\s*\.\s*[$\w\.]+/g,u=/[^\w$]+/g,v=new RegExp(["\\b"+s.replace(/,/g,"\\b|\\b")+"\\b"].join("|"),"g"),w=/^\d[^,]*|,\d[^,]*/g,x=/^,+|,+$/g,y=/^$|,+/;e.openTag="{{",e.closeTag="}}";var z=function(a,b){var c=b.split(":"),d=c.shift(),e=c.join(":")||"";return e&&(e=", "+e),"$helpers."+d+"("+a+e+")"};e.parser=function(a){a=a.replace(/^\s/,"");var b=a.split(" "),c=b.shift(),e=b.join(" ");switch(c){case"if":a="if("+e+"){";break;case"else":b="if"===b.shift()?" if("+b.join(" ")+")":"",a="}else"+b+"{";break;case"/if":a="}";break;case"each":var f=b[0]||"$data",g=b[1]||"as",h=b[2]||"$value",i=b[3]||"$index",j=h+","+i;"as"!==g&&(f="[]"),a="$each("+f+",function("+j+"){";break;case"/each":a="});";break;case"echo":a="print("+e+");";break;case"print":case"include":a=c+"("+b.join(",")+");";break;default:if(/^\s*\|\s*[\w\$]/.test(e)){var k=!0;0===a.indexOf("#")&&(a=a.substr(1),k=!1);for(var l=0,m=a.split("|"),n=m.length,o=m[l++];n>l;l++)o=z(o,m[l]);a=(k?"=":"=#")+o}else a=d.helpers[c]?"=#"+c+"("+b.join(",")+");":"="+a}return a},"function"==typeof define?define(function(){return d}):"undefined"!=typeof exports?module.exports=d:this.template=d}();
\ No newline at end of file
## 2.12.1(2022-10-10)
* 1、【优化】一些细节
* 完整框架项目地址:`https://ext.dcloud.net.cn/plugin?id=2204`[点击查看](https://ext.dcloud.net.cn/plugin?id=2204)
## 2.12.0(2022-10-07)
* 1、【重要】vk实例初始化代码调整(因HBX更新导致本地运行时,不同的云函数环境目前没有隔离(云端无此问题,只有本地运行有此问题),从而导致HBX本地运行时,A云函数和B云函数复用了同一个vk实例,而更新后,vk实例在不同云函数内会隔离)
......
{
"id": "vk-unicloud",
"displayName": "vk-unicloud-router开发框架核心库 - 已集成uni-id 框架内置了众多API。",
"version": "2.12.0",
"version": "2.12.1",
"description": "此为vk-unicloud-router框架核心库(新手建议下载完整框架项目)已集成uni-id支持云函数url化。众多现成API,内置小白也能轻松上手的数据库API。使你项目刚起步进度就是百分之50",
"keywords": [
"vk-unicloud-router",
......
{
"name": "vk-unicloud",
"version": "2.12.0",
"version": "2.12.2",
"description": "【云函数端SDK】VK云函数路由模式uniCloud开发框架,在router目录下执行 npm i vk-unicloud 进行安装和升级",
"main": "index.js",
"homepage": "https://gitee.com/vk-uni/vk-uni-cloud-router.git",
......
......@@ -266,13 +266,29 @@ pubfn.test = function(str, type = "") {
// 保留之前的函数名
pubfn.checkStr = pubfn.test;
/**
* 对象属性拷贝(浅拷贝)
* @description 将 obj2 的属性赋值给 obj1 (如果obj1中有对应的属性,则会被obj2的属性值覆盖)
* 删除对象中所有值为无效值的属性(如:undefined)
* @param {Object} obj
* vk.pubfn.objectDeleteInvalid(obj);
*/
pubfn.objectDeleteInvalid = function(obj) {
Object.keys(obj).forEach(item => {
if (obj[item] === undefined) {
delete obj[item];
}
});
return obj;
};
/**
* 对象属性拷贝(浅拷贝)
* @description 将 obj2 的属性赋值给 obj1(如果obj1中有对应的属性,则会被obj2的属性值覆盖)
* @param {Object} obj1
* @param {Object} obj2
* vk.pubfn.objectAssign(obj1, obj2);
* vk.pubfn.objectAssign(obj1, obj2, true);
* vk.pubfn.objectAssign(obj1, obj2, false);
*/
pubfn.objectAssign = function(obj1, obj2) {
pubfn.objectAssign = function(obj1, obj2, deleteInvalid=true) {
if (deleteInvalid) pubfn.objectDeleteInvalid(obj2);
return Object.assign(obj1, obj2);
};
/**
......@@ -2306,6 +2322,7 @@ pubfn.setLocale = function(...e) {
* vk.pubfn.objectAssignForVue(obj1, obj2, that);
*/
pubfn.objectAssignForVue = function(obj1, obj2, that) {
pubfn.objectDeleteInvalid(obj2);
for (let key in obj2) {
that.$set(obj1, key, obj2[key]);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册