Commit 7ecf11bd by guanguan1009

增加转换进度展示

parent e9650d7c
...@@ -64,7 +64,30 @@ ...@@ -64,7 +64,30 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId> <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!-- servlet依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat的支持.-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
......
...@@ -29,11 +29,11 @@ public class AppListener implements ApplicationListener<ContextRefreshedEvent> { ...@@ -29,11 +29,11 @@ public class AppListener implements ApplicationListener<ContextRefreshedEvent> {
@Override @Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
System.err.println("正在处理 " + filepath); /*System.err.println("正在处理 " + filepath);
System.err.println("处理开始 " + LocalDateTime.now()); System.err.println("处理开始 " + LocalDateTime.now());
converterService.converterPdf2Pptx(filepath); converterService.converterPdf2Pptx(filepath);
System.err.println("处理完成 " + LocalDateTime.now()); System.err.println("处理完成 " + LocalDateTime.now());
JOptionPane.showMessageDialog(new JFrame().getContentPane(), JOptionPane.showMessageDialog(new JFrame().getContentPane(),
"文件转换完成!", "提示", JOptionPane.INFORMATION_MESSAGE); "文件转换完成!", "提示", JOptionPane.INFORMATION_MESSAGE);*/
} }
} }
package com.jtyjy.pdf2pptx.application;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class AppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.err.println("项目启动后=====================");
try {
Runtime.getRuntime().exec("cmd /c start http://localhost:8080/login");
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.jtyjy.pdf2pptx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/checkcenter")
public class CheckCenterController {
//页面请求
@GetMapping("/socket/{cid}")
public Object socket(@PathVariable String cid) {
ModelAndView mav=new ModelAndView("/websocket");
mav.addObject("sid", cid);
return mav;
}
//推送数据接口
@ResponseBody
@RequestMapping("/socket/push/{cid}")
public Object pushToWeb(@PathVariable String cid,String message) {
Map<Object, Object> map = new HashMap<>();
try {
WebSocketServer.sendInfo(message,cid);
} catch (IOException e) {
e.printStackTrace();
map.put("code", -1);
map.put("msg", cid + "#" + e.getMessage());
return map;
}
map.put("code", 0);
return map;
}
}
package com.jtyjy.pdf2pptx.controller;
import com.jtyjy.pdf2pptx.service.ConverterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class ConvertController {
@Autowired
private ConverterService converterService;
@PostMapping("/file/convert")
public Object convert(String filePath){
long totalTime = converterService.converterPdf2Pptx(filePath);
Map<String,Object> data = new HashMap();
data.put("code",0);
data.put("message","文件转换完成,耗时:"+totalTime+"ms");
return data;
}
}
package com.jtyjy.pdf2pptx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
@RequestMapping("/login")
public String login(Model m) {
m.addAttribute("name", "guan");
return "login";
}
}
package com.jtyjy.pdf2pptx.controller;
import com.jtyjy.pdf2pptx.support.PdfTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
@ServerEndpoint("/websocket")
@Component
public class WebSocketServer {
private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
//接收sid
private String sid="";
/**
* 连接建立成功调用的方法*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
//加入set中
webSocketSet.add(this);
//在线数加1
addOnlineCount();
log.info("有新窗口开始监听:"+sid+",当前在线人数为" + getOnlineCount());
this.sid=sid;
try {
sendMessage("连接成功");
} catch (IOException e) {
log.error("websocket IO异常");
}
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
webSocketSet.remove(this); //从set中删除
subOnlineCount(); //在线数减1
log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("收到来自窗口"+sid+"的信息:"+message);
//群发消息
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage("服务器发送:"+message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
* 群发自定义消息
* */
public static void sendInfo(String message,@PathParam("sid") String sid) throws IOException {
log.info("推送消息到窗口"+sid+",推送内容:"+message);
for (WebSocketServer item : webSocketSet) {
try {
//这里可以设定只推送给这个sid的,为null则全部推送
if(sid==null) {
item.sendMessage(message);
}else if(item.sid.equals(sid)){
item.sendMessage(message);
}
item.sendMessage(message);
} catch (IOException e) {
continue;
}
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketServer.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketServer.onlineCount--;
}
}
...@@ -2,6 +2,7 @@ package com.jtyjy.pdf2pptx.converter; ...@@ -2,6 +2,7 @@ package com.jtyjy.pdf2pptx.converter;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.jtyjy.pdf2pptx.application.ShutdownContext; import com.jtyjy.pdf2pptx.application.ShutdownContext;
import com.jtyjy.pdf2pptx.controller.WebSocketServer;
import com.jtyjy.pdf2pptx.support.Constant; import com.jtyjy.pdf2pptx.support.Constant;
import com.jtyjy.pdf2pptx.support.FileUtil; import com.jtyjy.pdf2pptx.support.FileUtil;
import com.jtyjy.pdf2pptx.support.PdfTask; import com.jtyjy.pdf2pptx.support.PdfTask;
...@@ -10,9 +11,11 @@ import org.slf4j.LoggerFactory; ...@@ -10,9 +11,11 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.swing.*; import javax.swing.*;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
...@@ -38,27 +41,37 @@ public class Pdf2Pptx { ...@@ -38,27 +41,37 @@ public class Pdf2Pptx {
private static ExecutorService executorService; private static ExecutorService executorService;
public static Integer totalPdf = 0;
public static transient Integer finishPdf = 0;
@Autowired @Autowired
private ShutdownContext shutdownContext; private RestTemplate restTemplate;
public void converte(String path) { public long converte(String path) {
conver(path, null); return conver(path, this);
// shutdownContext.initiateShutdown(0); // shutdownContext.initiateShutdown(0);
} }
private static void conver(String path, ConfigurableApplicationContext context) { private static long conver(String path, Pdf2Pptx pdf2Pptx) {
System.setProperty("java.awt.headless","false"); long totalTime = 0L;
System.setProperty("java.awt.headless", "false");
//读取指定文件夹下所有文件并转换为图片 //读取指定文件夹下所有文件并转换为图片
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
List<String> allFilePathName = new ArrayList<>(); List<String> allFilePathName = new ArrayList<>();
FileUtil.getAllFilePathNameRe(path, allFilePathName); FileUtil.getAllFilePathNameRe(path, allFilePathName);
//判断图片是否存在
List<String> allFilePathName2 = new ArrayList<>();
FileUtil.getAllFilePathNameRe(path, allFilePathName2);
for (String filePathName : allFilePathName) {
if (filePathName.endsWith(".pdf")&&!allFilePathName2.contains(filePathName.replace(".pdf", ".pptx"))) {
totalPdf++;
}
}
logger.info("待转换pdf总数:{}", totalPdf);
for (String filePathName : allFilePathName) { for (String filePathName : allFilePathName) {
File file = new File(filePathName); File file = new File(filePathName);
if (file.getName().endsWith(".pdf")) { if (file.getName().endsWith(".pdf")) {
//判断图片是否存在
List<String> allFilePathName2 = new ArrayList<>();
FileUtil.getAllFilePathNameRe(path, allFilePathName2);
if (!allFilePathName2.contains(file.getAbsolutePath().replace(".pdf", ".pptx"))) { if (!allFilePathName2.contains(file.getAbsolutePath().replace(".pdf", ".pptx"))) {
logger.info("转换pdf:{} 为图片开始", file.getAbsolutePath()); logger.info("转换pdf:{} 为图片开始", file.getAbsolutePath());
long begin = System.currentTimeMillis(); long begin = System.currentTimeMillis();
...@@ -71,13 +84,22 @@ public class Pdf2Pptx { ...@@ -71,13 +84,22 @@ public class Pdf2Pptx {
executorService.shutdown(); executorService.shutdown();
exeFlag = false; exeFlag = false;
System.out.println("转换图片已经完成"); System.out.println("转换图片已经完成");
Pdf2Pptx.finishPdf++;
logger.info("已转换pdf数量:{}", Pdf2Pptx.finishPdf);
//发送消息
try {
Double message = (Double.valueOf(finishPdf) / (Double.valueOf(totalPdf) * Double.valueOf(2)))*Double.valueOf(100);
pdf2Pptx.restTemplate.getForObject( "http://localhost:8080/checkcenter/socket/push/1994?message="+message, Object.class);
} catch (Exception e) {
logger.error("推送消息出错:", e);
}
} }
} }
exeFlag = true; exeFlag = true;
try { try {
Thread.sleep(2000); Thread.sleep(2000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
logger.error("错误:{}", e); logger.error("错误:", e);
} }
} else { } else {
logger.info("文件:{} 已经转换", file.getAbsolutePath()); logger.info("文件:{} 已经转换", file.getAbsolutePath());
...@@ -100,7 +122,7 @@ public class Pdf2Pptx { ...@@ -100,7 +122,7 @@ public class Pdf2Pptx {
ExecutorService executorService = Executors.newFixedThreadPool(4); ExecutorService executorService = Executors.newFixedThreadPool(4);
for (int i = 1; i <= 4; i++) { for (int i = 1; i <= 4; i++) {
if (allot.get(String.valueOf(i)) != null) { if (allot.get(String.valueOf(i)) != null) {
executorService.execute(new PdfTask(allot.get(String.valueOf(i)), path)); executorService.execute(new PdfTask(allot.get(String.valueOf(i)), path,pdf2Pptx.restTemplate));
} }
} }
try { try {
...@@ -117,13 +139,16 @@ public class Pdf2Pptx { ...@@ -117,13 +139,16 @@ public class Pdf2Pptx {
} }
} }
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
logger.info("总耗时:{}ms", endTime - startTime); totalTime = endTime - startTime;
logger.info("总耗时:{}ms", totalTime);
//删除所有生成的图片文件 //删除所有生成的图片文件
for (String dirPathName : allDirPathName) { for (String dirPathName : allDirPathName) {
if (dirPathName.endsWith("_图片") && FileUtil.delFolder(dirPathName)) { if (dirPathName.endsWith("_图片") && FileUtil.delFolder(dirPathName)) {
logger.info("删除文件夹:{}及其文件成功", dirPathName); logger.info("删除文件夹:{}及其文件成功", dirPathName);
} }
} }
pdf2Pptx.restTemplate.getForObject( "http://localhost:8080/checkcenter/socket/push/1994?message="+100, Object.class);
return totalTime;
} }
/** /**
...@@ -154,8 +179,8 @@ public class Pdf2Pptx { ...@@ -154,8 +179,8 @@ public class Pdf2Pptx {
} }
public static void main(String[] args) { public static void main(String[] args) {
int processors = Runtime.getRuntime().availableProcessors(); double message = (Double.valueOf(1) / (Double.valueOf(3) * Double.valueOf(2))*Double.valueOf(100));
System.out.println(processors); System.out.println(message);
} }
} }
...@@ -19,11 +19,7 @@ public class Png2Pptx { ...@@ -19,11 +19,7 @@ public class Png2Pptx {
private static final Logger logger = LoggerFactory.getLogger(Png2Pptx.class); private static final Logger logger = LoggerFactory.getLogger(Png2Pptx.class);
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
// XSLFTextBox textBox = slide.createTextBox();
// textBox.setAnchor(new Rectangle2D.Double(10,10, 0, 0));
// textBox.addNewTextParagraph().addNewTextRun().setText("创建幻灯片");
// createPicturePptx();
} }
public static void createPicturePptx(List<String> filePathNames,File dir) { public static void createPicturePptx(List<String> filePathNames,File dir) {
......
...@@ -6,6 +6,6 @@ public interface ConverterService { ...@@ -6,6 +6,6 @@ public interface ConverterService {
* 转换pdf为pptx * 转换pdf为pptx
* @param path 待读取文件根目录 * @param path 待读取文件根目录
*/ */
void converterPdf2Pptx(String path); long converterPdf2Pptx(String path);
} }
...@@ -12,7 +12,7 @@ public class ConverterServiceImpl implements ConverterService { ...@@ -12,7 +12,7 @@ public class ConverterServiceImpl implements ConverterService {
private Pdf2Pptx pdf2Pptx; private Pdf2Pptx pdf2Pptx;
@Override @Override
public void converterPdf2Pptx(String path) { public long converterPdf2Pptx(String path) {
pdf2Pptx.converte(path); return pdf2Pptx.converte(path);
} }
} }
package com.jtyjy.pdf2pptx.support; package com.jtyjy.pdf2pptx.support;
import com.jtyjy.pdf2pptx.converter.Pdf2Pptx;
import com.jtyjy.pdf2pptx.converter.Png2Pptx; import com.jtyjy.pdf2pptx.converter.Png2Pptx;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.web.client.RestTemplate;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -16,6 +18,8 @@ public class PdfTask implements Runnable { ...@@ -16,6 +18,8 @@ public class PdfTask implements Runnable {
private String path; private String path;
private RestTemplate restTemplate;
@Override @Override
public void run() { public void run() {
for (String dirPathName : allDirPathName) { for (String dirPathName : allDirPathName) {
...@@ -35,6 +39,14 @@ public class PdfTask implements Runnable { ...@@ -35,6 +39,14 @@ public class PdfTask implements Runnable {
} else { } else {
logger.info("文件:{} 已经存在", dir.getName() + ".pptx"); logger.info("文件:{} 已经存在", dir.getName() + ".pptx");
} }
Pdf2Pptx.finishPdf++;
//发送消息
try {
Double message = (Double.valueOf(Pdf2Pptx.finishPdf) / (Double.valueOf(Pdf2Pptx.totalPdf) * Double.valueOf(2)))*Double.valueOf(100);
restTemplate.getForObject( "http://localhost:8080/checkcenter/socket/push/1994?message="+message, Object.class);
} catch (Exception e) {
logger.error("推送消息出错:", e);
}
} }
} }
...@@ -45,8 +57,10 @@ public class PdfTask implements Runnable { ...@@ -45,8 +57,10 @@ public class PdfTask implements Runnable {
} }
public PdfTask(List<String> allDirPathName, String path) {
public PdfTask(List<String> allDirPathName, String path,RestTemplate restTemplate) {
this.allDirPathName = allDirPathName; this.allDirPathName = allDirPathName;
this.path = path; this.path = path;
this.restTemplate = restTemplate;
} }
} }
package com.jtyjy.pdf2pptx.support;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setReadTimeout(600000);
return factory;
}
}
package com.jtyjy.pdf2pptx.support;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* 开启WebSocket支持
* @author guan
*/
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
...@@ -2,13 +2,5 @@ ...@@ -2,13 +2,5 @@
file: file:
path: D:\\document path: D:\\document
#启用shutdown #设置静态资源路径,多个以逗号分隔
management: spring.resources.static-locations: classpath:static/,file:static/
endpoint:
shutdown:
enabled: true
endpoints:
web:
exposure:
include: shutdown,info,health
base-path: /manage
layui.use('form', function(){
var form = layui.form
//自定义验证规则
form.verify({
qudaoName: [/^(?!_)(?!.*?_$)[_a-zA-Z0-9_\u4e00-\u9fa5]{2,20}$/, '请输入正确格式!'],
qudaoEmail: function(value, item){ //value:表单的值、item:表单的DOM对象
if(value != null && value != ""){
if(!/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(value)){
return '请输入正确格式!';
}
}
},
reason: function(value, item){ //value:表单的值、item:表单的DOM对象
if(value != null && value != ""){
if(!/^(?!_)(?!.*?_$)[,,\.\-、;;\::\"\'!!_a-zA-Z0-9_\u4e00-\u9fa5]{1,50}$/.test(value)){
return '请输入正确格式!';
}
}
}
});
});
var ValidateUtils = {
checkMobile:function(umobile){
if(umobile==''|| $.trim(umobile).length==0){
return "请输入手机号 ";
}
if($.trim(umobile).length!=11 || !umobile.match(/^1\d{10}$/)){
$("input[name='mobile']").val("");
$("input[name='mobile']").focus();
return "您输入的手机号格式有误,请重新输入";
}
return "ok";
},
checkPassword : function(password){
if(password==''|| $.trim(password).length==0){
$("input[name='password']").val("");
$("input[name='password']").focus();
return "请输入密码";
}
if(!password.match(/^(?![A-Z]+$)(?![a-z]+$)(?!\d+$)(?![\W_]+$)[^\u4e00-\u9fa5]\S{6,16}$/)){
$("input[name='password']").val("");
$("input[name='password']").focus();
return "密码由大写字母、小写字母、数字和字符,两种或两种以上6-16位组成";
}
return "ok";
},
checkSimplePassword : function(password){
if(!password.match(/^[0-9_a-zA-Z]{6,20}$/)){
$("input[name='password']").val("");
$("input[name='password']").focus();
return "密码格式不正确!";
}
return "ok";
},
checkCode : function(code){
if(code==''|| $.trim(code).length==0){
$("input[name='smsCode']").val("");
$("input[name='smsCode']").focus();
return "请您输入验证码";
}
if(!code.match(/^[0-9]{6}$/)){
$("input[name='smsCode']").val("");
$("input[name='smsCode']").focus();
return "您输入的验证码格式有误,请重新输入";
}
return "ok";
},
checkPicCode : function(code){
if(code==''|| $.trim(code).length==0){
$("input[name='code']").val("");
$("input[name='code']").focus();
return "请您输入验证码";
}
if(!code.match(/\w{4}$/)){
$("input[name='code']").val("");
$("input[name='code']").focus();
return "您输入的验证码格式有误,请重新输入";
}
return "ok";
},
checkUserName :function(username){
if(username==''|| $.trim(username).length==0){
return "用户名不能为空,请重新填写";
}
if(!username.match(/^(?!_)(?!.*?_$)[,,\.\-、;;\::\"\'!!_a-zA-Z0-9_\u4e00-\u9fa5]{2,25}$/)){
$("input[name='userName']").val("");
$("input[name='userName']").focus();
return "您输入的用户名格式有误,请重新输入!";
}
return "ok";
},
checkRoleCode :function(code){
if(code==''|| $.trim(code).length==0){
return "角色编号不能为空,请重新填写";
}
if(!code.match(/^(?!_)(?!.*?_$)[,,\.\-、;;\::\"\'!!_a-zA-Z0-9_\u4e00-\u9fa5]{2,25}$/)){
$("input[name='userName']").val("");
$("input[name='userName']").focus();
return "您输入的角色编号格式有误,请重新输入!";
}
return "ok";
},
checkRoleName :function(roleName){
if(roleName==''|| $.trim(roleName).length==0){
return "角色名称不能为空,请重新填写";
}
if(!roleName.match(/^(?!_)(?!.*?_$)[,,\.\-、;;\::\"\'!!_a-zA-Z0-9_\u4e00-\u9fa5]{2,25}$/)){
$("input[name='userName']").val("");
$("input[name='userName']").focus();
return "您输入的角色名称格式有误,请重新输入!";
}
return "ok";
},
checkTitle :function(title){
if(title==''|| $.trim(title).length==0){
return "标题不能为空,请重新填写";
}
if(!title.match(/^(?!_)(?!.*?_$)[,,\.\-、;;\::\"\'!!_a-zA-Z0-9_\u4e00-\u9fa5]{1,30}$/)){
$("input[name='userName']").val("");
$("input[name='userName']").focus();
return "您输入的标题格式有误,请重新输入!";
}
return "ok";
},
checkCardID:function(cardID){
if(cardID==''|| $.trim(cardID).length==0){
return "请输入身份证号 ";
}
if($.trim(cardID).length!=18 && $.trim(cardID).length!=15){
$("input[name='inputCardID']").val("");
$("input[name='inputCardID']").focus();
return "您输入的身份证号有误,请重新输入";
}
///^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
if(!cardID.match(/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/)){
$("input[name='inputCardID']").val("");
$("input[name='inputCardID']").focus();
return "您输入的身份证号有误,请重新输入";
}
return "ok";
},
checkBankCode:function(bankcode){
if(bankcode==''|| $.trim(bankcode).length==0){
return "请输入银行卡号 ";
}
if($.trim(bankcode).length!=19 && $.trim(bankcode).length!=16){
$("#bankcode").val("");
$("#bankcode").focus();
return "您输入的银行卡号有误";
}
if(!bankcode.match(/(([1-9])[\d]{18})|([1-9])[\d]{15}/)){
$("#bankcode").val("");
$("#bankcode").focus();
return "您输入的银行卡号有误";
}
return "ok";
},
checkQQ:function(iqq){
if(iqq==''|| $.trim(iqq).length==0){
return "请输入QQ信息 ";
}
if(!iqq.match(/^[1-9][0-9]{4,12}/)){
$("input[name='iqq']").val("");
$("input[name='iqq']").focus();
return "您输入的QQ格式有误,请重新输入!";
}
return "ok";
},
checkEmail:function(email){
if(email==''|| $.trim(email).length==0){
return "请输入邮箱 ";
}
///^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/
//return !email.match(/^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$/);
if(!email.match(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/)){
$("input[name='email']").val("");
$("input[name='email']").focus();
return "您输入的邮箱格式有误,请重新输入!";
}
return "ok";
},
checkWeixin:function(weixin){
if(weixin==''|| $.trim(weixin).length<1){
return "请您输入的微信号 ";
}
//^[a-zA-Z]{1}[-_a-zA-Z0-9]{5,19}$/
if(!weixin.match(/^[a-zA-Z]{1}[-_a-zA-Z0-9]{5,19}$/)){
$("input[name='wxmpNum']").val("");
$("input[name='wxmpNum']").focus();
return "您输入的微信号格式有误,请重新输入!";
}
return "ok";
},
checkDescript:function(reqDesc){
if(!reqDesc.match(/^(?!_)(?!.*?_$)[,,\。\-.、;;\::\"\'!!\%+??\s_a-zA-Z0-9_\u4e00-\u9fa5]{1,300}$/)){
$("input[name='descript']").val("");
$("input[name='descript']").focus();
return "您最多可以输入300字,请精简后再次提交!";
}
return "ok";
},
//输入金额正则校验 -- ^((/^([1-9]\d*|0)(\.\d{1,2})?$/))$ 正整数、小数点后两位
checkMoney:function(money){
if(money==''|| $.trim(money).length==0){
return "请输入微信公众号价格 ";
}
if(!money.match(/^([1-9]\d*|0)(\.\d{1,2})?$/)){
$("input[name='wprice']").val("");
$("input[name='wprice']").focus();
return "您输入的价格有误,请重新输入!";
}
return "ok";
}
}
\ No newline at end of file
/**
* 公用的js函数文件
*/
/**
* 伪造http referer信息
* 用 document.all 来判断当前的浏览器是否是IE, 如果是的话就生成一个link,
* 然后自动执行 onclick 事件,如果不是的话就用JS 跳转。这样在处理页面就可以得到 HTTP_REFERER
* @param url
*/
function referURL(url){
var isIe=(document.all)?true:false;
//console.info("isIe:"+isIe);
if(isIe) {
var linka = document.createElement('a');
linka.href=url;
document.body.appendChild(linka);
linka.click();
}
}
/**
* 唯一标识 指定长度和基数
*/
function generateUUID(len, radix) {
var timeData = new Date().getTime();
var chars = ('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz').split('');
var uuid = [], i;
radix = radix || chars.length;
if (len) {
// Compact form
for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random()*radix)];
} else {
// rfc4122, version 4 form
var r;
// rfc4122 requires these characters
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
// Fill in random data. At i==19 set the high bits of clock sequence as
// per rfc4122, sec. 4.1.5
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | (Math.random()*16);
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
return uuid.join('');
}
/**
* GUID是一种由算法生成的二进制长度为128位的数字标识符。
* GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,
* 其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。
* @returns {string}
*/
function uuid() {
var d = new Date().getTime();
//var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var uuid = 'xxxx-yxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
return (c=='x' ? r : (r&0x3|0x8)).toString(16);
});
return uuid;
};
//货币格式化
//Extend the default Number object with a formatMoney() method:
//usage: someVar.formatMoney(decimalPlaces, symbol, thousandsSeparator, decimalSeparator)
//defaults: (2, "$", ",", ".")
Number.prototype.formatMoney = function (places, symbol, thousand, decimal) {
places = !isNaN(places = Math.abs(places)) ? places : 2;
symbol = symbol !== undefined ? symbol : "$";
thousand = thousand || ",";
decimal = decimal || ".";
var number = this,
negative = number < 0 ? "-" : "",
i = parseInt(number = Math.abs(+number || 0).toFixed(places), 10) + "",
j = (j = i.length) > 3 ? j % 3 : 0;
return symbol + negative + (j ? i.substr(0, j) + thousand : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousand) + (places ? decimal + Math.abs(number - i).toFixed(places).slice(2) : "");
};
/**
* 判断是否登录,没登录刷新当前页,促使Shiro拦截后跳转登录页
* @param result ajax请求返回的值
* @returns {如果没登录,刷新当前页}
*/
function isLogin(result){
if(result && result.code && (result.code == '1101' || result.code=='1102')){
window.location.reload(true);//刷新当前页
}
return true;//返回true
}
/**
* 获取get请求参数
* @param name
* @returns
*/
function GetQueryString(name){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var search=window.location.search;
if(search!=null && search!=""){
var r = search.substr(1).match(reg);
if(r!=null){
return unescape(r[2]);
}
}
return null;
}
/**
* 获取菜单uri
* @returns
*/
function getCallback(){
var pathname = window.location.pathname;
var param=GetQueryString("callback");
//console.log("pathname:"+pathname);
//console.log("param:"+param);
if(param!=null && param != ""){
return param;
}else{
return pathname;
}
}
/**
* 针对不同的错误可结合业务自定义处理方式
* @param result
* @returns {Boolean}
*/
function isError(result){
var flag=true;
if(result && result.status){
flag=false;
if(result.status == '-1' || result.status=='-101' || result.status=='400' || result.status=='404' || result.status=='500'){
layer.alert(result.data);
}else if(result.status=='403'){
layer.alert(result.data,function(){
//跳转到未授权界面
window.location.href="/403";
});
}
}
return flag;//返回true
}
\ No newline at end of file
/**
*
* @项目名称:wupao-mbweb
* @文件名称:wupao-utils
* @类描述:js时间转换工具类
* @创建时间:2015年12月23日
*/
var DateUtils = {
/**
* @描述:获取当前时间毫秒数
* @创建时间:2015年12月23日
*/
getCurrentMsTime : function() {
var myDate = new Date();
return myDate.getTime();
},
/**
* @描述:转换日期格式yyyy-MM-dd HH:mm:ss
* @创建时间:2015年12月23日
*/
formatDate : function(dateTime) {
return this.formatterDateTime(dateTime);
},
/**
* @描述:时间格式转毫秒
* @创建时间:2015年12月23日
*/
dateToLongMsTime : function(date) {
return date.getTime();
},
/**
* @描述:格式化日期(不含时间)
* @创建时间:2015年12月23日
*/
formatterDate : function(date) {
var datetime = this.getGMTTime(date);
var result = datetime.getFullYear()
+ "-"// "年"
+ ((datetime.getMonth() + 1) >= 10 ? (datetime.getMonth() + 1)
: "0" + (datetime.getMonth() + 1))
+ "-"// "月"
+ (datetime.getDate() < 10 ? "0" + datetime.getDate()
: datetime.getDate());
return result;
},
/**
* @描述:格式化日期(含时间"00:00:00")
* @创建时间:2015年12月23日
*/
formatterDate2 : function(date) {
var datetime = this.getGMTTime(date);
var result = datetime.getFullYear()
+ "-"// "年"
+ ((datetime.getMonth() + 1) >= 10 ? (datetime.getMonth() + 1)
: "0" + (datetime.getMonth() + 1))
+ "-"// "月"
+ (datetime.getDate() < 10 ? "0" + datetime.getDate()
: datetime.getDate()) + " " + "00:00:00";
return result;
},
/**
* @描述:格式化去日期(含时间)
* @创建时间:2015年12月23日
*/
formatterDateTime : function(date) {
var datetime=this.getGMTTime(date);
var result = datetime.getFullYear()
+ "-"// "年"
+ ((datetime.getMonth() + 1) >= 10 ? (datetime.getMonth() + 1)
: "0" + (datetime.getMonth() + 1))
+ "-"// "月"
+ (datetime.getDate() < 10 ? "0" + datetime.getDate()
: datetime.getDate())
+ " "
+ (datetime.getHours() < 10 ? "0" + datetime.getHours()
: datetime.getHours())
+ ":"
+ (datetime.getMinutes() < 10 ? "0" + datetime.getMinutes()
: datetime.getMinutes())
+ ":"
+ (datetime.getSeconds() < 10 ? "0" + datetime.getSeconds()
: datetime.getSeconds());
return result;
},
/**
* @描述:时间比较(结束时间大于开始时间)
* @创建时间:2015年12月23日
*/
compareDateTime : function(startTime, endTime) {
return ((new Date(endTime.replace(/-/g, "/"))) > (new Date(startTime
.replace(/-/g, "/"))));
},
/**
* @描述:验证开始时间合理性(开始时间不能小于当前时间X个月)
* @创建时间:2015年12月23日
*/
compareRightStartTime : function(month, startTime) {
var now = formatterDayAndTime(new Date());
var sms = new Date(startTime.replace(/-/g, "/"));
var ems = new Date(now.replace(/-/g, "/"));
var tDayms = month * 30 * 24 * 60 * 60 * 1000;
var dvalue = ems - sms;
if (dvalue > tDayms) {
return false;
}
return true;
},
/**
* @描述:验证开始时间合理性(结束时间与开始时间的间隔不能大于(X)个月)
* @创建时间:2015年12月23日
*/
compareEndTimeGTStartTime : function(month, startTime, endTime) {
var sms = new Date(startTime.replace(/-/g, "/"));
var ems = new Date(endTime.replace(/-/g, "/"));
var tDayms = month * 30 * 24 * 60 * 60 * 1000;
var dvalue = ems - sms;
if (dvalue > tDayms) {
return false;
}
return true;
},
/**
* @描述:获取最近几天(开始时间和结束时间值,时间往前推算)
* @创建时间:2015年12月23日
*/
getRecentDaysDateTime : function(day) {
var daymsTime = day * 24 * 60 * 60 * 1000;
var yesterDatsmsTime = this.getCurrentMsTime() - daymsTime;
var startTime = this.longMsTimeConvertToDateTime(yesterDatsmsTime);
var pastDate = this.formatterDate2(new Date(startTime));
var nowDate = this.formatterDate2(new Date());
var obj = {
startTime : pastDate,
endTime : nowDate
};
return obj;
},
/**
* @描述:获取今天(开始时间和结束时间值)
* @创建时间:2015年12月23日
*/
getTodayDateTime : function() {
var daymsTime = 24 * 60 * 60 * 1000;
var tomorrowDatsmsTime = this.getCurrentMsTime() + daymsTime;
var currentTime = this.longMsTimeConvertToDateTime(this
.getCurrentMsTime());
var termorrowTime = this
.longMsTimeConvertToDateTime(tomorrowDatsmsTime);
var nowDate = this.formatterDate2(new Date(currentTime));
var tomorrowDate = this.formatterDate2(new Date(termorrowTime));
var obj = {
startTime : nowDate,
endTime : tomorrowDate
};
return obj;
},
/**
* @描述:获取明天(开始时间和结束时间值)
* @创建时间:2015年12月23日
*/
getTomorrowDateTime : function() {
var daymsTime = 24 * 60 * 60 * 1000;
var tomorrowDatsmsTime = this.getCurrentMsTime() + daymsTime;
var termorrowTime = this
.longMsTimeConvertToDateTime(tomorrowDatsmsTime);
var theDayAfterTomorrowDatsmsTime = this.getCurrentMsTime()
+ (2 * daymsTime);
var theDayAfterTomorrowTime = this
.longMsTimeConvertToDateTime(theDayAfterTomorrowDatsmsTime);
var pastDate = this.formatterDate2(new Date(termorrowTime));
var nowDate = this.formatterDate2(new Date(theDayAfterTomorrowTime));
var obj = {
startTime : pastDate,
endTime : nowDate
};
return obj;
},
/**
* 将CST时间转换为GMT时间,否则时间会有误差
* @param date
*/
getGMTTime:function(date){
var index=(date.toString()).indexOf("CST");
if(index > 0){
//将CST时间转换为GMT时间,否则时间会有误差
var dateStr=date.split(" ");
var strGMT = dateStr[0]+" "+dateStr[1]+" "+dateStr[2]+" "+dateStr[5]+" "+dateStr[3]+" GMT+0800";
return new Date(Date.parse(strGMT));
}else{
return new Date(date);
}
}
};
/**
*
* @项目名称:wyait-manage
* @文件名称:data-utils
* @类描述:js时间转换工具类
* @创建时间:2018年5月24日17:13:58
*/
var DateUtils = {
/**
* @描述:获取当前时间毫秒数
* @创建时间:2015年12月23日
*/
getCurrentMsTime : function() {
var myDate = new Date();
return myDate.getTime();
},
/**
* @描述:转换日期格式yyyy-MM-dd HH:mm:ss
* @创建时间:2015年12月23日
*/
formatDate : function(dateTime) {
return this.formatterDateTime(dateTime);
},
/**
* @描述:时间格式转毫秒
* @创建时间:2015年12月23日
*/
dateToLongMsTime : function(date) {
return date.getTime();
},
/**
* @描述:格式化日期(不含时间)
* @创建时间:2015年12月23日
*/
formatterDate : function(date) {
var datetime = this.getGMTTime(date);
var result = datetime.getFullYear()
+ "-"// "年"
+ ((datetime.getMonth() + 1) >= 10 ? (datetime.getMonth() + 1)
: "0" + (datetime.getMonth() + 1))
+ "-"// "月"
+ (datetime.getDate() < 10 ? "0" + datetime.getDate()
: datetime.getDate());
return result;
},
/**
* @描述:格式化日期(含时间"00:00:00")
* @创建时间:2015年12月23日
*/
formatterDate2 : function(date) {
var datetime = this.getGMTTime(date);
var result = datetime.getFullYear()
+ "-"// "年"
+ ((datetime.getMonth() + 1) >= 10 ? (datetime.getMonth() + 1)
: "0" + (datetime.getMonth() + 1))
+ "-"// "月"
+ (datetime.getDate() < 10 ? "0" + datetime.getDate()
: datetime.getDate()) + " " + "00:00:00";
return result;
},
/**
* @描述:格式化去日期(含时间)
* @创建时间:2015年12月23日
*/
formatterDateTime : function(date) {
var datetime=this.getGMTTime(date);
var result = datetime.getFullYear()
+ "-"// "年"
+ ((datetime.getMonth() + 1) >= 10 ? (datetime.getMonth() + 1)
: "0" + (datetime.getMonth() + 1))
+ "-"// "月"
+ (datetime.getDate() < 10 ? "0" + datetime.getDate()
: datetime.getDate())
+ " "
+ (datetime.getHours() < 10 ? "0" + datetime.getHours()
: datetime.getHours())
+ ":"
+ (datetime.getMinutes() < 10 ? "0" + datetime.getMinutes()
: datetime.getMinutes())
+ ":"
+ (datetime.getSeconds() < 10 ? "0" + datetime.getSeconds()
: datetime.getSeconds());
return result;
},
/**
* @描述:时间比较(结束时间大于开始时间)
* @创建时间:2015年12月23日
*/
compareDateTime : function(startTime, endTime) {
return ((new Date(endTime.replace(/-/g, "/"))) > (new Date(startTime
.replace(/-/g, "/"))));
},
/**
* @描述:验证开始时间合理性(开始时间不能小于当前时间X个月)
* @创建时间:2015年12月23日
*/
compareRightStartTime : function(month, startTime) {
var now = formatterDayAndTime(new Date());
var sms = new Date(startTime.replace(/-/g, "/"));
var ems = new Date(now.replace(/-/g, "/"));
var tDayms = month * 30 * 24 * 60 * 60 * 1000;
var dvalue = ems - sms;
if (dvalue > tDayms) {
return false;
}
return true;
},
/**
* @描述:验证开始时间合理性(结束时间与开始时间的间隔不能大于(X)个月)
* @创建时间:2015年12月23日
*/
compareEndTimeGTStartTime : function(month, startTime, endTime) {
var sms = new Date(startTime.replace(/-/g, "/"));
var ems = new Date(endTime.replace(/-/g, "/"));
var tDayms = month * 30 * 24 * 60 * 60 * 1000;
var dvalue = ems - sms;
if (dvalue > tDayms) {
return false;
}
return true;
},
/**
* @描述:获取最近几天(开始时间和结束时间值,时间往前推算)
* @创建时间:2015年12月23日
*/
getRecentDaysDateTime : function(day) {
var daymsTime = day * 24 * 60 * 60 * 1000;
var yesterDatsmsTime = this.getCurrentMsTime() - daymsTime;
var startTime = this.longMsTimeConvertToDateTime(yesterDatsmsTime);
var pastDate = this.formatterDate2(new Date(startTime));
var nowDate = this.formatterDate2(new Date());
var obj = {
startTime : pastDate,
endTime : nowDate
};
return obj;
},
/**
* @描述:获取今天(开始时间和结束时间值)
* @创建时间:2015年12月23日
*/
getTodayDateTime : function() {
var daymsTime = 24 * 60 * 60 * 1000;
var tomorrowDatsmsTime = this.getCurrentMsTime() + daymsTime;
var currentTime = this.longMsTimeConvertToDateTime(this
.getCurrentMsTime());
var termorrowTime = this
.longMsTimeConvertToDateTime(tomorrowDatsmsTime);
var nowDate = this.formatterDate2(new Date(currentTime));
var tomorrowDate = this.formatterDate2(new Date(termorrowTime));
var obj = {
startTime : nowDate,
endTime : tomorrowDate
};
return obj;
},
/**
* @描述:获取明天(开始时间和结束时间值)
* @创建时间:2015年12月23日
*/
getTomorrowDateTime : function() {
var daymsTime = 24 * 60 * 60 * 1000;
var tomorrowDatsmsTime = this.getCurrentMsTime() + daymsTime;
var termorrowTime = this
.longMsTimeConvertToDateTime(tomorrowDatsmsTime);
var theDayAfterTomorrowDatsmsTime = this.getCurrentMsTime()
+ (2 * daymsTime);
var theDayAfterTomorrowTime = this
.longMsTimeConvertToDateTime(theDayAfterTomorrowDatsmsTime);
var pastDate = this.formatterDate2(new Date(termorrowTime));
var nowDate = this.formatterDate2(new Date(theDayAfterTomorrowTime));
var obj = {
startTime : pastDate,
endTime : nowDate
};
return obj;
},
/**
* 将CST时间转换为GMT时间,否则时间会有误差
* @param date
*/
getGMTTime:function(date){
var index=(date.toString()).indexOf("CST");
if(index > 0){
//将CST时间转换为GMT时间,否则时间会有误差
var dateStr=date.split(" ");
var strGMT = dateStr[0]+" "+dateStr[1]+" "+dateStr[2]+" "+dateStr[5]+" "+dateStr[3]+" GMT+0800";
return new Date(Date.parse(strGMT));
}else{
return new Date(date);
}
}
};
/**
* ajax异常
* */
function ajaxError(){
/*$.get("/error/ajaxError",function(data,status){
console.log("status:"+status);
console.log("data:"+data);
layer.alert(data);
});*/
$.ajax({
url: "/error/ajaxError",
data:"",
type: "GET",
success:function(data){
//异常过滤处理
if(isError(data)){
alert(data);
}
},
error:function(e){
//也可通过error控制请求失败的情况
console.log("e:"+e);
}
});
}
/**
* 菜单
* */
//获取路径uri
var pathUri=window.location.href;
$(function(){
layui.use('element', function(){
var element = layui.element;
// 左侧导航区域(可配合layui已有的垂直导航)
$.get("/permission/getUserPerms",function(data){
if(data!=null){
console.log(data.perm)
getMenus(data.perm);
element.render('nav');
}else{
layer.alert("权限不足,请联系管理员",function () {
//退出
window.location.href="/logout";
});
}
});
});
})
var getMenus=function(data){
//回显选中
var ul=$("<ul class='layui-nav layui-nav-tree' lay-filter='test'></ul>");
for(var i=0;i < data.length;i++){
var node=data[i];
console.log(node)
var li=$("<li class='layui-nav-item' flag='"+node.id+"'></li>");
var a=$("<a class='' href='javascript:;'>"+node.name+"</a>");
li.append(a);
//获取子节点
var childArry = node.childrens;
console.log(childArry);
if(childArry.length>0){
a.append("<span class='layui-nav-more'></span>");
var dl=$("<dl class='layui-nav-child'></dl>");
for (var y in childArry) {
var dd=$("<dd><a href='"+childArry[y].url+"'>"+childArry[y].name+"</a></dd>");
//判断选中状态
if(pathUri.indexOf(childArry[y].url)>0){
li.addClass("layui-nav-itemed");
dd.addClass("layui-this")
}
dl.append(dd);
}
li.append(dl);
}
ul.append(li);
}
$(".layui-side-scroll").append(ul);
}
//根据菜单主键id获取下级菜单
//id:菜单主键id
//arry:菜单数组信息
function getParentArry(id, arry) {
var newArry = new Array();
for (var x in arry) {
if (arry[x].pId == id)
newArry.push(arry[x]);
}
return newArry;
}
function updateUsePwd(){
layer.open({
type:1,
title: "修改密码",
fixed:false,
resize :false,
shadeClose: true,
area: ['450px'],
content:$('#pwdDiv')
});
}
\ No newline at end of file
/*!
* jQuery Cookie Plugin v1.4.1
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2013 Klaus Hartl
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
var pluses = /\+/g;
function encode(s) {
return config.raw ? s : encodeURIComponent(s);
}
function decode(s) {
return config.raw ? s : decodeURIComponent(s);
}
function stringifyCookieValue(value) {
return encode(config.json ? JSON.stringify(value) : String(value));
}
function parseCookieValue(s) {
if (s.indexOf('"') === 0) {
// This is a quoted cookie as according to RFC2068, unescape...
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
try {
// Replace server-side written pluses with spaces.
// If we can't decode the cookie, ignore it, it's unusable.
// If we can't parse the cookie, ignore it, it's unusable.
s = decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s) : s;
} catch(e) {}
}
function read(s, converter) {
var value = config.raw ? s : parseCookieValue(s);
return $.isFunction(converter) ? converter(value) : value;
}
var config = $.cookie = function (key, value, options) {
// Write
if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options);
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setTime(+t + days * 864e+5);
}
return (document.cookie = [
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// Read
var result = key ? undefined : {};
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling $.cookie().
var cookies = document.cookie ? document.cookie.split('; ') : [];
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
var cookie = parts.join('=');
if (key && key === name) {
// If second argument (value) is a function it's a converter...
result = read(cookie, value);
break;
}
// Prevent storing a cookie that we couldn't decode.
if (!key && (cookie = read(cookie)) !== undefined) {
result[name] = cookie;
}
}
return result;
};
config.defaults = {};
$.removeCookie = function (key, options) {
if ($.cookie(key) === undefined) {
return false;
}
// Must not alter options, thus extending a fresh object...
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
};
}));
/*!
SerializeJSON jQuery plugin.
https://github.com/marioizquierdo/jquery.serializeJSON
version 2.3.1 (Oct, 2014)
Copyright (c) 2014 Mario Izquierdo
Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*/
(function(a){a.fn.serializeJSON=function(c){var d,b,g,i,h,e;h=a.serializeJSON;e=h.optsWithDefaults(c);b=this.serializeArray();h.readCheckboxUncheckedValues(b,this,e);d={};a.each(b,function(j,f){g=h.splitInputNameIntoKeysArray(f.name);i=h.parseValue(f.value,e);if(e.parseWithFunction){i=e.parseWithFunction(i)}h.deepSet(d,g,i,e)});return d};a.serializeJSON={defaultOptions:{parseNumbers:false,parseBooleans:false,parseNulls:false,parseAll:false,parseWithFunction:null,checkboxUncheckedValue:undefined,useIntKeysAsArrayIndex:false},optsWithDefaults:function(c){var d,b;if(c==null){c={}}d=a.serializeJSON;b=d.optWithDefaults("parseAll",c);return{parseNumbers:b||d.optWithDefaults("parseNumbers",c),parseBooleans:b||d.optWithDefaults("parseBooleans",c),parseNulls:b||d.optWithDefaults("parseNulls",c),parseWithFunction:d.optWithDefaults("parseWithFunction",c),checkboxUncheckedValue:d.optWithDefaults("checkboxUncheckedValue",c),useIntKeysAsArrayIndex:d.optWithDefaults("useIntKeysAsArrayIndex",c)}},optWithDefaults:function(c,b){return(b[c]!==false)&&(b[c]!=="")&&(b[c]||a.serializeJSON.defaultOptions[c])},parseValue:function(e,b){var d,c;c=a.serializeJSON;if(b.parseNumbers&&c.isNumeric(e)){return Number(e)}if(b.parseBooleans&&(e==="true"||e==="false")){return e==="true"}if(b.parseNulls&&e=="null"){return null}return e},isObject:function(b){return b===Object(b)},isUndefined:function(b){return b===void 0},isValidArrayIndex:function(b){return/^[0-9]+$/.test(String(b))},isNumeric:function(b){return b-parseFloat(b)>=0},splitInputNameIntoKeysArray:function(b){var d,c,e;e=a.serializeJSON;if(e.isUndefined(b)){throw new Error("ArgumentError: param 'name' expected to be a string, found undefined")}d=a.map(b.split("["),function(f){c=f[f.length-1];return c==="]"?f.substring(0,f.length-1):f});if(d[0]===""){d.shift()}return d},deepSet:function(c,l,j,b){var k,h,g,i,d,e;if(b==null){b={}}e=a.serializeJSON;if(e.isUndefined(c)){throw new Error("ArgumentError: param 'o' expected to be an object or array, found undefined")}if(!l||l.length===0){throw new Error("ArgumentError: param 'keys' expected to be an array with least one element")}k=l[0];if(l.length===1){if(k===""){c.push(j)}else{c[k]=j}}else{h=l[1];if(k===""){i=c.length-1;d=c[i];if(e.isObject(d)&&(e.isUndefined(d[h])||l.length>2)){k=i}else{k=i+1}}if(e.isUndefined(c[k])){if(h===""){c[k]=[]}else{if(b.useIntKeysAsArrayIndex&&e.isValidArrayIndex(h)){c[k]=[]}else{c[k]={}}}}g=l.slice(1);e.deepSet(c[k],g,j,b)}},readCheckboxUncheckedValues:function(e,d,i){var b,h,g,c,j;if(i==null){i={}}j=a.serializeJSON;b="input[type=checkbox][name]:not(:checked)";h=d.find(b).add(d.filter(b));h.each(function(f,k){g=a(k);c=g.attr("data-unchecked-value");if(c){e.push({name:k.name,value:c})}else{if(!j.isUndefined(i.checkboxUncheckedValue)){e.push({name:k.name,value:i.checkboxUncheckedValue})}}})}}}(window.jQuery||window.Zepto||window.$));
\ No newline at end of file
/**
* 登录
*/
// $(function(){
// layui.use(['form' ,'layer'], function() {
// var form = layui.form;
// var layer = layui.layer;
// form.on("submit(login)",function () {
// login();
// return false;
// });
// var path=window.location.href;
// if(path.indexOf("kickout")>0){
// layer.alert("您的账号已在别处登录;若不是您本人操作,请立即修改密码!",function(){
// window.location.href="/login";
// });
// }
// })
// })
//
// function login(){
// var username=$("#username").val();
// var password=$("#password").val();
// var rememberMe = $("#rememberMe").val();
// $.post("/user/login",$("#useLogin").serialize(),function(data){
// if(data.code == 1){
// window.location.href=data.url;
// }else{
// layer.alert(data.message,function(){
// layer.closeAll();//关闭所有弹框
// });
// }
// });
// }
layui.use('form', function(){ //如果只加载一个模块,可以不填数组。如:layui.use('form')
var form = layui.form; //获取form模块
//监听提交按钮
form.on('submit(test)', function(data){
console.log(data);
});
});
\ No newline at end of file
/**
* 权限管理
*/
var pageCurr;
var form;
$(function() {
layui.use('table', function(){
var table = layui.table;
form = layui.form;
tableIns=table.render({
id:'id',
elem: '#permissionList',
url:'/permission/permissionList',
method: 'post', //默认:get请求
cellMinWidth: 80,
page: true,
request: {
pageName: 'pageNum', //页码的参数名称,默认:pageNum
limitName: 'pageSize' //每页数据量的参数名,默认:pageSize
},
response:{
statusName: 'code', //数据状态的字段名称,默认:code
statusCode: 200, //成功的状态码,默认:0
countName: 'totals', //数据总数的字段名称,默认:count
dataName: 'list' //数据列表的字段名称,默认:data
},
cols: [[
{type:'numbers'/*,width:"5%"*/}
/*,{field:'id', title:'id'}
,{field:'parentId', title:'parentId'}*/
,{field:'pname', title:'父级菜单',align:'center'/*,width:"10%"*/}
,{field:'name', title:'菜单名称',align:'center'/*,width:"10%"*/}
,{field:'descpt', title:'描述',align:'center'/*,width:"15%"*/}
,{field:'url', title:'菜单url',align:'center'/*,width:"15%"*/}
,{field:'createTime', title:'创建时间',align:'center'/*,width:"10%"*/}
,{field:'updateTime', title:'更新时间',align:'center'/*,width:"10%"*/}
,{fixed:'right',title:'操作',align:'center', toolbar:'#optBar'/*,width:"25%"*/}
]],
done: function(res, curr, count){
$("[data-field='pname']").children().each(function(){
if($(this).text()==''){
$(this).text("根目录");
}else {
$(this).text($(this).text());
}
});
pageCurr=curr;
}
});
//监听工具条
table.on('tool(permissionTable)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
//删除
del(data,data.id);
} else if(obj.event === 'edit'){
//编辑
edit(data);
}
});
//监听提交
form.on('submit(permissionSubmit)', function(data){
formSubmit(data);
return false;
});
});
});
//提交表单
function formSubmit(obj){
$.ajax({
type: "post",
data: $("#permissionForm").serialize(),
url: "/permission/setPermission",
success: function (data) {
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert("操作请求错误,请您稍后再试",function(){
layer.closeAll();
load(obj);
});
}
});
}
//新增
function add() {
edit(null,"新增");
}
//打开编辑框
function edit(data,title){
var parentId = null;
if(data == null){
$("#id").val("");
}else{
//回显数据
$("#id").val(data.id);
$("#name").val(data.name);
$("#descpt").val(data.descpt);
$("#url").val(data.url);
parentId = data.pid;
}
var pageNum = $(".layui-laypage-skip").find("input").val();
$("#pageNum").val(pageNum);
$.ajax({
url:'/permission/parentPermissionList',
dataType:'json',
async: true,
success:function(data){
$("#pid").html("<option value='0'>根目录</option>");
$.each(data,function(index,item){
if(!parentId){
var option = new Option(item.name,item.id);
}else {
var option = new Option(item.name,item.id);
// // 如果是之前的parentId则设置选中
if(item.id == parentId) {
option.setAttribute("selected",'true');
}
}
$('#pid').append(option);//往下拉菜单里添加元素
form.render('select'); //这个很重要
})
}
});
layer.open({
type:1,
title: title,
fixed:false,
resize :false,
shadeClose: true,
area: ['550px'],
content:$('#setPermission'),
end:function(){
cleanPermission();
}
});
}
function cleanPermission() {
$("#name").val("");
$("#descpt").val("");
$("#url").val("");
}
//重新加载table
function load(obj){
tableIns.reload({
where: obj.field
, page: {
curr: pageCurr //从当前页码开始
}
});
}
//删除
function del(obj,id) {
if(null!=id){
layer.confirm('您确定要删除吗?', {
btn: ['确认','返回'] //按钮
}, function(){
$.post("/permission/del",{"id":id},function(data){
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
});
}, function(){
layer.closeAll();
});
}
}
\ No newline at end of file
/**
* 角色管理
*/
//'formSelects.render('permissions');
var pageCurr;
var form;
$(function() {
layui.use('table', function(){
var table = layui.table;
form = layui.form;
tableIns=table.render({
elem: '#roleList',
url:'/role/getRoleList',
method: 'get', //默认:get请求
cellMinWidth: 80,
page: true,
request: {
pageName: 'pageNum', //页码的参数名称,默认:pageNum
limitName: 'pageSize' //每页数据量的参数名,默认:pageSize
},
response:{
statusName: 'code', //数据状态的字段名称,默认:code
statusCode: 200, //成功的状态码,默认:0
countName: 'totals', //数据总数的字段名称,默认:count
dataName: 'list' //数据列表的字段名称,默认:data
},
cols: [[
{type:'numbers'}
,{field:'roleName', title:'角色名称',align:'center'}
,{field:'roleDesc', title:'角色描述',align:'center'}
,{field:'permissions', title:'权限',align:'center'}
,{field:'createTime', title:'创建时间',align:'center'}
,{field:'updateTime', title:'更新时间',align:'center'}
,{field:'roleStatus', title:'是否有效',align:'center'}
,{fixed:'right',title:'操作',align:'center', toolbar:'#optBar'}
]],
done: function(res, curr, count){
$("[data-field='roleStatus']").children().each(function(){
if($(this).text()=='1'){
$(this).text("有效")
}else if($(this).text()=='0'){
$(this).text("失效")
}
});
pageCurr=curr;
}
});
//监听工具条
table.on('tool(roleTable)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
//删除
delRole(data,data.id);
} else if(obj.event === 'edit'){
//编辑
edit(data);
}else if(obj.event === 'recover'){
//恢复
recoverRole(data,data.id);
}
});
//监听提交
form.on('submit(roleSubmit)', function(data){
formSubmit(data);
return false;
});
});
});
//提交表单
function formSubmit(obj){
$.ajax({
type: "post",
data: $("#roleForm").serialize(),
url: "/role/setRole",
success: function (data) {
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert("操作请求错误,请您稍后再试",function(){
layer.closeAll();
load(obj);
});
}
});
}
//新增
function add() {
edit(null,"新增");
}
//打开编辑框
function edit(data,title){
var pid = null;
if(data == null){
$("#id").val("");
}else{
//回显数据
$("#id").val(data.id);
$("#roleName").val(data.roleName);
$("#roleDesc").val(data.roleDesc);
pid = data.permissionIds;
}
formSelects.data('permissions', 'server', {
url: '/permission/parentPermissionList',
keyName: 'name',
keyVal: 'id',
success: function(id, url, searchVal, result){ //使用远程方式的success回调
console.log(pid)
if(pid != null){
var assistAuditArry =pid.split(",");
formSelects.value('permissions', assistAuditArry);
}
console.log(result); //返回的结果
},
error: function(id, url, searchVal, err){ //使用远程方式的error回调
//同上
console.log(err); //err对象
},
});
var pageNum = $(".layui-laypage-skip").find("input").val();
$("#pageNum").val(pageNum);
layer.open({
type:1,
title: title,
fixed:false,
resize :false,
shadeClose: true,
area: ['550px','550px'],
content:$('#setRole'),
end:function(){
cleanRole();
}
});
}
//重新加载table
function load(obj){
tableIns.reload({
where: obj.f
, page: {
curr: pageCurr //从当前页码开始
}
});
}
//删除
function delRole(obj,id) {
if(null!=id){
layer.confirm('您确定要删除吗?', {
btn: ['确认','返回'] //按钮
}, function(){
$.post("/role/updateRoleStatus",{"id":id,"status":0},function(data){
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
});
}, function(){
layer.closeAll();
});
}
}
//恢复
function recoverRole(obj,id) {
if(null!=id){
layer.confirm('您确定要恢复吗?', {
btn: ['确认','返回'] //按钮
}, function(){
$.post("/role/updateRoleStatus",{"id":id,"status":1},function(data){
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
});
}, function(){
layer.closeAll();
});
}
}
function cleanRole() {
$("#roleName").val("");
$("#roleDesc").val("");
$("#permissions").val("");
}
/**
* 用户管理
*/
var pageCurr;
var form;
$(function() {
layui.use('table', function(){
var table = layui.table;
form = layui.form;
tableIns=table.render({
elem: '#uesrList',
url:'/user/getUserList',
method: 'post', //默认:get请求
cellMinWidth: 80,
page: true,
request: {
pageName: 'pageNum', //页码的参数名称,默认:pageNum
limitName: 'pageSize' //每页数据量的参数名,默认:pageSize
},
response:{
statusName: 'code', //数据状态的字段名称,默认:code
statusCode: 200, //成功的状态码,默认:0
countName: 'totals', //数据总数的字段名称,默认:count
dataName: 'list' //数据列表的字段名称,默认:data
},
cols: [[
{type:'numbers'}
,{field:'sysUserName', title:'用户名',align:'center'}
,{field:'roleName', title:'角色类型',align:'center'}
,{field:'userPhone', title:'手机号',align:'center'}
,{field:'regTime', title: '注册时间',align:'center'}
,{field:'userStatus', title: '是否有效',align:'center'}
,{title:'操作',align:'center', toolbar:'#optBar'}
]],
done: function(res, curr, count){
//如果是异步请求数据方式,res即为你接口返回的信息。
//如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度
//console.log(res);
//得到当前页码
console.log(curr);
$("[data-field='userStatus']").children().each(function(){
if($(this).text()=='1'){
$(this).text("有效")
}else if($(this).text()=='0'){
$(this).text("失效")
}
});
//得到数据总量
//console.log(count);
pageCurr=curr;
}
});
//监听工具条
table.on('tool(userTable)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
//删除
delUser(data,data.id,data.sysUserName);
} else if(obj.event === 'edit'){
//编辑
openUser(data,"编辑");
}else if(obj.event === 'recover'){
//恢复
recoverUser(data,data.id);
}
});
//监听提交
form.on('submit(userSubmit)', function(data){
// TODO 校验
formSubmit(data);
return false;
});
});
//搜索框
layui.use(['form','laydate'], function(){
var form = layui.form ,layer = layui.layer
,laydate = layui.laydate;
//日期
laydate.render({
elem: '#startTime'
});
laydate.render({
elem: '#endTime'
});
//TODO 数据校验
//监听搜索框
form.on('submit(searchSubmit)', function(data){
//重新加载table
load(data);
return false;
});
});
});
//提交表单
function formSubmit(obj){
$.ajax({
type: "POST",
data: $("#userForm").serialize(),
url: "/user/setUser",
success: function (data) {
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert("操作请求错误,请您稍后再试",function(){
layer.closeAll();
//加载load方法
load(obj);//自定义
});
}
});
}
//开通用户
function addUser(){
openUser(null,"开通用户");
}
function openUser(data,title){
var roleId = null;
if(data==null || data==""){
$("#id").val("");
}else{
$("#id").val(data.id);
$("#username").val(data.sysUserName);
$("#mobile").val(data.userPhone);
roleId = data.roleId;
}
var pageNum = $(".layui-laypage-skip").find("input").val();
$("#pageNum").val(pageNum);
$.ajax({
url:'/role/getRoles',
dataType:'json',
async: true,
success:function(data){
$.each(data,function(index,item){
if(!roleId){
var option = new Option(item.roleName,item.id);
}else {
var option = new Option(item.roleName,item.id);
// // 如果是之前的parentId则设置选中
if(item.id == roleId) {
option.setAttribute("selected",'true');
}
}
$('#roleId').append(option);//往下拉菜单里添加元素
form.render('select'); //这个很重要
})
}
});
layer.open({
type:1,
title: title,
fixed:false,
resize :false,
shadeClose: true,
area: ['550px'],
content:$('#setUser'),
end:function(){
cleanUser();
}
});
}
function delUser(obj,id,name) {
var currentUser=$("#currentUser").html();
if(null!=id){
if(currentUser==id){
layer.alert("对不起,您不能执行删除自己的操作!");
}else{
layer.confirm('您确定要删除'+name+'用户吗?', {
btn: ['确认','返回'] //按钮
}, function(){
$.post("/user/updateUserStatus",{"id":id,"status":0},function(data){
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
});
}, function(){
layer.closeAll();
});
}
}
}
//恢复
function recoverUser(obj,id) {
if(null!=id){
layer.confirm('您确定要恢复吗?', {
btn: ['确认','返回'] //按钮
}, function(){
$.post("/user/updateUserStatus",{"id":id,"status":1},function(data){
if (data.code == 1) {
layer.alert(data.msg,function(){
layer.closeAll();
load(obj);
});
} else {
layer.alert(data.msg);
}
});
}, function(){
layer.closeAll();
});
}
}
function load(obj){
//重新加载table
tableIns.reload({
where: obj.field
, page: {
curr: pageCurr //从当前页码开始
}
});
}
function cleanUser(){
$("#username").val("");
$("#mobile").val("");
$("#password").val("");
$('#roleId').html("");
}
/**
* 修改用户密码
* */
$(function(){
layui.use(['form' ,'layer'], function() {
var form = layui.form;
//确认修改密码
form.on("submit(setPwd)",function () {
setPwd();
return false;
});
})
})
function setPwd(){
var pwd=$("#pwd").val();
var isPwd=$("#isPwd").val();
$.post("/user/setPwd",{"pwd":pwd,"isPwd":isPwd},function(data){
console.log("data:"+data);
if(data.code=="1"){
layer.alert("操作成功",function () {
layer.closeAll();
window.location.href="/logout";
});
}else{
layer.alert(data.message,function () {
layer.closeAll();
});
}
});
}
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;padding: 0;border: 0;outline: 0;font-weight: inherit;font-style: inherit;font-size: 100%;font-family: inherit;vertical-align: baseline;}
body {color: #2f332a;font: 15px/21px Arial, Helvetica, simsun, sans-serif;background: #f0f6e4 \9;}
h1, h2, h3, h4, h5, h6 {color: #2f332a;font-weight: bold;font-family: Helvetica, Arial, sans-serif;padding-bottom: 5px;}
h1 {font-size: 24px;line-height: 34px;text-align: center;}
h2 {font-size: 14px;line-height: 24px;padding-top: 5px;}
h6 {font-weight: normal;font-size: 12px;letter-spacing: 1px;line-height: 24px;text-align: center;}
a {color:#3C6E31;text-decoration: underline;}
a:hover {background-color:#3C6E31;color:white;}
input.radio {margin: 0 2px 0 8px;}
input.radio.first {margin-left:0;}
input.empty {color: lightgray;}
code {color: #2f332a;}
.highlight_red {color:#A60000;}
.highlight_green {color:#A7F43D;}
li {list-style: circle;font-size: 12px;}
li.title {list-style: none;}
ul.list {margin-left: 17px;}
div.content_wrap {width: 600px;height:380px;}
div.content_wrap div.left{float: left;width: 250px;}
div.content_wrap div.right{float: right;width: 340px;}
div.zTreeDemoBackground {width:250px;height:362px;text-align:left;}
ul.ztree {margin-top: 10px;border: 1px solid #617775;background: #f0f6e4;width:220px;height:360px;overflow-y:scroll;overflow-x:auto;}
ul.log {border: 1px solid #617775;background: #f0f6e4;width:300px;height:170px;overflow: hidden;}
ul.log.small {height:45px;}
ul.log li {color: #666666;list-style: none;padding-left: 10px;}
ul.log li.dark {background-color: #E3E3E3;}
/* ruler */
div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer}
div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer}
\ No newline at end of file
/*-------------------------------------
zTree Style
version: 3.5.19
author: Hunter.z
email: hunter.z@263.net
website: http://code.google.com/p/jquerytree/
-------------------------------------*/
.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
.ztree {margin:0; padding:5px; color:#333}
.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0}
.ztree li ul{ margin:0; padding:0 0 0 18px}
.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;}
.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
text-decoration:none; vertical-align:top; display: inline-block}
.ztree li a:hover {text-decoration:underline}
.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
opacity:0.8; filter:alpha(opacity=80)}
.ztree li a.tmpTargetNode_prev {}
.ztree li a.tmpTargetNode_next {}
.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
font-size:12px; border:1px #7EC4CC solid; *border:0px}
.ztree li span {line-height:16px; margin-right:2px}
.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
border:0 none; cursor: pointer;outline:none;
background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto}
.ztree li span.button.chk.checkbox_false_full {background-position:0 0}
.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px}
.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px}
.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px}
.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px}
.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0}
.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px}
.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px}
.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px}
.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px}
.ztree li span.button.chk.radio_false_full {background-position:-28px 0}
.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px}
.ztree li span.button.chk.radio_false_part {background-position:-28px -28px}
.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px}
.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px}
.ztree li span.button.chk.radio_true_full {background-position:-42px 0}
.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px}
.ztree li span.button.chk.radio_true_part {background-position:-42px -28px}
.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
.ztree li span.button.switch {width:18px; height:18px}
.ztree li span.button.root_open{background-position:-92px -54px}
.ztree li span.button.root_close{background-position:-74px -54px}
.ztree li span.button.roots_open{background-position:-92px 0}
.ztree li span.button.roots_close{background-position:-74px 0}
.ztree li span.button.center_open{background-position:-92px -18px}
.ztree li span.button.center_close{background-position:-74px -18px}
.ztree li span.button.bottom_open{background-position:-92px -36px}
.ztree li span.button.bottom_close{background-position:-74px -36px}
.ztree li span.button.noline_open{background-position:-92px -72px}
.ztree li span.button.noline_close{background-position:-74px -72px}
.ztree li span.button.root_docu{ background:none;}
.ztree li span.button.roots_docu{background-position:-56px 0}
.ztree li span.button.center_docu{background-position:-56px -18px}
.ztree li span.button.bottom_docu{background-position:-56px -36px}
.ztree li span.button.noline_docu{ background:none;}
.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
/* level style*/
/*.ztree li span.button.level0 {
display:none;
}
.ztree li ul.level0 {
padding:0;
background:none;
}*/
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/** layui-v2.4.5 MIT License By https://www.layui.com */
blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
/** layui-v2.4.5 MIT License By https://www.layui.com */
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}
\ No newline at end of file
/** layui-v2.4.5 MIT License By https://www.layui.com */
.laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment