Merge branch 'master' of gitee.com:y_project/RuoYi-Vue
This commit is contained in:
commit
c5a903eb8c
3
.gitignore
vendored
3
.gitignore
vendored
@ -25,6 +25,9 @@ target/
|
|||||||
*.iml
|
*.iml
|
||||||
*.ipr
|
*.ipr
|
||||||
|
|
||||||
|
### JRebel ###
|
||||||
|
rebel.xml
|
||||||
|
|
||||||
### NetBeans ###
|
### NetBeans ###
|
||||||
nbproject/private/
|
nbproject/private/
|
||||||
build/*
|
build/*
|
||||||
|
8
pom.xml
8
pom.xml
@ -22,10 +22,10 @@
|
|||||||
<bitwalker.version>1.21</bitwalker.version>
|
<bitwalker.version>1.21</bitwalker.version>
|
||||||
<swagger.version>3.0.0</swagger.version>
|
<swagger.version>3.0.0</swagger.version>
|
||||||
<kaptcha.version>2.3.2</kaptcha.version>
|
<kaptcha.version>2.3.2</kaptcha.version>
|
||||||
<mybatis-spring-boot.version>2.2.0</mybatis-spring-boot.version>
|
<mybatis-spring-boot.version>2.2.2</mybatis-spring-boot.version>
|
||||||
<pagehelper.boot.version>1.4.0</pagehelper.boot.version>
|
<pagehelper.boot.version>1.4.1</pagehelper.boot.version>
|
||||||
<fastjson.version>1.2.79</fastjson.version>
|
<fastjson.version>1.2.79</fastjson.version>
|
||||||
<oshi.version>5.8.6</oshi.version>
|
<oshi.version>6.1.2</oshi.version>
|
||||||
<jna.version>5.10.0</jna.version>
|
<jna.version>5.10.0</jna.version>
|
||||||
<commons.io.version>2.11.0</commons.io.version>
|
<commons.io.version>2.11.0</commons.io.version>
|
||||||
<commons.fileupload.version>1.4</commons.fileupload.version>
|
<commons.fileupload.version>1.4</commons.fileupload.version>
|
||||||
@ -43,7 +43,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-dependencies</artifactId>
|
<artifactId>spring-boot-dependencies</artifactId>
|
||||||
<version>2.5.9</version>
|
<version>2.5.10</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.ruoyi.web.controller.common;
|
package com.ruoyi.web.controller.common;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -8,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import com.ruoyi.common.config.RuoYiConfig;
|
import com.ruoyi.common.config.RuoYiConfig;
|
||||||
@ -24,6 +27,7 @@ import com.ruoyi.framework.config.ServerConfig;
|
|||||||
* @author ruoyi
|
* @author ruoyi
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/common")
|
||||||
public class CommonController
|
public class CommonController
|
||||||
{
|
{
|
||||||
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
|
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
|
||||||
@ -31,13 +35,15 @@ public class CommonController
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ServerConfig serverConfig;
|
private ServerConfig serverConfig;
|
||||||
|
|
||||||
|
private static final String FILE_DELIMETER = ",";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用下载请求
|
* 通用下载请求
|
||||||
*
|
*
|
||||||
* @param fileName 文件名称
|
* @param fileName 文件名称
|
||||||
* @param delete 是否删除
|
* @param delete 是否删除
|
||||||
*/
|
*/
|
||||||
@GetMapping("common/download")
|
@GetMapping("/download")
|
||||||
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
|
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -64,9 +70,9 @@ public class CommonController
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用上传请求
|
* 通用上传请求(单个)
|
||||||
*/
|
*/
|
||||||
@PostMapping("/common/upload")
|
@PostMapping("/upload")
|
||||||
public AjaxResult uploadFile(MultipartFile file) throws Exception
|
public AjaxResult uploadFile(MultipartFile file) throws Exception
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -77,8 +83,47 @@ public class CommonController
|
|||||||
String fileName = FileUploadUtils.upload(filePath, file);
|
String fileName = FileUploadUtils.upload(filePath, file);
|
||||||
String url = serverConfig.getUrl() + fileName;
|
String url = serverConfig.getUrl() + fileName;
|
||||||
AjaxResult ajax = AjaxResult.success();
|
AjaxResult ajax = AjaxResult.success();
|
||||||
ajax.put("fileName", fileName);
|
|
||||||
ajax.put("url", url);
|
ajax.put("url", url);
|
||||||
|
ajax.put("fileName", fileName);
|
||||||
|
ajax.put("newFileName", FileUtils.getName(fileName));
|
||||||
|
ajax.put("originalFilename", file.getOriginalFilename());
|
||||||
|
return ajax;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return AjaxResult.error(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用上传请求(多个)
|
||||||
|
*/
|
||||||
|
@PostMapping("/uploads")
|
||||||
|
public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 上传文件路径
|
||||||
|
String filePath = RuoYiConfig.getUploadPath();
|
||||||
|
List<String> urls = new ArrayList<String>();
|
||||||
|
List<String> fileNames = new ArrayList<String>();
|
||||||
|
List<String> newFileNames = new ArrayList<String>();
|
||||||
|
List<String> originalFilenames = new ArrayList<String>();
|
||||||
|
for (MultipartFile file : files)
|
||||||
|
{
|
||||||
|
// 上传并返回新文件名称
|
||||||
|
String fileName = FileUploadUtils.upload(filePath, file);
|
||||||
|
String url = serverConfig.getUrl() + fileName;
|
||||||
|
urls.add(url);
|
||||||
|
fileNames.add(fileName);
|
||||||
|
newFileNames.add(FileUtils.getName(fileName));
|
||||||
|
originalFilenames.add(file.getOriginalFilename());
|
||||||
|
}
|
||||||
|
AjaxResult ajax = AjaxResult.success();
|
||||||
|
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
|
||||||
|
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
|
||||||
|
ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
|
||||||
|
ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
|
||||||
return ajax;
|
return ajax;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@ -90,7 +135,7 @@ public class CommonController
|
|||||||
/**
|
/**
|
||||||
* 本地资源通用下载
|
* 本地资源通用下载
|
||||||
*/
|
*/
|
||||||
@GetMapping("/common/download/resource")
|
@GetMapping("/download/resource")
|
||||||
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
|
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
|
@ -109,6 +109,9 @@ public class GenConstants
|
|||||||
/** 模糊查询 */
|
/** 模糊查询 */
|
||||||
public static final String QUERY_LIKE = "LIKE";
|
public static final String QUERY_LIKE = "LIKE";
|
||||||
|
|
||||||
|
/** 相等查询 */
|
||||||
|
public static final String QUERY_EQ = "EQ";
|
||||||
|
|
||||||
/** 需要 */
|
/** 需要 */
|
||||||
public static final String REQUIRE = "1";
|
public static final String REQUIRE = "1";
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ public class LoginBody
|
|||||||
/**
|
/**
|
||||||
* 唯一标识
|
* 唯一标识
|
||||||
*/
|
*/
|
||||||
private String uuid = "";
|
private String uuid;
|
||||||
|
|
||||||
public String getUsername()
|
public String getUsername()
|
||||||
{
|
{
|
||||||
|
@ -3,6 +3,11 @@ package com.ruoyi.common.utils;
|
|||||||
import java.lang.management.ManagementFactory;
|
import java.lang.management.ManagementFactory;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import org.apache.commons.lang3.time.DateFormatUtils;
|
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||||
|
|
||||||
@ -22,7 +27,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
|
|||||||
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
|
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
|
||||||
|
|
||||||
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
|
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
|
||||||
private static String[] parsePatterns = {
|
private static String[] parsePatterns = {
|
||||||
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
|
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
|
||||||
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
|
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
|
||||||
@ -121,7 +126,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取服务器启动时间
|
* 获取服务器启动时间
|
||||||
*/
|
*/
|
||||||
@ -131,6 +136,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
|
|||||||
return new Date(time);
|
return new Date(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算相差天数
|
||||||
|
*/
|
||||||
|
public static int differentDaysByMillisecond(Date date1, Date date2)
|
||||||
|
{
|
||||||
|
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算两个时间差
|
* 计算两个时间差
|
||||||
*/
|
*/
|
||||||
@ -152,4 +165,23 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
|
|||||||
// long sec = diff % nd % nh % nm / ns;
|
// long sec = diff % nd % nh % nm / ns;
|
||||||
return day + "天" + hour + "小时" + min + "分钟";
|
return day + "天" + hour + "小时" + min + "分钟";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加 LocalDateTime ==> Date
|
||||||
|
*/
|
||||||
|
public static Date toDate(LocalDateTime temporalAccessor)
|
||||||
|
{
|
||||||
|
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
|
||||||
|
return Date.from(zdt.toInstant());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加 LocalDate ==> Date
|
||||||
|
*/
|
||||||
|
public static Date toDate(LocalDate temporalAccessor)
|
||||||
|
{
|
||||||
|
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
|
||||||
|
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
|
||||||
|
return Date.from(zdt.toInstant());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,8 +41,7 @@ public class DictUtils
|
|||||||
Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
|
Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
|
||||||
if (StringUtils.isNotNull(cacheObj))
|
if (StringUtils.isNotNull(cacheObj))
|
||||||
{
|
{
|
||||||
List<SysDictData> dictDatas = StringUtils.cast(cacheObj);
|
return StringUtils.cast(cacheObj);
|
||||||
return dictDatas;
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -92,7 +91,7 @@ public class DictUtils
|
|||||||
{
|
{
|
||||||
if (value.equals(dict.getDictValue()))
|
if (value.equals(dict.getDictValue()))
|
||||||
{
|
{
|
||||||
propertyString.append(dict.getDictLabel() + separator);
|
propertyString.append(dict.getDictLabel()).append(separator);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -132,7 +131,7 @@ public class DictUtils
|
|||||||
{
|
{
|
||||||
if (label.equals(dict.getDictLabel()))
|
if (label.equals(dict.getDictLabel()))
|
||||||
{
|
{
|
||||||
propertyString.append(dict.getDictValue() + separator);
|
propertyString.append(dict.getDictValue()).append(separator);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,7 @@ public class ExceptionUtil
|
|||||||
{
|
{
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
e.printStackTrace(new PrintWriter(sw, true));
|
e.printStackTrace(new PrintWriter(sw, true));
|
||||||
String str = sw.toString();
|
return sw.toString();
|
||||||
return str;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getRootErrorMessage(Exception e)
|
public static String getRootErrorMessage(Exception e)
|
||||||
|
@ -99,9 +99,8 @@ public class ServletUtils
|
|||||||
*
|
*
|
||||||
* @param response 渲染对象
|
* @param response 渲染对象
|
||||||
* @param string 待渲染的字符串
|
* @param string 待渲染的字符串
|
||||||
* @return null
|
|
||||||
*/
|
*/
|
||||||
public static String renderString(HttpServletResponse response, String string)
|
public static void renderString(HttpServletResponse response, String string)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -114,7 +113,6 @@ public class ServletUtils
|
|||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -125,13 +123,13 @@ public class ServletUtils
|
|||||||
public static boolean isAjaxRequest(HttpServletRequest request)
|
public static boolean isAjaxRequest(HttpServletRequest request)
|
||||||
{
|
{
|
||||||
String accept = request.getHeader("accept");
|
String accept = request.getHeader("accept");
|
||||||
if (accept != null && accept.indexOf("application/json") != -1)
|
if (accept != null && accept.contains("application/json"))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String xRequestedWith = request.getHeader("X-Requested-With");
|
String xRequestedWith = request.getHeader("X-Requested-With");
|
||||||
if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
|
if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest"))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -143,10 +141,6 @@ public class ServletUtils
|
|||||||
}
|
}
|
||||||
|
|
||||||
String ajax = request.getParameter("__ajax");
|
String ajax = request.getParameter("__ajax");
|
||||||
if (StringUtils.inStringIgnoreCase(ajax, "json", "xml"))
|
return StringUtils.inStringIgnoreCase(ajax, "json", "xml");
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -531,4 +531,53 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
|
|||||||
{
|
{
|
||||||
return (T) obj;
|
return (T) obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。
|
||||||
|
*
|
||||||
|
* @param num 数字对象
|
||||||
|
* @param size 字符串指定长度
|
||||||
|
* @return 返回数字的字符串格式,该字符串为指定长度。
|
||||||
|
*/
|
||||||
|
public static final String padl(final Number num, final int size)
|
||||||
|
{
|
||||||
|
return padl(num.toString(), size, '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。
|
||||||
|
*
|
||||||
|
* @param s 原始字符串
|
||||||
|
* @param size 字符串指定长度
|
||||||
|
* @param c 用于补齐的字符
|
||||||
|
* @return 返回指定长度的字符串,由原字符串左补齐或截取得到。
|
||||||
|
*/
|
||||||
|
public static final String padl(final String s, final int size, final char c)
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder(size);
|
||||||
|
if (s != null)
|
||||||
|
{
|
||||||
|
final int len = s.length();
|
||||||
|
if (s.length() <= size)
|
||||||
|
{
|
||||||
|
for (int i = size - len; i > 0; i--)
|
||||||
|
{
|
||||||
|
sb.append(c);
|
||||||
|
}
|
||||||
|
sb.append(s);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return s.substring(len - size, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = size; i > 0; i--)
|
||||||
|
{
|
||||||
|
sb.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,228 +0,0 @@
|
|||||||
package com.ruoyi.common.utils;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Font;
|
|
||||||
import java.awt.Graphics;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.RenderingHints;
|
|
||||||
import java.awt.geom.AffineTransform;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Random;
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 验证码工具类
|
|
||||||
*
|
|
||||||
* @author ruoyi
|
|
||||||
*/
|
|
||||||
public class VerifyCodeUtils
|
|
||||||
{
|
|
||||||
// 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
|
|
||||||
public static final String VERIFY_CODES = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
|
|
||||||
|
|
||||||
private static Random random = new SecureRandom();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 使用系统默认字符源生成验证码
|
|
||||||
*
|
|
||||||
* @param verifySize 验证码长度
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static String generateVerifyCode(int verifySize)
|
|
||||||
{
|
|
||||||
return generateVerifyCode(verifySize, VERIFY_CODES);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 使用指定源生成验证码
|
|
||||||
*
|
|
||||||
* @param verifySize 验证码长度
|
|
||||||
* @param sources 验证码字符源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static String generateVerifyCode(int verifySize, String sources)
|
|
||||||
{
|
|
||||||
if (sources == null || sources.length() == 0)
|
|
||||||
{
|
|
||||||
sources = VERIFY_CODES;
|
|
||||||
}
|
|
||||||
int codesLen = sources.length();
|
|
||||||
Random rand = new Random(System.currentTimeMillis());
|
|
||||||
StringBuilder verifyCode = new StringBuilder(verifySize);
|
|
||||||
for (int i = 0; i < verifySize; i++)
|
|
||||||
{
|
|
||||||
verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
|
|
||||||
}
|
|
||||||
return verifyCode.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 输出指定验证码图片流
|
|
||||||
*
|
|
||||||
* @param w
|
|
||||||
* @param h
|
|
||||||
* @param os
|
|
||||||
* @param code
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public static void outputImage(int w, int h, OutputStream os, String code) throws IOException
|
|
||||||
{
|
|
||||||
int verifySize = code.length();
|
|
||||||
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
|
|
||||||
Random rand = new Random();
|
|
||||||
Graphics2D g2 = image.createGraphics();
|
|
||||||
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
|
||||||
Color[] colors = new Color[5];
|
|
||||||
Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA,
|
|
||||||
Color.ORANGE, Color.PINK, Color.YELLOW };
|
|
||||||
float[] fractions = new float[colors.length];
|
|
||||||
for (int i = 0; i < colors.length; i++)
|
|
||||||
{
|
|
||||||
colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
|
|
||||||
fractions[i] = rand.nextFloat();
|
|
||||||
}
|
|
||||||
Arrays.sort(fractions);
|
|
||||||
|
|
||||||
g2.setColor(Color.GRAY);// 设置边框色
|
|
||||||
g2.fillRect(0, 0, w, h);
|
|
||||||
|
|
||||||
Color c = getRandColor(200, 250);
|
|
||||||
g2.setColor(c);// 设置背景色
|
|
||||||
g2.fillRect(0, 2, w, h - 4);
|
|
||||||
|
|
||||||
// 绘制干扰线
|
|
||||||
Random random = new Random();
|
|
||||||
g2.setColor(getRandColor(160, 200));// 设置线条的颜色
|
|
||||||
for (int i = 0; i < 20; i++)
|
|
||||||
{
|
|
||||||
int x = random.nextInt(w - 1);
|
|
||||||
int y = random.nextInt(h - 1);
|
|
||||||
int xl = random.nextInt(6) + 1;
|
|
||||||
int yl = random.nextInt(12) + 1;
|
|
||||||
g2.drawLine(x, y, x + xl + 40, y + yl + 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加噪点
|
|
||||||
float yawpRate = 0.05f;// 噪声率
|
|
||||||
int area = (int) (yawpRate * w * h);
|
|
||||||
for (int i = 0; i < area; i++)
|
|
||||||
{
|
|
||||||
int x = random.nextInt(w);
|
|
||||||
int y = random.nextInt(h);
|
|
||||||
int rgb = getRandomIntColor();
|
|
||||||
image.setRGB(x, y, rgb);
|
|
||||||
}
|
|
||||||
|
|
||||||
shear(g2, w, h, c);// 使图片扭曲
|
|
||||||
|
|
||||||
g2.setColor(getRandColor(100, 160));
|
|
||||||
int fontSize = h - 4;
|
|
||||||
Font font = new Font("Algerian", Font.ITALIC, fontSize);
|
|
||||||
g2.setFont(font);
|
|
||||||
char[] chars = code.toCharArray();
|
|
||||||
for (int i = 0; i < verifySize; i++)
|
|
||||||
{
|
|
||||||
AffineTransform affine = new AffineTransform();
|
|
||||||
affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1),
|
|
||||||
(w / verifySize) * i + fontSize / 2, h / 2);
|
|
||||||
g2.setTransform(affine);
|
|
||||||
g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
g2.dispose();
|
|
||||||
ImageIO.write(image, "jpg", os);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Color getRandColor(int fc, int bc)
|
|
||||||
{
|
|
||||||
if (fc > 255) {
|
|
||||||
fc = 255;
|
|
||||||
}
|
|
||||||
if (bc > 255) {
|
|
||||||
bc = 255;
|
|
||||||
}
|
|
||||||
int r = fc + random.nextInt(bc - fc);
|
|
||||||
int g = fc + random.nextInt(bc - fc);
|
|
||||||
int b = fc + random.nextInt(bc - fc);
|
|
||||||
return new Color(r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getRandomIntColor()
|
|
||||||
{
|
|
||||||
int[] rgb = getRandomRgb();
|
|
||||||
int color = 0;
|
|
||||||
for (int c : rgb)
|
|
||||||
{
|
|
||||||
color = color << 8;
|
|
||||||
color = color | c;
|
|
||||||
}
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int[] getRandomRgb()
|
|
||||||
{
|
|
||||||
int[] rgb = new int[3];
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
rgb[i] = random.nextInt(255);
|
|
||||||
}
|
|
||||||
return rgb;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void shear(Graphics g, int w1, int h1, Color color)
|
|
||||||
{
|
|
||||||
shearX(g, w1, h1, color);
|
|
||||||
shearY(g, w1, h1, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void shearX(Graphics g, int w1, int h1, Color color)
|
|
||||||
{
|
|
||||||
|
|
||||||
int period = random.nextInt(2);
|
|
||||||
|
|
||||||
boolean borderGap = true;
|
|
||||||
int frames = 1;
|
|
||||||
int phase = random.nextInt(2);
|
|
||||||
|
|
||||||
for (int i = 0; i < h1; i++)
|
|
||||||
{
|
|
||||||
double d = (double) (period >> 1)
|
|
||||||
* Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
|
|
||||||
g.copyArea(0, i, w1, 1, (int) d, 0);
|
|
||||||
if (borderGap)
|
|
||||||
{
|
|
||||||
g.setColor(color);
|
|
||||||
g.drawLine((int) d, i, 0, i);
|
|
||||||
g.drawLine((int) d + w1, i, w1, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void shearY(Graphics g, int w1, int h1, Color color)
|
|
||||||
{
|
|
||||||
|
|
||||||
int period = random.nextInt(40) + 10; // 50;
|
|
||||||
|
|
||||||
boolean borderGap = true;
|
|
||||||
int frames = 20;
|
|
||||||
int phase = 7;
|
|
||||||
for (int i = 0; i < w1; i++)
|
|
||||||
{
|
|
||||||
double d = (double) (period >> 1)
|
|
||||||
* Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
|
|
||||||
g.copyArea(i, 0, 1, h1, 0, (int) d);
|
|
||||||
if (borderGap)
|
|
||||||
{
|
|
||||||
g.setColor(color);
|
|
||||||
g.drawLine(i, (int) d, i, 0);
|
|
||||||
g.drawLine(i, (int) d + h1, i, h1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,6 +2,8 @@ package com.ruoyi.common.utils.file;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Objects;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import com.ruoyi.common.config.RuoYiConfig;
|
import com.ruoyi.common.config.RuoYiConfig;
|
||||||
@ -11,7 +13,7 @@ import com.ruoyi.common.exception.file.FileSizeLimitExceededException;
|
|||||||
import com.ruoyi.common.exception.file.InvalidExtensionException;
|
import com.ruoyi.common.exception.file.InvalidExtensionException;
|
||||||
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import com.ruoyi.common.utils.uuid.IdUtils;
|
import com.ruoyi.common.utils.uuid.Seq;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件上传工具类
|
* 文件上传工具类
|
||||||
@ -100,7 +102,7 @@ public class FileUploadUtils
|
|||||||
throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
|
throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
|
||||||
InvalidExtensionException
|
InvalidExtensionException
|
||||||
{
|
{
|
||||||
int fileNamelength = file.getOriginalFilename().length();
|
int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
|
||||||
if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
|
if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
|
||||||
{
|
{
|
||||||
throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
|
throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
|
||||||
@ -110,10 +112,9 @@ public class FileUploadUtils
|
|||||||
|
|
||||||
String fileName = extractFilename(file);
|
String fileName = extractFilename(file);
|
||||||
|
|
||||||
File desc = getAbsoluteFile(baseDir, fileName);
|
String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
|
||||||
file.transferTo(desc);
|
file.transferTo(Paths.get(absPath));
|
||||||
String pathFileName = getPathFileName(baseDir, fileName);
|
return getPathFileName(baseDir, fileName);
|
||||||
return pathFileName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -121,10 +122,8 @@ public class FileUploadUtils
|
|||||||
*/
|
*/
|
||||||
public static final String extractFilename(MultipartFile file)
|
public static final String extractFilename(MultipartFile file)
|
||||||
{
|
{
|
||||||
String fileName = file.getOriginalFilename();
|
return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
|
||||||
String extension = getExtension(file);
|
FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
|
||||||
fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
|
|
||||||
return fileName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
|
public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
|
||||||
@ -145,8 +144,7 @@ public class FileUploadUtils
|
|||||||
{
|
{
|
||||||
int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
|
int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
|
||||||
String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
|
String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
|
||||||
String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
|
return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
|
||||||
return pathFileName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -161,7 +159,7 @@ public class FileUploadUtils
|
|||||||
throws FileSizeLimitExceededException, InvalidExtensionException
|
throws FileSizeLimitExceededException, InvalidExtensionException
|
||||||
{
|
{
|
||||||
long size = file.getSize();
|
long size = file.getSize();
|
||||||
if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
|
if (size > DEFAULT_MAX_SIZE)
|
||||||
{
|
{
|
||||||
throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
|
throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
|
||||||
}
|
}
|
||||||
@ -228,7 +226,7 @@ public class FileUploadUtils
|
|||||||
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
|
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
|
||||||
if (StringUtils.isEmpty(extension))
|
if (StringUtils.isEmpty(extension))
|
||||||
{
|
{
|
||||||
extension = MimeTypeUtils.getExtension(file.getContentType());
|
extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
|
||||||
}
|
}
|
||||||
return extension;
|
return extension;
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,6 @@ public class FileUtils
|
|||||||
*
|
*
|
||||||
* @param response 响应对象
|
* @param response 响应对象
|
||||||
* @param realFileName 真实文件名
|
* @param realFileName 真实文件名
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
|
public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
|
||||||
{
|
{
|
||||||
@ -210,7 +209,6 @@ public class FileUtils
|
|||||||
.append("utf-8''")
|
.append("utf-8''")
|
||||||
.append(percentEncodedFileName);
|
.append(percentEncodedFileName);
|
||||||
|
|
||||||
response.addHeader("Access-Control-Allow-Origin", "*");
|
|
||||||
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
|
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
|
||||||
response.setHeader("Content-disposition", contentDispositionValue.toString());
|
response.setHeader("Content-disposition", contentDispositionValue.toString());
|
||||||
response.setHeader("download-filename", percentEncodedFileName);
|
response.setHeader("download-filename", percentEncodedFileName);
|
||||||
@ -256,4 +254,22 @@ public class FileUtils
|
|||||||
}
|
}
|
||||||
return strFileExtendName;
|
return strFileExtendName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取名称
|
||||||
|
*
|
||||||
|
* @param fileName 路径名称
|
||||||
|
* @return 没有文件路径的名称
|
||||||
|
*/
|
||||||
|
public static String getName(String fileName)
|
||||||
|
{
|
||||||
|
if (fileName == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int lastUnixPos = fileName.lastIndexOf('/');
|
||||||
|
int lastWindowsPos = fileName.lastIndexOf('\\');
|
||||||
|
int index = Math.max(lastUnixPos, lastWindowsPos);
|
||||||
|
return fileName.substring(index + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.ruoyi.common.utils.file;
|
package com.ruoyi.common.utils.file;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@ -59,13 +58,12 @@ public class ImageUtils
|
|||||||
/**
|
/**
|
||||||
* 读取文件为字节数据
|
* 读取文件为字节数据
|
||||||
*
|
*
|
||||||
* @param key 地址
|
* @param url 地址
|
||||||
* @return 字节数据
|
* @return 字节数据
|
||||||
*/
|
*/
|
||||||
public static byte[] readFile(String url)
|
public static byte[] readFile(String url)
|
||||||
{
|
{
|
||||||
InputStream in = null;
|
InputStream in = null;
|
||||||
ByteArrayOutputStream baos = null;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (url.startsWith("http"))
|
if (url.startsWith("http"))
|
||||||
@ -95,7 +93,6 @@ public class ImageUtils
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
IOUtils.closeQuietly(in);
|
IOUtils.closeQuietly(in);
|
||||||
IOUtils.closeQuietly(baos);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import java.io.BufferedReader;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.StandardCharsets;
|
||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -25,7 +25,7 @@ public class HttpHelper
|
|||||||
BufferedReader reader = null;
|
BufferedReader reader = null;
|
||||||
try (InputStream inputStream = request.getInputStream())
|
try (InputStream inputStream = request.getInputStream())
|
||||||
{
|
{
|
||||||
reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
|
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
|
||||||
String line = "";
|
String line = "";
|
||||||
while ((line = reader.readLine()) != null)
|
while ((line = reader.readLine()) != null)
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,7 @@ import java.net.ConnectException;
|
|||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.HostnameVerifier;
|
||||||
import javax.net.ssl.HttpsURLConnection;
|
import javax.net.ssl.HttpsURLConnection;
|
||||||
@ -130,9 +131,8 @@ public class HttpUtils
|
|||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
String urlNameString = url;
|
log.info("sendPost - {}", url);
|
||||||
log.info("sendPost - {}", urlNameString);
|
URL realUrl = new URL(url);
|
||||||
URL realUrl = new URL(urlNameString);
|
|
||||||
URLConnection conn = realUrl.openConnection();
|
URLConnection conn = realUrl.openConnection();
|
||||||
conn.setRequestProperty("accept", "*/*");
|
conn.setRequestProperty("accept", "*/*");
|
||||||
conn.setRequestProperty("connection", "Keep-Alive");
|
conn.setRequestProperty("connection", "Keep-Alive");
|
||||||
@ -144,7 +144,7 @@ public class HttpUtils
|
|||||||
out = new PrintWriter(conn.getOutputStream());
|
out = new PrintWriter(conn.getOutputStream());
|
||||||
out.print(param);
|
out.print(param);
|
||||||
out.flush();
|
out.flush();
|
||||||
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
|
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
|
||||||
String line;
|
String line;
|
||||||
while ((line = in.readLine()) != null)
|
while ((line = in.readLine()) != null)
|
||||||
{
|
{
|
||||||
@ -218,7 +218,7 @@ public class HttpUtils
|
|||||||
{
|
{
|
||||||
if (ret != null && !"".equals(ret.trim()))
|
if (ret != null && !"".equals(ret.trim()))
|
||||||
{
|
{
|
||||||
result.append(new String(ret.getBytes("ISO-8859-1"), "utf-8"));
|
result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.info("recv - {}", result);
|
log.info("recv - {}", result);
|
||||||
|
@ -25,7 +25,6 @@ public class AddressUtils
|
|||||||
|
|
||||||
public static String getRealAddressByIP(String ip)
|
public static String getRealAddressByIP(String ip)
|
||||||
{
|
{
|
||||||
String address = UNKNOWN;
|
|
||||||
// 内网不查询
|
// 内网不查询
|
||||||
if (IpUtils.internalIp(ip))
|
if (IpUtils.internalIp(ip))
|
||||||
{
|
{
|
||||||
@ -51,6 +50,6 @@ public class AddressUtils
|
|||||||
log.error("获取地理位置异常 {}", ip);
|
log.error("获取地理位置异常 {}", ip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return address;
|
return UNKNOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,8 @@ import java.lang.reflect.Field;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
@ -88,7 +90,6 @@ public class ExcelUtil<T>
|
|||||||
|
|
||||||
public static final String[] FORMULA_STR = { "=", "-", "+", "@" };
|
public static final String[] FORMULA_STR = { "=", "-", "+", "@" };
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Excel sheet最大行数,默认65536
|
* Excel sheet最大行数,默认65536
|
||||||
*/
|
*/
|
||||||
@ -133,7 +134,7 @@ public class ExcelUtil<T>
|
|||||||
* 当前行号
|
* 当前行号
|
||||||
*/
|
*/
|
||||||
private int rownum;
|
private int rownum;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 标题
|
* 标题
|
||||||
*/
|
*/
|
||||||
@ -315,7 +316,7 @@ public class ExcelUtil<T>
|
|||||||
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
|
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
|
||||||
if (StringUtils.isNotEmpty(dateFormat))
|
if (StringUtils.isNotEmpty(dateFormat))
|
||||||
{
|
{
|
||||||
val = DateUtils.parseDateToStr(dateFormat, (Date) val);
|
val = parseDateToStr(dateFormat, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -327,7 +328,7 @@ public class ExcelUtil<T>
|
|||||||
{
|
{
|
||||||
val = Convert.toInt(val);
|
val = Convert.toInt(val);
|
||||||
}
|
}
|
||||||
else if (Long.TYPE == fieldType || Long.class == fieldType)
|
else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val)))
|
||||||
{
|
{
|
||||||
val = Convert.toLong(val);
|
val = Convert.toLong(val);
|
||||||
}
|
}
|
||||||
@ -410,7 +411,7 @@ public class ExcelUtil<T>
|
|||||||
{
|
{
|
||||||
return exportExcel(list, sheetName, StringUtils.EMPTY);
|
return exportExcel(list, sheetName, StringUtils.EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对list数据源将其里面的数据导入到excel表单
|
* 对list数据源将其里面的数据导入到excel表单
|
||||||
*
|
*
|
||||||
@ -432,7 +433,6 @@ public class ExcelUtil<T>
|
|||||||
* @param list 导出数据集合
|
* @param list 导出数据集合
|
||||||
* @param sheetName 工作表的名称
|
* @param sheetName 工作表的名称
|
||||||
* @return 结果
|
* @return 结果
|
||||||
* @throws IOException
|
|
||||||
*/
|
*/
|
||||||
public void exportExcel(HttpServletResponse response, List<T> list, String sheetName)
|
public void exportExcel(HttpServletResponse response, List<T> list, String sheetName)
|
||||||
{
|
{
|
||||||
@ -447,7 +447,6 @@ public class ExcelUtil<T>
|
|||||||
* @param sheetName 工作表的名称
|
* @param sheetName 工作表的名称
|
||||||
* @param title 标题
|
* @param title 标题
|
||||||
* @return 结果
|
* @return 结果
|
||||||
* @throws IOException
|
|
||||||
*/
|
*/
|
||||||
public void exportExcel(HttpServletResponse response, List<T> list, String sheetName, String title)
|
public void exportExcel(HttpServletResponse response, List<T> list, String sheetName, String title)
|
||||||
{
|
{
|
||||||
@ -824,7 +823,7 @@ public class ExcelUtil<T>
|
|||||||
String dictType = attr.dictType();
|
String dictType = attr.dictType();
|
||||||
if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
|
if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
|
||||||
{
|
{
|
||||||
cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));
|
cell.setCellValue(parseDateToStr(dateFormat, value));
|
||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
|
else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
|
||||||
{
|
{
|
||||||
@ -1122,7 +1121,7 @@ public class ExcelUtil<T>
|
|||||||
if (StringUtils.isNotEmpty(excel.targetAttr()))
|
if (StringUtils.isNotEmpty(excel.targetAttr()))
|
||||||
{
|
{
|
||||||
String target = excel.targetAttr();
|
String target = excel.targetAttr();
|
||||||
if (target.indexOf(".") > -1)
|
if (target.contains("."))
|
||||||
{
|
{
|
||||||
String[] targets = target.split("[.]");
|
String[] targets = target.split("[.]");
|
||||||
for (String name : targets)
|
for (String name : targets)
|
||||||
@ -1217,7 +1216,7 @@ public class ExcelUtil<T>
|
|||||||
for (Object[] os : this.fields)
|
for (Object[] os : this.fields)
|
||||||
{
|
{
|
||||||
Excel excel = (Excel) os[1];
|
Excel excel = (Excel) os[1];
|
||||||
maxHeight = maxHeight > excel.height() ? maxHeight : excel.height();
|
maxHeight = Math.max(maxHeight, excel.height());
|
||||||
}
|
}
|
||||||
return (short) (maxHeight * 20);
|
return (short) (maxHeight * 20);
|
||||||
}
|
}
|
||||||
@ -1397,4 +1396,37 @@ public class ExcelUtil<T>
|
|||||||
}
|
}
|
||||||
return sheetIndexPicMap;
|
return sheetIndexPicMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化不同类型的日期对象
|
||||||
|
*
|
||||||
|
* @param dateFormat 日期格式
|
||||||
|
* @param val 被格式化的日期对象
|
||||||
|
* @return 格式化后的日期字符
|
||||||
|
*/
|
||||||
|
public String parseDateToStr(String dateFormat, Object val)
|
||||||
|
{
|
||||||
|
if (val == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String str;
|
||||||
|
if (val instanceof Date)
|
||||||
|
{
|
||||||
|
str = DateUtils.parseDateToStr(dateFormat, (Date) val);
|
||||||
|
}
|
||||||
|
else if (val instanceof LocalDateTime)
|
||||||
|
{
|
||||||
|
str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val));
|
||||||
|
}
|
||||||
|
else if (val instanceof LocalDate)
|
||||||
|
{
|
||||||
|
str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str = val.toString();
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.common.utils.sign;
|
package com.ruoyi.common.utils.sign;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -55,7 +56,7 @@ public class Md5Utils
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8");
|
return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -50,9 +50,9 @@ public class SqlUtil
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
|
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
|
||||||
for (int i = 0; i < sqlKeywords.length; i++)
|
for (String sqlKeyword : sqlKeywords)
|
||||||
{
|
{
|
||||||
if (StringUtils.indexOfIgnoreCase(value, sqlKeywords[i]) > -1)
|
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
|
||||||
{
|
{
|
||||||
throw new UtilException("参数存在SQL注入风险");
|
throw new UtilException("参数存在SQL注入风险");
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,86 @@
|
|||||||
|
package com.ruoyi.common.utils.uuid;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ruoyi 序列生成类
|
||||||
|
*/
|
||||||
|
public class Seq
|
||||||
|
{
|
||||||
|
// 通用序列类型
|
||||||
|
public static final String commSeqType = "COMMON";
|
||||||
|
|
||||||
|
// 上传序列类型
|
||||||
|
public static final String uploadSeqType = "UPLOAD";
|
||||||
|
|
||||||
|
// 通用接口序列数
|
||||||
|
private static AtomicInteger commSeq = new AtomicInteger(1);
|
||||||
|
|
||||||
|
// 上传接口序列数
|
||||||
|
private static AtomicInteger uploadSeq = new AtomicInteger(1);
|
||||||
|
|
||||||
|
// 机器标识
|
||||||
|
private static String machineCode = "A";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取通用序列号
|
||||||
|
*
|
||||||
|
* @return 序列值
|
||||||
|
*/
|
||||||
|
public static String getId()
|
||||||
|
{
|
||||||
|
return getId(commSeqType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串
|
||||||
|
*
|
||||||
|
* @return 序列值
|
||||||
|
*/
|
||||||
|
public static String getId(String type)
|
||||||
|
{
|
||||||
|
AtomicInteger atomicInt = commSeq;
|
||||||
|
if (uploadSeqType.equals(type))
|
||||||
|
{
|
||||||
|
atomicInt = uploadSeq;
|
||||||
|
}
|
||||||
|
return getId(atomicInt, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串
|
||||||
|
*
|
||||||
|
* @param atomicInt 序列数
|
||||||
|
* @param length 数值长度
|
||||||
|
* @return 序列值
|
||||||
|
*/
|
||||||
|
public static String getId(AtomicInteger atomicInt, int length)
|
||||||
|
{
|
||||||
|
String result = DateUtils.dateTimeNow();
|
||||||
|
result += machineCode;
|
||||||
|
result += getSeq(atomicInt, length);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数
|
||||||
|
*
|
||||||
|
* @return 序列值
|
||||||
|
*/
|
||||||
|
private synchronized static String getSeq(AtomicInteger atomicInt, int length)
|
||||||
|
{
|
||||||
|
// 先取值再+1
|
||||||
|
int value = atomicInt.getAndIncrement();
|
||||||
|
|
||||||
|
// 如果更新后值>=10 的 (length)幂次方则重置为1
|
||||||
|
int maxSeq = (int) Math.pow(10, length);
|
||||||
|
if (atomicInt.get() >= maxSeq)
|
||||||
|
{
|
||||||
|
atomicInt.set(1);
|
||||||
|
}
|
||||||
|
// 转字符串,用0左补齐
|
||||||
|
return StringUtils.padl(value, length);
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.common.xss;
|
package com.ruoyi.common.xss;
|
||||||
|
|
||||||
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import javax.validation.ConstraintValidator;
|
import javax.validation.ConstraintValidator;
|
||||||
import javax.validation.ConstraintValidatorContext;
|
import javax.validation.ConstraintValidatorContext;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
@ -12,15 +13,19 @@ import java.util.regex.Pattern;
|
|||||||
*/
|
*/
|
||||||
public class XssValidator implements ConstraintValidator<Xss, String>
|
public class XssValidator implements ConstraintValidator<Xss, String>
|
||||||
{
|
{
|
||||||
private final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";
|
private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext)
|
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext)
|
||||||
{
|
{
|
||||||
|
if (StringUtils.isBlank(value))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return !containsHtml(value);
|
return !containsHtml(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsHtml(String value)
|
public static boolean containsHtml(String value)
|
||||||
{
|
{
|
||||||
Pattern pattern = Pattern.compile(HTML_PATTERN);
|
Pattern pattern = Pattern.compile(HTML_PATTERN);
|
||||||
Matcher matcher = pattern.matcher(value);
|
Matcher matcher = pattern.matcher(value);
|
||||||
|
@ -119,4 +119,12 @@ public class Jvm
|
|||||||
{
|
{
|
||||||
return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate());
|
return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 运行参数
|
||||||
|
*/
|
||||||
|
public String getInputArgs()
|
||||||
|
{
|
||||||
|
return ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import com.ruoyi.common.exception.user.CaptchaExpireException;
|
|||||||
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
|
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
|
||||||
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
import com.ruoyi.common.utils.MessageUtils;
|
import com.ruoyi.common.utils.MessageUtils;
|
||||||
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import com.ruoyi.common.utils.ServletUtils;
|
import com.ruoyi.common.utils.ServletUtils;
|
||||||
import com.ruoyi.common.utils.ip.IpUtils;
|
import com.ruoyi.common.utils.ip.IpUtils;
|
||||||
import com.ruoyi.framework.manager.AsyncManager;
|
import com.ruoyi.framework.manager.AsyncManager;
|
||||||
@ -102,7 +103,7 @@ public class SysLoginService
|
|||||||
*/
|
*/
|
||||||
public void validateCaptcha(String username, String code, String uuid)
|
public void validateCaptcha(String username, String code, String uuid)
|
||||||
{
|
{
|
||||||
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
|
String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
|
||||||
String captcha = redisCache.getCacheObject(verifyKey);
|
String captcha = redisCache.getCacheObject(verifyKey);
|
||||||
redisCache.deleteObject(verifyKey);
|
redisCache.deleteObject(verifyKey);
|
||||||
if (captcha == null)
|
if (captcha == null)
|
||||||
|
@ -100,7 +100,7 @@ public class SysRegisterService
|
|||||||
*/
|
*/
|
||||||
public void validateCaptcha(String username, String code, String uuid)
|
public void validateCaptcha(String username, String code, String uuid)
|
||||||
{
|
{
|
||||||
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
|
String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
|
||||||
String captcha = redisCache.getCacheObject(verifyKey);
|
String captcha = redisCache.getCacheObject(verifyKey);
|
||||||
redisCache.deleteObject(verifyKey);
|
redisCache.deleteObject(verifyKey);
|
||||||
if (captcha == null)
|
if (captcha == null)
|
||||||
|
@ -59,12 +59,12 @@ public class GenController extends BaseController
|
|||||||
* 修改代码生成业务
|
* 修改代码生成业务
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("@ss.hasPermi('tool:gen:query')")
|
@PreAuthorize("@ss.hasPermi('tool:gen:query')")
|
||||||
@GetMapping(value = "/{talbleId}")
|
@GetMapping(value = "/{tableId}")
|
||||||
public AjaxResult getInfo(@PathVariable Long talbleId)
|
public AjaxResult getInfo(@PathVariable Long tableId)
|
||||||
{
|
{
|
||||||
GenTable table = genTableService.selectGenTableById(talbleId);
|
GenTable table = genTableService.selectGenTableById(tableId);
|
||||||
List<GenTable> tables = genTableService.selectGenTableAll();
|
List<GenTable> tables = genTableService.selectGenTableAll();
|
||||||
List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(talbleId);
|
List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
|
||||||
Map<String, Object> map = new HashMap<String, Object>();
|
Map<String, Object> map = new HashMap<String, Object>();
|
||||||
map.put("info", table);
|
map.put("info", table);
|
||||||
map.put("rows", list);
|
map.put("rows", list);
|
||||||
@ -88,7 +88,7 @@ public class GenController extends BaseController
|
|||||||
* 查询数据表字段列表
|
* 查询数据表字段列表
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("@ss.hasPermi('tool:gen:list')")
|
@PreAuthorize("@ss.hasPermi('tool:gen:list')")
|
||||||
@GetMapping(value = "/column/{talbleId}")
|
@GetMapping(value = "/column/{tableId}")
|
||||||
public TableDataInfo columnList(Long tableId)
|
public TableDataInfo columnList(Long tableId)
|
||||||
{
|
{
|
||||||
TableDataInfo dataInfo = new TableDataInfo();
|
TableDataInfo dataInfo = new TableDataInfo();
|
||||||
@ -204,7 +204,6 @@ public class GenController extends BaseController
|
|||||||
private void genCode(HttpServletResponse response, byte[] data) throws IOException
|
private void genCode(HttpServletResponse response, byte[] data) throws IOException
|
||||||
{
|
{
|
||||||
response.reset();
|
response.reset();
|
||||||
response.addHeader("Access-Control-Allow-Origin", "*");
|
|
||||||
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
|
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
|
||||||
response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
|
response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
|
||||||
response.addHeader("Content-Length", "" + data.length);
|
response.addHeader("Content-Length", "" + data.length);
|
||||||
|
@ -304,8 +304,17 @@ public class GenTableServiceImpl implements IGenTableService
|
|||||||
column.setColumnId(prevColumn.getColumnId());
|
column.setColumnId(prevColumn.getColumnId());
|
||||||
if (column.isList())
|
if (column.isList())
|
||||||
{
|
{
|
||||||
// 如果是列表,继续保留字典类型
|
// 如果是列表,继续保留查询方式/字典类型选项
|
||||||
column.setDictType(prevColumn.getDictType());
|
column.setDictType(prevColumn.getDictType());
|
||||||
|
column.setQueryType(prevColumn.getQueryType());
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk()
|
||||||
|
&& (column.isInsert() || column.isEdit())
|
||||||
|
&& ((column.isUsableColumn()) || (!column.isSuperColumn())))
|
||||||
|
{
|
||||||
|
// 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项
|
||||||
|
column.setIsRequired(prevColumn.getIsRequired());
|
||||||
|
column.setHtmlType(prevColumn.getHtmlType());
|
||||||
}
|
}
|
||||||
genTableColumnMapper.updateGenTableColumn(column);
|
genTableColumnMapper.updateGenTableColumn(column);
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ public class GenUtils
|
|||||||
column.setJavaField(StringUtils.toCamelCase(columnName));
|
column.setJavaField(StringUtils.toCamelCase(columnName));
|
||||||
// 设置默认类型
|
// 设置默认类型
|
||||||
column.setJavaType(GenConstants.TYPE_STRING);
|
column.setJavaType(GenConstants.TYPE_STRING);
|
||||||
|
column.setQueryType(GenConstants.QUERY_EQ);
|
||||||
|
|
||||||
if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType))
|
if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType))
|
||||||
{
|
{
|
||||||
@ -151,8 +152,7 @@ public class GenUtils
|
|||||||
{
|
{
|
||||||
int lastIndex = packageName.lastIndexOf(".");
|
int lastIndex = packageName.lastIndexOf(".");
|
||||||
int nameLength = packageName.length();
|
int nameLength = packageName.length();
|
||||||
String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength);
|
return StringUtils.substring(packageName, lastIndex + 1, nameLength);
|
||||||
return moduleName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -165,8 +165,7 @@ public class GenUtils
|
|||||||
{
|
{
|
||||||
int lastIndex = tableName.lastIndexOf("_");
|
int lastIndex = tableName.lastIndexOf("_");
|
||||||
int nameLength = tableName.length();
|
int nameLength = tableName.length();
|
||||||
String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength);
|
return StringUtils.substring(tableName, lastIndex + 1, nameLength);
|
||||||
return businessName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -228,8 +228,7 @@ public class VelocityUtils
|
|||||||
public static String getPackagePrefix(String packageName)
|
public static String getPackagePrefix(String packageName)
|
||||||
{
|
{
|
||||||
int lastIndex = packageName.lastIndexOf(".");
|
int lastIndex = packageName.lastIndexOf(".");
|
||||||
String basePackage = StringUtils.substring(packageName, 0, lastIndex);
|
return StringUtils.substring(packageName, 0, lastIndex);
|
||||||
return basePackage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -272,6 +271,23 @@ public class VelocityUtils
|
|||||||
{
|
{
|
||||||
List<GenTableColumn> columns = genTable.getColumns();
|
List<GenTableColumn> columns = genTable.getColumns();
|
||||||
Set<String> dicts = new HashSet<String>();
|
Set<String> dicts = new HashSet<String>();
|
||||||
|
addDicts(dicts, columns);
|
||||||
|
if (StringUtils.isNotNull(genTable.getSubTable()))
|
||||||
|
{
|
||||||
|
List<GenTableColumn> subColumns = genTable.getSubTable().getColumns();
|
||||||
|
addDicts(dicts, subColumns);
|
||||||
|
}
|
||||||
|
return StringUtils.join(dicts, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加字典列表
|
||||||
|
*
|
||||||
|
* @param dicts 字典列表
|
||||||
|
* @param columns 列集合
|
||||||
|
*/
|
||||||
|
public static void addDicts(Set<String> dicts, List<GenTableColumn> columns)
|
||||||
|
{
|
||||||
for (GenTableColumn column : columns)
|
for (GenTableColumn column : columns)
|
||||||
{
|
{
|
||||||
if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
|
if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
|
||||||
@ -281,7 +297,6 @@ public class VelocityUtils
|
|||||||
dicts.add("'" + column.getDictType() + "'");
|
dicts.add("'" + column.getDictType() + "'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return StringUtils.join(dicts, ", ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
#foreach($column in $columns)
|
#foreach($column in $columns)
|
||||||
#if($column.query)
|
#if($column.query)
|
||||||
#set($dictType=$column.dictType)
|
#set($dictType=$column.dictType)
|
||||||
@ -17,13 +17,12 @@
|
|||||||
v-model="queryParams.${column.javaField}"
|
v-model="queryParams.${column.javaField}"
|
||||||
placeholder="请输入${comment}"
|
placeholder="请输入${comment}"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
|
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
|
||||||
<el-form-item label="${comment}" prop="${column.javaField}">
|
<el-form-item label="${comment}" prop="${column.javaField}">
|
||||||
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
|
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.${dictType}"
|
v-for="dict in dict.type.${dictType}"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -34,13 +33,13 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
|
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
|
||||||
<el-form-item label="${comment}" prop="${column.javaField}">
|
<el-form-item label="${comment}" prop="${column.javaField}">
|
||||||
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
|
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
|
||||||
<el-option label="请选择字典生成" value="" />
|
<el-option label="请选择字典生成" value="" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
|
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
|
||||||
<el-form-item label="${comment}" prop="${column.javaField}">
|
<el-form-item label="${comment}" prop="${column.javaField}">
|
||||||
<el-date-picker clearable size="small"
|
<el-date-picker clearable
|
||||||
v-model="queryParams.${column.javaField}"
|
v-model="queryParams.${column.javaField}"
|
||||||
type="date"
|
type="date"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
@ -51,7 +50,6 @@
|
|||||||
<el-form-item label="${comment}">
|
<el-form-item label="${comment}">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="daterange${AttrName}"
|
v-model="daterange${AttrName}"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
@ -244,7 +242,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "datetime")
|
#elseif($column.htmlType == "datetime")
|
||||||
<el-form-item label="${comment}" prop="${field}">
|
<el-form-item label="${comment}" prop="${field}">
|
||||||
<el-date-picker clearable size="small"
|
<el-date-picker clearable
|
||||||
v-model="form.${field}"
|
v-model="form.${field}"
|
||||||
type="date"
|
type="date"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
#foreach($column in $columns)
|
#foreach($column in $columns)
|
||||||
#if($column.query)
|
#if($column.query)
|
||||||
#set($dictType=$column.dictType)
|
#set($dictType=$column.dictType)
|
||||||
@ -17,13 +17,12 @@
|
|||||||
v-model="queryParams.${column.javaField}"
|
v-model="queryParams.${column.javaField}"
|
||||||
placeholder="请输入${comment}"
|
placeholder="请输入${comment}"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
|
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
|
||||||
<el-form-item label="${comment}" prop="${column.javaField}">
|
<el-form-item label="${comment}" prop="${column.javaField}">
|
||||||
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
|
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.${dictType}"
|
v-for="dict in dict.type.${dictType}"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -34,24 +33,23 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
|
#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
|
||||||
<el-form-item label="${comment}" prop="${column.javaField}">
|
<el-form-item label="${comment}" prop="${column.javaField}">
|
||||||
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable size="small">
|
<el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
|
||||||
<el-option label="请选择字典生成" value="" />
|
<el-option label="请选择字典生成" value="" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
|
#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
|
||||||
<el-form-item label="${comment}" prop="${column.javaField}">
|
<el-form-item label="${comment}" prop="${column.javaField}">
|
||||||
<el-date-picker clearable size="small"
|
<el-date-picker clearable
|
||||||
v-model="queryParams.${column.javaField}"
|
v-model="queryParams.${column.javaField}"
|
||||||
type="date"
|
type="date"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
placeholder="选择${comment}">
|
placeholder="请选择${comment}">
|
||||||
</el-date-picker>
|
</el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
|
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
|
||||||
<el-form-item label="${comment}">
|
<el-form-item label="${comment}">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="daterange${AttrName}"
|
v-model="daterange${AttrName}"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
@ -265,11 +263,11 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "datetime")
|
#elseif($column.htmlType == "datetime")
|
||||||
<el-form-item label="${comment}" prop="${field}">
|
<el-form-item label="${comment}" prop="${field}">
|
||||||
<el-date-picker clearable size="small"
|
<el-date-picker clearable
|
||||||
v-model="form.${field}"
|
v-model="form.${field}"
|
||||||
type="date"
|
type="date"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
placeholder="选择${comment}">
|
placeholder="请选择${comment}">
|
||||||
</el-date-picker>
|
</el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "textarea")
|
#elseif($column.htmlType == "textarea")
|
||||||
@ -302,12 +300,39 @@
|
|||||||
#set($comment=$column.columnComment)
|
#set($comment=$column.columnComment)
|
||||||
#end
|
#end
|
||||||
#if($column.pk || $javaField == ${subTableFkclassName})
|
#if($column.pk || $javaField == ${subTableFkclassName})
|
||||||
#elseif($column.list && "" != $javaField)
|
#elseif($column.list && $column.htmlType == "input")
|
||||||
<el-table-column label="$comment" prop="${javaField}">
|
<el-table-column label="$comment" prop="${javaField}" width="150">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
|
<el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
#elseif($column.list && $column.htmlType == "datetime")
|
||||||
|
<el-table-column label="$comment" prop="${javaField}" width="240">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-date-picker clearable v-model="scope.row.$javaField" type="date" value-format="yyyy-MM-dd" placeholder="请选择$comment" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
|
||||||
|
<el-table-column label="$comment" prop="${javaField}" width="150">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dict.type.$column.dictType"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
></el-option>
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
|
||||||
|
<el-table-column label="$comment" prop="${javaField}" width="150">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
|
||||||
|
<el-option label="请选择字典生成" value="" />
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
#end
|
#end
|
||||||
#end
|
#end
|
||||||
</el-table>
|
</el-table>
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
v-model="queryParams.${column.javaField}"
|
v-model="queryParams.${column.javaField}"
|
||||||
type="date"
|
type="date"
|
||||||
value-format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD"
|
||||||
placeholder="选择${comment}">
|
placeholder="请选择${comment}">
|
||||||
</el-date-picker>
|
</el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
|
#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
|
||||||
@ -260,7 +260,7 @@
|
|||||||
v-model="form.${field}"
|
v-model="form.${field}"
|
||||||
type="date"
|
type="date"
|
||||||
value-format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD"
|
||||||
placeholder="选择${comment}">
|
placeholder="请选择${comment}">
|
||||||
</el-date-picker>
|
</el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
#elseif($column.htmlType == "textarea")
|
#elseif($column.htmlType == "textarea")
|
||||||
@ -293,12 +293,44 @@
|
|||||||
#set($comment=$column.columnComment)
|
#set($comment=$column.columnComment)
|
||||||
#end
|
#end
|
||||||
#if($column.pk || $javaField == ${subTableFkclassName})
|
#if($column.pk || $javaField == ${subTableFkclassName})
|
||||||
#elseif($column.list && "" != $javaField)
|
#elseif($column.list && $column.htmlType == "input")
|
||||||
<el-table-column label="$comment" prop="${javaField}">
|
<el-table-column label="$comment" prop="${javaField}" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
|
<el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
#elseif($column.list && $column.htmlType == "datetime")
|
||||||
|
<el-table-column label="$comment" prop="${javaField}" width="240">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-date-picker clearable
|
||||||
|
v-model="scope.row.$javaField"
|
||||||
|
type="date"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
placeholder="请选择$comment">
|
||||||
|
</el-date-picker>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
|
||||||
|
<el-table-column label="$comment" prop="${javaField}" width="150">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in $column.dictType"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
></el-option>
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
|
||||||
|
<el-table-column label="$comment" prop="${javaField}" width="150">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
|
||||||
|
<el-option label="请选择字典生成" value="" />
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
#end
|
#end
|
||||||
#end
|
#end
|
||||||
</el-table>
|
</el-table>
|
||||||
|
@ -1,57 +1,57 @@
|
|||||||
package com.ruoyi.quartz.config;
|
//package com.ruoyi.quartz.config;
|
||||||
|
//
|
||||||
import org.springframework.context.annotation.Bean;
|
//import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
//import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
//import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
||||||
import javax.sql.DataSource;
|
//import javax.sql.DataSource;
|
||||||
import java.util.Properties;
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
/**
|
///**
|
||||||
* 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效)
|
// * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效)
|
||||||
*
|
// *
|
||||||
* @author ruoyi
|
// * @author ruoyi
|
||||||
*/
|
// */
|
||||||
@Configuration
|
//@Configuration
|
||||||
public class ScheduleConfig
|
//public class ScheduleConfig
|
||||||
{
|
//{
|
||||||
@Bean
|
// @Bean
|
||||||
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource)
|
// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource)
|
||||||
{
|
// {
|
||||||
SchedulerFactoryBean factory = new SchedulerFactoryBean();
|
// SchedulerFactoryBean factory = new SchedulerFactoryBean();
|
||||||
factory.setDataSource(dataSource);
|
// factory.setDataSource(dataSource);
|
||||||
|
//
|
||||||
// quartz参数
|
// // quartz参数
|
||||||
Properties prop = new Properties();
|
// Properties prop = new Properties();
|
||||||
prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
|
// prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
|
||||||
prop.put("org.quartz.scheduler.instanceId", "AUTO");
|
// prop.put("org.quartz.scheduler.instanceId", "AUTO");
|
||||||
// 线程池配置
|
// // 线程池配置
|
||||||
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
|
// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
|
||||||
prop.put("org.quartz.threadPool.threadCount", "20");
|
// prop.put("org.quartz.threadPool.threadCount", "20");
|
||||||
prop.put("org.quartz.threadPool.threadPriority", "5");
|
// prop.put("org.quartz.threadPool.threadPriority", "5");
|
||||||
// JobStore配置
|
// // JobStore配置
|
||||||
prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
|
// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
|
||||||
// 集群配置
|
// // 集群配置
|
||||||
prop.put("org.quartz.jobStore.isClustered", "true");
|
// prop.put("org.quartz.jobStore.isClustered", "true");
|
||||||
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
|
// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
|
||||||
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
|
// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
|
||||||
prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
|
// prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
|
||||||
|
//
|
||||||
// sqlserver 启用
|
// // sqlserver 启用
|
||||||
// prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
|
// // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
|
||||||
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
|
// prop.put("org.quartz.jobStore.misfireThreshold", "12000");
|
||||||
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
|
// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
|
||||||
factory.setQuartzProperties(prop);
|
// factory.setQuartzProperties(prop);
|
||||||
|
//
|
||||||
factory.setSchedulerName("RuoyiScheduler");
|
// factory.setSchedulerName("RuoyiScheduler");
|
||||||
// 延时启动
|
// // 延时启动
|
||||||
factory.setStartupDelay(1);
|
// factory.setStartupDelay(1);
|
||||||
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
|
// factory.setApplicationContextSchedulerContextKey("applicationContextKey");
|
||||||
// 可选,QuartzScheduler
|
// // 可选,QuartzScheduler
|
||||||
// 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
|
// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
|
||||||
factory.setOverwriteExistingJobs(true);
|
// factory.setOverwriteExistingJobs(true);
|
||||||
// 设置自动启动,默认为true
|
// // 设置自动启动,默认为true
|
||||||
factory.setAutoStartup(true);
|
// factory.setAutoStartup(true);
|
||||||
|
//
|
||||||
return factory;
|
// return factory;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
@ -125,10 +125,7 @@ public class ScheduleUtils
|
|||||||
int count = StringUtils.countMatches(packageName, ".");
|
int count = StringUtils.countMatches(packageName, ".");
|
||||||
if (count > 1)
|
if (count > 1)
|
||||||
{
|
{
|
||||||
if (!StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR))
|
return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR);
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ public interface SysUserMapper
|
|||||||
public List<SysUser> selectUserList(SysUser sysUser);
|
public List<SysUser> selectUserList(SysUser sysUser);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据条件分页查询未已配用户角色列表
|
* 根据条件分页查询已配用户角色列表
|
||||||
*
|
*
|
||||||
* @param user 用户信息
|
* @param user 用户信息
|
||||||
* @return 用户信息集合信息
|
* @return 用户信息集合信息
|
||||||
|
@ -61,7 +61,6 @@ public interface ISysConfigService
|
|||||||
* 批量删除参数信息
|
* 批量删除参数信息
|
||||||
*
|
*
|
||||||
* @param configIds 需要删除的参数ID
|
* @param configIds 需要删除的参数ID
|
||||||
* @return 结果
|
|
||||||
*/
|
*/
|
||||||
public void deleteConfigByIds(Long[] configIds);
|
public void deleteConfigByIds(Long[] configIds);
|
||||||
|
|
||||||
|
@ -39,7 +39,6 @@ public interface ISysDictDataService
|
|||||||
* 批量删除字典数据信息
|
* 批量删除字典数据信息
|
||||||
*
|
*
|
||||||
* @param dictCodes 需要删除的字典数据ID
|
* @param dictCodes 需要删除的字典数据ID
|
||||||
* @return 结果
|
|
||||||
*/
|
*/
|
||||||
public void deleteDictDataByIds(Long[] dictCodes);
|
public void deleteDictDataByIds(Long[] dictCodes);
|
||||||
|
|
||||||
|
@ -54,7 +54,6 @@ public interface ISysDictTypeService
|
|||||||
* 批量删除字典信息
|
* 批量删除字典信息
|
||||||
*
|
*
|
||||||
* @param dictIds 需要删除的字典ID
|
* @param dictIds 需要删除的字典ID
|
||||||
* @return 结果
|
|
||||||
*/
|
*/
|
||||||
public void deleteDictTypeByIds(Long[] dictIds);
|
public void deleteDictTypeByIds(Long[] dictIds);
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ public interface ISysLogininforService
|
|||||||
* 批量删除系统登录日志
|
* 批量删除系统登录日志
|
||||||
*
|
*
|
||||||
* @param infoIds 需要删除的登录日志ID
|
* @param infoIds 需要删除的登录日志ID
|
||||||
* @return
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
public int deleteLogininforByIds(Long[] infoIds);
|
public int deleteLogininforByIds(Long[] infoIds);
|
||||||
|
|
||||||
|
@ -78,7 +78,6 @@ public interface ISysPostService
|
|||||||
*
|
*
|
||||||
* @param postIds 需要删除的岗位ID
|
* @param postIds 需要删除的岗位ID
|
||||||
* @return 结果
|
* @return 结果
|
||||||
* @throws Exception 异常
|
|
||||||
*/
|
*/
|
||||||
public int deletePostByIds(Long[] postIds);
|
public int deletePostByIds(Long[] postIds);
|
||||||
|
|
||||||
|
@ -146,7 +146,6 @@ public class SysConfigServiceImpl implements ISysConfigService
|
|||||||
* 批量删除参数信息
|
* 批量删除参数信息
|
||||||
*
|
*
|
||||||
* @param configIds 需要删除的参数ID
|
* @param configIds 需要删除的参数ID
|
||||||
* @return 结果
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void deleteConfigByIds(Long[] configIds)
|
public void deleteConfigByIds(Long[] configIds)
|
||||||
|
@ -63,9 +63,8 @@ public class SysDeptServiceImpl implements ISysDeptService
|
|||||||
{
|
{
|
||||||
tempList.add(dept.getDeptId());
|
tempList.add(dept.getDeptId());
|
||||||
}
|
}
|
||||||
for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext();)
|
for (SysDept dept : depts)
|
||||||
{
|
{
|
||||||
SysDept dept = (SysDept) iterator.next();
|
|
||||||
// 如果是顶级节点, 遍历该父节点的所有子节点
|
// 如果是顶级节点, 遍历该父节点的所有子节点
|
||||||
if (!tempList.contains(dept.getParentId()))
|
if (!tempList.contains(dept.getParentId()))
|
||||||
{
|
{
|
||||||
|
@ -60,7 +60,6 @@ public class SysDictDataServiceImpl implements ISysDictDataService
|
|||||||
* 批量删除字典数据信息
|
* 批量删除字典数据信息
|
||||||
*
|
*
|
||||||
* @param dictCodes 需要删除的字典数据ID
|
* @param dictCodes 需要删除的字典数据ID
|
||||||
* @return 结果
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void deleteDictDataByIds(Long[] dictCodes)
|
public void deleteDictDataByIds(Long[] dictCodes)
|
||||||
|
@ -115,7 +115,6 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
|
|||||||
* 批量删除字典类型信息
|
* 批量删除字典类型信息
|
||||||
*
|
*
|
||||||
* @param dictIds 需要删除的字典ID
|
* @param dictIds 需要删除的字典ID
|
||||||
* @return 结果
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void deleteDictTypeByIds(Long[] dictIds)
|
public void deleteDictTypeByIds(Long[] dictIds)
|
||||||
|
@ -46,7 +46,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService
|
|||||||
* 批量删除系统登录日志
|
* 批量删除系统登录日志
|
||||||
*
|
*
|
||||||
* @param infoIds 需要删除的登录日志ID
|
* @param infoIds 需要删除的登录日志ID
|
||||||
* @return
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int deleteLogininforByIds(Long[] infoIds)
|
public int deleteLogininforByIds(Long[] infoIds)
|
||||||
|
@ -230,7 +230,7 @@ public class SysMenuServiceImpl implements ISysMenuService
|
|||||||
else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
|
else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
|
||||||
{
|
{
|
||||||
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
|
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
|
||||||
router.setPath("/inner");
|
router.setPath("/");
|
||||||
List<RouterVo> childrenList = new ArrayList<RouterVo>();
|
List<RouterVo> childrenList = new ArrayList<RouterVo>();
|
||||||
RouterVo children = new RouterVo();
|
RouterVo children = new RouterVo();
|
||||||
String routerPath = innerLinkReplaceEach(menu.getPath());
|
String routerPath = innerLinkReplaceEach(menu.getPath());
|
||||||
@ -552,7 +552,7 @@ public class SysMenuServiceImpl implements ISysMenuService
|
|||||||
*/
|
*/
|
||||||
private boolean hasChild(List<SysMenu> list, SysMenu t)
|
private boolean hasChild(List<SysMenu> list, SysMenu t)
|
||||||
{
|
{
|
||||||
return getChildList(list, t).size() > 0 ? true : false;
|
return getChildList(list, t).size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -137,7 +137,6 @@ public class SysPostServiceImpl implements ISysPostService
|
|||||||
*
|
*
|
||||||
* @param postIds 需要删除的岗位ID
|
* @param postIds 需要删除的岗位ID
|
||||||
* @return 结果
|
* @return 结果
|
||||||
* @throws Exception 异常
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int deletePostByIds(Long[] postIds)
|
public int deletePostByIds(Long[] postIds)
|
||||||
|
@ -404,7 +404,7 @@ public class SysRoleServiceImpl implements ISysRoleService
|
|||||||
* 批量选择授权用户角色
|
* 批量选择授权用户角色
|
||||||
*
|
*
|
||||||
* @param roleId 角色ID
|
* @param roleId 角色ID
|
||||||
* @param userIds 需要删除的用户数据ID
|
* @param userIds 需要授权的用户数据ID
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<sql id="selectMenuVo">
|
<sql id="selectMenuVo">
|
||||||
select menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time
|
select menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time
|
||||||
from sys_menu
|
from sys_menu
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
@ -52,13 +52,13 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectMenuTreeAll" resultMap="SysMenuResult">
|
<select id="selectMenuTreeAll" resultMap="SysMenuResult">
|
||||||
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
|
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
|
||||||
from sys_menu m where m.menu_type in ('M', 'C') and m.status = 0
|
from sys_menu m where m.menu_type in ('M', 'C') and m.status = 0
|
||||||
order by m.parent_id, m.order_num
|
order by m.parent_id, m.order_num
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectMenuListByUserId" parameterType="SysMenu" resultMap="SysMenuResult">
|
<select id="selectMenuListByUserId" parameterType="SysMenu" resultMap="SysMenuResult">
|
||||||
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
|
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
|
||||||
from sys_menu m
|
from sys_menu m
|
||||||
left join sys_role_menu rm on m.menu_id = rm.menu_id
|
left join sys_role_menu rm on m.menu_id = rm.menu_id
|
||||||
left join sys_user_role ur on rm.role_id = ur.role_id
|
left join sys_user_role ur on rm.role_id = ur.role_id
|
||||||
@ -80,7 +80,7 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
|
<select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
|
||||||
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
|
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
|
||||||
from sys_menu m
|
from sys_menu m
|
||||||
left join sys_role_menu rm on m.menu_id = rm.menu_id
|
left join sys_role_menu rm on m.menu_id = rm.menu_id
|
||||||
left join sys_user_role ur on rm.role_id = ur.role_id
|
left join sys_user_role ur on rm.role_id = ur.role_id
|
||||||
@ -139,7 +139,7 @@
|
|||||||
<if test="orderNum != null and orderNum != ''">order_num = #{orderNum},</if>
|
<if test="orderNum != null and orderNum != ''">order_num = #{orderNum},</if>
|
||||||
<if test="path != null and path != ''">path = #{path},</if>
|
<if test="path != null and path != ''">path = #{path},</if>
|
||||||
<if test="component != null">component = #{component},</if>
|
<if test="component != null">component = #{component},</if>
|
||||||
<if test="query != null">query = #{query},</if>
|
<if test="query != null">`query` = #{query},</if>
|
||||||
<if test="isFrame != null and isFrame != ''">is_frame = #{isFrame},</if>
|
<if test="isFrame != null and isFrame != ''">is_frame = #{isFrame},</if>
|
||||||
<if test="isCache != null and isCache != ''">is_cache = #{isCache},</if>
|
<if test="isCache != null and isCache != ''">is_cache = #{isCache},</if>
|
||||||
<if test="menuType != null and menuType != ''">menu_type = #{menuType},</if>
|
<if test="menuType != null and menuType != ''">menu_type = #{menuType},</if>
|
||||||
@ -162,7 +162,7 @@
|
|||||||
<if test="orderNum != null and orderNum != ''">order_num,</if>
|
<if test="orderNum != null and orderNum != ''">order_num,</if>
|
||||||
<if test="path != null and path != ''">path,</if>
|
<if test="path != null and path != ''">path,</if>
|
||||||
<if test="component != null and component != ''">component,</if>
|
<if test="component != null and component != ''">component,</if>
|
||||||
<if test="query != null and query != ''">query,</if>
|
<if test="query != null and query != ''">`query`,</if>
|
||||||
<if test="isFrame != null and isFrame != ''">is_frame,</if>
|
<if test="isFrame != null and isFrame != ''">is_frame,</if>
|
||||||
<if test="isCache != null and isCache != ''">is_cache,</if>
|
<if test="isCache != null and isCache != ''">is_cache,</if>
|
||||||
<if test="menuType != null and menuType != ''">menu_type,</if>
|
<if test="menuType != null and menuType != ''">menu_type,</if>
|
||||||
|
@ -7,6 +7,10 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sidebarHide {
|
||||||
|
margin-left: 0!important;
|
||||||
|
}
|
||||||
|
|
||||||
.sidebar-container {
|
.sidebar-container {
|
||||||
-webkit-transition: width .28s;
|
-webkit-transition: width .28s;
|
||||||
transition: width 0.28s;
|
transition: width 0.28s;
|
||||||
|
@ -1,198 +1,209 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="upload-file">
|
<div class="upload-file">
|
||||||
<el-upload
|
<el-upload
|
||||||
:action="uploadFileUrl"
|
multiple
|
||||||
:before-upload="handleBeforeUpload"
|
:action="uploadFileUrl"
|
||||||
:file-list="fileList"
|
:before-upload="handleBeforeUpload"
|
||||||
:limit="limit"
|
:file-list="fileList"
|
||||||
:on-error="handleUploadError"
|
:limit="limit"
|
||||||
:on-exceed="handleExceed"
|
:on-error="handleUploadError"
|
||||||
:on-success="handleUploadSuccess"
|
:on-exceed="handleExceed"
|
||||||
:show-file-list="false"
|
:on-success="handleUploadSuccess"
|
||||||
:headers="headers"
|
:show-file-list="false"
|
||||||
class="upload-file-uploader"
|
:headers="headers"
|
||||||
ref="upload"
|
class="upload-file-uploader"
|
||||||
>
|
ref="upload"
|
||||||
<!-- 上传按钮 -->
|
>
|
||||||
<el-button size="mini" type="primary">选取文件</el-button>
|
<!-- 上传按钮 -->
|
||||||
<!-- 上传提示 -->
|
<el-button size="mini" type="primary">选取文件</el-button>
|
||||||
<div class="el-upload__tip" slot="tip" v-if="showTip">
|
<!-- 上传提示 -->
|
||||||
请上传
|
<div class="el-upload__tip" slot="tip" v-if="showTip">
|
||||||
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
|
请上传
|
||||||
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
|
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
|
||||||
的文件
|
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
|
||||||
</div>
|
的文件
|
||||||
</el-upload>
|
</div>
|
||||||
|
</el-upload>
|
||||||
<!-- 文件列表 -->
|
|
||||||
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
|
<!-- 文件列表 -->
|
||||||
<li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
|
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
|
||||||
<el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
|
<li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
|
||||||
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
|
<el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
|
||||||
</el-link>
|
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
|
||||||
<div class="ele-upload-list__item-content-action">
|
</el-link>
|
||||||
<el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
|
<div class="ele-upload-list__item-content-action">
|
||||||
</div>
|
<el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
|
||||||
</li>
|
</div>
|
||||||
</transition-group>
|
</li>
|
||||||
</div>
|
</transition-group>
|
||||||
</template>
|
</div>
|
||||||
|
</template>
|
||||||
<script>
|
|
||||||
import { getToken } from "@/utils/auth";
|
<script>
|
||||||
|
import { getToken } from "@/utils/auth";
|
||||||
export default {
|
|
||||||
name: "FileUpload",
|
export default {
|
||||||
props: {
|
name: "FileUpload",
|
||||||
// 值
|
props: {
|
||||||
value: [String, Object, Array],
|
// 值
|
||||||
// 数量限制
|
value: [String, Object, Array],
|
||||||
limit: {
|
// 数量限制
|
||||||
type: Number,
|
limit: {
|
||||||
default: 5,
|
type: Number,
|
||||||
},
|
default: 5,
|
||||||
// 大小限制(MB)
|
},
|
||||||
fileSize: {
|
// 大小限制(MB)
|
||||||
type: Number,
|
fileSize: {
|
||||||
default: 5,
|
type: Number,
|
||||||
},
|
default: 5,
|
||||||
// 文件类型, 例如['png', 'jpg', 'jpeg']
|
},
|
||||||
fileType: {
|
// 文件类型, 例如['png', 'jpg', 'jpeg']
|
||||||
type: Array,
|
fileType: {
|
||||||
default: () => ["doc", "xls", "ppt", "txt", "pdf"],
|
type: Array,
|
||||||
},
|
default: () => ["doc", "xls", "ppt", "txt", "pdf"],
|
||||||
// 是否显示提示
|
},
|
||||||
isShowTip: {
|
// 是否显示提示
|
||||||
type: Boolean,
|
isShowTip: {
|
||||||
default: true
|
type: Boolean,
|
||||||
}
|
default: true
|
||||||
},
|
}
|
||||||
data() {
|
},
|
||||||
return {
|
data() {
|
||||||
baseUrl: process.env.VUE_APP_BASE_API,
|
return {
|
||||||
uploadFileUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
|
number: 0,
|
||||||
headers: {
|
uploadList: [],
|
||||||
Authorization: "Bearer " + getToken(),
|
baseUrl: process.env.VUE_APP_BASE_API,
|
||||||
},
|
uploadFileUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
|
||||||
fileList: [],
|
headers: {
|
||||||
};
|
Authorization: "Bearer " + getToken(),
|
||||||
},
|
},
|
||||||
watch: {
|
fileList: [],
|
||||||
value: {
|
};
|
||||||
handler(val) {
|
},
|
||||||
if (val) {
|
watch: {
|
||||||
let temp = 1;
|
value: {
|
||||||
// 首先将值转为数组
|
handler(val) {
|
||||||
const list = Array.isArray(val) ? val : this.value.split(',');
|
if (val) {
|
||||||
// 然后将数组转为对象数组
|
let temp = 1;
|
||||||
this.fileList = list.map(item => {
|
// 首先将值转为数组
|
||||||
if (typeof item === "string") {
|
const list = Array.isArray(val) ? val : this.value.split(',');
|
||||||
item = { name: item, url: item };
|
// 然后将数组转为对象数组
|
||||||
}
|
this.fileList = list.map(item => {
|
||||||
item.uid = item.uid || new Date().getTime() + temp++;
|
if (typeof item === "string") {
|
||||||
return item;
|
item = { name: item, url: item };
|
||||||
});
|
}
|
||||||
} else {
|
item.uid = item.uid || new Date().getTime() + temp++;
|
||||||
this.fileList = [];
|
return item;
|
||||||
return [];
|
});
|
||||||
}
|
} else {
|
||||||
},
|
this.fileList = [];
|
||||||
deep: true,
|
return [];
|
||||||
immediate: true
|
}
|
||||||
}
|
},
|
||||||
},
|
deep: true,
|
||||||
computed: {
|
immediate: true
|
||||||
// 是否显示提示
|
}
|
||||||
showTip() {
|
},
|
||||||
return this.isShowTip && (this.fileType || this.fileSize);
|
computed: {
|
||||||
},
|
// 是否显示提示
|
||||||
},
|
showTip() {
|
||||||
methods: {
|
return this.isShowTip && (this.fileType || this.fileSize);
|
||||||
// 上传前校检格式和大小
|
},
|
||||||
handleBeforeUpload(file) {
|
},
|
||||||
// 校检文件类型
|
methods: {
|
||||||
if (this.fileType) {
|
// 上传前校检格式和大小
|
||||||
let fileExtension = "";
|
handleBeforeUpload(file) {
|
||||||
if (file.name.lastIndexOf(".") > -1) {
|
// 校检文件类型
|
||||||
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
|
if (this.fileType) {
|
||||||
}
|
let fileExtension = "";
|
||||||
const isTypeOk = this.fileType.some((type) => {
|
if (file.name.lastIndexOf(".") > -1) {
|
||||||
if (file.type.indexOf(type) > -1) return true;
|
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
|
||||||
if (fileExtension && fileExtension.indexOf(type) > -1) return true;
|
}
|
||||||
return false;
|
const isTypeOk = this.fileType.some((type) => {
|
||||||
});
|
if (file.type.indexOf(type) > -1) return true;
|
||||||
if (!isTypeOk) {
|
if (fileExtension && fileExtension.indexOf(type) > -1) return true;
|
||||||
this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
|
return false;
|
||||||
return false;
|
});
|
||||||
}
|
if (!isTypeOk) {
|
||||||
}
|
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
|
||||||
// 校检文件大小
|
return false;
|
||||||
if (this.fileSize) {
|
}
|
||||||
const isLt = file.size / 1024 / 1024 < this.fileSize;
|
}
|
||||||
if (!isLt) {
|
// 校检文件大小
|
||||||
this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
|
if (this.fileSize) {
|
||||||
return false;
|
const isLt = file.size / 1024 / 1024 < this.fileSize;
|
||||||
}
|
if (!isLt) {
|
||||||
}
|
this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
|
||||||
return true;
|
return false;
|
||||||
},
|
}
|
||||||
// 文件个数超出
|
}
|
||||||
handleExceed() {
|
this.$modal.loading("正在上传文件,请稍候...");
|
||||||
this.$message.error(`上传文件数量不能超过 ${this.limit} 个!`);
|
this.number++;
|
||||||
},
|
return true;
|
||||||
// 上传失败
|
},
|
||||||
handleUploadError(err) {
|
// 文件个数超出
|
||||||
this.$message.error("上传失败, 请重试");
|
handleExceed() {
|
||||||
},
|
this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
|
||||||
// 上传成功回调
|
},
|
||||||
handleUploadSuccess(res, file) {
|
// 上传失败
|
||||||
this.$message.success("上传成功");
|
handleUploadError(err) {
|
||||||
this.fileList.push({ name: res.fileName, url: res.fileName });
|
this.$modal.msgError("上传图片失败,请重试");
|
||||||
this.$emit("input", this.listToString(this.fileList));
|
this.$modal.closeLoading()
|
||||||
},
|
},
|
||||||
// 删除文件
|
// 上传成功回调
|
||||||
handleDelete(index) {
|
handleUploadSuccess(res) {
|
||||||
this.fileList.splice(index, 1);
|
this.uploadList.push({ name: res.fileName, url: res.fileName });
|
||||||
this.$emit("input", this.listToString(this.fileList));
|
if (this.uploadList.length === this.number) {
|
||||||
},
|
this.fileList = this.fileList.concat(this.uploadList);
|
||||||
// 获取文件名称
|
this.uploadList = [];
|
||||||
getFileName(name) {
|
this.number = 0;
|
||||||
if (name.lastIndexOf("/") > -1) {
|
this.$emit("input", this.listToString(this.fileList));
|
||||||
return name.slice(name.lastIndexOf("/") + 1).toLowerCase();
|
this.$modal.closeLoading();
|
||||||
} else {
|
}
|
||||||
return "";
|
},
|
||||||
}
|
// 删除文件
|
||||||
},
|
handleDelete(index) {
|
||||||
// 对象转成指定字符串分隔
|
this.fileList.splice(index, 1);
|
||||||
listToString(list, separator) {
|
this.$emit("input", this.listToString(this.fileList));
|
||||||
let strs = "";
|
},
|
||||||
separator = separator || ",";
|
// 获取文件名称
|
||||||
for (let i in list) {
|
getFileName(name) {
|
||||||
strs += list[i].url + separator;
|
if (name.lastIndexOf("/") > -1) {
|
||||||
}
|
return name.slice(name.lastIndexOf("/") + 1);
|
||||||
return strs != '' ? strs.substr(0, strs.length - 1) : '';
|
} else {
|
||||||
}
|
return "";
|
||||||
}
|
}
|
||||||
};
|
},
|
||||||
</script>
|
// 对象转成指定字符串分隔
|
||||||
|
listToString(list, separator) {
|
||||||
<style scoped lang="scss">
|
let strs = "";
|
||||||
.upload-file-uploader {
|
separator = separator || ",";
|
||||||
margin-bottom: 5px;
|
for (let i in list) {
|
||||||
}
|
strs += list[i].url + separator;
|
||||||
.upload-file-list .el-upload-list__item {
|
}
|
||||||
border: 1px solid #e4e7ed;
|
return strs != '' ? strs.substr(0, strs.length - 1) : '';
|
||||||
line-height: 2;
|
}
|
||||||
margin-bottom: 10px;
|
}
|
||||||
position: relative;
|
};
|
||||||
}
|
</script>
|
||||||
.upload-file-list .ele-upload-list__item-content {
|
|
||||||
display: flex;
|
<style scoped lang="scss">
|
||||||
justify-content: space-between;
|
.upload-file-uploader {
|
||||||
align-items: center;
|
margin-bottom: 5px;
|
||||||
color: inherit;
|
}
|
||||||
}
|
.upload-file-list .el-upload-list__item {
|
||||||
.ele-upload-list__item-content-action .el-link {
|
border: 1px solid #e4e7ed;
|
||||||
margin-right: 10px;
|
line-height: 2;
|
||||||
}
|
margin-bottom: 10px;
|
||||||
</style>
|
position: relative;
|
||||||
|
}
|
||||||
|
.upload-file-list .ele-upload-list__item-content {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
.ele-upload-list__item-content-action .el-link {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="component-upload-image">
|
<div class="component-upload-image">
|
||||||
<el-upload
|
<el-upload
|
||||||
|
multiple
|
||||||
:action="uploadImgUrl"
|
:action="uploadImgUrl"
|
||||||
list-type="picture-card"
|
list-type="picture-card"
|
||||||
:on-success="handleUploadSuccess"
|
:on-success="handleUploadSuccess"
|
||||||
@ -70,6 +71,8 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
number: 0,
|
||||||
|
uploadList: [],
|
||||||
dialogImageUrl: "",
|
dialogImageUrl: "",
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
hideUpload: false,
|
hideUpload: false,
|
||||||
@ -124,9 +127,14 @@ export default {
|
|||||||
},
|
},
|
||||||
// 上传成功回调
|
// 上传成功回调
|
||||||
handleUploadSuccess(res) {
|
handleUploadSuccess(res) {
|
||||||
this.fileList.push({ name: res.fileName, url: res.fileName });
|
this.uploadList.push({ name: res.fileName, url: res.fileName });
|
||||||
this.$emit("input", this.listToString(this.fileList));
|
if (this.uploadList.length === this.number) {
|
||||||
this.loading.close();
|
this.fileList = this.fileList.concat(this.uploadList);
|
||||||
|
this.uploadList = [];
|
||||||
|
this.number = 0;
|
||||||
|
this.$emit("input", this.listToString(this.fileList));
|
||||||
|
this.$modal.closeLoading();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
// 上传前loading加载
|
// 上传前loading加载
|
||||||
handleBeforeUpload(file) {
|
handleBeforeUpload(file) {
|
||||||
@ -146,35 +154,27 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isImg) {
|
if (!isImg) {
|
||||||
this.$message.error(
|
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);
|
||||||
`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`
|
|
||||||
);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (this.fileSize) {
|
if (this.fileSize) {
|
||||||
const isLt = file.size / 1024 / 1024 < this.fileSize;
|
const isLt = file.size / 1024 / 1024 < this.fileSize;
|
||||||
if (!isLt) {
|
if (!isLt) {
|
||||||
this.$message.error(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
|
this.$modal.msgError(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.loading = this.$loading({
|
this.$modal.loading("正在上传图片,请稍候...");
|
||||||
lock: true,
|
this.number++;
|
||||||
text: "上传中",
|
|
||||||
background: "rgba(0, 0, 0, 0.7)",
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
// 文件个数超出
|
// 文件个数超出
|
||||||
handleExceed() {
|
handleExceed() {
|
||||||
this.$message.error(`上传文件数量不能超过 ${this.limit} 个!`);
|
this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
|
||||||
},
|
},
|
||||||
// 上传失败
|
// 上传失败
|
||||||
handleUploadError() {
|
handleUploadError() {
|
||||||
this.$message({
|
this.$modal.msgError("上传图片失败,请重试");
|
||||||
type: "error",
|
this.$modal.closeLoading();
|
||||||
message: "上传失败",
|
|
||||||
});
|
|
||||||
this.loading.close();
|
|
||||||
},
|
},
|
||||||
// 预览
|
// 预览
|
||||||
handlePictureCardPreview(file) {
|
handlePictureCardPreview(file) {
|
||||||
|
@ -61,6 +61,10 @@ export default {
|
|||||||
default: false
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
};
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
currentPage: {
|
currentPage: {
|
||||||
get() {
|
get() {
|
||||||
@ -81,6 +85,9 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleSizeChange(val) {
|
handleSizeChange(val) {
|
||||||
|
if (this.currentPage * val > this.total) {
|
||||||
|
this.currentPage = 1
|
||||||
|
}
|
||||||
this.$emit('pagination', { page: this.currentPage, limit: val })
|
this.$emit('pagination', { page: this.currentPage, limit: val })
|
||||||
if (this.autoScroll) {
|
if (this.autoScroll) {
|
||||||
scrollTo(0, 800)
|
scrollTo(0, 800)
|
||||||
|
@ -71,7 +71,7 @@ export default {
|
|||||||
for (var item in router.children) {
|
for (var item in router.children) {
|
||||||
if (router.children[item].parentPath === undefined) {
|
if (router.children[item].parentPath === undefined) {
|
||||||
if(router.path === "/") {
|
if(router.path === "/") {
|
||||||
router.children[item].path = "/redirect/" + router.children[item].path;
|
router.children[item].path = "/" + router.children[item].path;
|
||||||
} else {
|
} else {
|
||||||
if(!this.ishttp(router.children[item].path)) {
|
if(!this.ishttp(router.children[item].path)) {
|
||||||
router.children[item].path = router.path + "/" + router.children[item].path;
|
router.children[item].path = router.path + "/" + router.children[item].path;
|
||||||
@ -87,22 +87,23 @@ export default {
|
|||||||
// 默认激活的菜单
|
// 默认激活的菜单
|
||||||
activeMenu() {
|
activeMenu() {
|
||||||
const path = this.$route.path;
|
const path = this.$route.path;
|
||||||
let activePath = this.defaultRouter();
|
let activePath = path;
|
||||||
if (path.lastIndexOf("/") > 0) {
|
if (path.lastIndexOf("/") > 0) {
|
||||||
const tmpPath = path.substring(1, path.length);
|
const tmpPath = path.substring(1, path.length);
|
||||||
activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
|
activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
|
||||||
|
this.$store.dispatch('app/toggleSideBarHide', false);
|
||||||
} else if ("/index" == path || "" == path) {
|
} else if ("/index" == path || "" == path) {
|
||||||
if (!this.isFrist) {
|
if (!this.isFrist) {
|
||||||
this.isFrist = true;
|
this.isFrist = true;
|
||||||
} else {
|
} else {
|
||||||
activePath = "index";
|
activePath = "index";
|
||||||
}
|
}
|
||||||
|
this.$store.dispatch('app/toggleSideBarHide', true);
|
||||||
|
} else if(!this.$route.children) {
|
||||||
|
activePath = path;
|
||||||
|
this.$store.dispatch('app/toggleSideBarHide', true);
|
||||||
}
|
}
|
||||||
var routes = this.activeRoutes(activePath);
|
this.activeRoutes(activePath);
|
||||||
if (routes.length === 0) {
|
|
||||||
activePath = this.currentIndex || this.defaultRouter()
|
|
||||||
this.activeRoutes(activePath);
|
|
||||||
}
|
|
||||||
return activePath;
|
return activePath;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -121,29 +122,21 @@ export default {
|
|||||||
const width = document.body.getBoundingClientRect().width / 3;
|
const width = document.body.getBoundingClientRect().width / 3;
|
||||||
this.visibleNumber = parseInt(width / 85);
|
this.visibleNumber = parseInt(width / 85);
|
||||||
},
|
},
|
||||||
// 默认激活的路由
|
|
||||||
defaultRouter() {
|
|
||||||
let router;
|
|
||||||
Object.keys(this.routers).some((key) => {
|
|
||||||
if (!this.routers[key].hidden) {
|
|
||||||
router = this.routers[key].path;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return router;
|
|
||||||
},
|
|
||||||
// 菜单选择事件
|
// 菜单选择事件
|
||||||
handleSelect(key, keyPath) {
|
handleSelect(key, keyPath) {
|
||||||
this.currentIndex = key;
|
this.currentIndex = key;
|
||||||
|
const route = this.routers.find(item => item.path === key);
|
||||||
if (this.ishttp(key)) {
|
if (this.ishttp(key)) {
|
||||||
// http(s):// 路径新窗口打开
|
// http(s):// 路径新窗口打开
|
||||||
window.open(key, "_blank");
|
window.open(key, "_blank");
|
||||||
} else if (key.indexOf("/redirect") !== -1) {
|
} else if (!route || !route.children) {
|
||||||
// /redirect 路径内部打开
|
// 没有子路由路径内部打开
|
||||||
this.$router.push({ path: key.replace("/redirect", "") });
|
this.$router.push({ path: key });
|
||||||
|
this.$store.dispatch('app/toggleSideBarHide', true);
|
||||||
} else {
|
} else {
|
||||||
// 显示左侧联动菜单
|
// 显示左侧联动菜单
|
||||||
this.activeRoutes(key);
|
this.activeRoutes(key);
|
||||||
|
this.$store.dispatch('app/toggleSideBarHide', false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 当前激活的路由
|
// 当前激活的路由
|
||||||
@ -159,9 +152,8 @@ export default {
|
|||||||
if(routes.length > 0) {
|
if(routes.length > 0) {
|
||||||
this.$store.commit("SET_SIDEBAR_ROUTERS", routes);
|
this.$store.commit("SET_SIDEBAR_ROUTERS", routes);
|
||||||
}
|
}
|
||||||
return routes;
|
|
||||||
},
|
},
|
||||||
ishttp(url) {
|
ishttp(url) {
|
||||||
return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
|
return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -108,6 +108,7 @@ export default {
|
|||||||
value: val
|
value: val
|
||||||
})
|
})
|
||||||
if (!val) {
|
if (!val) {
|
||||||
|
this.$store.dispatch('app/toggleSideBarHide', false);
|
||||||
this.$store.commit("SET_SIDEBAR_ROUTERS", this.$store.state.permission.defaultRoutes);
|
this.$store.commit("SET_SIDEBAR_ROUTERS", this.$store.state.permission.defaultRoutes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,11 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (title) {
|
if (title) {
|
||||||
vnodes.push(<span slot='title'>{(title)}</span>)
|
if (title.length > 5) {
|
||||||
|
vnodes.push(<span slot='title' title={(title)}>{(title)}</span>)
|
||||||
|
} else {
|
||||||
|
vnodes.push(<span slot='title'>{(title)}</span>)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return vnodes
|
return vnodes
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
|
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
|
||||||
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
|
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
|
||||||
<sidebar class="sidebar-container"/>
|
<sidebar v-if="!sidebar.hide" class="sidebar-container" />
|
||||||
<div :class="{hasTagsView:needTagsView}" class="main-container">
|
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
|
||||||
<div :class="{'fixed-header':fixedHeader}">
|
<div :class="{'fixed-header':fixedHeader}">
|
||||||
<navbar />
|
<navbar />
|
||||||
<tags-view v-if="needTagsView" />
|
<tags-view v-if="needTagsView" />
|
||||||
@ -101,6 +101,10 @@ export default {
|
|||||||
width: calc(100% - 54px);
|
width: calc(100% - 54px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sidebarHide .fixed-header {
|
||||||
|
width: calc(100%);
|
||||||
|
}
|
||||||
|
|
||||||
.mobile .fixed-header {
|
.mobile .fixed-header {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
@ -1,53 +1,56 @@
|
|||||||
import router from './router'
|
import router from './router'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
import { Message } from 'element-ui'
|
import { Message } from 'element-ui'
|
||||||
import NProgress from 'nprogress'
|
import NProgress from 'nprogress'
|
||||||
import 'nprogress/nprogress.css'
|
import 'nprogress/nprogress.css'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
|
import { isRelogin } from '@/utils/request'
|
||||||
NProgress.configure({ showSpinner: false })
|
|
||||||
|
NProgress.configure({ showSpinner: false })
|
||||||
const whiteList = ['/login', '/auth-redirect', '/bind', '/register']
|
|
||||||
|
const whiteList = ['/login', '/auth-redirect', '/bind', '/register']
|
||||||
router.beforeEach((to, from, next) => {
|
|
||||||
NProgress.start()
|
router.beforeEach((to, from, next) => {
|
||||||
if (getToken()) {
|
NProgress.start()
|
||||||
to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
|
if (getToken()) {
|
||||||
/* has token*/
|
to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
|
||||||
if (to.path === '/login') {
|
/* has token*/
|
||||||
next({ path: '/' })
|
if (to.path === '/login') {
|
||||||
NProgress.done()
|
next({ path: '/' })
|
||||||
} else {
|
NProgress.done()
|
||||||
if (store.getters.roles.length === 0) {
|
} else {
|
||||||
// 判断当前用户是否已拉取完user_info信息
|
if (store.getters.roles.length === 0) {
|
||||||
store.dispatch('GetInfo').then(() => {
|
isRelogin.show = true
|
||||||
store.dispatch('GenerateRoutes').then(accessRoutes => {
|
// 判断当前用户是否已拉取完user_info信息
|
||||||
// 根据roles权限生成可访问的路由表
|
store.dispatch('GetInfo').then(() => {
|
||||||
router.addRoutes(accessRoutes) // 动态添加可访问路由表
|
isRelogin.show = false
|
||||||
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
|
store.dispatch('GenerateRoutes').then(accessRoutes => {
|
||||||
})
|
// 根据roles权限生成可访问的路由表
|
||||||
}).catch(err => {
|
router.addRoutes(accessRoutes) // 动态添加可访问路由表
|
||||||
store.dispatch('LogOut').then(() => {
|
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
|
||||||
Message.error(err)
|
})
|
||||||
next({ path: '/' })
|
}).catch(err => {
|
||||||
})
|
store.dispatch('LogOut').then(() => {
|
||||||
})
|
Message.error(err)
|
||||||
} else {
|
next({ path: '/' })
|
||||||
next()
|
})
|
||||||
}
|
})
|
||||||
}
|
} else {
|
||||||
} else {
|
next()
|
||||||
// 没有token
|
}
|
||||||
if (whiteList.indexOf(to.path) !== -1) {
|
}
|
||||||
// 在免登录白名单,直接进入
|
} else {
|
||||||
next()
|
// 没有token
|
||||||
} else {
|
if (whiteList.indexOf(to.path) !== -1) {
|
||||||
next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
|
// 在免登录白名单,直接进入
|
||||||
NProgress.done()
|
next()
|
||||||
}
|
} else {
|
||||||
}
|
next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
|
||||||
})
|
NProgress.done()
|
||||||
|
}
|
||||||
router.afterEach(() => {
|
}
|
||||||
NProgress.done()
|
})
|
||||||
})
|
|
||||||
|
router.afterEach(() => {
|
||||||
|
NProgress.done()
|
||||||
|
})
|
||||||
|
@ -155,7 +155,7 @@ export const dynamicRoutes = [
|
|||||||
permissions: ['tool:gen:edit'],
|
permissions: ['tool:gen:edit'],
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'index',
|
path: 'index/:tableId(\\d+)',
|
||||||
component: () => import('@/views/tool/gen/editTable'),
|
component: () => import('@/views/tool/gen/editTable'),
|
||||||
name: 'GenEdit',
|
name: 'GenEdit',
|
||||||
meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
|
meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
|
||||||
@ -164,6 +164,12 @@ export const dynamicRoutes = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
// 防止连续点击多次路由报错
|
||||||
|
let routerPush = Router.prototype.push;
|
||||||
|
Router.prototype.push = function push(location) {
|
||||||
|
return routerPush.call(this, location).catch(err => err)
|
||||||
|
}
|
||||||
|
|
||||||
export default new Router({
|
export default new Router({
|
||||||
mode: 'history', // 去掉url中的#
|
mode: 'history', // 去掉url中的#
|
||||||
scrollBehavior: () => ({ y: 0 }),
|
scrollBehavior: () => ({ y: 0 }),
|
||||||
|
@ -3,7 +3,8 @@ import Cookies from 'js-cookie'
|
|||||||
const state = {
|
const state = {
|
||||||
sidebar: {
|
sidebar: {
|
||||||
opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
|
opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
|
||||||
withoutAnimation: false
|
withoutAnimation: false,
|
||||||
|
hide: false
|
||||||
},
|
},
|
||||||
device: 'desktop',
|
device: 'desktop',
|
||||||
size: Cookies.get('size') || 'medium'
|
size: Cookies.get('size') || 'medium'
|
||||||
@ -11,6 +12,9 @@ const state = {
|
|||||||
|
|
||||||
const mutations = {
|
const mutations = {
|
||||||
TOGGLE_SIDEBAR: state => {
|
TOGGLE_SIDEBAR: state => {
|
||||||
|
if (state.sidebar.hide) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
state.sidebar.opened = !state.sidebar.opened
|
state.sidebar.opened = !state.sidebar.opened
|
||||||
state.sidebar.withoutAnimation = false
|
state.sidebar.withoutAnimation = false
|
||||||
if (state.sidebar.opened) {
|
if (state.sidebar.opened) {
|
||||||
@ -30,6 +34,9 @@ const mutations = {
|
|||||||
SET_SIZE: (state, size) => {
|
SET_SIZE: (state, size) => {
|
||||||
state.size = size
|
state.size = size
|
||||||
Cookies.set('size', size)
|
Cookies.set('size', size)
|
||||||
|
},
|
||||||
|
SET_SIDEBAR_HIDE: (state, status) => {
|
||||||
|
state.sidebar.hide = status
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,6 +52,9 @@ const actions = {
|
|||||||
},
|
},
|
||||||
setSize({ commit }, size) {
|
setSize({ commit }, size) {
|
||||||
commit('SET_SIZE', size)
|
commit('SET_SIZE', size)
|
||||||
|
},
|
||||||
|
toggleSideBarHide({ commit }, status) {
|
||||||
|
commit('SET_SIDEBAR_HIDE', status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,12 +22,7 @@ const permission = {
|
|||||||
state.defaultRoutes = constantRoutes.concat(routes)
|
state.defaultRoutes = constantRoutes.concat(routes)
|
||||||
},
|
},
|
||||||
SET_TOPBAR_ROUTES: (state, routes) => {
|
SET_TOPBAR_ROUTES: (state, routes) => {
|
||||||
// 顶部导航菜单默认添加统计报表栏指向首页
|
state.topbarRouters = routes
|
||||||
const index = [{
|
|
||||||
path: 'index',
|
|
||||||
meta: { title: '统计报表', icon: 'dashboard' }
|
|
||||||
}]
|
|
||||||
state.topbarRouters = routes.concat(index);
|
|
||||||
},
|
},
|
||||||
SET_SIDEBAR_ROUTERS: (state, routes) => {
|
SET_SIDEBAR_ROUTERS: (state, routes) => {
|
||||||
state.sidebarRouters = routes
|
state.sidebarRouters = routes
|
||||||
|
@ -51,7 +51,7 @@ const user = {
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
getInfo().then(res => {
|
getInfo().then(res => {
|
||||||
const user = res.user
|
const user = res.user
|
||||||
const avatar = user.avatar == "" ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar;
|
const avatar = (user.avatar == "" || user.avatar == null) ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar;
|
||||||
if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
|
if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
|
||||||
commit('SET_ROLES', res.roles)
|
commit('SET_ROLES', res.roles)
|
||||||
commit('SET_PERMISSIONS', res.permissions)
|
commit('SET_PERMISSIONS', res.permissions)
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
export default [
|
export default [
|
||||||
{
|
{
|
||||||
layout: 'colFormItem',
|
layout: 'colFormItem',
|
||||||
tagIcon: 'input',
|
tagIcon: 'input',
|
||||||
label: '手机号',
|
label: '手机号',
|
||||||
vModel: 'mobile',
|
vModel: 'mobile',
|
||||||
formId: 6,
|
formId: 6,
|
||||||
tag: 'el-input',
|
tag: 'el-input',
|
||||||
placeholder: '请输入手机号',
|
placeholder: '请输入手机号',
|
||||||
defaultValue: '',
|
defaultValue: '',
|
||||||
span: 24,
|
span: 24,
|
||||||
style: { width: '100%' },
|
style: { width: '100%' },
|
||||||
clearable: true,
|
clearable: true,
|
||||||
prepend: '',
|
prepend: '',
|
||||||
append: '',
|
append: '',
|
||||||
'prefix-icon': 'el-icon-mobile',
|
'prefix-icon': 'el-icon-mobile',
|
||||||
'suffix-icon': '',
|
'suffix-icon': '',
|
||||||
maxlength: 11,
|
maxlength: 11,
|
||||||
'show-word-limit': true,
|
'show-word-limit': true,
|
||||||
readonly: false,
|
readonly: false,
|
||||||
disabled: false,
|
disabled: false,
|
||||||
required: true,
|
required: true,
|
||||||
changeTag: true,
|
changeTag: true,
|
||||||
regList: [{
|
regList: [{
|
||||||
pattern: '/^1(3|4|5|7|8|9)\\d{9}$/',
|
pattern: '/^1(3|4|5|7|8|9)\\d{9}$/',
|
||||||
message: '手机号格式错误'
|
message: '手机号格式错误'
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
]
|
]
|
@ -1,359 +1,359 @@
|
|||||||
/* eslint-disable max-len */
|
/* eslint-disable max-len */
|
||||||
import { trigger } from './config'
|
import { trigger } from './config'
|
||||||
|
|
||||||
let confGlobal
|
let confGlobal
|
||||||
let someSpanIsNot24
|
let someSpanIsNot24
|
||||||
|
|
||||||
export function dialogWrapper(str) {
|
export function dialogWrapper(str) {
|
||||||
return `<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Titile">
|
return `<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Title">
|
||||||
${str}
|
${str}
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<el-button @click="close">取消</el-button>
|
<el-button @click="close">取消</el-button>
|
||||||
<el-button type="primary" @click="handelConfirm">确定</el-button>
|
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>`
|
</el-dialog>`
|
||||||
}
|
}
|
||||||
|
|
||||||
export function vueTemplate(str) {
|
export function vueTemplate(str) {
|
||||||
return `<template>
|
return `<template>
|
||||||
<div>
|
<div>
|
||||||
${str}
|
${str}
|
||||||
</div>
|
</div>
|
||||||
</template>`
|
</template>`
|
||||||
}
|
}
|
||||||
|
|
||||||
export function vueScript(str) {
|
export function vueScript(str) {
|
||||||
return `<script>
|
return `<script>
|
||||||
${str}
|
${str}
|
||||||
</script>`
|
</script>`
|
||||||
}
|
}
|
||||||
|
|
||||||
export function cssStyle(cssStr) {
|
export function cssStyle(cssStr) {
|
||||||
return `<style>
|
return `<style>
|
||||||
${cssStr}
|
${cssStr}
|
||||||
</style>`
|
</style>`
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildFormTemplate(conf, child, type) {
|
function buildFormTemplate(conf, child, type) {
|
||||||
let labelPosition = ''
|
let labelPosition = ''
|
||||||
if (conf.labelPosition !== 'right') {
|
if (conf.labelPosition !== 'right') {
|
||||||
labelPosition = `label-position="${conf.labelPosition}"`
|
labelPosition = `label-position="${conf.labelPosition}"`
|
||||||
}
|
}
|
||||||
const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : ''
|
const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : ''
|
||||||
let str = `<el-form ref="${conf.formRef}" :model="${conf.formModel}" :rules="${conf.formRules}" size="${conf.size}" ${disabled} label-width="${conf.labelWidth}px" ${labelPosition}>
|
let str = `<el-form ref="${conf.formRef}" :model="${conf.formModel}" :rules="${conf.formRules}" size="${conf.size}" ${disabled} label-width="${conf.labelWidth}px" ${labelPosition}>
|
||||||
${child}
|
${child}
|
||||||
${buildFromBtns(conf, type)}
|
${buildFromBtns(conf, type)}
|
||||||
</el-form>`
|
</el-form>`
|
||||||
if (someSpanIsNot24) {
|
if (someSpanIsNot24) {
|
||||||
str = `<el-row :gutter="${conf.gutter}">
|
str = `<el-row :gutter="${conf.gutter}">
|
||||||
${str}
|
${str}
|
||||||
</el-row>`
|
</el-row>`
|
||||||
}
|
}
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildFromBtns(conf, type) {
|
function buildFromBtns(conf, type) {
|
||||||
let str = ''
|
let str = ''
|
||||||
if (conf.formBtns && type === 'file') {
|
if (conf.formBtns && type === 'file') {
|
||||||
str = `<el-form-item size="large">
|
str = `<el-form-item size="large">
|
||||||
<el-button type="primary" @click="submitForm">提交</el-button>
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
<el-button @click="resetForm">重置</el-button>
|
<el-button @click="resetForm">重置</el-button>
|
||||||
</el-form-item>`
|
</el-form-item>`
|
||||||
if (someSpanIsNot24) {
|
if (someSpanIsNot24) {
|
||||||
str = `<el-col :span="24">
|
str = `<el-col :span="24">
|
||||||
${str}
|
${str}
|
||||||
</el-col>`
|
</el-col>`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
// span不为24的用el-col包裹
|
// span不为24的用el-col包裹
|
||||||
function colWrapper(element, str) {
|
function colWrapper(element, str) {
|
||||||
if (someSpanIsNot24 || element.span !== 24) {
|
if (someSpanIsNot24 || element.span !== 24) {
|
||||||
return `<el-col :span="${element.span}">
|
return `<el-col :span="${element.span}">
|
||||||
${str}
|
${str}
|
||||||
</el-col>`
|
</el-col>`
|
||||||
}
|
}
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
const layouts = {
|
const layouts = {
|
||||||
colFormItem(element) {
|
colFormItem(element) {
|
||||||
let labelWidth = ''
|
let labelWidth = ''
|
||||||
if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) {
|
if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) {
|
||||||
labelWidth = `label-width="${element.labelWidth}px"`
|
labelWidth = `label-width="${element.labelWidth}px"`
|
||||||
}
|
}
|
||||||
const required = !trigger[element.tag] && element.required ? 'required' : ''
|
const required = !trigger[element.tag] && element.required ? 'required' : ''
|
||||||
const tagDom = tags[element.tag] ? tags[element.tag](element) : null
|
const tagDom = tags[element.tag] ? tags[element.tag](element) : null
|
||||||
let str = `<el-form-item ${labelWidth} label="${element.label}" prop="${element.vModel}" ${required}>
|
let str = `<el-form-item ${labelWidth} label="${element.label}" prop="${element.vModel}" ${required}>
|
||||||
${tagDom}
|
${tagDom}
|
||||||
</el-form-item>`
|
</el-form-item>`
|
||||||
str = colWrapper(element, str)
|
str = colWrapper(element, str)
|
||||||
return str
|
return str
|
||||||
},
|
},
|
||||||
rowFormItem(element) {
|
rowFormItem(element) {
|
||||||
const type = element.type === 'default' ? '' : `type="${element.type}"`
|
const type = element.type === 'default' ? '' : `type="${element.type}"`
|
||||||
const justify = element.type === 'default' ? '' : `justify="${element.justify}"`
|
const justify = element.type === 'default' ? '' : `justify="${element.justify}"`
|
||||||
const align = element.type === 'default' ? '' : `align="${element.align}"`
|
const align = element.type === 'default' ? '' : `align="${element.align}"`
|
||||||
const gutter = element.gutter ? `gutter="${element.gutter}"` : ''
|
const gutter = element.gutter ? `gutter="${element.gutter}"` : ''
|
||||||
const children = element.children.map(el => layouts[el.layout](el))
|
const children = element.children.map(el => layouts[el.layout](el))
|
||||||
let str = `<el-row ${type} ${justify} ${align} ${gutter}>
|
let str = `<el-row ${type} ${justify} ${align} ${gutter}>
|
||||||
${children.join('\n')}
|
${children.join('\n')}
|
||||||
</el-row>`
|
</el-row>`
|
||||||
str = colWrapper(element, str)
|
str = colWrapper(element, str)
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const tags = {
|
const tags = {
|
||||||
'el-button': el => {
|
'el-button': el => {
|
||||||
const {
|
const {
|
||||||
tag, disabled
|
tag, disabled
|
||||||
} = attrBuilder(el)
|
} = attrBuilder(el)
|
||||||
const type = el.type ? `type="${el.type}"` : ''
|
const type = el.type ? `type="${el.type}"` : ''
|
||||||
const icon = el.icon ? `icon="${el.icon}"` : ''
|
const icon = el.icon ? `icon="${el.icon}"` : ''
|
||||||
const size = el.size ? `size="${el.size}"` : ''
|
const size = el.size ? `size="${el.size}"` : ''
|
||||||
let child = buildElButtonChild(el)
|
let child = buildElButtonChild(el)
|
||||||
|
|
||||||
if (child) child = `\n${child}\n` // 换行
|
if (child) child = `\n${child}\n` // 换行
|
||||||
return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}</${el.tag}>`
|
return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}</${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-input': el => {
|
'el-input': el => {
|
||||||
const {
|
const {
|
||||||
disabled, vModel, clearable, placeholder, width
|
disabled, vModel, clearable, placeholder, width
|
||||||
} = attrBuilder(el)
|
} = attrBuilder(el)
|
||||||
const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : ''
|
const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : ''
|
||||||
const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : ''
|
const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : ''
|
||||||
const readonly = el.readonly ? 'readonly' : ''
|
const readonly = el.readonly ? 'readonly' : ''
|
||||||
const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : ''
|
const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : ''
|
||||||
const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : ''
|
const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : ''
|
||||||
const showPassword = el['show-password'] ? 'show-password' : ''
|
const showPassword = el['show-password'] ? 'show-password' : ''
|
||||||
const type = el.type ? `type="${el.type}"` : ''
|
const type = el.type ? `type="${el.type}"` : ''
|
||||||
const autosize = el.autosize && el.autosize.minRows
|
const autosize = el.autosize && el.autosize.minRows
|
||||||
? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"`
|
? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"`
|
||||||
: ''
|
: ''
|
||||||
let child = buildElInputChild(el)
|
let child = buildElInputChild(el)
|
||||||
|
|
||||||
if (child) child = `\n${child}\n` // 换行
|
if (child) child = `\n${child}\n` // 换行
|
||||||
return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${el.tag}>`
|
return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-input-number': el => {
|
'el-input-number': el => {
|
||||||
const { disabled, vModel, placeholder } = attrBuilder(el)
|
const { disabled, vModel, placeholder } = attrBuilder(el)
|
||||||
const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : ''
|
const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : ''
|
||||||
const min = el.min ? `:min='${el.min}'` : ''
|
const min = el.min ? `:min='${el.min}'` : ''
|
||||||
const max = el.max ? `:max='${el.max}'` : ''
|
const max = el.max ? `:max='${el.max}'` : ''
|
||||||
const step = el.step ? `:step='${el.step}'` : ''
|
const step = el.step ? `:step='${el.step}'` : ''
|
||||||
const stepStrictly = el['step-strictly'] ? 'step-strictly' : ''
|
const stepStrictly = el['step-strictly'] ? 'step-strictly' : ''
|
||||||
const precision = el.precision ? `:precision='${el.precision}'` : ''
|
const precision = el.precision ? `:precision='${el.precision}'` : ''
|
||||||
|
|
||||||
return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-select': el => {
|
'el-select': el => {
|
||||||
const {
|
const {
|
||||||
disabled, vModel, clearable, placeholder, width
|
disabled, vModel, clearable, placeholder, width
|
||||||
} = attrBuilder(el)
|
} = attrBuilder(el)
|
||||||
const filterable = el.filterable ? 'filterable' : ''
|
const filterable = el.filterable ? 'filterable' : ''
|
||||||
const multiple = el.multiple ? 'multiple' : ''
|
const multiple = el.multiple ? 'multiple' : ''
|
||||||
let child = buildElSelectChild(el)
|
let child = buildElSelectChild(el)
|
||||||
|
|
||||||
if (child) child = `\n${child}\n` // 换行
|
if (child) child = `\n${child}\n` // 换行
|
||||||
return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${el.tag}>`
|
return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-radio-group': el => {
|
'el-radio-group': el => {
|
||||||
const { disabled, vModel } = attrBuilder(el)
|
const { disabled, vModel } = attrBuilder(el)
|
||||||
const size = `size="${el.size}"`
|
const size = `size="${el.size}"`
|
||||||
let child = buildElRadioGroupChild(el)
|
let child = buildElRadioGroupChild(el)
|
||||||
|
|
||||||
if (child) child = `\n${child}\n` // 换行
|
if (child) child = `\n${child}\n` // 换行
|
||||||
return `<${el.tag} ${vModel} ${size} ${disabled}>${child}</${el.tag}>`
|
return `<${el.tag} ${vModel} ${size} ${disabled}>${child}</${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-checkbox-group': el => {
|
'el-checkbox-group': el => {
|
||||||
const { disabled, vModel } = attrBuilder(el)
|
const { disabled, vModel } = attrBuilder(el)
|
||||||
const size = `size="${el.size}"`
|
const size = `size="${el.size}"`
|
||||||
const min = el.min ? `:min="${el.min}"` : ''
|
const min = el.min ? `:min="${el.min}"` : ''
|
||||||
const max = el.max ? `:max="${el.max}"` : ''
|
const max = el.max ? `:max="${el.max}"` : ''
|
||||||
let child = buildElCheckboxGroupChild(el)
|
let child = buildElCheckboxGroupChild(el)
|
||||||
|
|
||||||
if (child) child = `\n${child}\n` // 换行
|
if (child) child = `\n${child}\n` // 换行
|
||||||
return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${el.tag}>`
|
return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-switch': el => {
|
'el-switch': el => {
|
||||||
const { disabled, vModel } = attrBuilder(el)
|
const { disabled, vModel } = attrBuilder(el)
|
||||||
const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : ''
|
const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : ''
|
||||||
const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : ''
|
const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : ''
|
||||||
const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : ''
|
const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : ''
|
||||||
const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : ''
|
const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : ''
|
||||||
const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : ''
|
const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : ''
|
||||||
const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : ''
|
const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : ''
|
||||||
|
|
||||||
return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-cascader': el => {
|
'el-cascader': el => {
|
||||||
const {
|
const {
|
||||||
disabled, vModel, clearable, placeholder, width
|
disabled, vModel, clearable, placeholder, width
|
||||||
} = attrBuilder(el)
|
} = attrBuilder(el)
|
||||||
const options = el.options ? `:options="${el.vModel}Options"` : ''
|
const options = el.options ? `:options="${el.vModel}Options"` : ''
|
||||||
const props = el.props ? `:props="${el.vModel}Props"` : ''
|
const props = el.props ? `:props="${el.vModel}Props"` : ''
|
||||||
const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"'
|
const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"'
|
||||||
const filterable = el.filterable ? 'filterable' : ''
|
const filterable = el.filterable ? 'filterable' : ''
|
||||||
const separator = el.separator === '/' ? '' : `separator="${el.separator}"`
|
const separator = el.separator === '/' ? '' : `separator="${el.separator}"`
|
||||||
|
|
||||||
return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-slider': el => {
|
'el-slider': el => {
|
||||||
const { disabled, vModel } = attrBuilder(el)
|
const { disabled, vModel } = attrBuilder(el)
|
||||||
const min = el.min ? `:min='${el.min}'` : ''
|
const min = el.min ? `:min='${el.min}'` : ''
|
||||||
const max = el.max ? `:max='${el.max}'` : ''
|
const max = el.max ? `:max='${el.max}'` : ''
|
||||||
const step = el.step ? `:step='${el.step}'` : ''
|
const step = el.step ? `:step='${el.step}'` : ''
|
||||||
const range = el.range ? 'range' : ''
|
const range = el.range ? 'range' : ''
|
||||||
const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : ''
|
const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : ''
|
||||||
|
|
||||||
return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-time-picker': el => {
|
'el-time-picker': el => {
|
||||||
const {
|
const {
|
||||||
disabled, vModel, clearable, placeholder, width
|
disabled, vModel, clearable, placeholder, width
|
||||||
} = attrBuilder(el)
|
} = attrBuilder(el)
|
||||||
const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
|
const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
|
||||||
const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
|
const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
|
||||||
const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
|
const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
|
||||||
const isRange = el['is-range'] ? 'is-range' : ''
|
const isRange = el['is-range'] ? 'is-range' : ''
|
||||||
const format = el.format ? `format="${el.format}"` : ''
|
const format = el.format ? `format="${el.format}"` : ''
|
||||||
const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
|
const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
|
||||||
const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : ''
|
const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : ''
|
||||||
|
|
||||||
return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-date-picker': el => {
|
'el-date-picker': el => {
|
||||||
const {
|
const {
|
||||||
disabled, vModel, clearable, placeholder, width
|
disabled, vModel, clearable, placeholder, width
|
||||||
} = attrBuilder(el)
|
} = attrBuilder(el)
|
||||||
const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
|
const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
|
||||||
const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
|
const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
|
||||||
const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
|
const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
|
||||||
const format = el.format ? `format="${el.format}"` : ''
|
const format = el.format ? `format="${el.format}"` : ''
|
||||||
const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
|
const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
|
||||||
const type = el.type === 'date' ? '' : `type="${el.type}"`
|
const type = el.type === 'date' ? '' : `type="${el.type}"`
|
||||||
const readonly = el.readonly ? 'readonly' : ''
|
const readonly = el.readonly ? 'readonly' : ''
|
||||||
|
|
||||||
return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-rate': el => {
|
'el-rate': el => {
|
||||||
const { disabled, vModel } = attrBuilder(el)
|
const { disabled, vModel } = attrBuilder(el)
|
||||||
const max = el.max ? `:max='${el.max}'` : ''
|
const max = el.max ? `:max='${el.max}'` : ''
|
||||||
const allowHalf = el['allow-half'] ? 'allow-half' : ''
|
const allowHalf = el['allow-half'] ? 'allow-half' : ''
|
||||||
const showText = el['show-text'] ? 'show-text' : ''
|
const showText = el['show-text'] ? 'show-text' : ''
|
||||||
const showScore = el['show-score'] ? 'show-score' : ''
|
const showScore = el['show-score'] ? 'show-score' : ''
|
||||||
|
|
||||||
return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-color-picker': el => {
|
'el-color-picker': el => {
|
||||||
const { disabled, vModel } = attrBuilder(el)
|
const { disabled, vModel } = attrBuilder(el)
|
||||||
const size = `size="${el.size}"`
|
const size = `size="${el.size}"`
|
||||||
const showAlpha = el['show-alpha'] ? 'show-alpha' : ''
|
const showAlpha = el['show-alpha'] ? 'show-alpha' : ''
|
||||||
const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : ''
|
const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : ''
|
||||||
|
|
||||||
return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${el.tag}>`
|
return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${el.tag}>`
|
||||||
},
|
},
|
||||||
'el-upload': el => {
|
'el-upload': el => {
|
||||||
const disabled = el.disabled ? ':disabled=\'true\'' : ''
|
const disabled = el.disabled ? ':disabled=\'true\'' : ''
|
||||||
const action = el.action ? `:action="${el.vModel}Action"` : ''
|
const action = el.action ? `:action="${el.vModel}Action"` : ''
|
||||||
const multiple = el.multiple ? 'multiple' : ''
|
const multiple = el.multiple ? 'multiple' : ''
|
||||||
const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : ''
|
const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : ''
|
||||||
const accept = el.accept ? `accept="${el.accept}"` : ''
|
const accept = el.accept ? `accept="${el.accept}"` : ''
|
||||||
const name = el.name !== 'file' ? `name="${el.name}"` : ''
|
const name = el.name !== 'file' ? `name="${el.name}"` : ''
|
||||||
const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : ''
|
const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : ''
|
||||||
const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"`
|
const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"`
|
||||||
const fileList = `:file-list="${el.vModel}fileList"`
|
const fileList = `:file-list="${el.vModel}fileList"`
|
||||||
const ref = `ref="${el.vModel}"`
|
const ref = `ref="${el.vModel}"`
|
||||||
let child = buildElUploadChild(el)
|
let child = buildElUploadChild(el)
|
||||||
|
|
||||||
if (child) child = `\n${child}\n` // 换行
|
if (child) child = `\n${child}\n` // 换行
|
||||||
return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${el.tag}>`
|
return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${el.tag}>`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function attrBuilder(el) {
|
function attrBuilder(el) {
|
||||||
return {
|
return {
|
||||||
vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`,
|
vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`,
|
||||||
clearable: el.clearable ? 'clearable' : '',
|
clearable: el.clearable ? 'clearable' : '',
|
||||||
placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '',
|
placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '',
|
||||||
width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '',
|
width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '',
|
||||||
disabled: el.disabled ? ':disabled=\'true\'' : ''
|
disabled: el.disabled ? ':disabled=\'true\'' : ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// el-buttin 子级
|
// el-buttin 子级
|
||||||
function buildElButtonChild(conf) {
|
function buildElButtonChild(conf) {
|
||||||
const children = []
|
const children = []
|
||||||
if (conf.default) {
|
if (conf.default) {
|
||||||
children.push(conf.default)
|
children.push(conf.default)
|
||||||
}
|
}
|
||||||
return children.join('\n')
|
return children.join('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
// el-input innerHTML
|
// el-input innerHTML
|
||||||
function buildElInputChild(conf) {
|
function buildElInputChild(conf) {
|
||||||
const children = []
|
const children = []
|
||||||
if (conf.prepend) {
|
if (conf.prepend) {
|
||||||
children.push(`<template slot="prepend">${conf.prepend}</template>`)
|
children.push(`<template slot="prepend">${conf.prepend}</template>`)
|
||||||
}
|
}
|
||||||
if (conf.append) {
|
if (conf.append) {
|
||||||
children.push(`<template slot="append">${conf.append}</template>`)
|
children.push(`<template slot="append">${conf.append}</template>`)
|
||||||
}
|
}
|
||||||
return children.join('\n')
|
return children.join('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildElSelectChild(conf) {
|
function buildElSelectChild(conf) {
|
||||||
const children = []
|
const children = []
|
||||||
if (conf.options && conf.options.length) {
|
if (conf.options && conf.options.length) {
|
||||||
children.push(`<el-option v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`)
|
children.push(`<el-option v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`)
|
||||||
}
|
}
|
||||||
return children.join('\n')
|
return children.join('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildElRadioGroupChild(conf) {
|
function buildElRadioGroupChild(conf) {
|
||||||
const children = []
|
const children = []
|
||||||
if (conf.options && conf.options.length) {
|
if (conf.options && conf.options.length) {
|
||||||
const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio'
|
const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio'
|
||||||
const border = conf.border ? 'border' : ''
|
const border = conf.border ? 'border' : ''
|
||||||
children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
|
children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
|
||||||
}
|
}
|
||||||
return children.join('\n')
|
return children.join('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildElCheckboxGroupChild(conf) {
|
function buildElCheckboxGroupChild(conf) {
|
||||||
const children = []
|
const children = []
|
||||||
if (conf.options && conf.options.length) {
|
if (conf.options && conf.options.length) {
|
||||||
const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox'
|
const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox'
|
||||||
const border = conf.border ? 'border' : ''
|
const border = conf.border ? 'border' : ''
|
||||||
children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
|
children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`)
|
||||||
}
|
}
|
||||||
return children.join('\n')
|
return children.join('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildElUploadChild(conf) {
|
function buildElUploadChild(conf) {
|
||||||
const list = []
|
const list = []
|
||||||
if (conf['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>')
|
if (conf['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>')
|
||||||
else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${conf.buttonText}</el-button>`)
|
else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${conf.buttonText}</el-button>`)
|
||||||
if (conf.showTip) list.push(`<div slot="tip" class="el-upload__tip">只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件</div>`)
|
if (conf.showTip) list.push(`<div slot="tip" class="el-upload__tip">只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件</div>`)
|
||||||
return list.join('\n')
|
return list.join('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
export function makeUpHtml(conf, type) {
|
export function makeUpHtml(conf, type) {
|
||||||
const htmlList = []
|
const htmlList = []
|
||||||
confGlobal = conf
|
confGlobal = conf
|
||||||
someSpanIsNot24 = conf.fields.some(item => item.span !== 24)
|
someSpanIsNot24 = conf.fields.some(item => item.span !== 24)
|
||||||
conf.fields.forEach(el => {
|
conf.fields.forEach(el => {
|
||||||
htmlList.push(layouts[el.layout](el))
|
htmlList.push(layouts[el.layout](el))
|
||||||
})
|
})
|
||||||
const htmlStr = htmlList.join('\n')
|
const htmlStr = htmlList.join('\n')
|
||||||
|
|
||||||
let temp = buildFormTemplate(conf, htmlStr, type)
|
let temp = buildFormTemplate(conf, htmlStr, type)
|
||||||
if (type === 'dialog') {
|
if (type === 'dialog') {
|
||||||
temp = dialogWrapper(temp)
|
temp = dialogWrapper(temp)
|
||||||
}
|
}
|
||||||
confGlobal = null
|
confGlobal = null
|
||||||
return temp
|
return temp
|
||||||
}
|
}
|
||||||
|
@ -1,236 +1,236 @@
|
|||||||
import { isArray } from 'util'
|
import { isArray } from 'util'
|
||||||
import { exportDefault, titleCase } from '@/utils/index'
|
import { exportDefault, titleCase } from '@/utils/index'
|
||||||
import { trigger } from './config'
|
import { trigger } from './config'
|
||||||
|
|
||||||
const units = {
|
const units = {
|
||||||
KB: '1024',
|
KB: '1024',
|
||||||
MB: '1024 / 1024',
|
MB: '1024 / 1024',
|
||||||
GB: '1024 / 1024 / 1024'
|
GB: '1024 / 1024 / 1024'
|
||||||
}
|
}
|
||||||
let confGlobal
|
let confGlobal
|
||||||
const inheritAttrs = {
|
const inheritAttrs = {
|
||||||
file: '',
|
file: '',
|
||||||
dialog: 'inheritAttrs: false,'
|
dialog: 'inheritAttrs: false,'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function makeUpJs(conf, type) {
|
export function makeUpJs(conf, type) {
|
||||||
confGlobal = conf = JSON.parse(JSON.stringify(conf))
|
confGlobal = conf = JSON.parse(JSON.stringify(conf))
|
||||||
const dataList = []
|
const dataList = []
|
||||||
const ruleList = []
|
const ruleList = []
|
||||||
const optionsList = []
|
const optionsList = []
|
||||||
const propsList = []
|
const propsList = []
|
||||||
const methodList = mixinMethod(type)
|
const methodList = mixinMethod(type)
|
||||||
const uploadVarList = []
|
const uploadVarList = []
|
||||||
|
|
||||||
conf.fields.forEach(el => {
|
conf.fields.forEach(el => {
|
||||||
buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList)
|
buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList)
|
||||||
})
|
})
|
||||||
|
|
||||||
const script = buildexport(
|
const script = buildexport(
|
||||||
conf,
|
conf,
|
||||||
type,
|
type,
|
||||||
dataList.join('\n'),
|
dataList.join('\n'),
|
||||||
ruleList.join('\n'),
|
ruleList.join('\n'),
|
||||||
optionsList.join('\n'),
|
optionsList.join('\n'),
|
||||||
uploadVarList.join('\n'),
|
uploadVarList.join('\n'),
|
||||||
propsList.join('\n'),
|
propsList.join('\n'),
|
||||||
methodList.join('\n')
|
methodList.join('\n')
|
||||||
)
|
)
|
||||||
confGlobal = null
|
confGlobal = null
|
||||||
return script
|
return script
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) {
|
function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) {
|
||||||
buildData(el, dataList)
|
buildData(el, dataList)
|
||||||
buildRules(el, ruleList)
|
buildRules(el, ruleList)
|
||||||
|
|
||||||
if (el.options && el.options.length) {
|
if (el.options && el.options.length) {
|
||||||
buildOptions(el, optionsList)
|
buildOptions(el, optionsList)
|
||||||
if (el.dataType === 'dynamic') {
|
if (el.dataType === 'dynamic') {
|
||||||
const model = `${el.vModel}Options`
|
const model = `${el.vModel}Options`
|
||||||
const options = titleCase(model)
|
const options = titleCase(model)
|
||||||
buildOptionMethod(`get${options}`, model, methodList)
|
buildOptionMethod(`get${options}`, model, methodList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (el.props && el.props.props) {
|
if (el.props && el.props.props) {
|
||||||
buildProps(el, propsList)
|
buildProps(el, propsList)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (el.action && el.tag === 'el-upload') {
|
if (el.action && el.tag === 'el-upload') {
|
||||||
uploadVarList.push(
|
uploadVarList.push(
|
||||||
`${el.vModel}Action: '${el.action}',
|
`${el.vModel}Action: '${el.action}',
|
||||||
${el.vModel}fileList: [],`
|
${el.vModel}fileList: [],`
|
||||||
)
|
)
|
||||||
methodList.push(buildBeforeUpload(el))
|
methodList.push(buildBeforeUpload(el))
|
||||||
if (!el['auto-upload']) {
|
if (!el['auto-upload']) {
|
||||||
methodList.push(buildSubmitUpload(el))
|
methodList.push(buildSubmitUpload(el))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (el.children) {
|
if (el.children) {
|
||||||
el.children.forEach(el2 => {
|
el.children.forEach(el2 => {
|
||||||
buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList)
|
buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function mixinMethod(type) {
|
function mixinMethod(type) {
|
||||||
const list = []; const
|
const list = []; const
|
||||||
minxins = {
|
minxins = {
|
||||||
file: confGlobal.formBtns ? {
|
file: confGlobal.formBtns ? {
|
||||||
submitForm: `submitForm() {
|
submitForm: `submitForm() {
|
||||||
this.$refs['${confGlobal.formRef}'].validate(valid => {
|
this.$refs['${confGlobal.formRef}'].validate(valid => {
|
||||||
if(!valid) return
|
if(!valid) return
|
||||||
// TODO 提交表单
|
// TODO 提交表单
|
||||||
})
|
})
|
||||||
},`,
|
},`,
|
||||||
resetForm: `resetForm() {
|
resetForm: `resetForm() {
|
||||||
this.$refs['${confGlobal.formRef}'].resetFields()
|
this.$refs['${confGlobal.formRef}'].resetFields()
|
||||||
},`
|
},`
|
||||||
} : null,
|
} : null,
|
||||||
dialog: {
|
dialog: {
|
||||||
onOpen: 'onOpen() {},',
|
onOpen: 'onOpen() {},',
|
||||||
onClose: `onClose() {
|
onClose: `onClose() {
|
||||||
this.$refs['${confGlobal.formRef}'].resetFields()
|
this.$refs['${confGlobal.formRef}'].resetFields()
|
||||||
},`,
|
},`,
|
||||||
close: `close() {
|
close: `close() {
|
||||||
this.$emit('update:visible', false)
|
this.$emit('update:visible', false)
|
||||||
},`,
|
},`,
|
||||||
handelConfirm: `handelConfirm() {
|
handleConfirm: `handleConfirm() {
|
||||||
this.$refs['${confGlobal.formRef}'].validate(valid => {
|
this.$refs['${confGlobal.formRef}'].validate(valid => {
|
||||||
if(!valid) return
|
if(!valid) return
|
||||||
this.close()
|
this.close()
|
||||||
})
|
})
|
||||||
},`
|
},`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const methods = minxins[type]
|
const methods = minxins[type]
|
||||||
if (methods) {
|
if (methods) {
|
||||||
Object.keys(methods).forEach(key => {
|
Object.keys(methods).forEach(key => {
|
||||||
list.push(methods[key])
|
list.push(methods[key])
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildData(conf, dataList) {
|
function buildData(conf, dataList) {
|
||||||
if (conf.vModel === undefined) return
|
if (conf.vModel === undefined) return
|
||||||
let defaultValue
|
let defaultValue
|
||||||
if (typeof (conf.defaultValue) === 'string' && !conf.multiple) {
|
if (typeof (conf.defaultValue) === 'string' && !conf.multiple) {
|
||||||
defaultValue = `'${conf.defaultValue}'`
|
defaultValue = `'${conf.defaultValue}'`
|
||||||
} else {
|
} else {
|
||||||
defaultValue = `${JSON.stringify(conf.defaultValue)}`
|
defaultValue = `${JSON.stringify(conf.defaultValue)}`
|
||||||
}
|
}
|
||||||
dataList.push(`${conf.vModel}: ${defaultValue},`)
|
dataList.push(`${conf.vModel}: ${defaultValue},`)
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildRules(conf, ruleList) {
|
function buildRules(conf, ruleList) {
|
||||||
if (conf.vModel === undefined) return
|
if (conf.vModel === undefined) return
|
||||||
const rules = []
|
const rules = []
|
||||||
if (trigger[conf.tag]) {
|
if (trigger[conf.tag]) {
|
||||||
if (conf.required) {
|
if (conf.required) {
|
||||||
const type = isArray(conf.defaultValue) ? 'type: \'array\',' : ''
|
const type = isArray(conf.defaultValue) ? 'type: \'array\',' : ''
|
||||||
let message = isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder
|
let message = isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder
|
||||||
if (message === undefined) message = `${conf.label}不能为空`
|
if (message === undefined) message = `${conf.label}不能为空`
|
||||||
rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`)
|
rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`)
|
||||||
}
|
}
|
||||||
if (conf.regList && isArray(conf.regList)) {
|
if (conf.regList && isArray(conf.regList)) {
|
||||||
conf.regList.forEach(item => {
|
conf.regList.forEach(item => {
|
||||||
if (item.pattern) {
|
if (item.pattern) {
|
||||||
rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`)
|
rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
ruleList.push(`${conf.vModel}: [${rules.join(',')}],`)
|
ruleList.push(`${conf.vModel}: [${rules.join(',')}],`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildOptions(conf, optionsList) {
|
function buildOptions(conf, optionsList) {
|
||||||
if (conf.vModel === undefined) return
|
if (conf.vModel === undefined) return
|
||||||
if (conf.dataType === 'dynamic') { conf.options = [] }
|
if (conf.dataType === 'dynamic') { conf.options = [] }
|
||||||
const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},`
|
const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},`
|
||||||
optionsList.push(str)
|
optionsList.push(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildProps(conf, propsList) {
|
function buildProps(conf, propsList) {
|
||||||
if (conf.dataType === 'dynamic') {
|
if (conf.dataType === 'dynamic') {
|
||||||
conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey)
|
conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey)
|
||||||
conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey)
|
conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey)
|
||||||
conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey)
|
conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey)
|
||||||
}
|
}
|
||||||
const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},`
|
const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},`
|
||||||
propsList.push(str)
|
propsList.push(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildBeforeUpload(conf) {
|
function buildBeforeUpload(conf) {
|
||||||
const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const
|
const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const
|
||||||
returnList = []
|
returnList = []
|
||||||
if (conf.fileSize) {
|
if (conf.fileSize) {
|
||||||
rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize}
|
rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize}
|
||||||
if(!isRightSize){
|
if(!isRightSize){
|
||||||
this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}')
|
this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}')
|
||||||
}`
|
}`
|
||||||
returnList.push('isRightSize')
|
returnList.push('isRightSize')
|
||||||
}
|
}
|
||||||
if (conf.accept) {
|
if (conf.accept) {
|
||||||
acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type)
|
acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type)
|
||||||
if(!isAccept){
|
if(!isAccept){
|
||||||
this.$message.error('应该选择${conf.accept}类型的文件')
|
this.$message.error('应该选择${conf.accept}类型的文件')
|
||||||
}`
|
}`
|
||||||
returnList.push('isAccept')
|
returnList.push('isAccept')
|
||||||
}
|
}
|
||||||
const str = `${conf.vModel}BeforeUpload(file) {
|
const str = `${conf.vModel}BeforeUpload(file) {
|
||||||
${rightSizeCode}
|
${rightSizeCode}
|
||||||
${acceptCode}
|
${acceptCode}
|
||||||
return ${returnList.join('&&')}
|
return ${returnList.join('&&')}
|
||||||
},`
|
},`
|
||||||
return returnList.length ? str : ''
|
return returnList.length ? str : ''
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildSubmitUpload(conf) {
|
function buildSubmitUpload(conf) {
|
||||||
const str = `submitUpload() {
|
const str = `submitUpload() {
|
||||||
this.$refs['${conf.vModel}'].submit()
|
this.$refs['${conf.vModel}'].submit()
|
||||||
},`
|
},`
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildOptionMethod(methodName, model, methodList) {
|
function buildOptionMethod(methodName, model, methodList) {
|
||||||
const str = `${methodName}() {
|
const str = `${methodName}() {
|
||||||
// TODO 发起请求获取数据
|
// TODO 发起请求获取数据
|
||||||
this.${model}
|
this.${model}
|
||||||
},`
|
},`
|
||||||
methodList.push(str)
|
methodList.push(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) {
|
function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) {
|
||||||
const str = `${exportDefault}{
|
const str = `${exportDefault}{
|
||||||
${inheritAttrs[type]}
|
${inheritAttrs[type]}
|
||||||
components: {},
|
components: {},
|
||||||
props: [],
|
props: [],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
${conf.formModel}: {
|
${conf.formModel}: {
|
||||||
${data}
|
${data}
|
||||||
},
|
},
|
||||||
${conf.formRules}: {
|
${conf.formRules}: {
|
||||||
${rules}
|
${rules}
|
||||||
},
|
},
|
||||||
${uploadVar}
|
${uploadVar}
|
||||||
${selectOptions}
|
${selectOptions}
|
||||||
${props}
|
${props}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {},
|
computed: {},
|
||||||
watch: {},
|
watch: {},
|
||||||
created () {},
|
created () {},
|
||||||
mounted () {},
|
mounted () {},
|
||||||
methods: {
|
methods: {
|
||||||
${methods}
|
${methods}
|
||||||
}
|
}
|
||||||
}`
|
}`
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import { saveAs } from 'file-saver'
|
|||||||
|
|
||||||
let downloadLoadingInstance;
|
let downloadLoadingInstance;
|
||||||
// 是否显示重新登录
|
// 是否显示重新登录
|
||||||
let isReloginShow;
|
export let isRelogin = { show: false };
|
||||||
|
|
||||||
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
|
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
|
||||||
// 创建axios实例
|
// 创建axios实例
|
||||||
@ -76,23 +76,20 @@ service.interceptors.response.use(res => {
|
|||||||
return res.data
|
return res.data
|
||||||
}
|
}
|
||||||
if (code === 401) {
|
if (code === 401) {
|
||||||
if (!isReloginShow) {
|
if (!isRelogin.show) {
|
||||||
isReloginShow = true;
|
isRelogin.show = true;
|
||||||
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
|
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
|
||||||
confirmButtonText: '重新登录',
|
confirmButtonText: '重新登录',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
}
|
}
|
||||||
).then(() => {
|
).then(() => {
|
||||||
isReloginShow = false;
|
isRelogin.show = 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;
|
isRelogin.show = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
|
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
|
||||||
|
@ -70,6 +70,9 @@ export function addDateRange(params, dateRange, propName) {
|
|||||||
|
|
||||||
// 回显数据字典
|
// 回显数据字典
|
||||||
export function selectDictLabel(datas, value) {
|
export function selectDictLabel(datas, value) {
|
||||||
|
if (value === undefined) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
var actions = [];
|
var actions = [];
|
||||||
Object.keys(datas).some((key) => {
|
Object.keys(datas).some((key) => {
|
||||||
if (datas[key].value == ('' + value)) {
|
if (datas[key].value == ('' + value)) {
|
||||||
@ -77,23 +80,31 @@ export function selectDictLabel(datas, value) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
if (actions.length === 0) {
|
||||||
|
actions.push(value);
|
||||||
|
}
|
||||||
return actions.join('');
|
return actions.join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 回显数据字典(字符串数组)
|
// 回显数据字典(字符串数组)
|
||||||
export function selectDictLabels(datas, value, separator) {
|
export function selectDictLabels(datas, value, separator) {
|
||||||
if(value === undefined) {
|
if (value === undefined) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
var actions = [];
|
var actions = [];
|
||||||
var currentSeparator = undefined === separator ? "," : separator;
|
var currentSeparator = undefined === separator ? "," : separator;
|
||||||
var temp = value.split(currentSeparator);
|
var temp = value.split(currentSeparator);
|
||||||
Object.keys(value.split(currentSeparator)).some((val) => {
|
Object.keys(value.split(currentSeparator)).some((val) => {
|
||||||
|
var match = false;
|
||||||
Object.keys(datas).some((key) => {
|
Object.keys(datas).some((key) => {
|
||||||
if (datas[key].value == ('' + temp[val])) {
|
if (datas[key].value == ('' + temp[val])) {
|
||||||
actions.push(datas[key].label + currentSeparator);
|
actions.push(datas[key].label + currentSeparator);
|
||||||
|
match = true;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
if (!match) {
|
||||||
|
actions.push(temp[val] + currentSeparator);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
return actions.join('').substring(0, actions.join('').length - 1);
|
return actions.join('').substring(0, actions.join('').length - 1);
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="任务名称" prop="jobName">
|
<el-form-item label="任务名称" prop="jobName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.jobName"
|
v-model="queryParams.jobName"
|
||||||
placeholder="请输入任务名称"
|
placeholder="请输入任务名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="任务组名" prop="jobGroup">
|
<el-form-item label="任务组名" prop="jobGroup">
|
||||||
<el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable size="small">
|
<el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_job_group"
|
v-for="dict in dict.type.sys_job_group"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -21,7 +20,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="任务状态" prop="status">
|
<el-form-item label="任务状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable size="small">
|
<el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_job_status"
|
v-for="dict in dict.type.sys_job_status"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -165,7 +164,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="任务分组" prop="jobGroup">
|
<el-form-item label="任务分组" prop="jobGroup">
|
||||||
<el-select v-model="form.jobGroup" placeholder="请选择">
|
<el-select v-model="form.jobGroup" placeholder="请选择任务分组">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_job_group"
|
v-for="dict in dict.type.sys_job_group"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="任务名称" prop="jobName">
|
<el-form-item label="任务名称" prop="jobName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.jobName"
|
v-model="queryParams.jobName"
|
||||||
placeholder="请输入任务名称"
|
placeholder="请输入任务名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -14,9 +13,8 @@
|
|||||||
<el-form-item label="任务组名" prop="jobGroup">
|
<el-form-item label="任务组名" prop="jobGroup">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="queryParams.jobGroup"
|
v-model="queryParams.jobGroup"
|
||||||
placeholder="请任务组名"
|
placeholder="请选择任务组名"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -32,7 +30,6 @@
|
|||||||
v-model="queryParams.status"
|
v-model="queryParams.status"
|
||||||
placeholder="请选择执行状态"
|
placeholder="请选择执行状态"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -46,7 +43,6 @@
|
|||||||
<el-form-item label="执行时间">
|
<el-form-item label="执行时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="登录地址" prop="ipaddr">
|
<el-form-item label="登录地址" prop="ipaddr">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.ipaddr"
|
v-model="queryParams.ipaddr"
|
||||||
placeholder="请输入登录地址"
|
placeholder="请输入登录地址"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px;"
|
style="width: 240px;"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -16,7 +15,6 @@
|
|||||||
v-model="queryParams.userName"
|
v-model="queryParams.userName"
|
||||||
placeholder="请输入用户名称"
|
placeholder="请输入用户名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px;"
|
style="width: 240px;"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -26,7 +24,6 @@
|
|||||||
v-model="queryParams.status"
|
v-model="queryParams.status"
|
||||||
placeholder="登录状态"
|
placeholder="登录状态"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -40,7 +37,6 @@
|
|||||||
<el-form-item label="登录时间">
|
<el-form-item label="登录时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
|
||||||
<el-form-item label="登录地址" prop="ipaddr">
|
<el-form-item label="登录地址" prop="ipaddr">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.ipaddr"
|
v-model="queryParams.ipaddr"
|
||||||
placeholder="请输入登录地址"
|
placeholder="请输入登录地址"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -15,7 +14,6 @@
|
|||||||
v-model="queryParams.userName"
|
v-model="queryParams.userName"
|
||||||
placeholder="请输入用户名称"
|
placeholder="请输入用户名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="系统模块" prop="title">
|
<el-form-item label="系统模块" prop="title">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.title"
|
v-model="queryParams.title"
|
||||||
placeholder="请输入系统模块"
|
placeholder="请输入系统模块"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px;"
|
style="width: 240px;"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -16,7 +15,6 @@
|
|||||||
v-model="queryParams.operName"
|
v-model="queryParams.operName"
|
||||||
placeholder="请输入操作人员"
|
placeholder="请输入操作人员"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px;"
|
style="width: 240px;"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -26,7 +24,6 @@
|
|||||||
v-model="queryParams.businessType"
|
v-model="queryParams.businessType"
|
||||||
placeholder="操作类型"
|
placeholder="操作类型"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -42,7 +39,6 @@
|
|||||||
v-model="queryParams.status"
|
v-model="queryParams.status"
|
||||||
placeholder="操作状态"
|
placeholder="操作状态"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -56,7 +52,6 @@
|
|||||||
<el-form-item label="操作时间">
|
<el-form-item label="操作时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
|
@ -128,6 +128,10 @@
|
|||||||
<td colspan="1" class="el-table__cell is-leaf"><div class="cell">项目路径</div></td>
|
<td colspan="1" class="el-table__cell is-leaf"><div class="cell">项目路径</div></td>
|
||||||
<td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.userDir }}</div></td>
|
<td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.userDir }}</div></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="1" class="el-table__cell is-leaf"><div class="cell">运行参数</div></td>
|
||||||
|
<td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.inputArgs }}</div></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="参数名称" prop="configName">
|
<el-form-item label="参数名称" prop="configName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.configName"
|
v-model="queryParams.configName"
|
||||||
placeholder="请输入参数名称"
|
placeholder="请输入参数名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -16,13 +15,12 @@
|
|||||||
v-model="queryParams.configKey"
|
v-model="queryParams.configKey"
|
||||||
placeholder="请输入参数键名"
|
placeholder="请输入参数键名"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="系统内置" prop="configType">
|
<el-form-item label="系统内置" prop="configType">
|
||||||
<el-select v-model="queryParams.configType" placeholder="系统内置" clearable size="small">
|
<el-select v-model="queryParams.configType" placeholder="系统内置" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_yes_no"
|
v-for="dict in dict.type.sys_yes_no"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -34,7 +32,6 @@
|
|||||||
<el-form-item label="创建时间">
|
<el-form-item label="创建时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
|
||||||
<el-form-item label="部门名称" prop="deptName">
|
<el-form-item label="部门名称" prop="deptName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.deptName"
|
v-model="queryParams.deptName"
|
||||||
placeholder="请输入部门名称"
|
placeholder="请输入部门名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="部门状态" clearable size="small">
|
<el-select v-model="queryParams.status" placeholder="部门状态" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_normal_disable"
|
v-for="dict in dict.type.sys_normal_disable"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -206,7 +205,7 @@ export default {
|
|||||||
email: [
|
email: [
|
||||||
{
|
{
|
||||||
type: "email",
|
type: "email",
|
||||||
message: "'请输入正确的邮箱地址",
|
message: "请输入正确的邮箱地址",
|
||||||
trigger: ["blur", "change"]
|
trigger: ["blur", "change"]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="字典名称" prop="dictType">
|
<el-form-item label="字典名称" prop="dictType">
|
||||||
<el-select v-model="queryParams.dictType" size="small">
|
<el-select v-model="queryParams.dictType">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in typeOptions"
|
v-for="item in typeOptions"
|
||||||
:key="item.dictId"
|
:key="item.dictId"
|
||||||
@ -16,12 +16,11 @@
|
|||||||
v-model="queryParams.dictLabel"
|
v-model="queryParams.dictLabel"
|
||||||
placeholder="请输入字典标签"
|
placeholder="请输入字典标签"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="数据状态" clearable size="small">
|
<el-select v-model="queryParams.status" placeholder="数据状态" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_normal_disable"
|
v-for="dict in dict.type.sys_normal_disable"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="字典名称" prop="dictName">
|
<el-form-item label="字典名称" prop="dictName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.dictName"
|
v-model="queryParams.dictName"
|
||||||
placeholder="请输入字典名称"
|
placeholder="请输入字典名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -16,7 +15,6 @@
|
|||||||
v-model="queryParams.dictType"
|
v-model="queryParams.dictType"
|
||||||
placeholder="请输入字典类型"
|
placeholder="请输入字典类型"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -26,7 +24,6 @@
|
|||||||
v-model="queryParams.status"
|
v-model="queryParams.status"
|
||||||
placeholder="字典状态"
|
placeholder="字典状态"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -40,7 +37,6 @@
|
|||||||
<el-form-item label="创建时间">
|
<el-form-item label="创建时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
|
||||||
<el-form-item label="菜单名称" prop="menuName">
|
<el-form-item label="菜单名称" prop="menuName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.menuName"
|
v-model="queryParams.menuName"
|
||||||
placeholder="请输入菜单名称"
|
placeholder="请输入菜单名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small">
|
<el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_normal_disable"
|
v-for="dict in dict.type.sys_normal_disable"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="公告标题" prop="noticeTitle">
|
<el-form-item label="公告标题" prop="noticeTitle">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.noticeTitle"
|
v-model="queryParams.noticeTitle"
|
||||||
placeholder="请输入公告标题"
|
placeholder="请输入公告标题"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -15,12 +14,11 @@
|
|||||||
v-model="queryParams.createBy"
|
v-model="queryParams.createBy"
|
||||||
placeholder="请输入操作人员"
|
placeholder="请输入操作人员"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="类型" prop="noticeType">
|
<el-form-item label="类型" prop="noticeType">
|
||||||
<el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable size="small">
|
<el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_notice_type"
|
v-for="dict in dict.type.sys_notice_type"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -135,7 +133,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="公告类型" prop="noticeType">
|
<el-form-item label="公告类型" prop="noticeType">
|
||||||
<el-select v-model="form.noticeType" placeholder="请选择">
|
<el-select v-model="form.noticeType" placeholder="请选择公告类型">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_notice_type"
|
v-for="dict in dict.type.sys_notice_type"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="岗位编码" prop="postCode">
|
<el-form-item label="岗位编码" prop="postCode">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.postCode"
|
v-model="queryParams.postCode"
|
||||||
placeholder="请输入岗位编码"
|
placeholder="请输入岗位编码"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -15,12 +14,11 @@
|
|||||||
v-model="queryParams.postName"
|
v-model="queryParams.postName"
|
||||||
placeholder="请输入岗位名称"
|
placeholder="请输入岗位名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="岗位状态" clearable size="small">
|
<el-select v-model="queryParams.status" placeholder="岗位状态" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_normal_disable"
|
v-for="dict in dict.type.sys_normal_disable"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
|
||||||
<el-form-item label="用户名称" prop="userName">
|
<el-form-item label="用户名称" prop="userName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.userName"
|
v-model="queryParams.userName"
|
||||||
placeholder="请输入用户名称"
|
placeholder="请输入用户名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -16,7 +15,6 @@
|
|||||||
v-model="queryParams.phonenumber"
|
v-model="queryParams.phonenumber"
|
||||||
placeholder="请输入手机号码"
|
placeholder="请输入手机号码"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
|
||||||
<el-form-item label="角色名称" prop="roleName">
|
<el-form-item label="角色名称" prop="roleName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.roleName"
|
v-model="queryParams.roleName"
|
||||||
placeholder="请输入角色名称"
|
placeholder="请输入角色名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -16,7 +15,6 @@
|
|||||||
v-model="queryParams.roleKey"
|
v-model="queryParams.roleKey"
|
||||||
placeholder="请输入权限字符"
|
placeholder="请输入权限字符"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -26,7 +24,6 @@
|
|||||||
v-model="queryParams.status"
|
v-model="queryParams.status"
|
||||||
placeholder="角色状态"
|
placeholder="角色状态"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -40,7 +37,6 @@
|
|||||||
<el-form-item label="创建时间">
|
<el-form-item label="创建时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- 授权用户 -->
|
<!-- 授权用户 -->
|
||||||
<el-dialog title="选择用户" :visible.sync="visible" width="800px" top="5vh" append-to-body>
|
<el-dialog title="选择用户" :visible.sync="visible" width="800px" top="5vh" append-to-body>
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
|
||||||
<el-form-item label="用户名称" prop="userName">
|
<el-form-item label="用户名称" prop="userName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.userName"
|
v-model="queryParams.userName"
|
||||||
placeholder="请输入用户名称"
|
placeholder="请输入用户名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -16,7 +15,6 @@
|
|||||||
v-model="queryParams.phonenumber"
|
v-model="queryParams.phonenumber"
|
||||||
placeholder="请输入手机号码"
|
placeholder="请输入手机号码"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -27,13 +27,12 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<!--用户数据-->
|
<!--用户数据-->
|
||||||
<el-col :span="20" :xs="24">
|
<el-col :span="20" :xs="24">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="用户名称" prop="userName">
|
<el-form-item label="用户名称" prop="userName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.userName"
|
v-model="queryParams.userName"
|
||||||
placeholder="请输入用户名称"
|
placeholder="请输入用户名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -43,7 +42,6 @@
|
|||||||
v-model="queryParams.phonenumber"
|
v-model="queryParams.phonenumber"
|
||||||
placeholder="请输入手机号码"
|
placeholder="请输入手机号码"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
@ -53,7 +51,6 @@
|
|||||||
v-model="queryParams.status"
|
v-model="queryParams.status"
|
||||||
placeholder="用户状态"
|
placeholder="用户状态"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
@ -67,7 +64,6 @@
|
|||||||
<el-form-item label="创建时间">
|
<el-form-item label="创建时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
@ -248,7 +244,7 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="用户性别">
|
<el-form-item label="用户性别">
|
||||||
<el-select v-model="form.sex" placeholder="请选择">
|
<el-select v-model="form.sex" placeholder="请选择性别">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in dict.type.sys_user_sex"
|
v-for="dict in dict.type.sys_user_sex"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
@ -273,7 +269,7 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="岗位">
|
<el-form-item label="岗位">
|
||||||
<el-select v-model="form.postIds" multiple placeholder="请选择">
|
<el-select v-model="form.postIds" multiple placeholder="请选择岗位">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in postOptions"
|
v-for="item in postOptions"
|
||||||
:key="item.postId"
|
:key="item.postId"
|
||||||
@ -286,7 +282,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="角色">
|
<el-form-item label="角色">
|
||||||
<el-select v-model="form.roleIds" multiple placeholder="请选择">
|
<el-select v-model="form.roleIds" multiple placeholder="请选择角色">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in roleOptions"
|
v-for="item in roleOptions"
|
||||||
:key="item.roleId"
|
:key="item.roleId"
|
||||||
@ -443,7 +439,7 @@ export default {
|
|||||||
email: [
|
email: [
|
||||||
{
|
{
|
||||||
type: "email",
|
type: "email",
|
||||||
message: "'请输入正确的邮箱地址",
|
message: "请输入正确的邮箱地址",
|
||||||
trigger: ["blur", "change"]
|
trigger: ["blur", "change"]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -42,7 +42,7 @@ export default {
|
|||||||
{ required: true, message: "邮箱地址不能为空", trigger: "blur" },
|
{ required: true, message: "邮箱地址不能为空", trigger: "blur" },
|
||||||
{
|
{
|
||||||
type: "email",
|
type: "email",
|
||||||
message: "'请输入正确的邮箱地址",
|
message: "请输入正确的邮箱地址",
|
||||||
trigger: ["blur", "change"]
|
trigger: ["blur", "change"]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -1,106 +1,106 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
width="500px"
|
width="500px"
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
:modal-append-to-body="false"
|
:modal-append-to-body="false"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
@open="onOpen"
|
@open="onOpen"
|
||||||
@close="onClose"
|
@close="onClose"
|
||||||
>
|
>
|
||||||
<el-row :gutter="15">
|
<el-row :gutter="15">
|
||||||
<el-form
|
<el-form
|
||||||
ref="elForm"
|
ref="elForm"
|
||||||
:model="formData"
|
:model="formData"
|
||||||
:rules="rules"
|
:rules="rules"
|
||||||
size="medium"
|
size="medium"
|
||||||
label-width="100px"
|
label-width="100px"
|
||||||
>
|
>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="生成类型" prop="type">
|
<el-form-item label="生成类型" prop="type">
|
||||||
<el-radio-group v-model="formData.type">
|
<el-radio-group v-model="formData.type">
|
||||||
<el-radio-button
|
<el-radio-button
|
||||||
v-for="(item, index) in typeOptions"
|
v-for="(item, index) in typeOptions"
|
||||||
:key="index"
|
:key="index"
|
||||||
:label="item.value"
|
:label="item.value"
|
||||||
:disabled="item.disabled"
|
:disabled="item.disabled"
|
||||||
>
|
>
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</el-radio-button>
|
</el-radio-button>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="showFileName" label="文件名" prop="fileName">
|
<el-form-item v-if="showFileName" label="文件名" prop="fileName">
|
||||||
<el-input v-model="formData.fileName" placeholder="请输入文件名" clearable />
|
<el-input v-model="formData.fileName" placeholder="请输入文件名" clearable />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<el-button @click="close">
|
<el-button @click="close">
|
||||||
取消
|
取消
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" @click="handelConfirm">
|
<el-button type="primary" @click="handleConfirm">
|
||||||
确定
|
确定
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
props: ['showFileName'],
|
props: ['showFileName'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
formData: {
|
formData: {
|
||||||
fileName: undefined,
|
fileName: undefined,
|
||||||
type: 'file'
|
type: 'file'
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
fileName: [{
|
fileName: [{
|
||||||
required: true,
|
required: true,
|
||||||
message: '请输入文件名',
|
message: '请输入文件名',
|
||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
}],
|
}],
|
||||||
type: [{
|
type: [{
|
||||||
required: true,
|
required: true,
|
||||||
message: '生成类型不能为空',
|
message: '生成类型不能为空',
|
||||||
trigger: 'change'
|
trigger: 'change'
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
typeOptions: [{
|
typeOptions: [{
|
||||||
label: '页面',
|
label: '页面',
|
||||||
value: 'file'
|
value: 'file'
|
||||||
}, {
|
}, {
|
||||||
label: '弹窗',
|
label: '弹窗',
|
||||||
value: 'dialog'
|
value: 'dialog'
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
},
|
},
|
||||||
watch: {},
|
watch: {},
|
||||||
mounted() {},
|
mounted() {},
|
||||||
methods: {
|
methods: {
|
||||||
onOpen() {
|
onOpen() {
|
||||||
if (this.showFileName) {
|
if (this.showFileName) {
|
||||||
this.formData.fileName = `${+new Date()}.vue`
|
this.formData.fileName = `${+new Date()}.vue`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClose() {
|
onClose() {
|
||||||
},
|
},
|
||||||
close(e) {
|
close(e) {
|
||||||
this.$emit('update:visible', false)
|
this.$emit('update:visible', false)
|
||||||
},
|
},
|
||||||
handelConfirm() {
|
handleConfirm() {
|
||||||
this.$refs.elForm.validate(valid => {
|
this.$refs.elForm.validate(valid => {
|
||||||
if (!valid) return
|
if (!valid) return
|
||||||
this.$emit('confirm', { ...this.formData })
|
this.$emit('confirm', { ...this.formData })
|
||||||
this.close()
|
this.close()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,149 +1,149 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
:modal-append-to-body="false"
|
:modal-append-to-body="false"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
@open="onOpen"
|
@open="onOpen"
|
||||||
@close="onClose"
|
@close="onClose"
|
||||||
>
|
>
|
||||||
<el-row :gutter="0">
|
<el-row :gutter="0">
|
||||||
<el-form
|
<el-form
|
||||||
ref="elForm"
|
ref="elForm"
|
||||||
:model="formData"
|
:model="formData"
|
||||||
:rules="rules"
|
:rules="rules"
|
||||||
size="small"
|
size="small"
|
||||||
label-width="100px"
|
label-width="100px"
|
||||||
>
|
>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item
|
<el-form-item
|
||||||
label="选项名"
|
label="选项名"
|
||||||
prop="label"
|
prop="label"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formData.label"
|
v-model="formData.label"
|
||||||
placeholder="请输入选项名"
|
placeholder="请输入选项名"
|
||||||
clearable
|
clearable
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item
|
<el-form-item
|
||||||
label="选项值"
|
label="选项值"
|
||||||
prop="value"
|
prop="value"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="formData.value"
|
v-model="formData.value"
|
||||||
placeholder="请输入选项值"
|
placeholder="请输入选项值"
|
||||||
clearable
|
clearable
|
||||||
>
|
>
|
||||||
<el-select
|
<el-select
|
||||||
slot="append"
|
slot="append"
|
||||||
v-model="dataType"
|
v-model="dataType"
|
||||||
:style="{width: '100px'}"
|
:style="{width: '100px'}"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="(item, index) in dataTypeOptions"
|
v-for="(item, index) in dataTypeOptions"
|
||||||
:key="index"
|
:key="index"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:value="item.value"
|
:value="item.value"
|
||||||
:disabled="item.disabled"
|
:disabled="item.disabled"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-row>
|
</el-row>
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handelConfirm"
|
@click="handleConfirm"
|
||||||
>
|
>
|
||||||
确定
|
确定
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button @click="close">
|
<el-button @click="close">
|
||||||
取消
|
取消
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { isNumberStr } from '@/utils/index'
|
import { isNumberStr } from '@/utils/index'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {},
|
components: {},
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
props: [],
|
props: [],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
id: 100,
|
id: 100,
|
||||||
formData: {
|
formData: {
|
||||||
label: undefined,
|
label: undefined,
|
||||||
value: undefined
|
value: undefined
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
label: [
|
label: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: '请输入选项名',
|
message: '请输入选项名',
|
||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
value: [
|
value: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: '请输入选项值',
|
message: '请输入选项值',
|
||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
dataType: 'string',
|
dataType: 'string',
|
||||||
dataTypeOptions: [
|
dataTypeOptions: [
|
||||||
{
|
{
|
||||||
label: '字符串',
|
label: '字符串',
|
||||||
value: 'string'
|
value: 'string'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '数字',
|
label: '数字',
|
||||||
value: 'number'
|
value: 'number'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {},
|
computed: {},
|
||||||
watch: {
|
watch: {
|
||||||
// eslint-disable-next-line func-names
|
// eslint-disable-next-line func-names
|
||||||
'formData.value': function (val) {
|
'formData.value': function (val) {
|
||||||
this.dataType = isNumberStr(val) ? 'number' : 'string'
|
this.dataType = isNumberStr(val) ? 'number' : 'string'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {},
|
created() {},
|
||||||
mounted() {},
|
mounted() {},
|
||||||
methods: {
|
methods: {
|
||||||
onOpen() {
|
onOpen() {
|
||||||
this.formData = {
|
this.formData = {
|
||||||
label: undefined,
|
label: undefined,
|
||||||
value: undefined
|
value: undefined
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClose() {},
|
onClose() {},
|
||||||
close() {
|
close() {
|
||||||
this.$emit('update:visible', false)
|
this.$emit('update:visible', false)
|
||||||
},
|
},
|
||||||
handelConfirm() {
|
handleConfirm() {
|
||||||
this.$refs.elForm.validate(valid => {
|
this.$refs.elForm.validate(valid => {
|
||||||
if (!valid) return
|
if (!valid) return
|
||||||
if (this.dataType === 'number') {
|
if (this.dataType === 'number') {
|
||||||
this.formData.value = parseFloat(this.formData.value)
|
this.formData.value = parseFloat(this.formData.value)
|
||||||
}
|
}
|
||||||
this.formData.id = this.id++
|
this.formData.id = this.id++
|
||||||
this.$emit('commit', this.formData)
|
this.$emit('commit', this.formData)
|
||||||
this.close()
|
this.close()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -159,7 +159,7 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
const tableId = this.$route.query && this.$route.query.tableId;
|
const tableId = this.$route.params && this.$route.params.tableId;
|
||||||
if (tableId) {
|
if (tableId) {
|
||||||
// 获取表详细信息
|
// 获取表详细信息
|
||||||
getGenTable(tableId).then(res => {
|
getGenTable(tableId).then(res => {
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- 导入表 -->
|
<!-- 导入表 -->
|
||||||
<el-dialog title="导入表" :visible.sync="visible" width="800px" top="5vh" append-to-body>
|
<el-dialog title="导入表" :visible.sync="visible" width="800px" top="5vh" append-to-body>
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
|
||||||
<el-form-item label="表名称" prop="tableName">
|
<el-form-item label="表名称" prop="tableName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.tableName"
|
v-model="queryParams.tableName"
|
||||||
placeholder="请输入表名称"
|
placeholder="请输入表名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -16,7 +15,6 @@
|
|||||||
v-model="queryParams.tableComment"
|
v-model="queryParams.tableComment"
|
||||||
placeholder="请输入表描述"
|
placeholder="请输入表描述"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="表名称" prop="tableName">
|
<el-form-item label="表名称" prop="tableName">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.tableName"
|
v-model="queryParams.tableName"
|
||||||
placeholder="请输入表名称"
|
placeholder="请输入表名称"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -15,14 +14,12 @@
|
|||||||
v-model="queryParams.tableComment"
|
v-model="queryParams.tableComment"
|
||||||
placeholder="请输入表描述"
|
placeholder="请输入表描述"
|
||||||
clearable
|
clearable
|
||||||
size="small"
|
|
||||||
@keyup.enter.native="handleQuery"
|
@keyup.enter.native="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="创建时间">
|
<el-form-item label="创建时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
size="small"
|
|
||||||
style="width: 240px"
|
style="width: 240px"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
@ -321,7 +318,7 @@ export default {
|
|||||||
/** 修改按钮操作 */
|
/** 修改按钮操作 */
|
||||||
handleEditTable(row) {
|
handleEditTable(row) {
|
||||||
const tableId = row.tableId || this.ids[0];
|
const tableId = row.tableId || this.ids[0];
|
||||||
this.$router.push({ path: '/tool/gen-edit/index', query: { tableId: tableId, pageNum: this.queryParams.pageNum } });
|
this.$router.push({ path: '/tool/gen-edit/index/' + tableId, query: { pageNum: this.queryParams.pageNum } });
|
||||||
},
|
},
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
handleDelete(row) {
|
handleDelete(row) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user