!1 合并2022-01-06

合并分支
pull/254/head
xiejs 4 years ago committed by Gitee
commit 673305e588
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F

@ -0,0 +1 @@
custom: http://doc.ruoyi.vip/ruoyi-cloud/other/donate.html

@ -1,3 +1,14 @@
<p align="center">
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-b99b286755aef70355a7084753f89cdb7c9.png">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.3.0</h1>
<h4 align="center">基于 Vue/Element UI 和 Spring Boot/Spring Cloud & Alibaba 前后端分离的分布式微服务架构</h4>
<p align="center">
<a href="https://gitee.com/y_project/RuoYi-Cloud/stargazers"><img src="https://gitee.com/y_project/RuoYi-Cloud/badge/star.svg?theme=dark"></a>
<a href="https://gitee.com/y_project/RuoYi-Cloud"><img src="https://img.shields.io/badge/RuoYi-v3.3.0-brightgreen.svg"></a>
<a href="https://gitee.com/y_project/RuoYi-Cloud/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
</p>
## 平台简介 ## 平台简介
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。

@ -20,12 +20,12 @@ public class Constants
/** /**
* RMI * RMI
*/ */
public static final String LOOKUP_RMI = "rmi://"; public static final String LOOKUP_RMI = "rmi:";
/** /**
* LDAP * LDAP
*/ */
public static final String LOOKUP_LDAP = "ldap://"; public static final String LOOKUP_LDAP = "ldap:";
/** /**
* http * http
@ -117,5 +117,5 @@ public class Constants
* *
*/ */
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework.jndi" }; "org.springframework" };
} }

@ -105,6 +105,12 @@
<span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
<el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
</template>
</el-table-column>
#elseif($column.list && "" != $column.dictType) #elseif($column.list && "" != $column.dictType)
<el-table-column label="${comment}" align="center" prop="${javaField}"> <el-table-column label="${comment}" align="center" prop="${javaField}">
<template slot-scope="scope"> <template slot-scope="scope">
@ -174,11 +180,11 @@
</el-form-item> </el-form-item>
#elseif($column.htmlType == "imageUpload") #elseif($column.htmlType == "imageUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<imageUpload v-model="form.${field}"/> <image-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "fileUpload") #elseif($column.htmlType == "fileUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<fileUpload v-model="form.${field}"/> <file-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "editor") #elseif($column.htmlType == "editor")
<el-form-item label="${comment}"> <el-form-item label="${comment}">

@ -133,6 +133,12 @@
<span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
<el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
</template>
</el-table-column>
#elseif($column.list && "" != $column.dictType) #elseif($column.list && "" != $column.dictType)
<el-table-column label="${comment}" align="center" prop="${javaField}"> <el-table-column label="${comment}" align="center" prop="${javaField}">
<template slot-scope="scope"> <template slot-scope="scope">
@ -195,11 +201,11 @@
</el-form-item> </el-form-item>
#elseif($column.htmlType == "imageUpload") #elseif($column.htmlType == "imageUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<imageUpload v-model="form.${field}"/> <image-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "fileUpload") #elseif($column.htmlType == "fileUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<fileUpload v-model="form.${field}"/> <file-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "editor") #elseif($column.htmlType == "editor")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
@ -564,4 +570,4 @@ export default {
} }
} }
}; };
</script> </script>

@ -64,7 +64,7 @@
#end #end
#end #end
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" size="mini" @click="resetQuery">重置</el-button> <el-button icon="Refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -105,6 +105,12 @@
<span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
<el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
<template #default="scope">
<image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
</template>
</el-table-column>
#elseif($column.list && "" != $column.dictType) #elseif($column.list && "" != $column.dictType)
<el-table-column label="${comment}" align="center" prop="${javaField}"> <el-table-column label="${comment}" align="center" prop="${javaField}">
<template #default="scope"> <template #default="scope">
@ -179,11 +185,11 @@
</el-form-item> </el-form-item>
#elseif($column.htmlType == "imageUpload") #elseif($column.htmlType == "imageUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<imageUpload v-model="form.${field}"/> <image-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "fileUpload") #elseif($column.htmlType == "fileUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<fileUpload v-model="form.${field}"/> <file-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "editor") #elseif($column.htmlType == "editor")
<el-form-item label="${comment}"> <el-form-item label="${comment}">

@ -133,6 +133,12 @@
<span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
#elseif($column.list && $column.htmlType == "imageUpload")
<el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
<template #default="scope">
<image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
</template>
</el-table-column>
#elseif($column.list && "" != $column.dictType) #elseif($column.list && "" != $column.dictType)
<el-table-column label="${comment}" align="center" prop="${javaField}"> <el-table-column label="${comment}" align="center" prop="${javaField}">
<template #default="scope"> <template #default="scope">
@ -195,11 +201,11 @@
</el-form-item> </el-form-item>
#elseif($column.htmlType == "imageUpload") #elseif($column.htmlType == "imageUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<imageUpload v-model="form.${field}"/> <image-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "fileUpload") #elseif($column.htmlType == "fileUpload")
<el-form-item label="${comment}"> <el-form-item label="${comment}">
<fileUpload v-model="form.${field}"/> <file-upload v-model="form.${field}"/>
</el-form-item> </el-form-item>
#elseif($column.htmlType == "editor") #elseif($column.htmlType == "editor")
<el-form-item label="${comment}"> <el-form-item label="${comment}">

@ -88,11 +88,11 @@ public class SysJobController extends BaseController
} }
else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
{ {
return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi:'调用");
} }
else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_LDAP)) else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_LDAP))
{ {
return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap://'调用"); return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap:'调用");
} }
else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
{ {
@ -120,11 +120,11 @@ public class SysJobController extends BaseController
} }
else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
{ {
return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi://'调用"); return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi:'调用");
} }
else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_LDAP)) else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_LDAP))
{ {
return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap://'调用"); return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap:'调用");
} }
else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
{ {

@ -179,9 +179,10 @@ public class SysUserController extends BaseController
ajax.put("posts", postService.selectPostAll()); ajax.put("posts", postService.selectPostAll());
if (StringUtils.isNotNull(userId)) if (StringUtils.isNotNull(userId))
{ {
ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId)); SysUser sysUser = userService.selectUserById(userId);
ajax.put(AjaxResult.DATA_TAG, sysUser);
ajax.put("postIds", postService.selectPostListByUserId(userId)); ajax.put("postIds", postService.selectPostListByUserId(userId));
ajax.put("roleIds", roleService.selectRoleListByUserId(userId)); ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
} }
return ajax; return ajax;
} }

@ -1,127 +1,127 @@
import request from '@/utils/request' import request from '@/utils/request'
import { praseStrEmpty } from "@/utils/ruoyi"; import { parseStrEmpty } from "@/utils/ruoyi";
// 查询用户列表 // 查询用户列表
export function listUser(query) { export function listUser(query) {
return request({ return request({
url: '/system/user/list', url: '/system/user/list',
method: 'get', method: 'get',
params: query params: query
}) })
} }
// 查询用户详细 // 查询用户详细
export function getUser(userId) { export function getUser(userId) {
return request({ return request({
url: '/system/user/' + praseStrEmpty(userId), url: '/system/user/' + parseStrEmpty(userId),
method: 'get' method: 'get'
}) })
} }
// 新增用户 // 新增用户
export function addUser(data) { export function addUser(data) {
return request({ return request({
url: '/system/user', url: '/system/user',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 修改用户 // 修改用户
export function updateUser(data) { export function updateUser(data) {
return request({ return request({
url: '/system/user', url: '/system/user',
method: 'put', method: 'put',
data: data data: data
}) })
} }
// 删除用户 // 删除用户
export function delUser(userId) { export function delUser(userId) {
return request({ return request({
url: '/system/user/' + userId, url: '/system/user/' + userId,
method: 'delete' method: 'delete'
}) })
} }
// 用户密码重置 // 用户密码重置
export function resetUserPwd(userId, password) { export function resetUserPwd(userId, password) {
const data = { const data = {
userId, userId,
password password
} }
return request({ return request({
url: '/system/user/resetPwd', url: '/system/user/resetPwd',
method: 'put', method: 'put',
data: data data: data
}) })
} }
// 用户状态修改 // 用户状态修改
export function changeUserStatus(userId, status) { export function changeUserStatus(userId, status) {
const data = { const data = {
userId, userId,
status status
} }
return request({ return request({
url: '/system/user/changeStatus', url: '/system/user/changeStatus',
method: 'put', method: 'put',
data: data data: data
}) })
} }
// 查询用户个人信息 // 查询用户个人信息
export function getUserProfile() { export function getUserProfile() {
return request({ return request({
url: '/system/user/profile', url: '/system/user/profile',
method: 'get' method: 'get'
}) })
} }
// 修改用户个人信息 // 修改用户个人信息
export function updateUserProfile(data) { export function updateUserProfile(data) {
return request({ return request({
url: '/system/user/profile', url: '/system/user/profile',
method: 'put', method: 'put',
data: data data: data
}) })
} }
// 用户密码重置 // 用户密码重置
export function updateUserPwd(oldPassword, newPassword) { export function updateUserPwd(oldPassword, newPassword) {
const data = { const data = {
oldPassword, oldPassword,
newPassword newPassword
} }
return request({ return request({
url: '/system/user/profile/updatePwd', url: '/system/user/profile/updatePwd',
method: 'put', method: 'put',
params: data params: data
}) })
} }
// 用户头像上传 // 用户头像上传
export function uploadAvatar(data) { export function uploadAvatar(data) {
return request({ return request({
url: '/system/user/profile/avatar', url: '/system/user/profile/avatar',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 查询授权角色 // 查询授权角色
export function getAuthRole(userId) { export function getAuthRole(userId) {
return request({ return request({
url: '/system/user/authRole/' + userId, url: '/system/user/authRole/' + userId,
method: 'get' method: 'get'
}) })
} }
// 保存授权角色 // 保存授权角色
export function updateAuthRole(data) { export function updateAuthRole(data) {
return request({ return request({
url: '/system/user/authRole', url: '/system/user/authRole',
method: 'put', method: 'put',
params: data params: data
}) })
} }

@ -26,7 +26,7 @@
<el-radio v-model='radioValue' :label="4"> <el-radio v-model='radioValue' :label="4">
指定 指定
<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> <el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%">
<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option> <el-option v-for="item in 24" :key="item" :value="item-1">{{item-1}}</el-option>
</el-select> </el-select>
</el-radio> </el-radio>
</el-form-item> </el-form-item>
@ -111,4 +111,4 @@ export default {
} }
} }
} }
</script> </script>

@ -1,67 +1,76 @@
<template> <template>
<el-image :src="`${realSrc}`" fit="cover" :style="`width:${realWidth};height:${realHeight};`" :preview-src-list="[`${realSrc}`]"> <el-image
<div slot="error" class="image-slot"> :src="`${realSrc}`"
<i class="el-icon-picture-outline"></i> fit="cover"
</div> :style="`width:${realWidth};height:${realHeight};`"
</el-image> :preview-src-list="realSrcList"
>
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
</template> </template>
<script> <script>
import { isExternal } from '@/utils/validate'
export default { export default {
name: 'ImagePreview', name: "ImagePreview",
props: { props: {
src: { src: {
type: String, type: String,
required: true required: true
}, },
width: { width: {
type: [Number, String], type: [Number, String],
default: '' default: ""
},
height: {
type: [Number, String],
default: ''
}
}, },
computed: { height: {
realSrc() { type: [Number, String],
if (isExternal(this.src)) { default: ""
return this.src
}
return process.env.VUE_APP_BASE_API + this.src
},
realWidth() {
return typeof this.width == 'string' ? this.width : `${this.width}px`
},
realHeight() {
return typeof this.height == 'string' ? this.height : `${this.height}px`
}
} }
} },
computed: {
realSrc() {
let real_src = this.src.split(",")[0];
return real_src;
},
realSrcList() {
let real_src_list = this.src.split(",");
let srcList = [];
real_src_list.forEach(item => {
return srcList.push(item);
});
return srcList;
},
realWidth() {
return typeof this.width == "string" ? this.width : `${this.width}px`;
},
realHeight() {
return typeof this.height == "string" ? this.height : `${this.height}px`;
}
},
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.el-image { .el-image {
border-radius: 5px; border-radius: 5px;
background-color: #ebeef5; background-color: #ebeef5;
box-shadow: 0 0 5px 1px #ccc; box-shadow: 0 0 5px 1px #ccc;
::v-deep .el-image__inner { ::v-deep .el-image__inner {
transition: all 0.3s; transition: all 0.3s;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
transform: scale(1.2); transform: scale(1.2);
}
}
::v-deep .image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
color: #909399;
font-size: 30px;
} }
}
::v-deep .image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
color: #909399;
font-size: 30px;
}
} }
</style> </style>

@ -4,9 +4,12 @@ import store from '@/store'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode' import errorCode from '@/utils/errorCode'
import { tansParams, blobValidate } from "@/utils/ruoyi"; import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
let downloadLoadingInstance; let downloadLoadingInstance;
// 是否显示重新登录
let isReloginShow;
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例 // 创建axios实例
@ -21,6 +24,8 @@ const service = axios.create({
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
// 是否需要设置 token // 是否需要设置 token
const isToken = (config.headers || {}).isToken === false const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) { if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
} }
@ -31,6 +36,29 @@ service.interceptors.request.use(config => {
config.params = {}; config.params = {};
config.url = url; config.url = url;
} }
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
const requestObj = {
url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
time: new Date().getTime()
}
const sessionObj = cache.session.getJSON('sessionObj')
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
cache.session.setJSON('sessionObj', requestObj)
} else {
const s_url = sessionObj.url; // 请求地址
const s_data = sessionObj.data; // 请求数据
const s_time = sessionObj.time; // 请求时间
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
const message = '数据正在处理,请勿重复提交';
console.warn(`[${s_url}]: ` + message)
return Promise.reject(new Error(message))
} else {
cache.session.setJSON('sessionObj', requestObj)
}
}
}
return config return config
}, error => { }, error => {
console.log(error) console.log(error)
@ -48,16 +76,25 @@ service.interceptors.response.use(res => {
return res.data return res.data
} }
if (code === 401) { if (code === 401) {
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { if (!isReloginShow) {
isReloginShow = true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录', confirmButtonText: '重新登录',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
} }
).then(() => { ).then(() => {
isReloginShow = false;
store.dispatch('LogOut').then(() => { store.dispatch('LogOut').then(() => {
location.href = '/index'; // 如果是登录页面不需要重新加载
if (window.location.hash.indexOf("#/login") != 0) {
location.href = '/index';
}
}) })
}).catch(() => {}); }).catch(() => {
isReloginShow = false;
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。') return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 500) { } else if (code === 500) {
Message({ Message({

@ -1,220 +1,225 @@
/** 
* 通用js方法封装处理
* Copyright (c) 2019 ruoyi /**
*/ * 通用js方法封装处理
* Copyright (c) 2019 ruoyi
// 日期格式化 */
export function parseTime(time, pattern) {
if (arguments.length === 0 || !time) { // 日期格式化
return null export function parseTime(time, pattern) {
} if (arguments.length === 0 || !time) {
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' return null
let date }
if (typeof time === 'object') { const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
date = time let date
} else { if (typeof time === 'object') {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { date = time
time = parseInt(time) } else {
} else if (typeof time === 'string') { if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm),''); time = parseInt(time)
} } else if (typeof time === 'string') {
if ((typeof time === 'number') && (time.toString().length === 10)) { time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
time = time * 1000 }
} if ((typeof time === 'number') && (time.toString().length === 10)) {
date = new Date(time) time = time * 1000
} }
const formatObj = { date = new Date(time)
y: date.getFullYear(), }
m: date.getMonth() + 1, const formatObj = {
d: date.getDate(), y: date.getFullYear(),
h: date.getHours(), m: date.getMonth() + 1,
i: date.getMinutes(), d: date.getDate(),
s: date.getSeconds(), h: date.getHours(),
a: date.getDay() i: date.getMinutes(),
} s: date.getSeconds(),
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { a: date.getDay()
let value = formatObj[key] }
// Note: getDay() returns 0 on Sunday const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } let value = formatObj[key]
if (result.length > 0 && value < 10) { // Note: getDay() returns 0 on Sunday
value = '0' + value if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
} if (result.length > 0 && value < 10) {
return value || 0 value = '0' + value
}) }
return time_str return value || 0
} })
return time_str
// 表单重置 }
export function resetForm(refName) {
if (this.$refs[refName]) { // 表单重置
this.$refs[refName].resetFields(); export function resetForm(refName) {
} if (this.$refs[refName]) {
} this.$refs[refName].resetFields();
}
// 添加日期范围 }
export function addDateRange(params, dateRange, propName) {
let search = params; // 添加日期范围
search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}; export function addDateRange(params, dateRange, propName) {
dateRange = Array.isArray(dateRange) ? dateRange : []; let search = params;
if (typeof (propName) === 'undefined') { search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
search.params['beginTime'] = dateRange[0]; dateRange = Array.isArray(dateRange) ? dateRange : [];
search.params['endTime'] = dateRange[1]; if (typeof (propName) === 'undefined') {
} else { search.params['beginTime'] = dateRange[0];
search.params['begin' + propName] = dateRange[0]; search.params['endTime'] = dateRange[1];
search.params['end' + propName] = dateRange[1]; } else {
} search.params['begin' + propName] = dateRange[0];
return search; search.params['end' + propName] = dateRange[1];
} }
return search;
// 回显数据字典 }
export function selectDictLabel(datas, value) {
var actions = []; // 回显数据字典
Object.keys(datas).some((key) => { export function selectDictLabel(datas, value) {
if (datas[key].value == ('' + value)) { var actions = [];
actions.push(datas[key].label); Object.keys(datas).some((key) => {
return true; if (datas[key].value == ('' + value)) {
} actions.push(datas[key].label);
}) return true;
return actions.join(''); }
} })
return actions.join('');
// 回显数据字典(字符串数组) }
export function selectDictLabels(datas, value, separator) {
var actions = []; // 回显数据字典(字符串数组)
var currentSeparator = undefined === separator ? "," : separator; export function selectDictLabels(datas, value, separator) {
var temp = value.split(currentSeparator); if(value === undefined) {
Object.keys(value.split(currentSeparator)).some((val) => { return "";
Object.keys(datas).some((key) => { }
if (datas[key].value == ('' + temp[val])) { var actions = [];
actions.push(datas[key].label + currentSeparator); var currentSeparator = undefined === separator ? "," : separator;
} var temp = value.split(currentSeparator);
}) Object.keys(value.split(currentSeparator)).some((val) => {
}) Object.keys(datas).some((key) => {
return actions.join('').substring(0, actions.join('').length - 1); if (datas[key].value == ('' + temp[val])) {
} actions.push(datas[key].label + currentSeparator);
}
// 字符串格式化(%s ) })
export function sprintf(str) { })
var args = arguments, flag = true, i = 1; return actions.join('').substring(0, actions.join('').length - 1);
str = str.replace(/%s/g, function () { }
var arg = args[i++];
if (typeof arg === 'undefined') { // 字符串格式化(%s )
flag = false; export function sprintf(str) {
return ''; var args = arguments, flag = true, i = 1;
} str = str.replace(/%s/g, function () {
return arg; var arg = args[i++];
}); if (typeof arg === 'undefined') {
return flag ? str : ''; flag = false;
} return '';
}
// 转换字符串undefined,null等转化为"" return arg;
export function praseStrEmpty(str) { });
if (!str || str == "undefined" || str == "null") { return flag ? str : '';
return ""; }
}
return str; // 转换字符串undefined,null等转化为""
} export function parseStrEmpty(str) {
if (!str || str == "undefined" || str == "null") {
// 数据合并 return "";
export function mergeRecursive(source, target) { }
for (var p in target) { return str;
try { }
if (target[p].constructor == Object) {
source[p] = mergeRecursive(source[p], target[p]); // 数据合并
} else { export function mergeRecursive(source, target) {
source[p] = target[p]; for (var p in target) {
} try {
} catch(e) { if (target[p].constructor == Object) {
source[p] = target[p]; source[p] = mergeRecursive(source[p], target[p]);
} } else {
} source[p] = target[p];
return source; }
}; } catch (e) {
source[p] = target[p];
/** }
* 构造树型结构数据 }
* @param {*} data 数据源 return source;
* @param {*} id id字段 默认 'id' };
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children' /**
*/ * 构造树型结构数据
export function handleTree(data, id, parentId, children) { * @param {*} data 数据源
let config = { * @param {*} id id字段 默认 'id'
id: id || 'id', * @param {*} parentId 父节点字段 默认 'parentId'
parentId: parentId || 'parentId', * @param {*} children 孩子节点字段 默认 'children'
childrenList: children || 'children' */
}; export function handleTree(data, id, parentId, children) {
let config = {
var childrenListMap = {}; id: id || 'id',
var nodeIds = {}; parentId: parentId || 'parentId',
var tree = []; childrenList: children || 'children'
};
for (let d of data) {
let parentId = d[config.parentId]; var childrenListMap = {};
if (childrenListMap[parentId] == null) { var nodeIds = {};
childrenListMap[parentId] = []; var tree = [];
}
nodeIds[d[config.id]] = d; for (let d of data) {
childrenListMap[parentId].push(d); let parentId = d[config.parentId];
} if (childrenListMap[parentId] == null) {
childrenListMap[parentId] = [];
for (let d of data) { }
let parentId = d[config.parentId]; nodeIds[d[config.id]] = d;
if (nodeIds[parentId] == null) { childrenListMap[parentId].push(d);
tree.push(d); }
}
} for (let d of data) {
let parentId = d[config.parentId];
for (let t of tree) { if (nodeIds[parentId] == null) {
adaptToChildrenList(t); tree.push(d);
} }
}
function adaptToChildrenList(o) {
if (childrenListMap[o[config.id]] !== null) { for (let t of tree) {
o[config.childrenList] = childrenListMap[o[config.id]]; adaptToChildrenList(t);
} }
if (o[config.childrenList]) {
for (let c of o[config.childrenList]) { function adaptToChildrenList(o) {
adaptToChildrenList(c); if (childrenListMap[o[config.id]] !== null) {
} o[config.childrenList] = childrenListMap[o[config.id]];
} }
} if (o[config.childrenList]) {
return tree; for (let c of o[config.childrenList]) {
} adaptToChildrenList(c);
}
/** }
* 参数处理 }
* @param {*} params 参数 return tree;
*/ }
export function tansParams(params) {
let result = '' /**
for (const propName of Object.keys(params)) { * 参数处理
const value = params[propName]; * @param {*} params 参数
var part = encodeURIComponent(propName) + "="; */
if (value !== null && typeof (value) !== "undefined") { export function tansParams(params) {
if (typeof value === 'object') { let result = ''
for (const key of Object.keys(value)) { for (const propName of Object.keys(params)) {
if (value[key] !== null && typeof (value[key]) !== 'undefined') { const value = params[propName];
let params = propName + '[' + key + ']'; var part = encodeURIComponent(propName) + "=";
var subPart = encodeURIComponent(params) + "="; if (value !== null && typeof (value) !== "undefined") {
result += subPart + encodeURIComponent(value[key]) + "&"; if (typeof value === 'object') {
} for (const key of Object.keys(value)) {
} if (value[key] !== null && typeof (value[key]) !== 'undefined') {
} else { let params = propName + '[' + key + ']';
result += part + encodeURIComponent(value) + "&"; var subPart = encodeURIComponent(params) + "=";
} result += subPart + encodeURIComponent(value[key]) + "&";
} }
} }
return result } else {
} result += part + encodeURIComponent(value) + "&";
}
// 验证是否为blob格式 }
export async function blobValidate(data) { }
try { return result
const text = await data.text(); }
JSON.parse(text);
return false; // 验证是否为blob格式
} catch (error) { export async function blobValidate(data) {
return true; try {
} const text = await data.text();
} JSON.parse(text);
return false;
} catch (error) {
return true;
}
}

@ -495,7 +495,7 @@ export default {
// //
handleNodeClick(data) { handleNodeClick(data) {
this.queryParams.deptId = data.id; this.queryParams.deptId = data.id;
this.getList(); this.handleQuery();
}, },
// //
handleStatusChange(row) { handleStatusChange(row) {

@ -33,6 +33,7 @@
<el-option label="Double" value="Double" /> <el-option label="Double" value="Double" />
<el-option label="BigDecimal" value="BigDecimal" /> <el-option label="BigDecimal" value="BigDecimal" />
<el-option label="Date" value="Date" /> <el-option label="Date" value="Date" />
<el-option label="Boolean" value="Boolean" />
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>

Loading…
Cancel
Save