Commit fc48bdf3 by 黄杰

update commit;

parent 5210454f
......@@ -36,11 +36,13 @@ ihooyah-hza-server
```
### 启动顺序
1. ihooyah-hza-nacos
2. ihooyah-hza-auth
3. ihooyah-hza-gateway
4. ihooyah-hza-modules 下的任意模块
1. ihooyah-hza-nacos<br>
启动命令:sh startup.sh -m standalone<br>
2. ihooyah-hza-gateway
3. ihooyah-hza-modules 下的任意模块<br>
### 以下可以选择启动或者不启动
ihooyah-hza-sentinel 阿里开源微服务哨兵 流量控制 熔断 <br>
ihooyah-hza-springadmin springboot微服务治理平台<br>
### 架构详情
......
......@@ -30,6 +30,12 @@
<artifactId>feign-okhttp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
......
package com.ihooyah.auth;
import com.ihooyah.auth.configuration.AutoConfiguration;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(AutoConfiguration.class)
@Documented
@Inherited
public @interface EnableUAuthClient {
}
package com.ihooyah.auth.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 忽略用户鉴权
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD,ElementType.TYPE})
public @interface IgnoreUserToken {
}
package com.ihooyah.auth.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class KeyConfiguration {
@Value("${jwt.rsa-secret}")
private String userSecret;
private byte[] userPubKey;
private byte[] userPriKey;
}
package com.ihooyah.auth.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
......@@ -6,7 +6,7 @@ import javax.servlet.http.HttpServletRequest;
public class UserAuthConfig {
@Value("${auth.user.token-header}")
@Value("${jwt.token-header}")
private String tokenHeader;
private byte[] pubKeyByte;
......
package com.ihooyah.auth.runner;
import com.ihooyah.auth.config.KeyConfiguration;
import com.ihooyah.auth.config.UserAuthConfig;
import com.ihooyah.common.util.jwt.RsaKeyHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Map;
@Configuration
public class AuthServerRunner implements CommandLineRunner {
@Autowired
private RedisTemplate<String, String> redisTemplate;
private static final String REDIS_USER_PRI_KEY = "IHOOYAH:AUTH:JWT:PRI";
private static final String REDIS_USER_PUB_KEY = "IHOOYAH:AUTH:JWT:PUB";
@Autowired
private KeyConfiguration keyConfiguration;
@Autowired
private UserAuthConfig userAuthConfig;
@Override
public void run(String... args) throws Exception {
if (redisTemplate.hasKey(REDIS_USER_PRI_KEY)&&redisTemplate.hasKey(REDIS_USER_PUB_KEY)) {
keyConfiguration.setUserPriKey(RsaKeyHelper.toBytes(redisTemplate.opsForValue().get(REDIS_USER_PRI_KEY)));
keyConfiguration.setUserPubKey(RsaKeyHelper.toBytes(redisTemplate.opsForValue().get(REDIS_USER_PUB_KEY)));
userAuthConfig.setPubKeyByte(keyConfiguration.getUserPubKey());
} else {
Map<String, byte[]> keyMap = RsaKeyHelper.generateKey(keyConfiguration.getUserSecret());
keyConfiguration.setUserPriKey(keyMap.get("pri"));
keyConfiguration.setUserPubKey(keyMap.get("pub"));
userAuthConfig.setPubKeyByte(keyConfiguration.getUserPubKey());
redisTemplate.opsForValue().set(REDIS_USER_PRI_KEY, RsaKeyHelper.toHexString(keyMap.get("pri")));
redisTemplate.opsForValue().set(REDIS_USER_PUB_KEY, RsaKeyHelper.toHexString(keyMap.get("pub")));
}
}
}
package com.ihooyah.auth.util;
import com.ihooyah.auth.config.KeyConfiguration;
import com.ihooyah.common.util.jwt.IJWTInfo;
import com.ihooyah.common.util.jwt.JWTHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class JwtTokenUtil {
@Value("${jwt.expire}")
private int expire;
@Autowired
private KeyConfiguration keyConfiguration;
public String generateToken(IJWTInfo jwtInfo) throws Exception {
return JWTHelper.generateToken(jwtInfo, keyConfiguration.getUserPriKey(),expire);
}
public IJWTInfo getInfoFromToken(String token) throws Exception {
return JWTHelper.getInfoFromToken(token, keyConfiguration.getUserPubKey());
}
}
......@@ -18,7 +18,10 @@
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
......
package com.ihooyah.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义导出Excel数据注解
*
* @author ruoyi
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
/**
* 导出到Excel中的名字.
*/
public String name();
/**
* 日期格式, 如: yyyy-MM-dd
*/
public String dateFormat() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
public String readConverterExp() default "";
/**
* 导出时在excel中每个列的高度 单位为字符
*/
public double height() default 14;
/**
* 导出时在excel中每个列的宽 单位为字符
*/
public double width() default 16;
/**
* 文字后缀,如% 90 变成90%
*/
public String suffix() default "";
/**
* 当值为空时,字段的默认值
*/
public String defaultValue() default "";
/**
* 提示信息
*/
public String prompt() default "";
/**
* 设置只能选择不能输入的列内容.
*/
public String[] combo() default {};
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
public boolean isExport() default true;
/**
* 另一个类中的属性名称,支持多级获取,以小数点隔开
*/
public String targetAttr() default "";
/**
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
*/
Type type() default Type.ALL;
public enum Type
{
ALL(0), EXPORT(1), IMPORT(2);
private final int value;
Type(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
}
\ No newline at end of file
package com.ihooyah.common.enums;
/**
* 用户会话
*
* @author ruoyi
*/
public enum OnlineStatus
{
/** 用户状态 */
on_line("在线"), off_line("离线");
private final String info;
private OnlineStatus(String info)
{
this.info = info;
}
public String getInfo()
{
return info;
}
}
package com.ihooyah.gateway;
import com.ihooyah.auth.EnableUAuthClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableUAuthClient
@EnableFeignClients("com.ihooyah.modules.inteface.feign")
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
......
package com.ihooyah.job.admin.controller;
import com.lxcy.job.admin.controller.annotation.PermessionLimit;
import com.lxcy.job.admin.controller.interceptor.PermissionInterceptor;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.admin.service.XxlJobService;
import com.lxcy.job.core.biz.model.ReturnT;
import com.ihooyah.job.admin.controller.annotation.PermessionLimit;
import com.ihooyah.job.admin.controller.interceptor.PermissionInterceptor;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.service.XxlJobService;
import com.ihooyah.job.core.biz.model.ReturnT;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
......
package com.ihooyah.job.admin.controller;
import com.lxcy.job.admin.controller.annotation.PermessionLimit;
import com.lxcy.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.lxcy.job.core.biz.AdminBiz;
import com.ihooyah.job.admin.controller.annotation.PermessionLimit;
import com.ihooyah.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.ihooyah.job.core.biz.AdminBiz;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
......
package com.ihooyah.job.admin.controller;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.model.XxlJobLogGlue;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.admin.dao.XxlJobInfoDao;
import com.lxcy.job.admin.dao.XxlJobLogGlueDao;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.glue.GlueTypeEnum;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.model.XxlJobLogGlue;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.dao.XxlJobInfoDao;
import com.ihooyah.job.admin.dao.XxlJobLogGlueDao;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.glue.GlueTypeEnum;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
......
package com.ihooyah.job.admin.controller;
import com.lxcy.job.admin.core.conf.XxlJobAdminConfig;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.lxcy.job.admin.core.model.XxlJobRegistry;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.admin.dao.XxlJobGroupDao;
import com.lxcy.job.admin.dao.XxlJobInfoDao;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.enums.RegistryConfig;
import com.ihooyah.job.admin.core.conf.XxlJobAdminConfig;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobRegistry;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.dao.XxlJobGroupDao;
import com.ihooyah.job.admin.dao.XxlJobInfoDao;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.enums.RegistryConfig;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
......
package com.ihooyah.job.admin.controller;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.lxcy.job.admin.core.thread.JobTriggerPoolHelper;
import com.lxcy.job.admin.core.trigger.TriggerTypeEnum;
import com.lxcy.job.admin.dao.XxlJobGroupDao;
import com.lxcy.job.admin.service.XxlJobService;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.enums.ExecutorBlockStrategyEnum;
import com.lxcy.job.core.glue.GlueTypeEnum;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.ihooyah.job.admin.core.thread.JobTriggerPoolHelper;
import com.ihooyah.job.admin.core.trigger.TriggerTypeEnum;
import com.ihooyah.job.admin.dao.XxlJobGroupDao;
import com.ihooyah.job.admin.service.XxlJobService;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.enums.ExecutorBlockStrategyEnum;
import com.ihooyah.job.core.glue.GlueTypeEnum;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
......
package com.ihooyah.job.admin.controller;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.model.XxlJobLog;
import com.lxcy.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.admin.dao.XxlJobGroupDao;
import com.lxcy.job.admin.dao.XxlJobInfoDao;
import com.lxcy.job.admin.dao.XxlJobLogDao;
import com.lxcy.job.core.biz.ExecutorBiz;
import com.lxcy.job.core.biz.model.LogResult;
import com.lxcy.job.core.biz.model.ReturnT;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.model.XxlJobLog;
import com.ihooyah.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.dao.XxlJobGroupDao;
import com.ihooyah.job.admin.dao.XxlJobInfoDao;
import com.ihooyah.job.admin.dao.XxlJobLogDao;
import com.ihooyah.job.core.biz.ExecutorBiz;
import com.ihooyah.job.core.biz.model.LogResult;
import com.ihooyah.job.core.biz.model.ReturnT;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
......
package com.ihooyah.job.admin.controller.interceptor;
import com.lxcy.job.admin.core.util.FtlUtil;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.core.util.FtlUtil;
import com.ihooyah.job.admin.core.util.I18nUtil;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
......
package com.ihooyah.job.admin.controller.interceptor;
import com.lxcy.job.admin.controller.annotation.PermessionLimit;
import com.lxcy.job.admin.core.conf.XxlJobAdminConfig;
import com.lxcy.job.admin.core.util.CookieUtil;
import com.ihooyah.job.admin.controller.annotation.PermessionLimit;
import com.ihooyah.job.admin.core.conf.XxlJobAdminConfig;
import com.ihooyah.job.admin.core.util.CookieUtil;
import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;
import org.springframework.web.method.HandlerMethod;
......
package com.ihooyah.job.admin.controller.resolver;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.admin.core.util.JacksonUtil;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.admin.core.util.JacksonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
......
package com.ihooyah.job.admin.core.conf;
import com.lxcy.job.admin.dao.XxlJobGroupDao;
import com.lxcy.job.admin.dao.XxlJobInfoDao;
import com.lxcy.job.admin.dao.XxlJobLogDao;
import com.lxcy.job.admin.dao.XxlJobRegistryDao;
import com.lxcy.job.core.biz.AdminBiz;
import com.ihooyah.job.admin.dao.XxlJobGroupDao;
import com.ihooyah.job.admin.dao.XxlJobInfoDao;
import com.ihooyah.job.admin.dao.XxlJobLogDao;
import com.ihooyah.job.admin.dao.XxlJobRegistryDao;
import com.ihooyah.job.core.biz.AdminBiz;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
......
package com.ihooyah.job.admin.core.conf;
import com.lxcy.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.ihooyah.job.admin.core.schedule.XxlJobDynamicScheduler;
import org.quartz.Scheduler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......
package com.ihooyah.job.admin.core.jobbean;
import com.lxcy.job.admin.core.thread.JobTriggerPoolHelper;
import com.lxcy.job.admin.core.trigger.TriggerTypeEnum;
import com.ihooyah.job.admin.core.thread.JobTriggerPoolHelper;
import com.ihooyah.job.admin.core.trigger.TriggerTypeEnum;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
......
......@@ -28,7 +28,7 @@ public class XxlJobInfo {
private int executorTimeout; // 任务执行超时时间,单位秒
private int executorFailRetryCount; // 失败重试次数
private String glueType; // GLUE类型 #com.lxcy.job.core.glue.GlueTypeEnum
private String glueType; // GLUE类型 #com.ihooyah.job.core.glue.GlueTypeEnum
private String glueSource; // GLUE源代码
private String glueRemark; // GLUE备注
private Date glueUpdatetime; // GLUE更新时间
......
......@@ -8,7 +8,7 @@ public class XxlJobLogGlue {
private int id;
private int jobId; // 任务主键ID
private String glueType; // GLUE类型 #com.lxcy.job.core.glue.GlueTypeEnum
private String glueType; // GLUE类型 #com.ihooyah.job.core.glue.GlueTypeEnum
private String glueSource;
private String glueRemark;
private String addTime;
......
package com.ihooyah.job.admin.core.route;
import com.lxcy.job.admin.core.route.strategy.*;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.core.route.strategy.*;
import com.ihooyah.job.admin.core.util.I18nUtil;
/**
* Created by xuxueli on 17/3/10.
......
package com.ihooyah.job.admin.core.route;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.core.biz.ExecutorBiz;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.core.biz.ExecutorBiz;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.List;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.core.biz.ExecutorBiz;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.core.biz.ExecutorBiz;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.List;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.List;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.ArrayList;
import java.util.LinkedHashMap;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.List;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.List;
import java.util.Random;
......
package com.ihooyah.job.admin.core.route.strategy;
import com.lxcy.job.admin.core.route.ExecutorRouter;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.ihooyah.job.admin.core.route.ExecutorRouter;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import java.util.List;
import java.util.Random;
......
package com.ihooyah.job.admin.core.schedule;
import com.lxcy.job.admin.core.conf.XxlJobAdminConfig;
import com.lxcy.job.admin.core.jobbean.RemoteHttpJobBean;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.thread.JobFailMonitorHelper;
import com.lxcy.job.admin.core.thread.JobRegistryMonitorHelper;
import com.lxcy.job.admin.core.thread.JobTriggerPoolHelper;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.core.biz.AdminBiz;
import com.lxcy.job.core.biz.ExecutorBiz;
import com.lxcy.job.core.enums.ExecutorBlockStrategyEnum;
import com.ihooyah.job.admin.core.conf.XxlJobAdminConfig;
import com.ihooyah.job.admin.core.jobbean.RemoteHttpJobBean;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.thread.JobFailMonitorHelper;
import com.ihooyah.job.admin.core.thread.JobRegistryMonitorHelper;
import com.ihooyah.job.admin.core.thread.JobTriggerPoolHelper;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.core.biz.AdminBiz;
import com.ihooyah.job.core.biz.ExecutorBiz;
import com.ihooyah.job.core.enums.ExecutorBlockStrategyEnum;
import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
import com.xxl.rpc.remoting.invoker.call.CallType;
import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
......
package com.ihooyah.job.admin.core.thread;
import com.lxcy.job.admin.core.conf.XxlJobAdminConfig;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.model.XxlJobLog;
import com.lxcy.job.admin.core.trigger.TriggerTypeEnum;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.core.biz.model.ReturnT;
import com.ihooyah.job.admin.core.conf.XxlJobAdminConfig;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.model.XxlJobLog;
import com.ihooyah.job.admin.core.trigger.TriggerTypeEnum;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.core.biz.model.ReturnT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.javamail.MimeMessageHelper;
......
package com.ihooyah.job.admin.core.thread;
import com.lxcy.job.admin.core.conf.XxlJobAdminConfig;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.lxcy.job.admin.core.model.XxlJobRegistry;
import com.lxcy.job.core.enums.RegistryConfig;
import com.ihooyah.job.admin.core.conf.XxlJobAdminConfig;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobRegistry;
import com.ihooyah.job.core.enums.RegistryConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
package com.ihooyah.job.admin.core.thread;
import com.lxcy.job.admin.core.trigger.TriggerTypeEnum;
import com.lxcy.job.admin.core.trigger.XxlJobTrigger;
import com.ihooyah.job.admin.core.trigger.TriggerTypeEnum;
import com.ihooyah.job.admin.core.trigger.XxlJobTrigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
package com.ihooyah.job.admin.core.trigger;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.core.util.I18nUtil;
/**
* trigger type enum
......
package com.ihooyah.job.admin.core.trigger;
import com.lxcy.job.admin.core.conf.XxlJobAdminConfig;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.model.XxlJobLog;
import com.lxcy.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.lxcy.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.core.biz.ExecutorBiz;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.biz.model.TriggerParam;
import com.lxcy.job.core.enums.ExecutorBlockStrategyEnum;
import com.ihooyah.job.admin.core.conf.XxlJobAdminConfig;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.model.XxlJobLog;
import com.ihooyah.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.ihooyah.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.core.biz.ExecutorBiz;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.biz.model.TriggerParam;
import com.ihooyah.job.core.enums.ExecutorBlockStrategyEnum;
import com.xxl.rpc.util.IpUtil;
import com.xxl.rpc.util.ThrowableUtil;
import org.apache.commons.lang3.StringUtils;
......
package com.ihooyah.job.admin.core.util;
import com.lxcy.job.admin.core.conf.XxlJobAdminConfig;
import com.ihooyah.job.admin.core.conf.XxlJobAdminConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
package com.ihooyah.job.admin.dao;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......
package com.ihooyah.job.admin.dao;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......
package com.ihooyah.job.admin.dao;
import com.lxcy.job.admin.core.model.XxlJobLog;
import com.ihooyah.job.admin.core.model.XxlJobLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......
package com.ihooyah.job.admin.dao;
import com.lxcy.job.admin.core.model.XxlJobLogGlue;
import com.ihooyah.job.admin.core.model.XxlJobLogGlue;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......
package com.ihooyah.job.admin.dao;
import com.lxcy.job.admin.core.model.XxlJobRegistry;
import com.ihooyah.job.admin.core.model.XxlJobRegistry;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......
package com.ihooyah.job.admin.service;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.core.biz.model.ReturnT;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.core.biz.model.ReturnT;
import java.util.Date;
import java.util.Map;
......
package com.ihooyah.job.admin.service.impl;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.model.XxlJobLog;
import com.lxcy.job.admin.core.thread.JobTriggerPoolHelper;
import com.lxcy.job.admin.core.trigger.TriggerTypeEnum;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.admin.dao.XxlJobInfoDao;
import com.lxcy.job.admin.dao.XxlJobLogDao;
import com.lxcy.job.admin.dao.XxlJobRegistryDao;
import com.lxcy.job.core.biz.AdminBiz;
import com.lxcy.job.core.biz.model.HandleCallbackParam;
import com.lxcy.job.core.biz.model.RegistryParam;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.handler.IJobHandler;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.model.XxlJobLog;
import com.ihooyah.job.admin.core.thread.JobTriggerPoolHelper;
import com.ihooyah.job.admin.core.trigger.TriggerTypeEnum;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.dao.XxlJobInfoDao;
import com.ihooyah.job.admin.dao.XxlJobLogDao;
import com.ihooyah.job.admin.dao.XxlJobRegistryDao;
import com.ihooyah.job.core.biz.AdminBiz;
import com.ihooyah.job.core.biz.model.HandleCallbackParam;
import com.ihooyah.job.core.biz.model.RegistryParam;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.handler.IJobHandler;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......
package com.ihooyah.job.admin.service.impl;
import com.lxcy.job.admin.core.model.XxlJobGroup;
import com.lxcy.job.admin.core.model.XxlJobInfo;
import com.lxcy.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.lxcy.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.lxcy.job.admin.core.util.I18nUtil;
import com.lxcy.job.admin.dao.XxlJobGroupDao;
import com.lxcy.job.admin.dao.XxlJobInfoDao;
import com.lxcy.job.admin.dao.XxlJobLogDao;
import com.lxcy.job.admin.dao.XxlJobLogGlueDao;
import com.lxcy.job.admin.service.XxlJobService;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.enums.ExecutorBlockStrategyEnum;
import com.lxcy.job.core.glue.GlueTypeEnum;
import com.ihooyah.job.admin.core.model.XxlJobGroup;
import com.ihooyah.job.admin.core.model.XxlJobInfo;
import com.ihooyah.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.ihooyah.job.admin.core.schedule.XxlJobDynamicScheduler;
import com.ihooyah.job.admin.core.util.I18nUtil;
import com.ihooyah.job.admin.dao.XxlJobGroupDao;
import com.ihooyah.job.admin.dao.XxlJobInfoDao;
import com.ihooyah.job.admin.dao.XxlJobLogDao;
import com.ihooyah.job.admin.dao.XxlJobLogGlueDao;
import com.ihooyah.job.admin.service.XxlJobService;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.enums.ExecutorBlockStrategyEnum;
import com.ihooyah.job.core.glue.GlueTypeEnum;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.lang3.time.FastDateFormat;
......
......@@ -16,9 +16,9 @@ spring.freemarker.settings.number_format=0.##########
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://rm-bp1aoiwjzkd1455b8ko.mysql.rds.aliyuncs.com:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
spring.datasource.url=jdbc:mysql://10.10.10.113:3306/hza_job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=Huangjie0913
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
......
......@@ -34,12 +34,12 @@
ORDER BY t.order ASC
</select>
<insert id="save" parameterType="com.lxcy.job.admin.core.model.XxlJobGroup" useGeneratedKeys="true" keyProperty="id" >
<insert id="save" parameterType="com.ihooyah.job.admin.core.model.XxlJobGroup" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `app_name`, `title`, `order`, `address_type`, `address_list`)
values ( #{appName}, #{title}, #{order}, #{addressType}, #{addressList});
</insert>
<update id="update" parameterType="com.lxcy.job.admin.core.model.XxlJobGroup" >
<update id="update" parameterType="com.ihooyah.job.admin.core.model.XxlJobGroup" >
UPDATE XXL_JOB_QRTZ_TRIGGER_GROUP
SET `app_name` = #{appName},
`title` = #{title},
......
......@@ -87,7 +87,7 @@
</trim>
</select>
<insert id="save" parameterType="com.lxcy.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" >
<insert id="save" parameterType="com.ihooyah.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO XXL_JOB_QRTZ_TRIGGER_INFO (
job_group,
job_cron,
......@@ -139,7 +139,7 @@
WHERE t.id = #{id}
</select>
<update id="update" parameterType="com.lxcy.job.admin.core.model.XxlJobInfo" >
<update id="update" parameterType="com.ihooyah.job.admin.core.model.XxlJobInfo" >
UPDATE XXL_JOB_QRTZ_TRIGGER_INFO
SET
job_group = #{jobGroup},
......
......@@ -23,7 +23,7 @@
t.update_time
</sql>
<insert id="save" parameterType="com.lxcy.job.admin.core.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" >
<insert id="save" parameterType="com.ihooyah.job.admin.core.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOGGLUE (
`job_id`,
`glue_type`,
......
......@@ -117,7 +117,7 @@
</select>
<insert id="save" parameterType="com.lxcy.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
<insert id="save" parameterType="com.ihooyah.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG (
`job_group`,
`job_id`,
......
......@@ -20,7 +20,7 @@ org.quartz.jobStore.maxMisfiresToHandleAtATime: 1
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
# for async trigger
org.quartz.threadPool.class: com.lxcy.job.admin.core.quartz.XxlJobThreadPool
org.quartz.threadPool.class: com.ihooyah.job.admin.core.quartz.XxlJobThreadPool
# for cluster
org.quartz.jobStore.tablePrefix: XXL_JOB_QRTZ_
......
......@@ -182,9 +182,9 @@
<textarea class="glueSource_java" style="display:none;" >
package com.xxl.job.service.handler;
import com.lxcy.job.core.log.XxlJobLogger;
import com.lxcy.job.core.biz.model.ReturnT;
import com.lxcy.job.core.handler.IJobHandler;
import com.ihooyah.job.core.log.XxlJobLogger;
import com.ihooyah.job.core.biz.model.ReturnT;
import com.ihooyah.job.core.handler.IJobHandler;
public class DemoGlueJobHandler extends IJobHandler {
......
......@@ -11,6 +11,91 @@
<artifactId>ihooyah-hza-generator</artifactId>
<properties>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
<mysql.version>5.1.38</mysql.version>
<druid.version>1.0.28</druid.version>
<commons.lang.version>2.6</commons.lang.version>
<commons.io.version>2.5</commons.io.version>
<commons.configuration.version>1.10</commons.configuration.version>
<fastjson.version>1.2.31</fastjson.version>
<velocity.version>1.7</velocity.version>
</properties>
<dependencies>
<dependency>
<groupId>com.ihooyah</groupId>
<artifactId>ihooyah-hza-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.lang.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>${commons.configuration.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<artifactId>velocity</artifactId>
<groupId>org.apache.velocity</groupId>
<version>${velocity.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.ihooyah.modules.generator;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.ihooyah.modules.generator.mapper")
public class GeneratorApplication {
public static void main(String[] args) {
SpringApplication.run(GeneratorApplication.class, args);
}
}
\ No newline at end of file
package com.ihooyah.modules.generator.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/admin/**").addResourceLocations(
"classpath:/static/*");
}
}
package com.ihooyah.modules.generator.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Map;
@Controller
@RequestMapping("")
public class HomeController{
@RequestMapping(value = "index",method = RequestMethod.GET)
public String index(Map<String,Object> map){
return "index";
}
@RequestMapping(value = "about",method = RequestMethod.GET)
public String about(){
return "about";
}
@RequestMapping(value = "generator",method = RequestMethod.GET)
public String user(){
return "generator/list";
}
}
package com.ihooyah.modules.generator.entity;
public class ColumnEntity {
//列名
private String columnName;
//列名类型
private String dataType;
//列名备注
private String comments;
//属性名称(第一个字母大写),如:user_name => UserName
private String attrName;
//属性名称(第一个字母小写),如:user_name => userName
private String attrname;
//属性类型
private String attrType;
//auto_increment
private String extra;
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public String getAttrname() {
return attrname;
}
public void setAttrname(String attrname) {
this.attrname = attrname;
}
public String getAttrName() {
return attrName;
}
public void setAttrName(String attrName) {
this.attrName = attrName;
}
public String getAttrType() {
return attrType;
}
public void setAttrType(String attrType) {
this.attrType = attrType;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
}
package com.ihooyah.modules.generator.entity;
import java.util.List;
public class TableEntity {
//表的名称
private String tableName;
//表的备注
private String comments;
//表的主键
private ColumnEntity pk;
//表的列名(不包含主键)
private List<ColumnEntity> columns;
//类名(第一个字母大写),如:sys_user => SysUser
private String className;
//类名(第一个字母小写),如:sys_user => sysUser
private String classname;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public ColumnEntity getPk() {
return pk;
}
public void setPk(ColumnEntity pk) {
this.pk = pk;
}
public List<ColumnEntity> getColumns() {
return columns;
}
public void setColumns(List<ColumnEntity> columns) {
this.columns = columns;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
}
package com.ihooyah.modules.generator.mapper;
import java.util.List;
import java.util.Map;
public interface GeneratorMapper {
List<Map<String, Object>> queryList(Map<String, Object> map);
int queryTotal(Map<String, Object> map);
Map<String, String> queryTable(String tableName);
List<Map<String, String>> queryColumns(String tableName);
}
package com.ihooyah.modules.generator.rest;
import com.alibaba.fastjson.JSON;
import com.ihooyah.common.msg.TableRespInfo;
import com.ihooyah.modules.generator.service.GeneratorService;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/base/generator")
public class GeneratorRest {
@Autowired
private GeneratorService generatorService;
/**
* 列表
*/
@ResponseBody
@RequestMapping("/page")
public TableRespInfo<Map<String, Object>> list(@RequestParam Map<String, Object> params) {
List<Map<String, Object>> result = generatorService.queryList(params);
int total = generatorService.queryTotal(params);
return new TableRespInfo<>(total, result);
}
/**
* 生成代码
*/
@RequestMapping("/code")
public void code(HttpServletRequest request, HttpServletResponse response) throws IOException {
String[] tableNames = new String[]{};
String tables = request.getParameter("tables");
tableNames = JSON.parseArray(tables).toArray(tableNames);
byte[] data = generatorService.generatorCode(tableNames);
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"ihooyah-generator-code.zip\"");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
IOUtils.write(data, response.getOutputStream());
}
}
package com.ihooyah.modules.generator.service;
import com.ihooyah.modules.generator.mapper.GeneratorMapper;
import com.ihooyah.modules.generator.utils.GeneratorUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipOutputStream;
@Service
public class GeneratorService {
@Autowired
private GeneratorMapper generatorMapper;
public List<Map<String, Object>> queryList(Map<String, Object> map) {
int offset = Integer.parseInt(map.get("offset").toString());
int limit = Integer.parseInt(map.get("limit").toString());
map.put("offset", offset);
map.put("limit", limit);
return generatorMapper.queryList(map);
}
public int queryTotal(Map<String, Object> map) {
return generatorMapper.queryTotal(map);
}
public Map<String, String> queryTable(String tableName) {
return generatorMapper.queryTable(tableName);
}
public List<Map<String, String>> queryColumns(String tableName) {
return generatorMapper.queryColumns(tableName);
}
public byte[] generatorCode(String[] tableNames) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
for(String tableName : tableNames){
//查询表信息
Map<String, String> table = queryTable(tableName);
//查询列信息
List<Map<String, String>> columns = queryColumns(tableName);
//生成代码
GeneratorUtils.generatorCode(table, columns, zip);
}
IOUtils.closeQuietly(zip);
return outputStream.toByteArray();
}
}
package com.ihooyah.modules.generator.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtils {
/** 时间格式(yyyy-MM-dd) */
public final static String DATE_PATTERN = "yyyy-MM-dd";
/** 时间格式(yyyy-MM-dd HH:mm:ss) */
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static String format(Date date) {
return format(date, DATE_PATTERN);
}
public static String format(Date date, String pattern) {
if(date != null){
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
return null;
}
}
package com.ihooyah.modules.generator.utils;
import com.ihooyah.modules.generator.entity.ColumnEntity;
import com.ihooyah.modules.generator.entity.TableEntity;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 代码生成器 工具类
*
* @author chenshun
* @email sunlightcs@gmail.com
* @date 2016年12月19日 下午11:40:24
*/
public class GeneratorUtils {
public static List<String> getTemplates() {
List<String> templates = new ArrayList<String>();
templates.add("template/mapper.xml.vm");
templates.add("template/biz.java.vm");
templates.add("template/entity.java.vm");
templates.add("template/mapper.java.vm");
templates.add("template/controller.java.vm");
return templates;
}
/**
* 生成代码
*/
public static void generatorCode(Map<String, String> table,
List<Map<String, String>> columns, ZipOutputStream zip) {
//配置信息
Configuration config = getConfig();
//表信息
TableEntity tableEntity = new TableEntity();
tableEntity.setTableName(table.get("tableName"));
tableEntity.setComments(table.get("tableComment"));
//表名转换成Java类名
String className = tableToJava(tableEntity.getTableName(), config.getString("tablePrefix"));
tableEntity.setClassName(className);
tableEntity.setClassname(StringUtils.uncapitalize(className));
//列信息
List<ColumnEntity> columsList = new ArrayList<>();
for (Map<String, String> column : columns) {
ColumnEntity columnEntity = new ColumnEntity();
columnEntity.setColumnName(column.get("columnName"));
columnEntity.setDataType(column.get("dataType"));
columnEntity.setComments(column.get("columnComment"));
columnEntity.setExtra(column.get("extra"));
//列名转换成Java属性名
String attrName = columnToJava(columnEntity.getColumnName());
columnEntity.setAttrName(attrName);
columnEntity.setAttrname(StringUtils.uncapitalize(attrName));
//列的数据类型,转换成Java类型
String attrType = config.getString(columnEntity.getDataType(), "unknowType");
columnEntity.setAttrType(attrType);
//是否主键
if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) {
tableEntity.setPk(columnEntity);
}
columsList.add(columnEntity);
}
tableEntity.setColumns(columsList);
//没主键,则第一个字段为主键
if (tableEntity.getPk() == null) {
tableEntity.setPk(tableEntity.getColumns().get(0));
}
//设置velocity资源加载器
Properties prop = new Properties();
prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init(prop);
//封装模板数据
Map<String, Object> map = new HashMap<>();
map.put("tableName", tableEntity.getTableName());
map.put("comments", tableEntity.getComments());
map.put("pk", tableEntity.getPk());
map.put("className", tableEntity.getClassName());
map.put("classname", tableEntity.getClassname());
map.put("pathName", tableEntity.getClassname().toLowerCase());
map.put("columns", tableEntity.getColumns());
map.put("package", config.getString("package"));
map.put("author", config.getString("author"));
map.put("email", config.getString("email"));
map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
map.put("moduleName", config.getString("mainModule"));
map.put("secondModuleName", toLowerCaseFirstOne(className));
VelocityContext context = new VelocityContext(map);
//获取模板列表
List<String> templates = getTemplates();
for (String template : templates) {
//渲染模板
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate(template, "UTF-8");
tpl.merge(context, sw);
try {
//添加到zip
zip.putNextEntry(new ZipEntry(getFileName(template, tableEntity.getClassName(), config.getString("package"), config.getString("mainModule"))));
IOUtils.write(sw.toString(), zip, "UTF-8");
IOUtils.closeQuietly(sw);
zip.closeEntry();
} catch (IOException e) {
throw new RuntimeException("渲染模板失败,表名:" + tableEntity.getTableName(), e);
}
}
}
/**
* 列名转换成Java属性名
*/
public static String columnToJava(String columnName) {
return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", "");
}
/**
* 表名转换成Java类名
*/
public static String tableToJava(String tableName, String tablePrefix) {
if (StringUtils.isNotBlank(tablePrefix)) {
tableName = tableName.replace(tablePrefix, "");
}
return columnToJava(tableName);
}
/**
* 获取配置信息
*/
public static Configuration getConfig() {
try {
return new PropertiesConfiguration("generator.properties");
} catch (ConfigurationException e) {
throw new RuntimeException("获取配置文件失败,", e);
}
}
/**
* 获取文件名
*/
public static String getFileName(String template, String className, String packageName, String moduleName) {
String packagePath = "main" + File.separator + "java" + File.separator;
String frontPath = "ui" + File.separator;
if (StringUtils.isNotBlank(packageName)) {
packagePath += packageName.replace(".", File.separator) + File.separator;
}
if (template.contains("biz.java.vm")) {
return packagePath + "biz" + File.separator + className + "Biz.java";
}
if (template.contains("mapper.java.vm")) {
return packagePath + "mapper" + File.separator + className + "Mapper.java";
}
if (template.contains("entity.java.vm")) {
return packagePath + "entity" + File.separator + className + ".java";
}
if (template.contains("controller.java.vm")) {
return packagePath + "rest" + File.separator + className + "Controller.java";
}
if (template.contains("mapper.xml.vm")) {
return "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml";
}
return null;
}
//首字母转小写
public static String toLowerCaseFirstOne(String s) {
if (Character.isLowerCase(s.charAt(0))) {
return s;
} else {
return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
}
}
}
# Tomcat
server:
tomcat:
max-threads: 10
min-spare-threads: 10
port: 7777
# mysql
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://10.10.10.113:3306/hza_admin?useUnicode=true&characterEncoding=UTF8
username: root
password: 123456
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
thymeleaf:
mode: LEGACYHTML5
cache: false
# Mybatis配置
mybatis:
mapperLocations: classpath:mapper/**/*.xml
#代码生成器,配置信息
#包名
package=com.ihooyah.modules.system
#作者
author=fatiaojie
#Email
email=7854033@qq.com
#表前错误的Unicode字符串!
tablePrefix=ihooya_
#前端模块前缀
mainModule=auth
#类型转换,配置信息
tinyint=Integer
smallint=Integer
mediumint=Integer
int=Integer
integer=Integer
bigint=Long
float=Float
double=Double
decimal=BigDecimal
bit=Boolean
char=String
varchar=String
tinytext=String
text=String
mediumtext=String
longtext=String
date=Date
datetime=Date
timestamp=Date
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ihooyah.modules.generator.mapper.GeneratorMapper">
<select id="queryList" resultType="map">
select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables
where table_schema = (select database())
<if test="tableName != null and tableName.trim() != ''">
and table_name like concat('%', #{tableName}, '%')
</if>
order by create_time desc
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="queryTotal" resultType="int">
select count(*) from information_schema.tables where table_schema = (select database())
<if test="tableName != null and tableName.trim() != ''">
and table_name like concat('%', #{tableName}, '%')
</if>
</select>
<select id="queryTable" resultType="map">
select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables
where table_schema = (select database()) and table_name = #{tableName}
</select>
<select id="queryColumns" resultType="map">
select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns
where table_name = #{tableName} and table_schema = (select database()) order by ordinal_position
</select>
</mapper>
\ No newline at end of file
var generator = {
baseUrl: "/base/generator",
tableId: "generatorTable",
toolbarId: "toolbar",
unique: "id",
order: "asc",
currentItems: {}
};
generator.columns = function () {
return [{
checkbox: true
}, {
field: 'tableName',
title: '表名'
}, {
field: 'tableComment',
title: '表备注'
}, {
field: 'createTime',
title: '创建时间'
}];
};
generator.queryParams = function (params) {
if (!params)
return {
name: $("#name").val()
};
var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
limit: params.limit, //页面大小
offset: params.offset, //页码
tableName: $("#name").val()
};
return temp;
};
generator.init = function () {
generator.table = $('#' + generator.tableId).bootstrapTable({
url: generator.baseUrl + '/page', //请求后台的URL(*)
method: 'get', //请求方式(*)
toolbar: '#' + generator.toolbarId, //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: true, //是否显示分页(*)
sortable: false, //是否启用排序
sortOrder: generator.order, //排序方式
queryParams: generator.queryParams,//传递参数(*)
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 10, //每页的记录行数(*)
pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
strictSearch: false,
showColumns: false, //是否显示所有的列
showRefresh: true, //是否显示刷新按钮
minimumCountColumns: 2, //最少允许的列数
clickToSelect: true, //是否启用点击选中行
uniqueId: generator.unique, //每一行的唯一标识,一般为主键列
showToggle: true, //是否显示详细视图和列表视图的切换按钮
cardView: false, //是否显示详细视图
detailView: false, //是否显示父子表
columns: generator.columns(),
responseHandler: function(res) {
return {
"total": res.result.total,//总页数
"rows": res.result.rows //数据
};
}
});
};
generator.select = function (layerTips) {
var rows = generator.table.bootstrapTable('getSelections');
if (rows.length >0) {
generator.currentItems = rows;
return true;
} else {
layerTips.msg("请至少选中一行");
return false;
}
};
layui.use(['form', 'layedit', 'laydate'], function () {
generator.init();
var editIndex;
var layerTips = parent.layer === undefined ? layui.layer : parent.layer, //获取父窗口的layer对象
layer = layui.layer, //获取当前窗口的layer对象
form = layui.form(),
layedit = layui.layedit,
laydate = layui.laydate;
var addBoxIndex = -1;
//初始化页面上面的按钮事件
$('#btn_query').on('click', function () {
generator.table.bootstrapTable('refresh', generator.queryParams());
});
$('#btn_generate').on('click',function(){
if(generator.select()){
var tableNames = [];
for(var i=0;i<generator.currentItems.length;i++){
tableNames.push(generator.currentItems[i].tableName);
}
location.href = "/base/generator/code?tables=" + encodeURIComponent(JSON.stringify(tableNames));
}
});
});
\ No newline at end of file
.select2-container{
z-index: 999999999;
}
\ No newline at end of file
.beg-table-box {
position: relative;
height: 100%;
width: 100%;
max-width: 100%;
}
.beg-table-header {
position: absolute;
width: 100%;
}
.beg-table-header table {
width: 100%;
max-width: 100%;
}
.beg-table-header table thead tr th {
vertical-align: bottom;
border-bottom: 2px solid #DDDDDD;
padding: 7px 15px;
background-color: #f2f2f2;
}
.beg-table-body {
overflow: auto;
width: 100%;
max-height: 100%;
}
.beg-table {
width: 100%;
max-width: 100%;
height: 100%;
margin-bottom: 40px;
}
.beg-table thead {}
.beg-table thead tr {}
.beg-table thead tr th {
vertical-align: bottom;
border-bottom: 2px solid #DDDDDD;
padding: 7px 15px;
background-color: #f2f2f2;
}
.beg-table tbody {}
.beg-table tbody tr {}
.beg-table tbody tr td {
padding: 7px 15px;
border-bottom: 1px solid #DDDDDD;
vertical-align: top;
}
.beg-table-bordered {
border: 1px solid #DDDDDD;
}
.beg-table-bordered td,
.beg-table-bordered th {
border: 1px solid #DDDDDD;
}
.beg-table-striped tbody tr:nth-child(even),
.beg-table-hovered tbody tr:hover {
background-color: #f6f6f6;
}
/*page*/
.beg-table-box .beg-table-paged {
position: absolute;
bottom: 0;
width: 100%;
height: 40px;
line-height: 40px;
background-color: #f2f2f2;
}
.beg-table-box .beg-table-paged .layui-laypage {
margin: 3px 5px 0 5px;
}
.beg-table-box .beg-table-paged .layui-laypage a {
/*margin: 0;*/
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
.btable {
position: relative;
width: 100%;
height: 100%;
}
.btable .layui-form-checkbox {
margin-top: 0;
height: 20px;
line-height: 20px;
}
.btable .layui-table {
/*margin: 5px;*/
margin-bottom: 38px;
}
.btable .layui-table td {
padding: 6px 15px;
}
.btable .layui-laypage {
margin: 5px;
}
.btable .layui-laypage a, .btable .layui-laypage span {
border: 0;
margin: 0;
}
.btable .layui-laypage button, .btable .layui-laypage input, .btable .layui-laypage .layui-laypage-total {
height: 28px;
line-height: 28px;
}
.btable .layui-laypage button, .btable .layui-laypage input {
border: 0;
}
.btable .btable-paged {
width: 100%;
background-color: #f2f2f2;
position: fixed;
bottom: 0;
}
.btable thead tr th {
position: relative;
}
.btable-order {
position: absolute;
right: 0;
top: 10px;
}
.btable-order .up, .down {
width: 30px;
height: 10px;
text-align: center;
position: absolute;
top: 0;
right: 0;
cursor: pointer;
}
.btable-order .down {
top: 10px;
}
.btable-order .up .fa {
width: 30px;
position: absolute;
right: 0;
top: 0;
}
.btable-order .down .fa {
height: 8px;
position: absolute;
top: -5px;
right: 11px;
}
.beg-layout-container{
/*min-width: 1024px;*/
}
.beg-layout-container .beg-layout-main{
position: absolute;
}
.beg-layout-container .beg-layout-header{
background-color: #FFFFFF;
height: 55px;
position: fixed;
width: 100%;
min-width: 800px;
border-bottom: 5px solid #1AA094;
}
.beg-layout-container .beg-layout-header .beg-layout-logo{
width: 200px;
height: 60px;
text-align: center;
line-height: 60px;
}
.beg-layout-container .beg-layout-header .beg-layout-side-toggle{
position: absolute;
cursor: pointer;
z-index: 19940201;
left: 200px;
color: white;
text-align: center;
width: 30px;
height: 30px;
background-color: #1AA094;
line-height: 30px;
top: 25%;
}
.beg-layout-container .beg-layout-header .beg-layout-side-toggle:hover{
background-color: #5FB878;
}
.beg-layout-container .beg-layout-header .beg-layout-menu{
top: 0;
left:230px;
}
.beg-layout-header .beg-layout-menu .beg-layout-nav{
background: none;
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-nav-item{
line-height: 60px;
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-nav-item .layui-nav-more{
top:27px
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-nav-item .layui-nav-mored{
top:20px
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-this{
color: #FFFFFF;
background-color: #4E5465;
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-this:after,.beg-layout-header .layui-nav-bar{
background-color: #4E5465;
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-nav-item a{
color: #393D49;
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-this a{
color: #FFFFFF;
}
.beg-layout-header .beg-layout-menu .beg-layout-nav .layui-nav-item a:hover{
color: #FFFFFF;
background-color: #4E5465;
}
.beg-layout-header .beg-layout-panel{
right: 10px;
}
.beg-layout-header .beg-layout-panel .beg-layout-nav{
background: none;
}
.beg-layout-header .beg-layout-panel .beg-layout-nav a{
color: #393D49;
}
.beg-layout-header .beg-layou-head{
}
.beg-layout-header .beg-layou-head img{
width: 40px; height: 40px; border-radius: 100%;
}
.beg-layout-container .beg-layout-side{
background-color: #393D49;
color: #FFFFFF;
top: 60px;
}
.beg-layout-container .beg-layout-body{
top: 60px;
height: auto;
}
.beg-layout-container .beg-layout-body .layout-nav-card cite{
font-style: normal;
padding-left: 5px;
}
.beg-layout-body iframe{
width: 100%;
border: 0;
height: 99.5%;
}
.beg-layout-container .beg-layout-footer{
line-height: 44px;
text-align: center;
}
.layout-tab-contextmenu {width: 135px; background-color: #CCCCCC;position: absolute; z-index: 19940201;display: none;}
.layout-tab-contextmenu .layui-nav{
padding: 5px 3px;
}
.layout-tab-contextmenu .layui-nav .layui-nav-item{
line-height: 27px;width: 100%;
}
.layout-tab-contextmenu .layui-nav .layui-nav-item:hover{
background-color: #5FB878;
}
.layout-tab-contextmenu .layui-nav .layui-nav-item a{
text-align: left;
}
.layout-tab-contextmenu .layui-nav .layui-this:after, .layout-tab-contextmenu .layui-nav-bar {
transition: none; -webkit-transition:none; background: none;
}
.admin-contextmenu{
position: absolute;line-height: 36px;padding: 5px 0;
border: 1px solid #d2d2d2;background-color: white;z-index: 19940201;border-radius: 2px;white-space: nowrap;top:30px;
/*width: 100px;height: 200px; */
}
.admin-contextmenu ul li{
padding: 0 15px;
}
.admin-contextmenu ul li:hover{
background-color: #eee;
cursor: pointer;
}
@media screen and (max-width: 1024px) {
.beg-layout-menu cite{
display: none;
}
}
\ No newline at end of file
/** layui-v1.0.9_rls MIT License By http://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)}.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}@-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}.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
.beg-login-bg {
background: url(../Images/login-bg-1.jpg) no-repeat center center fixed;
background-color: #393D49;
}
.beg-login-box {
width: 450px;
height: 330px;
margin: 10% auto;
background-color: rgba(255, 255, 255, 0.407843);
border-radius: 10px;
color: aliceblue;
}
.beg-login-box header {
height: 39px;
padding: 10px;
border-bottom: 1px solid aliceblue;
}
.beg-login-box header h1 {
text-align: center;
font-size: 25px;
line-height: 40px;
}
.beg-login-box .beg-login-main {
height: 185px;
padding: 30px 90px 0;
}
.beg-login-main .layui-form-item {
position: relative;
}
.beg-login-main .layui-form-item .beg-login-icon {
position: absolute;
color: #cccccc;
top: 10px;
left: 10px;
}
.beg-login-main .layui-form-item input {
padding-left: 34px;
}
.beg-login-box footer {
height: 35px;
padding: 10px 10px 0 10px;
}
.beg-login-box footer p {
line-height: 35px;
text-align: center;
}
.beg-pull-left {
float: left !important;
}
.beg-pull-right {
float: right !important;
}
.beg-clear {
clear: both;
}
.beg-login-remember {
line-height: 38px;
}
.beg-login-remember .layui-form-switch {
margin-top: 0px;
}
.beg-login-code-box {
position: relative;
padding: 10px;
}
.beg-login-code-box input {
position: absolute;
width: 100px;
}
.beg-login-code-box img {
cursor: pointer;
position: absolute;
left: 115px;
height: 38px;
}
\ No newline at end of file
.admin-main{
margin: 15px;
}
.admin-main .layui-field-title .layui-field-box{
padding: 10px 30px;
}
.admin-main .layui-field-title .layui-field-box p{
padding: 5px 0;
}
/** layui-v1.0.9_rls MIT License By http://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 #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:30px;line-height:30px;border-bottom:1px solid #ddd}.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 #ddd;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
/* iCheck plugin Flat skin, aero
----------------------------------- */
.icheckbox_flat-aero,
.iradio_flat-aero {
display: inline-block;
*display: inline;
vertical-align: middle;
margin: 0;
padding: 0;
width: 20px;
height: 20px;
background: url(aero.png) no-repeat;
border: none;
cursor: pointer;
}
.icheckbox_flat-aero {
background-position: 0 0;
}
.icheckbox_flat-aero.checked {
background-position: -22px 0;
}
.icheckbox_flat-aero.disabled {
background-position: -44px 0;
cursor: default;
}
.icheckbox_flat-aero.checked.disabled {
background-position: -66px 0;
}
.iradio_flat-aero {
background-position: -88px 0;
}
.iradio_flat-aero.checked {
background-position: -110px 0;
}
.iradio_flat-aero.disabled {
background-position: -132px 0;
cursor: default;
}
.iradio_flat-aero.checked.disabled {
background-position: -154px 0;
}
/* HiDPI support */
@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
.icheckbox_flat-aero,
.iradio_flat-aero {
background-image: url(aero@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
}
\ No newline at end of file
/* iCheck plugin Flat skin, blue
----------------------------------- */
.icheckbox_flat-blue,
.iradio_flat-blue {
display: inline-block;
*display: inline;
vertical-align: middle;
margin: 0;
padding: 0;
width: 20px;
height: 20px;
background: url(blue.png) no-repeat;
border: none;
cursor: pointer;
}
.icheckbox_flat-blue {
background-position: 0 0;
}
.icheckbox_flat-blue.checked {
background-position: -22px 0;
}
.icheckbox_flat-blue.disabled {
background-position: -44px 0;
cursor: default;
}
.icheckbox_flat-blue.checked.disabled {
background-position: -66px 0;
}
.iradio_flat-blue {
background-position: -88px 0;
}
.iradio_flat-blue.checked {
background-position: -110px 0;
}
.iradio_flat-blue.disabled {
background-position: -132px 0;
cursor: default;
}
.iradio_flat-blue.checked.disabled {
background-position: -154px 0;
}
/* HiDPI support */
@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
.icheckbox_flat-blue,
.iradio_flat-blue {
background-image: url(blue@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
}
\ No newline at end of file
/* iCheck plugin flat skin, black
----------------------------------- */
.icheckbox_flat,
.iradio_flat {
display: inline-block;
*display: inline;
vertical-align: middle;
margin: 0;
padding: 0;
width: 20px;
height: 20px;
background: url(flat.png) no-repeat;
border: none;
cursor: pointer;
}
.icheckbox_flat {
background-position: 0 0;
}
.icheckbox_flat.checked {
background-position: -22px 0;
}
.icheckbox_flat.disabled {
background-position: -44px 0;
cursor: default;
}
.icheckbox_flat.checked.disabled {
background-position: -66px 0;
}
.iradio_flat {
background-position: -88px 0;
}
.iradio_flat.checked {
background-position: -110px 0;
}
.iradio_flat.disabled {
background-position: -132px 0;
cursor: default;
}
.iradio_flat.checked.disabled {
background-position: -154px 0;
}
/* HiDPI support */
@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
.icheckbox_flat,
.iradio_flat {
background-image: url(flat@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
}
\ No newline at end of file
/* iCheck plugin Flat skin, green
----------------------------------- */
.icheckbox_flat-green,
.iradio_flat-green {
display: inline-block;
*display: inline;
vertical-align: middle;
margin: 0;
padding: 0;
width: 20px;
height: 20px;
background: url(green.png) no-repeat;
border: none;
cursor: pointer;
}
.icheckbox_flat-green {
background-position: 0 0;
}
.icheckbox_flat-green.checked {
background-position: -22px 0;
}
.icheckbox_flat-green.disabled {
background-position: -44px 0;
cursor: default;
}
.icheckbox_flat-green.checked.disabled {
background-position: -66px 0;
}
.iradio_flat-green {
background-position: -88px 0;
}
.iradio_flat-green.checked {
background-position: -110px 0;
}
.iradio_flat-green.disabled {
background-position: -132px 0;
cursor: default;
}
.iradio_flat-green.checked.disabled {
background-position: -154px 0;
}
/* HiDPI support */
@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
.icheckbox_flat-green,
.iradio_flat-green {
background-image: url(green@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
}
\ 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.
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.
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