This commit is contained in:
2023-11-07 17:15:33 +08:00
commit fe37e2e1df
418 changed files with 53012 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
/.hbuilderx
/node_modules
/unpackage
+130
View File
@@ -0,0 +1,130 @@
<script>
import config from "@/app.config.js";
import { version } from "./package.json";
export default {
computed: {},
methods: {
// 初始化菜单权限等数据
init() {
let that = this;
let { vk } = that;
// 如果token失效,直接跳登录页面
if (!vk.checkToken()) {
vk.reLaunch(config.login.url);
return false;
}
if (!that.isAllowLoginBackground()) {
vk.alert("您的账户无登陆权限", function() {
vk.reLaunch(config.login.url);
});
return false;
}
vk.userCenter.getMenu({
success: function(data) {
// 初始化菜单
let { menus = [] } = data;
// 合并去重
menus = vk.pubfn.arr_concat(menus, config.sideBar.staticMenu, "menu_id");
// 排序
menus.sort(function(a, b) {
let sortA = a.sort || 0;
let sortB = b.sort || 0;
return sortA - sortB;
});
if (JSON.stringify(menus) !== JSON.stringify(vk.getVuex("$app.navMenu"))) {
vk.setVuex("$app.navMenu", menus);
}
// 将树形结构转成数组结构
let menuList = vk.pubfn.treeToArray(menus, {
id: "menu_id",
parent_id: "parent_id",
children: "children"
});
if (JSON.stringify(menuList) !== JSON.stringify(vk.getVuex("$app.menuList"))) {
vk.setVuex("$app.menuList", menuList);
}
vk.setVuex("$app.inited", true);
vk.setVuex("$user.userInfo", data.userInfo);
vk.setVuex("$user.permission", data.userInfo.permission);
}
});
},
// 初始化系统环境变量
initApp() {
let that = this;
let { vk } = that;
uni.getSystemInfo().then(([err, res]) => {
let isPC = res.model && res.model != "PC" ? false : true;
vk.setVuex("$app.isPC", isPC);
vk.setVuex("$app.width", res.windowWidth);
vk.setVuex("$app.height", res.windowHeight);
});
uni.onWindowResize(res => {
vk.pubfn.debounce(
function() {
vk.setVuex("$app.width", res.size.windowWidth);
vk.setVuex("$app.height", res.size.windowHeight);
},
50,
false,
"app-onresize"
);
});
},
// 检测用户是否可以登录admin
isAllowLoginBackground(userInfo) {
let that = this;
let { vk } = that;
if (!userInfo) userInfo = vk.getVuex("$user.userInfo");
let key = true;
if (vk.pubfn.isNotNull(userInfo)) {
let { role = [], allow_login_background = false } = userInfo;
if (role.indexOf("admin") == -1 && !allow_login_background) {
key = false;
}
}
return key;
}
},
// 监听 - 页面404
onPageNotFound(e) {
uni.redirectTo({
url: config.error.url
});
},
onLaunch: function(options) {
// 注意:config.debug 在正式环境时,值为false,故此{}内的代码只有开发环境才会执行
if (config.debug) {
console.log(
`%c vk-admin %c v${version} `,
"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff",
"background:#007aff ;padding: 1px; border-radius: 0 3px 3px 0; color: #fff; font-weight: bold;"
);
console.log("App Launch");
}
// 注意:以下代码正式和开发环境都会执行
let that = this;
that.vk.pubfn.needInit({
that,
config,
success: function() {
that.init();
}
});
that.initApp();
},
onShow: function() {
if (config.debug) console.log("App Show");
},
onHide: function() {
if (config.debug) console.log("App Hide");
}
};
</script>
<style lang="scss">
/* 此为uni-admin的样式,如果你不使用uni-admin的官方插件,可以不需要加载这些样式 */
@import "@/common/uni-admin/css/uni.css";
@import "@/common/uni-admin/css/uni-icons.css";
/* 此为uni-admin的样式,如果你不使用uni-admin的官方插件,可以不需要加载这些样式 */
</style>
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 VK
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+305
View File
@@ -0,0 +1,305 @@
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/ad18e7d6-ae0e-4424-bf3d-6e3dad1036a1.png)
### 插件名称:`vk-unicloud-admin`
### 作者:VK
## 序
* 如果你热爱编程,想快速入门云开发,欢迎使用`vk-unicloud`系列开发框架
* 无需转变开发习惯,0成本上手云开发。
* 框架内置了众多API、工具包,为你的业务扫平障碍。使你的项目刚起步进度就是50%(微信登录、短信、验证码、缓存、生成小程序码等等)
* 从此你又get一个新技能,只需用js,轻松搞定前后台整体业务。
* `client端`框架地址: [https://ext.dcloud.net.cn/plugin?id=2204](https://ext.dcloud.net.cn/plugin?id=2204)
* `admin端`框架地址:[https://ext.dcloud.net.cn/plugin?id=5043](https://ext.dcloud.net.cn/plugin?name=vk-unicloud-admin)
* `client端`框架文档:[点击查看](https://vkdoc.fsq.pub/client/)
* `admin端`框架文档:[点击查看](https://vkdoc.fsq.pub/admin/)
#### 框架学习Q群:`22466457` 欢迎萌新和大佬来使用和共同改进框架
#### 框架体验地址:[点击进入『框架体验地址』](https://vkunicloud.fsq.pub/admin/)
#### 体验账号:
* 高级管理员:test11(账号)123456(密码)可以执行绝大部分功能
* 初级管理员:test12(账号)123456(密码)只能执行查询功能
* 无权限用户:test13(账号)123456(密码)无admin登录权限
[点击体验『表单可视化生成器』](https://vkunicloud.fsq.pub/vk-form-visualizer/)
### 什么是 `vk-unicloud-admin` ?
* `vk-unicloud-admin` 是基于 `uniapp` + `unicloud` + `uni-id` +`element` + `vk-unicloud-router` 的一套快速 `admin` 完整开发框架
* (只兼容PC,只为PC admin而生,但Ta也是uniapp项目,非传统vue-admin项目,你可以用Ta来做你H5、小程序、app的admin管理端)
**注意:TA是uniapp项目,支持uniapp所有H5的API和插件市场所有uni-admin插件**
**最大亮点:使用 `vk-unicloud-admin` 后,即使你是一个纯后端,不会写任何css,照样可以写出功能强大且页面好看的admin管理系统。**
### `vk-unicloud-admin` 主要功能 以及 对开发者的价值
* 1、完美集成 `vk-unicloud-router`,拥有 `vk-unicloud-router` 的所有现成API功能。让你开发事半功倍。[点击查看](https://vkdoc.fsq.pub/client/)
* 2、完美集成 `element` UI框架,并在 `element` 基础上进行了深度封装(支持原生 `element`)[element官网](https://element.eleme.cn/#/zh-CN/component/button)
* 3、`表单可视化拖拽工具`(可直接生成 `vk框架代码 `和 `element` 原生代码 [点击体验](https://vkunicloud.fsq.pub/vk-form-visualizer/)
* 4、`万能表格组件`,通过少量代码即可完成 `CRUD`,同时还拥有较高的自由度。几分钟完成一个页面 `CRUD`。
* 5、`万能表单组件`,通过少量代码即可完成表单渲染 + 表单请求。
* 6、超高自由度,支持使用插槽的形式自定义已有的功能和渲染方式,也支持直接使用 `element` 原生代码来写页面。
* 7、完善的用户角色权限,无需开发即可拥有(权限可精确到每一个云函数)。
* 8、`pages-dev.json` 机制,开发调试页面不会被发布到正式版中。
* 9、只要你开发过传统 `vue admin` 项目,那么上手此框架的学习成本几乎为0
* 10、众多示例代码,为你的云开发之路扫平障碍。
* 11、内置3个主题(纯黑,纯白,黑白)且支持自定义主题。[点击查看主题](https://vkdoc.fsq.pub/admin/1/theme.html)
* 12、群内众多开发者,关于框架使用问题几乎有问必答。Q群:22466457
* 13、更多功能敬请体验。
### 核心功能
#### 一、万能表格
核心思想:通过 JSON 配置渲染页面(简单配置一下,表格就完成了)
如下方JSON用于渲染头像和时间
```js
[
{ key: "avatar", title: "头像", type: "avatar", width: 80, shape:"circle" },
{ key: "_add_time", title: "添加时间", type: "time", width: 160, valueFormat:"yyyy-MM-dd hh:mm:ss" },
]
```
* 1、查询:包含分页、排序、多条件搜索、搜索项折叠、多表连表、数据源预处理、展开行、树状结构等等
* 2、支持多选框(用于批量操作)
* 3、自动生成详情页:点击详情按钮,自动显示详情页弹窗。
* 4、修改:点击修改按钮,自动显示修改表单弹窗。
* 5、删除:点击删除,显示气泡二次确认提示,再点击确定,则删除数据。
* 6、自定义操作按钮:如发货、审核等自定义按钮。
* 7、高自由度:每个字段都有插槽,在内置组件不满足需求的情况下,可以使用插槽自己编写该字段的渲染规则。(内置组件基本上可满足90%以上的渲染需求)
* 8、导出excel表格:通过内置api只需一行代码即可直接导出表格数据。
* 9、导出满足表格查询条件的数据库内所有数据(unicloud的查询有限制每次500条记录,但万能表格解决了此问题,可以导出数据库内全部数据)
* 10、异常重试机制:一般不需要此功能,但是由于unicloud-阿里云空间会偶尔查询失败,此时此功能就派上用场了(会自动重新再查询,用户体验上只是感觉这次查询慢了一点而已(因为第一次失败了,查了2次或2次以上))
* 11、不仅仅支持unicloud云函数请求,还支持http请求。
* 12、支持下方自动显示合计
* 13、更多功能敬请体验 [万能表格文档地址](https://vkdoc.fsq.pub/admin/2/table.html)
#### 二、万能表单
核心思想:通过 JSON 配置渲染表单(简单配置一下,表单就完成了)
如下方JSON用于渲染 一个昵称输入框 和 性别单选按钮组
```js
[
{ key:"nickname", title:"昵称", type:"text" },
{
key:"gender", title:"性别", type:"radio",
data:[
{ value:1, label:"男" },
{ value:2, label:"女" }
]
}
]
```
* 1、自动提交表单
* 2、提交前自动表单验证
* 3、防止表单重复提交(提交后按钮自动进入loading状态,不可再点击)
* 4、同一表单可复用(如一般添加和修改的表单基本是一样的)
* 5、表单复用时,支持字段显示规则(如添加时有A字段,修改时,无A字段等)
* 6、拦截器:表单提交前拦截,执行自己逻辑,再放行或终止。
* 7、高自由度:每个字段都有插槽,在内置组件不满足需求的情况下,可以使用插槽自己编写该字段的渲染规则。(内置组件基本上可满足90%以上的渲染需求)
* 8、重置表单:一键重置表单
* 9、表单可视化拖拽工具 [点击查看](https://vkunicloud.fsq.pub/vk-form-visualizer/#/)
* 10、更多功能敬请体验 [万能表单文档地址](https://vkdoc.fsq.pub/admin/3/form.html)
`vk-unicloud-admin` 框架同时还包含 `vk-unicloud-router` 所有功能,[点击查看vk-unicloud-router功能列表](https://vkdoc.fsq.pub/client/)
### 同时 admin 框架内置了以下页面
* 1、用户管理
* 2、角色管理
* 3、权限管理
* 4、菜单管理
* 5、应用管理
* 6、系统缓存管理
* 7、动态组件数据
* 8、用户登录日志
* 9、系统操作日志
* 10、VK框架组件演示
* 11、element静态功能演示
* 12、素材管理(图片、视频、文件)
* 13、App升级中心管理(新增于1.14.0)
* 14、持续完善中。。。
## 2、快速上手 - 安装步骤
* 1、`项目根目录` 执行 `npm i` 命令(必须先执行此npm命令,安装必要的依赖,否则会无法启动。)
#### 接下来是后端(云函数端)安装步骤
* 通常一个完整的项目分为 `client端`(客户端)、`admin端`(管理端)、`service端`(服务端,这里指云函数端)
#### 这里需要分三种情况
#### [情况一](#情况一):你之前已经在用 `vk-unicloud-router` 框架开发H5、小程序、APP的开发者。
#### [情况二](#情况二):你之前是用别的框架开发H5、小程序、APP,现在只想用VK框架单独开发 admin 项目。
#### [情况三](#情况三):你的项目刚开始,`client端` 和 `admin端` 都还没开发。
### 情况一
#### 思路:因为云函数会互相覆盖,因此我们可以把 `service端(云函数端)` 统一放在 `client端` 的项目中,而 `admin端` 项目 直接绑定 `client端` 项目
#### 安装步骤:
* 1、把 `admin端` 内的 `uniCloud/router/service/admin` 内的以下文件复制到你之前的 `client端` 项目 `uniCloud/router/service/admin` 内(复制整个目录)
* 2、把 `admin端` 内的 `uniCloud/router/service/template` 内的以下文件复制到你之前的 `client端` 项目 `uniCloud/router/service/template` 内(复制整个目录)
* 3、把 `admin端` 内的 `uniCloud/database/db_init/` 目录下的3个数据库表数据导入对应的表内(导入方法:服务空间后台 - 数据库 - 导入)
```js
uni-id-roles 角色表
uni-id-permissions 权限表
opendb-admin-menus 菜单表
```
* 3、把 `admin端` 的服务空间直接绑定 `client端` 项目(注意是 `绑定` 不是 `关联`)(注意是 `绑定` 不是 `关联`)(注意是 `绑定` 不是 `关联`)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/98c6961a-22c8-4d61-833f-f558d848b0e5.png)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/8a9406fd-ff00-48d4-b1fe-6e133c2bf13a.png)
* 4、上传 `router` 云函数
* 5、完成
### 情况二
已完成情况一的请直接跳过情况二和情况三
#### 安装步骤:
* 1、在 `项目根目录` 目录执行 `npm i`
* 2、右键 `uniCloud` 目录 点击 `运行云服务空间初始化向导`
* 3、完成
### 情况三
#### 安装步骤:
* 建议你先使用 `vk-unicloud-router` 框架进行 `client端` 开发,`client端` 开发完成后,使用 `vk-unicloud-admin` 开发 `admin端`
* 当然你也可以先开发 `admin端`,再开发 `client端`。
* 如果先开发 `admin端`,则直接用 `情况二` 的安装步骤即可。
* 如果先开发 `client端`,则先下载 `client端` 开发框架,等 `client端` 开发完后再用 `情况一` 的安装步骤即可 [点击前往下载client端开发框架](https://ext.dcloud.net.cn/plugin?id=2204)
#### 初始admin账号密码:123456
#### 如密码错误,可以强制重置admin账号密码
[点击查看『强制重置admin账号密码步骤』](https://vkdoc.fsq.pub/admin/4/forceResetAdminPassword.html)
### 安装代码快捷提示步骤
* 1、将 `根目录/使用帮助/代码快捷提示/javascript代码块提示.json` 内的代码 复制到 hbx 工具 - 代码块设置 - javascript代码块
* 2、将 `根目录/使用帮助/代码快捷提示/vue代码块提示.json` 内的代码 复制到 hbx 工具 - 代码块设置 - vue代码块
### 其他
删除 `pages.json` 内的 `pages_template/components` 和 `pages_template/element` 分包(此为发布演示版本需要而加,你的项目可以删除,删除后开发模式下依然存在(因为在`pages-dev.json`中配置了),发布到线上环境时自动屏蔽)
### 若提示上传云函数失败,请仔细对比下你的项目 `uniCloud/common` 目录是否跟下图完全一致
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/7ae174db-7666-4301-b017-725edc73e3a3.png)
如果不一致,特别是 `uni-id` 目录下没有这个文件 `uni-id/node_modules/uni-config-center/uni-id/config.json`,则在 `uni-id` 目录执行 `npm i` 试试(如果有这个`uni-id/node_modules`目录,先删除目录,再执行npm i)
### 若新建的用户登录提示用户不存在(数据库明明有数据),此时是因为不同端用户隔离导致的
* 1、先用admin账号登录后台,进入应用管理
因为每个人的 `DCloud Appid`是不一样的,所以你需要在应用管理中添加自己的应用(或直接修改内置的2条数据的appid即可)
`DCloud Appid` 获取方法
复制 `uniapp` 项目根目录的 `manifest.json` 文件内的 `appid`
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/e717232f-0f18-4dee-8437-5dec2c224920.png)
* 2、再进入用户管理,对需要设置的用户点击编辑,设置该用户可以登录哪些端。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-cf0c5e69-620c-4f3c-84ab-f4619262939f/18cd54d5-bedc-4d4f-bda2-7c339c865257.png)
* 3、完成,可以登录了。
#### 如有疑问,请加群:22466457 关于插件的问题包教包会!
[点击查看『完整安装步骤』](https://vkdoc.fsq.pub/admin/1/quickstart.html)
## 3、框架目录结构
[点击查看『目录结构』](https://vkdoc.fsq.pub/admin/1/catalogue.html)
## 4、万能表格
[点击查看『万能表格』](https://vkdoc.fsq.pub/admin/2/table.html)
## 5、万能表单
[点击查看『万能表单』](https://vkdoc.fsq.pub/admin/3/form.html)
[点击查看『表单可视化生成器』](https://vkunicloud.fsq.pub/vk-form-visualizer/)
## 6、用户角色权限
[点击查看『用户角色权限』](https://vkdoc.fsq.pub/admin/4/role.html)
## 7、创建我的第一个带CRUD的页面
[点击查看『如何创建我的第一个带CRUD的页面』](https://vkdoc.fsq.pub/admin/5/template.html)
## 8、HBX代码块提示
[点击查看『HBX代码块提示』](https://vkdoc.fsq.pub/admin/4/codeTips.html)
## 9、admin框架更新步骤指南
[点击查看『admin框架更新步骤指南』](https://vkdoc.fsq.pub/admin/1/update.html)
## 10、强制重置admin账号密码
[点击查看『强制重置admin账号密码』](https://vkdoc.fsq.pub/admin/4/forceResetAdminPassword.html)
## 11、admin框架内置组件参数说明
[点击查看『admin框架内置组件参数说明』](https://vkdoc.fsq.pub/admin/components/1%E3%80%81text.html)
## 20、云函数开发文档
[点击查看『云函数开发文档』](https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/catalogue.html)
## 21、vk.baseDao数据库API
[点击查看『vk.baseDao』数据库API](https://vkdoc.fsq.pub/client/uniCloud/db/api.html)
## 22、数据库缓存API
[点击查看『数据库缓存API』](https://vkdoc.fsq.pub/client/uniCloud/cache/cache.html)
## 23、中间件开发文档
[点击查看『中间件开发文档』](https://vkdoc.fsq.pub/client/uniCloud/middleware/filter.html)
## 24、JS API文档大全
[点击查看『JS API文档大全』](https://vkdoc.fsq.pub/client/jsapi.html)
## 25、前端请求云函数
[点击查看『前端请求云函数』](https://vkdoc.fsq.pub/client/pages/callFunction.html)
## 26、配置前端非法token拦截器
[点击查看『前端请求云函数』](https://vkdoc.fsq.pub/client/pages/interceptor1.html)
## 27、配置前端全局异常拦截器
[点击查看『前端请求云函数』](https://vkdoc.fsq.pub/client/pages/interceptor2.html)
## 28、vuex使用文档
[点击查看『vuex使用文档』](https://vkdoc.fsq.pub/client/pages/vuex.html)
## 29、更多其他功能敬请在框架内体验
### vk-unicloud-admin 框架研究Q群:`22466457` 如有问题或建议可以在群内讨论。
### 如果你觉得框架对你有用,可以在下方进行评论,也可以进行赞赏。
+135
View File
@@ -0,0 +1,135 @@
// 引入自定义公共函数
import myPubFunction from '@/common/function/myPubFunction.js'
// 引入静态菜单
import staticMenu from '@/app.config.menu.js'
// 引入主题配置文件
import themeConfig from '@/common/theme/index.js'
export default {
// 开发模式启用调式模式(请求时会打印日志)
debug: process.env.NODE_ENV !== "production",
// 主云函数名称
functionName: "router",
// 登录页面路径
login: {
url: "/pages/login/index",
testUser: {
show: false, // 是否显示
list: [
{ username: "test11", password: "123456", nickname: "高级管理员" },
{ username: "test12", password: "123456", nickname: "初级管理员" },
{ username: "test13", password: "123456", nickname: "无权限用户" }
]
}
},
// 首页页面路径
index: {
url: '/pages/index/index'
},
// 404 Not Found 错误页面路径
error: {
url: "/pages_plugs/error/404"
},
// 前端默认时区(中国为8)
targetTimezone:8,
globalError: true, // 是否开启全局错误提示
// 需要检查是否登录的页面列表
// let { mode, list } = config.checkTokenPages
checkTokenPages: {
/**
* 如果 mode = 0 则代表自动检测
* 如果 mode = 1 则代表list内的页面需要登录,不在list内的页面不需要登录
* 如果 mode = 2 则代表list内的页面不需要登录,不在list内的页面需要登录
* 注意1: list内是通配符表达式,非正则表达式
* 在无需登录的页面上执行kh或sys函数,也会自动判断是否登录,未登录会自动跳登录页面,登录成功后会自动返回本来要跳转的页面。
*/
mode: 2,
list: [
"/pages/login/*",
"/pages_template/*",
]
},
// 静态文件的资源URL地址
staticUrl: {
// 顶部导航
navBar: {
// 正方形 Logo 160*160
logo: "/static/logo.png",
// 长方形 Logo 224*160
logo1: "/static/logo1.png",
// 横幅 Logo 480*100
logo2: "/static/logo2.png"
},
},
// 自定义公共函数,myPubFunction内的函数可通过vk.myfn.xxx() 调用
myfn: myPubFunction,
// 第三方服务配置
service: {
// 阿里云oss配置
aliyunOSS: {
// 密钥和签名信息 (由于签名的获取比较麻烦,建议初学者使用上传到unicloud的方案,上传到阿里云OSS是给有特殊需求的用户使用)
// 相关文档 : https://help.aliyun.com/document_detail/31925.html?spm=a2c4g.11186623.6.1757.b7987d9czoFCVu
uploadData: {
OSSAccessKeyId: "",
policy: "",
signature: "",
},
// oss上传地址
action: "",
// 根目录名称
dirname: "",
// oss外网访问地址,也可以是阿里云cdn地址
host: "",
// 上传时,是否按用户id进行分组储存
groupUserId: true,
// vk.callFunctionUtil.uploadFile 是否默认上传到阿里云OSS
isDefault: false
}
},
// 全局异常码,可以自定义提示结果
globalErrorCode: {
// 阿里云10秒非正常超时,其实请求还在执行(且一般已经成功了,但前端接受不到成功结果)
"cloudfunction-unusual-timeout": "请求超时,但请求还在执行,请重新进入页面。",
// 请求超时(真正的请求超时)
"cloudfunction-timeout": "请求超时,请重试!",
// 不在预期内的异常(如数据库异常、云函数编译异常等)
"cloudfunction-system-error": "网络开小差了!"
},
// 页面风格
pageStyle: {
// 表单组件和表格组件的size
size: "auto", // medium / small / mini / auto
},
// 左侧菜单
sideBar: {
// 配置静态菜单列表
"staticMenu": staticMenu
},
// 主题配置
theme: {
// 当前使用哪个主题
use: "blackWhite", // white blackWhite black custom
...themeConfig,
// 自定义主题
custom: {
// 左侧菜单样式
leftMenu: {
backgroundColor: "",
subBackgroundColor: "",
textColor: "",
activeTextColor: "",
activeBackgroundColor: "",
collapseActiveTextColor:"",
collapseActiveBackgroundColor: "",
hoverTextColor: "",
hoverBackgroundColor: "",
boxShadow: "",
borderTop: ""
},
// 顶部菜单样式
topMenu: {
backgroundColor: "",
textColor: "",
}
}
}
}
+13
View File
@@ -0,0 +1,13 @@
const debug = process.env.NODE_ENV !== 'production';
// 开发环境和正式环境中都会显示的静态菜单
import menus from './static_menu/menu.json'
// 只在开发环境中显示的静态菜单
import devMenus from './static_menu/menu-dev.json'
var menusList = [];
if (debug && devMenus) {
menusList = menus.concat(devMenus);
} else {
menusList = menus;
}
export default menusList;
+1748
View File
File diff suppressed because it is too large Load Diff
+14
View File
@@ -0,0 +1,14 @@
* 【升级】`vk-unicloud-admin-ui` 包升级至 `1.17.45`
* 【调整】`万能表单` `vk-data-input-editor` 组件的js依赖内置到项目里,防止因quill官方CDN无法访问导致editor组件渲染失败的问题
* 【修复】`万能表单` 部分复杂情况下表单验证未生效的问题
* 【修复】`万能表格` `object` 内 `oneLine:true` 不生效的bug
* 【修复】`万能表单` `object` 内 `disabled` 不生效的bug
* 【修复】`万能表格` `:searched-clean-selection="false"` 时,分页会导致多选框清空的问题
* 【修复】`万能表格` 点击右侧按钮时可能会出现请先选中一行的bug
* 【优化】`pages_plugs/system_uni/vk-pay-orders.vue`页面新增支付渠道区分
* 【优化】`万能表格` 导出的文件名支持自定义扩展名
* 【优化】`万能表格` 新增 `getRowIndex` 方法
##### 框架更新步骤 [点击查看](https://vkdoc.fsq.pub/admin/1/update.html)
##### 框架学习Q群:`22466457` 欢迎萌新和大佬来使用和共同改进框架
##### 如果你觉得框架对你有用,可以在下方进行评论或赞赏。
+47
View File
@@ -0,0 +1,47 @@
/* 这里是你自己写的全局css样式 */
/* 滚动条美化方案开始 去掉下方css的注释即可 */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: rgba(135, 135, 135, 0.1);
}
::-webkit-scrollbar-thumb {
background: rgba(135, 135, 135, 0.4);
border-radius: 6px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(135, 135, 135, 0.8);
}
/* 滚动条美化方案结束 */
/* 富文本编辑器样式开始 */
.ql-indent-1{
padding-left: 3em;
}
.ql-indent-2{
padding-left: 6em;
}
.ql-indent-3{
padding-left: 9em;
}
.ql-indent-4{
padding-left: 12em;
}
.ql-indent-5{
padding-left: 15em;
}
.ql-indent-6{
padding-left: 18em;
}
.ql-indent-7{
padding-left: 21em;
}
.ql-indent-8{
padding-left: 24em;
}
/* 富文本编辑器样式结束 */
+104
View File
@@ -0,0 +1,104 @@
// 这里是uni-app内置的常用样式变量
// uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
// 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
// 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
// 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
// 颜色变量
// 行为相关颜色
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
// 文字基本颜色
$uni-text-color:#333; // 基本色
$uni-text-color-inverse:#fff; // 反色
$uni-text-color-grey:#999; // 辅助灰色,如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
// 背景颜色
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1; //点 击状态颜色
$uni-bg-color-mask:rgba(0, 0, 0, 0.4); // 遮罩颜色
// 边框颜色
$uni-border-color:#e4e7ed;
// 尺寸变量
// 文字尺寸
$uni-font-size-sm:12px;
$uni-font-size-base:14px;
$uni-font-size-lg:16px;
// 图片尺寸
$uni-img-size-sm:20px;
$uni-img-size-base:26px;
$uni-img-size-lg:40px;
// Border Radius
$uni-border-radius-sm: 3px;
$uni-border-radius-base: 5px;
$uni-border-radius-lg: 10px;
$uni-border-radius-circle: 50%;
// 水平间距
$uni-spacing-row-sm: 10px;
$uni-spacing-row-base: 15px;
$uni-spacing-row-lg: 20px;
// 垂直间距
$uni-spacing-col-sm: 5px;
$uni-spacing-col-base: 10px;
$uni-spacing-col-lg: 15px;
// 透明度
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
// 文章场景相关
$uni-color-title: #2C405A; // 文章标题颜色
$uni-font-size-title:20px;
$uni-color-subtitle: #555555; // 二级标题颜色
$uni-font-size-subtitle:18px;
$uni-color-paragraph: #3F536E; // 文章段落颜色
$uni-font-size-paragraph:14px;
$menu-bg-color:#fff; // 一级菜单背景色
$sub-menu-bg-color:darken($menu-bg-color, 8%); // 二级以下菜单背景色
$menu-bg-color-hover:darken($menu-bg-color, 15%); // 菜单 hover 背景颜色
$menu-text-color: #333; // 菜单前景色
$menu-text-color-actived: #409eff; // 菜单激活前景色
$left-window-bg-color: $menu-bg-color; // 左侧窗口背景色
$top-window-bg-color: #fff; // 顶部窗口背景色
$top-window-text-color: #999; // 顶部窗口前景色
// 水平垂直居中
@mixin flex_center_center {
display: flex;
justify-content: center;
align-items: center;
}
// 换行居中
@mixin flex_direction_center {
display: flex;
justify-content: center;
flex-direction: column;
}
// 水平可换行居中
@mixin flex_justify_center{
display: flex;
align-items: center;
flex-wrap: wrap;
}
+15
View File
@@ -0,0 +1,15 @@
/**
* 自定义公共函数
*/
var myfn = {};
/**
* 测试函数test1
* vk.myfn.test1();
*/
myfn.test1 = function(obj = {}) {
let vk = uni.vk;
console.log("执行了自定义公共函数test1");
return obj;
};
export default myfn;
+23
View File
@@ -0,0 +1,23 @@
// 纯黑主题
export default {
// 左侧菜单样式
leftMenu: {
backgroundColor: "#191a23",
subBackgroundColor:"#101117",
textColor: "rgba(255,255,255,0.9)",
activeTextColor: "#ffffff",
activeBackgroundColor: "#2d8cf0",
collapseActiveTextColor:"#2d8cf0",
collapseActiveBackgroundColor: "#2c3239",
hoverTextColor: "#ffffff",
hoverBackgroundColor: "#545f6c",
boxShadow: "0px 0 0px rgba(0,21,4,0.2)",
//boxShadow: "2px 0 2px rgba(0,21,4,0.2)",
//borderTop: "1px solid #101117"
},
// 顶部菜单样式
topMenu: {
backgroundColor: "#191a23",
textColor: "#f0f0f0",
}
}
+23
View File
@@ -0,0 +1,23 @@
// 黑白主题(左侧菜单黑,顶部白)
export default {
// 左侧菜单样式
leftMenu: {
backgroundColor: "#191a23",
subBackgroundColor:"#101117",
textColor: "rgba(255,255,255,0.9)",
activeTextColor: "#ffffff",
activeBackgroundColor: "#2d8cf0",
collapseActiveTextColor:"#2d8cf0",
collapseActiveBackgroundColor: "#2c3239",
hoverTextColor: "#ffffff",
hoverBackgroundColor: "#545f6c",
boxShadow: "0px 0 0px rgba(0,21,4,0.25)",
//boxShadow: "2px 0 4px rgba(0,21,4,0.25)",
//borderTop: "1px solid #101117"
},
// 顶部菜单样式
topMenu: {
backgroundColor: "#ffffff",
textColor: "#999999",
}
}
+9
View File
@@ -0,0 +1,9 @@
import white from './white.js'
import black from './black.js'
import blackWhite from './blackWhite.js'
export default {
white,
black,
blackWhite
};
+23
View File
@@ -0,0 +1,23 @@
// 纯白主题
export default {
// 左侧菜单样式
leftMenu: {
backgroundColor: "#ffffff",
subBackgroundColor:"#ffffff",
textColor: "#303133",
activeTextColor: "#409EFF",
activeBackgroundColor: "#ecf5ff",
collapseActiveTextColor:"#409EFF",
collapseActiveBackgroundColor: "#ecf5ff",
hoverTextColor: "#303133",
hoverBackgroundColor: "#efefef",
boxShadow: "0px 0 0px 0 rgba(29,35,41,0.05)",
//boxShadow: "2px 0 0px 0 rgba(29,35,41,0.05)",
borderTop: "1px solid #f8f8f9"
},
// 顶部菜单样式
topMenu: {
backgroundColor: "#ffffff",
textColor: "#999999",
}
}
File diff suppressed because one or more lines are too long
+543
View File
@@ -0,0 +1,543 @@
/* 全局公共样式 */
/* body,
html {
-webkit-user-select: auto;
user-select: auto;
font-size: 16px;
} */
/* #ifdef H5 */
.uni-app--showleftwindow uni-main {
position: relative;
background-color: #f5f5f5;
}
.uni-mask+.uni-left-window,
.uni-mask+.uni-right-window {
position: fixed;
}
.uni-app--showleftwindow uni-page-head .uni-page-head {
color: #333 !important;
}
uni-page-head .uni-btn-icon {
color: #333 !important;
}
.uni-app--showleftwindow uni-page-head[uni-page-head-type=default]~uni-page-wrapper {
height: auto;
padding-top: 59px;
}
/* .uni-app--showleftwindow uni-page-head~uni-page-wrapper uni-page-body {
padding-top: 44px;
} */
/*
.uni-app--showleftwindow uni-page-wrapper {
position: absolute;
width: 100%;
top: 0;
bottom: 0;
padding: 15px;
overflow-y: auto;
box-sizing: border-box;
background-color: #F5F5F5;
}
.uni-app--showleftwindow uni-page-body {
width: 100%;
min-height: 100%;
box-sizing: border-box;
border-radius: 5px;
box-shadow: -1px -1px 5px 0 rgba(0, 0, 0, .1);
background-color: #fff;
} */
.uni-app--showleftwindow .uni-container .uni-forms {
padding: 15px;
max-width: 600px;
}
/* #endif */
/* #ifndef H5 */
.uni-nav-menu {
height: 100vh;
}
/* #endif */
.pointer {
cursor: pointer;
}
.uni-top-window {
z-index: 998;
overflow: visible;
}
.uni-tips {
font-size: 12px;
color: #666;
}
/* 容器 */
.uni-container {
padding: 15px;
box-sizing: border-box;
}
/* 标题栏 */
.uni-header {
padding: 0 15px;
display: flex;
min-height: 55px;
align-items: center;
justify-content: space-between;
border-bottom: 1px #f5f5f5 solid;
flex-wrap: wrap;
}
.uni-title {
margin-right: 10px;
font-size: 16px;
font-weight: 500;
color: #333;
}
.uni-sub-title {
margin-top: 3px;
font-size: 14px;
color: #999;
}
.uni-link {
color: #3A8EE6;
cursor: pointer;
text-decoration: underline;
}
.uni-group {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
word-break: keep-all;
}
/* 按钮样式 */
.uni-button-group {
margin-top: 30px;
display: flex;
align-items: center;
justify-content: center;
}
.uni-button {
padding: 10px 20px;
font-size: 14px;
border-radius: 4px;
line-height: 1;
margin: 0;
box-sizing: border-box;
overflow: initial;
}
.uni-group .uni-button {
margin: 10px;
}
.uni-group .uni-search {
margin: 10px;
}
.uni-group>.uni-button:first-child {
margin-left: 0;
}
.uni-button:hover,
.uni-button:focus {
opacity: 0.9;
}
.uni-button:active {
opacity: 1;
}
.uni-button-full {
width: 100%;
}
/* 搜索框样式 */
.uni-search {
width: 268px;
height: 28px;
line-height: 28px;
font-size: 12px;
color: #606266;
padding: 0 10px;
border: 1px #dcdfe6 solid;
border-radius: 3px;
}
/* 分页容器 */
.uni-pagination-box {
margin-top: 20px;
}
.uni-input-border,
.uni-textarea-border {
width: 100%;
font-size: 14px;
color: #666;
border: 1px #e5e5e5 solid;
border-radius: 5px;
box-sizing: border-box;
}
.uni-input-border {
padding: 0 10px;
height: 35px;
}
.uni-textarea-border {
padding: 10px;
height: 80px;
}
.uni-disabled {
background-color: #F5F7FA;
color: #C0C4CC;
}
.uni-icon-password-eye {
position: absolute;
right: 8px;
top: 6px;
font-family: uniicons;
font-size: 20px;
font-weight: normal;
font-style: normal;
width: 24px;
height: 24px;
line-height: 24px;
color: #999999;
}
.uni-eye-active {
color: #007AFF;
}
.uni-tabs__header {
position: relative;
background-color: #f5f7fa;
border-bottom: 1px solid #e4e7ed;
}
.uni-tabs__nav-wrap {
overflow: hidden;
margin-bottom: -1px;
position: relative;
}
.uni-tabs__nav-scroll {
overflow: hidden;
}
.uni-tabs__nav {
position: relative;
white-space: nowrap;
}
.uni-tabs__item {
position: relative;
padding: 0 20px;
height: 40px;
box-sizing: border-box;
line-height: 40px;
display: inline-block;
list-style: none;
font-size: 14px;
font-weight: 500;
color: #909399;
margin-top: -1px;
margin-left: -1px;
border: 1px solid transparent;
cursor: pointer;
}
.uni-tabs__item.is-active {
color: #007aff;
background-color: #fff;
border-right-color: #dcdfe6;
border-left-color: #dcdfe6;
}
.uni-form-item-tips {
color: #999;
font-size: 12px;
margin-top: 3px;
position: absolute;
top: 40px;
}
.uni-form-item-empty {
color: #999;
min-height: 36px;
line-height: 36px;
}
::v-deep .uni-forms-item__label .label-text {
color: #606266 !important;
}
::v-deep .flex-center-x .uni-forms-item__content {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.link-btn {
line-height: 26px;
margin-top: 5px;
color: #007AFF;
text-decoration: underline;
cursor: pointer;
}
/* button 重置样式 */
::v-deep button[size=mini] {
line-height: 2.4;
font-size: 12px;
border-radius: 3px;
}
button {
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
box-sizing: border-box;
}
button[type=primary] {
background-color: #409EFF;
border-color: #409EFF;
border-width: 0;
}
button[type=warn] {
background-color: #f56c6c;
border-color: #f56c6c;
border-width: 0;
}
button[type=default] {
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
box-sizing: border-box;
}
button[type=primary][plain] {
border-color: #409EFF;
color: #409EFF;
}
button[type=warn][plain] {
border-color: #f56c6c;
color: #f56c6c;
}
button[type=default][plain] {
border-color: #dcdfe6;
color: #606266;
}
button[plain] {
border-color: #dcdfe6;
color: #606266;
}
button:after {
border-width: 0;
}
.uni-input-placeholder {
color: #999;
}
.uni-pagination-box {
display: flex;
align-items: center;
justify-content: center;
}
.select-picker {
margin-right: 20px;
}
.select-picker button {
margin-top: 5px;
line-height: 29px;
font-size: 14px;
}
.select-picker button text {
color: #999;
}
.select-picker-icon {
margin-left: 8px;
}
/* stat style start */
.m-m {
margin: 15px;
}
.mb-s {
margin-bottom: 5px;
}
.mb-m {
margin-bottom: 15px !important;
}
.mb-l {
margin-bottom: 30px !important;
}
.ml-s {
margin-left: 5px;
}
.ml-m {
margin-left: 15px !important;
}
.ml-l {
margin-left: 30px !important;
}
.p-m {
padding: 15px;
}
.uni-charts-box {
width: 100%;
height: 350px;
}
.uni-stat--x {
border-radius: 4px;
box-shadow: -1px -1px 5px 0 rgba(0, 0, 0, 0.1);
margin-bottom: 15px;
}
.uni-stat__actived {
outline: 1px solid #2979ff;
}
.flex {
display: flex;
flex-wrap: wrap;
align-items: center;
}
.label-text {
font-size: 14px;
font-weight: bold;
color: #555;
margin: auto 0;
margin-right: 5px;
}
.uni-stat-edit--x {
display: flex;
justify-content: space-between;
}
.uni-stat-edit--btn {
cursor: pointer;
}
.uni-stat-datetime-picker {
margin: 15px
}
/* #ifndef APP-NVUE */
@media screen and (max-width: 500px) {
.hide-on-phone {
display: none !important;
}
.uni-charts-box {
width: 100%;
height: 220px;
}
.uni-group .uni-search {
height: 32px;
line-height: 32px;
width: 100%;
margin: 20px 20px 10px 20px;
}
.uni-header {
padding-left: 0px;
padding-right: 0px;
border: unset;
}
.uni-group {
width: 100%;
}
.uni-stat-breadcrumb-on-phone {
padding: 0 20px !important;
border-bottom: 1px #f5f5f5 solid;
}
.uni-stat-datetime-picker {
flex: 1;
}
}
@media screen and (min-width: 500px) {
.dispaly-grid {
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 15px;
}
.pc-flex-wrap {
display: flex;
flex-wrap: wrap;
align-items: center;
}
.uni-stat-datetime-picker {
max-width: 350px;
}
}
/* #endif */
/* #ifndef H5 */
.fix-top-window {
margin-top: 85px;
}
/* #endif */
+35
View File
@@ -0,0 +1,35 @@
### 此目录为 `uni-admin` 官方模板的一些样式文件
* 如果你需要引入 `uni-admin` 官方的一些插件,如[升级中心](https://ext.dcloud.net.cn/plugin?id=4470)
* 你可能会碰到样式错乱的问题,那是因为 `vk-uni-admin` 并没有引入 `uni-admin` 的公共样式
* 但框架已经帮你整理好了公共样式的文件,就在 `common/uni-admin` 目录内
### 在 `App.vue` 中引入 `uni-admin` 的公共样式
```html
<style lang="scss">
@import '@/common/uni-admin/css/uni.css';
@import '@/common/uni-admin/css/uni-icons.css';
</style>
```
### 同时官方的插件一般是不通过 `云函数` 获取数据的,而是通过 `clientDB` 操作数据库(前端操作数据库)
* 因此,你需要上传一些数据库的 `schema.json` 文件
### 如 `升级中心` 需要上传以下两个 `schema.json` 文件
**特别注意:如果 `admin项目` 是绑定 `client项目`,则需要复制到 `client项目` 的 `uniCloud/database/`目录去上传**
* opendb-app-list.schema.json
* opendb-app-versions.schema.json
#### 这些 `schema.json` 文件一般在插件包里就有,直接右键点击对应的文件即可上传。
* 如升级中心的 `schema.json` 目录在 `uni_modules/uni-upgrade-center/uniCloud/database/opendb-app-list.schema.json`
* 同时一般插件还会有一个自己的 `db_init.json` 文件 如 `uni_modules/uni-upgrade-center/uniCloud/database/db_init.json` (也是右键上传)
* 如还有样式问题,建议重启项目试试。
File diff suppressed because one or more lines are too long
+55
View File
@@ -0,0 +1,55 @@
import Vue from 'vue'
import App from './App'
import store from './store'
import config from '@/app.config.js'
// 引入 elementUI
import elementUI from "element-ui";
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(elementUI);
// 引入 高性能表格UI 组件
import UmyUi from 'umy-ui'
import 'umy-ui/lib/theme-chalk/index.css';
Vue.use(UmyUi);
// 引入 vk 实例
import vk from 'uni_modules/vk-unicloud';
Vue.use(vk);
// 初始化 vk框架
Vue.prototype.vk.init({
Vue, // Vue实例
config, // 配置
});
// 引入 vkAdminUI 组件
import vkAdminUI from 'vk-unicloud-admin-ui';
import 'vk-unicloud-admin-ui/theme/index.css';
Vue.use(vkAdminUI);
// 自动注册全局组件(必须加在Vue.use(vkAdminUI);的后面)
const modulesFiles = require.context('./components', true, /\.vue$/);
modulesFiles.keys().map((modulePath, index) => {
const moduleNames = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
const moduleSplit = moduleNames.split("/");
const moduleName = moduleSplit[0];
if (moduleSplit.length === 2 && moduleName === moduleSplit[1]) {
const value = modulesFiles(modulePath);
let moduleItem = value.default;
Vue.component(moduleName, moduleItem);
}
});
// 引入 自定义全局css 样式
import '@/common/css/app.scss';
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
store,
...App
})
app.$mount()
+88
View File
@@ -0,0 +1,88 @@
{
"name" : "jinjiuxin-admin",
"appid" : "__UNI__E3B97BE",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
"app-plus" : {
"usingComponents" : true,
"nvueCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
"modules" : {},
"distribute" : {
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
"ios" : {},
"sdkConfigs" : {}
}
},
"quickapp" : {},
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"h5" : {
"template" : "template.h5.html",
"router" : {
"mode" : "hash",
"base" : "/admin/"
},
"devServer" : {
"disableHostCheck" : true
},
"sdkConfigs" : {
"maps" : {
"qqmap" : {
"key" : "3EXBZ-3NYCW-L5MRG-ONN2B-FJYR6-H7BSU"
}
}
}
},
"vueVersion" : "2"
}
+125
View File
@@ -0,0 +1,125 @@
{
"name": "vk-unicloud-admin",
"version": "1.17.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"async-validator": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
"requires": {
"babel-runtime": "6.x"
}
},
"babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"deepmerge": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
},
"element-ui": {
"version": "2.15.13",
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz",
"integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==",
"requires": {
"async-validator": "~1.8.1",
"babel-helper-vue-jsx-merge-props": "^2.0.0",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1"
}
},
"normalize-wheel": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
"integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"sortablejs": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
"integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
},
"throttle-debounce": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
},
"umy-table": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/umy-table/-/umy-table-1.1.8.tgz",
"integrity": "sha512-yqPMFwZ6MUNqI73KamsNKBTbHRA7VuVZDEWobaySghtf4n/s7INuTNQoADB/ROVK57WOXr99Xpnol0aMqGlASA==",
"requires": {
"async-validator": "~1.8.1",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1",
"vuedraggable": "^2.23.2",
"xe-utils": "^3.0.0-beta.12"
}
},
"umy-ui": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/umy-ui/-/umy-ui-1.1.6.tgz",
"integrity": "sha512-wX0S29B5sFn8q0MvU9PEl8DGZeQmZXOJlLrwaCJ2UHiIQZCANWgXMBjjQgpaequ1gRZ8BekEu7Sn7hJccm9YMQ==",
"requires": {
"async-validator": "~1.8.1",
"deepmerge": "^1.2.0",
"normalize-wheel": "^1.0.1",
"resize-observer-polyfill": "^1.5.0",
"throttle-debounce": "^1.0.1",
"umy-table": "1.1.8",
"vuedraggable": "^2.23.2",
"xe-utils": "^3.0.0-beta.12"
}
},
"vk-unicloud-admin-ui": {
"version": "1.17.46",
"resolved": "https://registry.npmjs.org/vk-unicloud-admin-ui/-/vk-unicloud-admin-ui-1.17.46.tgz",
"integrity": "sha512-VJvi8Gm3mfZOFEilIrZ1bSoi192ov9hPzSFzkR6l62pqJ3UEwgjTr5L2gQqxw4twb+y5qDmWZPS4dQMwya+iiQ=="
},
"vuedraggable": {
"version": "2.24.3",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
"integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
"requires": {
"sortablejs": "1.10.2"
}
},
"xe-utils": {
"version": "3.5.13",
"resolved": "https://registry.npmjs.org/xe-utils/-/xe-utils-3.5.13.tgz",
"integrity": "sha512-ORT6ghCRk0mUVavMBxetcPzUPskS6NGfntzpWazJ86e+XU0uK4HwHfDhN/jKATiyInrOH5RwQo9SO/+DB8XeBw=="
}
}
}
+96
View File
@@ -0,0 +1,96 @@
{
"id": "vk-unicloud-admin",
"name": "vk-unicloud-admin",
"version": "1.17.3",
"displayName": "【开箱即用】vk-unicloud-admin-快速开发框架-打造unicloud最好用的admin",
"description": "vk-unicloud-admin是基于uniapp+unicloud+uni-id+vk-router+element的一套快速PC admin企业级开发框架。小白几分钟即完成一个页面CRUD。",
"keywords": [
"vk-unicloud-admin",
"支持表单可视化拖拽生成代码",
"vk云开发",
"uniapp、uni-id、vk-unicloud-router、vk-admin、element",
"内置众多API、工具包"
],
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": "https://gitee.com/vk-uni/vk-unicloud-admin",
"author": "VK",
"license": "MIT",
"homepage": "https://vkdoc.fsq.pub/admin/",
"dependencies": {
"element-ui": "2.15.13",
"umy-ui": "1.1.6",
"vk-unicloud-admin-ui": "^1.17.45"
},
"engines": {
"HBuilderX": "^3.1.10"
},
"dcloudext": {
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": "370725567"
},
"declaration": {
"ads": "无",
"data": "插件不采集任何数据",
"permissions": "无"
},
"npmurl": "https://vkdoc.fsq.pub/admin/",
"type": "unicloud-template-project"
},
"uni_modules": {
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "n",
"app-nvue": "n"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "n",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "n",
"阿里": "n",
"百度": "n",
"字节跳动": "n",
"QQ": "n",
"钉钉": "u",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "n",
"联盟": "n"
},
"Vue": {
"vue2": "y",
"vue3": "n"
}
}
}
}
}
+61
View File
@@ -0,0 +1,61 @@
{
"subPackages": [{
"root": "pages_template/components",
"pages": [
{ "path": "icons/vk-icons" },
{ "path": "icons/element-icons" },
{ "path": "table/table-basic" },
{ "path": "table/table-easy" },
{ "path": "table/table-query" },
{ "path": "table/table-expand" },
{ "path": "form/form-array-object" },
{ "path": "form/form-basic" },
{ "path": "form/form-inline" },
{ "path": "form/form-dialog" },
{ "path": "form/form-pro" },
{ "path": "form/form-dialog-2" },
{ "path": "form/form-slot" },
{ "path": "detail/detail-basic" },
{ "path": "detail/detail-table" },
{ "path": "dialog/dialog-basic" },
{ "path": "dialog/dialog-form" },
{ "path": "dialog/dialog-table" },
{ "path": "upload/upload-basic" },
{ "path": "upload/upload-drag" },
{ "path": "input/input-address" },
{ "path": "input/input-money" },
{ "path": "input/input-number" },
{ "path": "input/input-number-box" },
{ "path": "input/input-percentage" },
{ "path": "input/input-json" },
{ "path": "input/input-province" },
{ "path": "input/input-select" },
{ "path": "input/input-remote-select" },
{ "path": "input/input" },
{ "path": "editor/editor" }
]
},
{
"root": "pages_template/element",
"pages": [
{ "path": "detail/detail" },
{ "path": "form/basic-form" },
{ "path": "form/advanced-form" },
{ "path": "form/step-form" },
{ "path": "setting/account" },
{ "path": "popup/alert" },
{ "path": "popup/dialog" },
{ "path": "popup/drawer" },
{ "path": "popup/loading" },
{ "path": "popup/message" },
{ "path": "popup/message-box" },
{ "path": "popup/notification" },
{ "path": "popup/popconfirm" },
{ "path": "popup/popover" },
{ "path": "popup/tooltip" },
{ "path": "result/fail" },
{ "path": "result/success" }
]
}
]
}
+24
View File
@@ -0,0 +1,24 @@
const debug = process.env.NODE_ENV !== 'production';
var devPages;
try {
// 只在开发环境中才会被HBX打包的页面
devPages = require('./pages-dev.json');
} catch (err) {}
module.exports = function(pagesJson){
try {
let newDevPages = JSON.parse(JSON.stringify(devPages));
if(debug && newDevPages){
for(let keyName in newDevPages){
let item = newDevPages[keyName]
if (Object.prototype.toString.call(item) === "[object Array]") {
pagesJson[keyName].push(...item);
}else if(Object.prototype.toString.call(item)==='[object Object]'){
pagesJson[keyName] = Object.assign(pagesJson[keyName], item);
}
}
}
} catch (err) {
console.log(err);
}
return pagesJson;
}
+125
View File
@@ -0,0 +1,125 @@
{
"pages": [
{ "path": "pages/index/index" },
{ "path": "pages/product/product-category/list" },
{ "path": "pages/product/goods/list" },
{ "path": "pages/config/site"},
{ "path": "pages/enquiry/template/list"},
{ "path": "pages/enquiry/attributes/list"},
{
"path": "pages/login/index",
"style": {
"topWindow": false,
"leftWindow": false,
"navigationBarTitleText": "登录"
}
}
],
"subPackages": [{
"root": "pages_plugs",
"pages": [
{ "path": "error/404", "style": { "navigationBarTitleText": "页面不存在" } },
{ "path": "error/403", "style": { "navigationBarTitleText": "无权访问" } },
{ "path": "error/500", "style": { "navigationBarTitleText": "服务器出错了" } },
{ "path": "system/user/list" },
{ "path": "system/role/list" },
{ "path": "system/permission/list" },
{ "path": "system/menu/list" },
{ "path": "system/app/list" },
{ "path": "system/app-upgrade-center/list" },
{ "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/vk-pay-orders" }
]
},
{
"root": "pages_template/components",
"pages": [
{ "path": "icons/vk-icons" },
{ "path": "icons/element-icons" },
{ "path": "icons/vk-icons-page", "style": { "topWindow": false,"leftWindow": false } },
{ "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": "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" },
{ "path": "form/form-dialog-2" },
{ "path": "form/form-slot" },
{ "path": "detail/detail-basic" },
{ "path": "detail/detail-table" },
{ "path": "dialog/dialog-basic" },
{ "path": "dialog/dialog-form" },
{ "path": "dialog/dialog-table" },
{ "path": "upload/upload-basic" },
{ "path": "upload/upload-drag" },
{ "path": "input/input-address" },
{ "path": "input/input-money" },
{ "path": "input/input-number" },
{ "path": "input/input-number-box" },
{ "path": "input/input-percentage" },
{ "path": "input/input-json" },
{ "path": "input/input-province" },
{ "path": "input/input-select" },
{ "path": "input/input-remote-select" },
{ "path": "input/input" },
{ "path": "editor/editor" }
]
},
{
"root": "pages_template/element",
"pages": [
{ "path": "detail/detail" },
{ "path": "form/basic-form" },
{ "path": "form/advanced-form" },
{ "path": "form/step-form" },
{ "path": "setting/account" },
{ "path": "popup/alert" },
{ "path": "popup/dialog" },
{ "path": "popup/drawer" },
{ "path": "popup/loading" },
{ "path": "popup/message" },
{ "path": "popup/message-box" },
{ "path": "popup/notification" },
{ "path": "popup/popconfirm" },
{ "path": "popup/popover" },
{ "path": "popup/tooltip" },
{ "path": "result/fail" },
{ "path": "result/success" }
]
}
],
"globalStyle": {
"navigationStyle": "custom",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "管理后台",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"topWindow": {
"path": "windows/topWindow",
"style": {
"height": "100px"
},
"matchMedia": {
"minWidth": 0
}
},
"leftWindow": {
"path": "windows/leftWindow",
"style": {
"width": "240px"
}
}
}
+147
View File
@@ -0,0 +1,147 @@
<template>
<view>
<vk-data-form v-model="form1.data" :rules="form1.props.rules" :action="form1.props.action"
:form-type="form1.props.formType" :columns='form1.props.columns' label-width="120px"
@success="form1.props.show = false;refresh();"></vk-data-form>
</view>
</template>
<script>
export default {
data() {
return {
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort: 0
},
// 表单属性
props: {
// 表单请求地址
action: "admin/site_config/sys/update",
// 表单字段显示规则
columns: [
{
title: "基本信息",
type: "bar-title",
placeholder: ""
},
{
key: "siteLogo",
title: "LOGO",
type: "image",
placeholder: "请上传LOGO",
limit: 1
},
{
key: "siteTitle",
title: "网站标题",
type: "text",
placeholder: "请输入网站标题"
},
{
key: "siteDesc",
title: "网站描述",
type: "text",
placeholder: "请输入网站描述"
},
{
key: "siteCopyright",
title: "版权信息",
type: "text",
placeholder: "请输入版权信息"
},
{
key: "siteIcpNumber",
title: "ICP备案号",
type: "text",
placeholder: "请输入ICP备案号"
},
{
title: "联系方式",
type: "bar-title",
placeholder: ""
},
{
key: "companyName",
title: "公司名称",
type: "text",
placeholder: "请输入公司名称"
},
{
key: "companyAddress",
title: "公司地址",
type: "text",
placeholder: "请输入公司地址"
},
{
key: "companyPhone",
title: "公司电话",
type: "text",
placeholder: "请输入公司电话"
},
{
key: "companyEmail",
title: "公司邮箱",
type: "text",
placeholder: "请输入公司邮箱"
},
{
key: "companyServicePhone",
title: "客服热线",
type: "text",
placeholder: "请输入客服热线"
},
{
key: "companyMobileSiteImage",
title: "手机站二维码",
type: "image",
limit: 1,
placeholder: "请上传收手机站上二维码"
},
{
key: "companyGzhImage",
title: "公众号二维码",
type: "image",
limit: 1,
placeholder: "请上传公众号二维码"
},
],
// 表单验证规则
rules: {
sort: [{
type: 'number',
message: '排序值必须为数字'
}],
name:[
{ required:true, message:'分类名称不能为空', trigger:'blur' },
],
},
// add 代表添加 update 代表修改
formType: "",
// 是否显示表单的弹窗
show: false
}
},
};
},
onLoad() {
//
vk.callFunction({
url: 'admin/site_config/sys/detail',
title: '请求中...',
success: (res) => {
this.form1.data = res.data
}
});
},
methods: {
},
}
</script>
<style lang="scss">
</style>
+320
View File
@@ -0,0 +1,320 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query v-model="queryForm1.formData" :columns="queryForm1.columns"
@search="search"></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view>
<el-row>
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<!-- 批量操作 -->
<el-dropdown v-if="table1.multipleSelection" :split-button="false" trigger="click" @command="batchBtn">
<!-- <el-button type="danger" size="small" style="margin-left: 20rpx;"
:disabled="table1.multipleSelection.length === 0">
批量操作<i class="el-icon-arrow-down el-icon--right"></i>
</el-button> -->
<el-dropdown-menu slot="dropdown">
<!-- <el-dropdown-item :command="1">批量操作1</el-dropdown-item>
<el-dropdown-item :command="2">批量操作2</el-dropdown-item> -->
</el-dropdown-menu>
</el-dropdown>
</el-row>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table ref="table1" :action="table1.action" :columns="table1.columns" :query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']" :default-expand-all="false" @update="updateBtn"
@delete="deleteBtn" @current-change="currentChange" @selection-change="selectionChange"></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog v-model="form1.props.show" :title="form1.props.title" width="1000px" mode="form"
:close-on-click-modal="false">
<vk-data-form v-model="form1.data" :rules="form1.props.rules" :action="form1.props.action"
:form-type="form1.props.formType" :columns='form1.props.columns' label-width="120px"
@success="form1.props.show = false;refresh();"></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {
},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/enquiry/attributes/sys/getList",
// 表格字段显示规则
columns: [
// {
// key: "_id",
// title: "id",
// type: "text",
// width: 220
// },
{
key: "label",
title: "名称",
type: "text",
width: 220,
align: "left",
},
{
key:"values", title:"可选值", type:"tag",width: 500
},
{ key: "enable", title: "启用", type: "switch", activeValue: true, inactiveValue: false, width: 100 },
// {
// key: "remark",
// title: "备注",
// type: "text",
// align: "left",
// width: 220
// },
{
key: "sort",
title: "排序",
type: "number",
align: "left",
width: 80,
},
{
key: "_add_time",
title: "添加时间",
type: "time",
align: "left",
width: 160,
sortable: "custom"
},
{
key: "_add_time",
title: "距离现在",
type: "dateDiff",
align: "left",
width: 120
},
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
// {
// key: "name",
// title: "名称",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "remark",
// title: "备注",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "_add_time",
// title: "添加时间",
// type: "datetimerange",
// width: 400,
// mode: "[]"
// },
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort: 0,
enable: true
},
// 表单属性
props: {
// 表单请求地址
action: "",
// 表单字段显示规则
columns: [
{
key:"label", title:"属性名称", type:"text", placeholder:"输入属性名称",
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{ key: "enable", title: "启用", type: "switch", activeValue: true, inactiveValue: false, width: 100 },
{
key:"values", title:"可选值", type:"tag", placeholder:"输入可选值",
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key: "sort",
title: "排序",
type: "number",
precision: 0,
placeholder: "请输入排序值",
},
],
// 表单验证规则
rules: {
sort: [{
type: 'number',
message: '排序值必须为数字'
},{ required:true, message:'不能为空', trigger:'blur' },],
label:[
{ required:true, message:'属性名称不能为空', trigger:'blur' },
],
values:[
{ required:true, message:'可选值不能为空', trigger:'blur' },
],
},
// add 代表添加 update 代表修改
formType: "",
// 是否显示表单的弹窗
show: false
}
},
// 其他弹窗表单
formDatas: {},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm() {
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search() {
that.$refs.table1.search();
},
// 刷新
refresh() {
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow() {
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val) {
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn() {
that.resetForm();
that.form1.props.action = 'admin/enquiry/attributes/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({
item
}) {
that.form1.props.action = 'admin/enquiry/attributes/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
that.form1.data = item;
},
// 删除按钮
deleteBtn({
item,
deleteFn
}) {
deleteFn({
action: "admin/enquiry/attributes/sys/delete",
data: {
_id: item._id
},
});
},
// 监听 - 批量操作的按钮点击事件
batchBtn(index) {
switch (index) {
case 1:
vk.toast("批量操作按钮1");
break;
case 2:
vk.toast("批量操作按钮2");
break;
default:
break;
}
}
},
// 监听属性
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
.page-body {}
</style>
+335
View File
@@ -0,0 +1,335 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query v-model="queryForm1.formData" :columns="queryForm1.columns"
@search="search"></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view>
<el-row>
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<!-- 批量操作 -->
<el-dropdown v-if="table1.multipleSelection" :split-button="false" trigger="click" @command="batchBtn">
<!-- <el-button type="danger" size="small" style="margin-left: 20rpx;"
:disabled="table1.multipleSelection.length === 0">
批量操作<i class="el-icon-arrow-down el-icon--right"></i>
</el-button> -->
<el-dropdown-menu slot="dropdown">
<!-- <el-dropdown-item :command="1">批量操作1</el-dropdown-item>
<el-dropdown-item :command="2">批量操作2</el-dropdown-item> -->
</el-dropdown-menu>
</el-dropdown>
</el-row>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table ref="table1" :action="table1.action" :columns="table1.columns" :query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']" :default-expand-all="false" @update="updateBtn"
@delete="deleteBtn" @current-change="currentChange" @selection-change="selectionChange"></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog v-model="form1.props.show" :title="form1.props.title" width="1000px" mode="form"
:close-on-click-modal="false">
<vk-data-form v-model="form1.data" :rules="form1.props.rules" :action="form1.props.action"
:form-type="form1.props.formType" :columns='form1.props.columns' label-width="120px"
@success="form1.props.show = false;refresh();"></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {
},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/enquiry/template/sys/getList",
// 表格字段显示规则
columns: [
// {
// key: "_id",
// title: "id",
// type: "text",
// width: 220
// },
{
key: "name",
title: "名称",
type: "text",
width: 220,
align: "left",
},
{ key: "enable", title: "启用", type: "switch", activeValue: true, inactiveValue: false, width: 100 },
// {
// key: "remark",
// title: "备注",
// type: "text",
// align: "left",
// width: 220
// },
{
key: "sort",
title: "排序",
type: "number",
align: "left",
width: 80,
},
{
key: "_add_time",
title: "添加时间",
type: "time",
align: "left",
width: 160,
sortable: "custom"
},
{
key: "_add_time",
title: "距离现在",
type: "dateDiff",
align: "left",
width: 120
},
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
// {
// key: "name",
// title: "名称",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "remark",
// title: "备注",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "_add_time",
// title: "添加时间",
// type: "datetimerange",
// width: 400,
// mode: "[]"
// },
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort: 0,
enable: true
},
// 表单属性
props: {
// 表单请求地址
action: "",
// 表单字段显示规则
columns: [{
key: "name",
title: "模板名称",
type: "text",
placeholder: "请输入模板名称"
},
{ key: "enable", title: "启用", type: "switch", activeValue: true, inactiveValue: false },
{
key: "sort",
title: "排序",
type: "number",
precision: 0,
placeholder: "请输入排序值",
},
{
key:"extraAttributes", title:"额外属性", type:"array<object>", itemWidth:260,
showAdd:true,
showClear:true,
// 新增一行时,该行的默认值
defaultValue:{
label:""
},
rightBtns:['copy', 'delete'],
// 每行每个字段对应的渲染规则
columns:[
{
key:"label", title:"属性名称", type:"text", placeholder:"输入属性名称",
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"values", title:"可选值", type:"tag", placeholder:"输入可选值",
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
]
},
],
// 表单验证规则
rules: {
sort: [{
type: 'number',
message: '排序值必须为数字'
},{ required:true, message:'不能为空', trigger:'blur' },],
enable:[
{ required:true, message:'不能为空', trigger:'blur' },
],
name:[
{ required:true, message:'模板名称不能为空', trigger:'blur' },
],
},
// add 代表添加 update 代表修改
formType: "",
// 是否显示表单的弹窗
show: false
}
},
// 其他弹窗表单
formDatas: {},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm() {
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search() {
that.$refs.table1.search();
},
// 刷新
refresh() {
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow() {
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val) {
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn() {
that.resetForm();
that.form1.props.action = 'admin/enquiry/template/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({
item
}) {
that.form1.props.action = 'admin/enquiry/template/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
that.form1.data = item;
},
// 删除按钮
deleteBtn({
item,
deleteFn
}) {
deleteFn({
action: "admin/enquiry/template/sys/delete",
data: {
_id: item._id
},
});
},
// 监听 - 批量操作的按钮点击事件
batchBtn(index) {
switch (index) {
case 1:
vk.toast("批量操作按钮1");
break;
case 2:
vk.toast("批量操作按钮2");
break;
default:
break;
}
}
},
// 监听属性
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
.page-body {}
</style>
+79
View File
@@ -0,0 +1,79 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
这里是后台首页
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
pageTo(path){
vk.navigateTo(path);
},
load(e){
console.log(1,e);
},
error(e){
console.log(2,e);
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
+276
View File
@@ -0,0 +1,276 @@
<template>
<view class="page-body no-user-select">
<view class="login-view">
<image class="image" :src="vk.getVuex('$app.staticUrl.navBar.logo')" mode="aspectFit"></image>
<text class="login-title">欢迎登录</text>
<el-form :model="form1" status-icon :rules="rules" ref="form1" label-width="60px" class="form-view">
<el-form-item label="账 号" prop="pass" class="form-item"><el-input class="input" type="text" v-model="form1.username" placeholder="请输入用户名"></el-input></el-form-item>
<el-form-item label="密 码" prop="checkPass" class="form-item">
<el-input class="input" type="password" v-model="form1.password" show-password placeholder="请输入密码" maxlength="20"></el-input>
</el-form-item>
<view class="password-box">
<view class="remember-password">
<el-checkbox v-model="checked"><text class="tips" style="font-size: 12px;">记住密码</text></el-checkbox>
</view>
<view class="forget-password"><text @click="forgetPassWord" style="font-size: 12px;">忘记密码?</text></view>
</view>
<el-button class="login_but" type="primary" @click="submit">登录</el-button>
</el-form>
<view v-if="testUser && testUser.show && testUser.list && testUser.list.length > 0" class="test-user-list">
<view>体验账号:</view>
<view v-for="(item, index) in testUser.list" :key="index" class="test-user-item">
<text class="test-user-item-nickname">{{ item.nickname }}</text>
<text class="test-user-item-username">账号:{{ item.username }}</text>
<text class="test-user-item-password">密码:{{ item.password }}</text>
</view>
</view>
<!-- <view class="btns-box">
<text @click="shortMessageLogin">短信验证码登录</text>
<text @click="noCccount">没有账号?</text>
<text class="register" @click="register">立即注册</text>
</view> -->
</view>
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
import config from "@/app.config.js";
export default {
data() {
return {
...config.staticUrl.navBar,
testUser: (config.login && config.login.testUser) || {}, // 体验账号信息
// 表单信息
form1: {
username: "",
password: "",
needPermission: true
},
checked: false, // 是否记录密码
// 表单验证规则
rules: {
},
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
mounted() {},
methods: {
// 页面初始化
init() {
let that = this;
let { login } = vk.getVuex("$user");
if (login) {
if (login.username) that.form1.username = login.username;
if (login.password) {
that.form1.password = login.password;
that.checked = true;
}
}
if (!getApp().isAllowLoginBackground()) {
return false;
}
// 执行以下函数,主要是为了使云函数提前热启动
vk.userCenter.checkToken({
loading: true,
success: data => {
that.login_success(data);
}
});
},
// 表单提交
submit() {
let that = this;
vk.userCenter.login({
data: that.form1,
success: data => {
if (!getApp().isAllowLoginBackground(data.userInfo)) {
vk.alert("您的账户无登陆权限");
return false;
}
if (that.checked) {
// 账号密码保存本地缓存
vk.setVuex("$user.login.username", that.form1.username);
vk.setVuex("$user.login.password", that.form1.password);
} else {
// 删除本地缓存
vk.setVuex("$user.login.username", "");
vk.setVuex("$user.login.password", "");
}
that.login_success(data);
}
});
},
//登陆成功
login_success(data={}) {
let { userInfo={} } = data;
// 先清空下菜单缓存
vk.setVuex("$app.inited", false);
vk.setVuex("$app.navMenu", []);
// 再执行init函数
getApp().init();
// 最后跳转到首页或页面返回
let pages = getCurrentPages();
if (
pages.length >= 2 &&
pages[pages.length - 2] &&
pages[pages.length - 2].route &&
pages[pages.length - 2].route.indexOf("login/") == -1
) {
// 如果上一个页面不是login目录下的,则调上一个页面
vk.reLaunch("/" + pages[pages.length - 2].route);
} else {
// 否则进入首页
vk.navigateToHome();
}
},
forgetPassWord() {
console.log(`忘记密码了`);
vk.toast("暂不支持", "none");
},
shortMessageLogin() {
console.log(`短信登录`);
},
noCccount() {
console.log(`没有账号`);
},
register() {
console.log(`立即注册`);
vk.toast("暂不支持注册", "none");
}
}
};
</script>
<style lang="scss" scoped>
.page-body {
width: 100%;
height: 100vh;
background: #46d0e7 url(../../static/bg/007.jpg?t=2) no-repeat fixed center center;
background-size: cover;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
.login-view:hover {
background-color: rgba(255, 255, 255, 1);
}
.login-view {
width: 100%;
max-width: 420px;
border-radius: 7px;
background-color: rgba(255, 255, 255, 0.97);
padding: 40px 30px;
box-sizing: border-box;
border: 1px solid #f5f5f5;
box-shadow: 6px 6px 10px 0px #888888;
::v-deep .input .el-input__inner {
border: 0 !important;
background-color: rgba(255, 255, 255, 0);
}
.image {
display: block;
width: 64px;
height: 64px;
margin: 0 auto;
margin-bottom: 15px;
border-radius: 6px;
}
.form-view {
margin-top: 20px;
.form-item {
border-bottom: 1px solid #f5f5f5;
}
}
.login-title {
display: block;
text-align: center;
color: #121212;
font-size: 22px;
letter-spacing: 2px;
}
.login_but {
width: 100%;
letter-spacing: 4px;
font-size: 17px;
}
.password-box {
font-size: 13px;
color: #b1b1b1;
margin-bottom: 20px;
display: flex;
align-items: center;
.remember-password {
flex: 1;
cursor: pointer;
user-select: none;
}
.forget-password {
flex: 1;
text-align: right;
cursor: pointer;
user-select: none;
&:active {
color: #3a6ffd;
}
}
}
.tips {
color: #b1b1b1;
}
.btns-box {
font-size: 13px;
color: #b1b1b1;
padding-top: 25px;
display: flex;
box-sizing: border-box;
text {
cursor: pointer;
&:first-of-type {
flex: 1;
}
&:nth-of-type(2) {
margin-right: 8px;
}
}
.register {
color: #46d0e7;
}
}
}
.test-user-list {
margin-top: 10px;
user-select: text;
font-size: 12px;
color: #606266;
.test-user-item {
margin: 5px 0;
.test-user-item-nickname {
}
.test-user-item-username {
margin-left: 10px;
}
.test-user-item-password {
margin-left: 10px;
}
}
}
}
</style>
+358
View File
@@ -0,0 +1,358 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query v-model="queryForm1.formData" :columns="queryForm1.columns"
@search="search"></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view>
<el-row>
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<!-- 批量操作 -->
<el-dropdown v-if="table1.multipleSelection" :split-button="false" trigger="click" @command="batchBtn">
<!-- <el-button type="danger" size="small" style="margin-left: 20rpx;"
:disabled="table1.multipleSelection.length === 0">
批量操作<i class="el-icon-arrow-down el-icon--right"></i>
</el-button> -->
<el-dropdown-menu slot="dropdown">
<!-- <el-dropdown-item :command="1">批量操作1</el-dropdown-item>
<el-dropdown-item :command="2">批量操作2</el-dropdown-item> -->
</el-dropdown-menu>
</el-dropdown>
</el-row>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table ref="table1" :action="table1.action" :columns="table1.columns" :query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']" :default-expand-all="false" @update="updateBtn"
@delete="deleteBtn" @current-change="currentChange" @selection-change="selectionChange"></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog v-model="form1.props.show" :title="form1.props.title" width="1000px" mode="form"
:close-on-click-modal="false">
<vk-data-form v-model="form1.data" :rules="form1.props.rules" :action="form1.props.action"
:form-type="form1.props.formType" :columns='form1.props.columns' label-width="120px"
@success="form1.props.show = false;refresh();"></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {
},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/spot/goods/sys/getList",
// 表格字段显示规则
columns: [
// {
// key: "_id",
// title: "id",
// type: "text",
// width: 220
// },
{
key: "name",
title: "名称",
type: "text",
width: 220,
align: "left",
},
{
key: "address",
title: "供货地",
type: "address",
width: 220,
align: "left",
},
{
key: "sort",
title: "排序",
type: "number",
align: "left",
width: 80,
},
{
key: "files",
title: "附件",
type: "file",
// align: "left",
width: 220
},
{
key: "_add_time",
title: "添加时间",
type: "time",
align: "left",
width: 160,
sortable: "custom"
},
{
key: "_add_time",
title: "距离现在",
type: "dateDiff",
align: "left",
width: 120
},
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
// {
// key: "name",
// title: "名称",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "remark",
// title: "备注",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "_add_time",
// title: "添加时间",
// type: "datetimerange",
// width: 400,
// mode: "[]"
// },
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort: 0,
name: ''
},
// 表单属性
props: {
// 表单请求地址
action: "",
// 表单字段显示规则
columns: [
{
key: "name",
title: "名称",
type: "text",
placeholder: "请输入分类名称",
disabled: true
},
{
key: "categoryIds",
title: "分类",
type: "checkbox",
placeholder: "请选分类",
action: "admin/spot/category/sys/getList",
actionData: {level: 2},
min:1,
max: 5,
props: {
list: "rows",
value: "_id",
label: "name",
children: "children"
},
watch: (obj)=> {
console.log(obj);
this.form1.data.name = obj.option.map(item => item.name),join("、")
}
},
{
key: "address",
title: "供货地",
type: "address",
placeholder: "请输入供货地",
},
{
key: "files",
title: "附件",
type: "file",
},
{
key: "remark",
title: "备注",
type: "textarea",
maxlength: "99",
showWordLimit: true,
autosize: {
minRows: 2,
maxRows: 10
},
},
{
key: "sort",
title: "排序",
type: "number",
precision: 0,
placeholder: "请输入排序值",
},
],
// 表单验证规则
rules: {
sort: [{
type: 'number',
message: '排序值必须为数字'
}],
name:[
{ required:true, message:'分类名称不能为空', trigger:'blur' },
],
},
// add 代表添加 update 代表修改
formType: "",
// 是否显示表单的弹窗
show: false
}
},
// 其他弹窗表单
formDatas: {},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm() {
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search() {
that.$refs.table1.search();
},
// 刷新
refresh() {
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow() {
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val) {
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn() {
that.resetForm();
that.form1.props.action = 'admin/spot/goods/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({
item
}) {
that.form1.props.action = 'admin/spot/goods/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
that.form1.data = item;
},
// 删除按钮
deleteBtn({
item,
deleteFn
}) {
deleteFn({
action: "admin/product/category/sys/delete",
data: {
_id: item._id
},
});
},
// 监听 - 批量操作的按钮点击事件
batchBtn(index) {
switch (index) {
case 1:
vk.toast("批量操作按钮1");
break;
case 2:
vk.toast("批量操作按钮2");
break;
default:
break;
}
}
},
// 监听属性
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
.page-body {}
/deep/.el-checkbox-group .direction-row{
flex-wrap: wrap;
}
</style>
+338
View File
@@ -0,0 +1,338 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query v-model="queryForm1.formData" :columns="queryForm1.columns"
@search="search"></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view>
<el-row>
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<!-- 批量操作 -->
<el-dropdown v-if="table1.multipleSelection" :split-button="false" trigger="click" @command="batchBtn">
<!-- <el-button type="danger" size="small" style="margin-left: 20rpx;"
:disabled="table1.multipleSelection.length === 0">
批量操作<i class="el-icon-arrow-down el-icon--right"></i>
</el-button> -->
<el-dropdown-menu slot="dropdown">
<!-- <el-dropdown-item :command="1">批量操作1</el-dropdown-item>
<el-dropdown-item :command="2">批量操作2</el-dropdown-item> -->
</el-dropdown-menu>
</el-dropdown>
</el-row>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table ref="table1" :action="table1.action" :columns="table1.columns" :query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']" :default-expand-all="false" @update="updateBtn"
@delete="deleteBtn" @current-change="currentChange" @selection-change="selectionChange"></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog v-model="form1.props.show" :title="form1.props.title" width="500px" mode="form"
:close-on-click-modal="false">
<vk-data-form v-model="form1.data" :rules="form1.props.rules" :action="form1.props.action"
:form-type="form1.props.formType" :columns='form1.props.columns' label-width="120px"
@success="form1.props.show = false;refresh();"></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {
},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/spot/category/sys/getTree",
// 表格字段显示规则
columns: [
// {
// key: "_id",
// title: "id",
// type: "text",
// width: 220
// },
{
key: "name",
title: "名称",
type: "text",
width: 220,
align: "left",
},
// {
// key: "parent_id",
// title: "上级id",
// type: "text",
// width: 220,
// },
{
key: "remark",
title: "备注",
type: "text",
align: "left",
width: 220
},
{
key: "sort",
title: "排序",
type: "number",
align: "left",
width: 80,
},
{
key: "_add_time",
title: "添加时间",
type: "time",
align: "left",
width: 160,
sortable: "custom"
},
{
key: "_add_time",
title: "距离现在",
type: "dateDiff",
align: "left",
width: 120
},
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
// {
// key: "name",
// title: "名称",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "remark",
// title: "备注",
// type: "text",
// width: 160,
// mode: "%%"
// },
// {
// key: "_add_time",
// title: "添加时间",
// type: "datetimerange",
// width: 400,
// mode: "[]"
// },
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort: 0
},
// 表单属性
props: {
// 表单请求地址
action: "",
// 表单字段显示规则
columns: [{
key: "name",
title: "名称",
type: "text",
placeholder: "请输入分类名称"
},
{
key: "icon",
title: "图标",
type: "icon",
placeholder: "请选择图标"
},
{
key: "parent_id",
title: "上级分类",
type: "tree-select",
placeholder: "请选择上级分类",
action: "admin/spot/category/sys/getTree",
props: {
list: "rows",
value: "_id",
label: "name",
children: "children"
},
},
{
key: "remark",
title: "备注",
type: "textarea",
maxlength: "99",
showWordLimit: true,
autosize: {
minRows: 2,
maxRows: 10
},
},
{
key: "sort",
title: "排序",
type: "number",
precision: 0,
placeholder: "请输入排序值",
},
],
// 表单验证规则
rules: {
sort: [{
type: 'number',
message: '排序值必须为数字'
}],
name:[
{ required:true, message:'分类名称不能为空', trigger:'blur' },
],
},
// add 代表添加 update 代表修改
formType: "",
// 是否显示表单的弹窗
show: false
}
},
// 其他弹窗表单
formDatas: {},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm() {
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search() {
that.$refs.table1.search();
},
// 刷新
refresh() {
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow() {
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val) {
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn() {
that.resetForm();
that.form1.props.action = 'admin/spot/category/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({
item
}) {
that.form1.props.action = 'admin/spot/category/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
that.form1.data = item;
},
// 删除按钮
deleteBtn({
item,
deleteFn
}) {
deleteFn({
action: "admin/product/category/sys/delete",
data: {
_id: item._id
},
});
},
// 监听 - 批量操作的按钮点击事件
batchBtn(index) {
switch (index) {
case 1:
vk.toast("批量操作按钮1");
break;
case 2:
vk.toast("批量操作按钮2");
break;
default:
break;
}
}
},
// 监听属性
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
.page-body {}
</style>
@@ -0,0 +1,74 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
这里是页面内容
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
// 页面跳转
pageTo(path){
vk.navigateTo(path);
},
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
.page-body{
}
</style>
+77
View File
@@ -0,0 +1,77 @@
<template>
<view class="page-body">
<image src="../../static/icon/icon-403.svg"></image>
<view class="title">
<text class="code">403</text>
<text class="tips">抱歉,你无权访问该页面</text>
<text class="tips">{{ errMsg }}</text>
<text class="btn" @tap="to_index_page">返回首页</text>
</view>
</view>
</template>
<script>
export default {
data() {
return {};
},
onLoad(query) {
this.errMsg = query.errMsg || ''
},
methods: {
to_index_page() {
uni.navigateTo({
url: "/pages/index/index"
});
},
}
}
</script>
<style lang="scss" scoped>
page {
width: 100%;
height: 100%;
background-color: #F5F7F9;
}
.page-body {
display: flex;
padding-top: 250rpx;
justify-content: center;
.title {
display: flex;
flex-direction: column;
padding-top: 120rpx;
margin-left: 200rpx;
}
.code{
margin-bottom: 24px;
color: #515a6e;
font-weight: 600;
font-size: 72px;
line-height: 72px;
}
.tips{
margin-bottom: 16px;
color: #808695;
font-size: 20px;
line-height: 28px;
}
.btn{
display: inline-block;
color: #fff;
background-color: #2d8cf0;
border-color: #2d8cf0;
width: 200rpx;
height: 85rpx;
border-radius: 6rpx;
text-align: center;
line-height: 85rpx;
}
.btn:hover{
cursor: pointer;
background-color: #57a3f3 !important;
}
}
</style>
+77
View File
@@ -0,0 +1,77 @@
<template>
<view class="page-body">
<image src="../../static/icon/icon-404.svg"></image>
<view class="title">
<text class="code">404</text>
<text class="tips">抱歉,你访问的页面不存在</text>
<text class="tips">{{ errMsg }}</text>
<text class="btn" @tap="to_index_page">返回首页</text>
</view>
</view>
</template>
<script>
export default {
data() {
return {};
},
onLoad(query) {
this.errMsg = query.errMsg || ''
},
methods: {
to_index_page() {
uni.navigateTo({
url: "/pages/index/index"
});
},
}
}
</script>
<style lang="scss" scoped>
page {
width: 100%;
height: 100%;
background-color: #F5F7F9;
}
.page-body {
display: flex;
padding-top: 250rpx;
justify-content: center;
.title {
display: flex;
flex-direction: column;
padding-top: 120rpx;
margin-left: 200rpx;
}
.code{
margin-bottom: 24px;
color: #515a6e;
font-weight: 600;
font-size: 72px;
line-height: 72px;
}
.tips{
margin-bottom: 16px;
color: #808695;
font-size: 20px;
line-height: 28px;
}
.btn{
display: inline-block;
color: #fff;
background-color: #2d8cf0;
border-color: #2d8cf0;
width: 200rpx;
height: 85rpx;
border-radius: 6rpx;
text-align: center;
line-height: 85rpx;
}
.btn:hover{
cursor: pointer;
background-color: #57a3f3 !important;
}
}
</style>
+77
View File
@@ -0,0 +1,77 @@
<template>
<view class="page-body">
<image src="../../static/icon/icon-500.svg"></image>
<view class="title">
<text class="code">500</text>
<text class="tips">抱歉,服务器出错了</text>
<text class="tips">{{ errMsg }}</text>
<text class="btn" @tap="to_index_page">返回首页</text>
</view>
</view>
</template>
<script>
export default {
data() {
return {};
},
onLoad(query) {
this.errMsg = query.errMsg || ''
},
methods: {
to_index_page() {
uni.navigateTo({
url: "/pages/index/index"
});
},
}
}
</script>
<style lang="scss" scoped>
page {
width: 100%;
height: 100%;
background-color: #F5F7F9;
}
.page-body {
display: flex;
padding-top: 250rpx;
justify-content: center;
.title {
display: flex;
flex-direction: column;
padding-top: 120rpx;
margin-left: 200rpx;
}
.code{
margin-bottom: 24px;
color: #515a6e;
font-weight: 600;
font-size: 72px;
line-height: 72px;
}
.tips{
margin-bottom: 16px;
color: #808695;
font-size: 20px;
line-height: 28px;
}
.btn{
display: inline-block;
color: #fff;
background-color: #2d8cf0;
border-color: #2d8cf0;
width: 200rpx;
height: 85rpx;
border-radius: 6rpx;
text-align: center;
line-height: 85rpx;
}
.btn:hover{
cursor: pointer;
background-color: #57a3f3 !important;
}
}
</style>
@@ -0,0 +1,278 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
:destroy-on-close="true"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var pageName = "";
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
var defaultFormData = {
appid:"",
name:"",
title:"",
contents:"",
platform:[],
platformRadio:"",
type:"",
version:"",
min_uni_version:"",
url:"",
stable_publish:false,
is_silently:false,
is_mandatory:false,
create_env:"upgrade-center",
store_list:[],
};
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {
stable_publish:""
},
options:{}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "标题",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "2vh",
width: "900px"
},
form1:{
// 表单请求数据,此处可以设置默认值
data: defaultFormData,
// 表单属性
props: {
// 表单请求地址
action:"",
// 表单字段显示规则
columns:[
{ key: "appid", title: "AppID", type: "text", disabled:true },
{ key: "name", title: "应用名称", type: "text", disabled:true },
{ key: "title", title: "更新标题", type: "text" },
{
key:"contents", title:"更新内容", type:"textarea",
autosize:{ minRows:4, maxRows:10 },
maxlength:2000,
showWordLimit:true,
},
{
key:"platformRadio", title:"平台", type:"radio",
itemWidth:80,
data:[
{ value:"Android", label:"安卓" },
{ value:"iOS", label:"苹果" }
],
showRule:"type==native_app",
disabled:["update"]
},
{
key:"platform", title:"平台", type:"checkbox",
itemWidth:80,
data:[
{ value:"Android", label:"安卓" },
{ value:"iOS", label:"苹果" }
],
showRule:"type==wgt",
disabled:["update"]
},
{ key: "version", title: "版本号", type: "text", tips:"必须大于当前线上发行的版本号", disabled:["update"] },
{ key: "min_uni_version", title: "原生App最低版本", type: "text", showRule:"type==wgt" },
{ key: "url", title: "AppStore", type: "text",
showRule:(formData)=>{
return formData.platformRadio === "iOS" && formData.type === "native_app";
}
},
{ key:"apk", title:"上传apk包", type:"file", limit:1, accept:".apk",
showRule:(formData)=>{
return formData.platformRadio === "Android" && formData.type === "native_app";
},
watch: ({ value, formData, column, index, $set }) => {
$set("url", value);
},
tips:"上传apk包到当前服务空间的云存储中,上传成功后,会自动使用云存储地址填充下载链接"
},
{ key:"wgt", title:"上传wgt包", type:"file", limit:1, accept:".wgt",
showRule:(formData)=>{
return formData.type === "wgt";
},
watch: ({ value, formData, column, index, $set }) => {
$set("url", value);
},
tips:"上传wgt包到当前服务空间的云存储中,上传成功后,会自动使用云存储地址填充下载链接"
},
{ key: "url", title: "下载链接", type: "text",
showRule:(formData)=>{
return formData.platformRadio === "Android" || formData.type === "wgt";
}
},
{
key:"store_list", title:"Android应用市场", type:"array<object>",
showRule:(formData)=>{
return formData.platformRadio === "Android" && formData.type === "native_app" && formData.store_list && formData.store_list.length>0 ? true : false;
},
rowKey:"id",
showAdd:false,
showClear:false,
showSort:true,
// 新增一行时,该行的默认值
defaultValue:{
},
rightBtns:['delete'],
// 每行每个字段对应的渲染规则
columns:[
{ key:"enable", title:"是否启用", type:"switch", width:80 },
{
key:"name", title:"商店名称", type:"text", minWidth:180,
disabled: true
},
{
key:"scheme", title:"Scheme", type:"text", minWidth:280,
disabled: true
},
]
},
{ key:"is_silently", title:"静默更新", type:"switch", activeValue:true, inactiveValue:false, showRule:"type==wgt" },
{ key:"is_mandatory", title:"强制更新", type:"switch", activeValue:true, inactiveValue:false },
{ key:"stable_publish", title:"上线发行", type:"switch", activeValue:true, inactiveValue:false,
disabled: (formData)=>{
return this.value.item.stable_publish && this.value.mode === "update";
}
}
],
// 表单验证规则
rules:{
appid: [
// 必填
{ required: true, message: "appid不能为空", trigger: ['blur','change'] }
],
contents: [
// 必填
{ required: true, message: "更新内容不能为空", trigger: ['blur','change'] }
],
platform: [
// 必填
{ required: true, message: "平台不能为空", trigger: ['blur','change'] }
],
platformRadio: [
// 必填
{ required: true, message: "平台不能为空", trigger: ['blur','change'] }
],
version: [
// 必填
{ required: true, message: "版本号不能为空", trigger: ['blur','change'] },
{ validator: vk.pubfn.validator("version"), message: '版本号格式必须为:xx.xx.xx(3个数字组成,数字范围1-99,0-99,0-99) 如1.0.1 不可以是1.0.01', trigger: 'blur' }
],
min_uni_version: [
// 必填
{ required: true, message: "最低版本号不能为空", trigger: ['blur','change'] },
{ validator: vk.pubfn.validator("version"), message: '版本号格式必须为:xx.xx.xx(3个数字组成,数字范围1-99,0-99,0-99) 如1.0.1 不可以是1.0.01', trigger: 'blur' }
],
url: [
// 必填
{ required: true, message: "链接不能为空", trigger: ['blur','change'] }
],
},
// add 代表添加 update 代表修改
formType:"",
// 左侧label的宽度
labelWidth: "140px",
}
},
};
},
mounted() {
this.init();
},
methods: {
// 初始化
init() {
let { value } = this;
this.$emit("input", value);
originalForms["form1"] = vk.pubfn.copyObject(this.form1);
},
// 监听 - 页面打开
onOpen() {
let { value={} } = this;
let { item={} } = value;
// 每次打开时,重新设置表单的值 = value.item 的值,item通过 vk.pubfn.openForm('表单名',{ item:{ _id:"1" } }) 传递值
if(value.mode === "update"){
this.form1.props.action = "admin/system/app-upgrade-center/sys/addUpdate";
this.page.title = pageName + "修改";
this.page.submitText = "修改";
if (item.type === "native_app") {
item.platformRadio = item.platform[0];
}
this.form1.data = vk.pubfn.objectAssign(vk.pubfn.copyObject(defaultFormData), vk.pubfn.copyObject(item));
}else{
this.form1.props.action = "admin/system/app-upgrade-center/sys/addUpdate";
this.page.title = pageName + "添加";
this.page.submitText = "添加";
this.form1.data = vk.pubfn.objectAssign(vk.pubfn.copyObject(defaultFormData), vk.pubfn.copyObject(item));
}
},
// 监听 - 页面关闭
onClose() {
this.resetForm();
},
// 监听 - 提交成功后
onFormSuccess() {
this.value.show = false; // 关闭页面
this.$emit("success");
},
// 表单重置
resetForm(){
vk.pubfn.resetForm(originalForms, this);
},
},
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,305 @@
<template>
<view class="page-body" v-loading="loading">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
:main-columns="['appid','title','type','stable_publish']"
@search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view>
<el-row>
<el-dropdown placement="bottom-start" @command="addBtn">
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" :disabled="!queryForm1.formData.appid">添加</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="native_app">原生App安装包</el-dropdown-item>
<el-dropdown-item command="wgt">wgt资源包</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!-- 批量操作 -->
<!-- <el-dropdown v-if="table1.multipleSelection" :split-button="false" trigger="click" @command="batchBtn">
<el-button type="danger" size="small" style="margin-left: 20rpx;"
:disabled="table1.multipleSelection.length === 0"
>
批量操作<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="1">批量操作1</el-dropdown-item>
<el-dropdown-item :command="2">批量操作2</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown> -->
</el-row>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']"
:selection="false"
:row-no="true"
:pagination="true"
:auto-action="false"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑 -->
<addUpdate v-model="formDatas.addUpdate" @success="refresh"></addUpdate>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
import addUpdate from './form/addUpdate.vue'
export default {
components:{
addUpdate,
},
data() {
// 页面数据变量
return {
appList:[],
// 页面是否请求中或加载中
loading:false,
// init请求返回的数据
data:{
},
// 表格相关开始 -----------------------------------------------------------
table1:{
// 表格数据请求地址
action:"admin/system/app-upgrade-center/sys/getList",
// 表格字段显示规则
columns:[
{ key:"appid", title:"AppID", type:"text", width:120 },
{ key:"title", title:"更新标题", type:"text", width:120 },
{
key: "type", title: "安装包类型", type: "tag", width: 140, size: "small",
data:[
{ value:"native_app", label:"原生App安装包", tagType:"primary", effect:"light" },
{ value:"wgt", label:"Wgt资源包", tagType:"success", effect:"light" }
]
},
{
key:"platform", title:"平台", type:"checkbox", width:100, align:"left",
itemWidth:80,
data:[
{ value:"Android", label:"安卓" },
{ value:"iOS", label:"苹果" }
],
},
{ key:"store_list", title:"已上架应用市场", type:"text", width:120, align:"left",
formatter: (val=[], row, column, index) => {
let str = "";
val.map((item, index) => {
str += item.name;
if (index !== val.length - 1) {
str += "、";
}
});
if (!str) str = "-";
return str;
}
},
{ key:"version", title:"版本号", type:"text", width:100 },
{
key: "stable_publish", title: "安装包状态", type: "tag", width: 120, size: "small",
data:[
{ value:true, label:"已上线", tagType:"success", effect:"light" },
{ value:false, label:"已下线", tagType:"info", effect:"light" }
]
},
{ key:"create_date", title:"上传时间", type:"time", width:160, sortable:"custom" },
{ key:"create_date", title:"距离现在", type:"dateDiff", width:120 },
],
// 多选框选中的值
multipleSelection:[],
// 当前高亮的记录
selectItem:""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1:{
// 查询表单数据源,可在此设置默认值
formData:{
appid:""
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns:[
{
key:"appid", title:"所属应用", type:"select", placeholder:"请选择应用", width:140, mode:"=",
props:{ value:'appid', label:'name' },
data:()=>{
return this.appList;
}
},
{ key:"title", title:"标题", type:"text", width:140, mode:"%%" },
{
key: "type", title: "安装包类型", type: "select", width: 140, placeholder:"请选择类型",
data:[
{ value:"native_app", label:"原生App安装包" },
{ value:"wgt", label:"Wgt资源包" }
]
},
{
key: "stable_publish", title: "安装包状态", type: "select", width: 140, placeholder:"请选择状态",
data:[
{ value:true, label:"已上线" },
{ value:false, label:"已下线" }
]
},
{ key:"create_date", title:"上传时间", type:"datetimerange", width:360, mode:"[]" },
]
},
// 其他弹窗表单
formDatas:{},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
vk.callFunction({
url: 'admin/system/app/sys/getList',
loading:true,
data: {
pageSize:500,
formData:{
enable_upgrade_center: true
},
columns:[
{ key:"enable_upgrade_center", type:"select", mode:"=" },
]
},
success: (data) => {
that.appList = data.rows;
if (options.appid) {
that.queryForm1.formData.appid = options.appid;
that.search();
} else if (data.rows.length > 0) {
that.queryForm1.formData.appid = data.rows[0].appid;
that.search();
}
}
});
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm(){
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(){
that.$refs.table1.search();
},
// 刷新
refresh(){
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow(){
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val){
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn(type){
let appid = that.queryForm1.formData.appid;
let appInfo = vk.pubfn.getListItem(that.appList, "appid", appid);
let item = {
appid,
type,
name: appInfo.name,
store_list: appInfo.store_list
};
vk.pubfn.openForm('addUpdate',{ mode:"add", item });
},
// 显示修改页面
updateBtn({ item }){
vk.pubfn.openForm('addUpdate',{ mode:"update", item });
},
// 删除按钮
deleteBtn({ item, deleteFn }){
if (item.stable_publish) {
this.$message({
showClose: true,
message: '不可删除已上线的版本',
type: 'error'
});
return false;
}
deleteFn({
action:"admin/system/app-upgrade-center/sys/delete",
data:{
_id: item._id
},
});
},
// 监听 - 批量操作的按钮点击事件
batchBtn(index){
switch(index){
case 1: vk.toast("批量操作按钮1"); break;
case 2: vk.toast("批量操作按钮2"); break;
default : break;
}
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
.page-body {
}
</style>
+515
View File
@@ -0,0 +1,515 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
:destroy-on-close="true"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var pageName = "应用";
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {},
options:{}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "标题",
submitText: "确定",
cancelText: "关闭",
showCancel: false,
top: "1vh",
width: "1200px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
name:"",
enable_upgrade_center:false,
app_ios:{
enable:false
}
},
// 表单属性
props: {
// 表单请求地址
action:"",
// 表单字段显示规则
columns:[
{ key:"", title:"基础信息", type:"bar-title" },
{ key:"appid", title:"AppID", type:"text" },
{
key:"type", title:"应用类型", type:"cascader",
data:[
{
value:"1000",
label: "用户端",
children:[
{
value:"1001",
label: "通用",
children:[
{ value:"client", label:"用户端" },
]
},
{
value:"1002",
label: "商家",
children:[
{ value:"rider", label:"骑手端" },
{ value:"business", label:"商家端" },
]
},
{
value:"1003",
label: "教育",
children:[
{ value:"student", label:"学生端" },
{ value:"parent", label:"家长端" },
{ value:"teacher", label:"教师端" },
]
},
{
value:"1999",
label: "其他",
children:[
{ value:"other", label:"其他" },
]
}
]
},
{
value:"2000",
label: "管理端",
children:[
{
value:"2001",
label: "通用",
children:[
{ value:"admin", label:"管理端" },
]
},
{
value:"2002",
label: "商家",
children:[
{ value:"rider-admin", label:"骑手管理端" },
{ value:"business-admin", label:"商家管理端" },
]
},
{
value:"2003",
label: "教育",
children:[
{ value:"student-admin", label:"学生管理端" },
{ value:"parent-admin", label:"家长管理端" },
{ value:"teacher-admin", label:"教师管理端" },
]
},
{
value:"2999",
label: "其他",
children:[
{ value:"other-admin", label:"其他管理端" },
]
}
],
}
],
props:{
expandTrigger:"hover",
emitPath:false,
},
onChange:(val, formData, column, index, option) => {
this.form1.data.name = option.label;
}
},
{ key:"name", title:"应用名称", type:"text",
watch: ({ value, formData, column, index, $set }) => {
// 此处演示根据选择的值动态改变text1的值
let arr = [
"app_ios",
"app_android",
"mp_weixin",
"mp_alipay",
"mp_baidu",
"mp_toutiao",
"mp_qq",
"mp_kuaishou",
"mp_lark",
"mp_jd",
"mp_dingtalk",
"quickapp",
];
arr.map((item, index) => {
this.$set(this.form1.data[item],"name", value);
});
}
},
{ key:"introduction", title:"应用简介", type:"text", tips:"一句话描述您的应用的用途" },
{
key:"description", title:"应用描述", type:"textarea", placeholder:"更详细的应用描述",
autosize:{ minRows:4, maxRows:10 },
maxlength:200,
showWordLimit:true,
},
{ key:"", title:"App升级中心", type:"bar-title" },
{ key:"enable_upgrade_center", title:"是否开启", type:"switch", activeValue:true, inactiveValue:false, tips:"下面的信息为制作统一发布页和APP升级中心所需,若你未用到,则只填上面的基础信息即可。" },
{ key:"", title:"图标素材", type:"bar-title", showRule:"enable_upgrade_center==true" },
{ key:"icon_url", title:"应用图标", type:"image", limit:1, tips:"建议尺寸:600*600", showRule:"enable_upgrade_center==true" },
{ key:"screenshot", title:"应用截图", type:"image", limit:9, tips:"最多9张,建议尺寸:800*1380", showRule:"enable_upgrade_center==true" },
{ key:"", title:"H5信息", type:"bar-title", showRule:"enable_upgrade_center==true" },
{ key:"h5", title:"链接地址", type:"object", showLabel:false,
columns:[
{ key:"url", title:"链接地址", type:"text", tips:"您的h5首页访问地址" },
],
showRule:"enable_upgrade_center==true"
},
{ key:"", title:"App信息", type:"bar-title",showRule:"enable_upgrade_center==true" },
{ key:"app_ios", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"IOS", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text", tips:"IOS应用的名称",
showRule:(form)=>{
return vk.pubfn.getData(form,"app_ios.enable",false);
}
},
{ key:"url", title:"AppStore", type:"text", tips:"AppStore商店的下载链接地址",
showRule:(form)=>{
return vk.pubfn.getData(form,"app_ios.enable",false);
}
},
]
},
{ key:"app_android", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"Android", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text", tips:"安卓应用的名称",
showRule:(form)=>{
return vk.pubfn.getData(form,"app_android.enable",false);
}
},
{ key:"apk", title:"上传apk包", type:"file", limit:1, accept:".apk",
showRule:(form)=>{
return vk.pubfn.getData(form,"app_android.enable",false);
},
watch: ({ value, formData, column, index, $set }) => {
$set("url", value);
},
tips:"上传apk到当前服务空间的云存储中,上传成功后,会自动使用云存储地址填充下载链接"
},
{ key:"url", title:"下载链接", type:"text", tips:"安卓应用apk的下载地址",
showRule:(form)=>{
return vk.pubfn.getData(form,"app_android.enable",false);
}
},
]
},
{
key:"store_list", title:"Android应用市场", type:"array<object>",
tips:`<a href="https://ask.dcloud.net.cn/article/39960" target="_blank">常见应用商店schema汇总</a>`,
showRule:(form)=>{
return vk.pubfn.getData(form,"app_android.enable",false) && form.enable_upgrade_center ? true : false;
},
rowKey:"id",
showAdd:true,
showClear:false,
showSort:true,
// 新增一行时,该行的默认值
defaultValue:{
enable:true
},
rightBtns:['delete'],
// 每行每个字段对应的渲染规则
columns:[
{
key:"scheme_select", title:"选择已知商店", type:"select", width:120,
data:[
{ value:"tmast://appdetails?r=XXX&pname=xxx", label:"应用宝" },
{ value:"mimarket://details?id=com.xx.xx", label:"小米" },
{ value:"samsungapps://ProductDetail/com.xx.xx", label:"三星" },
{ value:"appmarket://details?id=com.xx.xx", label:"华为" },
{ value:"oppomarket://details?packagename=com.xx.xx", label:"oppo" },
{ value:"vivomarket://details?id=com.xx.xx", label:"vivo" },
],
watch: ({ value, formData, column, index, $set }) => {
let item = vk.pubfn.getListItem(column.data, "value", value) || {};
let { label="" } = item;
$set("scheme", value);
$set("name", label);
}
},
{
key:"name", title:"商店名称", type:"text", minWidth:180,
isUnique:true,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] }
]
},
{
key:"scheme", title:"Scheme", type:"text", minWidth:280,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{ key:"enable", title:"是否启用", type:"switch", width:80 },
]
},
{ key:"", title:"小程序/快应用信息", type:"bar-title", showRule:"enable_upgrade_center==true" },
{ key:"mp_weixin", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"微信小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_weixin.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_weixin.enable",false);
}
},
]
},
{ key:"mp_alipay", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"支付宝小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_alipay.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_alipay.enable",false);
}
},
]
},
{ key:"mp_baidu", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"百度小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_baidu.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_baidu.enable",false);
}
},
]
},
{ key:"mp_toutiao", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"头条小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_toutiao.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_toutiao.enable",false);
}
},
]
},
{ key:"mp_qq", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"QQ小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_qq.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_qq.enable",false);
}
},
]
},
{ key:"mp_kuaishou", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"快手小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_kuaishou.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_kuaishou.enable",false);
}
},
]
},
{ key:"mp_lark", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"飞书小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_lark.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_lark.enable",false);
}
},
]
},
{ key:"mp_jd", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"京东小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_jd.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_jd.enable",false);
}
},
]
},
{ key:"mp_dingtalk", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"钉钉小程序", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_dingtalk.enable",false);
}
},
{ key:"qrcode_url", title:"小程序码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"mp_dingtalk.enable",false);
}
},
]
},
{ key:"quickapp", title:"", type:"object", showLabel:false, showRule:"enable_upgrade_center==true",
columns:[
{ key:"enable", title:"快应用", type:"switch", activeValue:true, inactiveValue:false },
{ key:"name", title:"名称", type:"text",
showRule:(form)=>{
return vk.pubfn.getData(form,"quickapp.enable",false);
}
},
{ key:"qrcode_url", title:"快应用码", type:"image", limit:1,
showRule:(form)=>{
return vk.pubfn.getData(form,"quickapp.enable",false);
}
},
]
},
],
// 表单验证规则
rules:{
appid: [
{ required: true, message: '应用的AppID为必填字段', trigger: 'blur' },
],
name: [
{ required: true, message: '应用名称为必填字段', trigger: 'blur' }
],
type: [
{ required: true, message: '应用类型为必填字段', trigger: 'blur' }
]
},
// 左侧label的宽度
labelWidth: "140px",
}
}
};
},
mounted() {
this.init();
},
methods: {
// 初始化
init() {
let { value } = this;
this.$emit("input", value);
originalForms["form1"] = vk.pubfn.copyObject(this.form1);
},
// 监听 - 页面打开
onOpen() {
let { value={} } = this;
let { item={} } = value;
// 每次打开时,重新设置表单的值 = value.item 的值,item通过 vk.pubfn.openForm('表单名',{ item:{ _id:"1" } }) 传递值
if(value.mode === "update"){
this.form1.props.action = "admin/system/app/sys/update";
this.page.title = pageName + "修改";
this.page.submitText = "修改";
this.form1.data = vk.pubfn.copyObject(item);
}else{
this.form1.props.action = "admin/system/app/sys/add";
this.page.title = pageName + "添加";
this.page.submitText = "添加";
}
},
// 监听 - 页面关闭
onClose() {
this.resetForm();
},
// 监听 - 提交成功后
onFormSuccess() {
this.value.show = false; // 关闭页面
this.$emit("success");
},
// 表单重置
resetForm(){
vk.pubfn.resetForm(originalForms, this);
},
},
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,207 @@
<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>
+215
View File
@@ -0,0 +1,215 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
@search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view style="display: flex;height: 32px;">
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<el-alert v-if="!appIdExist" :title="`⚠警告:当前项目的 appId:${currentAppId} 没有在下方表格中,请新增应用或修改应用!`" type="error" style="margin-left: 20px;"> </el-alert>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['update','delete']"
:custom-right-btns="table1.customRightBtns"
:selection="false"
:row-no="true"
:pagination="true"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑 -->
<addUpdate v-model="formDatas.addUpdate" @success="refresh"></addUpdate>
<!-- 生成发布页 -->
<createPublishHtml v-model="formDatas.createPublishHtml" @success="refresh"></createPublishHtml>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
import addUpdate from './form/addUpdate.vue'
import createPublishHtml from './form/createPublishHtml.vue'
export default {
components:{
addUpdate,
createPublishHtml,
},
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading:false,
// init请求返回的数据
data:{
},
// 表格相关开始 -----------------------------------------------------------
table1:{
// 表格数据请求地址
action:"admin/system/app/sys/getList",
// 表格字段显示规则
columns:[
{ key:"appid", title:"AppID", type:"text", width:160, sortable:"custom" },
{ key:"type", title:"应用类型", type:"text", width:120, sortable:"custom" },
{ key:"name", title:"应用名称", type:"text", width:240, sortable:"custom" },
{ key:"description", title:"应用描述", type:"text", minWidth:260 },
{ key:"_add_time", title:"添加时间", type:"time", width:160, sortable:"custom" }
],
// 多选框选中的值
multipleSelection:[],
// 当前高亮的记录
selectItem:"",
customRightBtns: [
{
title: '发布页管理', type: 'primary',
onClick:(item)=>{
vk.pubfn.openForm('createPublishHtml',{ item });
},
disabled:"enable_upgrade_center!=true",
},
{
title: '版本管理', type: 'primary',
onClick:(item)=>{
vk.navigateTo(`/pages_plugs/system/app-upgrade-center/list?appid=${item.appid}`);
},
disabled:"enable_upgrade_center!=true",
}
],
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1:{
// 查询表单数据源,可在此设置默认值
formData:{
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns:[
{ key:"appid", title:"AppID", type:"text", width:160, mode:"%%" },
{ key:"name", title:"应用名称", type:"text", width:160, mode:"%%" },
{ key:"_add_time", title:"添加时间", type:"datetimerange", width:400, mode:"[]" },
]
},
// 其他弹窗表单
formDatas:{},
// 表单相关结束 -----------------------------------------------------------
appIdExist: true
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
that.checkCurrentAppId();
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 搜索
search(){
that.$refs.table1.search();
},
// 刷新
refresh(){
that.$refs.table1.refresh();
that.checkCurrentAppId();
},
// 获取当前选中的行的数据
getCurrentRow(){
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val){
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn(){
vk.pubfn.openForm('addUpdate',{ mode:"add" });
},
// 显示修改页面
updateBtn({ item }){
vk.pubfn.openForm('addUpdate',{ mode:"update", item });
},
// 删除按钮
deleteBtn({ item, deleteFn }){
deleteFn({
action:"admin/system/app/sys/delete",
data:{
_id: item._id
},
});
},
checkCurrentAppId(){
let systemInfo = uni.getSystemInfoSync();
if (typeof systemInfo.appId !== "undefined") {
that.currentAppId = systemInfo.appId;
vk.callFunction({
url: 'admin/system/app/sys/getInfo',
data: {
appid: systemInfo.appId,
},
success: (data) => {
if (data.info && data.info.appid === systemInfo.appId) {
that.appIdExist = true;
} else {
that.appIdExist = false;
}
}
});
}
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
.page-body {
}
</style>
@@ -0,0 +1,171 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:before-action="form1.props.beforeAction"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: ""
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "导入菜单",
submitText: "导入",
cancelText: "关闭",
showCancel: true,
top: "7vh",
width:"800px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
mode: 1,
jsonType: 1
},
// 表单属性
props: {
// 表单请求地址
action: "admin/system/menu/sys/adds",
// 表单字段显示规则
columns: [
{ key: "jsonType", title: "json类型", type: "radio",
data: [
{ value: 1, label: "树形结构" },
{ value: 2, label: "数组结构" },
]
},
{ key:"parent_id", title:"父级菜单Id", type:"text",
showRule:"jsonType=1"
},
{ key: "mode", title: "重复标识是否覆盖", type: "radio",
data: [
{ value: 1, label: "覆盖" },
{ value: 2, label: "忽略" },
]
},
{ key: "menus", title: "JSON内容", type: "textarea",
autosize: { minRows: 18, maxRows: 18 }
},
],
// 表单验证规则
rules: {
menus: [
{ required: true, message: "不能为空", trigger: "change" },
]
},
// add 代表添加 update 代表修改
formType: "",
// 表单是否在请求中
loading: false,
// 是否显示表单1 的弹窗
show: false,
labelWidth:"140px",
beforeAction(formData){
try {
let menus = JSON.parse(formData.menus);
if(Object.prototype.toString.call(menus) === '[object Object]'){
menus = [menus];
}
if(formData.jsonType == 1){
menus.map((item, index) => {
item.parent_id = formData.parent_id;
});
menus = vk.pubfn.treeToArray(menus,{
id:"menu_id",
parent_id:"parent_id",
children:"children"
});
}
return {
menus
};
}catch(err){
vk.toast("json解析失败","none");
console.error(err);
return false;
}
}
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { value={} } = that;
let { menu_id } = value.item || {};
that.form1.data.parent_id = menu_id;
},
// 监听 - 页面关闭
onClose() {
that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess() {
that.value.show = false; // 关闭页面
that.$emit("success");
},
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,218 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
v-loading="page.loading"
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:before-action="form1.props.beforeAction"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
>
<template v-slot:refresh>
<view style="margin-left: 30px;">
<text style="color: #66b1ff;text-decoration: underline;cursor: pointer;" @click="getList()">刷新数据</text>
</view>
</template>
<template v-slot:permissionList>
<el-tree
ref="tree"
:data="data.treeData"
:node-key="data.nodeKey"
:default-checked-keys="data.checkedKeys"
:props="{
children: 'children',
label: 'label'
}"
show-checkbox
default-expand-all
expand-on-click-node
></el-tree>
</template>
</vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: ""
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
data:{
list:[],
info:{},
// 权限的树形结构数据
treeData: [],
// 默认选中的权限列表
checkedKeys:[],
// 树的唯一标识
nodeKey:"permission_id",
},
page: {
title: "权限赋予",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "7vh",
width:"800px",
loading: false
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
menu_id:"",
reset:true,
permissionList:[]
},
// 表单属性
props: {
// 表单请求地址
action: "admin/system/menu/sys/bindPermission",
// 表单字段显示规则
columns: [
// 常用字段类型
{ key: "refresh", title: "", type: "text", showLabel:false },
{ key: "permissionList", title: "权限列表", type: "text" }
],
// 表单验证规则
rules: {
},
labelWidth: "100px",
beforeAction:function(formData){
let checkedKeys = that.$refs.tree.getCheckedKeys();
let halfCheckedKeys = that.$refs.tree.getHalfCheckedKeys();
let allCheckedKeys = checkedKeys.concat(halfCheckedKeys);
// 去除空属性
for(let i = 0;i<allCheckedKeys.length;i++){
if(vk.pubfn.isNull(allCheckedKeys[i])){
allCheckedKeys.splice(i, 1);
i--;
}
}
formData.permissionList = allCheckedKeys;
return formData;
}
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { value={} } = that;
let { item } = value;
let { menu_id, name, permission = [] } = item;
that.page.title = `权限赋予(${name})`;
that.data.info = item;
that.form1.data.menu_id = menu_id;
that.form1.data.permissionList = permission;
if (vk.pubfn.isNotNull(that.data.treeData)){
that.initData();
return;
}
that.getList();
},
getList(){
// 执行请求
vk.callFunction({
url: 'admin/system/permission/sys/getAll',
data: {},
loading:{ that, name:"page.loading" },
success: (data) => {
let rows = [{
label :"全选",
permission_id :"",
children : data.rows
}];
// 渲染树
that.data.treeData = rows;
that.data.list = data.list;
that.initData();
}
});
},
initData(){
let { value={} } = that;
let { item } = value;
let { menu_id, name, permission = [] } = item;
let currentPermission = vk.pubfn.copyObject(permission);
// 设置当前选中用户的权限列表
// 去除所有含有子元素的权限
for(let i in that.data.list){
let item = that.data.list[i];
let index = currentPermission.indexOf(item.parent_id);
if(index > -1){
currentPermission.splice(index, 1);
}
}
that.data.checkedKeys = currentPermission;
that.$refs.tree.setCheckedKeys(currentPermission);
},
// 监听 - 页面关闭
onClose() {
that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess(res) {
that.$set(that.value.item, "permission", that.form1.data.permissionList);
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
+364
View File
@@ -0,0 +1,364 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 自定义按钮区域开始 -->
<view class="vk-table-button-box">
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<el-button type="primary" size="small" icon="el-icon-s-tools" :disabled="!table1.selectItem" @click="bindPermissionBtn">设置内置权限</el-button>
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addMenuByJsonBtn">通过JSON数组批量导入菜单</el-button>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']"
:default-expand-all="false"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
>
<!-- 排序值 -->
<template v-slot:sort="{ row, column, index }">
<el-input v-model="row.sort" size="mini" @change="sortChange($event, row)"/>
</template>
</vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
:title="form1.props.title"
width="700px"
mode="form"
>
<vk-data-form
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
label-width="80px"
@success="formSuccess"
></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 设置角色权限组件 -->
<bindPermission v-model="formDatas.bindPermission"></bindPermission>
<!-- 通过JSON批量导入菜单 -->
<addMenuByJson v-model="formDatas.addMenuByJson" @success="refresh"></addMenuByJson>
<!-- 页面内容结束 -->
</view>
</template>
<script>
import bindPermission from './form/bindPermission.vue'
import addMenuByJson from './form/addMenuByJson.vue'
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
const matchModeData = [
{ value:0, label:"完整路径" },
{ value:1, label:"通配符" },
{ value:2, label:"正则表达式" }
];
const curdCategoryData = [
{ value:1, label:"增", tagType:"success" },
{ value:2, label:"删", tagType:"danger" },
{ value:3, label:"改", tagType:"" },
{ value:4, label:"查", tagType:"info" },
{ value:5, label:"特殊", icon:"info" },
{ value:0, label:"其他", icon:"info" },
];
const levelDate = [
{ value:1, label:"子弹级", tagType:"success" },
{ value:2, label:"炸弹级", tagType:"" },
{ value:3, label:"榴弹级", tagType:"warning" },
{ value:4, label:"核弹级", tagType:"danger" },
{ value:0, label:"其他", tagType:"info" },
];
export default {
components:{
bindPermission,
addMenuByJson
},
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading:false,
// init请求返回的数据
data:{
},
// 表格相关开始 -----------------------------------------------------------
table1:{
// 表格数据请求地址
action:"admin/system/menu/sys/getAll",
// 表格字段显示规则
columns: [
/* { key:"icon", title:"图标", type:"icon", width:100, defaultValue: "el-icon-tickets"}, */
{ key:"name", title:"菜单名称", type:"html", width:340, align:"left",
formatter:function(val, row, column, index){
let icon = row.icon || "el-icon-tickets";
if(icon.indexOf("vk-icon") > -1) icon = "vk-icon " + icon;
return `<i class="${icon}" style="margin-right: 10px;"></i><text>${row.name}</text>`;
}
},
{ key:"menu_id", title:"菜单唯一标识", type:"text", width:350, align:"left" },
{ key:"url", title:"菜单URL", type:"text", width:250, align:"left" },
{ key:"comment", title:"备注", type:"text", width:200, align:"left" },
{ key:"permission", title:"菜单内置权限表", type:"text", width:120, defaultValue:"无" },
{ key:"sort", title:"排序值", type:"number", width:100 },
{
key: "enable", title: "是否启用", type: "switch",
activeValue: true,
inactiveValue: false,
width: 80,
watch: (res) => {
let { value, row, change } = res;
vk.callFunction({
url: "admin/system/menu/sys/updateBase",
title: value ? "启用中..." : "关闭中...",
data: {
_id: row._id,
enable: value
},
success: data => {
change(value); // 这一步是让表格行内的开关改变显示状态
}
});
}
},
{
key: "hidden_menu", title: "是否显示", type: "switch",
activeValue: false,
inactiveValue: true,
width: 80,
watch: (res) => {
let { value, row, change } = res;
vk.callFunction({
url: "admin/system/menu/sys/updateBase",
title: "请求中...",
data: {
_id: row._id,
hidden_menu: value
},
success: data => {
change(value); // 这一步是让表格行内的开关改变显示状态
}
});
}
},
{ key:"parent_id", title:"父级菜单Id", type:"text", width:250, align:"left" },
],
// 多选框选中的值
multipleSelection:[],
// 当前高亮的记录
selectItem:"",
},
formDatas:{},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始-----------------------------------------------------------
// 查询表单请求数据
queryForm1:{
// 查询表单数据源,可在此设置默认值
formData:{
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns:[
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort:0,
enable:true,
url:""
},
// 表单属性
props: {
// 表单请求地址
action:"",
// 表单字段显示规则
columns:[
{ key:"", title:"基础属性", type:"bar-title" },
{ key:"menu_id", title:"菜单标识", type:"text", tips:"设置一个能表达唯一含义的标识", show:["add"] },
{ key:"name", title:"菜单名称", type:"text", tips:"设置菜单的名称" },
{ key:"icon", title:"图标", type:"icon", tips:"设置一个能表达权限含义的图标" },
{ key:"url", title:"URL", type:"text", tips:"页面路径,本地路径需以 / 开头 网络路径需带http:// 或 https://" },
{ key:"sort", title:"排序值", type:"number", tips:"越小越显示在前面" },
{ key:"parent_id", title:"父级菜单", type:"tree-select", tips:"父级的menu_id" ,
action:"admin/system/menu/sys/getAll",
props: { list:"rows", value:"menu_id", label:"label", children:"children" },
},
{ key:"comment", title:"备注", type:"textarea",maxlength:"99",showWordLimit:true,autosize:{ minRows: 2, maxRows: 10 },
tips:"设置一个备注来更详细的描述此权限的含义"
},
{ key:"enable", title:"是否启用", type:"switch",
tips:"当关闭时,菜单将失效,再次启用时,菜单会恢复。"
},
{ key:"hidden_menu", title:"是否隐藏", type:"switch",
tips:"当设为true时,菜单不显示在左侧菜单列表中。"
},
],
// 表单对应的验证规则
rules: {
menu_id:[
{ required:true, message:'菜单标识不能为空', trigger:'blur' },
{ min: 2, max: 40, message:'长度在 2 到 40 个字符', trigger:'blur' },
],
name:[
{ required:true, message:'菜单名称不能为空', trigger:'blur' },
],
sort:[
{ type:'number', message:'排序值必须为数字'}
]
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show:false,
}
},
// 表单相关结束-----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm(){
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(){
that.$refs.table1.query();
},
// 刷新
refresh(){
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow(key){
return that.$refs.table1.getCurrentRow(key);
},
// 监听 - 行的选中高亮事件
currentChange(val){
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn(){
that.resetForm();
that.form1.props.action = 'admin/system/menu/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
let currentRow = that.getCurrentRow();
if(currentRow && currentRow.menu_id){
that.$set(that.form1.data,"parent_id", currentRow.menu_id);
that.$set(that.form1.data,"menu_id", currentRow.menu_id+"-");
}
},
// 显示修改页面
updateBtn({ item }){
that.form1.props.action = 'admin/system/menu/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
that.form1.data = item;
},
formSuccess(){
that.form1.props.show = false;
// 下面的写法是为了部分修改完成后,减少一次再次请求数据库的查询
if(that.form1.props.formType === "update"){
let item = that.getCurrentRow(true);
if(item.parent_id !== that.form1.data.parent_id){
that.refresh();
}else{
vk.pubfn.objectAssignForVue(item, that.form1.data, that);
}
}else{
that.refresh();
}
},
// 删除按钮
deleteBtn({ item, deleteFn }){
deleteFn({
action:"admin/system/menu/sys/delete",
data:{
menu_id: item.menu_id
},
});
},
// 设置内置权限
bindPermissionBtn(){
let item = that.getCurrentRow(true);
vk.pubfn.openForm('bindPermission',{ item });
},
addMenuByJsonBtn(){
let item = that.getCurrentRow();
vk.pubfn.openForm('addMenuByJson',{ item });
},
// 修改排序值
sortChange(sort, item){
vk.callFunction({
url: 'admin/system/menu/sys/updateBase',
data: {
_id: item._id,
sort: Number(sort)
},
success: (data) => {
}
});
},
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,105 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
@open="onOpen"
@closed="onClose"
>
<vk-data-input-radio
v-model="form1.curd_category"
:localdata="localdata"
option-type="button"
@change="onChange"
></vk-data-input-radio>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "修改权限分类",
top: "20vh",
width: "460px"
},
form1:{
_id:"",
},
localdata:[
{ value:1, label:"增加", tagType:"success" },
{ value:2, label:"删除", tagType:"danger" },
{ value:3, label:"修改", tagType:"" },
{ value:4, label:"查询", tagType:"info" },
{ value:5, label:"特殊", tagType:"warning" },
{ value:0, label:"其他", tagType:"warning" },
],
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item={} } = that.value;
// 每次打开时,重新设置表单的值 = value.item 的值,item通过 vk.pubfn.openForm('表单名',{ item:{ _id:"1" } }) 传递值
that.form1 = {
_id: item._id,
curd_category: item.curd_category
}
},
// 监听 - 页面关闭
onClose() {
//that.$refs.form1.resetForm(); // 关闭时,重置表单
},
onChange(value){
vk.callFunction({
url: 'admin/system/permission/sys/updateCategory',
title:'请求中...',
data:that.form1,
success:function(data){
that.$set(that.value.item,"curd_category",value);
that.value.show = false; // 关闭页面
that.$emit("success");
}
});
},
},
// 监听属性
watch: {
},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,106 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
@open="onOpen"
@closed="onClose"
>
<vk-data-input-radio
v-model="form1.level"
:localdata="localdata"
option-type="button"
@change="onChange"
></vk-data-input-radio>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "修改权限分类",
top: "20vh",
width: "460px"
},
form1:{
_id:"",
},
localdata:[
{ value:1, label:"子弹级", tagType:"success" },
{ value:2, label:"炸弹级", tagType:"" },
{ value:3, label:"榴弹级", tagType:"warning" },
{ value:4, label:"核弹级", tagType:"danger" },
{ value:0, label:"其他", tagType:"info" },
],
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item={} } = that.value;
// 每次打开时,重新设置表单的值 = value.item 的值,item通过 vk.pubfn.openForm('表单名',{ item:{ _id:"1" } }) 传递值
that.form1 = {
_id: item._id,
level: item.level
}
},
// 监听 - 页面关闭
onClose() {
//that.$refs.form1.resetForm(); // 关闭时,重置表单
},
onChange(value){
vk.callFunction({
url: 'admin/system/permission/sys/updateLevel',
title:'请求中...',
data:that.form1,
success:function(data){
that.$set(that.value.item,"level",value);
that.value.show = false; // 关闭页面
that.$emit("success");
}
});
},
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped></style>
+386
View File
@@ -0,0 +1,386 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 自定义按钮区域开始 -->
<view class="vk-table-button-box">
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']"
:default-expand-all="false"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
@cell-click="cellClick"
>
<!-- 排序值 -->
<template v-slot:sort="{ row, column, index }">
<el-input v-model="row.sort" size="mini" @change="sortChange($event, row)"/>
</template>
</vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
:title="form1.props.title"
width="700px"
mode="form"
>
<vk-data-form
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
label-width="80px"
@success="formSuccess"
></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 修改分类 -->
<updateCategory v-model="formDatas.updateCategory"></updateCategory>
<!-- 修改等级 -->
<updateLevel v-model="formDatas.updateLevel"></updateLevel>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
const matchModeData = [
{ value:0, label:"完整路径" },
{ value:1, label:"通配符" },
{ value:2, label:"正则表达式" }
];
import updateCategory from './form/updateCategory'
import updateLevel from './form/updateLevel'
export default {
components:{
updateCategory,
updateLevel
},
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading:false,
// init请求返回的数据
data:{
},
// 表格相关开始 -----------------------------------------------------------
table1:{
// 表格数据请求地址
action:"admin/system/permission/sys/getAll",
// 表格字段显示规则
columns: [
{ key:"permission_id", title:"权限标识", type:"text", width:310, align:"left",
treeNode:true
},
{ key:"permission_name", title:"权限名称", type:"text", width:120, align:"left" },
{ key:"comment", title:"备注", type:"text", width:180, align:"left" },
{ key:"url", title:"URL", type:"text", width:250, align:"left" },
{ key:"match_mode", title:"匹配模式", type:"text", width:100,
formatter:function(val, row, column, index){
if(typeof val === "undefined" || row.type == 0 || !row.url || row.url.length == 0) return "";
return matchModeData[val].label;
}
},
{ key:"curd_category", title:"权限分类", type:"tag", width:100,
data: [
{ value:1, label:"增", tagType:"success" },
{ value:2, label:"删", tagType:"danger" },
{ value:3, label:"改", tagType:"" },
{ value:4, label:"查", tagType:"info" },
{ value:5, label:"特", tagType:"warning" },
//{ value:0, label:"其他", tagType:"warning" },
]
},
{ key:"level", title:"权限级别", type:"tag", width:100,
data: [
{ value:1, label:"子弹级", tagType:"success" },
{ value:2, label:"炸弹级", tagType:"" },
{ value:3, label:"榴弹级", tagType:"warning" },
{ value:4, label:"核弹级", tagType:"danger" },
]
},
{ key:"sort", title:"排序值", type:"number", width:80 },
{
key: "enable", title: "是否启用", type: "switch",
activeValue: true,
inactiveValue: false,
width: 80,
watch: (res) => {
let { value, row, change } = res;
vk.callFunction({
url: "admin/system/permission/sys/updateBase",
title: value ? "启用中..." : "关闭中...",
data: {
_id: row._id,
enable: value
},
success: data => {
change(value); // 这一步是让表格行内的开关改变显示状态
}
});
}
}
],
// 多选框选中的值
multipleSelection:[],
// 当前高亮的记录
selectItem:"",
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始-----------------------------------------------------------
// 查询表单请求数据
queryForm1:{
// 查询表单数据源,可在此设置默认值
formData:{
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns:[
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort:0,
enable:true,
match_mode:0,
url:[""]
},
// 表单属性
props: {
// 表单请求地址
action:"",
// 表单字段显示规则
columns:[
{ key:"", title:"基础属性", type:"bar-title" },
{ key:"permission_id", title:"标识", type:"text", disabled:["update"],
tips:"全局唯一,添加后不可修改,请尽量语义化。如:user-manage、user-add"
},
{ key:"permission_name", title:"名称", type:"text",
tips:"起一个容易表达权限含义的名称"
},
{
key:"url", title:"URL", type:"array<string>", tips:"云函数路径,若该权限只是父权限分组用,点击清空即可。",
isUnique:true,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{ key:"match_mode", title:"匹配模式", type:"radio", width:100,
data:matchModeData,
tips:"选择合适的匹配模式"
},
{ key:"parent_id", title:"父级权限", type:"tree-select", tips:"父级的permission_id" ,
action:"admin/system/permission/sys/getAll",
props: { list:"rows", value:"permission_id", label:"label", children:"children" },
},
{ key:"sort", title:"排序值", type:"number", tips:"越小越显示在前面" },
{ key:"comment", title:"备注", type:"textarea",maxlength:"99",showWordLimit:true,autosize:{ minRows: 2, maxRows: 10 },
tips:"设置一个备注来更详细的描述此权限的含义"
},
{ key:"enable", title:"是否启用", type:"switch",
tips:"当关闭时,权限将失效,再次启用时,权限会恢复。"
},
{ key:"", title:"高级属性", type:"bar-title" },
{ key:"curd_category", title:"权限分类", type:"radio", width:100,
data:[
{ value:1, label:"增", tagType:"success" },
{ value:2, label:"删", tagType:"danger" },
{ value:3, label:"改", tagType:"" },
{ value:4, label:"查", tagType:"info" },
{ value:5, label:"特", tagType:"warning" },
{ value:0, label:"其他", tagType:"warning" },
],
tips:"给权限分一个类,方便查询和表达含义"
},
{ key:"level", title:"权限级别", type:"radio", width:100,
data:[
{ value:1, label:"子弹级", tagType:"success" },
{ value:2, label:"炸弹级", tagType:"" },
{ value:3, label:"榴弹级", tagType:"warning" },
{ value:4, label:"核弹级", tagType:"danger" },
{ value:0, label:"其他", tagType:"info" },
],
tips:"给权限(菜单)一个级别,方便查询和表达重要程度"
},
],
// 表单对应的验证规则
rules: {
permission_id:[
{ required:true, message:'权限标识不能为空', trigger:'blur' },
],
permission_name:[
{ required:true, message:'权限名称不能为空', trigger:'blur' },
],
sort:[
{ type:'number', message:'排序值必须为数字'}
]
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show:false,
}
},
// 其他表单属性容器(请勿修改)
formDatas:{},
// 表单相关结束-----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm(){
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(){
that.$refs.table1.query();
},
// 刷新
refresh(){
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow(key){
return that.$refs.table1.getCurrentRow(key);
},
// 监听 - 行的选中高亮事件
currentChange(val){
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn(){
that.resetForm();
that.form1.props.action = 'admin/system/permission/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
let currentRow = that.getCurrentRow();
if(currentRow && currentRow.permission_id){
// 设置的方法
that.$set(that.form1.data,"parent_id", currentRow.permission_id);
that.$set(that.form1.data,"permission_id", currentRow.permission_id+"-");
}
},
// 显示修改页面
updateBtn({ item }){
that.form1.props.action = 'admin/system/permission/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
that.form1.data = item;
},
formSuccess(){
that.form1.props.show = false;
// 下面的写法是为了部分修改完成后,减少一次再次请求数据库的查询
if(that.form1.props.formType === "update"){
let item = that.getCurrentRow(true);
if(item.parent_id !== that.form1.data.parent_id){
that.refresh();
}else{
vk.pubfn.objectAssign(item, that.form1.data);
}
}else{
that.refresh();
}
},
// 删除按钮
deleteBtn({ item, deleteFn }){
deleteFn({
action:"admin/system/permission/sys/delete",
data:{
permission_id: item.permission_id
},
});
},
cellClick(row, column, cell, event){
let key = column.property;
if(key === "curd_category"){
// 修改分类
let item = that.getCurrentRow(true);
vk.pubfn.openForm('updateCategory', { item });
}else if(key === "level"){
// 修改等级
let item = that.getCurrentRow(true);
vk.pubfn.openForm('updateLevel', { item });
}
},
// 修改排序值
sortChange(sort, item){
vk.callFunction({
url: 'admin/system/permission/sys/updateBase',
data: {
_id: item._id,
sort: Number(sort)
},
success: (data) => {
}
});
},
},
// 监听属性
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
+215
View File
@@ -0,0 +1,215 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
v-loading="page.loading"
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:before-action="form1.props.beforeAction"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
>
<template v-slot:menuList>
<el-tree
ref="tree"
:data="data.treeData"
:node-key="data.nodeKey"
:default-checked-keys="data.checkedKeys"
:props="{
children: 'children',
label: 'label'
}"
show-checkbox
default-expand-all
expand-on-click-node
></el-tree>
</template>
</vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: ""
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
data:{
list:[],
// 权限的树形结构数据
treeData: [],
// 默认选中的权限列表
checkedKeys:[],
// 树的唯一标识
nodeKey:"menu_id",
},
page: {
title: "菜单赋予",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "7vh",
width:"800px",
loading: false
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
role_id:"",
reset:true,
menuList:[],
addPermission:true
},
// 表单属性
props: {
// 表单请求地址
action: "admin/system/role/sys/bindMenu",
// 表单字段显示规则
columns: [
{ key: "addPermission", title: "同时赋予菜单内置权限", type: "switch" },
{ key: "menuList", title: "菜单列表", type: "text", showLabel:false },
],
// 表单验证规则
rules: {
},
labelWidth: "160px",
beforeAction:function(formData){
let checkedKeys = that.$refs.tree.getCheckedKeys();
let halfCheckedKeys = that.$refs.tree.getHalfCheckedKeys();
let allCheckedKeys = checkedKeys.concat(halfCheckedKeys);
// 去除空属性
for(let i = 0;i<allCheckedKeys.length;i++){
if(vk.pubfn.isNull(allCheckedKeys[i])){
allCheckedKeys.splice(i, 1);
i--;
}
}
formData.menuList = allCheckedKeys;
return formData;
}
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { value={} } = that;
let { item } = value;
let { role_id, role_name, menu = [] } = item;
that.page.title = `菜单赋予(${role_name})`;
that.form1.data.role_id = role_id;
that.form1.data.menuList = menu;
if (vk.pubfn.isNotNull(that.data.treeData)){
that.initData();
return;
}
that.getList();
},
getList(){
vk.callFunction({
url: 'admin/system/menu/sys/getAll',
loading:{ that, name:"page.loading" },
data: {},
success: (data) => {
let rows = [{
label :"全选",
menu_id :"",
children : data.rows
}];
// 渲染树
that.data.treeData = rows;
that.data.list = data.list;
that.initData();
}
});
},
initData(){
let { value={} } = that;
let { item } = value;
let { role_id, role_name, menu = [] } = item;
let current = vk.pubfn.copyObject(menu);
// 设置当前选中用户的权限列表
// 去除所有含有子元素的权限
for(let i in that.data.list){
let item = that.data.list[i];
let index = current.indexOf(item.parent_id);
if(index > -1){
current.splice(index, 1);
}
}
that.data.checkedKeys = current;
that.$refs.tree.setCheckedKeys(current);
},
// 监听 - 页面关闭
onClose() {
that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess(res) {
if (res.data.info) {
that.$set(that.value.item, "menu", res.data.info.menu);
that.$set(that.value.item, "stats_count_info", res.data.info.stats_count_info);
}
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,264 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
v-loading="page.loading"
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:before-action="form1.props.beforeAction"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
>
<template v-slot:permissionList>
<el-tree
ref="tree"
:data="data.treeData"
:node-key="data.nodeKey"
:default-checked-keys="data.checkedKeys"
:props="{
children: 'children',
label: 'label'
}"
show-checkbox
default-expand-all
expand-on-click-node
></el-tree>
</template>
</vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: ""
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
data:{
list:[],
info:{},
// 权限的树形结构数据
treeData: [],
// 默认选中的权限列表
checkedKeys:[],
// 树的唯一标识
nodeKey:"permission_id",
},
page: {
title: "权限赋予",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "7vh",
width:"800px",
loading: false
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
role_id:"",
reset:true,
permissionList:[],
stats_count_info:{}
},
// 表单属性
props: {
// 表单请求地址
action: "admin/system/role/sys/bindPermission",
// 表单字段显示规则
columns: [
// 常用字段类型
{ key: "permissionList", title: "权限列表", type: "text" }
],
// 表单验证规则
rules: {
},
labelWidth: "100px",
beforeAction:function(formData){
let checkedKeys = that.$refs.tree.getCheckedKeys();
let halfCheckedKeys = that.$refs.tree.getHalfCheckedKeys();
let allCheckedKeys = checkedKeys.concat(halfCheckedKeys);
// 去除空属性
for(let i = 0;i<allCheckedKeys.length;i++){
if(vk.pubfn.isNull(allCheckedKeys[i])){
allCheckedKeys.splice(i, 1);
i--;
}
}
formData.permissionList = allCheckedKeys;
let menuNum = vk.pubfn.getData(that.data,"info.stats_count_info.type[0].count",0);
if(typeof menuNum !== "number") menuNum = 0;
let list = vk.pubfn.treeToArray(that.data.treeData, {
id:"permission_id",
parent_id:"parent_id",
children:"children",
deleteChildren:true
});
let stats_count_info = {
// 各个分类有多少个数量
curd_category: [
{ type: 0, label: "未分类", count: 0 },
{ type: 1, label: "增", count: 0 },
{ type: 2, label: "删", count: 0 },
{ type: 3, label: "改", count: 0 },
{ type: 4, label: "查", count: 0 },
{ type: 5, label: "特殊", count: 0 }
],
// 各个等级有多少个数量
level: [
{ type: 0, label: "未分类", count: 0 },
{ type: 1, label: "子弹级", count: 0 },
{ type: 2, label: "炸弹级", count: 0 },
{ type: 3, label: "榴弹级", count: 0 },
{ type: 4, label: "核弹级", count: 0 }
],
// 各个模式有多少个数量
match_mode: [
{ type: 0, label: "完整路径", count: 0 },
{ type: 1, label: "通配符", count: 0 },
{ type: 2, label: "正则表达式", count: 0 }
],
// 菜单和权限分别多少个数量
type: [
{ type: 0, label: "菜单", count: menuNum },
{ type: 1, label: "权限", count: 0 }
]
};
allCheckedKeys.forEach((value,index,arr)=>{
let res = vk.pubfn.getListItem(list,"permission_id",value);
let { curd_category=0, level=0, match_mode=0, url } = res;
if(vk.pubfn.isNotNull(url)){
stats_count_info["type"][1].count++;
stats_count_info["curd_category"][curd_category].count++;
stats_count_info["level"][level].count++;
stats_count_info["match_mode"][match_mode].count++;
};
});
formData.stats_count_info = stats_count_info;
return formData;
}
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { value={} } = that;
let { item } = value;
let { role_id, role_name, permission = [] } = item;
that.page.title = `权限赋予(${role_name})`;
that.data.info = item;
that.form1.data.role_id = role_id;
that.form1.data.permissionList = permission;
if (vk.pubfn.isNotNull(that.data.treeData)){
that.initData();
return;
}
that.getList();
},
getList(){
// 执行请求
vk.callFunction({
url: 'admin/system/permission/sys/getAll',
data: {},
loading:{ that, name:"page.loading" },
success: (data) => {
let rows = [{
label :"全选",
permission_id :"",
children : data.rows
}];
// 渲染树
that.data.treeData = rows;
that.data.list = data.list;
that.initData();
}
});
},
initData(){
let { value={} } = that;
let { item } = value;
let { menu_id, name, permission = [] } = item;
let current = vk.pubfn.copyObject(permission);
// 设置当前选中用户的权限列表
// 去除所有含有子元素的权限
for(let i in that.data.list){
let item = that.data.list[i];
let index = current.indexOf(item.parent_id);
if(index > -1){
current.splice(index, 1);
}
}
that.data.checkedKeys = current;
that.$refs.tree.setCheckedKeys(current);
},
// 监听 - 页面关闭
onClose() {
that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess(res) {
if (res.data.info) {
that.$set(that.value.item, "permission", res.data.info.permission);
that.$set(that.value.item, "stats_count_info", res.data.info.stats_count_info);
}
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
+340
View File
@@ -0,0 +1,340 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
@search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view class="vk-table-button-box">
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<el-button type="primary" size="small" icon="el-icon-s-tools" :disabled="!table1.selectItem" @click="bindPermissionBtn">权限赋予</el-button>
<el-button type="danger" size="small" icon="el-icon-s-tools" :disabled="!table1.selectItem" @click="bindMenu">菜单赋予</el-button>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']"
:selection="false"
:row-no="true"
:pagination="true"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
:title="form1.props.title"
width="500px"
mode="form"
>
<vk-data-form
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
label-width="80px"
@success="form1.props.show = false;refresh();"
></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 角色赋予权限弹窗 -->
<bindPermission v-model="formDatas.bindPermission"></bindPermission>
<!-- 角色赋予菜单弹窗 -->
<bindMenu v-model="formDatas.bindMenu"></bindMenu>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
import bindPermission from './form/bindPermission'
import bindMenu from './form/bindMenu'
export default {
components:{
bindPermission,
bindMenu
},
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading:false,
// init请求返回的数据
data:{
},
// 表格相关开始 -----------------------------------------------------------
table1:{
// 表格数据请求地址
action:"admin/system/role/sys/getList",
// 表格字段显示规则
columns: [
{ key:"role_id", title:"角色标识", type:"text", width:220 },
{ key:"role_name", title:"角色名称", type:"text", width:130 },
{ key:"comment", title:"备注", type:"text", minWidth:180 },
{ key:"permissionList", title:"拥有的权限", type:"text", minWidth:290, align:"left",
formatter:(val, row, column, index)=>{
let str = "";
if(row.role_id === "admin"){
str = "系统内置角色 - 拥有所有权限";
}else if(vk.pubfn.isNull(val)){
str = "该角色未赋予任何权限";
}else{
val.map((item, index) => {
if(vk.pubfn.isNotNull(item.url)){
str += item.permission_name;
if (index !== val.length - 1) {
str += "、";
}
}
});
}
return str;
}
},
{ key:"menuList", title:"拥有的菜单", type:"text", minWidth:290, align:"left",
formatter:(val, row, column, index)=>{
let str = "";
if(row.role_id === "admin"){
str = "系统内置角色 - 拥有所有菜单";
}else if(vk.pubfn.isNull(val)){
str = "该角色未赋予任何菜单";
}else{
val.map((item, index) => {
str += item.name;
if (index !== val.length - 1) {
str += "、";
}
});
}
return str;
}
},
// 系统
{ key:"stats_count_info", title:"统计信息", type:"html", width:220, align:"left", show: ["detail"],
formatter:(val, row, column, index)=>{
console.log(`val`,val);
let str = ``;
if(row.role_id === "admin"){
return "拥有所有权限";
}
for (let value in val) {
switch(value){
case "curd_category":
str+= `分类:&nbsp;&nbsp;`;
break;
case "level":
str+= `等级:&nbsp;&nbsp;`;
break;
case "match_mode":
str+= `模式:&nbsp;&nbsp;`;
break;
default:
str+= `菜单和权限:&nbsp;&nbsp;`;
break;
};
for (let [index, item] of val[value].entries()) {
str += `${item.label} : ${item.count}个&nbsp;&nbsp;`;
};
str +=`<br/>`;
};
return str;
}
},
{
key: "enable", title: "是否启用", type: "switch",
activeValue: true,
inactiveValue: false,
width: 80,
watch: (res) => {
let { value, row, change } = res;
vk.callFunction({
url: "admin/system/role/sys/updateBase",
title: value ? "启用中..." : "关闭中...",
data: {
_id: row._id,
enable: value
},
success: data => {
change(value); // 这一步是让表格行内的开关改变显示状态
}
});
}
}
],
// 多选框选中的值
multipleSelection:[],
// 当前高亮的记录
selectItem:"",
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始-----------------------------------------------------------
// 查询表单请求数据
queryForm1:{
// 查询表单数据源,可在此设置默认值
formData:{
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns:[
{ key:"role_id", title:"角色标识", type:"text", width: 160, mode:"%%" },
{ key:"role_name", title:"角色名称", type:"text", width: 160, mode:"%%" },
{ key:"_add_time", title:"添加时间", type:"datetimerange", width:400 },
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
enable:true,
},
// 表单属性
props: {
// 表单请求地址
action:"",
// 表单字段显示规则
columns:[
{ key:"role_id", title:"角色标识", type:"text", show:["add"] },
{ key:"role_name", title:"角色名称", type:"text" },
{ key:"comment", title:"备注", type:"textarea",
maxlength:"99", showWordLimit:true, autosize:{ minRows: 2, maxRows: 10 } ,
},
{ key:"enable", title:"是否启用", type:"switch" }
],
// 表单验证规则
rules:{
role_id:[
{ required:true, message:'角色标识不能为空', trigger:'blur' },
],
role_name:[
{ required:true, message:'角色名称不能为空', trigger:'change' }
],
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show:false,
}
},
// 其他表单属性容器(请勿修改)
formDatas:{},
// 表单相关结束-----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm(){
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(){
that.$refs.table1.query();
},
// 刷新
refresh(){
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow(key){
return that.$refs.table1.getCurrentRow(key);
},
// 监听 - 行的选中高亮事件
currentChange(val){
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn(){
that.resetForm();
that.form1.props.action = 'admin/system/role/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({ item }){
that.form1.props.action = 'admin/system/role/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
that.form1.data = item;
},
// 删除按钮
deleteBtn({ item, deleteFn }){
deleteFn({
action:"admin/system/role/sys/delete",
data:{
role_id: item.role_id
},
});
},
// 权限赋予按钮
bindPermissionBtn(){
let item = that.getCurrentRow(true);
vk.pubfn.openForm('bindPermission',{ item });
},
// 菜单赋予绑定按钮
bindMenu(){
let item = that.getCurrentRow(true);
vk.pubfn.openForm('bindMenu',{ item });
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
::v-deep .el-tree-node__content .el-checkbox {
margin-right: 8px;
}
</style>
+160
View File
@@ -0,0 +1,160 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
:form-type="value.mode"
v-loading="page.loading"
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
>
<template v-slot:user_id>
<view style="display: flex;align-items: center;">
<el-avatar v-if="data.avatar" :src="data.avatar" fit="cover"></el-avatar>
<text style="margin-left: 10px;">{{ data.nickname }}(ID:{{ data._id }})</text>
</view>
</template>
</vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: ""
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
// 页面基础数据
page: {
title: "角色绑定",
submitText: "绑定",
cancelText: "关闭",
showCancel: true,
top: "7vh",
width:"820px",
loading: false
},
data:{
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
user_id: "",
roleList: [],
reset: true
},
// 表单属性
props: {
// 表单请求地址
action: "admin/system/user/sys/bindRole",
// 表单字段显示规则
columns: [
{ key:"user_id", title:"用户", type:"text" },
{
key: "roleList", title: "角色列表", type: "table-select", placeholder:"选择角色",
action:"admin/system/role/sys/getList",
columns:[
{ key:"role_name", title:"角色昵称", type:"text", nameKey:true },
{ key:"role_id", title:"角色标识", type:"text", idKey:true },
{ key:"comment", title:"备注", type:"text" },
],
formData:{
enable:true
},
queryColumns:[
{ key: "role_name", title: "角色昵称", type: "text", width: 150, mode: "%%" },
{ key: "role_id", title: "角色标识", type: "text", width: 150, mode: "%%" },
{ key: "enable", type: "text", mode: "=", hidden:true }
],
multiple:true,
pageSize:10, // 只有5和10可以选
},
],
// 表单验证规则
rules: {
user_id: [
{ "required": true, "message": "user_id不能为空", "trigger": "change" }
]
},
// label宽度
labelWidth:"100px",
// label对其方式
labelPosition:"left",
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { value } = that;
let { role = [], _id } = value.item;
that.data = value.item;
that.form1.props.show = true;
that.form1.data.user_id = _id;
that.form1.data.roleList = role;
},
// 监听 - 页面关闭
onClose() {
that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 表单提交成功后
onFormSuccess() {
that.$set(that.value.item, "role", that.form1.data.roleList);
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,146 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
:form-type="value.mode"
v-loading="page.loading"
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
>
<template v-slot:user_id>
<view style="display: flex;align-items: center;">
<el-avatar v-if="data.avatar" :src="data.avatar" fit="cover"></el-avatar>
<text style="margin-left: 10px;">{{ data.nickname }}(ID:{{ data._id }})</text>
</view>
</template>
</vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: ""
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
// 页面基础数据
page: {
title: "重置密码",
submitText: "修改",
cancelText: "关闭",
showCancel: true,
top: "7vh",
width:"600px",
loading: false
},
data:{
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
user_id: "",
password:""
},
// 表单属性
props: {
// 表单请求地址
action: "admin/system/user/sys/resetPassword",
// 表单字段显示规则
columns: [
{ key:"user_id", title:"用户", type:"text" },
{ key:"password", title:"新密码", type:"password", showPassword:true },
],
// 表单验证规则
rules: {
user_id: [
{ "required": true, "message": "user_id不能为空", "trigger": "change" }
],
password:[
{ required:true, message:'新密码不能为空', trigger:'change' },
{ validator:vk.pubfn.validator("password"), message: '密码长度在6~18之间,只能包含字母、数字和下划线', trigger: 'change' }
],
},
// label宽度
labelWidth:"100px",
// label对其方式
labelPosition:"left",
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item={} } = that.value;
let data = vk.pubfn.copyObject(item);
that.data = data;
that.form1.data = {
user_id: data._id,
password: ""
};
},
// 监听 - 页面关闭
onClose() {
that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 表单提交成功后
onFormSuccess() {
that.value.show = false; // 关闭页面
that.$emit("success");
},
},
// 监听属性
watch: {
},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,178 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
mode="form"
@open="onOpen"
@closed="onClose"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:before-action="form1.props.beforeAction"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "标题",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "7vh",
width: "800px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
login_appid_type:1,
mode:1
},
// 表单属性
props: {
// 表单请求地址
action: "admin/system/user/sys/batchUpdateAppLogin",
// 表单字段显示规则
columns: [
{
key:"login_appid_type", title:"登录权限", type:"radio",
optionType:"button",
data:[
{ value:1, label:"部分应用" },
{ value:0, label:"全部应用" }
]
},
{
key:"mode", title:"模式", type:"radio",
optionType:"button",
data:[
{ value:1, label:"覆盖" },
{ value:2, label:"新增" },
{ value:3, label:"移除" }
],
showRule:"login_appid_type=1",
},
{
key:"dcloud_appid", title:"可登录的应用", type:"checkbox",
border:true,
itemWidth:100,
data:[],
props:{ value:"appid", label:"name" },
showRule:"login_appid_type=1&&mode=1"
},
{
key:"dcloud_appid", title:"可登录的应用", type:"radio",
border:true,
itemWidth:100,
data:[],
props:{ value:"appid", label:"name" },
showRule:"login_appid_type=1&&mode!=1"
},
],
// 表单验证规则
rules: {
},
// 左侧label的宽度
labelWidth: "100px",
// 提交前执行
beforeAction:function(formData){
let allow_login_background = false;
if(!formData.login_appid_type){
allow_login_background = true;
}else{
if(typeof formData.dcloud_appid === "object"){
formData.dcloud_appid.map((appid, index) => {
let item = vk.pubfn.getListItem(that.value.item.dcloudAppidData, "appid", appid);
if(item.type === "admin"){
allow_login_background = true;
}
});
}else{
let item = vk.pubfn.getListItem(that.value.item.dcloudAppidData, "appid", formData.dcloud_appid);
if(item.type === "admin"){
allow_login_background = true;
}
}
}
formData.user_ids = that.value.item.user_ids;
formData.allow_login_background = allow_login_background;
return formData;
}
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item={} } = that.value;
// 每次打开时,重新设置表单的值 = value.item 的值,item通过 vk.pubfn.openForm('表单名',{ item:{ _id:"1" } }) 传递值
that.form1.props.columns[2].data = item.dcloudAppidData;
that.form1.props.columns[3].data = item.dcloudAppidData;
},
// 监听 - 页面关闭
onClose() {
//that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess() {
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
// 监听属性
watch: {
},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
+473
View File
@@ -0,0 +1,473 @@
<template>
<view class="page-body">
<!-- 请不要修改此页面的代码,因为更新后会覆盖,你自己系统的用户管理不应该在这个页面上开发,你应该复制整个页面,在别的目录创建用户管理。 -->
<!-- 请不要修改此页面的代码,因为更新后会覆盖,你自己系统的用户管理不应该在这个页面上开发,你应该复制整个页面,在别的目录创建用户管理。 -->
<!-- 请不要修改此页面的代码,因为更新后会覆盖,你自己系统的用户管理不应该在这个页面上开发,你应该复制整个页面,在别的目录创建用户管理。 -->
<!-- 请不要修改此页面的代码,因为更新后会覆盖,你自己系统的用户管理不应该在这个页面上开发,你应该复制整个页面,在别的目录创建用户管理。 -->
<!-- 请不要修改此页面的代码,因为更新后会覆盖,你自己系统的用户管理不应该在这个页面上开发,你应该复制整个页面,在别的目录创建用户管理。 -->
<!-- 请不要修改此页面的代码,因为更新后会覆盖,你自己系统的用户管理不应该在这个页面上开发,你应该复制整个页面,在别的目录创建用户管理。 -->
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
@search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 自定义按钮区域开始 -->
<view class="vk-table-button-box">
<el-button type="success" size="small" icon="el-icon-circle-plus-outline" @click="addBtn">添加</el-button>
<!-- 批量操作 -->
<el-dropdown v-if="table1.multipleSelection" :split-button="false" trigger="click" @command="batchBtn">
<el-button type="danger" size="small"
:disabled="table1.multipleSelection.length === 0"
>
批量操作<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="1">账号批量解冻</el-dropdown-item>
<el-dropdown-item :command="2">账号批量冻结</el-dropdown-item>
<el-dropdown-item :command="3">批量设置可登录的应用</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button type="primary" size="small" icon="el-icon-s-tools" :disabled="!table1.selectItem" @click="bindRoleBtn">角色绑定</el-button>
<el-button type="primary" size="small" icon="el-icon-warning-outline" :disabled="!table1.selectItem" @click="resetPasswordBtn">重置密码</el-button>
</view>
<!-- 自定义按钮区域结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto','update','delete']"
:selection="true"
:row-no="true"
:pagination="true"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
:title="form1.props.title"
width="580px"
top="4vh"
mode="form"
>
<vk-data-form
ref="form1"
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
label-width="120px"
max-height="700px"
@success="form1.props.show = false;refresh();"
></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 用户角色授权弹窗 -->
<bindRole v-model="formDatas.bindRole"></bindRole>
<!-- 重置密码弹窗 -->
<resetPassword v-model="formDatas.resetPassword"></resetPassword>
<!-- 批量设置用户允许登录的客户端 -->
<setAuthorizedAppLogin v-model="formDatas.setAuthorizedAppLogin" @success="refresh"></setAuthorizedAppLogin>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
var genderData = [
{ value:1, label:"男"},
{ value:2, label:"女"},
{ value:0, label:"保密"}
];
var dcloudAppidData = [];
import bindRole from './form/bindRole'
import resetPassword from './form/resetPassword'
import setAuthorizedAppLogin from './form/setAuthorizedAppLogin'
export default {
components:{
bindRole,
resetPassword,
setAuthorizedAppLogin
},
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading:false,
// init请求返回的数据
data:{
},
// 表格相关开始 -----------------------------------------------------------
table1:{
// 表格数据请求地址
action:"admin/system/user/sys/getList",
// 表格字段显示规则
columns: [
{ key:"avatar", title:"头像", type:"avatar", width:80 },
{ key:"username", title:"用户名", type:"text", width:180, defaultValue:'未设置' },
{ key:"nickname", title:"昵称", type:"text", width:180, defaultValue:'未设置' },
{ key:"mobile", title:"手机号", type:"text", width:120, defaultValue:"未绑定" },
{ key:"appList", title:"可登录的应用", type:"html", width:220,
formatter: function(val, row, column, index) {
if(typeof row.dcloud_appid === "undefined") return "全部应用";
if(row.dcloud_appid.length === 0) return "未绑定任何应用";
if(val.length === 0 && row.dcloud_appid.length > 0) return row.dcloud_appid;
let str = "";
val.map((item, index) => {
str += `、${item.name}`;
});
if(str) str = str.substring(1);
return str;
}
},
{ key:"role", title:"角色", type:"text", width:120, defaultValue:'无' },
{ key:"comment", title:"备注", type:"text", width:160 },
{ key:"allow_login_background", title:"允许登录后台", type:"tag", width: 140, defaultValue:false, sortable:"custom",
data:[
{ value:true, label:"允许", tagType:"success" },
{ value:false, label:"禁止", tagType:"danger" }
]
},
{ key:"status", title:"账户状态", type:"tag", width:120, defaultValue:0, sortable:"custom",
data:[
{ value:0, label:"正常", tagType:"success" },
{ value:1, label:"冻结", tagType:"danger" },
{ value:2, label:"审核中", tagType:"primary" },
{ value:3, label:"审核拒绝", tagType:"info" }
]
},
{ key:"gender", title:"性别", type:"radio", width:80, defaultValue:0, sortable:"custom",
data:genderData
},
{ key:"register_date", title:"注册时间", type:"time", width:160, sortable:"custom" },
{ key:"last_login_date", title:"最后登录时间", type:"dateDiff", width:130, defaultValue:'从未登录过', sortable:"custom" },
{ key:"last_login_ip", title:"最后登录ip", type:"text", width:120, defaultValue:'从未登录过' },
{ key:"_id", title:"id", type:"text", width:280 },
],
// 多选框选中的值
multipleSelection:[],
// 当前高亮的记录
selectItem:"",
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始-----------------------------------------------------------
// 查询表单请求数据
queryForm1:{
// 查询表单数据源,可在此设置默认值
formData:{
dcloud_appid:""
//allow_login_background : true,
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns:[
{ key:"dcloud_appid", title:"所属应用", type:"select", width:160, mode:"custom",
data:[],
props:{ value:"appid", label:"name" }
},
{ key:"username", title:"用户名", type:"text", width:160, mode:"%%" },
{ key:"nickname", title:"昵称", type:"text", width:140, mode:"%%" },
{ key:"mobile", title:"手机号", type:"text", width:140, mode:"%%" },
{ key:"_id", title:"ID", type:"text", width:140, mode:"=" },
{ key:"register_date", title:"注册时间", type:"datetimerange", width:380, mode:"[]" },
{ key:"allow_login_background", hidden:true, mode:"=" },
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
gender:0,
login_appid_type:1,
allow_login_background:false
},
// 表单属性
props: {
// 表单请求地址
action:"",
// 表单字段显示规则
columns:[
{ key:"username", title:"用户名", type:"text", show:["add"] },
{ key:"nickname", title:"昵称", type:"text" },
{ key:"gender", title:"性别", type:"radio",
data: genderData
},
{ key:"password", title:"密码", type:"text", tips:"若密码为空,则默认为234567", show:["add"] },
{ key:"mobile", title:"手机号", type:"text" },
{
key:"login_appid_type", title:"登录权限", type:"radio",
optionType:"button",
data:[
{ value:1, label:"部分应用" },
{ value:0, label:"全部应用" }
],
onChange:function(val, formData, column, index, option){
if(val === 1){
that.form1.data.allow_login_background = false
}else{
that.form1.data.allow_login_background = true;
}
}
},
{
key:"dcloud_appid", title:"可登录的应用", type:"checkbox",
border:true,
itemWidth:100,
data:[],
props:{ value:"appid", label:"name" },
showRule:"login_appid_type=1",
onChange:function(val, formData, column, index, option=[]){
let allow_login_background = false;
option.map((item={}, index) => {
if(item.type && item.type.indexOf("admin") > -1){
allow_login_background = true;
}
});
if(that.form1.data.login_appid_type === 1){
that.form1.data.allow_login_background = allow_login_background;
}else{
that.form1.data.allow_login_background = true;
}
}
},
// {
// key:"allow_login_background", title:"允许登录后台?", type:"switch",
// tips:"只有同时设置可登录的应用有管理端以及允许登后台,该用户才能登录管理端"
// },
{ key:"comment", title:"备注", type:"textarea",
maxlength:"99", showWordLimit:true, autosize:{ minRows: 2, maxRows: 10 } ,
},
],
// 表单对应的验证规则
rules:{
username:[
{
required: true,
validator:vk.pubfn.validator("username"),
message: '用户名以字母开头,长度在6~18之间,只能包含字母、数字和下划线',
trigger: 'blur'
}
],
nickname: [
{ required:true, message:'昵称为必填字段', trigger:'blur' },
{ min:2, max:20, message:'昵称长度在 2 到 20 个字符', trigger:'blur' }
],
password: [
{ validator:vk.pubfn.validator("password"), message: '密码长度在6~18之间,只能包含字母、数字和下划线', trigger: 'blur' }
],
mobile:[
{ validator:vk.pubfn.validator("mobile"), message: '手机号格式错误', trigger: 'blur' }
]
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show: false,
}
},
// 其他表单属性容器(请勿修改)
formDatas:{},
// 表单相关结束-----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
that.getAppList();
},
// 获取应用列表
getAppList(obj){
// 请在store/modules/$app.js文件里增加代码 appList: lifeData.$app.appList || []
vk.callFunction({
url: 'admin/system/app/sys/getList',
data:{},
success:function(data){
dcloudAppidData = data.rows;
let dcloudAppidData1 = vk.pubfn.copyObject(data.rows);
let dcloudAppidData2 = vk.pubfn.copyObject(data.rows);
let index1 = vk.pubfn.getListIndex(that.form1.props.columns, "key", "dcloud_appid");
that.form1.props.columns[index1].data = dcloudAppidData1;
dcloudAppidData2.unshift({
appid:"___error___",
name:"不存在的应用"
});
dcloudAppidData2.unshift({
appid:"___empty-array___",
name:"未绑定应用"
});
dcloudAppidData2.unshift({
appid:"___non-existent___",
name:"全部应用"
});
let index2 = vk.pubfn.getListIndex(that.queryForm1.columns, "key", "dcloud_appid");
that.queryForm1.columns[index2].data = dcloudAppidData2;
let appids = [];
dcloudAppidData.map((item, index) => {
appids.push(item.appid);
});
that.queryForm1.formData.appids = appids;
}
});
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm(){
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(){
that.$refs.table1.query();
},
// 刷新
refresh(){
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow(key){
return that.$refs.table1.getCurrentRow(key);
},
// 监听 - 行的选中高亮事件
currentChange(val){
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn(){
that.resetForm();
that.form1.props.action = 'admin/system/user/sys/add';
that.form1.props.formType = 'add';
that.form1.props.title = '添加';
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({ item }){
that.form1.props.action = 'admin/system/user/sys/update';
that.form1.props.formType = 'update';
that.form1.props.title = '编辑';
that.form1.props.show = true;
item.login_appid_type = typeof item.dcloud_appid === "undefined" ? 0 :1;
that.form1.data = item;
},
// 删除按钮
deleteBtn({ item, deleteFn }){
deleteFn({
action:"admin/system/user/sys/delete",
data:{
_id: item._id
}
});
},
// 监听 - 批量操作的按钮点击事件
batchBtn(index){
switch(index){
case 1: that.frozen(0); break;
case 2: that.frozen(1); break;
case 3: that.setAuthorizedAppLogin(); break;
default: break;
}
},
// 角色绑定按钮
bindRoleBtn(){
let item = that.getCurrentRow(true);
vk.pubfn.openForm('bindRole',{ item });
},
// 重置密码按钮
resetPasswordBtn(){
let item = that.getCurrentRow(true);
vk.pubfn.openForm('resetPassword',{ item });
},
//账户批量冻结/解冻
frozen(status){
let user_ids = [];
that.table1.multipleSelection.map((item,index)=>{
user_ids.push(item._id);
});
vk.callFunction({
url: 'admin/system/user/sys/batchUpdateStatus',
title:'请求中...',
data:{
user_ids,
status
},
success:function(data) {
that.$notify({
message:'批量操作成功!',
type:'success'
});
that.refresh();
}
});
},
// 批量设置允许登录的客户端
setAuthorizedAppLogin(){
let user_ids = [];
that.table1.multipleSelection.map((item,index)=>{
user_ids.push(item._id);
});
that.formDatas.setAuthorizedAppLogin = {
show:true,
item:{
user_ids,
dcloudAppidData
}
};
}
},
// 监听属性
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
+119
View File
@@ -0,0 +1,119 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
@search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto']"
:row-no="true"
:pagination="true"
></vk-data-table>
<!-- 表格组件结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/system_uni/admin-log/sys/getList",
// 表格字段显示规则
columns: [
{ key: "user_id", title: "操作者用户ID", type: "text", width: 120 },
{ key: "user_name", title: "操作者用户昵称", type: "text", width: 120 },
{ key: "title", title: "标题", type: "text", width: 140 },
{ key: "url", title: "url", type: "text", width: 280 },
{ key: "_add_time", title: "添加时间", type: "time", width: 140 },
{ key: "_add_time", title: "距离现在", type: "dateDiff", width: 120 },
{ key: "request_param", title: "请求参数", type: "json", width: 300 },
{ key: "response", title: "返回参数", type: "json", width: 300 },
{ key: "ip", title: "ip地址", type: "text", width: 140 },
{ key: "request_id", title: "请求id", type: "text", width: 280 }
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
{ key: "user_id", title: "用户ID", type: "text", mode: "=" },
{ key: "title", title: "标题", type: "text", mode: "%%" },
{ key: "ip", title: "ip地址", type: "text", mode: "%%" },
{ key: "_add_time", title: "添加时间", type: "datetimerange", width: 400, mode: "[]" }
]
}
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {},
// 搜索
search(obj) {
that.$refs.table1.query(obj);
},
// 刷新
refresh() {
that.$refs.table1.refresh();
}
},
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,128 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
mode="form"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "添加分组",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "14vh",
width: "450px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {},
// 表单属性
props: {
// 表单请求地址
action: "admin/system_uni/uni-id-files/categories/sys/add",
// 表单字段显示规则
columns: [
// 常用字段类型
{ key: "name", title: "名称", type: "text" }
],
// 表单验证规则
rules: {
name: [
{ required: true, message: '名称不能为空', trigger: 'change' },
{ max: 16, message: '最多16字', trigger: 'change' }
],
},
labelWidth: "60px"
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item } = that.value;
that.form1.data = {
_id: item._id,
name: item.name
};
},
// 监听 - 页面关闭
onClose() {
that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess() {
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
watch: {
"value.show": {
handler(newValue, oldValue) {
let that = this;
if (newValue) {
that.onOpen();
} else {
that.onClose();
}
}
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,107 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
:show-fullscreen="false"
:show-header="false"
:destroy-on-close="true"
mode="form"
>
<!-- 页面主体内容开始 -->
<image v-if="value.item.type === 'image'" :src="value.item.url" mode="widthFix" style="width: 100%;display: block;"></image>
<view v-else-if="value.item.type === 'video' && value.show" :style="styleCom" style="margin: auto;">
<video :src="value.item.url" autoplay object-fit="cover" style="width: 100%;height: 100%;display: block;"></video>
</view>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "预览",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "2vh",
width: "600px"
},
styleCom:{}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item } = that.value;
let { width, height=700, type } = item;
//if(type === "video"){
let showWidth = width;
let showHeight = height;
let maxHeight = 700;
if(height > maxHeight){
showHeight = maxHeight;
showWidth = width / height * maxHeight;
}
that.styleCom = {
width : `${showWidth}px`,
height : `${showHeight}px`
};
that.page.width = that.styleCom.width;
that.$set(that.value.item,"play",true);
//}
},
// 监听 - 页面关闭
onClose() {
that.$set(that.value.item,"play",false);
}
},
watch: {
"value.show": {
handler(newValue, oldValue) {
let that = this;
if (newValue) {
that.onOpen();
} else {
that.onClose();
}
}
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,130 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
mode="form"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "修改分组名称",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "14vh",
width: "450px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {},
// 表单属性
props: {
// 表单请求地址
action: "admin/system_uni/uni-id-files/categories/sys/update",
// 表单字段显示规则
columns: [
// 常用字段类型
{ key: "name", title: "名称", type: "text" }
],
// 表单验证规则
rules: {
name: [
{ required: true, message: '名称不能为空', trigger: 'change' },
{ max: 16, message: '最多16字', trigger: 'change' }
],
},
labelWidth: "60px"
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item } = that.value;
that.form1.data = {
_id: item._id,
name: item.name
};
},
// 监听 - 页面关闭
onClose() {
// that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess() {
// 此代码用处是直接将修改结果显示到页面上,而不需要进行数据库查询。
that.value.item.name = that.form1.data.name;
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
watch: {
"value.show": {
handler(newValue, oldValue) {
let that = this;
if (newValue) {
that.onOpen();
} else {
that.onClose();
}
}
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,137 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
mode="form"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
>
<template v-slot:category_id="{ form, keyName }">
<vk-data-input-radio
width="100%"
v-model="form[keyName]"
:localdata="value.list"
:props="{ value:'_id', label:'name' }"
placeholder="请选择分组"
border
:item-width="300"
></vk-data-input-radio>
</template>
</vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {},
list:[]
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "修改分组",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "14vh",
width: "450px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {},
// 表单属性
props: {
// 表单请求地址
action: "admin/system_uni/uni-id-files/files/kh/update",
// 表单字段显示规则
columns: [
{
key:"category_id", title:"分组", type:"select", placeholder:"请选择分组",
}
],
// 表单验证规则
rules: {},
labelWidth: "60px"
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item } = that.value;
that.form1.data = {
_id: item._id,
category_id: item.category_id
};
},
// 监听 - 页面关闭
onClose() {
// that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess() {
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
watch: {
"value.show": {
handler(newValue, oldValue) {
let that = this;
if (newValue) {
that.onOpen();
} else {
that.onClose();
}
}
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,128 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
mode="form"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "修改文件名称",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "14vh",
width: "450px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {},
// 表单属性
props: {
// 表单请求地址
action: "admin/system_uni/uni-id-files/files/kh/update",
// 表单字段显示规则
columns: [
{ key: "display_name", title: "名称", type: "text" },
],
// 表单验证规则
rules: {
display_name: [
{ required: true, message: '名称不能为空', trigger: 'change' },
{ max: 32, message: '最多32字', trigger: 'change' }
],
},
labelWidth: "60px"
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item } = that.value;
that.form1.data = {
_id: item._id,
display_name: item.display_name
};
},
// 监听 - 页面关闭
onClose() {
// that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess() {
that.value.item.display_name = that.form1.data.display_name;
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
watch: {
"value.show": {
handler(newValue, oldValue) {
let that = this;
if (newValue) {
that.onOpen();
} else {
that.onClose();
}
}
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,131 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="true"
mode="form"
>
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:form-type="value.mode"
:rules="form1.props.rules"
:action="form1.props.action"
:columns="form1.props.columns"
:loading.sync="form1.props.loading"
:labelWidth="form1.props.labelWidth"
:show-cancel="page.showCancel"
:cancel-text="page.cancelText"
:submit-text="page.submitText"
@success="onFormSuccess"
></vk-data-form>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "编辑视频信息",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "14vh",
width: "450px"
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {},
// 表单属性
props: {
// 表单请求地址
action: "admin/system_uni/uni-id-files/files/kh/update",
// 表单字段显示规则
columns: [
{ key: "display_name", title: "名称", type: "text" },
{ key: "cover_image", title: "封面图", type: "image", limit:1 },
],
// 表单验证规则
rules: {
display_name: [
{ required: true, message: '名称不能为空', trigger: 'change' },
{ max: 32, message: '最多32字', trigger: 'change' }
],
},
labelWidth: "60px"
}
}
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item } = that.value;
that.form1.data = {
_id: item._id,
display_name: item.display_name,
cover_image: item.cover_image
};
},
// 监听 - 页面关闭
onClose() {
// that.$refs.form1.resetForm(); // 关闭时,重置表单
},
// 监听 - 提交成功后
onFormSuccess() {
that.$set(that.value.item,"display_name",that.form1.data.display_name);
that.$set(that.value.item,"cover_image",that.form1.data.cover_image);
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
watch: {
"value.show": {
handler(newValue, oldValue) {
let that = this;
if (newValue) {
that.onOpen();
} else {
that.onClose();
}
}
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped></style>
@@ -0,0 +1,143 @@
<template>
<vk-data-dialog
v-model="value.show"
:title="page.title"
:top="page.top"
:width="page.width"
:close-on-click-modal="false"
:show-fullscreen="false"
:show-close="false"
:destroy-on-close="true"
mode="form"
>
<!-- 页面主体内容开始 -->
<view class="body" v-if="total>1">
<view>
<text>总进度:{{ currentIndex+1 }} / {{ total }}</text>
<el-progress :percentage="totalPercentage"></el-progress>
</view>
<view style="margin-top: 10px;">
<text>文件{{currentIndex+1}}进度:</text>
<el-progress :percentage="currentPercentage"></el-progress>
</view>
<view style="margin-top: 10px;text-align: center;">正在上传第 {{currentIndex+1}} 个文件</view>
</view>
<view class="body" v-else>
<view style="text-align: center;">
<el-progress :percentage="currentPercentage" type="circle"></el-progress>
</view>
</view>
<!-- 页面主体内容结束 -->
</vk-data-dialog>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
props: {
value: {
Type: Object,
default: function() {
return {
show: false,
mode: "",
item: {}
};
}
}
},
data: function() {
// 组件创建时,进行数据初始化
return {
page: {
title: "上传进度",
submitText: "确定",
cancelText: "关闭",
showCancel: true,
top: "40vh",
width: "500px"
},
total:0,
totalPercentage: 0, // 总进度
currentPercentage: 0, // 当前文件进度
currentIndex: 0,
};
},
mounted() {
that = this;
that.init();
},
methods: {
// 初始化
init() {
let { value } = that;
that.$emit("input", value);
},
// 监听 - 页面打开
onOpen() {
that = this;
let { item={} } = that.value;
that.upload(item);
},
// 监听 - 页面关闭
onClose() {
},
async upload(item){
let that = this;
let { vk } = that;
let { tempFilePaths, tempFiles, categoryId, fileType } = item;
that.total = tempFilePaths.length;
that.totalPercentage = 0;
for (let i = 0; i < tempFilePaths.length; i++) {
that.currentPercentage = 0;
that.currentIndex = i;
let percentage = vk.pubfn.toDecimal((i+1) / tempFilePaths.length * 100, 0);
try {
await vk.uploadFile({
filePath: tempFilePaths[i],
file: tempFiles[i],
needSave: true,
fileType,
category_id: categoryId,
onUploadProgress:(progressRes) => {
// 上传过程中
that.currentPercentage = progressRes.progress;
},
});
that.totalPercentage = percentage;
} catch(err){
console.error(err);
}
}
that.onSuccess();
},
// 监听 - 提交成功后
onSuccess() {
that.value.show = false; // 关闭页面
that.$emit("success");
}
},
watch: {
"value.show": {
handler(newValue, oldValue) {
let that = this;
if (newValue) {
that.onOpen();
} else {
that.onClose();
}
}
}
},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped>
.body{
padding: 30px;
}
</style>
@@ -0,0 +1,704 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<view class="header">
<view class="header-item" style="margin-left:0;">
<el-button type="primary" :round="false" size="small" icon="el-icon-plus upload-btn" @click="uploadFile" > 上传 </el-button>
</view>
<view class="header-item">
<el-radio-group v-model="queryForm1.formData.type" size="small" @change="getList">
<el-radio-button label="image">图片</el-radio-button>
<el-radio-button label="video">视频</el-radio-button>
<el-radio-button label="other">其他</el-radio-button>
</el-radio-group>
</view>
<view class="header-item">
<el-input class="search-input input-border-radius-4004" size="small" type="text" clearable placeholder="请输入名称搜索..." v-model="queryForm1.formData.display_name" @keyup.enter.native="getList" @clear="getList" />
<el-button type="primary" :loading="loading.main" :round="false" size="small" icon="el-icon-search" @click.stop="getList" style="border-radius: 0 4px 4px 0;" ></el-button>
</view>
<view class="header-item">
<el-input class="search-input input-border-radius-4004" size="small" type="text" clearable placeholder="请输入URL搜索..." v-model="queryForm1.formData.url" @keyup.enter.native="getList" @clear="getList" />
<el-button type="primary" :loading="loading.main" :round="false" size="small" icon="el-icon-search" @click.stop="getList" style="border-radius: 0 4px 4px 0;" ></el-button>
</view>
</view>
<view class="nav" v-loading="loading.nav">
<view
class="nav-list"
v-for="(item, index) of data.navList" :key="index"
:class="queryForm1.formData.category_id == item._id ? 'selected-nav' : ''"
@click.stop="queryByCategory(item._id)"
>
<text class="nav-name text-one">{{ item.name }}</text>
<view class="nav-btn">
<view v-if="index > 1" class="btn el-icon-edit" @click.stop="vk.pubfn.openForm('updateCategory', { item })" ></view>
<el-popconfirm v-if="index > 1" title="确定删除该分组吗?(组内图片不会删除)" @confirm="deleteCategory(item._id, index)" >
<view slot="reference" class="btn el-icon-delete" @click.stop="stop"></view>
</el-popconfirm>
</view>
</view>
<view class="add-group" @click.stop="vk.pubfn.openForm('addCategory')">添加分组</view>
</view>
<view class="main" v-loading="loading.main">
<!-- 内容详情 -->
<view
class="content-item"
:class="[selectedIds.includes(item._id) ? 'choose-image' : '']"
v-for="(item, index) in data.content.rows" :key="index"
@click.stop="clickFile(item)"
>
<view class="item-file">
<image :src="item.url" mode="aspectFit" v-if="item.type === 'image'"></image>
<view class="vk-contents" v-else-if="item.type === 'video'">
<image :src="item | coverImageFilter" mode="aspectFit"></image>
<view class="duration">{{ item.duration | durationFilter }}</view>
<view class="size">{{ item.size | sizeFilter(["B","KB","MB","GB"],1024,1,"MB") }}</view>
<vk-data-icon :name="item.play ?'el-icon-video-pause':'el-icon-video-play'" size="40" color="#d9d9d9" class="video-play-btn" @click="preview(item)"></vk-data-icon>
</view>
<view :src="item.url" class="other-icon" v-else>
<vk-data-icon name="el-icon-document" size="80" color="#d5d5de"></vk-data-icon>
<view class="size">{{ item.size | sizeFilter(["B","KB","MB","GB"],1024,1) }}</view>
<view class="suffix">{{ item.original_name | suffixFilter }}</view>
</view>
</view>
<view class="tips">
<text class="title">{{ item.display_name }}</text>
<text class="operation" v-if="item.type === 'video'" @click="vk.pubfn.openForm('updateVideo', { item })">编辑</text>
<text class="operation" v-else @click="vk.pubfn.openForm('updateFileName', { item })">改名</text>
<el-tooltip class="operation" placement="bottom">
<text>链接</text>
<view slot="content">
<view style="text-align: center;">
<el-button type="text" @click="copyFileUrl(item.url)" style="margin-left: 0px;"> 复制 </el-button>
<el-button type="text" @click="preview(item)" style="margin-left: 30px;"> 预览 </el-button>
</view>
<view>{{ item.url }}</view>
</view>
</el-tooltip>
<text class="operation" @click="vk.pubfn.openForm('updateFileCategory', { item, list: data.navList })" > 分组 </text>
<el-popconfirm class="operation" title="确定删除吗?" @confirm="deleteFile(item._id)">
<text slot="reference" @click.stop="stop">删除</text>
</el-popconfirm>
</view>
</view>
<!-- 上传的按钮 -->
<view class="update-img" @click.stop="uploadFile"></view>
</view>
<view class="footer" :class="selectedIds.length ? '' : 'no-selected'">
<label :style="data.content.rows.length ? '' : 'pointer-events: none;'" class="footer-label" @click.stop="selectAll" >
<checkbox style="transform: scale(0.6);" class="checkbox" :checked="selectedIds.length ? true : false" />
<text>已选</text>
<text class="num">{{ selectedIds.length }} / {{ data.content.rows.length }}</text>
<text>项</text>
</label>
<text class="footer-item" @click.stop=" vk.pubfn.openForm('updateFileCategory', { item: { _id: selectedIds }, list: data.navList }) " >
保存到组
</text>
<el-popconfirm class="footer-item" title="确定删除吗?" @confirm="deleteFile(selectedIds)" >
<text slot="reference">删除</text>
</el-popconfirm>
<!-- 底部分页内容 -->
<el-pagination
class="paging"
background
:total="data.content.total"
:current-page="queryForm1.pageIndex"
:page-size="queryForm1.pageSize"
:page-sizes="[30, 50, 100]"
:pager-count="5"
layout="total, sizes, prev, pager, next, jumper"
@size-change=" val => { queryForm1.pageSize = val; getList(); } "
@current-change=" val => { queryForm1.pageIndex = val; getList(); } "
></el-pagination>
</view>
<!-- 页面内容结束 -->
<!-- 弹窗列表 -->
<addCategory v-model="formDatas.addCategory" @success="getNavList"></addCategory>
<updateCategory v-model="formDatas.updateCategory"></updateCategory>
<updateFileCategory v-model="formDatas.updateFileCategory" @success="getList();selectedIds = [];"></updateFileCategory>
<updateFileName v-model="formDatas.updateFileName"></updateFileName>
<updateVideo v-model="formDatas.updateVideo"></updateVideo>
<preview v-model="formDatas.preview"></preview>
<uploadProgress v-model="formDatas.uploadProgress" @success="getList();"></uploadProgress>
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
import addCategory from "./form/addCategory";
import updateCategory from "./form/updateCategory";
import updateFileCategory from "./form/updateFileCategory";
import updateFileName from "./form/updateFileName";
import updateVideo from "./form/updateVideo";
import preview from "./form/preview";
import uploadProgress from "./form/uploadProgress";
export default {
components: {
addCategory,
updateCategory,
updateFileCategory,
updateFileName,
updateVideo,
preview,
uploadProgress
},
data() {
// 页面数据变量
return {
// 选中的
selectedIds: [],
// 页面是否请求中或加载中
loading: {
nav: false,
main: false
},
// init请求返回的数据
data: {
// 分组列表
navList: [],
// 文件数据
content: {
rows: [],
total: 0
}
},
// 查询表单
queryForm1: {
pageIndex: 1,
pageSize: 30,
formData: {
display_name: "",
category_id: "",
type: "image"
},
columns: [
{ key: "display_name", title: "名称", type: "text", mode: "%%" },
{ key: "url", title: "URL", type: "text", mode: "=" },
{ key: "category_id", title: "分类id", type: "text", mode: "=" },
{ key: "type", title: "文件类型", type: "text", mode: "=" }
]
},
formDatas: {}
// 表单相关开始 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
that.getNavList();
that.getList();
},
// 获取文件列表
getList() {
let { queryForm1, selectedIds } = that;
vk.callFunction({
url: "admin/system_uni/uni-id-files/files/kh/getList",
loading: { that, name: "loading.main" },
data: queryForm1,
success: function(data) {
that.data.content = data;
selectedIds.length = 0;
}
});
},
// 获取分类列表
getNavList() {
vk.callFunction({
url: "admin/system_uni/uni-id-files/categories/kh/getList",
loading: { that, name: "loading.nav" },
data: {
pageIndex: 1,
pageSize: 100
},
success: function(data) {
that.data.navList = [
{ _id: "", name: "全部" },
{ _id: "null", name: "未分组" },
...data.rows
];
}
});
},
// 查询指定分类下的文件列表
queryByCategory(category_id) {
if (that.queryForm1.formData.category_id != category_id) {
that.queryForm1.formData.category_id = category_id;
that.getList();
}
},
// 删除分组
deleteCategory(_id, index) {
vk.callFunction({
url: "admin/system_uni/uni-id-files/categories/sys/delete",
loading: { that, name: "loading.nav" },
data: {
_id
},
success: function(data) {
that.data.navList.splice(index, 1);
}
});
},
// 删除
deleteFile(ids) {
vk.callFunction({
url: "admin/system_uni/uni-id-files/files/kh/delete",
title:"请求中...",
data: {
_id: ids
},
success: function(data) {
if(data.num>0){
if (typeof ids !== "object") ids = [ids];
ids.map(id => {
let index = vk.pubfn.getListIndex(that.data.content.rows, "_id", id);
if (index > -1) {
that.data.content.rows.splice(index, 1);
}
});
that.selectedIds = [];
}
}
});
},
uploadFile(){
let type = that.queryForm1.formData.type;
let fileType;
let extension = [];
if(type === "image"){
extension = ["png", "jpg", "jpeg", "gif", "bmp", "svg", "webp", "jfif", "dpg"];
fileType = "image";
}else if(type === "video"){
extension = ["avi", "mp3", "mp4", "3gp", "mov", "rmvb", "rm", "flv", "mkv", "wmv", "m3u8", "mpg", "mpeg", "dat", "asf"];
fileType = "video";
}else if(type === "other"){
extension = ["txt","pdf","xls","xlsx","ppt","pptx","doc","docx","rar","zip"];
}
uni.chooseFile({
extension,
success: async res => {
let item = {
tempFilePaths: res.tempFilePaths,
tempFiles: res.tempFiles,
categoryId: that.queryForm1.formData.category_id,
fileType,
};
vk.pubfn.openForm('uploadProgress', { item });
// vk.showLoading("上传中...");
// for (let i = 0; i < res.tempFilePaths.length; i++) {
// let percentage = vk.pubfn.toDecimal((i+1) / res.tempFilePaths.length * 100, 0);
// try {
// await vk.uploadFile({
// filePath: res.tempFilePaths[i],
// file: res.tempFiles[i],
// needSave: true,
// fileType,
// category_id: that.queryForm1.formData.category_id,
// onUploadProgress:function(progressRes){
// // 上传过程中
// vk.showLoading(`文件${i+1}:${progressRes.progress}%\n`);
// },
// });
// vk.showLoading(`总上传进度:${percentage}%`);
// } catch(err){
// console.error(err);
// }
// }
// vk.hideLoading();
// that.getList();
}
});
},
// 复制文件的URL
copyFileUrl(data) {
uni.setClipboardData({
data,
success: res => {
that.$message({
message: "URL已复制",
type: "success"
});
}
});
},
// 预览
preview(item){
let { type, url } = item;
if(type === "image"){
vk.pubfn.openForm('preview', { item })
}else if(type === "video"){
vk.pubfn.openForm('preview', { item })
}else{
vk.toast("暂不支持该类型文件的预览");
}
},
// 点击了文件
clickFile(item) {
let index = that.selectedIds.indexOf(item._id);
if (index > -1) {
that.selectedIds.splice(index, 1);
} else {
that.selectedIds.push(item._id);
}
},
// 全选
selectAll() {
if (that.selectedIds.length &&that.data.content.rows.length == that.selectedIds.length) {
that.selectedIds = [];
} else {
that.data.content.rows.forEach((value, index, arr) => {
if (!that.selectedIds.includes(value._id)) {
that.selectedIds.push(value._id);
}
});
}
},
stop() {}
},
watch: {},
// 过滤器
filters: {
suffixFilter(name=""){
let arr = name.split(".");
return arr[arr.length-1];
},
coverImageFilter(item){
let src = "";
let { cover_image, url, width=600, height=600 } = item;
if(cover_image){
src = cover_image;
}else{
src = `${url}?x-oss-process=video/snapshot,t_1000,f_jpg,w_${width},h_${height},m_fast`;
}
console.log('src: ', src)
return src;
},
durationFilter(value){
let result = parseInt(value);
let h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600);
let m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60));
let s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60));
return `${h}:${m}:${s}`;
}
},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped>
page,
.page-body {
width: 100%;
height: 100%;
}
// 页面主体内容区域
.page-body {
display: grid;
grid-template-columns: 180px auto;
grid-template-rows: 35px auto 40px;
grid-gap: 8px 0px;
position: relative;
}
.header {
display: flex;
align-items: center;
grid-column: 1 / -1;
font-size: 14px;
user-select: none;
.el-button {
height: 32px;
}
}
// 搜索
.header-item {
margin-left: 20px;
height: 100%;
display: flex;
border-radius: 4px;
overflow: hidden;
.search-input {
width: 200px;
}
.el-button {
height: 32px;
}
}
.nav {
height: 100%;
grid-row: 2 / -1;
border: 1px solid #e4e2e2;
display: grid;
grid-template-rows: repeat(auto-fill, 40px);
color: #59607b;
font-size: 12px;
overflow-y: auto;
box-sizing: border-box;
padding-bottom: 10px;
}
.nav-list {
cursor: pointer;
border-bottom: 1px solid #e4e2e2;
box-sizing: border-box;
height: 40px;
overflow: hidden;
transition: all 0.3s;
background-color: #f6f4f4;
padding-left: 10px;
display: flex;
align-items: center;
> i {
font-size: 13px;
place-self: center;
}
&:hover {
color: #108ee9;
}
.nav-name {
flex: 1;
}
.nav-btn {
width: 44px;
display: flex;
align-items: center;
.btn {
width: 22px;
display: block;
}
}
}
// 选中的分栏
.selected-nav {
background-color: #ecf6fd !important;
color: #108ee9 !important;
}
// 添加分组的按钮
.add-group {
width: 60%;
margin: 5px auto;
padding: 5px 0px;
text-align: center;
border: 1px dashed #108ee9;
color: #108ee9;
cursor: pointer;
}
.add-group:hover {
background-color: #108ee9;
color: #ffffff;
opacity: 0.9;
}
.add-group:active {
background-color: #108ee9;
color: #ffffff;
}
// 内容详情
.main {
display: grid;
grid-template-columns: repeat(auto-fill, 135px);
grid-template-rows: repeat(auto-fill, 180px);
grid-gap: 20px;
place-content: start center;
overflow-y: auto;
min-width: 700px;
}
.update-img,
.content-item {
width: 135px;
height: 180px;
border: 1px solid #e4e2e2;
cursor: pointer;
background-color: transparent;
transition: all 0.25s;
position: relative;
overflow: hidden;
}
// 被选中的
.choose-image {
background-color: #ecf6fd !important;
border: 1px solid #daedff;
.tips{
background-color: #ecf6fd;
}
}
.content-item:hover {
background-color: #ecf6fd;
border: 1px solid #daedff;
}
.item-file {
width: 100%;
height: 150px;
position: relative;
image {
width: 100%;
height: 100%;
}
.suffix{
position: absolute;
top:2px;
right: 6px;
font-size: 12px;
color: #a7a7a7;
}
.duration{
position: absolute;
bottom:0px;
left: 0px;
font-size: 12px;
color: #FFFFFF;
background-color: #b2b2b2;
padding: 0px 2px;
}
.size{
position: absolute;
bottom:0px;
right: 0px;
font-size: 12px;
color: #FFFFFF;
background-color: #b2b2b2;
padding: 0px 2px;
}
.video-play-btn{
position: absolute;
top:54px;
left:47px;
background-color: rgba(66,66,66,0.6);
border-radius: 50%;
}
.other-icon{
display: flex;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
}
}
.content-item:hover > .tips {
transform: translateY(0%) !important;
}
// 上传按钮
.update-img {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
color: #d5d5de;
&::before {
line-height: 1;
font-size: 45px;
content: "+";
}
&::after {
content: "上传";
font-size: 12px;
}
}
.tips {
position: absolute;
height: 60px;
right: 0px;
bottom: 0px;
left: 0px;
background-color: #fff;
transition: all 0.4s;
transform: translateY(50%);
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
grid-gap: 5px 0px;
font-size: 13px;
place-items: center;
}
.title {
text-align: center;
grid-column: 1 / -1;
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.operation {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
&:hover {
color: #108ee9;
}
}
// 保存到组、删除、下载链接
.footer {
background-color: #f4faff;
display: flex;
align-items: center;
font-size: 12px;
color: #3091f2;
}
.paging {
flex: 1;
display: flex;
align-items: center;
justify-content: flex-end;
}
.footer-item {
padding: 2px 9px;
border: 1px solid #3091f2;
margin-left: 8px;
cursor: pointer;
background-color: #ffffff;
}
.no-selected {
.footer-item {
pointer-events: none;
color: #ced0d5;
background-color: #fff;
border-color: #ebeef5 !important;
}
}
.footer-label {
display: flex;
align-items: center;
user-select: none;
color: #59607b;
.checkbox {
margin: 0;
padding: 0;
outline: none;
}
}
.num {
min-width: 50px;
text-align: center;
margin: 0 10px;
color: #3091f2;
}
::v-deep .input-border-radius-4004 .el-input__inner{
border-radius: 4px 0px 0px 4px;
}
</style>
+182
View File
@@ -0,0 +1,182 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
@search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto']"
:row-no="true"
:pagination="true"
></vk-data-table>
<!-- 表格组件结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var dcloudAppidData = [];
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/system_uni/uni-id-log/sys/getList",
// 表格字段显示规则
columns: [
{ key:"appList", title:"登录的应用", type:"html", width:220,
formatter: function(val, row, column, index) {
if(typeof row.dcloud_appid === "undefined") return "全部应用";
if(row.dcloud_appid.length === 0) return "未绑定任何应用";
if(val.length === 0 && row.dcloud_appid.length > 0) return row.dcloud_appid;
let str = "";
val.map((item, index) => {
str += `、${item.name}`;
});
if(str) str = str.substring(1);
return str;
}
},
{ key: "userInfo", title: "用户信息", type: "userInfo", width: 150 },
{ key: "ip", title: "ip地址", type: "text", width: 150 },
{ key: "type", title: "日志类型", type: "text", width: 120 },
{ key: "login_type", title: "登录类型", type: "select", width: 120,
data:[
{ value: "phone", label:"手机短信" },
{ value: "password", label:"账号密码" },
{ value: "weixin", label:"微信登录" },
{ value: "alipay", label:"支付宝登录" },
{ value: "weixinPhoneNumber", label:"微信手机号" },
{ value: "token", label:"token" }
]
},
{ key: "os", title: "操作系统", type: "text", width: 120 },
{ key: "platform", title: "平台信息", type: "text", width: 120 },
{ key: "device_id", title: "设备唯一标识", type: "text", width: 120 },
{ key: "_add_time", title: "添加时间", type: "time", width: 160 },
{ key: "_add_time", title: "距离现在", type: "dateDiff", width: 120 },
{ key: "ua", title: "userAgent", type: "text", width: 400 },
{ key: "user_id", title: "用户ID", type: "text", width: 220 },
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {
dcloud_appid:""
},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
{ key:"dcloud_appid", title:"所属应用", type:"select", width:160, mode:"custom",
data:[],
props:{ value:"appid", label:"name" }
},
{ key: "user_id", title: "用户ID", type: "text", width:140, mode: "=" },
{ key: "ip", title: "ip地址", type: "text", width:140, mode: "%%" },
{ key: "device_id", title: "设备唯一标识", type: "text", width:180, mode: "%%" },
{ key: "_add_time", title: "添加时间", type: "datetimerange", width: 380, mode: "[]" }
]
},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
that.getAppList();
},
// 获取应用列表
getAppList(obj){
// 请在store/modules/$app.js文件里增加代码 appList: lifeData.$app.appList || []
vk.callFunction({
url: 'admin/system/app/sys/getList',
data:{},
success:function(data){
dcloudAppidData = data.rows;
let dcloudAppidData2 = vk.pubfn.copyObject(data.rows);
dcloudAppidData2.unshift({
appid:"___error___",
name:"不存在的应用"
});
dcloudAppidData2.unshift({
appid:"___empty-array___",
name:"未绑定应用"
});
dcloudAppidData2.unshift({
appid:"___non-existent___",
name:"全部应用"
});
let index2 = vk.pubfn.getListIndex(that.queryForm1.columns, "key", "dcloud_appid");
that.queryForm1.columns[index2].data = dcloudAppidData2;
let appids = [];
dcloudAppidData.map((item, index) => {
appids.push(item.appid);
});
that.queryForm1.formData.appids = appids;
}
});
},
// 搜索
search(obj) {
that.$refs.table1.query(obj);
},
// 刷新
refresh() {
that.$refs.table1.refresh();
}
},
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,289 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
@search="search"
>
<template slot="right-btns">
<el-button type="success" icon="el-icon-circle-plus-outline" @click="addBtn">
添加
</el-button>
</template>
</vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto', 'update', 'delete']"
:row-no="true"
:pagination="true"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
>
<!-- 排序值 -->
<template v-slot:sort="{ row, column, index }">
<el-input v-model="row.sort" size="mini" @change="sortChange($event, row)"/>
</template>
</vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
:title="form1.props.title"
width="800px"
mode="form"
>
<vk-data-form
ref="form1"
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
label-width="100px"
@success="form1.props.show = false;refresh();"
></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
var typeData = [
{ value: "image", label: "图片" },
{ value: "swiper", label: "图片轮播" },
{ value: "grid-btn", label: "宫格按钮" },
{ value: "notice", label: "通知" },
{ value: "text", label: "文本" },
{ value: "rich-text", label: "富文本" },
{ value: "button", label: "按钮" },
{ value: "custom", label: "自定义" }
];
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/system_uni/components-dynamic/sys/getList",
// 表格字段显示规则
columns: [
{ key: "sort", title: "排序值", type: "number", width: 100, sortable: "custom" },
{ key: "data_id", title: "组件数据id", type: "text", width: 200 },
{ key: "title", title: "数据标题", type: "text", width: 200 },
{ key: "description", title: "数据描述", type: "textarea" },
{ key: "data", title: "组件数据", type: "json", width: 200 },
{
key: "show", title: "是否显示", type: "switch",
activeValue: true,
inactiveValue: false,
width: 80,
watch: (res) => {
let { value, row, change } = res;
vk.callFunction({
url: "admin/system_uni/components-dynamic/sys/update",
title: "请求中...",
data: {
_id: row._id,
show: value
},
success: data => {
change(value); // 这一步是让表格行内的开关改变显示状态
}
});
}
},
{
key: "type", title: "type", type: "select", width: 120,
data: typeData
},
{ key: "name", title: "name", type: "text", width: 120 },
{ key: "_add_time", title: "添加时间", type: "time", width: 200 },
{ key: "_add_time", title: "距离现在", type: "dateDiff", width: 120 }
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
{ key: "data_id", title: "组件数据ID", type: "text", width: 180, mode: "%%" },
{ key: "title", title: "数据标题", type: "text", width: 180, mode: "%%" },
{
key: "type", title: "type", type: "select", width: 160, mode: "=",
data: [
{ value: "", label: "全部" },
...typeData
]
},
{ key: "name", title: "name", type: "text", width: 160, mode: "%%" },
{ key: "_add_time", title: "添加时间", type: "datetimerange", width: 380, mode: "[]" }
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
sort: 0,
show: true
},
// 表单属性
props: {
// 表单请求地址
action: "",
// 表单字段显示规则
columns: [
{ key:"", title:"基础", type:"bar-title" },
{ key: "data_id", title: "组件数据id", type: "text", show: ["add"] },
{ key: "title", title: "数据标题", type: "text" },
{ key: "data", title: "组件数据", type: "json" },
{ key: "description", title: "数据描述", type: "textarea" },
{ key:"", title:"扩展", type:"bar-title" },
{ key: "sort", title: "排序值", type: "number" },
{ key: "show", title: "是否显示", type: "switch", activeValue: true, inactiveValue: false },
{
key: "type", title: "type", type: "select",
data: typeData
},
{ key: "name", title: "name", type: "text", tips:"同一页面可以设置相同的name" },
],
// 表单验证规则
rules: {
title: [{ required: true, message: "数据标题不能为空", trigger: "blur" }],
data_id: [{ required: true, message: "组件数据id不能为空", trigger: "change" }]
},
// add 代表添加 update 代表修改
formType: "",
// 是否显示表单的弹窗
show: false
}
},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm() {
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(obj) {
that.$refs.table1.query(obj);
},
// 刷新
refresh() {
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow() {
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val) {
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn() {
that.resetForm();
that.form1.props.action = "admin/system_uni/components-dynamic/sys/add";
that.form1.props.formType = "add";
that.form1.props.title = "添加";
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({ item }) {
that.form1.props.action = "admin/system_uni/components-dynamic/sys/update";
that.form1.props.formType = "update";
that.form1.props.title = "编辑";
that.form1.props.show = true;
that.form1.data = item;
},
// 删除按钮
deleteBtn({ item, deleteFn }) {
deleteFn({
action: "admin/system_uni/components-dynamic/sys/delete",
data: {
_id: item._id
}
});
},
// 修改排序值
sortChange(sort, item){
vk.callFunction({
url: 'admin/system_uni/components-dynamic/sys/update',
data: {
_id: item._id,
sort: Number(sort)
},
success: (data) => {
}
});
},
},
watch: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
+221
View File
@@ -0,0 +1,221 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
@search="search"
>
<template slot="right-btns">
<el-button type="success" icon="el-icon-circle-plus-outline" @click="addBtn">
添加
</el-button>
</template>
</vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto', 'update', 'delete']"
:row-no="true"
:pagination="true"
@update="updateBtn"
@delete="deleteBtn"
@current-change="currentChange"
@selection-change="selectionChange"
></vk-data-table>
<!-- 表格组件结束 -->
<!-- 添加或编辑的弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
:title="form1.props.title"
width="800px"
mode="form"
>
<vk-data-form
ref="form1"
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
label-width="80px"
@success="form1.props.show = false;refresh();"
></vk-data-form>
</vk-data-dialog>
<!-- 添加或编辑的弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/system_uni/global-data/sys/getList",
// 表格字段显示规则
columns: [
{ key: "key", title: "键名", type: "text", width: 200 },
{ key: "value", title: "键值", type: "json", width: 200 },
{ key: "_add_time", title: "添加时间", type: "time", width: 160 },
{ key: "_add_time", title: "距离现在", type: "dateDiff", width: 120 },
{ key: "expired_at", title: "过期时间", type: "time", width: 160, defaultValue: "无" },
{ key: "comment", title: "备注", type: "text", width: 300 }
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
{ key: "key", type: "text", title: "键名搜索", mode: "%%" },
{ key: "value", type: "text", title: "键值搜索", mode: "%%" },
{ key: "_add_time", type: "datetimerange", title: "添加时间", width: 400, mode: "[]" }
]
},
form1: {
// 表单请求数据,此处可以设置默认值
data: {
},
// 表单属性
props: {
// 表单请求地址
action: "",
// 表单字段显示规则
columns: [
{ 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" }]
},
// add 代表添加 update 代表修改
formType: "",
// 是否显示表单的弹窗
show: false
}
},
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm() {
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(obj) {
that.$refs.table1.query(obj);
},
// 刷新
refresh() {
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow() {
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val) {
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 显示添加页面
addBtn() {
that.resetForm();
that.form1.props.action = "admin/system_uni/global-data/sys/add";
that.form1.props.formType = "add";
that.form1.props.title = "添加";
that.form1.props.show = true;
},
// 显示修改页面
updateBtn({ item }) {
that.form1.props.action = "admin/system_uni/global-data/sys/update";
that.form1.props.formType = "update";
that.form1.props.title = "编辑";
that.form1.props.show = true;
that.form1.data = item;
},
// 删除按钮
deleteBtn({ item, deleteFn }) {
deleteFn({
action: "admin/system_uni/global-data/sys/delete",
data: {
_id: item._id
}
});
}
},
watch: {
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
+227
View File
@@ -0,0 +1,227 @@
<template>
<view class="page-body">
<!-- 页面内容开始 -->
<!-- 表格搜索组件开始 -->
<vk-data-table-query
v-model="queryForm1.formData"
:columns="queryForm1.columns"
:main-columns="['out_trade_no', 'transaction_id', 'type', 'status', '_add_time']"
@search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
<!-- 表格组件开始 -->
<vk-data-table
ref="table1"
:action="table1.action"
:columns="table1.columns"
:query-form-param="queryForm1"
:right-btns="['detail_auto']"
:row-no="false"
:pagination="true"
@current-change="currentChange"
@selection-change="selectionChange"
>
<template v-slot:button1="{ row }">
<view v-if="row.status <= 0">-</view>
<el-tag type="success" effect="dark" v-else-if="row.user_order_success">成功</el-tag>
<el-button type="danger" size="mini" v-else-if="row.status === 1" @click="afreshNotice(row)">重新推送</el-button>
<view v-else-if="row.refund_fee>0">失败,但已退款</view>
<view v-else>未知</view>
</template>
</vk-data-table>
<!-- 表格组件结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
const payTypeData = [
{ label: "官方渠道 - 微信 - 小程序", value: "wxpay_mp-weixin", tagType: "success" },
{ label: "官方渠道 - 微信 - APP", value: "wxpay_app-plus", tagType: "success" },
{ label: "官方渠道 - 微信 - H5", value: "wxpay_h5", tagType: "success" },
{ label: "官方渠道 - 微信 - MWEB", value: "wxpay_mweb", tagType: "success" },
{ label: "官方渠道 - 微信 - 公众号", value: "wxpay_h5-weixin", tagType: "success" },
{ label: "官方渠道 - 支付宝 - 小程序", value: "alipay_mp-alipay", tagType: "primary" },
{ label: "官方渠道 - 支付宝 - APP", value: "alipay_app-plus", tagType: "primary" },
{ label: "官方渠道 - 支付宝 - H5", value: "alipay_h5", tagType: "primary" },
{ label: "VksPay - 微信 - 小程序", value: "vkspay_mp-weixin", tagType: "success" },
{ label: "VksPay - 微信 - APP", value: "vkspay_app-plus", tagType: "success" },
{ label: "VksPay - 微信 - H5", value: "vkspay_h5", tagType: "success" }, // 收银台接口 公众号、H5、MWEB、PC扫码均为H5
{ label: "VksPay - 微信 - MWEB", value: "vkspay_mweb", tagType: "success" },
{ label: "VksPay - 微信 - 公众号", value: "vkspay_h5-weixin", tagType: "success" },
{ label: "VksPay - 支付宝 - 小程序", value: "vkspay_mp-alipay", tagType: "primary" },
{ label: "VksPay - 支付宝 - APP", value: "vkspay_app-plus", tagType: "primary" },
{ label: "VksPay - 支付宝 - H5", value: "vkspay_h5", tagType: "primary" },
];
const orderTypeData = [
{ label: "商品订单", value: "goods" },
{ label: "充值订单", value: "recharge" },
{ label: "VIP购买订单", value: "vip" },
{ label: "其他订单", value: "other" }
];
const statusData = [
{ label: "已关闭", value: -1, tagType: "info" },
{ label: "未支付", value: 0, tagType: "info" },
{ label: "已支付", value: 1, tagType: "success" },
{ label: "已部分退款", value: 2, tagType: "warning" },
{ label: "已全额退款", value: 3, tagType: "danger" },
];
export default {
data() {
// 页面数据变量
return {
// 页面是否请求中或加载中
loading: false,
// init请求返回的数据
data: {},
// 表格相关开始 -----------------------------------------------------------
table1: {
// 表格数据请求地址
action: "admin/system_uni/pay-orders/sys/getList",
// 表格字段显示规则
columns: [
{ key: "button1", title: "回调通知状态", type: "text", width: 120, fixed:"right" },
{ key: "out_trade_no", title: "商户订单号", type: "text", width: 200 },
{ key: "type", title: "订单类型", type: "select", width: 100,
data: orderTypeData
},
{
key: "pay_type", title: "支付类型", type: "tag", width: 180,
data: payTypeData
},
{ key: "status", title: "订单状态", type: "tag", width: 110,
data: statusData
},
{ key: "create_date", title: "创建时间", type: "time", width: 160 },
{ key: "pay_date", title: "支付时间", type: "time", width: 160 },
{ key: "total_fee", title: "总金额", type: "money", width: 110 },
{ key: "refund_fee", title: "总退款金额", type: "money", width: 110, defaultValue:"-" },
{ key: "refund_num", title: "退款次数", type: "number", width: 80, defaultValue:"-" },
{ key: "transaction_id", title: "支付平台订单号", type: "text", width: 260, defaultValue:"-" },
{ key: "openid", title: "用户openid", type: "text", width: 280, show: ["detail"] },
{
key: "refund_list", title: "退款详情", type: "table", width: 360, show: ["detail"],
columns:[
{ key: "out_refund_no", title: "退款单号", type: "text", minWidth: 200 },
{ key: "refund_date", title: "退款时间", type: "time", width: 180 },
{ key: "refund_fee", title: "退款金额", type: "money", width: 140 },
{ key: "refund_desc", title: "退款备注", type: "text", minWidth: 180 },
]
},
{ key: "original_data", title: "原始数据", type: "json", width: 300, show: ["detail"] },
//{ key: "wxpay_info", title: "微信支付特有数据", type: "json", width: 360, show: ["detail"] },
//{ key: "alipay_info", title: "支付宝支付特有数据", type: "json", width: 300, show: ["detail"] },
],
// 多选框选中的值
multipleSelection: [],
// 当前高亮的记录
selectItem: ""
},
// 表格相关结束 -----------------------------------------------------------
// 表单相关开始 -----------------------------------------------------------
// 查询表单请求数据
queryForm1: {
// 查询表单数据源,可在此设置默认值
formData: {},
// 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
columns: [
{ key: "out_trade_no", title: "商户订单号", type: "text", width:150, mode: "%%", },
{ key: "transaction_id", title: "支付平台订单号", type: "text", width:150, mode: "%%", },
{
key: "type", title: "订单类型", type: "select", width:150, mode: "=",
data: orderTypeData
},
{ key: "status", title: "订单状态", type: "select", width: 150, mode: "=",
data: statusData
},
{ key: "_add_time", title: "添加时间", type: "datetimerange", width:340, mode: "[]" },
{
key: "pay_type", title: "支付类型", type: "select", mode: "=",
data: payTypeData
},
{ key: "total_fee_min", title: "金额范围", type: "money", mode: ">=", fieldName:"total_fee" },
{ key: "total_fee_max", title: "-", type: "money", mode: "<=", fieldName:"total_fee" }
]
}
// 表单相关结束 -----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
originalForms["form1"] = vk.pubfn.copyObject(that.form1);
},
// 页面跳转
pageTo(path) {
vk.navigateTo(path);
},
// 表单重置
resetForm() {
vk.pubfn.resetForm(originalForms, that);
},
// 搜索
search(obj) {
that.$refs.table1.query(obj);
},
// 刷新
refresh() {
that.$refs.table1.refresh();
},
// 获取当前选中的行的数据
getCurrentRow() {
return that.$refs.table1.getCurrentRow();
},
// 监听 - 行的选中高亮事件
currentChange(val) {
that.table1.selectItem = val;
},
// 当选择项发生变化时会触发该事件
selectionChange(list) {
that.table1.multipleSelection = list;
},
// 重新推送
afreshNotice(row){
vk.callFunction({
url: 'admin/system_uni/pay-orders/sys/afreshNotice',
title: '请求中...',
data: {
_id: row._id
},
success: (data) => {
// 刷新数据
that.refresh();
}
});
}
},
watch: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,170 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单详情"
subTitle="展示表单详情"
></vk-data-page-header>
<view class="page-body" style="max-width: 800px;margin: 0 auto;">
<vk-data-detail
:data="data"
:columns="columns"
size="medium"
label-width="150px"
></vk-data-detail>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
data:{
text:"这是文本",
money:10000,
number:10000,
radio:1,
checkbox:[1,2],
select:1,
image:[
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-ddu978w24hpp7a5735/828bfb9d-d293-444c-9db7-270c279d93ea.png",
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-ddu978w24hpp7a5735/828bfb9d-d293-444c-9db7-270c279d93ea.png",
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-ddu978w24hpp7a5735/828bfb9d-d293-444c-9db7-270c279d93ea.png",
],
province: {
code: "11",
name: "北京市"
},
address: {
codes: [
"33",
"3301",
"330110"
],
names: [
"浙江省",
"杭州市",
"余杭区"
],
text: "浙江省杭州市余杭区",
showText: "浙江省 / 杭州市 / 余杭区",
province: {
code: "33",
name: "浙江省"
},
city: {
code: "3301",
name: "杭州市"
},
area: {
code: "330110",
name: "余杭区"
}
},
textarea:"啊啊啊啊是的111123",
json:{
a:1,
b:"aaa"
},
switch:true,
object:{
a:1,
b:"aaa"
}
},
columns:[
{ key:"text", title:"text类型字段", type:"text" },
{ key:"money", title:"money类型字段", type:"money" },
{ key:"number", title:"number类型字段", type:"number" },
{ key:"radio", title:"radio类型字段", type:"radio" ,
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{ key:"checkbox", title:"checkbox类型字段", type:"checkbox",
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{ key:"select", title:"select类型字段", type:"select",
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{ key:"image", title:"image类型字段", type:"image",
limit:6
},
{ key:"province", title:"province类型字段", type:"province" },
{ key:"address", title:"address类型字段", type:"address" },
{ key:"textarea", title:"textarea类型字段", type:"textarea",
autosize:{ minRows:6, maxRows:10 },
},
{ key:"json", title:"json类型字段", type:"json" },
{ key:"switch", title:"switch类型字段", type:"switch" },
{ key:"object", title:"object类型字段", type:"object",
columns:[
{ key:"text", title:"text类型字段", type:"text" },
{ key:"switch", title:"switch类型字段", type:"switch" }
]
}
]
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
formSuccess(){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,169 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单详情"
subTitle="展示表单详情"
></vk-data-page-header>
<view class="page-body" style="max-width: 800px;margin: 0 auto;">
<vk-data-detail-table
:data="data"
:columns="columns"
size="medium"
label-width="150px"
></vk-data-detail-table>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
var originalForms = {}; // 表单初始化数据
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
data:{
text:"这是文本",
money:10000,
number:10000,
radio:1,
checkbox:[1,2],
select:1,
image:[
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-ddu978w24hpp7a5735/828bfb9d-d293-444c-9db7-270c279d93ea.png",
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-ddu978w24hpp7a5735/828bfb9d-d293-444c-9db7-270c279d93ea.png",
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-aliyun-ddu978w24hpp7a5735/828bfb9d-d293-444c-9db7-270c279d93ea.png",
],
province: {
code: "11",
name: "北京市"
},
address: {
codes: [
"33",
"3301",
"330110"
],
names: [
"浙江省",
"杭州市",
"余杭区"
],
text: "浙江省杭州市余杭区",
showText: "浙江省 / 杭州市 / 余杭区",
province: {
code: "33",
name: "浙江省"
},
city: {
code: "3301",
name: "杭州市"
},
area: {
code: "330110",
name: "余杭区"
}
},
textarea:"啊啊啊啊是的111123",
json:{
a:1,
b:"aaa"
},
switch:true,
object:{
a:1,
b:"aaa"
}
},
columns:[
{ key:"text", title:"text类型字段", type:"text" },
{ key:"money", title:"money类型字段", type:"money" },
{ key:"number", title:"number类型字段", type:"number" },
{ key:"radio", title:"radio类型字段", type:"radio" ,
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{ key:"checkbox", title:"checkbox类型字段", type:"checkbox",
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{ key:"select", title:"select类型字段", type:"select",
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{ key:"image", title:"image类型字段", type:"image",
limit:6
},
{ key:"province", title:"province类型字段", type:"province" },
{ key:"address", title:"address类型字段", type:"address" },
{ key:"textarea", title:"textarea类型字段", type:"textarea",
autosize:{ minRows:6, maxRows:10 },
},
{ key:"json", title:"json类型字段", type:"json" },
{ key:"switch", title:"switch类型字段", type:"switch" },
{ key:"object", title:"object类型字段", type:"object",
columns:[
{ key:"text", title:"text类型字段", type:"text" },
{ key:"switch", title:"switch类型字段", type:"switch" }
]
}
]
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
formSuccess(){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,101 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Dialog 弹窗"
subTitle="基础用法"
></vk-data-page-header>
<view class="page-body">
<el-button @click="dialog.show1 = true">显示弹窗1</el-button>
<el-button @click="dialog.show2 = true">显示弹窗2</el-button>
</view>
<view class="page-dialog">
<!-- 页面弹窗内容开始 -->
<vk-data-dialog
v-model="dialog.show1"
title="标题1"
width="500px"
top="14vh"
center
:close-on-click-modal="true"
>
这里是自定义内容
<template v-slot:footer>
<el-button @click="dialog.show1 = false">取 消</el-button>
<el-button type="primary" @click="dialog.show1 = false">确 定</el-button>
</template>
</vk-data-dialog>
<vk-data-dialog
v-model="dialog.show2"
title="标题2"
width="500px"
top="14vh"
:close-on-click-modal="true"
>
这里是自定义内容
<template v-slot:footer="{ close }">
<el-button @click="close">取 消</el-button>
<el-button type="primary" @click="close">确 定</el-button>
</template>
</vk-data-dialog>
<!-- 页面弹窗内容开始 -->
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
dialog:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,141 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header title="Form 表单" subTitle="弹窗表单"></vk-data-page-header>
<view class="page-body">
<el-button @click="form1.props.show = true">弹出表单</el-button>
<el-button @click="resetForm">重置表单</el-button>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
</view>
<!-- 弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
title="表单标题"
width="600px"
mode="form"
>
<vk-data-form
ref="form1"
v-model="form1.data"
:action="form1.props.action"
:columns="form1.props.columns"
:rules="form1.props.rules"
:form-type="form1.props.formType"
:loading.sync="form1.props.loading"
:auto-close="true"
label-width="140px"
@success="onFormSuccess"
></vk-data-form>
</vk-data-dialog>
<!-- 弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
radio: 1,
checkbox : [1,2]
},
// 表单属性
props: {
// 表单请求地址
action: "template/test/sys/test",
// 表单字段显示规则
columns: [
{ key: "text", title: "text类型字段", type: "text" },
{ key: "number", title: "number类型字段", type: "number" },
{ key: "radio", title: "radio类型字段", type: "radio",
data: [
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" },
]
},
{ key: "checkbox", title: "checkbox类型字段", type: "checkbox",
data: [
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" },
]
},
{ key: "textarea", title: "textarea类型字段", type: "textarea",
autosize: { minRows: 4, maxRows: 10 },
maxlength: 200,
showWordLimit: true
},
{ key: "switch", title: "switch类型字段", type: "switch" }
],
// 表单验证规则
rules: {
text: [
{ required: true, message: "text不能为空", trigger: "change" },
]
},
// add 代表添加 update 代表修改
formType: "",
// 表单是否在请求中
loading: false,
// 是否显示表单1 的弹窗
show: false
}
},
// 表单相关结束-----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {},
// 表单提交成功时的回调
onFormSuccess() {
// that.form1.props.show = false;
},
// 重置表单
resetForm() {
let that = this;
if (that.$refs.form1) that.$refs.form1.resetForm();
}
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,119 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Dialog 弹窗"
subTitle="弹窗表格"
></vk-data-page-header>
<view class="page-body">
<el-button @click="show = true">显示弹窗</el-button>
</view>
<view class="page-dialog">
<!-- 页面弹窗内容开始 -->
<vk-data-dialog
v-model="show"
title="标题"
width="900px"
top="14vh"
center
:close-on-click-modal="true"
>
<!-- 表格组件开始 -->
<vk-data-table
:data="table1.data"
:columns="table1.columns"
:max-height="500"
></vk-data-table>
<!-- 表格组件结束 -->
<template v-slot:footer>
<el-button @click="show = false">取 消</el-button>
<el-button type="primary" @click="show = false">确 定</el-button>
</template>
</vk-data-dialog>
<!-- 页面弹窗内容开始 -->
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
show:false,
table1:{
// 字段显示规则
columns: [
{ key: "_id" , title: "用户ID" , type: "text" , width: 200 },
{ key: "username" , title: "用户名" , type: "text" , minWidth: 200 },
{ key: "nickname" , title: "用户昵称" , type: "text" , minWidth: 200 },
{ key: "mobile" , title: "手机号" , type: "text" , width: 200 },
],
// 表格数据
data:[
{
_id:"001",
username:`用户名001`,
nickname:`用户昵001`,
mobile:`尾号001`,
},
{
_id:"002",
username:`用户名002`,
nickname:`用户昵002`,
mobile:`尾号002`,
},
{
_id:"003",
username:`用户名003`,
nickname:`用户昵003`,
mobile:`尾号003`,
},
],
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,93 @@
<template>
<view class="page">
<!-- 页面头部内容开始 -->
<vk-data-page-header
title="富文本编辑器"
subTitle="editor"
@back="pageBack"
></vk-data-page-header>
<!-- 页面头部内容结束 -->
<view class="page-body">
<!-- 页面主体内容开始 -->
<view style="display: flex;">
<vk-data-input-editor
v-model="content"
placeholder="开始输入"
width="50%"
></vk-data-input-editor>
<view style="width: 50%;">
<view style="padding: 20px;font-size: 35px;font-family: kaiti;color: red;">
HTML效果展示
</view>
<view v-html="content" class="vk-data-input-editor-view" style="padding: 15px;"></view>
</view>
</view>
<view class="tips">
<view class="json-view" v-if="content">
<pre>
{{ content }}
</pre>
</view>
</view>
<!-- 页面主体内容结束 -->
</view>
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
content:""
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
}
},
// 监听器
watch:{
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,274 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单"
subTitle="子表单"
></vk-data-page-header>
<view class="page-body" style="max-width: 1600px;margin: 0 auto;">
<vk-data-form
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
:loading.sync="form1.props.loading"
label-width="140px"
@cancel="onCancel"
@success="onFormSuccess"
></vk-data-form>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
},
// 表单属性
props: {
// 表单请求地址
action:"template/test/sys/test",
// 表单字段显示规则
columns:[
{ key:"", title:"数组对象", type:"bar-title" },
{
key:"array1", title:"数组<对象>类型", type:"array<object>", itemWidth:260,
showAdd:true,
showClear:true,
showSort:true,
// 新增一行时,该行的默认值
defaultValue:{
switch:true,
text1:""
},
rightBtns:['copy','delete'],
// 每行每个字段对应的渲染规则
columns:[
{
key:"text1", title:"昵称", type:"text",
isUnique:true,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: ["change","blur"] }
]
},
{
key:"number1", title:"数字", type:"number",
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"select1", title:"select类型", type:"select",
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
],
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
],
onChange:function(val, row, column, index){
// 此处演示根据选择的值动态改变text1的值,注意,此处text1必须要有默认值,即使是空字符串也行.
row.text1 = "昵称" + val;
}
},
{ key:"switch", title:"switch类型", type:"switch", width:160 },
]
},
{ key:"", title:"递增递减", type:"bar-title" },
{
key:"array2", title:"数组<对象>类型", type:"array<object>", itemWidth:260,
showAdd:true,
showClear:true,
showSort:true,
// 新增一行时,该行的默认值
defaultValue:{
switch:true,
text1:""
},
rightBtns:['copy','delete'],
// 每行每个字段对应的渲染规则
columns:[
{
key:"number1", title:"递增[>]", type:"number", placeholder:"输入数字",
incMode: 1, // 1必须递增[>] 2 必须递增[>=] -1 必须递减[<] -2 必须递减[<=]
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"number2", title:"递增[>=]", type:"number", placeholder:"输入数字",
incMode: 2, // 1必须递增[>] 2 必须递增[>=] -1 必须递减[<] -2 必须递减[<=]
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"number3", title:"递减[<]", type:"number", placeholder:"输入数字",
incMode: -1, // 1必须递增[>] 2 必须递增[>=] -1 必须递减[<] -2 必须递减[<=]
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"number4", title:"递减[<=]", type:"number", placeholder:"输入数字",
incMode: -2, // 1必须递增[>] 2 必须递增[>=] -1 必须递减[<] -2 必须递减[<=]
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
]
},
{ key:"", title:"数组嵌套数组", type:"bar-title" },
{
key:"array3", title:"数组<对象>类型", type:"array<object>", itemWidth:260,
showAdd:true,
showClear:true,
showSort:true,
// 新增一行时,该行的默认值
defaultValue:{
switch:true,
array:[]
},
rightBtns:['copy','delete'],
// 每行每个字段对应的渲染规则
columns:[
{
key:"text1", title:"昵称", type:"text",
isUnique:true,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"number1", title:"数字", type:"number",
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{ key:"switch", title:"switch类型", type:"switch", width:160 },
{
key:"array", title:"数组<对象>类型", type:"array<object>", buttonText: "设置", dialog:true, width:140, dialogWidth:1000,
showAdd:true,
showClear:true,
showSort:true,
// 新增一行时,该行的默认值
defaultValue:{
},
rightBtns:['delete'],
// 每行每个字段对应的渲染规则
columns:[
{
key:"text1", title:"昵称", type:"text", minWidth:160,
isUnique:true,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"number1", title:"数字", type:"number", minWidth:160,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
}
]
},
]
},
{ key:"", title:"下方为纯字符串或纯数字类型数组", type:"bar-title" },
{ key:"stringArray", title:"数组<字符串>类型", type:"array<string>", placeholder:"请输入字符串", width:400,
isUnique:true,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"numberArray", title:"数组<数字>类型", type:"array<number>", placeholder:"请输入数字", width:400,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
],
// 表单验证规则
rules: {
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show: false,
// 表单是否在请求中
loading:false
}
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
onCancel(){
console.log("关闭");
vk.menuTabs.closeCurrent();
},
onFormSuccess(){
console.log("表单提交成功");
}
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,157 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单"
subTitle="基础表单"
></vk-data-page-header>
<view class="page-body" style="max-width: 800px;margin: 0 auto;">
<vk-data-form
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
:loading.sync="form1.props.loading"
label-width="140px"
@cancel="onCancel"
@success="onFormSuccess"
></vk-data-form>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
radio: 1,
checkbox : [1,2]
},
// 表单属性
props: {
// 表单请求地址
action:"template/test/sys/test",
// 表单字段显示规则
columns:[
{
key: "role", title: "通过表格选择(单选)", type: "table-select", placeholder:"请选择",
action:"template/db_api/sys/getList",
multiple:true,
columns:[
{ key:"_id", title:"id", type:"text", width:260, idKey:true },
{ key:"name", title:"昵称", type:"text", width:260, nameKey:true },
{ key:"money", title:"金额", type:"money", width:100, sortable:"custom", summaryKey:true, summaryUnit:"元" }, // summaryKey开启该字段为统计字段, summaryUnit:单位
],
queryColumns:[
{ key: "name", title: "昵称", type: "text", width: 150, mode: "%%" },
{ key: "_id", title: "标识", type: "text", width: 150, mode: "%%" }
]
},
{ key: "text", title:"text类型字段", type:"text" },
{ key: "number", title:"number类型字段", type:"number" },
{ key: "radio", title:"radio类型字段", type:"radio" ,
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "checkbox", title:"checkbox类型字段", type:"checkbox",
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "select", title:"select类型字段", type:"select",
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "textarea", title:"textarea类型字段", type:"textarea",
autosize:{ minRows: 4, maxRows: 10 }, showWordLimit:true,
},
{ key: "switch", title:"switch类型字段", type:"switch" },
],
// 表单验证规则
rules: {
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show: false,
// 表单是否在请求中
loading:false
}
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
onCancel(){
console.log("关闭");
vk.menuTabs.closeCurrent();
},
onFormSuccess(){
console.log("表单提交成功");
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,88 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="证书转换"
subTitle="快速将证书内容变成1行字符串"
></vk-data-page-header>
<view class="page-body" style="max-width: 800px;margin: 0 auto;">
<el-input v-model="form1.content" type="textarea" :rows="20" placeholder="请将证书内容粘贴到此处"></el-input>
<view style="margin-top: 20px;">
<el-button type="primary" @click="copy">复制证书内容(一行字符串形式)</el-button>
</view>
<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 {
// 表单相关开始-----------------------------------------------------------
form1: {
content: "",
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
copy(){
let str = JSON.stringify(this.form1);
let content = str.substring(12,str.length-2);
uni.setClipboardData({
data: content,
success: function () {
vk.toast("复制成功");
}
});
}
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,182 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单"
subTitle="复用同一个表单实现添加和修改"
></vk-data-page-header>
<view class="page-body">
<view style="padding: 15px;color:#303133;">
当两个表单内的字段有大部分相似时,同一个表单组件可以复用。<br/>
通过控制 formType 可以切换表单的类型<br/>
同时在 columns 中添加属性 show:["add"] 代表该字段只有 formType 为 "add" 时才显示
</view>
<el-button @click="showForm('add')">弹出添加表单</el-button>
<el-button @click="showForm('update')">弹出修改表单</el-button>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
</view>
<!-- 弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
:title="form1.props.title"
width="600px"
mode="form"
>
<vk-data-form
ref="form1"
v-model="form1.data"
:action="form1.props.action"
:columns='form1.props.columns'
:rules="form1.props.rules"
:form-type="form1.props.formType"
:loading.sync="form1.props.loading"
:auto-close="true"
:submit-text='form1.props.submitText'
label-width="140px"
@success="form1.props.show = false;"
@cancel="form1.props.show = false"
></vk-data-form>
</vk-data-dialog>
<!-- 弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
},
// 表单属性
props: {
// 表单请求地址
action:"template/test/sys/test",
// 表单字段显示规则
columns:[
{ key: "text", title:"text类型字段", type:"text", show:["add"] },
{ key: "number", title:"number类型字段", type:"number", show:["add"]},
{ key: "radio", title:"radio类型字段", type:"radio" , show:["add"],
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "checkbox", title:"checkbox类型字段", type:"checkbox", show:["update"],
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "textarea", title:"textarea类型字段", type:"textarea",
autosize:{ minRows: 4, maxRows: 10 }, maxlength:200, showWordLimit:true,
},
{ key: "switch", title:"switch类型字段", type:"switch" },
],
// 表单验证规则
rules: {
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show: false,
// 表单是否在请求中
loading:false,
// 表单标题
title: '',
submitText:''
}
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
// 重置表单
resetForm() {
if (that.$refs.form1) that.$refs.form1.resetForm();
},
// 显示表单
showForm(type){
let { form1 } = that;
// 先重置下表单
that.resetForm();
if(type === 'add'){
form1.props.title = '添加表单';
form1.props.submitText = '添加';
// 此处添加的action和修改的action可以不一致
form1.props.action = "template/test/sys/test";
}else{
form1.props.title = '修改表单';
form1.props.submitText = '修改';
// 此处添加的action和修改的action可以不一致
form1.props.action = "template/test/sys/test";
// 如果是修改 可以在此赋值
form1.data = {
checkbox: [1],
textarea: '1111',
switch: true
};
}
form1.props.formType = type;
form1.props.show = true;
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,142 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header title="Form 表单" subTitle="弹窗表单"></vk-data-page-header>
<view class="page-body">
<el-button @click="form1.props.show = true">弹出表单</el-button>
<el-button @click="resetForm">重置表单</el-button>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
</view>
<!-- 弹窗开始 -->
<vk-data-dialog
v-model="form1.props.show"
title="表单标题"
width="950px"
mode="form"
>
<vk-data-form
ref="form1"
v-model="form1.data"
:action="form1.props.action"
:columns="form1.props.columns"
:rules="form1.props.rules"
:form-type="form1.props.formType"
:loading.sync="form1.props.loading"
:auto-close="true"
label-width="140px"
@success="onFormSuccess"
></vk-data-form>
</vk-data-dialog>
<!-- 弹窗结束 -->
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
radio: 1,
checkbox : [1,2]
},
// 表单属性
props: {
// 表单请求地址
action: "template/test/sys/test",
// 表单字段显示规则
columns: [
{ key: "text", title: "text类型字段", type: "text" },
{ key: "number", title: "number类型字段", type: "number" },
{ key: "radio", title: "radio类型字段", type: "radio",
data: [
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" },
]
},
{ key: "checkbox", title: "checkbox类型字段", type: "checkbox",
data: [
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" },
]
},
{ key: "textarea", title: "textarea类型字段", type: "textarea",
autosize: { minRows: 4, maxRows: 10 },
maxlength: 200,
showWordLimit: true
},
{ key: "switch", title: "switch类型字段", type: "switch" },
{ key:"editor", title:"富文本类型", type:"editor", width:"750px" },
],
// 表单验证规则
rules: {
text: [
{ required: true, message: "text不能为空", trigger: "change" },
]
},
// add 代表添加 update 代表修改
formType: "",
// 表单是否在请求中
loading: false,
// 是否显示表单1 的弹窗
show: false
}
},
// 表单相关结束-----------------------------------------------------------
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {},
// 表单提交成功时的回调
onFormSuccess() {
// that.form1.props.show = false;
},
// 重置表单
resetForm() {
let that = this;
if (that.$refs.form1) that.$refs.form1.resetForm();
}
},
// 过滤器
filters: {
},
// 计算属性
computed: {
}
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,152 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单"
subTitle="行内表单"
></vk-data-page-header>
<view class="page-body" style="max-width: 1200px;margin: 0 auto;">
<vk-data-form
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
:loading.sync="form1.props.loading"
label-width="140px"
:inline="true"
:columnsNumber="2"
@cancel="onCancel"
@success="onFormSuccess"
></vk-data-form>
</view>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
radio: 1,
checkbox : [1,2]
},
// 表单属性
props: {
// 表单请求地址
action:"template/test/sys/test",
// 表单字段显示规则
columns:[
{ key: "text", title:"text类型字段", type:"text" },
{ key: "user_id", title:"用户选择器", type:"remote-select", placeholder:"请输入用户账号",
action:"admin/select/kh/user"
},
{ key: "money", title:"money类型字段", type:"money" },
{ key: "select", title:"select类型字段", type:"select",
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "number", title:"number类型字段", type:"number" },
{ key: "switch", title:"switch类型字段", type:"switch" },
{ key: "radio", title:"radio类型字段", type:"radio" ,
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "checkbox", title:"checkbox类型字段", type:"checkbox",
data:[
{ value: 1, label: "选项1" },
{ value: 2, label: "选项2" }
]
},
{ key: "textarea", title:"textarea类型字段", type:"textarea",
autosize:{ minRows: 6, maxRows: 10 }, maxlength:200, showWordLimit:true,
width:820
},
],
// 表单验证规则
rules: {
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show: false,
// 表单是否在请求中
loading:false
}
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
onCancel(){
console.log("关闭");
vk.menuTabs.closeCurrent();
},
onFormSuccess(){
console.log("表单提交成功");
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,197 @@
<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> -->
<el-button type="success" 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>
+543
View File
@@ -0,0 +1,543 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单"
subTitle="高级表单"
></vk-data-page-header>
<view class="page-body">
<!-- 页面主体内容开始 -->
<vk-data-form
ref="form1"
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
:loading.sync="form1.props.loading"
label-width="140px"
input-width="400px"
@success="onFormSuccess"
>
<!-- v-slot:editor 中的 editor 对应 columns中的 key, form对应 form1.data keyName 对应 columns中的 key -->
<!-- <template v-slot:editor="{ form, keyName }">
<vk-data-input-editor v-model="form[keyName]" placeholder="开始输入" width="750px"></vk-data-input-editor>
</template> -->
</vk-data-form>
<!-- 页面主体内容结束 -->
</view>
<view class="page-footer">
<!-- 页面底部内容开始 -->
<el-button :loading="form1.props.loading" type="primary" class="footer-update-btn" @click="submitForm">确定</el-button>
<el-button plain class="footer-back-btn" @click="onCancel" style="margin-left: 30px;">返回</el-button>
<!-- 页面底部内容开始 -->
</view>
<view class="tips" style="position: fixed;right: 0px;top:100px;bottom:15px; overflow: auto;max-width: 400px;">
<view class="json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
radio:1,
},
// 表单属性
props: {
// 表单请求地址
action:"template/test/sys/test",
// 表单字段显示规则
columns:[
// 基础字段类型
{ key:"", title:"基础字段", type:"bar-title" },
{ key:"text", title:"单行文本", type:"text" },
{
key:"textarea", title:"多行文本", type:"textarea",
autosize:{ minRows:4, maxRows:10 },
maxlength:200,
showWordLimit:true,
},
{ key:"money", title:"money类型", type:"money", tips:"100 = 1元。页面显示的是1,实际的值是100,请看右上角表单数据的值。" },
{ key:"number", title:"number类型", type:"number", precision:2, tips:"number类型值会转为数字,可以指定小数位数" },
{ key:"number2", title:"计数器类型", type:"number", controls:true, precision:0, min:5, max:100, placeholder:"请输入数字" },
{ key:"percentage", title:"百分比类型", type:"percentage", precision:0, tips:"页面显示的是1,实际的值是0.01,请看右上角表单数据的值。" },
{ key:"discount", title:"折扣类型", type:"discount", tips:"页面显示的是1,实际的值是0.1,请看右上角表单数据的值。" },
{ key:"text2", title:"文本2", type:"text",prepend:"前置文字",append:"后置文字",prefixIcon:"el-icon-user" },
// 选择型字段
{ key:"", title:"选择型字段", type:"bar-title" },
{
key:"radio1", title:"radio类型1", type:"radio",
itemWidth:80,
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
key:"checkbox1", title:"checkbox类型1", type:"checkbox",
itemWidth:80,
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
key:"radio2", title:"radio类型2", type:"radio",
border:true,
itemWidth:80,
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
key:"checkbox2", title:"checkbox类型2", type:"checkbox",
border:true,
itemWidth:80,
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
key:"radio3", title:"radio类型3", type:"radio" ,
optionType:'button',
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
key:"checkbox3", title:"checkbox类型3", type:"checkbox" ,
optionType:'button',
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
key:"select1", title:"select类型1", type:"select",
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
key:"select2", title:"select类型2", type:"select",
multiple:true,
multipleLimit:2,
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" },
{ value:3, label:"选项3" },
{ value:4, label:"选项4" }
]
},
{
key:"select3", title:"select类型3", type:"select",
group:true,
data:[
{
label: "分组1",
children:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
label: "分组2",
children:[
{ value:3, label:"选项3" },
{ value:4, label:"选项4" }
]
}
]
},
{ key:"province", title:"province类型", type:"province" },
{ key:"address", title:"address类型", type:"address" },
{ key:"cascader1", title:"本地数据级联", type:"cascader",
data:[
{
value:1,
label:"数学",
children:[
{
value:11,
label:"奥数",
},
{
value:12,
label:"微积分",
}
]
},
{
value:2,
label:"语文",
children:[
{
value:21,
label:"文言文",
},
{
value:22,
label:"古诗",
}
]
},
]
},
{ key:"cascader2", title:"云端数据级联", type:"cascader",
action:"admin/system/permission/sys/getAll",
props:{
list:"rows",
value:"permission_id",
label:"label",
children:"children",
multiple:true
}
},
{
key:"cascader3", title:"云端数据级联懒加载", type:"cascader",
action:"admin/system/menu/sys/getCascader",
props:{
list:"rows",
value:"menu_id",
label:"label",
children:"children",
lazy:true,
}
},
{
key:"tree1", title:"树形选择(单选)", type:"tree-select", placeholder:"请选择学科",
data:[
{
value:1,
label:"数学",
children:[
{ value:11,label:"奥数" },
{ value:12,label:"微积分" }
]
},
{
value:2,
label:"语文",
children:[
{ value:21, label:"文言文" },
{ value:22, label:"古诗" }
]
},
]
},
{
key:"tree2", title:"树形选择(多选)", type:"tree-select", placeholder:"请选择学科",
multiple:true,
data:[
{
value:1,
label:"数学",
children:[
{ value:11,label:"奥数" },
{ value:12,label:"微积分" }
]
},
{
value:2,
label:"语文",
children:[
{ value:21, label:"文言文" },
{ value:22, label:"古诗" }
]
},
]
},
{ key:"switch", title:"switch类型", type:"switch" },
{ key:"rate", title:"评分类型", type:"rate", allowHalf:false },
{ key:"slider", title:"滑块类型", type:"slider" },
{ key:"color1", title:"颜色类型1", type:"color" },
{ key:"color2", title:"颜色类型2", type:"color", showAlpha:true },
{ key:"icon1", title:"图标1", type:"icon" },
{ key:"icon2", title:"图标2", type:"icon", filter:"vk-" },
{ key:"icon3", title:"图标3", type:"icon",
filter:(name)=>{
// 不显示vk图标
return name.indexOf("vk-icon") === 0 ? false : true;
},
},
// 文件上传
{ key:"", title:"文件上传", type:"bar-title" },
{
key:"image1", title:"image类型", type:"image",
limit:6
},
{
key:"image2", title:"拖拽上传", type:"image",
limit:6, drag:true,
fileSize:2,
sizeUnit:"mb",
tips:"图片大小限制:小于2M"
},
{
key:"file", title:"文件类型", type:"file",
limit:6,
accept:".txt,.xls,.xlsx,.doc,.docx,.ppt,.pptx,.pdf"
},
{ key:"image3", title:"从素材库多选图片", type:"file-select", placeholder:"请选择图片", fileType:"image", multiple:true, multipleLimit:5 },
{ key:"image4", title:"从素材库单选图片", type:"file-select", placeholder:"请选择图片", fileType:"image" },
{ key:"video1", title:"从素材库单选视频", type:"file-select", placeholder:"请选择视频", fileType:"video" },
// 日期型字段
{ key:"", title:"日期型字段", type:"bar-title" },
{ key:"date", title:"date类型", type:"date", dateType:"date", tips:"可选择年月日" },
{ key:"dateTime", title:"dataTime类型", type:"date", dateType:"datetime", tips:"可选择年月日时分秒" },
{ key:"dateArr", title:"date类型范围", type:"date", dateType:"daterange" },
{ key:"dataTimeArr", title:"dataTime类型范围", type:"date", dateType:"datetimerange" },
// 时间型字段
{ key:"", title:"时间型字段", type:"bar-title" },
{ key:"time1", title:"time类型1", type:"time" },
{
key:"time2", title:"time类型2", type:"time",
valueFormat:"HH:mm",
pickerOptions:{
format:"HH:mm"
}
},
{
key:"time3", title:"time类型3", type:"time", custom:true,
pickerOptions:{
start: '08:00',
step: '01:00',
end: '24:00'
}
},
{ key:"timeArr1", title:"time类型范围1", type:"time", isRange:true },
{
key:"timeArr2", title:"time类型范围2", type:"time", isRange:true,
valueFormat:"HH:mm",
pickerOptions:{
selectableRange: '18:30:00 - 20:30:00',
format:"HH:mm"
}
},
// 数据库联动字段
{ key:"", title:"数据库联动字段", type:"bar-title" },
{
key:"user_id", title:"用户选择器", type:"remote-select", placeholder:"请输入用户账号/昵称",
action:"admin/select/kh/user",
},
{
key: "user_id", title: "选择用户", type: "table-select", placeholder:"选择",
action:"admin/system/user/sys/getList",
columns:[
{ key:"nickname", title:"用户昵称", type:"text", nameKey:true },
{ key:"_id", title:"用户标识", type:"text", idKey:true },
{ key:"mobile", title:"手机号", type:"text" },
]
},
{
key: "role1", title: "通过表格选择(单选)", type: "table-select", placeholder:"请选择角色",
action:"admin/system/role/sys/getList",
columns:[
{ key:"role_name", title:"角色昵称", type:"text", nameKey:true },
{ key:"role_id", title:"角色标识", type:"text", idKey:true }
],
},
{
key: "role2", title: "通过表格选择(多选)", type: "table-select", placeholder:"请选择角色",
action:"admin/system/role/sys/getList",
columns:[
{ key:"role_name", title:"角色昵称", type:"text", nameKey:true },
{ key:"role_id", title:"角色标识", type:"text", idKey:true }
],
multiple:true
},
// 布局
{ key:"", title:"横向布局", type:"bar-title" },
{ key:"", title:"", type:"group", justify:"start",
columns:[
{ key:"text1", title:"单行文本1", type:"text" },
{ key:"text2", title:"单行文本2", type:"text" },
{ key:"text3", title:"单行文本3", type:"text" },
{ key:"text4", title:"单行文本4", type:"text" },
]
},
{ key:"", title:"", type:"group", justify:"start",
columns:[
{ key:"text5", title:"单行文本5", type:"text" },
{ key:"text6", title:"单行文本6", type:"text" },
{ key:"text7", title:"单行文本7", type:"text" },
{ key:"text8", title:"单行文本8", type:"text" },
]
},
// 对象类型
{ key:"", title:"对象类型", type:"bar-title" },
{ key:"object1", title:"对象类型1", type:"object",
columns:[
{ key:"a", title:"对象内属性a", type:"text" },
{ key:"b", title:"对象内属性b", type:"text" },
]
},
// 可以通过设置showLabel:false, 隐藏左侧的label
{ key:"object2", title:"对象类型2", type:"object", showLabel:false,
columns:[
{ key:"a", title:"对象内属性a", type:"text" },
{ key:"b", title:"对象内属性b", type:"text" },
]
},
// 多层嵌套object
{ key:"object3", title:"对象类型3", type:"object", showLabel:true,
columns:[
{ key:"a", title:"对象内属性a", type:"text" },
{ key:"b", title:"嵌套对象b", type:"object", showLabel:true,
columns:[
{ key:"b1", title:"嵌套对象b内属性b1", type:"text" },
{ key:"b2", title:"嵌套对象b内属性b2", type:"text" },
]
},
]
},
// 特殊类型
{ key:"", title:"特殊类型", type:"bar-title" },
{ key:"editor", title:"富文本类型", type:"editor", width:"1000px" },
{ key:"json", title:"json类型", type:"json" },
{ key:"position", title:"地图位置", type:"map", width:600, height:300, defaultLocation:{ latitude: 30.224781, longitude: 120.12438 } },
{ key:"array1", title:"数组字符串类型", type:"array<string>" },
{ key:"array2", title:"数组数字类型", type:"array<number>" },
{
key:"array", title:"数组对象类型", type:"array<object>", itemWidth:260,
showAdd:true,
showClear:true,
showSort:true,
// 新增一行时,该行的默认值
defaultValue:{
select1:1
},
rightBtns:['copy','delete'],
// 每行每个字段对应的渲染规则
columns:[
{
key:"text1", title:"昵称", type:"text",
isUnique:true,
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: ["change","blur"] }
]
},
{
key:"number1", title:"数字", type:"number",
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{
key:"select1", title:"select类型", type:"select",
data:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
],
rules:[
{ required:true, message:"该项不能为空", trigger:["change","blur"] },
]
},
{ key:"switch", title:"switch类型", type:"switch", width:160 },
]
},
{ key:"goods_tags", title:"商品标签", type:"tag" },
],
// 表单验证规则
rules:{
text:[
{ required:true, message:'text不能为空', trigger:'change' }
],
money:[
{ required:true, message:'金额不能为空', trigger:'change' },
{ type:"number", message:'金额必须是数字', trigger:'change' },
],
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show:false,
// 表单是否在请求中
loading:false
}
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods:{
// 页面数据初始化函数
init(options){
},
// 关闭按钮
onCancel(){
console.log("关闭");
vk.menuTabs.closeCurrent();
},
// 表单提交
submitForm(){
that.$refs.form1.submitForm();
},
// 表单提交成功
onFormSuccess(){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
.page{
}
</style>
@@ -0,0 +1,142 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Form 表单"
subTitle="使用插糟自定义表单"
></vk-data-page-header>
<view class="page-body" style="max-width: 800px;margin: 0 auto;">
<vk-data-form
ref="form1"
v-model="form1.data"
:rules="form1.props.rules"
:action="form1.props.action"
:form-type="form1.props.formType"
:columns='form1.props.columns'
:loading.sync="form1.props.loading"
label-width="140px"
@success="onFormSuccess"
>
<!-- v-slot:rate 中的 rate 对应 columns中的 key, form对应 form1.data keyName 对应 columns中的 key -->
<template v-slot:rate="{ form, keyName }">
<view style="height: 36px;display: flex;align-items: center;">
<el-rate v-model="form[keyName]"></el-rate>
</view>
</template>
<template v-slot:footer="{ loading }">
<el-button plain style="margin-right: 20px;width: 80px;" @click="onCancel">返回</el-button>
<el-button :loading="loading" type="primary" style="width: 80px;" @click="submitForm">添加</el-button>
</template>
</vk-data-form>
<view class="tips mt15">
<view class="mt15 json-view" v-if="form1.data">
<view style="font-size: 14px;">表单数据</view>
<pre>
{{ form1.data }}
</pre>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单相关开始-----------------------------------------------------------
form1: {
// 表单请求数据,此处可以设置默认值
data: {
},
// 表单属性
props: {
// 表单请求地址
action:"template/test/sys/test",
// 表单字段显示规则
columns:[
{ key: "text", title:"text类型字段", type:"text" },
{ key: "rate", title:"插糟用法", type:"text" },
],
// 表单验证规则
rules: {
},
// add 代表添加 update 代表修改
formType:'',
// 是否显示表单1 的弹窗
show: false,
// 表单是否在请求中
loading:false
}
},
// 表单相关结束-----------------------------------------------------------
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
// 页面返回
onCancel(){
vk.menuTabs.closeCurrent();
},
// 表单提交
submitForm(){
that.$refs.form1.submitForm();
},
// 表单提交成功后
onFormSuccess(){
},
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,122 @@
<!-- 与element-icons区别是没有left和top窗口 -->
<template>
<!-- 页面内容开始 -->
<view class="page">
<vk-data-page-header
title="Element 图标"
subTitle="点击图标即可复制图标代码"
></vk-data-page-header>
<view class="page-body icons">
<view v-for="(icon,index) in icons" :key="icon" class="icon-item pointer">
<vk-data-icon :name="icon" size="30" @click="setClipboardData('tag',icon)"></vk-data-icon>
<text @click="setClipboardData('class',icon)" class="icon-text">{{icon}}</text>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</template>
<script>
import icons from './js/element-icons.js'
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
icons,
// init请求返回的数据
data: {},
// 表单请求数据
form1: {}
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {},
setClipboardData(type, icon) {
let data = icon;
if (type === 'tag') {
data = `<vk-data-icon name="${icon}" size="30"></vk-data-icon>`;
}
vk.pubfn.setClipboardData({
data,
success(res) {
uni.showToast({
icon: 'none',
title: '复制 ' + data + ' 成功!'
})
},
fail(res) {
uni.showModal({
content: '复制 ' + data + ' 失败!',
showCancel: false
});
}
})
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
}
</script>
<style lang="scss" scoped>
.icons {
display: flex;
flex-wrap: wrap;
}
.icon-item {
display: flex;
width: 16.6%;
height: 120px;
font-size: 30px;
text-align: center;
justify-content: center;
align-items: center;
flex-direction: column;
}
.icon-item:hover,
.icon-item:hover .icon-text {
color: #007AFF;
}
.icon-text {
color: #99a9bf;
font-size: 12px;
text-align: center;
height: 1em;
line-height: 1em;
margin-top: 15px;
}
@media only screen and (max-width: 500px) {
.icon-item {
width: 33.3%;
}
}
</style>
@@ -0,0 +1,121 @@
<template>
<!-- 页面内容开始 -->
<view class="page">
<vk-data-page-header
title="Element 图标"
subTitle="点击图标即可复制图标代码"
></vk-data-page-header>
<view class="page-body icons">
<view v-for="(icon,index) in icons" :key="icon" class="icon-item pointer">
<vk-data-icon :name="icon" size="30" @click="setClipboardData('tag',icon)"></vk-data-icon>
<text @click="setClipboardData('class',icon)" class="icon-text">{{icon}}</text>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</template>
<script>
import icons from './js/element-icons.js'
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
icons,
// init请求返回的数据
data: {},
// 表单请求数据
form1: {}
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {},
setClipboardData(type, icon) {
let data = icon;
if (type === 'tag') {
data = `<vk-data-icon name="${icon}" size="30"></vk-data-icon>`;
}
vk.pubfn.setClipboardData({
data,
success(res) {
uni.showToast({
icon: 'none',
title: '复制 ' + data + ' 成功!'
})
},
fail(res) {
uni.showModal({
content: '复制 ' + data + ' 失败!',
showCancel: false
});
}
})
}
},
// 过滤器
filters: {},
// 计算属性
computed: {}
}
</script>
<style lang="scss" scoped>
.icons {
display: flex;
flex-wrap: wrap;
}
.icon-item {
display: flex;
width: 16.6%;
height: 120px;
font-size: 30px;
text-align: center;
justify-content: center;
align-items: center;
flex-direction: column;
}
.icon-item:hover,
.icon-item:hover .icon-text {
color: #007AFF;
}
.icon-text {
color: #99a9bf;
font-size: 12px;
text-align: center;
height: 1em;
line-height: 1em;
margin-top: 15px;
}
@media only screen and (max-width: 500px) {
.icon-item {
width: 33.3%;
}
}
</style>
@@ -0,0 +1,282 @@
export default [
"el-icon-platform-eleme",
"el-icon-eleme",
"el-icon-delete-solid",
"el-icon-delete",
"el-icon-s-tools",
"el-icon-setting",
"el-icon-user-solid",
"el-icon-user",
"el-icon-phone",
"el-icon-phone-outline",
"el-icon-more",
"el-icon-more-outline",
"el-icon-star-on",
"el-icon-star-off",
"el-icon-s-goods",
"el-icon-goods",
"el-icon-warning",
"el-icon-warning-outline",
"el-icon-question",
"el-icon-info",
"el-icon-remove",
"el-icon-circle-plus",
"el-icon-success",
"el-icon-error",
"el-icon-zoom-in",
"el-icon-zoom-out",
"el-icon-remove-outline",
"el-icon-circle-plus-outline",
"el-icon-circle-check",
"el-icon-circle-close",
"el-icon-s-help",
"el-icon-help",
"el-icon-minus",
"el-icon-plus",
"el-icon-check",
"el-icon-close",
"el-icon-picture",
"el-icon-picture-outline",
"el-icon-picture-outline-round",
"el-icon-upload",
"el-icon-upload2",
"el-icon-download",
"el-icon-camera-solid",
"el-icon-camera",
"el-icon-video-camera-solid",
"el-icon-video-camera",
"el-icon-message-solid",
"el-icon-bell",
"el-icon-s-cooperation",
"el-icon-s-order",
"el-icon-s-platform",
"el-icon-s-fold",
"el-icon-s-unfold",
"el-icon-s-operation",
"el-icon-s-promotion",
"el-icon-s-home",
"el-icon-s-release",
"el-icon-s-ticket",
"el-icon-s-management",
"el-icon-s-open",
"el-icon-s-shop",
"el-icon-s-marketing",
"el-icon-s-flag",
"el-icon-s-comment",
"el-icon-s-finance",
"el-icon-s-claim",
"el-icon-s-custom",
"el-icon-s-opportunity",
"el-icon-s-data",
"el-icon-s-check",
"el-icon-s-grid",
"el-icon-menu",
"el-icon-share",
"el-icon-d-caret",
"el-icon-caret-left",
"el-icon-caret-right",
"el-icon-caret-bottom",
"el-icon-caret-top",
"el-icon-bottom-left",
"el-icon-bottom-right",
"el-icon-back",
"el-icon-right",
"el-icon-bottom",
"el-icon-top",
"el-icon-top-left",
"el-icon-top-right",
"el-icon-arrow-left",
"el-icon-arrow-right",
"el-icon-arrow-down",
"el-icon-arrow-up",
"el-icon-d-arrow-left",
"el-icon-d-arrow-right",
"el-icon-video-pause",
"el-icon-video-play",
"el-icon-refresh",
"el-icon-refresh-right",
"el-icon-refresh-left",
"el-icon-finished",
"el-icon-sort",
"el-icon-sort-up",
"el-icon-sort-down",
"el-icon-rank",
"el-icon-loading",
"el-icon-view",
"el-icon-c-scale-to-original",
"el-icon-date",
"el-icon-edit",
"el-icon-edit-outline",
"el-icon-folder",
"el-icon-folder-opened",
"el-icon-folder-add",
"el-icon-folder-remove",
"el-icon-folder-delete",
"el-icon-folder-checked",
"el-icon-tickets",
"el-icon-document-remove",
"el-icon-document-delete",
"el-icon-document-copy",
"el-icon-document-checked",
"el-icon-document",
"el-icon-document-add",
"el-icon-printer",
"el-icon-paperclip",
"el-icon-takeaway-box",
"el-icon-search",
"el-icon-monitor",
"el-icon-attract",
"el-icon-mobile",
"el-icon-scissors",
"el-icon-umbrella",
"el-icon-headset",
"el-icon-brush",
"el-icon-mouse",
"el-icon-coordinate",
"el-icon-magic-stick",
"el-icon-reading",
"el-icon-data-line",
"el-icon-data-board",
"el-icon-pie-chart",
"el-icon-data-analysis",
"el-icon-collection-tag",
"el-icon-film",
"el-icon-suitcase",
"el-icon-suitcase-1",
"el-icon-receiving",
"el-icon-collection",
"el-icon-files",
"el-icon-notebook-1",
"el-icon-notebook-2",
"el-icon-toilet-paper",
"el-icon-office-building",
"el-icon-school",
"el-icon-table-lamp",
"el-icon-house",
"el-icon-no-smoking",
"el-icon-smoking",
"el-icon-shopping-cart-full",
"el-icon-shopping-cart-1",
"el-icon-shopping-cart-2",
"el-icon-shopping-bag-1",
"el-icon-shopping-bag-2",
"el-icon-sold-out",
"el-icon-sell",
"el-icon-present",
"el-icon-box",
"el-icon-bank-card",
"el-icon-money",
"el-icon-coin",
"el-icon-wallet",
"el-icon-discount",
"el-icon-price-tag",
"el-icon-news",
"el-icon-guide",
"el-icon-male",
"el-icon-female",
"el-icon-thumb",
"el-icon-cpu",
"el-icon-link",
"el-icon-connection",
"el-icon-open",
"el-icon-turn-off",
"el-icon-set-up",
"el-icon-chat-round",
"el-icon-chat-line-round",
"el-icon-chat-square",
"el-icon-chat-dot-round",
"el-icon-chat-dot-square",
"el-icon-chat-line-square",
"el-icon-message",
"el-icon-postcard",
"el-icon-position",
"el-icon-turn-off-microphone",
"el-icon-microphone",
"el-icon-close-notification",
"el-icon-bangzhu",
"el-icon-time",
"el-icon-odometer",
"el-icon-crop",
"el-icon-aim",
"el-icon-switch-button",
"el-icon-full-screen",
"el-icon-copy-document",
"el-icon-mic",
"el-icon-stopwatch",
"el-icon-medal-1",
"el-icon-medal",
"el-icon-trophy",
"el-icon-trophy-1",
"el-icon-first-aid-kit",
"el-icon-discover",
"el-icon-place",
"el-icon-location",
"el-icon-location-outline",
"el-icon-location-information",
"el-icon-add-location",
"el-icon-delete-location",
"el-icon-map-location",
"el-icon-alarm-clock",
"el-icon-timer",
"el-icon-watch-1",
"el-icon-watch",
"el-icon-lock",
"el-icon-unlock",
"el-icon-key",
"el-icon-service",
"el-icon-mobile-phone",
"el-icon-bicycle",
"el-icon-truck",
"el-icon-ship",
"el-icon-basketball",
"el-icon-football",
"el-icon-soccer",
"el-icon-baseball",
"el-icon-wind-power",
"el-icon-light-rain",
"el-icon-lightning",
"el-icon-heavy-rain",
"el-icon-sunrise",
"el-icon-sunrise-1",
"el-icon-sunset",
"el-icon-sunny",
"el-icon-cloudy",
"el-icon-partly-cloudy",
"el-icon-cloudy-and-sunny",
"el-icon-moon",
"el-icon-moon-night",
"el-icon-dish",
"el-icon-dish-1",
"el-icon-food",
"el-icon-chicken",
"el-icon-fork-spoon",
"el-icon-knife-fork",
"el-icon-burger",
"el-icon-tableware",
"el-icon-sugar",
"el-icon-dessert",
"el-icon-ice-cream",
"el-icon-hot-water",
"el-icon-water-cup",
"el-icon-coffee-cup",
"el-icon-cold-drink",
"el-icon-goblet",
"el-icon-goblet-full",
"el-icon-goblet-square",
"el-icon-goblet-square-full",
"el-icon-refrigerator",
"el-icon-grape",
"el-icon-watermelon",
"el-icon-cherry",
"el-icon-apple",
"el-icon-pear",
"el-icon-orange",
"el-icon-coffee",
"el-icon-ice-tea",
"el-icon-ice-drink",
"el-icon-milk-tea",
"el-icon-potato-strips",
"el-icon-lollipop",
"el-icon-ice-cream-square",
"el-icon-ice-cream-round"
];
@@ -0,0 +1,468 @@
export default [
"vk-icon-activityfill",
"vk-icon-crownfill",
"vk-icon-crown",
"vk-icon-goodsfill",
"vk-icon-messagefill",
"vk-icon-profilefill",
"vk-icon-sound",
"vk-icon-sponsorfill",
"vk-icon-sponsor",
"vk-icon-upblock",
"vk-icon-weblock",
"vk-icon-weunblock",
"vk-icon-1111",
"vk-icon-my",
"vk-icon-myfill",
"vk-icon-emojifill",
"vk-icon-emojiflashfill",
"vk-icon-flashbuyfill-copy",
"vk-icon-text",
"vk-icon-goodsfavor",
"vk-icon-musicfill",
"vk-icon-musicforbidfill",
"vk-icon-roundleftfill",
"vk-icon-triangledownfill",
"vk-icon-triangleupfill",
"vk-icon-roundleftfill-copy",
"vk-icon-pulldown1",
"vk-icon-emojilight",
"vk-icon-keyboardlight",
"vk-icon-recordfill",
"vk-icon-recordlight",
"vk-icon-appreciate",
"vk-icon-record",
"vk-icon-check",
"vk-icon-roundaddlight",
"vk-icon-close",
"vk-icon-soundlight",
"vk-icon-edit",
"vk-icon-cardboardfill",
"vk-icon-emoji",
"vk-icon-cardboard",
"vk-icon-favorfill",
"vk-icon-formfill",
"vk-icon-favor",
"vk-icon-coin",
"vk-icon-loading",
"vk-icon-sortlight",
"vk-icon-locationfill",
"vk-icon-cardboardforbid",
"vk-icon-location",
"vk-icon-circlefill",
"vk-icon-phone",
"vk-icon-circle",
"vk-icon-roundcheckfill",
"vk-icon-attentionforbid",
"vk-icon-roundcheck",
"vk-icon-attentionforbidfill",
"vk-icon-roundclosefill",
"vk-icon-attentionfavorfill",
"vk-icon-roundclose",
"vk-icon-attentionfavor",
"vk-icon-roundrightfill",
"vk-icon-piclight",
"vk-icon-roundright",
"vk-icon-shoplight",
"vk-icon-search",
"vk-icon-voicelight",
"vk-icon-taxi",
"vk-icon-attentionfavorfill-copy",
"vk-icon-timefill",
"vk-icon-full",
"vk-icon-time",
"vk-icon-mail",
"vk-icon-unfold",
"vk-icon-peoplelist",
"vk-icon-warnfill",
"vk-icon-goodsnewfill",
"vk-icon-warn",
"vk-icon-goodsnew",
"vk-icon-camerafill",
"vk-icon-medalfill",
"vk-icon-camera",
"vk-icon-medal",
"vk-icon-commentfill",
"vk-icon-newsfill",
"vk-icon-comment",
"vk-icon-newshotfill",
"vk-icon-likefill",
"vk-icon-newshot",
"vk-icon-like",
"vk-icon-news",
"vk-icon-notificationfill",
"vk-icon-videofill",
"vk-icon-notification",
"vk-icon-video",
"vk-icon-order",
"vk-icon-askfill",
"vk-icon-samefill",
"vk-icon-ask",
"vk-icon-same",
"vk-icon-exit",
"vk-icon-deliver",
"vk-icon-skinfill",
"vk-icon-evaluate",
"vk-icon-skin",
"vk-icon-pay",
"vk-icon-moneybagfill",
"vk-icon-send",
"vk-icon-usefullfill",
"vk-icon-shop",
"vk-icon-usefull",
"vk-icon-ticket",
"vk-icon-moneybag",
"vk-icon-wang",
"vk-icon-redpacket_fill",
"vk-icon-back",
"vk-icon-subscription",
"vk-icon-cascades",
"vk-icon-home_light",
"vk-icon-discover",
"vk-icon-my_light",
"vk-icon-list",
"vk-icon-community_light",
"vk-icon-more",
"vk-icon-cart_light",
"vk-icon-scan",
"vk-icon-we_light",
"vk-icon-settings",
"vk-icon-home_fill_light",
"vk-icon-questionfill",
"vk-icon-cart_fill_light",
"vk-icon-question",
"vk-icon-community_fill_light",
"vk-icon-shopfill",
"vk-icon-my_fill_light",
"vk-icon-form",
"vk-icon-we_fill_light",
"vk-icon-wangfill",
"vk-icon-skin_light",
"vk-icon-pic",
"vk-icon-search_light",
"vk-icon-filter",
"vk-icon-scan_light",
"vk-icon-footprint",
"vk-icon-people_list_light",
"vk-icon-top",
"vk-icon-message_light",
"vk-icon-pulldown",
"vk-icon-close_light",
"vk-icon-pullup",
"vk-icon-add_light",
"vk-icon-right",
"vk-icon-profile_light",
"vk-icon-refresh",
"vk-icon-service_light",
"vk-icon-moreandroid",
"vk-icon-friend_add_light",
"vk-icon-deletefill",
"vk-icon-edit_light",
"vk-icon-refund",
"vk-icon-camera_light",
"vk-icon-cart",
"vk-icon-hot_light",
"vk-icon-qrcode",
"vk-icon-refresh_light",
"vk-icon-remind",
"vk-icon-back_light",
"vk-icon-delete",
"vk-icon-share_light",
"vk-icon-profile",
"vk-icon-comment_light",
"vk-icon-home",
"vk-icon-appreciate_light",
"vk-icon-cartfill",
"vk-icon-favor_light",
"vk-icon-discoverfill",
"vk-icon-appreciate_fill_light",
"vk-icon-homefill",
"vk-icon-comment_fill_light",
"vk-icon-message",
"vk-icon-wang_light",
"vk-icon-addressbook",
"vk-icon-more_android_light",
"vk-icon-link",
"vk-icon-friend_light",
"vk-icon-lock",
"vk-icon-more_light",
"vk-icon-unlock",
"vk-icon-goods_favor_light",
"vk-icon-vip",
"vk-icon-goods_new_fill_light",
"vk-icon-weibo",
"vk-icon-goods_new_light",
"vk-icon-activity",
"vk-icon-goods_light",
"vk-icon-big",
"vk-icon-medal_fill_light",
"vk-icon-friendaddfill",
"vk-icon-medal_light",
"vk-icon-friendadd",
"vk-icon-news_fill_light",
"vk-icon-friendfamous",
"vk-icon-news_hot_fill_light",
"vk-icon-friend",
"vk-icon-news_hot_light",
"vk-icon-goods",
"vk-icon-news_light",
"vk-icon-selection",
"vk-icon-video_fill_light",
"vk-icon-tmall",
"vk-icon-message_fill_light",
"vk-icon-explore",
"vk-icon-form_light",
"vk-icon-present",
"vk-icon-video_light",
"vk-icon-squarecheckfill",
"vk-icon-search_list_light",
"vk-icon-square",
"vk-icon-form_fill_light",
"vk-icon-squarecheck",
"vk-icon-global_light",
"vk-icon-round",
"vk-icon-global",
"vk-icon-roundaddfill",
"vk-icon-favor_fill_light",
"vk-icon-roundadd",
"vk-icon-delete_light",
"vk-icon-add",
"vk-icon-back_android",
"vk-icon-notificationforbidfill",
"vk-icon-back_android_light",
"vk-icon-explorefill",
"vk-icon-down_light",
"vk-icon-fold",
"vk-icon-round_close_light",
"vk-icon-game",
"vk-icon-round_close_fill_light",
"vk-icon-redpacket",
"vk-icon-expressman",
"vk-icon-selectionfill",
"vk-icon-punch_light",
"vk-icon-similar",
"vk-icon-evaluate_fill",
"vk-icon-appreciatefill",
"vk-icon-furniture",
"vk-icon-infofill",
"vk-icon-dress",
"vk-icon-info",
"vk-icon-coffee",
"vk-icon-tao",
"vk-icon-sports",
"vk-icon-mobiletao",
"vk-icon-group_light",
"vk-icon-forwardfill",
"vk-icon-location_light",
"vk-icon-forward",
"vk-icon-attention_light",
"vk-icon-rechargefill",
"vk-icon-group_fill_light",
"vk-icon-recharge",
"vk-icon-group_fill",
"vk-icon-vipcard",
"vk-icon-play_forward_fill",
"vk-icon-voice",
"vk-icon-subscription_light",
"vk-icon-voicefill",
"vk-icon-deliver_fill",
"vk-icon-friendfavor",
"vk-icon-notice_forbid_fill",
"vk-icon-wifi",
"vk-icon-qr_code_light",
"vk-icon-share",
"vk-icon-settings_light",
"vk-icon-wefill",
"vk-icon-pick",
"vk-icon-we",
"vk-icon-form_favor_light",
"vk-icon-lightauto",
"vk-icon-round_comment_light",
"vk-icon-lightforbid",
"vk-icon-phone_light",
"vk-icon-lightfill",
"vk-icon-round_down_light",
"vk-icon-camerarotate",
"vk-icon-friend_settings_light",
"vk-icon-light",
"vk-icon-change",
"vk-icon-barcode",
"vk-icon-round_list_light",
"vk-icon-flashlightclose",
"vk-icon-ticket_fill",
"vk-icon-flashlightopen",
"vk-icon-round_friend_fill",
"vk-icon-searchlist",
"vk-icon-round_crown_fill",
"vk-icon-service",
"vk-icon-round_link_fill",
"vk-icon-sort",
"vk-icon-round_light_fill",
"vk-icon-1212",
"vk-icon-round_favor_fill",
"vk-icon-down",
"vk-icon-round_menu_fill",
"vk-icon-mobile",
"vk-icon-round_location_fill",
"vk-icon-mobilefill",
"vk-icon-round_pay_fill",
"vk-icon-copy",
"vk-icon-round_like_fill",
"vk-icon-countdownfill",
"vk-icon-round_people_fill",
"vk-icon-countdown",
"vk-icon-round_pay",
"vk-icon-noticefill",
"vk-icon-round_rank_fill",
"vk-icon-notice",
"vk-icon-round_redpacket_fill",
"vk-icon-qiang",
"vk-icon-round_skin_fill",
"vk-icon-upstagefill",
"vk-icon-round_record_fill",
"vk-icon-upstage",
"vk-icon-round_ticket_fill",
"vk-icon-babyfill",
"vk-icon-round_redpacket",
"vk-icon-baby",
"vk-icon-round_text_fill",
"vk-icon-brandfill",
"vk-icon-round_ticket",
"vk-icon-brand",
"vk-icon-round_transfer_fill",
"vk-icon-choicenessfill",
"vk-icon-subtitle_block_light",
"vk-icon-choiceness",
"vk-icon-warn_light",
"vk-icon-clothesfill",
"vk-icon-round_transfer",
"vk-icon-clothes",
"vk-icon-vip_code_light",
"vk-icon-creativefill",
"vk-icon-subtitle_unblock_light",
"vk-icon-creative",
"vk-icon-round_shop_fill",
"vk-icon-female",
"vk-icon-oppose_fill_light",
"vk-icon-keyboard",
"vk-icon-oppose_light",
"vk-icon-male",
"vk-icon-living",
"vk-icon-newfill",
"vk-icon-goods_hot_fill",
"vk-icon-new",
"vk-icon-ticket_money_fill",
"vk-icon-pullleft",
"vk-icon-arrow_left_fill",
"vk-icon-pullright",
"vk-icon-arrow_up_fill",
"vk-icon-rankfill",
"vk-icon-xiaoheiqun",
"vk-icon-rank",
"vk-icon-auction",
"vk-icon-bad",
"vk-icon-return",
"vk-icon-cameraadd",
"vk-icon-mall_light",
"vk-icon-focus",
"vk-icon-mall_fill_light",
"vk-icon-friendfill",
"vk-icon-broadcast_fill",
"vk-icon-cameraaddfill",
"vk-icon-at",
"vk-icon-apps",
"vk-icon-card_fill",
"vk-icon-paintfill",
"vk-icon-paint",
"vk-icon-picfill",
"vk-icon-refresharrow",
"vk-icon-markfill",
"vk-icon-mark",
"vk-icon-presentfill",
"vk-icon-repeal",
"vk-icon-album",
"vk-icon-peoplefill",
"vk-icon-people",
"vk-icon-servicefill",
"vk-icon-repair",
"vk-icon-file",
"vk-icon-repairfill",
"vk-icon-taoxiaopu",
"vk-icon-attentionfill",
"vk-icon-attention",
"vk-icon-commandfill",
"vk-icon-command",
"vk-icon-communityfill",
"vk-icon-community",
"vk-icon-read",
"vk-icon-suan",
"vk-icon-hua",
"vk-icon-ju",
"vk-icon-tian",
"vk-icon-calendar",
"vk-icon-cut",
"vk-icon-magic",
"vk-icon-backwardfill",
"vk-icon-playfill",
"vk-icon-stop",
"vk-icon-tagfill",
"vk-icon-tag",
"vk-icon-group",
"vk-icon-all",
"vk-icon-backdelete",
"vk-icon-hotfill",
"vk-icon-hot",
"vk-icon-post",
"vk-icon-radiobox",
"vk-icon-rounddown",
"vk-icon-upload",
"vk-icon-writefill",
"vk-icon-write",
"vk-icon-radioboxfill",
"vk-icon-punch",
"vk-icon-shake",
"vk-icon-add1",
"vk-icon-move",
"vk-icon-safe",
"vk-icon-qi",
"vk-icon-ye",
"vk-icon-cangku",
"vk-icon-cangku1",
"vk-icon-percentage",
"vk-icon-select",
"vk-icon-cascader",
"vk-icon-radio1",
"vk-icon-radio2",
"vk-icon-checkbox1",
"vk-icon-checkbox2",
"vk-icon-checkbox3",
"vk-icon-discount",
"vk-icon-number",
"vk-icon-color",
"vk-icon-json",
"vk-icon-text1",
"vk-icon-textarea",
"vk-icon-quyuguanli",
"vk-icon-dengji",
"vk-icon-jiagoufenxiao",
"vk-icon-gudongfenhong",
"vk-icon-tixianguanli",
"vk-icon-miaosha",
"vk-icon-youhuiquan",
"vk-icon-jifen1",
"vk-icon-shouqicaidan",
"vk-icon-zhankaicaidan",
"vk-icon-weixin",
"vk-icon-weixin1",
"vk-icon-zhifubaozhifu",
"vk-icon-zhifubaozhifu1",
"vk-icon-zhifubaozhifu2",
"vk-icon-anzhuo",
"vk-icon-iOS",
"vk-icon-QQ",
"vk-icon-APPku",
"vk-icon-weixingongzhonghao",
"vk-icon-weixinxiaochengxu",
"vk-icon-heading-h5",
"vk-icon-shengji3-xianxing"
];
@@ -0,0 +1,100 @@
<!-- 与vk-icons区别是没有left和top窗口 -->
<template>
<view class="page">
<vk-data-page-header
title="VK框架图标"
subTitle="点击图标即可复制图标代码,如需其他图标,欢迎提交需求。Q群:22466457"
></vk-data-page-header>
<view class="page-body icons">
<view v-for="(icon,index) in icons" :key="icon" class="icon-item pointer">
<vk-data-icon :name="icon" size="30" @click="setClipboardData('tag',icon)"></vk-data-icon>
<text @click="setClipboardData('class',icon)" class="icon-text">{{icon}}</text>
</view>
</view>
</view>
</template>
<script>
import icons from './js/vk-icons.js';
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
return {
icons
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
methods: {
// 页面数据初始化函数
init(options) {
},
setClipboardData(type, icon) {
let data = icon;
if (type === 'tag') {
data = `<vk-data-icon name="${icon}" size="30"></vk-data-icon>`;
};
vk.pubfn.setClipboardData({
data,
success(res) {
uni.showToast({
icon: 'none',
title: '复制 ' + data + ' 成功!'
})
},
fail(res) {
uni.showModal({
content: '复制 ' + data + ' 失败!',
showCancel: false
});
}
});
}
}
}
</script>
<style>
.icons {
display: flex;
flex-wrap: wrap;
}
.icon-item {
display: flex;
width: 16.6%;
height: 120px;
text-align: center;
justify-content: center;
align-items: center;
flex-direction: column;
}
.icon-item:hover,
.icon-item:hover .icon-text {
color: #007AFF;
}
.icon-text {
color: #99a9bf;
font-size: 12px;
text-align: center;
height: 1em;
line-height: 1em;
margin-top: 15px;
}
@media only screen and (max-width: 500px) {
.icon-item {
width: 33.3%;
}
}
</style>
@@ -0,0 +1,99 @@
<template>
<view class="page">
<vk-data-page-header
title="VK框架图标"
subTitle="点击图标即可复制图标代码,如需其他图标,欢迎提交需求。Q群:22466457"
></vk-data-page-header>
<view class="page-body icons">
<view v-for="(icon,index) in icons" :key="icon" class="icon-item pointer">
<vk-data-icon :name="icon" size="30" @click="setClipboardData('tag',icon)"></vk-data-icon>
<text @click="setClipboardData('class',icon)" class="icon-text">{{icon}}</text>
</view>
</view>
</view>
</template>
<script>
import icons from './js/vk-icons.js';
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
return {
icons
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
methods: {
// 页面数据初始化函数
init(options) {
},
setClipboardData(type, icon) {
let data = icon;
if (type === 'tag') {
data = `<vk-data-icon name="${icon}" size="30"></vk-data-icon>`;
};
vk.pubfn.setClipboardData({
data,
success(res) {
uni.showToast({
icon: 'none',
title: '复制 ' + data + ' 成功!'
})
},
fail(res) {
uni.showModal({
content: '复制 ' + data + ' 失败!',
showCancel: false
});
}
});
}
}
}
</script>
<style>
.icons {
display: flex;
flex-wrap: wrap;
}
.icon-item {
display: flex;
width: 16.6%;
height: 120px;
text-align: center;
justify-content: center;
align-items: center;
flex-direction: column;
}
.icon-item:hover,
.icon-item:hover .icon-text {
color: #007AFF;
}
.icon-text {
color: #99a9bf;
font-size: 12px;
text-align: center;
height: 1em;
line-height: 1em;
margin-top: 15px;
}
@media only screen and (max-width: 500px) {
.icon-item {
width: 33.3%;
}
}
</style>
@@ -0,0 +1,99 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="address 省市区选择"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
同时支持下拉选择 和 输入搜索
</view>
<view class="mt15">
<vk-data-input-address
v-model="form1.address1"
placeholder="请选择省市区"
></vk-data-input-address>
</view>
<view class="mt15">
<vk-data-input-address
v-model="form1.address2"
placeholder="请选择省市"
:level="2"
></vk-data-input-address>
</view>
<view class="mt15">
<vk-data-input-address
v-model="form1.address3"
placeholder="请选择省"
:level="1"
></vk-data-input-address>
</view>
<view class="mt15 json-view" v-if="form1">
<pre>
{{form1}}
</pre>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,85 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input JSON"
subTitle="JSON编辑器"
></vk-data-page-header>
<view class="page-body">
<view class="mt15">
<vk-data-input-json
v-model="form1.value1"
mode="code"
placeholder="请输入数字"
></vk-data-input-json>
</view>
</view>
<view class="mt15 json-view" v-if="form1">
<pre>
{{form1}}
</pre>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,98 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="money 金额"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
金额 与 数字不一样的地方是 此处金额单位是分<br/>
输入框显示的是1,但值其实是100
</view>
<view class="mt15">
金额输入框:
<vk-data-input-money
v-model="form1.value1"
placeholder="请输入金额"
width="300px"
></vk-data-input-money>
</view>
<view class="mt15">
表单绑定值:
<vk-data-input-number
class="mt15"
v-model="form1.value1"
:precision="0"
width="300px"
placeholder="请输入金额"
></vk-data-input-number>
</view>
<view class="mt15 json-view" v-if="form1">
<pre>
{{form1}}
</pre>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
value1:100
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,146 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="number-box 步进器"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
整数
</view>
<view class="mt15">
<vk-data-input-number-box
v-model="form1.value1"
:precision="0"
width="200px"
placeholder="请输入数字"
></vk-data-input-number-box>
</view>
<view class="mt15 tips">
2位小数
</view>
<view class="mt15">
<vk-data-input-number-box
v-model="form1.value2"
:precision="2"
:step="0.01"
width="200px"
placeholder="请输入数字"
></vk-data-input-number-box>
</view>
<view class="mt15 tips">
只能输入1-10内的数
</view>
<view class="mt15">
<vk-data-input-number-box
ref="input-number-3"
v-model="form1.value3"
:precision="0"
:max="10"
:min="1"
width="200px"
placeholder="请输入数字"
></vk-data-input-number-box>
</view>
<view class="mt15 tips">
隐藏按钮
</view>
<view class="mt15">
<vk-data-input-number-box
ref="input-number-3"
v-model="form1.value4"
:precision="0"
:controls="false"
width="200px"
placeholder="请输入数字"
></vk-data-input-number-box>
</view>
<view class="mt15 tips">
<el-button @click="focus">使上方输入框获得焦点</el-button>
<el-button @click="select">选中上方输入框中的文字</el-button>
</view>
<view class="mt15 json-view" v-if="form1">
<pre>
{{form1}}
</pre>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
focus(){
that.$refs["input-number-3"].focus();
},
blur(){
that.$refs["input-number-3"].blur();
},
select(){
that.$refs["input-number-3"].select();
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,130 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="number 数字"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
正整数
</view>
<view class="mt15">
<vk-data-input-number
v-model="form1.value1"
:precision="0"
width="300px"
placeholder="请输入数字"
></vk-data-input-number>
</view>
<view class="mt15 tips">
2位小数
</view>
<view class="mt15">
<vk-data-input-number
v-model="form1.value2"
:precision="2"
width="300px"
placeholder="请输入数字"
></vk-data-input-number>
</view>
<view class="mt15 tips">
最大值100
</view>
<view class="mt15">
<vk-data-input-number
ref="input-number-3"
v-model="form1.value3"
:precision="0"
width="300px"
placeholder="请输入数字"
:max="100"
></vk-data-input-number>
</view>
<view class="mt15 tips">
<el-button @click="focus">使上方输入框获得焦点</el-button>
<el-button @click="blur">使上方输入框失去焦点</el-button>
<el-button @click="select">选中上方输入框中的文字</el-button>
</view>
</view>
<view class="mt15 json-view" v-if="form1">
<pre>
{{form1}}
</pre>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
focus(){
that.$refs["input-number-3"].focus();
},
blur(){
that.$refs["input-number-3"].blur();
},
select(){
that.$refs["input-number-3"].select();
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,99 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="percentage 百分比"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
百分比 与 数字不一样的地方是<br/>
输入框显示的是1,但值其实是0.01<br/>
</view>
<view class="mt15">
百分比输入框:
<vk-data-input-percentage
v-model="form1.value1"
placeholder="请输入百分比"
:precision="2"
:max="100"
width="300px"
></vk-data-input-percentage>
</view>
<view class="mt15">
表单绑定的值:
<vk-data-input-number
v-model="form1.value1"
:precision="4"
width="300px"
placeholder="请输入金额"
></vk-data-input-number>
</view>
<view class="mt15 json-view" v-if="form1">
<pre>
{{form1}}
</pre>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
value1:0.01
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,86 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="province 省份选择"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
同时支持下拉选择 和 输入搜索
</view>
<view class="mt15">
<vk-data-input-province
v-model="form1.value"
></vk-data-input-province>
</view>
<view class="mt15 tips">
<view class="mt15 json-view" v-if="form1.value">
<pre>
{{ form1.value }}
</pre>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
value:""
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,89 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="remote-select 远程搜索选择器"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
主要用于选择 user_id 等外键字段
</view>
<view class="mt15">
<vk-data-input-remote-select
v-model="form1.user_id"
placeholder="请输入用户名"
action="admin/select/kh/user"
width="300px"
></vk-data-input-remote-select>
</view>
<view class="mt15 tips">
<view class="mt15 json-view" v-if="form1">
<pre>
{{ form1 }}
</pre>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
user_id:"",
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,119 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="select 下拉选择"
></vk-data-page-header>
<view class="page-body">
<view class="mt15">
<vk-data-input-select
class="width-box"
v-model="form1.value1"
:localdata='[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]'
size="small"
clearable
placeholder="请选择"
></vk-data-input-select>
</view>
<view class="mt15">
<vk-data-input-select
class="width-box"
v-model="form1.value2"
:group="true"
:localdata='[
{
label: "分组1",
children:[
{ value:1, label:"选项1" },
{ value:2, label:"选项2" }
]
},
{
label: "分组2",
children:[
{ value:3, label:"选项3" },
{ value:4, label:"选项4" }
]
}
]'
size="small"
clearable
placeholder="请选择"
></vk-data-input-select>
</view>
<view class="mt15 tips">
<view class="mt15 json-view" v-if="form1">
<pre>
{{ form1 }}
</pre>
</view>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// init请求返回的数据
data:{
},
// 表单请求数据
form1:{
}
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
},
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
+90
View File
@@ -0,0 +1,90 @@
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="Input 表单输入"
subTitle="聚合输入框"
></vk-data-page-header>
<view class="page-body">
<view class="tips">
根据type自动渲染的不同的输入框
</view>
<view class="mt15">
<el-radio-group v-model="type">
<el-radio label="number">数字输入框</el-radio>
<el-radio label="money">金额输入框</el-radio>
<el-radio label="percentage">百分比输入框</el-radio>
<el-radio label="discount">折扣输入框</el-radio>
<el-radio label="number-box">步进器</el-radio>
<!-- <el-radio label="json">JSON输入框</el-radio> -->
<el-radio label="textarea">多行文本输入框</el-radio>
</el-radio-group>
</view>
<view class="mt15">
<vk-data-input :type="type" v-model="form1.value" :precision="0" width="300px" placeholder="请输入"></vk-data-input>
</view>
<view class="mt15 json-view" v-if="form1">
<pre>
{{form1}}
</pre>
</view>
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 表单请求数据
form1:{
value:""
},
type:"number"
}
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady(){
},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {
},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {
},
// 函数
methods: {
// 页面数据初始化函数
init(options){
}
},
// 过滤器
filters:{
},
// 计算属性
computed:{
}
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,85 @@
<!-- 基础用法 -->
<template>
<view class="page">
<!-- 页面内容开始 -->
<vk-data-page-header
title="表格基础用法"
subTitle="高性能表格 - 万行数据如丝滑般流畅"
></vk-data-page-header>
<view class="page-body">
<!-- 表格组件开始 -->
<vk-data-table ref="table1" :data="table1.data" :columns="table1.columns" :row-no="true"></vk-data-table>
<!-- 表格组件结束 -->
</view>
<!-- 页面内容结束 -->
</view>
</template>
<script>
var that; // 当前页面对象
var vk = uni.vk; // vk实例
export default {
data() {
// 页面数据变量
return {
// 字段显示规则
table1: {
// 表格数据
data: [],
// 表格字段显示规则
columns: [
{ key: "_id", title: "用户ID", type: "text", width: 200 },
{ key: "username", title: "用户名", type: "text", width: 200 },
{ key: "nickname", title: "用户昵称", type: "text", width: 200 },
{ key: "mobile", title: "手机号", type: "text", width: 200 },
{ key: "comment", title: "备注", type: "text", minWidth: 200 }
]
}
};
},
// 监听 - 页面每次【加载时】执行(如:前进)
onLoad(options = {}) {
that = this;
vk = that.vk;
that.options = options;
that.init(options);
},
// 监听 - 页面【首次渲染完成时】执行。注意如果渲染速度快,会在页面进入动画完成前触发
onReady() {},
// 监听 - 页面每次【显示时】执行(如:前进和返回) (页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面)
onShow() {},
// 监听 - 页面每次【隐藏时】执行(如:返回)
onHide() {},
// 函数
methods: {
// 页面数据初始化函数
init(options) {
let list = [];
for (let i = 1; i <= 10000; i++) {
let s = i;
if (i < 10) {
s = "0" + i;
}
list.push({
_id: i + "",
username: `用户名${s}`,
nickname: `用户昵称${s}`,
mobile: `尾号${s}`,
comment: `用户${s}的备注`
});
}
that.table1.data = list;
}
},
// 监听属性
watch: {},
// 过滤器
filters: {},
// 计算属性
computed: {}
};
</script>
<style lang="scss" scoped>
</style>

Some files were not shown because too many files have changed in this diff Show More