commit
67c5cc265e
103 changed files with 16749 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||||||
|
/.classpath |
||||||
|
/.project |
||||||
|
/.settings |
||||||
|
/bin/ |
||||||
|
/logs |
||||||
|
/target |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
server.port=80 |
||||||
|
server.servlet.context-path=/ |
||||||
|
logging.config:log4j2.xml |
||||||
|
|
||||||
|
# 程序自身数据源配置 |
||||||
|
spring.datasource.url=jdbc:mysql://localhost:3306/admin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true |
||||||
|
spring.datasource.username=root |
||||||
|
spring.datasource.password=51131420 |
||||||
|
|
||||||
@ -0,0 +1,21 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出 --> |
||||||
|
<!-- monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数。 --> |
||||||
|
<configuration status="error" monitorInterval="60"> |
||||||
|
|
||||||
|
<appenders> |
||||||
|
<!--控制台 --> |
||||||
|
<Console name="Console" target="SYSTEM_OUT"> |
||||||
|
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> |
||||||
|
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> |
||||||
|
<!--输出日志的格式 --> |
||||||
|
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%p] %class{36} %L %M - %msg%xEx%n" /> |
||||||
|
</Console> |
||||||
|
</appenders> |
||||||
|
<loggers> |
||||||
|
<logger name="com.sprt" level="DEBUG"></logger> |
||||||
|
<root level="warn"> |
||||||
|
<appender-ref ref="Console" /> |
||||||
|
</root> |
||||||
|
</loggers> |
||||||
|
</configuration> |
||||||
@ -0,0 +1,98 @@ |
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<parent> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-parent</artifactId> |
||||||
|
<version>2.0.2.RELEASE</version> |
||||||
|
</parent> |
||||||
|
<groupId>com.mengyxu.admin</groupId> |
||||||
|
<artifactId>mengyxu_admin</artifactId> |
||||||
|
<version>0.0.1</version> |
||||||
|
<name>admin</name> |
||||||
|
<description>mengyxu-admin</description> |
||||||
|
<packaging>jar</packaging> |
||||||
|
|
||||||
|
<properties> |
||||||
|
<mengyxu.core.version>0.0.1</mengyxu.core.version> |
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
||||||
|
<mybatis.pagehelper.version>1.2.5</mybatis.pagehelper.version> |
||||||
|
<mybatis-spring-boot.version>1.3.2</mybatis-spring-boot.version> |
||||||
|
<druid.version>1.1.9</druid.version> |
||||||
|
<log4j.version>1.2.17</log4j.version> |
||||||
|
</properties> |
||||||
|
|
||||||
|
<dependencies> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>com.mengyxu.core</groupId> |
||||||
|
<artifactId>mengyxu_core</artifactId> |
||||||
|
<version>${mengyxu.core.version}</version> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||||
|
<exclusions> |
||||||
|
<exclusion> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-logging</artifactId> |
||||||
|
</exclusion> |
||||||
|
</exclusions> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<!-- 代码修改之后可以实时生效,该模块在完整的打包环境下运行的时候会被禁用 --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-devtools</artifactId> |
||||||
|
<optional>true</optional> |
||||||
|
</dependency> |
||||||
|
<!-- Log4j --> |
||||||
|
<dependency> |
||||||
|
<groupId>log4j</groupId> |
||||||
|
<artifactId>log4j</artifactId> |
||||||
|
<version>${log4j.version}</version> |
||||||
|
<exclusions> |
||||||
|
<exclusion> |
||||||
|
<groupId>org.slf4j</groupId> |
||||||
|
<artifactId>slf4j-log4j12</artifactId> |
||||||
|
</exclusion> |
||||||
|
</exclusions> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<!-- spring-boot整合mybatis --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.mybatis.spring.boot</groupId> |
||||||
|
<artifactId>mybatis-spring-boot-starter</artifactId> |
||||||
|
<version>${mybatis-spring-boot.version}</version> |
||||||
|
</dependency> |
||||||
|
<!-- mybatis的pagehelper --> |
||||||
|
<dependency> |
||||||
|
<groupId>com.github.pagehelper</groupId> |
||||||
|
<artifactId>pagehelper-spring-boot-starter</artifactId> |
||||||
|
<version>${mybatis.pagehelper.version}</version> |
||||||
|
</dependency> |
||||||
|
<!-- mysql驱动 --> |
||||||
|
<dependency> |
||||||
|
<groupId>mysql</groupId> |
||||||
|
<artifactId>mysql-connector-java</artifactId> |
||||||
|
<scope>runtime</scope> |
||||||
|
</dependency> |
||||||
|
<!-- alibaba的druid数据库连接池 --> |
||||||
|
<dependency> |
||||||
|
<groupId>com.alibaba</groupId> |
||||||
|
<artifactId>druid-spring-boot-starter</artifactId> |
||||||
|
<version>${druid.version}</version> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<!-- <dependency> --> |
||||||
|
<!-- <groupId>org.apache.commons</groupId> --> |
||||||
|
<!-- <artifactId>commons-lang3</artifactId> --> |
||||||
|
<!-- </dependency> --> |
||||||
|
|
||||||
|
</dependencies> |
||||||
|
|
||||||
|
</project> |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
package com.mengyxu.admin; |
||||||
|
|
||||||
|
import org.mybatis.spring.annotation.MapperScan; |
||||||
|
import org.springframework.boot.SpringApplication; |
||||||
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
||||||
|
import org.springframework.boot.builder.SpringApplicationBuilder; |
||||||
|
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; |
||||||
|
import org.springframework.context.annotation.ComponentScan; |
||||||
|
|
||||||
|
|
||||||
|
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class) |
||||||
|
@ComponentScan(value = "com.mengyxu", useDefaultFilters = true) |
||||||
|
@MapperScan("com.mengyxu.admin.**.mapper") |
||||||
|
public class AdminApplocation extends SpringBootServletInitializer { |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
SpringApplication.run(AdminApplocation.class); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { |
||||||
|
return builder.sources(AdminApplocation.class); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,43 @@ |
|||||||
|
package com.mengyxu.admin; |
||||||
|
|
||||||
|
import org.springframework.stereotype.Controller; |
||||||
|
import org.springframework.web.bind.annotation.PathVariable; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
|
||||||
|
@Controller |
||||||
|
@RequestMapping("page") |
||||||
|
public class PageController { |
||||||
|
|
||||||
|
@RequestMapping("{page}") |
||||||
|
public String toPage(@PathVariable("page") String page) { |
||||||
|
return page; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("{path}/{page}") |
||||||
|
public String toPathPage(@PathVariable("path") String path, @PathVariable("page") String page) { |
||||||
|
return path + "/" + page; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("{path1}/{path2}/{page}") |
||||||
|
public String toDoublePathPage(@PathVariable("path1") String path1, @PathVariable("path2") String path2, |
||||||
|
@PathVariable("page") String page) { |
||||||
|
return path1 + "/" + path2 + "/" + page; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("adapter/{page}") |
||||||
|
public String toPageAdapter(@PathVariable("page") String page) { |
||||||
|
return page; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("adapter/{path}/{page}") |
||||||
|
public String toPathPageAdapter(@PathVariable("path") String path, @PathVariable("page") String page) { |
||||||
|
return path + "/" + page; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("adapter/{path1}/{path2}/{page}") |
||||||
|
public String toDoublePathPageAdapter(@PathVariable("path1") String path1, @PathVariable("path2") String path2, |
||||||
|
@PathVariable("page") String page) { |
||||||
|
return path1 + "/" + path2 + "/" + page; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,60 @@ |
|||||||
|
package com.mengyxu.admin; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.Dictionary; |
||||||
|
import com.mengyxu.admin.sys.service.IDictionaryService; |
||||||
|
import com.mengyxu.admin.um.pojo.Permission; |
||||||
|
import com.mengyxu.admin.um.service.IPermissionService; |
||||||
|
import com.mengyxu.admin.um.service.IRolePermissionService; |
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年10月21日 |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@RequestMapping("public") |
||||||
|
public class PublicContoller { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private IRolePermissionService roleService; |
||||||
|
@Autowired |
||||||
|
private IPermissionService perService; |
||||||
|
@Autowired |
||||||
|
private IDictionaryService dictService; |
||||||
|
|
||||||
|
@RequestMapping(value = "role/map", method = RequestMethod.GET) |
||||||
|
public List<Entry<String, String>> queryRoleMaps() { |
||||||
|
return roleService.queryRoleMaps(); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "per/list", method = RequestMethod.GET) |
||||||
|
public List<Permission> queryPermissionTree(HttpServletRequest request) throws CoreException{ |
||||||
|
return perService.queryPermissionTree(false); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "my/action/per") |
||||||
|
public List<String> queryMyActionPermissions(HttpServletRequest request) throws CoreException { |
||||||
|
String userName = LoginUtil.getUserId(request); |
||||||
|
String parentContent = LoginUtil.getParentContent(request); |
||||||
|
return perService.myPermissions(userName, parentContent); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "get/dict", method = RequestMethod.POST) |
||||||
|
public Map<String, List<Dictionary>> getDictionarys(@RequestBody String[] codes) { |
||||||
|
return dictService.getDicts(codes); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,126 @@ |
|||||||
|
package com.mengyxu.admin.conf; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.core.env.Environment; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.http.converter.HttpMessageConverter; |
||||||
|
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; |
||||||
|
import org.springframework.web.servlet.config.annotation.CorsRegistry; |
||||||
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; |
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.serializer.SerializerFeature; |
||||||
|
import com.alibaba.fastjson.support.config.FastJsonConfig; |
||||||
|
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; |
||||||
|
import com.mengyxu.admin.sys.service.ILogService; |
||||||
|
import com.mengyxu.admin.utils.BaseLogUtil; |
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
|
||||||
|
@Configuration |
||||||
|
public class BaseSprtWebMvcConfigurer implements WebMvcConfigurer { |
||||||
|
@Autowired |
||||||
|
private PermissionInteceptor permissionInteceptor; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
public void setLogService(ILogService logService) { |
||||||
|
BaseLogUtil.logService = logService; |
||||||
|
} |
||||||
|
@Autowired |
||||||
|
public void setEnvironment(Environment env) { |
||||||
|
// String packageType = env.getProperty("service.package.type");
|
||||||
|
// if ("jar".equals(packageType)) {
|
||||||
|
// GlobalConstant.RESOURCES_ROOT_PATH = GlobalConstant.JAR_RESOURCES_PATH;
|
||||||
|
// GlobalConstant.FILE_DOWNLOAD_PATH = GlobalConstant.JAR_DOWNLOAD_PATH;
|
||||||
|
// }
|
||||||
|
String timeout = env.getProperty("timeout.login.token", "30"); |
||||||
|
LoginUtil.timeout = Integer.parseInt(timeout); |
||||||
|
LoginUtil.domain = env.getProperty("login.token.domain"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 跨域支持 |
||||||
|
* |
||||||
|
* @param registry |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void addCorsMappings(CorsRegistry registry) { |
||||||
|
registry.addMapping("/**").allowedOrigins("*").allowedHeaders("*").allowCredentials(true).allowedMethods("*") |
||||||
|
.maxAge(3600 * 24); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 权限拦截器 |
||||||
|
* |
||||||
|
* @param registry |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void addInterceptors(InterceptorRegistry registry) { |
||||||
|
List<String> patterns = new ArrayList<>(); |
||||||
|
patterns.add("/um/**"); |
||||||
|
patterns.add("/public/**"); |
||||||
|
patterns.add("/*.html"); |
||||||
|
patterns.add("/css/**"); |
||||||
|
patterns.add("/fonts/**"); |
||||||
|
patterns.add("/image/**"); |
||||||
|
patterns.add("/js/**"); |
||||||
|
patterns.add("/lib/**"); |
||||||
|
patterns.add("/plugs/**"); |
||||||
|
patterns.add("/private/**"); |
||||||
|
patterns.add("/error"); |
||||||
|
registry.addInterceptor(permissionInteceptor).addPathPatterns("/**").excludePathPatterns(patterns); |
||||||
|
WebMvcConfigurer.super.addInterceptors(registry); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 默认JSON解析器从Jackson改为FastJson |
||||||
|
* |
||||||
|
* @param registry |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { |
||||||
|
Iterator<HttpMessageConverter<?>> iterator = converters.iterator(); |
||||||
|
while (iterator.hasNext()) { |
||||||
|
HttpMessageConverter<?> converter = iterator.next(); |
||||||
|
if (converter instanceof MappingJackson2HttpMessageConverter) { |
||||||
|
iterator.remove(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 升级最新版本需加======解决报错:Content-Type' cannot contain wildcard type '*
|
||||||
|
|
||||||
|
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); |
||||||
|
List<MediaType> supportedMediaTypes = new ArrayList<>(); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_JSON); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_PDF); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML); |
||||||
|
supportedMediaTypes.add(MediaType.APPLICATION_XML); |
||||||
|
supportedMediaTypes.add(MediaType.IMAGE_GIF); |
||||||
|
supportedMediaTypes.add(MediaType.IMAGE_JPEG); |
||||||
|
supportedMediaTypes.add(MediaType.IMAGE_PNG); |
||||||
|
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM); |
||||||
|
supportedMediaTypes.add(MediaType.TEXT_HTML); |
||||||
|
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN); |
||||||
|
supportedMediaTypes.add(MediaType.TEXT_PLAIN); |
||||||
|
supportedMediaTypes.add(MediaType.TEXT_XML); |
||||||
|
fastConverter.setSupportedMediaTypes(supportedMediaTypes); |
||||||
|
|
||||||
|
// 2、添加fastjson的配置信息,比如 是否要格式化返回json数据
|
||||||
|
FastJsonConfig fastJsonConfig = new FastJsonConfig(); |
||||||
|
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); |
||||||
|
// 3、在convert中添加配置信息.
|
||||||
|
fastConverter.setFastJsonConfig(fastJsonConfig); |
||||||
|
// 4、将convert添加到converters当中.
|
||||||
|
converters.add(fastConverter); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,131 @@ |
|||||||
|
package com.mengyxu.admin.conf; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.web.servlet.HandlerInterceptor; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.mengyxu.admin.um.service.IPermissionValidationService; |
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** |
||||||
|
* 权限验证拦截器 |
||||||
|
* @author v_mengyxu |
||||||
|
* |
||||||
|
*/ |
||||||
|
@Log4j2 |
||||||
|
@Component |
||||||
|
public class PermissionInteceptor implements HandlerInterceptor { |
||||||
|
@Autowired |
||||||
|
private IPermissionValidationService validationService; |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { |
||||||
|
log.debug("Permission interceptor : preHandle ..."); |
||||||
|
response.setContentType("application/json;charset:UTF-8"); |
||||||
|
//获取此次请求需要的权限
|
||||||
|
String path = request.getServletPath(); |
||||||
|
try { |
||||||
|
verifyPath(path); |
||||||
|
|
||||||
|
//return if start with /public
|
||||||
|
if(isPublicResource(path)){ |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
List<String> resourceCodes = getResourceCodes(path); |
||||||
|
String userId = getLogonUser(request); |
||||||
|
|
||||||
|
//判断用户是否拥有该权限
|
||||||
|
getPermissionCode(userId, resourceCodes); |
||||||
|
|
||||||
|
} catch (CoreException e){ |
||||||
|
log.warn(e.getMessage()); |
||||||
|
response.getWriter().write(JSON.toJSONString(new AjaxResponse(false, e.getMessage()))); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Lookup the login user from request/session. |
||||||
|
* @param request |
||||||
|
* @return |
||||||
|
* @throws CrsPermissionException if no "loginid" found. |
||||||
|
*/ |
||||||
|
private String getLogonUser(HttpServletRequest request) throws CoreException { |
||||||
|
//获取用户id
|
||||||
|
String userName = LoginUtil.getUserNameAndRefresh(request); |
||||||
|
if(userName == null){ |
||||||
|
throw new CoreException("session timeout"); |
||||||
|
} |
||||||
|
return userName; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Verify if it is null or empty. |
||||||
|
* @param path |
||||||
|
* @throws CrsMvcException if path is null or empty. |
||||||
|
*/ |
||||||
|
private void verifyPath(String path) throws CoreException { |
||||||
|
if(StringUtil.isEmpty(path)){ |
||||||
|
throw new CoreException("It is an empty request path"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Search and return the resource codes by the resource content. |
||||||
|
* |
||||||
|
* @param path |
||||||
|
* @return |
||||||
|
* @throws CrsPermissionException if no resource code found. |
||||||
|
*/ |
||||||
|
private List<String> getResourceCodes(String path) throws CoreException { |
||||||
|
String resourcePath = path.substring(1); |
||||||
|
|
||||||
|
List<String> resCodes = validationService.queryCodeByContent(resourcePath); |
||||||
|
if(resCodes == null || resCodes.isEmpty()){ |
||||||
|
throw new CoreException("no permission for " + resourcePath); |
||||||
|
} |
||||||
|
|
||||||
|
return resCodes; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Verify if it an public resource. |
||||||
|
* @param path |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private boolean isPublicResource(String path) { |
||||||
|
return path.startsWith("/public"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the match resource code by user. |
||||||
|
* @param userId |
||||||
|
* @param resCodes |
||||||
|
* @return |
||||||
|
* @throws CrsPermissionException if no resource code found. |
||||||
|
*/ |
||||||
|
private String getPermissionCode(String userId, List<String> resCodes) throws CoreException{ |
||||||
|
for (String resCode : resCodes) { |
||||||
|
if (validationService.havePermission(userId, resCode)){ |
||||||
|
return resCode; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
//No permission match.
|
||||||
|
throw new CoreException("no permission"); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
package com.mengyxu.admin.sys.controller; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.github.pagehelper.Page; |
||||||
|
import com.github.pagehelper.PageHelper; |
||||||
|
import com.mengyxu.admin.sys.pojo.Dictionary; |
||||||
|
import com.mengyxu.admin.sys.service.IDictionaryService; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
import com.mengyxu.core.pojo.com.PageResponse; |
||||||
|
|
||||||
|
/** |
||||||
|
* Ownership belongs to the company author:mengyxu date:2019年12月6日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@RestController |
||||||
|
@RequestMapping("admin/dict") |
||||||
|
public class DictionaryController { |
||||||
|
@Autowired |
||||||
|
private IDictionaryService distService; |
||||||
|
|
||||||
|
@RequestMapping(value = "list", method = RequestMethod.GET) |
||||||
|
public PageResponse<Dictionary> queryDistList(Dictionary example) { |
||||||
|
Page<Dictionary> pages = PageHelper.startPage(example.getPage(), example.getSize()); |
||||||
|
List<Dictionary> list = distService.queryType(example); |
||||||
|
PageResponse<Dictionary> rsp = new PageResponse<>(); |
||||||
|
rsp.setRows(list); |
||||||
|
rsp.setTotal(pages.getTotal()); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "save", method = RequestMethod.POST) |
||||||
|
public AjaxResponse saveDistionary(@RequestBody Dictionary dist) { |
||||||
|
distService.save(dist); |
||||||
|
return new AjaxResponse(true, "添加数据字典成功"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "update", method = RequestMethod.POST) |
||||||
|
public AjaxResponse updateDistionary(@RequestBody Dictionary dist) { |
||||||
|
distService.update(dist); |
||||||
|
return new AjaxResponse(true, "修改数据字典成功"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "delete", method = RequestMethod.POST) |
||||||
|
public AjaxResponse deleteDistionary(@RequestBody Dictionary dist) throws CoreException { |
||||||
|
distService.delete(dist); |
||||||
|
return new AjaxResponse(true, "删除数据字典成功"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,38 @@ |
|||||||
|
package com.mengyxu.admin.sys.controller; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.github.pagehelper.Page; |
||||||
|
import com.github.pagehelper.PageHelper; |
||||||
|
import com.mengyxu.admin.sys.pojo.ActionLog; |
||||||
|
import com.mengyxu.admin.sys.service.ILogService; |
||||||
|
import com.mengyxu.core.pojo.com.PageResponse; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月5日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@RestController |
||||||
|
@RequestMapping("admin") |
||||||
|
public class LogController { |
||||||
|
@Autowired |
||||||
|
private ILogService LogService; |
||||||
|
|
||||||
|
@RequestMapping(value = "log/action", method = RequestMethod.GET) |
||||||
|
public PageResponse<ActionLog> queryActionLogList(ActionLog example){ |
||||||
|
Page<ActionLog> pages = PageHelper.startPage(example.getPage(), example.getSize()); |
||||||
|
List<ActionLog> list = LogService.queryActionLog(example); |
||||||
|
PageResponse<ActionLog> rsp = new PageResponse<>(); |
||||||
|
rsp.setRows(list); |
||||||
|
rsp.setStatus("0"); |
||||||
|
rsp.setTotal(pages.getTotal()); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
package com.mengyxu.admin.sys.controller; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.golbal.GlobalBuffer; |
||||||
|
import com.mengyxu.core.pojo.BufferResult; |
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
import com.mengyxu.core.pojo.com.Cache; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月13日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
@RestController |
||||||
|
@RequestMapping("admin/memory") |
||||||
|
public class MemoryController { |
||||||
|
|
||||||
|
@RequestMapping("buffer/list") |
||||||
|
public List<BufferResult> getBufferList(HttpServletRequest request){ |
||||||
|
log.info("查询缓存列表,当前登陆用户:" + LoginUtil.getUserId(request)); |
||||||
|
List<BufferResult> list = new ArrayList<>(); |
||||||
|
Map<String, Cache> buffer = GlobalBuffer.getBuffer(); |
||||||
|
for(String key : buffer.keySet()) { |
||||||
|
list.add(new BufferResult(key, buffer.get(key))); |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("buffer/clean") |
||||||
|
public AjaxResponse cleanBuffer(HttpServletRequest request){ |
||||||
|
log.info("清空失效缓存,当前登陆用户:" + LoginUtil.getUserId(request)); |
||||||
|
GlobalBuffer.cleanCache(); |
||||||
|
return new AjaxResponse(true, "清空失效缓存成功"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "buffer/delete", method = RequestMethod.POST) |
||||||
|
public AjaxResponse deleteBuffer(@RequestBody BufferResult buffer, HttpServletRequest request){ |
||||||
|
String key = buffer.getKey(); |
||||||
|
log.info("删除缓存:"+key+",当前登陆用户:" + LoginUtil.getUserId(request)); |
||||||
|
GlobalBuffer.removeCache(key); |
||||||
|
return new AjaxResponse(true, "删除缓存成功"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "buffer/delay", method = RequestMethod.POST) |
||||||
|
public AjaxResponse delayBuffer(@RequestBody BufferResult buffer, HttpServletRequest request) throws CoreException{ |
||||||
|
log.info("修改缓存失效时间:"+buffer.getKey()+",当前登陆用户:" + LoginUtil.getUserId(request)); |
||||||
|
GlobalBuffer.setLoseTime(buffer.getKey(), buffer.getLoseTime()); |
||||||
|
return new AjaxResponse(true, "修改缓存失效时间成功"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,50 @@ |
|||||||
|
package com.mengyxu.admin.sys.controller; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.UserItem; |
||||||
|
import com.mengyxu.admin.sys.service.IUserItemService; |
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年3月18日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@RestController |
||||||
|
@RequestMapping("public/item") |
||||||
|
public class UserItemController { |
||||||
|
@Autowired |
||||||
|
private IUserItemService itemService; |
||||||
|
|
||||||
|
@RequestMapping(value = "list", method = RequestMethod.GET) |
||||||
|
public List<UserItem> queryList(UserItem example, HttpServletRequest request){ |
||||||
|
String userId = LoginUtil.getUserId(request); |
||||||
|
if(StringUtil.isEmpty(userId)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
example.setUserId(userId); |
||||||
|
Integer page = example.getPage(); |
||||||
|
Integer size = example.getSize(); |
||||||
|
if(page != null && size != null) { |
||||||
|
example.setLimitStart((page - 1) * size); |
||||||
|
} |
||||||
|
return itemService.queryByExample(example); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "read", method = RequestMethod.POST) |
||||||
|
public AjaxResponse queryList(Integer id, HttpServletRequest request){ |
||||||
|
itemService.read(id); |
||||||
|
return new AjaxResponse(true, null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
package com.mengyxu.admin.sys.mapper; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.ActionLog; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年2月13日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IActionLogMapper { |
||||||
|
|
||||||
|
List<ActionLog> queryByExample(ActionLog example); |
||||||
|
|
||||||
|
void insert(ActionLog log); |
||||||
|
|
||||||
|
void insertBatch(List<ActionLog> logs); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
package com.mengyxu.admin.sys.mapper; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.SysConfig; |
||||||
|
|
||||||
|
public interface IConfigMapper { |
||||||
|
|
||||||
|
public String queryValueByKey(String cfgKey); |
||||||
|
|
||||||
|
public List<SysConfig> queryByExample(SysConfig example); |
||||||
|
|
||||||
|
public void update(SysConfig sysConfig); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
package com.mengyxu.admin.sys.mapper; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.Dictionary; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月6日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IDictionaryMapper { |
||||||
|
|
||||||
|
List<Dictionary> queryType(Dictionary example); |
||||||
|
List<Dictionary> queryDict(Dictionary example); |
||||||
|
void insertType(Dictionary type); |
||||||
|
void insertDict(Dictionary dist); |
||||||
|
void updateType(Dictionary type); |
||||||
|
void updateDict(Dictionary dist); |
||||||
|
void deleteType(String code); |
||||||
|
void deleteDicts(String parent); |
||||||
|
void deleteDict(Integer id); |
||||||
|
|
||||||
|
List<Entry<String, String>> queryProvince(); |
||||||
|
List<Entry<String, String>> queryCity(String parent); |
||||||
|
List<Entry<String, String>> queryCounty(String parent); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
package com.mengyxu.admin.sys.mapper; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.UserItem; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年3月17日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IUserItemMapper { |
||||||
|
|
||||||
|
List<UserItem> queryByExample(UserItem example); |
||||||
|
|
||||||
|
void insert(UserItem item); |
||||||
|
|
||||||
|
void insertBatch(List<UserItem> items); |
||||||
|
|
||||||
|
void update(UserItem item); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
package com.mengyxu.admin.sys.pojo; |
||||||
|
|
||||||
|
import com.mengyxu.core.pojo.base.BasePeriod; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年2月13日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class ActionLog extends BasePeriod { |
||||||
|
|
||||||
|
private Integer id; |
||||||
|
private String type; |
||||||
|
private String module; |
||||||
|
private String userId; |
||||||
|
private String loginIp; |
||||||
|
private String context; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
package com.mengyxu.admin.sys.pojo; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.core.pojo.base.BasePageParam; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月6日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class Dictionary extends BasePageParam { |
||||||
|
|
||||||
|
private String key; |
||||||
|
private Integer id; |
||||||
|
private String code; |
||||||
|
private String name; |
||||||
|
private String desc; |
||||||
|
private String parent; |
||||||
|
private String status; |
||||||
|
|
||||||
|
private List<Dictionary> children; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,33 @@ |
|||||||
|
package com.mengyxu.admin.sys.pojo; |
||||||
|
|
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import com.mengyxu.core.pojo.base.BasePageParam; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class SysConfig extends BasePageParam{ |
||||||
|
|
||||||
|
private String cfgKey; |
||||||
|
private String cfgName; |
||||||
|
private String cfgValue; |
||||||
|
private String cfgType; |
||||||
|
private String cfgDesc; |
||||||
|
private String cfgStatus; |
||||||
|
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
||||||
|
@JSONField(format="yyyy-MM-dd HH:mm:ss") |
||||||
|
private Date updateTime; |
||||||
|
private String updateUser; |
||||||
|
|
||||||
|
public String briefInfo() { |
||||||
|
return MessageFormat.format("参数名:{0},参数值:{1}", cfgName, cfgValue); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
package com.mengyxu.admin.sys.pojo; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import com.mengyxu.core.pojo.base.BasePageParam; |
||||||
|
import com.mengyxu.core.utils.DateUtil; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年3月17日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class UserItem extends BasePageParam{ |
||||||
|
|
||||||
|
private Integer id; |
||||||
|
private String userId; |
||||||
|
private String itemName; |
||||||
|
private String itemDesc; |
||||||
|
private String itemType; |
||||||
|
private String itemFlag; |
||||||
|
private String addUser; |
||||||
|
@JSONField(format = DateUtil.FORMAT19_LINE_YYYYMMDDHHMMSS) |
||||||
|
private Date addTime; |
||||||
|
private Integer status; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,31 @@ |
|||||||
|
package com.mengyxu.admin.sys.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.SysConfig; |
||||||
|
|
||||||
|
public interface IConfigService { |
||||||
|
|
||||||
|
public String queryValueByKey(String cfgKey); |
||||||
|
|
||||||
|
/** |
||||||
|
* Query the configuration by the key. |
||||||
|
* Return the default value as provided if no item found. |
||||||
|
* @param cfgKey |
||||||
|
* @param defaultVal |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
String getStringConfig(String cfgKey, String defaultVal); |
||||||
|
|
||||||
|
long getLongConfig(String key, long defValue); |
||||||
|
|
||||||
|
Integer getIntConfig(String key, Integer defValue); |
||||||
|
|
||||||
|
public List<SysConfig> queryPageByExample(SysConfig example); |
||||||
|
|
||||||
|
public void update(SysConfig sysConfig); |
||||||
|
|
||||||
|
public void updateCfg(String key, String value, String userId); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,35 @@ |
|||||||
|
package com.mengyxu.admin.sys.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.Dictionary; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月6日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IDictionaryService { |
||||||
|
|
||||||
|
List<Dictionary> queryType(Dictionary example); |
||||||
|
|
||||||
|
void save(Dictionary dist); |
||||||
|
|
||||||
|
void update(Dictionary dist); |
||||||
|
|
||||||
|
void delete(Dictionary dict) throws CoreException; |
||||||
|
|
||||||
|
Map<String, List<Dictionary>> getDicts(String[] codes); |
||||||
|
|
||||||
|
List<Dictionary> getDict(String code); |
||||||
|
|
||||||
|
List<Entry<String, String>> queryProvince(); |
||||||
|
|
||||||
|
List<Entry<String, String>> queryCity(String parent); |
||||||
|
|
||||||
|
List<Entry<String, String>> queryCounty(String parent); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
package com.mengyxu.admin.sys.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.ActionLog; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月5日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface ILogService { |
||||||
|
|
||||||
|
List<ActionLog> queryActionLog(ActionLog example); |
||||||
|
|
||||||
|
void insertActionLog(ActionLog log); |
||||||
|
|
||||||
|
void insertActionLogs(List<ActionLog> logs); |
||||||
|
|
||||||
|
Map<String, String> getTypeMap(); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
package com.mengyxu.admin.sys.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.UserItem; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年3月17日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IUserItemService { |
||||||
|
|
||||||
|
List<UserItem> queryByExample(UserItem example); |
||||||
|
|
||||||
|
void save(UserItem item); |
||||||
|
|
||||||
|
void save(List<UserItem> items); |
||||||
|
|
||||||
|
void read(Integer id); |
||||||
|
|
||||||
|
void dealWith(Integer id); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,100 @@ |
|||||||
|
package com.mengyxu.admin.sys.service.impl; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.mapper.IConfigMapper; |
||||||
|
import com.mengyxu.admin.sys.pojo.SysConfig; |
||||||
|
import com.mengyxu.admin.sys.service.IConfigService; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
@Service |
||||||
|
public class ConfigService implements IConfigService { |
||||||
|
@Autowired |
||||||
|
private IConfigMapper cfgMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String queryValueByKey(String cfgKey) { |
||||||
|
return cfgMapper.queryValueByKey(cfgKey); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 读取Long类型配置参数值 |
||||||
|
* @param key |
||||||
|
* @param defValue |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public long getLongConfig(String key, long defValue) { |
||||||
|
String value = queryValueByKey(key); |
||||||
|
|
||||||
|
if (!StringUtil.isEmpty(value)) { |
||||||
|
return Long.parseLong(value); |
||||||
|
} else { |
||||||
|
return defValue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 读取Integer类型配置参数值 |
||||||
|
* @param key |
||||||
|
* @param defValue |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public Integer getIntConfig(String key, Integer defValue) { |
||||||
|
String value = queryValueByKey(key); |
||||||
|
|
||||||
|
if (!StringUtil.isEmpty(value)) { |
||||||
|
return new Integer(value); |
||||||
|
} else { |
||||||
|
return defValue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getStringConfig(String key, String defValue) { |
||||||
|
String value = queryValueByKey(key); |
||||||
|
|
||||||
|
if (StringUtil.isEmpty(value)){ |
||||||
|
return defValue; |
||||||
|
} |
||||||
|
|
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public List<SysConfig> queryPageByExample(SysConfig example) { |
||||||
|
return cfgMapper.queryByExample(example); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void update(SysConfig sysConfig) { |
||||||
|
cfgMapper.update(sysConfig); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void updateCfg(String key, String value, String userId) { |
||||||
|
SysConfig cfg = get(key); |
||||||
|
if(cfg != null) { |
||||||
|
cfg.setCfgValue(value); |
||||||
|
cfg.setUpdateUser(userId); |
||||||
|
update(cfg); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private SysConfig get(String key) { |
||||||
|
SysConfig example = new SysConfig(); |
||||||
|
example.setCfgKey(key); |
||||||
|
List<SysConfig> list = cfgMapper.queryByExample(example); |
||||||
|
if(list == null || list.isEmpty()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return list.get(0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,99 @@ |
|||||||
|
package com.mengyxu.admin.sys.service.impl; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.transaction.annotation.Transactional; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.mapper.IDictionaryMapper; |
||||||
|
import com.mengyxu.admin.sys.pojo.Dictionary; |
||||||
|
import com.mengyxu.admin.sys.service.IDictionaryService; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月6日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Service |
||||||
|
public class DictionaryService implements IDictionaryService { |
||||||
|
@Autowired |
||||||
|
private IDictionaryMapper dictMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Dictionary> queryType(Dictionary example) { |
||||||
|
return dictMapper.queryType(example); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void save(Dictionary dict) { |
||||||
|
if(StringUtil.isEmpty(dict.getParent())) { |
||||||
|
dictMapper.insertType(dict); |
||||||
|
}else { |
||||||
|
dictMapper.insertDict(dict); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void update(Dictionary dict) { |
||||||
|
if(StringUtil.isEmpty(dict.getParent())) { |
||||||
|
dictMapper.updateType(dict); |
||||||
|
}else { |
||||||
|
dictMapper.updateDict(dict); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public void delete(Dictionary dict) throws CoreException { |
||||||
|
Integer id = dict.getId(); |
||||||
|
String code = dict.getCode(); |
||||||
|
if(id != null) { |
||||||
|
dictMapper.deleteDict(id); |
||||||
|
}else { |
||||||
|
dictMapper.deleteType(code); |
||||||
|
dictMapper.deleteDicts(code); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<String, List<Dictionary>> getDicts(String[] codes) { |
||||||
|
if(codes == null || codes.length == 0) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
Map<String, List<Dictionary>> map = new HashMap<>(); |
||||||
|
for (String code : codes) { |
||||||
|
map.put(code, getDict(code)); |
||||||
|
} |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Dictionary> getDict(String code) { |
||||||
|
Dictionary example = new Dictionary(); |
||||||
|
example.setStatus("A"); |
||||||
|
example.setParent(code); |
||||||
|
return dictMapper.queryDict(example); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Entry<String, String>> queryProvince() { |
||||||
|
return dictMapper.queryProvince(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Entry<String, String>> queryCity(String parent) { |
||||||
|
return dictMapper.queryCity(parent); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Entry<String, String>> queryCounty(String parent) { |
||||||
|
return dictMapper.queryCounty(parent); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,61 @@ |
|||||||
|
package com.mengyxu.admin.sys.service.impl; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.mapper.IActionLogMapper; |
||||||
|
import com.mengyxu.admin.sys.pojo.ActionLog; |
||||||
|
import com.mengyxu.admin.sys.pojo.Dictionary; |
||||||
|
import com.mengyxu.admin.sys.service.IDictionaryService; |
||||||
|
import com.mengyxu.admin.sys.service.ILogService; |
||||||
|
import com.mengyxu.core.golbal.GlobalBuffer; |
||||||
|
import com.mengyxu.core.pojo.com.Cache; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年2月13日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Service |
||||||
|
public class LogService implements ILogService { |
||||||
|
private static final String MAP_BUFFER_KEY = "log_type_mapping"; |
||||||
|
@Autowired |
||||||
|
private IActionLogMapper actionLogMapper; |
||||||
|
@Autowired |
||||||
|
private IDictionaryService dictService; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<ActionLog> queryActionLog(ActionLog example) { |
||||||
|
return actionLogMapper.queryByExample(example); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void insertActionLog(ActionLog log) { |
||||||
|
actionLogMapper.insert(log); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void insertActionLogs(List<ActionLog> logs) { |
||||||
|
actionLogMapper.insertBatch(logs); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<String, String> getTypeMap() { |
||||||
|
Cache cache = GlobalBuffer.getCache(MAP_BUFFER_KEY); |
||||||
|
if(Cache.isEmpty(cache)) { |
||||||
|
Map<String, String> map = new HashMap<>(); |
||||||
|
for (Dictionary dict : dictService.getDict("log_type")) { |
||||||
|
map.put(dict.getCode(), dict.getName()); |
||||||
|
} |
||||||
|
GlobalBuffer.addCache(MAP_BUFFER_KEY, new Cache(map,3600)); |
||||||
|
return map; |
||||||
|
}else { |
||||||
|
return cache.getValue(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,53 @@ |
|||||||
|
package com.mengyxu.admin.sys.service.impl; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.mapper.IUserItemMapper; |
||||||
|
import com.mengyxu.admin.sys.pojo.UserItem; |
||||||
|
import com.mengyxu.admin.sys.service.IUserItemService; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年3月17日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Service |
||||||
|
public class UserItemService implements IUserItemService { |
||||||
|
@Autowired |
||||||
|
private IUserItemMapper itemMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<UserItem> queryByExample(UserItem example) { |
||||||
|
return itemMapper.queryByExample(example); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void save(UserItem item) { |
||||||
|
itemMapper.insert(item); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void save(List<UserItem> items) { |
||||||
|
itemMapper.insertBatch(items); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void read(Integer id) { |
||||||
|
UserItem item = new UserItem(); |
||||||
|
item.setId(id); |
||||||
|
item.setStatus(1); |
||||||
|
itemMapper.update(item); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void dealWith(Integer id) { |
||||||
|
UserItem item = new UserItem(); |
||||||
|
item.setId(id); |
||||||
|
item.setStatus(2); |
||||||
|
itemMapper.update(item); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,120 @@ |
|||||||
|
package com.mengyxu.admin.um.controller; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.Menu; |
||||||
|
import com.mengyxu.admin.um.pojo.User; |
||||||
|
import com.mengyxu.admin.um.service.IMenuService; |
||||||
|
import com.mengyxu.admin.um.service.IUserService; |
||||||
|
import com.mengyxu.admin.utils.AdminLogUtil; |
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@RestController |
||||||
|
@RequestMapping("um") |
||||||
|
public class LoginController { |
||||||
|
@Autowired |
||||||
|
private IUserService userService; |
||||||
|
@Autowired |
||||||
|
private IMenuService permissionService; |
||||||
|
|
||||||
|
/** |
||||||
|
* 类型一用户登陆接口,登陆成功后用户信息保存在resdis中,将token信息保存在cookie中 |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "sso/login", method = RequestMethod.POST) |
||||||
|
public AjaxResponse loginWithSso(@RequestBody User param, HttpServletRequest request, |
||||||
|
HttpServletResponse response) throws CoreException{ |
||||||
|
String userId = param.getUserId(); |
||||||
|
String key = param.getKey(); |
||||||
|
User user = userService.findUser(userId,key); |
||||||
|
if(user == null){ |
||||||
|
return new AjaxResponse(false, "用户名或密码错误!"); |
||||||
|
} |
||||||
|
if("0".equals(user.getStatus())) { |
||||||
|
AjaxResponse rsp = new AjaxResponse(true, null); |
||||||
|
rsp.setData(0); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
userService.updateLogin(userId); |
||||||
|
//保存登陆信息
|
||||||
|
LoginUtil.saveLoginInfo(user, request, response); |
||||||
|
//记录日志
|
||||||
|
AdminLogUtil.Login(request, user); |
||||||
|
|
||||||
|
return new AjaxResponse(true, "登录成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 注销登陆接口 |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "login/out", method = RequestMethod.GET) |
||||||
|
public AjaxResponse loginOut(HttpServletRequest request) throws CoreException{ |
||||||
|
//记录日志
|
||||||
|
AdminLogUtil.Logout(request); |
||||||
|
|
||||||
|
LoginUtil.loginOut(request); |
||||||
|
|
||||||
|
return new AjaxResponse(true, "已销登陆!"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取登陆用户信息 |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "user/info", method = RequestMethod.GET) |
||||||
|
public User getUserInfo(String token, HttpServletRequest request){ |
||||||
|
User userInfo = LoginUtil.getUserInfo(token, request, true); |
||||||
|
return userInfo; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查登陆状态接口 |
||||||
|
* @param request |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "check", method = RequestMethod.GET) |
||||||
|
public AjaxResponse checkSession(HttpServletRequest request) throws CoreException{ |
||||||
|
User user = LoginUtil.getUserInfo(request); |
||||||
|
if(user != null){ |
||||||
|
AjaxResponse rsp = new AjaxResponse(); |
||||||
|
rsp.setSuccess(true); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
return new AjaxResponse(false, "session timeout"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 修改密码 |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "update/password", method = RequestMethod.POST) |
||||||
|
public AjaxResponse updatePassword(@RequestBody User user, HttpServletRequest request) throws CoreException{ |
||||||
|
userService.updateKey(user); |
||||||
|
AdminLogUtil.updatePassword(request, user); |
||||||
|
return new AjaxResponse(true, "修改密码成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "menu/tree", method = RequestMethod.GET) |
||||||
|
public List<Menu> queryMenuTree(HttpServletRequest request){ |
||||||
|
String userId = LoginUtil.getUserId(request); |
||||||
|
return permissionService.queryMenuTree(userId,null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,113 @@ |
|||||||
|
package com.mengyxu.admin.um.controller; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.github.pagehelper.Page; |
||||||
|
import com.github.pagehelper.PageHelper; |
||||||
|
import com.mengyxu.admin.um.pojo.Permission; |
||||||
|
import com.mengyxu.admin.um.pojo.Role; |
||||||
|
import com.mengyxu.admin.um.service.IPermissionService; |
||||||
|
import com.mengyxu.admin.um.service.IRolePermissionService; |
||||||
|
import com.mengyxu.admin.utils.AdminLogUtil; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.base.BasePageParam; |
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
import com.mengyxu.core.pojo.com.PageResponse; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月2日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
@RestController |
||||||
|
@RequestMapping("admin") |
||||||
|
public class PermissionController { |
||||||
|
@Autowired |
||||||
|
private IPermissionService perService; |
||||||
|
@Autowired |
||||||
|
private IRolePermissionService roleService; |
||||||
|
|
||||||
|
@RequestMapping(value = "per/list", method = RequestMethod.GET) |
||||||
|
public List<Permission> queryPermissionTree(HttpServletRequest request) throws CoreException{ |
||||||
|
log.info("查询所有权限"); |
||||||
|
return perService.queryPermissionTree(true); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "per/save", method = RequestMethod.POST) |
||||||
|
public AjaxResponse savePermission(@RequestBody Permission permission) throws CoreException{ |
||||||
|
log.info("添加权限"); |
||||||
|
perService.save(permission); |
||||||
|
return new AjaxResponse(true, "权限添加成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "per/delete", method = RequestMethod.POST) |
||||||
|
public AjaxResponse deletePermission(@RequestBody Permission permission){ |
||||||
|
log.info("删除权限"); |
||||||
|
perService.delete(permission.getId()); |
||||||
|
return new AjaxResponse(true, "权限删除成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "per/update", method = RequestMethod.POST) |
||||||
|
public AjaxResponse updatePermission(@RequestBody Permission permission) throws CoreException{ |
||||||
|
log.info("修改权限"); |
||||||
|
perService.update(permission); |
||||||
|
return new AjaxResponse(true, "权限修改成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "role/list") |
||||||
|
public PageResponse<Role> queryRoleList(BasePageParam example){ |
||||||
|
log.info("查询角色列表"); |
||||||
|
Page<Role> pages = PageHelper.startPage(example.getPage(), example.getSize()); |
||||||
|
List<Role> list = roleService.queryList(); |
||||||
|
PageResponse<Role> rsp = new PageResponse<>(); |
||||||
|
rsp.setRows(list); |
||||||
|
rsp.setStatus("0"); |
||||||
|
rsp.setTotal(pages.getTotal()); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "role/list/all") |
||||||
|
public PageResponse<Role> queryAll(BasePageParam example){ |
||||||
|
log.info("查询所有角色"); |
||||||
|
Page<Role> pages = PageHelper.startPage(example.getPage(), example.getSize()); |
||||||
|
List<Role> list = roleService.queryAll(); |
||||||
|
PageResponse<Role> rsp = new PageResponse<>(); |
||||||
|
rsp.setRows(list); |
||||||
|
rsp.setStatus("0"); |
||||||
|
rsp.setTotal(pages.getTotal()); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "role/save", method = RequestMethod.POST) |
||||||
|
public AjaxResponse saveRole(@RequestBody Role role, HttpServletRequest request){ |
||||||
|
AdminLogUtil.addRole(request, role); |
||||||
|
roleService.save(role); |
||||||
|
return new AjaxResponse(true, "角色添加成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "role/delete", method = RequestMethod.POST) |
||||||
|
public AjaxResponse deleteRole(@RequestBody Role role, HttpServletRequest request){ |
||||||
|
AdminLogUtil.deleteRole(request, role); |
||||||
|
roleService.delete(role.getCode()); |
||||||
|
return new AjaxResponse(true, "角色删除成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping(value = "role/update", method = RequestMethod.POST) |
||||||
|
public AjaxResponse updateRole(@RequestBody Role role, HttpServletRequest request) throws CoreException{ |
||||||
|
AdminLogUtil.updateRole(request, role); |
||||||
|
String msg = roleService.update(role); |
||||||
|
return new AjaxResponse(true, msg); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,123 @@ |
|||||||
|
package com.mengyxu.admin.um.controller; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import com.github.pagehelper.Page; |
||||||
|
import com.github.pagehelper.PageHelper; |
||||||
|
import com.mengyxu.admin.um.pojo.User; |
||||||
|
import com.mengyxu.admin.um.service.IUserService; |
||||||
|
import com.mengyxu.admin.utils.AdminLogUtil; |
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.base.BasePageParam; |
||||||
|
import com.mengyxu.core.pojo.com.AjaxResponse; |
||||||
|
import com.mengyxu.core.pojo.com.PageResponse; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
@RestController |
||||||
|
@SuppressWarnings("all") |
||||||
|
@RequestMapping("admin/user") |
||||||
|
public class UserController { |
||||||
|
@Autowired |
||||||
|
private IUserService userService; |
||||||
|
|
||||||
|
/** |
||||||
|
* 用户管理条件查询 |
||||||
|
* @param example 查询参数 |
||||||
|
* @return 分页查询数据 |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "list", method = RequestMethod.GET) |
||||||
|
public PageResponse<User> queryPageListByExample(User example, HttpServletRequest request){ |
||||||
|
Page<User> pages = PageHelper.startPage(example.getPage(), example.getSize()); |
||||||
|
List<User> list = userService.queryByExample(example); |
||||||
|
PageResponse<User> rsp = new PageResponse<>(); |
||||||
|
rsp.setRows(list); |
||||||
|
rsp.setStatus("0"); |
||||||
|
rsp.setTotal(pages.getTotal()); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 状态管理分页查询 |
||||||
|
* @param |
||||||
|
* @return 分页查询数据 |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "list/all", method = RequestMethod.GET) |
||||||
|
public PageResponse<User> queryAll(BasePageParam example, HttpServletRequest request){ |
||||||
|
Page<User> pages = PageHelper.startPage(example.getPage(), example.getSize()); |
||||||
|
List<User> list = userService.queryAll(); |
||||||
|
PageResponse<User> rsp = new PageResponse<>(); |
||||||
|
rsp.setRows(list); |
||||||
|
rsp.setStatus("0"); |
||||||
|
rsp.setTotal(pages.getTotal()); |
||||||
|
return rsp; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 新增用户 |
||||||
|
* @param user 新增用户信息 |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "save", method = RequestMethod.POST) |
||||||
|
public AjaxResponse addUser(@RequestBody User user, HttpServletRequest request) throws CoreException{ |
||||||
|
userService.insert(user); |
||||||
|
//记录、打印日志
|
||||||
|
AdminLogUtil.saveUser(request, user); |
||||||
|
return new AjaxResponse(true, "新增用户成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 修改用户其他信息 |
||||||
|
* @param user 用户信息 |
||||||
|
* @return |
||||||
|
* @throws CoreException |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "update", method = RequestMethod.POST) |
||||||
|
public AjaxResponse updateUserInfo(@RequestBody User userInfo, HttpServletRequest request) throws CoreException{ |
||||||
|
userService.updateInfo(userInfo); |
||||||
|
AdminLogUtil.updateUser(request, userInfo); |
||||||
|
return new AjaxResponse(true, "修改用户信息成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除用户 |
||||||
|
* @param userId 待删除的用户名 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "delete", method = RequestMethod.POST) |
||||||
|
public AjaxResponse removeUser(@RequestBody User user, HttpServletRequest request){ |
||||||
|
String userId = user.getUserId(); |
||||||
|
userService.deleteById(userId); |
||||||
|
AdminLogUtil.deleteUser(request, userId); |
||||||
|
return new AjaxResponse(true, "成功删除用户:"+userId+"!"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 重置密码 |
||||||
|
* @param userName 待重置密码的用户名 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@RequestMapping(value = "reset", method = RequestMethod.POST) |
||||||
|
public AjaxResponse resetPassword(@RequestBody User user, HttpServletRequest request){ |
||||||
|
String userId = user.getUserId(); |
||||||
|
userService.resetKey(userId); |
||||||
|
AdminLogUtil.resetUserLog(request, userId); |
||||||
|
return new AjaxResponse(true, "成功重置用户:"+userId+"的密码!"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,101 @@ |
|||||||
|
package com.mengyxu.admin.um.mapper; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Param; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.Menu; |
||||||
|
import com.mengyxu.admin.um.pojo.Permission; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
/** |
||||||
|
* 权限管理Dao |
||||||
|
* @author v_mengyxu |
||||||
|
* |
||||||
|
*/ |
||||||
|
public interface IPermissionMapper { |
||||||
|
/** |
||||||
|
* 增加记录 |
||||||
|
* @param permission 新增的记录 |
||||||
|
*/ |
||||||
|
public void insertOne(Permission permission); |
||||||
|
|
||||||
|
/** |
||||||
|
* 批量添加 |
||||||
|
* @param permissions |
||||||
|
*/ |
||||||
|
public void insertBatch(List<Permission> permissions); |
||||||
|
|
||||||
|
/** |
||||||
|
* 更新记录 |
||||||
|
* @param permission 更新的记录 |
||||||
|
*/ |
||||||
|
public void updateByCode(Permission permission); |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除记录 |
||||||
|
* @param resCode 权限编码 |
||||||
|
*/ |
||||||
|
public void deleteByCode(String resCode); |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除全部 |
||||||
|
*/ |
||||||
|
public void deleteAll(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断是否存在该记录 |
||||||
|
* @param resCode 权限编码 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public long isExist(String resCode); |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据权限内容查询权限信息 |
||||||
|
* @param resContent 权限内容 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<String> queryCodeByContent(String resContent); |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断用户是否拥有某权限 |
||||||
|
* @param userId 用户号 |
||||||
|
* @param resCode 权限编码 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public long havePermission(@Param("userId")String userId ,@Param("preCode")String resCode); |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询所有系统 |
||||||
|
* @param userId |
||||||
|
*/ |
||||||
|
public List<Entry<String, String>> queryAllModule(String userId); |
||||||
|
|
||||||
|
/** |
||||||
|
* 用户个人菜单 |
||||||
|
* @param userId |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Menu> queryMenuTree(@Param("userId")String userId ,@Param("perParent")String perParent); |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询action权限 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<String> queryContentByParentContent(@Param("userId")String userId ,@Param("parentContent")String parentContent); |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询权限树 |
||||||
|
* @param perParent |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Permission> queryPermissionTree(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询权限树 |
||||||
|
* @param perParent |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Permission> queryPublicPerTree(); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
package com.mengyxu.admin.um.mapper; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.Role; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月3日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IRolePermissionMapper { |
||||||
|
|
||||||
|
List<Role> queryAll(); |
||||||
|
List<Role> queryList(); |
||||||
|
void insertOne(Role role); |
||||||
|
void insertBatch(List<Role> roles); |
||||||
|
void delete(String roleCode); |
||||||
|
void deleteRolePer(String roleCode); |
||||||
|
void insertRolePer(Role role); |
||||||
|
void update(Role role); |
||||||
|
List<Entry<String, String>> queryRoleMaps(); |
||||||
|
} |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
package com.mengyxu.admin.um.mapper; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.User; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IUserMapper { |
||||||
|
|
||||||
|
List<User> queryByExample(User example); |
||||||
|
List<User> findUser(User example); |
||||||
|
void insert(User user); |
||||||
|
void update(User user); |
||||||
|
void delete(String userId); |
||||||
|
void deleteUserRole(String userName); |
||||||
|
void insertUserRole(User user); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
package com.mengyxu.admin.um.pojo; |
||||||
|
|
||||||
|
import com.mengyxu.core.pojo.base.BaseTree; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** |
||||||
|
* 菜单实体类 |
||||||
|
* @author v_mengyxu |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class Menu extends BaseTree<Menu>{ |
||||||
|
|
||||||
|
private String title; |
||||||
|
private String href; |
||||||
|
private boolean show = false; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,18 @@ |
|||||||
|
package com.mengyxu.admin.um.pojo; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class MenuParam { |
||||||
|
private String parentId; |
||||||
|
private boolean includeCom; |
||||||
|
private String userId; |
||||||
|
public MenuParam(String parentId, boolean includeCom) { |
||||||
|
super(); |
||||||
|
this.parentId = parentId; |
||||||
|
this.includeCom = includeCom; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
package com.mengyxu.admin.um.pojo; |
||||||
|
|
||||||
|
import com.mengyxu.core.pojo.base.BaseTree; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** |
||||||
|
* 权限实体类 |
||||||
|
* @author v_mengyxu |
||||||
|
* |
||||||
|
*/ |
||||||
|
@Getter |
||||||
|
@Setter |
||||||
|
public class Permission extends BaseTree<Permission>{ |
||||||
|
|
||||||
|
private String perParent;//父权限编码
|
||||||
|
private String perLevel;//权限级层
|
||||||
|
private String perContent;//权限内容
|
||||||
|
private String perStatus;//权限状态
|
||||||
|
private Integer perOrder; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
package com.mengyxu.admin.um.pojo; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import com.mengyxu.core.pojo.base.BasePageParam; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2020年6月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class Rockey extends BasePageParam{ |
||||||
|
|
||||||
|
private String hid; |
||||||
|
@JSONField(serialize = false) |
||||||
|
private String key; |
||||||
|
private String status; |
||||||
|
@JSONField(serialize = false) |
||||||
|
private boolean flag = false; |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
package com.mengyxu.admin.um.pojo; |
||||||
|
|
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月3日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Data |
||||||
|
public class Role { |
||||||
|
|
||||||
|
private String code; |
||||||
|
private String name; |
||||||
|
private String desc; |
||||||
|
private String status; |
||||||
|
|
||||||
|
private List<String> permissions; |
||||||
|
|
||||||
|
private boolean flag; |
||||||
|
|
||||||
|
public String briefInfo() { |
||||||
|
return MessageFormat.format("角色编码:{0},角色名称:{1},备注:{2},权限数量:{3}", code, name, desc, permissions == null ? 0 : permissions.size()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,54 @@ |
|||||||
|
package com.mengyxu.admin.um.pojo; |
||||||
|
|
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import com.mengyxu.core.pojo.base.BasePageParam; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月10日 |
||||||
|
* The entity for table UserManagement |
||||||
|
*/ |
||||||
|
|
||||||
|
@Setter |
||||||
|
@Getter |
||||||
|
public class User extends BasePageParam { |
||||||
|
|
||||||
|
private String userId; |
||||||
|
private String key; |
||||||
|
private String name; |
||||||
|
private String phone; |
||||||
|
private String idCard; |
||||||
|
private String email; |
||||||
|
private String lastLogin; |
||||||
|
private String status; |
||||||
|
|
||||||
|
private String newKey; |
||||||
|
|
||||||
|
private List<String> roles; |
||||||
|
|
||||||
|
public String briefInfo() { |
||||||
|
return MessageFormat.format("用户名:{0},姓名:{1},手机号码:{2},用户角色:{3}", userId, name, phone, roles); |
||||||
|
} |
||||||
|
|
||||||
|
@JSONField(serialize = false) |
||||||
|
public boolean isEmpty(){ |
||||||
|
if(StringUtil.isEmpty(userId)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if(roles == null) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if(roles.isEmpty()) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
package com.mengyxu.admin.um.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.Menu; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
public interface IMenuService { |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询所有系统 |
||||||
|
* @param userId |
||||||
|
*/ |
||||||
|
public List<Entry<String, String>> queryAllModule(String userId); |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询主页菜单树 |
||||||
|
* @param userId |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Menu> queryMenuTree(String userId, String perParent); |
||||||
|
|
||||||
|
public List<String> queryNodeContent(String userId, String parentContent); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
package com.mengyxu.admin.um.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.Permission; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月2日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IPermissionService { |
||||||
|
|
||||||
|
List<Permission> queryPermissionTree(boolean isOperater); |
||||||
|
|
||||||
|
void save(Permission permission) throws CoreException; |
||||||
|
|
||||||
|
void update(Permission permission) throws CoreException; |
||||||
|
|
||||||
|
void delete(String code); |
||||||
|
|
||||||
|
List<String> myPermissions(String userName, String parentContent); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
package com.mengyxu.admin.um.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月2日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IPermissionValidationService { |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据servletPath查询对应权限编码 |
||||||
|
* @param resContent |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
List<String> queryCodeByContent(String resContent); |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断指定用户是否拥有指定权限 |
||||||
|
* @param userId |
||||||
|
* @param resCode |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
boolean havePermission(String userId, String resCode); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
package com.mengyxu.admin.um.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.Role; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月3日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IRolePermissionService { |
||||||
|
|
||||||
|
List<Role> queryAll(); |
||||||
|
List<Role> queryList(); |
||||||
|
void save(Role role); |
||||||
|
void delete(String roleCode); |
||||||
|
String update(Role role); |
||||||
|
List<Entry<String, String>> queryRoleMaps(); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
package com.mengyxu.admin.um.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.User; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public interface IUserService { |
||||||
|
|
||||||
|
User findUser(String userId, String key); |
||||||
|
User getById(String userId); |
||||||
|
List<User> queryByExample(User example); |
||||||
|
List<User> queryAll(); |
||||||
|
|
||||||
|
void insert(User user) throws CoreException; |
||||||
|
void updateInfo(User user) throws CoreException; |
||||||
|
void updateKey(User user) throws CoreException; |
||||||
|
void deleteById(String userId); |
||||||
|
void updateLogin(String userId); |
||||||
|
void resetKey(String userId); |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,103 @@ |
|||||||
|
package com.mengyxu.admin.um.service.impl; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.transaction.annotation.Transactional; |
||||||
|
import org.springframework.util.StringUtils; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.mapper.IPermissionMapper; |
||||||
|
import com.mengyxu.admin.um.pojo.Menu; |
||||||
|
import com.mengyxu.admin.um.pojo.Permission; |
||||||
|
import com.mengyxu.admin.um.service.IMenuService; |
||||||
|
import com.mengyxu.admin.um.service.IPermissionService; |
||||||
|
import com.mengyxu.admin.um.service.IPermissionValidationService; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
@Service |
||||||
|
@Transactional |
||||||
|
public class PermissionService implements IMenuService,IPermissionValidationService,IPermissionService{ |
||||||
|
@Autowired |
||||||
|
private IPermissionMapper permissionMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Entry<String, String>> queryAllModule(String userId) { |
||||||
|
return permissionMapper.queryAllModule(userId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Menu> queryMenuTree(String userName, String perParent) { |
||||||
|
if(StringUtils.isEmpty(userName)){ |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
return permissionMapper.queryMenuTree(userName, perParent); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<String> queryNodeContent(String userId, String parentContent) { |
||||||
|
return permissionMapper.queryContentByParentContent(userId,parentContent); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<String> queryCodeByContent(String resContent) { |
||||||
|
return permissionMapper.queryCodeByContent(resContent); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean havePermission(String userId, String resCode) { |
||||||
|
long l = permissionMapper.havePermission(userId, resCode); |
||||||
|
return l > 0L; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Permission> queryPermissionTree(boolean isOperater) { |
||||||
|
if(isOperater) { |
||||||
|
return permissionMapper.queryPermissionTree(); |
||||||
|
} |
||||||
|
return permissionMapper.queryPublicPerTree(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void save(Permission permission) throws CoreException{ |
||||||
|
setDefault(permission); |
||||||
|
if(permissionMapper.isExist(permission.getId()) > 0L) { |
||||||
|
throw new CoreException("权限编号已经存在,请修改"); |
||||||
|
} |
||||||
|
permissionMapper.insertOne(permission); |
||||||
|
} |
||||||
|
|
||||||
|
private void setDefault(Permission permission) throws CoreException { |
||||||
|
if(StringUtil.isEmpty(permission.getId(),permission.getName())) { |
||||||
|
throw new CoreException("权限编号,权限名称不能为空"); |
||||||
|
} |
||||||
|
if(permission.getDesc() == null) { |
||||||
|
permission.setDesc(""); |
||||||
|
} |
||||||
|
if(StringUtil.isEmpty(permission.getPerContent())) { |
||||||
|
permission.setPerContent(permission.getName()); |
||||||
|
} |
||||||
|
if(StringUtil.isEmpty(permission.getPerStatus())) { |
||||||
|
permission.setPerStatus("A"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void update(Permission permission) throws CoreException { |
||||||
|
permissionMapper.updateByCode(permission); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void delete(String code) { |
||||||
|
permissionMapper.deleteByCode(code); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<String> myPermissions(String userName, String parentContent) { |
||||||
|
return permissionMapper.queryContentByParentContent(userName, parentContent); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,71 @@ |
|||||||
|
package com.mengyxu.admin.um.service.impl; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.transaction.annotation.Transactional; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.mapper.IRolePermissionMapper; |
||||||
|
import com.mengyxu.admin.um.pojo.Role; |
||||||
|
import com.mengyxu.admin.um.service.IRolePermissionService; |
||||||
|
import com.mengyxu.core.pojo.com.Entry; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年12月3日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Service |
||||||
|
public class RolePermissionService implements IRolePermissionService { |
||||||
|
@Autowired |
||||||
|
private IRolePermissionMapper rolePermissionMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Role> queryAll() { |
||||||
|
return rolePermissionMapper.queryAll(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Role> queryList() { |
||||||
|
return rolePermissionMapper.queryList(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public void save(Role role) { |
||||||
|
role.setStatus("E"); |
||||||
|
rolePermissionMapper.insertOne(role); |
||||||
|
if(role.getPermissions() != null && !role.getPermissions().isEmpty()) { |
||||||
|
rolePermissionMapper.insertRolePer(role); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public void delete(String roleCode) { |
||||||
|
rolePermissionMapper.delete(roleCode); |
||||||
|
rolePermissionMapper.deleteRolePer(roleCode); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public String update(Role role) { |
||||||
|
if(role.isFlag()) { |
||||||
|
rolePermissionMapper.deleteRolePer(role.getCode()); |
||||||
|
if(role.getPermissions() != null && !role.getPermissions().isEmpty()) { |
||||||
|
rolePermissionMapper.insertRolePer(role); |
||||||
|
} |
||||||
|
return "角色权限分配成功"; |
||||||
|
}else { |
||||||
|
rolePermissionMapper.update(role); |
||||||
|
return "角色修改成功"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<Entry<String, String>> queryRoleMaps() { |
||||||
|
return rolePermissionMapper.queryRoleMaps(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,178 @@ |
|||||||
|
package com.mengyxu.admin.um.service.impl; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.transaction.annotation.Transactional; |
||||||
|
import org.springframework.util.DigestUtils; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.mapper.IUserMapper; |
||||||
|
import com.mengyxu.admin.um.pojo.User; |
||||||
|
import com.mengyxu.admin.um.service.IUserService; |
||||||
|
import com.mengyxu.admin.utils.LoginUtil; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.golbal.GlobalConstant; |
||||||
|
import com.mengyxu.core.utils.DateUtil; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月10日 |
||||||
|
*/ |
||||||
|
|
||||||
|
@Service |
||||||
|
public class UserService implements IUserService { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private IUserMapper userMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<User> queryAll() { |
||||||
|
List<User> list = userMapper.findUser(new User()); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public User findUser(String userId, String key) { |
||||||
|
User user = getById(userId); |
||||||
|
if(user != null && StringUtil.equals(user.getKey(), key)) { |
||||||
|
return user; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public User getById(String userId) { |
||||||
|
if(StringUtil.isEmpty(userId)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
User exp = new User(); |
||||||
|
exp.setUserId(userId); |
||||||
|
List<User> list = userMapper.findUser(exp); |
||||||
|
if(list == null || list.isEmpty()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return list.get(0); |
||||||
|
} |
||||||
|
|
||||||
|
private User getByPhone(String phone) { |
||||||
|
if(StringUtil.isEmpty(phone)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
User exp = new User(); |
||||||
|
exp.setPhone(phone); |
||||||
|
List<User> list = userMapper.findUser(exp); |
||||||
|
if(list == null || list.isEmpty()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return list.get(0); |
||||||
|
} |
||||||
|
|
||||||
|
private User getByidNum(String idCard) { |
||||||
|
if(StringUtil.isEmpty(idCard)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
User exp = new User(); |
||||||
|
exp.setIdCard(idCard); |
||||||
|
List<User> list = userMapper.findUser(exp); |
||||||
|
if(list == null || list.isEmpty()) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return list.get(0); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<User> queryByExample(User example) { |
||||||
|
return userMapper.queryByExample(example); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public void insert(User user) throws CoreException { |
||||||
|
//判断用户名是否重复
|
||||||
|
String userId = user.getUserId(); |
||||||
|
if(getById(userId) != null){ |
||||||
|
throw new CoreException("用户名:"+userId+"已经存在"); |
||||||
|
} |
||||||
|
String idCard = user.getIdCard(); |
||||||
|
if(getByidNum(idCard) != null){ |
||||||
|
throw new CoreException("身份证号码:"+idCard+"已绑定其他用户"); |
||||||
|
} |
||||||
|
String phone = user.getPhone(); |
||||||
|
if(getByPhone(phone) != null){ |
||||||
|
throw new CoreException("手机号码:"+phone+"已绑定其他用户"); |
||||||
|
} |
||||||
|
//设置默认值后插入数据库
|
||||||
|
user.setKey(DigestUtils.md5DigestAsHex(user.getKey().getBytes())); |
||||||
|
user.setStatus("0"); |
||||||
|
userMapper.insert(user); |
||||||
|
userMapper.deleteUserRole(userId); |
||||||
|
if(user.getRoles() != null && !user.getRoles().isEmpty()) { |
||||||
|
userMapper.insertUserRole(user); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public void updateInfo(User user) throws CoreException { |
||||||
|
String phone = user.getPhone(); |
||||||
|
User old = getByPhone(phone); |
||||||
|
if(old != null && !StringUtil.equals(user.getUserId(), old.getUserId())){ |
||||||
|
throw new CoreException("手机号码:"+phone+"已绑定其他用户"); |
||||||
|
} |
||||||
|
String idCard = user.getIdCard(); |
||||||
|
old = getByidNum(idCard); |
||||||
|
if(old != null && !StringUtil.equals(user.getUserId(), old.getUserId())){ |
||||||
|
throw new CoreException("身份证号码:"+idCard+"已绑定其他用户"); |
||||||
|
} |
||||||
|
user.setKey(null); |
||||||
|
userMapper.update(user); |
||||||
|
userMapper.deleteUserRole(user.getUserId()); |
||||||
|
if(user.getRoles() != null && !user.getRoles().isEmpty()) { |
||||||
|
userMapper.insertUserRole(user); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public void deleteById(String userId) { |
||||||
|
//删除用户
|
||||||
|
userMapper.delete(userId); |
||||||
|
userMapper.deleteUserRole(userId); |
||||||
|
LoginUtil.remveLoginInfo(userId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void updateLogin(String userId) { |
||||||
|
User user = new User(); |
||||||
|
user.setUserId(userId); |
||||||
|
user.setLastLogin(DateUtil.format(new Date(), DateUtil.FORMAT19_LINE_YYYYMMDDHHMMSS)); |
||||||
|
userMapper.update(user); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
@Transactional |
||||||
|
public void updateKey(User user) throws CoreException { |
||||||
|
User old = getById(user.getUserId()); |
||||||
|
if(user != null && StringUtil.equals(user.getKey(), old.getKey())) { |
||||||
|
if("0".equals(old.getStatus())) { |
||||||
|
user.setStatus("1"); |
||||||
|
} |
||||||
|
userMapper.update(user); |
||||||
|
LoginUtil.remveLoginInfo(user.getUserId()); |
||||||
|
}else { |
||||||
|
throw new CoreException("修改密码失败,用户名或密码错误"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void resetKey(String userId) { |
||||||
|
User user = getById(userId); |
||||||
|
user.setNewKey(GlobalConstant.DEFAULT_PASSWORD); |
||||||
|
user.setStatus("0"); |
||||||
|
userMapper.update(user); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,75 @@ |
|||||||
|
package com.mengyxu.admin.utils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.ActionLog; |
||||||
|
import com.mengyxu.admin.um.pojo.Role; |
||||||
|
import com.mengyxu.admin.um.pojo.User; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
public class AdminLogUtil extends BaseLogUtil { |
||||||
|
|
||||||
|
public static void Login(HttpServletRequest request, User user) { |
||||||
|
ActionLog log = createLog(request, "0", "0"); |
||||||
|
log.setUserId(user.getUserId()); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void Logout(HttpServletRequest request) { |
||||||
|
ActionLog log = createLog(request, "0", "1"); |
||||||
|
if (StringUtil.isEmpty(log.getUserId())) { |
||||||
|
return; |
||||||
|
} |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void updatePassword(HttpServletRequest request, User user) { |
||||||
|
ActionLog log = createLog(request, "0", "2"); |
||||||
|
log.setUserId(user.getUserId()); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void saveUser(HttpServletRequest request, User user) { |
||||||
|
ActionLog log = createLog(request, "0", "3"); |
||||||
|
log.setContext(user.briefInfo()); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void updateUser(HttpServletRequest request, User user) { |
||||||
|
ActionLog log = createLog(request, "0", "4"); |
||||||
|
log.setContext(user.briefInfo()); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void deleteUser(HttpServletRequest request, String userId) { |
||||||
|
ActionLog log = createLog(request, "0", "5"); |
||||||
|
log.setContext("目标用户名:" + userId); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void resetUserLog(HttpServletRequest request, String userId) { |
||||||
|
ActionLog log = createLog(request, "0", "6"); |
||||||
|
log.setContext("目标用户名:" + userId); |
||||||
|
} |
||||||
|
|
||||||
|
public static void addRole(HttpServletRequest request, Role role) { |
||||||
|
ActionLog log = createLog(request, "0", "7"); |
||||||
|
log.setContext(role.briefInfo()); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void updateRole(HttpServletRequest request, Role role) { |
||||||
|
ActionLog log = createLog(request, "0", "8"); |
||||||
|
log.setType("8"); |
||||||
|
log.setModule("0"); |
||||||
|
log.setContext(role.briefInfo()); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
public static void deleteRole(HttpServletRequest request, Role role) { |
||||||
|
ActionLog log = createLog(request, "0", "9"); |
||||||
|
log.setContext("角色编码:" + role.getCode()); |
||||||
|
logToFileAndDatabase(log); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
package com.mengyxu.admin.utils; |
||||||
|
|
||||||
|
import java.text.MessageFormat; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
import com.mengyxu.admin.sys.pojo.ActionLog; |
||||||
|
import com.mengyxu.admin.sys.service.ILogService; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
import lombok.extern.log4j.Log4j2; |
||||||
|
|
||||||
|
@Log4j2 |
||||||
|
public class BaseLogUtil { |
||||||
|
public static ILogService logService; |
||||||
|
|
||||||
|
protected BaseLogUtil() { |
||||||
|
// Add a protected constructor to hide the implicit public one.
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取访问者IP |
||||||
|
* |
||||||
|
* 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。 |
||||||
|
* |
||||||
|
* 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割), 如果还不存在则调用Request |
||||||
|
* .getRemoteAddr()。 |
||||||
|
* |
||||||
|
* @param request |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getIpAddr(HttpServletRequest request) { |
||||||
|
String ip = request.getHeader("X-Real-IP"); |
||||||
|
if (!StringUtil.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { |
||||||
|
return ip; |
||||||
|
} |
||||||
|
ip = request.getHeader("X-Forwarded-For"); |
||||||
|
if (!StringUtil.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { |
||||||
|
// 多次反向代理后会有多个IP值,第一个为真实IP。
|
||||||
|
int index = ip.indexOf(','); |
||||||
|
if (index != -1) { |
||||||
|
return ip.substring(0, index); |
||||||
|
} else { |
||||||
|
return ip; |
||||||
|
} |
||||||
|
} else { |
||||||
|
return request.getRemoteAddr(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static ActionLog createLog(HttpServletRequest request, String module, String type) { |
||||||
|
ActionLog log = new ActionLog(); |
||||||
|
log.setLoginIp(getIpAddr(request)); |
||||||
|
log.setUserId(LoginUtil.getUserId(request)); |
||||||
|
log.setModule(module); |
||||||
|
log.setType(type); |
||||||
|
return log; |
||||||
|
} |
||||||
|
|
||||||
|
protected static void logToFileAndDatabase(ActionLog actionLog) { |
||||||
|
log.info(MessageFormat.format("{0}-------操作用户:{1},{2}", logService.getTypeMap().get(actionLog.getType()), |
||||||
|
actionLog.getUserId(), actionLog.getContext())); |
||||||
|
logService.insertActionLog(actionLog); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,181 @@ |
|||||||
|
package com.mengyxu.admin.utils; |
||||||
|
|
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
import com.mengyxu.admin.um.pojo.User; |
||||||
|
import com.mengyxu.core.exception.CoreException; |
||||||
|
import com.mengyxu.core.golbal.GlobalBuffer; |
||||||
|
import com.mengyxu.core.golbal.GlobalConstant; |
||||||
|
import com.mengyxu.core.pojo.com.Cache; |
||||||
|
import com.mengyxu.core.utils.StringUtil; |
||||||
|
|
||||||
|
/** Ownership belongs to the company |
||||||
|
* author:mengyxu |
||||||
|
* date:2019年5月27日 |
||||||
|
*/ |
||||||
|
|
||||||
|
public class LoginUtil { |
||||||
|
public static Integer timeout; |
||||||
|
public static String domain; |
||||||
|
|
||||||
|
private static String getTokenKey(String userId) { |
||||||
|
return GlobalConstant.TIKEN_KEY_PREFIX+userId; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isLogin(String userId) { |
||||||
|
Cache cache = GlobalBuffer.getCache(getTokenKey(userId)); |
||||||
|
return !Cache.isEmpty(cache); |
||||||
|
} |
||||||
|
|
||||||
|
public static void remveLoginInfo(String userId) { |
||||||
|
String tokenKey = LoginUtil.getTokenKey(userId); |
||||||
|
Cache token = GlobalBuffer.getCache(tokenKey); |
||||||
|
if(!Cache.isEmpty(token)){ |
||||||
|
String value = token.getValue(); |
||||||
|
GlobalBuffer.removeCache(value.substring(0, 10)); |
||||||
|
GlobalBuffer.removeCache(tokenKey); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void saveLoginInfo(User user, HttpServletRequest request, |
||||||
|
HttpServletResponse response) throws CoreException{ |
||||||
|
//删除旧的token信息
|
||||||
|
String userId = user.getUserId(); |
||||||
|
Cache exitToken = GlobalBuffer.getCache(LoginUtil.getTokenKey(userId)); |
||||||
|
if(!Cache.isEmpty(exitToken)){ |
||||||
|
String value = exitToken.getValue(); |
||||||
|
GlobalBuffer.removeCache(value.substring(0, 10)); |
||||||
|
} |
||||||
|
|
||||||
|
//计算新的token
|
||||||
|
String ip = BaseLogUtil.getIpAddr(request); |
||||||
|
String seq = GlobalBuffer.getSeq(); |
||||||
|
String token = seq + StringUtil.md5(user.getUserId() + ip + System.currentTimeMillis(), false); |
||||||
|
|
||||||
|
//保存用户token
|
||||||
|
GlobalBuffer.addCache(LoginUtil.getTokenKey(userId), new Cache(token, timeout*60)); |
||||||
|
//保存token的用户信息
|
||||||
|
GlobalBuffer.addCache(seq, new Cache(user, timeout*60)); |
||||||
|
//删除验证码
|
||||||
|
GlobalBuffer.removeCache(getCodeKey(userId)); |
||||||
|
|
||||||
|
LoginUtil.addToken(request, token, response); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private static void addToken(HttpServletRequest request, String token, HttpServletResponse response){ |
||||||
|
Cookie cookie = new Cookie(GlobalConstant.LOGIN_COOKIE_NAME, token); |
||||||
|
if(!StringUtil.isEmpty(domain)) { |
||||||
|
cookie.setDomain(domain); |
||||||
|
} |
||||||
|
cookie.setPath("/"); |
||||||
|
response.addCookie(cookie); |
||||||
|
} |
||||||
|
|
||||||
|
public static User getUserInfo(String token, HttpServletRequest request, boolean refresh){ |
||||||
|
if(StringUtil.isEmpty(token)){ |
||||||
|
token = getToken(request); |
||||||
|
} |
||||||
|
if(StringUtil.isEmpty(token) || token.length() != 42){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
Cache userCache = GlobalBuffer.getCache(token.substring(0, 10)); |
||||||
|
if(Cache.isEmpty(userCache)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
User user = userCache.getValue(); |
||||||
|
String userId = user.getUserId(); |
||||||
|
Cache exitToken = GlobalBuffer.getCache(LoginUtil.getTokenKey(userId)); |
||||||
|
if(Cache.isEmpty(exitToken)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
if(StringUtil.equals(token, exitToken.getValue())) { |
||||||
|
if(refresh) { |
||||||
|
userCache.refresh(); |
||||||
|
exitToken.refresh(); |
||||||
|
} |
||||||
|
return user; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public static String getUserId(HttpServletRequest request) { |
||||||
|
User user = getUserInfo(null, request, false); |
||||||
|
if(user == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return user.getUserId(); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getUserNameAndRefresh(HttpServletRequest request) { |
||||||
|
return getUserInfo(null, request, true).getUserId(); |
||||||
|
} |
||||||
|
|
||||||
|
public static User getUserInfo(HttpServletRequest request){ |
||||||
|
return getUserInfo(null, request, false); |
||||||
|
} |
||||||
|
|
||||||
|
public static void loginOut(HttpServletRequest request){ |
||||||
|
String token = LoginUtil.getToken(request); |
||||||
|
if(!StringUtil.isEmpty(token)){ |
||||||
|
String seq = token.substring(0, 10); |
||||||
|
Cache userCache = GlobalBuffer.getCache(seq); |
||||||
|
if(!Cache.isEmpty(userCache)){ |
||||||
|
User user = userCache.getValue(); |
||||||
|
String userId = user.getUserId(); |
||||||
|
GlobalBuffer.removeCache(getTokenKey(userId)); |
||||||
|
} |
||||||
|
GlobalBuffer.removeCache(seq); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static String getToken(HttpServletRequest request){ |
||||||
|
Cookie[] cookies = request.getCookies(); |
||||||
|
if(cookies == null){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
for (Cookie cookie : cookies) { |
||||||
|
if(GlobalConstant.LOGIN_COOKIE_NAME.equals(cookie.getName())){ |
||||||
|
return cookie.getValue(); |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public static String getParentContent(HttpServletRequest request) { |
||||||
|
return request.getParameter("content"); |
||||||
|
// String refer = request.getHeader("Referer");
|
||||||
|
// try {
|
||||||
|
// URL url = new URL(refer);
|
||||||
|
// String prefix = request.getContextPath() + "/";
|
||||||
|
// return url.getPath().replace(prefix, "");
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// log.error("获取ParentContent失败",e);
|
||||||
|
// }
|
||||||
|
// return null;
|
||||||
|
} |
||||||
|
|
||||||
|
public static String getCode(String userId) { |
||||||
|
String code = StringUtil.getStringNum(10); |
||||||
|
GlobalBuffer.addCache(getCodeKey(userId), new Cache(code, timeout*60)); |
||||||
|
return code; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getCodeKey(String userId) { |
||||||
|
return GlobalConstant.CODE_KEY_PREFIX+userId; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean checkCode(String userId, String code) { |
||||||
|
if(code == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
Cache cache = GlobalBuffer.getCache(getCodeKey(userId)); |
||||||
|
if(!Cache.isEmpty(cache) && code.equals(cache.getValue())) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,35 @@ |
|||||||
|
service.package.type=jar |
||||||
|
# 定位模板的目录(配合ResourceHandler使用,控制页面访问) |
||||||
|
spring.mvc.view.prefix=/private/ |
||||||
|
spring.mvc.view.suffix=.html |
||||||
|
|
||||||
|
spring.main.banner-mode=off |
||||||
|
|
||||||
|
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource |
||||||
|
spring.datasource.driver-class-name=com.mysql.jdbc.Driver |
||||||
|
spring.datasource.initialSize=3 |
||||||
|
spring.datasource.minIdle=3 |
||||||
|
spring.datasource.maxActive=20 |
||||||
|
spring.datasource.maxWait=60000 |
||||||
|
spring.datasource.timeBetweenEvictionRunsMillis=60000 |
||||||
|
spring.datasource.minEvictableIdleTimeMillis=300000 |
||||||
|
spring.datasource.validationQuery=SELECT 1 FROM DUAL |
||||||
|
spring.datasource.keepAlive=true |
||||||
|
spring.datasource.testWhileIdle=true |
||||||
|
spring.datasource.testOnBorrow=false |
||||||
|
spring.datasource.testOnReturn=false |
||||||
|
spring.datasource.poolPreparedStatements=false |
||||||
|
|
||||||
|
mybatis.mapper-locations= classpath*:mapper/**/*.xml |
||||||
|
mybatis.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl |
||||||
|
|
||||||
|
pagehelper.helperDialect=mysql |
||||||
|
pagehelper.reasonable=true |
||||||
|
pagehelper.supportMethodsArguments=true |
||||||
|
pagehelper.params=count=countSql |
||||||
|
pagehelper.returnPageInfo=check |
||||||
|
|
||||||
|
#缓存定时器cron |
||||||
|
quartz.cron.clean.global=0 */10 * * * ? |
||||||
|
#用户登陆token有效期(分钟) |
||||||
|
timeout.login.token=30 |
||||||
@ -0,0 +1,77 @@ |
|||||||
|
<?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.mengyxu.admin.sys.mapper.IActionLogMapper"> |
||||||
|
|
||||||
|
<sql id="base_column"> |
||||||
|
id,type,module,user_id,login_ip,time,context |
||||||
|
</sql> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.sys.pojo.ActionLog" id="logRM"> |
||||||
|
<id column="id" property="id"/> |
||||||
|
<result column="type" property="type"/> |
||||||
|
<result column="module" property="module"/> |
||||||
|
<result column="user_id" property="userId"/> |
||||||
|
<result column="login_ip" property="loginIp"/> |
||||||
|
<result column="time" property="time"/> |
||||||
|
<result column="context" property="context"/> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<select id="queryByExample" parameterType="com.mengyxu.admin.sys.pojo.ActionLog" resultMap="logRM"> |
||||||
|
SELECT |
||||||
|
<include refid="base_column"/> |
||||||
|
FROM |
||||||
|
sys_action_log |
||||||
|
<where> |
||||||
|
<if test="type != null and type != ''"> |
||||||
|
AND type = #{type} |
||||||
|
</if> |
||||||
|
<if test="module != null and module != ''"> |
||||||
|
AND module = #{module} |
||||||
|
</if> |
||||||
|
<if test="userId != null and userId != ''"> |
||||||
|
AND user_id like CONCAT('%',#{userId},'%') |
||||||
|
</if> |
||||||
|
<if test="context != null and context != ''"> |
||||||
|
AND context like CONCAT('%',#{context},'%') |
||||||
|
</if> |
||||||
|
<if test="startTime != null and startTime != ''"> |
||||||
|
AND time >= #{startTime} |
||||||
|
</if> |
||||||
|
<if test="endTime != null and endTime != ''"> |
||||||
|
AND #{endTime} > time |
||||||
|
</if> |
||||||
|
</where> |
||||||
|
ORDER BY time DESC |
||||||
|
</select> |
||||||
|
|
||||||
|
<insert id="insert" parameterType="com.mengyxu.admin.sys.pojo.ActionLog"> |
||||||
|
INSERT INTO sys_action_log |
||||||
|
(<include refid="base_column"/>) |
||||||
|
VALUES ( |
||||||
|
#{id}, |
||||||
|
#{type}, |
||||||
|
#{module}, |
||||||
|
#{userId}, |
||||||
|
#{loginIp}, |
||||||
|
#{time}, |
||||||
|
#{context} |
||||||
|
) |
||||||
|
</insert> |
||||||
|
<insert id="insertBatch" parameterType="java.util.List"> |
||||||
|
INSERT INTO BusinessLog |
||||||
|
(<include refid="base_column"/>) |
||||||
|
VALUES |
||||||
|
<foreach collection="list" item="log" separator=","> |
||||||
|
( |
||||||
|
#{log.id}, |
||||||
|
#{log.type}, |
||||||
|
#{log.module}, |
||||||
|
#{log.userId}, |
||||||
|
#{log.loginIp}, |
||||||
|
#{log.time}, |
||||||
|
#{log.context} |
||||||
|
) |
||||||
|
</foreach> |
||||||
|
</insert> |
||||||
|
|
||||||
|
</mapper> |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
<?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.mengyxu.admin.sys.mapper.IConfigMapper"> |
||||||
|
|
||||||
|
<sql id="baseColumn"> |
||||||
|
cfg_key, |
||||||
|
cfg_name, |
||||||
|
cfg_value, |
||||||
|
cfg_type, |
||||||
|
cfg_desc, |
||||||
|
cfg_status, |
||||||
|
update_time, |
||||||
|
update_user |
||||||
|
</sql> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.sys.pojo.SysConfig" id="cfgResultMap"> |
||||||
|
<result column="cfg_key" property="cfgKey"/> |
||||||
|
<result column="cfg_name" property="cfgName"/> |
||||||
|
<result column="cfg_value" property="cfgValue"/> |
||||||
|
<result column="cfg_type" property="cfgType"/> |
||||||
|
<result column="cfg_desc" property="cfgDesc"/> |
||||||
|
<result column="cfg_status" property="cfgStatus"/> |
||||||
|
<result column="update_time" property="updateTime"/> |
||||||
|
<result column="update_user" property="updateUser"/> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
|
||||||
|
<select id="queryValueByKey" parameterType="java.lang.String" resultType="java.lang.String"> |
||||||
|
SELECT cfg_value FROM sys_config WHERE cfg_key = #{cfgKey} AND cfg_status != 'I' |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryByExample" parameterType="com.mengyxu.admin.sys.pojo.SysConfig" resultMap="cfgResultMap"> |
||||||
|
SELECT |
||||||
|
<include refid="baseColumn"/> |
||||||
|
FROM |
||||||
|
sys_config |
||||||
|
<where> |
||||||
|
<if test="cfgKey != null and cfgKey !=''"> |
||||||
|
AND cfg_key = #{cfgKey} |
||||||
|
</if> |
||||||
|
<if test="cfgStatus != null and cfgStatus !=''"> |
||||||
|
AND cfg_status = #{cfgStatus} |
||||||
|
</if> |
||||||
|
<if test="cfgName != null and cfgName !=''"> |
||||||
|
AND cfg_name like CONCAT('%',#{cfgName},'%') |
||||||
|
</if> |
||||||
|
</where> |
||||||
|
</select> |
||||||
|
|
||||||
|
<update id="update" parameterType="com.mengyxu.admin.sys.pojo.SysConfig"> |
||||||
|
UPDATE |
||||||
|
sys_config |
||||||
|
SET |
||||||
|
cfg_name = #{cfgName}, |
||||||
|
cfg_value = #{cfgValue}, |
||||||
|
cfg_desc = #{cfgDesc}, |
||||||
|
cfg_status = #{cfgStatus}, |
||||||
|
update_time = NOW(), |
||||||
|
update_user = #{updateUser} |
||||||
|
WHERE |
||||||
|
cfg_key = #{cfgKey} |
||||||
|
</update> |
||||||
|
|
||||||
|
</mapper> |
||||||
@ -0,0 +1,153 @@ |
|||||||
|
<?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.mengyxu.admin.sys.mapper.IDictionaryMapper"> |
||||||
|
|
||||||
|
<sql id="typeColumn"> |
||||||
|
type_code, |
||||||
|
type_name, |
||||||
|
type_desc, |
||||||
|
type_status |
||||||
|
</sql> |
||||||
|
|
||||||
|
<sql id="dictColumn"> |
||||||
|
dict_id, |
||||||
|
dict_code, |
||||||
|
dict_name, |
||||||
|
dict_desc, |
||||||
|
dict_parent, |
||||||
|
dict_status |
||||||
|
</sql> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.sys.pojo.Dictionary" id="typeRM"> |
||||||
|
<result column="type_code" property="key"/> |
||||||
|
<result column="type_code" property="code"/> |
||||||
|
<result column="type_name" property="name"/> |
||||||
|
<result column="type_desc" property="desc"/> |
||||||
|
<result column="type_status" property="status"/> |
||||||
|
|
||||||
|
<collection property="children" column="{parent=type_code}" select="queryDict"/> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.sys.pojo.Dictionary" id="dictRM"> |
||||||
|
<id column="dict_id" property="id"/> |
||||||
|
<result column="dict_id" property="key"/> |
||||||
|
<result column="dict_code" property="code"/> |
||||||
|
<result column="dict_name" property="name"/> |
||||||
|
<result column="dict_desc" property="desc"/> |
||||||
|
<result column="dict_parent" property="parent"/> |
||||||
|
<result column="dict_status" property="status"/> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<select id="queryType" resultMap="typeRM" parameterType="com.mengyxu.admin.sys.pojo.Dictionary"> |
||||||
|
SELECT |
||||||
|
<include refid="typeColumn"/> |
||||||
|
FROM |
||||||
|
sys_dict_type |
||||||
|
<where> |
||||||
|
<if test="code != null and code != ''"> |
||||||
|
AND type_code = #{code} |
||||||
|
</if> |
||||||
|
<if test="name != null and name != ''"> |
||||||
|
AND type_name like CONCAT('%',#{name},'%') |
||||||
|
</if> |
||||||
|
<if test="status != null and status != ''"> |
||||||
|
AND type_status = #{status} |
||||||
|
</if> |
||||||
|
</where> |
||||||
|
ORDER BY type_name ASC |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryDict" resultMap="dictRM" parameterType="com.mengyxu.admin.sys.pojo.Dictionary"> |
||||||
|
SELECT |
||||||
|
<include refid="dictColumn"/> |
||||||
|
FROM |
||||||
|
sys_dictionary |
||||||
|
<where> |
||||||
|
<if test="id != null"> |
||||||
|
AND dict_id = #{id} |
||||||
|
</if> |
||||||
|
<if test="parent != null and parent != ''"> |
||||||
|
AND dict_parent = #{parent} |
||||||
|
</if> |
||||||
|
<if test="status != null and status != ''"> |
||||||
|
AND dict_status = #{status} |
||||||
|
</if> |
||||||
|
</where> |
||||||
|
ORDER BY dict_id ASC |
||||||
|
</select> |
||||||
|
|
||||||
|
<insert id="insertDict" parameterType="com.mengyxu.admin.sys.pojo.Dictionary" > |
||||||
|
INSERT INTO sys_dictionary |
||||||
|
(<include refid="dictColumn"></include>) |
||||||
|
VALUES |
||||||
|
( |
||||||
|
#{id}, |
||||||
|
#{code}, |
||||||
|
#{name}, |
||||||
|
#{desc}, |
||||||
|
#{parent}, |
||||||
|
#{status} |
||||||
|
) |
||||||
|
</insert> |
||||||
|
|
||||||
|
<insert id="insertType" parameterType="com.mengyxu.admin.sys.pojo.Dictionary"> |
||||||
|
INSERT INTO sys_dict_type |
||||||
|
(<include refid="typeColumn"></include>) |
||||||
|
VALUES |
||||||
|
( |
||||||
|
#{code}, |
||||||
|
#{name}, |
||||||
|
#{desc}, |
||||||
|
#{status} |
||||||
|
) |
||||||
|
</insert> |
||||||
|
|
||||||
|
<update id="updateDict" parameterType="com.mengyxu.admin.sys.pojo.Dictionary"> |
||||||
|
UPDATE sys_dictionary SET |
||||||
|
dict_code = #{code}, |
||||||
|
dict_name = #{name}, |
||||||
|
dict_desc = #{desc}, |
||||||
|
dict_parent = #{parent}, |
||||||
|
dict_status = #{status} |
||||||
|
WHERE |
||||||
|
dict_id = #{id} |
||||||
|
</update> |
||||||
|
|
||||||
|
<update id="updateType" parameterType="com.mengyxu.admin.sys.pojo.Dictionary"> |
||||||
|
UPDATE sys_dict_type SET |
||||||
|
type_name = #{name}, |
||||||
|
type_desc = #{desc}, |
||||||
|
type_status = #{status} |
||||||
|
WHERE |
||||||
|
type_code = #{code} |
||||||
|
</update> |
||||||
|
|
||||||
|
<delete id="deleteType" parameterType="java.lang.String"> |
||||||
|
DELETE FROM sys_dict_type WHERE type_code = #{code} |
||||||
|
</delete> |
||||||
|
|
||||||
|
<delete id="deleteDict" parameterType="java.lang.Integer"> |
||||||
|
DELETE FROM sys_dictionary WHERE dict_id = #{id} |
||||||
|
</delete> |
||||||
|
|
||||||
|
<delete id="deleteDicts" parameterType="java.lang.String"> |
||||||
|
DELETE FROM sys_dictionary WHERE dict_parent = #{parent} |
||||||
|
</delete> |
||||||
|
|
||||||
|
<select id="queryProvince" resultType="com.mengyxu.core.pojo.com.Entry"> |
||||||
|
select code as 'key', name as 'value' from province |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryCity" resultType="com.mengyxu.core.pojo.com.Entry" parameterType="java.lang.String"> |
||||||
|
select code as 'key', name as 'value' from city where provinceCode = #{parent} |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryCounty" resultType="com.mengyxu.core.pojo.com.Entry" parameterType="java.lang.String"> |
||||||
|
select countycode as 'key', countyname as 'value' from county where cityCode = #{parent} |
||||||
|
</select> |
||||||
|
|
||||||
|
</mapper> |
||||||
@ -0,0 +1,95 @@ |
|||||||
|
<?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.mengyxu.admin.sys.mapper.IUserItemMapper"> |
||||||
|
|
||||||
|
<sql id="base_column"> |
||||||
|
id,user_id,item_name,item_desc,item_type,item_flag,add_user,add_time,status |
||||||
|
</sql> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.sys.pojo.UserItem" id="itemRM"> |
||||||
|
<id column="id" property="id"/> |
||||||
|
<result column="user_id" property="userId"/> |
||||||
|
<result column="item_name" property="itemName"/> |
||||||
|
<result column="item_desc" property="itemDesc"/> |
||||||
|
<result column="item_type" property="itemType"/> |
||||||
|
<result column="item_flag" property="itemFlag"/> |
||||||
|
<result column="add_user" property="addUser"/> |
||||||
|
<result column="add_time" property="addTime"/> |
||||||
|
<result column="status" property="status"/> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<select id="queryByExample" parameterType="com.mengyxu.admin.sys.pojo.UserItem" resultMap="itemRM"> |
||||||
|
SELECT |
||||||
|
<include refid="base_column"/> |
||||||
|
FROM |
||||||
|
sys_user_item |
||||||
|
<where> |
||||||
|
<if test="id != null and id != ''"> |
||||||
|
AND id = #{id} |
||||||
|
</if> |
||||||
|
<if test="userId != null and userId != ''"> |
||||||
|
AND user_id = #{userId} |
||||||
|
</if> |
||||||
|
<if test="itemType != null and itemType != ''"> |
||||||
|
AND item_type = #{itemType} |
||||||
|
</if> |
||||||
|
<if test="itemFlag != null and itemFlag != ''"> |
||||||
|
AND item_flag = #{itemFlag} |
||||||
|
</if> |
||||||
|
<if test="addUser != null and addUser != ''"> |
||||||
|
AND add_user = #{addUser} |
||||||
|
</if> |
||||||
|
<if test="status != null"> |
||||||
|
AND status = #{status} |
||||||
|
</if> |
||||||
|
</where> |
||||||
|
ORDER BY status ASC, add_time DESC |
||||||
|
<if test="limitStart != null"> |
||||||
|
LIMIT #{limitStart},#{size} |
||||||
|
</if> |
||||||
|
</select> |
||||||
|
|
||||||
|
<insert id="insert" parameterType="com.mengyxu.admin.sys.pojo.UserItem"> |
||||||
|
INSERT INTO sys_user_item |
||||||
|
(<include refid="base_column"/>) |
||||||
|
VALUES ( |
||||||
|
#{id}, |
||||||
|
#{userId}, |
||||||
|
#{itemName}, |
||||||
|
#{itemDesc}, |
||||||
|
#{itemType}, |
||||||
|
#{itemFlag}, |
||||||
|
#{addUser}, |
||||||
|
#{addTime}, |
||||||
|
'0' |
||||||
|
) |
||||||
|
</insert> |
||||||
|
|
||||||
|
<insert id="insertBatch" parameterType="java.util.List"> |
||||||
|
INSERT INTO sys_user_item |
||||||
|
(<include refid="base_column"/>) |
||||||
|
VALUES |
||||||
|
<foreach collection="list" item="item" separator=","> |
||||||
|
( |
||||||
|
#{item.id}, |
||||||
|
#{item.userId}, |
||||||
|
#{item.itemName}, |
||||||
|
#{item.itemDesc}, |
||||||
|
#{item.itemType}, |
||||||
|
#{item.itemFlag}, |
||||||
|
#{item.addUser}, |
||||||
|
#{item.addTime}, |
||||||
|
'0' |
||||||
|
) |
||||||
|
</foreach> |
||||||
|
</insert> |
||||||
|
|
||||||
|
<update id="update" parameterType="com.mengyxu.admin.sys.pojo.UserItem"> |
||||||
|
UPDATE sys_user_item |
||||||
|
SET |
||||||
|
status = #{status} |
||||||
|
WHERE |
||||||
|
id = #{id} |
||||||
|
</update> |
||||||
|
|
||||||
|
</mapper> |
||||||
@ -0,0 +1,257 @@ |
|||||||
|
<?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.mengyxu.admin.um.mapper.IPermissionMapper"> |
||||||
|
|
||||||
|
<sql id="baseColumn"> |
||||||
|
per_code, |
||||||
|
per_name, |
||||||
|
per_desc, |
||||||
|
per_parent, |
||||||
|
per_level, |
||||||
|
per_content, |
||||||
|
per_status, |
||||||
|
per_order |
||||||
|
</sql> |
||||||
|
|
||||||
|
<insert id="insertOne" parameterType="com.mengyxu.admin.um.pojo.Permission" > |
||||||
|
INSERT INTO um_permission_full |
||||||
|
(<include refid="baseColumn"></include>) |
||||||
|
VALUES |
||||||
|
( |
||||||
|
#{id}, |
||||||
|
#{name}, |
||||||
|
#{desc}, |
||||||
|
#{perParent}, |
||||||
|
#{perLevel}, |
||||||
|
#{perContent}, |
||||||
|
#{perStatus}, |
||||||
|
#{perOrder} |
||||||
|
) |
||||||
|
</insert> |
||||||
|
|
||||||
|
<insert id="insertBatch" parameterType="java.util.List"> |
||||||
|
INSERT INTO um_permission_full |
||||||
|
(<include refid="baseColumn"></include>) |
||||||
|
VALUES |
||||||
|
<foreach collection="list" item="permission" index="index" separator=","> |
||||||
|
( |
||||||
|
#{permission.id}, |
||||||
|
#{permission.name}, |
||||||
|
#{permission.desc}, |
||||||
|
#{permission.perParent}, |
||||||
|
#{permission.perLevel}, |
||||||
|
#{permission.perContent}, |
||||||
|
#{permission.perStatus}, |
||||||
|
#{permission.perOrder} |
||||||
|
) |
||||||
|
</foreach> |
||||||
|
</insert> |
||||||
|
|
||||||
|
<update id="updateByCode" parameterType="com.mengyxu.admin.um.pojo.Permission"> |
||||||
|
UPDATE um_permission_full SET |
||||||
|
per_name = #{name}, |
||||||
|
per_desc = #{desc}, |
||||||
|
per_parent = #{perParent}, |
||||||
|
per_level = #{perLevel}, |
||||||
|
per_content = #{perContent}, |
||||||
|
per_status = #{perStatus}, |
||||||
|
per_order = #{perOrder} |
||||||
|
WHERE |
||||||
|
per_code = #{id} |
||||||
|
</update> |
||||||
|
|
||||||
|
<sql id="deletChild"> |
||||||
|
DELETE |
||||||
|
FROM |
||||||
|
um_permission_full |
||||||
|
WHERE |
||||||
|
per_code IN ( |
||||||
|
SELECT |
||||||
|
* |
||||||
|
FROM |
||||||
|
( |
||||||
|
SELECT |
||||||
|
a.per_code |
||||||
|
FROM |
||||||
|
um_permission_full a |
||||||
|
LEFT JOIN um_permission_full b ON b.per_code = a.per_parent |
||||||
|
WHERE |
||||||
|
a.per_level in ('view','action') |
||||||
|
AND b.per_code IS NULL |
||||||
|
) c |
||||||
|
); |
||||||
|
</sql> |
||||||
|
|
||||||
|
<delete id="deleteByCode" parameterType="java.lang.String"> |
||||||
|
DELETE FROM um_permission_full WHERE per_code = #{code}; |
||||||
|
<include refid="deletChild"></include> |
||||||
|
<include refid="deletChild"></include> |
||||||
|
</delete> |
||||||
|
|
||||||
|
<select id="isExist" parameterType="java.lang.String" resultType="_long"> |
||||||
|
SELECT COUNT(1) FROM um_permission_full WHERE per_code = #{code} |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryCodeByContent" parameterType="java.lang.String" resultType="java.lang.String"> |
||||||
|
SELECT per_code FROM um_permission_full WHERE per_content = #{perContent} |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="havePermission" parameterType="java.util.Map" resultType="_long"> |
||||||
|
SELECT |
||||||
|
COUNT(1) |
||||||
|
FROM |
||||||
|
um_user_role ur, |
||||||
|
um_role_permission rp, |
||||||
|
um_permission_full p |
||||||
|
WHERE |
||||||
|
ur.role_code = rp.role_code |
||||||
|
AND rp.per_code = p.per_code |
||||||
|
AND ur.user_id = #{userId} |
||||||
|
AND p.per_code = #{preCode} |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryAllModule" parameterType="java.lang.String" resultType="com.mengyxu.core.pojo.com.Entry"> |
||||||
|
SELECT |
||||||
|
p.per_code as 'key', |
||||||
|
p.per_name as 'value' |
||||||
|
FROM |
||||||
|
um_user_role u, |
||||||
|
um_role_permission r, |
||||||
|
um_permission_full p |
||||||
|
WHERE |
||||||
|
u.role_code = r.role_code |
||||||
|
AND r.per_code = p.per_code |
||||||
|
AND p.per_level = 'module' |
||||||
|
AND u.user_id = #{userId} |
||||||
|
ORDER BY per_order ASC |
||||||
|
</select> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.um.pojo.Menu" id="menuResultMap"> |
||||||
|
<result property="id" column="per_code"/> |
||||||
|
<result property="title" column="per_name"/> |
||||||
|
<result property="desc" column="per_desc"/> |
||||||
|
<result property="href" column="per_content"/> |
||||||
|
|
||||||
|
<collection property="children" column="{perParent=per_code,userId=user_id}" select="queryNodes" /> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<select id="queryMenuTree" resultMap="menuResultMap"> |
||||||
|
SELECT DISTINCT |
||||||
|
u.user_id, |
||||||
|
p.per_code, |
||||||
|
p.per_name, |
||||||
|
p.per_desc, |
||||||
|
p.per_content |
||||||
|
FROM |
||||||
|
um_user_role u, |
||||||
|
um_role_permission r, |
||||||
|
um_permission_full p |
||||||
|
WHERE |
||||||
|
u.role_code = r.role_code |
||||||
|
AND r.per_code = p.per_code |
||||||
|
AND per_level = 'group' |
||||||
|
<if test="perParent != null and perParent != ''"> |
||||||
|
AND per_parent = #{perParent} |
||||||
|
</if> |
||||||
|
AND u.user_id = #{userId} |
||||||
|
AND per_status != 'I' |
||||||
|
ORDER BY per_order ASC |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryNodes" parameterType="java.util.Map" resultMap="menuResultMap"> |
||||||
|
SELECT DISTINCT |
||||||
|
u.user_id, |
||||||
|
p.per_code, |
||||||
|
p.per_name, |
||||||
|
p.per_desc, |
||||||
|
p.per_content |
||||||
|
FROM |
||||||
|
um_user_role u, |
||||||
|
um_role_permission r, |
||||||
|
um_permission_full p |
||||||
|
WHERE |
||||||
|
u.role_code = r.role_code |
||||||
|
AND r.per_code = p.per_code |
||||||
|
AND p.per_parent = #{perParent} |
||||||
|
AND p.per_level = 'view' |
||||||
|
AND u.user_id = #{userId} |
||||||
|
AND per_status != 'I' |
||||||
|
ORDER BY per_order ASC |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryContentByParentContent" resultType="java.lang.String"> |
||||||
|
SELECT |
||||||
|
DISTINCT per_content |
||||||
|
FROM |
||||||
|
um_user_role u, |
||||||
|
um_role_permission r, |
||||||
|
um_permission_full p |
||||||
|
WHERE |
||||||
|
u.role_code = r.role_code |
||||||
|
AND r.per_code = p.per_code |
||||||
|
AND u.user_id = #{userId} |
||||||
|
AND p.per_parent = ( |
||||||
|
SELECT |
||||||
|
per_code |
||||||
|
FROM |
||||||
|
um_permission_full |
||||||
|
WHERE |
||||||
|
per_content = #{parentContent} |
||||||
|
) |
||||||
|
AND p.per_level = 'action' |
||||||
|
</select> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.um.pojo.Permission" id="permissionRm"> |
||||||
|
<result property="id" column="per_code"/> |
||||||
|
<result property="name" column="per_name"/> |
||||||
|
<result property="desc" column="per_desc"/> |
||||||
|
<result property="perParent" column="per_parent"/> |
||||||
|
<result property="perLevel" column="per_level"/> |
||||||
|
<result property="perContent" column="per_content"/> |
||||||
|
<result property="perStatus" column="per_status"/> |
||||||
|
<result property="perOrder" column="per_order"/> |
||||||
|
|
||||||
|
<collection property="children" column="{perParent=per_code}" select="queryPermissionTree" /> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<select id="queryPermissionTree" resultMap="permissionRm"> |
||||||
|
SELECT |
||||||
|
<include refid="baseColumn"/> |
||||||
|
FROM |
||||||
|
um_permission_full |
||||||
|
WHERE |
||||||
|
<if test="perParent != null and perParent != ''"> |
||||||
|
per_parent = #{perParent} |
||||||
|
</if> |
||||||
|
<if test="perParent == null or perParent == ''"> |
||||||
|
per_parent is null |
||||||
|
</if> |
||||||
|
ORDER BY per_order ASC |
||||||
|
</select> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.um.pojo.Permission" id="publicPerRm"> |
||||||
|
<result property="id" column="per_code"/> |
||||||
|
<result property="name" column="per_name"/> |
||||||
|
|
||||||
|
<collection property="children" column="{perParent=per_code}" select="queryPublicPerTree" /> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<select id="queryPublicPerTree" resultMap="publicPerRm"> |
||||||
|
SELECT |
||||||
|
per_code,per_name |
||||||
|
FROM |
||||||
|
um_permission_full |
||||||
|
WHERE |
||||||
|
<if test="perParent != null and perParent != ''"> |
||||||
|
per_parent = #{perParent} |
||||||
|
</if> |
||||||
|
<if test="perParent == null or perParent == ''"> |
||||||
|
per_parent is null |
||||||
|
</if> |
||||||
|
AND per_status != 'H' |
||||||
|
ORDER BY per_order ASC |
||||||
|
</select> |
||||||
|
|
||||||
|
</mapper> |
||||||
@ -0,0 +1,114 @@ |
|||||||
|
<?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.mengyxu.admin.um.mapper.IRolePermissionMapper"> |
||||||
|
|
||||||
|
<sql id="baseColumn"> |
||||||
|
role_code, |
||||||
|
role_name, |
||||||
|
role_desc, |
||||||
|
role_status |
||||||
|
</sql> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.um.pojo.Role" id="baseRM"> |
||||||
|
<result column="role_code" property="code"/> |
||||||
|
<result column="role_name" property="name"/> |
||||||
|
<result column="role_desc" property="desc"/> |
||||||
|
<result column="role_status" property="status"/> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.um.pojo.Role" id="roleRM" extends="baseRM"> |
||||||
|
<collection property="permissions" column="role_code" select="queryPermissions" /> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<sql id="withOutOperater"> |
||||||
|
WHERE role_status != 'H' |
||||||
|
</sql> |
||||||
|
|
||||||
|
<select id="queryAll" resultMap="baseRM"> |
||||||
|
SELECT <include refid="baseColumn"/> FROM um_role_full |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryList" resultMap="roleRM"> |
||||||
|
SELECT <include refid="baseColumn"/> FROM um_role_full <include refid="withOutOperater"/> |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryPermissions" parameterType="java.lang.String" resultType="java.lang.String"> |
||||||
|
SELECT |
||||||
|
DISTINCT per_code |
||||||
|
FROM |
||||||
|
um_role_permission |
||||||
|
WHERE |
||||||
|
role_code = #{roleCode} |
||||||
|
</select> |
||||||
|
|
||||||
|
<insert id="insertOne" parameterType="com.mengyxu.admin.um.pojo.Role" > |
||||||
|
INSERT INTO um_role_full |
||||||
|
(<include refid="baseColumn"/>) |
||||||
|
VALUES |
||||||
|
( |
||||||
|
#{code}, |
||||||
|
#{name}, |
||||||
|
#{desc}, |
||||||
|
#{status} |
||||||
|
) |
||||||
|
</insert> |
||||||
|
|
||||||
|
<insert id="insertBatch" parameterType="java.util.List" > |
||||||
|
INSERT INTO um_role_full |
||||||
|
(<include refid="baseColumn"></include>) |
||||||
|
VALUES |
||||||
|
<foreach collection="list" item="role" separator=","> |
||||||
|
( |
||||||
|
#{role.code}, |
||||||
|
#{role.name}, |
||||||
|
#{role.desc}, |
||||||
|
#{role.status} |
||||||
|
) |
||||||
|
</foreach> |
||||||
|
</insert> |
||||||
|
|
||||||
|
<delete id="delete" parameterType="java.lang.String"> |
||||||
|
DELETE FROM um_role_full WHERE role_code = #{roleCode} |
||||||
|
</delete> |
||||||
|
|
||||||
|
<delete id="deleteRolePer" parameterType="java.lang.String"> |
||||||
|
DELETE FROM um_role_permission WHERE role_code = #{roleCode} |
||||||
|
</delete> |
||||||
|
|
||||||
|
<insert id="insertRolePer" parameterType="com.mengyxu.admin.um.pojo.Role" > |
||||||
|
INSERT INTO um_role_permission |
||||||
|
(role_code, per_code) |
||||||
|
VALUES |
||||||
|
<foreach collection="permissions" item="perCode" separator=","> |
||||||
|
( |
||||||
|
#{code}, |
||||||
|
#{perCode} |
||||||
|
) |
||||||
|
</foreach> |
||||||
|
</insert> |
||||||
|
|
||||||
|
<update id="update" parameterType="com.mengyxu.admin.um.pojo.Role"> |
||||||
|
UPDATE |
||||||
|
um_role_full |
||||||
|
<set> |
||||||
|
<if test="name != null and name != ''"> |
||||||
|
role_name = #{name}, |
||||||
|
</if> |
||||||
|
<if test="desc != null and desc != ''"> |
||||||
|
role_desc = #{desc}, |
||||||
|
</if> |
||||||
|
<if test="status != null and status != ''"> |
||||||
|
role_status = #{status}, |
||||||
|
</if> |
||||||
|
</set> |
||||||
|
WHERE |
||||||
|
role_code = #{code} |
||||||
|
</update> |
||||||
|
|
||||||
|
<select id="queryRoleMaps" resultType="com.mengyxu.core.pojo.com.Entry"> |
||||||
|
SELECT role_code as 'key', role_name as 'value' FROM um_role_full <include refid="withOutOperater"/> |
||||||
|
</select> |
||||||
|
|
||||||
|
</mapper> |
||||||
@ -0,0 +1,146 @@ |
|||||||
|
<?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.mengyxu.admin.um.mapper.IUserMapper"> |
||||||
|
|
||||||
|
<sql id="baseColumn"> |
||||||
|
user_id, |
||||||
|
`key`, |
||||||
|
name, |
||||||
|
phone, |
||||||
|
id_card, |
||||||
|
email, |
||||||
|
last_login, |
||||||
|
status |
||||||
|
</sql> |
||||||
|
|
||||||
|
<resultMap type="com.mengyxu.admin.um.pojo.User" id="userResultMap"> |
||||||
|
<id column="user_id" property="userId" /> |
||||||
|
<result column="id_card" property="idCard" /> |
||||||
|
<result column="last_login" property="lastLogin" /> |
||||||
|
|
||||||
|
<collection property="roles" column="{userId=user_id,flag=flag}" select="queryRoles" /> |
||||||
|
</resultMap> |
||||||
|
|
||||||
|
<select id="findUser" resultMap="userResultMap" parameterType="com.mengyxu.admin.um.pojo.User"> |
||||||
|
SELECT |
||||||
|
u.*, false as flag |
||||||
|
FROM |
||||||
|
um_user u |
||||||
|
<where> |
||||||
|
<if test="userId != null and userId !=''"> |
||||||
|
AND u.user_id = #{userId} |
||||||
|
</if> |
||||||
|
<if test="key != null and key !=''"> |
||||||
|
AND u.key = #{key} |
||||||
|
</if> |
||||||
|
<if test="idCard != null and idCard !=''"> |
||||||
|
AND u.id_card = #{idCard} |
||||||
|
</if> |
||||||
|
<if test="phone != null and phone !=''"> |
||||||
|
AND u.phone = #{phone} |
||||||
|
</if> |
||||||
|
</where> |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryByExample" resultMap="userResultMap" parameterType="com.mengyxu.admin.um.pojo.User"> |
||||||
|
SELECT |
||||||
|
*, true as flag |
||||||
|
FROM |
||||||
|
um_user |
||||||
|
WHERE |
||||||
|
status != 'H' |
||||||
|
<if test="userId != null and userId !=''"> |
||||||
|
AND user_id like CONCAT('%',#{userId},'%') |
||||||
|
</if> |
||||||
|
<if test="name != null and name !=''"> |
||||||
|
AND name like CONCAT('%',#{name},'%') |
||||||
|
</if> |
||||||
|
<if test="idCard != null and idCard !=''"> |
||||||
|
AND id_card like CONCAT('%',#{idCard},'%') |
||||||
|
</if> |
||||||
|
<if test="phone != null and phone !=''"> |
||||||
|
AND phone like CONCAT('%',#{phone},'%') |
||||||
|
</if> |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryRoles" resultType="java.lang.String"> |
||||||
|
SELECT |
||||||
|
DISTINCT a.role_code |
||||||
|
FROM |
||||||
|
um_user_role a |
||||||
|
JOIN um_role_full b |
||||||
|
ON a.role_code = b.role_code |
||||||
|
WHERE |
||||||
|
a.user_id = #{userId} |
||||||
|
<if test="flag"> |
||||||
|
AND b.role_status != 'H' |
||||||
|
</if> |
||||||
|
</select> |
||||||
|
|
||||||
|
<insert id="insert" parameterType="com.mengyxu.admin.um.pojo.User"> |
||||||
|
INSERT INTO um_user |
||||||
|
(<include refid="baseColumn"></include>) |
||||||
|
VALUES |
||||||
|
( |
||||||
|
#{userId}, |
||||||
|
#{key}, |
||||||
|
#{name}, |
||||||
|
#{phone}, |
||||||
|
#{idCard}, |
||||||
|
#{email}, |
||||||
|
#{lastLogin}, |
||||||
|
#{status} |
||||||
|
) |
||||||
|
</insert> |
||||||
|
|
||||||
|
<update id="update" parameterType="com.mengyxu.admin.um.pojo.User"> |
||||||
|
UPDATE um_user |
||||||
|
<set> |
||||||
|
<if test="newKey != null and newKey !=''"> |
||||||
|
`key` = #{newKey}, |
||||||
|
</if> |
||||||
|
<if test="name != null and name !=''"> |
||||||
|
name = #{name}, |
||||||
|
</if> |
||||||
|
<if test="phone != null and phone !=''"> |
||||||
|
phone = #{phone}, |
||||||
|
</if> |
||||||
|
<if test="idCard != null and idCard !=''"> |
||||||
|
id_card = #{idCard}, |
||||||
|
</if> |
||||||
|
<if test="email != null and email !=''"> |
||||||
|
email = #{email}, |
||||||
|
</if> |
||||||
|
<if test="lastLogin != null and lastLogin !=''"> |
||||||
|
last_login = #{lastLogin}, |
||||||
|
</if> |
||||||
|
<if test="status != null and status !=''"> |
||||||
|
status = #{status}, |
||||||
|
</if> |
||||||
|
</set> |
||||||
|
WHERE user_id = #{userId} |
||||||
|
</update> |
||||||
|
|
||||||
|
<delete id="delete" parameterType="java.lang.String"> |
||||||
|
DELETE FROM um_user WHERE user_id = #{userId} |
||||||
|
</delete> |
||||||
|
|
||||||
|
<delete id="deleteUserRole" parameterType="java.lang.String"> |
||||||
|
DELETE FROM um_user_role WHERE user_id = #{userId} |
||||||
|
</delete> |
||||||
|
|
||||||
|
<insert id="insertUserRole" parameterType="com.mengyxu.admin.um.pojo.User" > |
||||||
|
INSERT INTO um_user_role |
||||||
|
(user_id, role_code) |
||||||
|
VALUES |
||||||
|
<foreach collection="roles" item="roleCode" separator=","> |
||||||
|
( |
||||||
|
#{userId}, |
||||||
|
#{roleCode} |
||||||
|
) |
||||||
|
</foreach> |
||||||
|
</insert> |
||||||
|
|
||||||
|
</mapper> |
||||||
@ -0,0 +1,143 @@ |
|||||||
|
-- ---------------------------- |
||||||
|
-- Records of sys_dictionary |
||||||
|
-- ---------------------------- |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'action', '按钮', '控制按钮显示及接口访问权限', 'per_level', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'group', '菜单组', '控制主页菜单组权限', 'per_level', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'view', '页面', '页面', 'per_level', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '0', '登录', '登录', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '1', '退出登录', '退出登录', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '2', '修改密码', '修改密码', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '3', '添加用户', '添加用户', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '4', '修改用户', '修改用户', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '5', '删除用户', '删除用户', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '6', '重置用户密码', '重置用户密码', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'E', '可读写', '可读可写', 'role_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'R', '只读', '只可读不可写', 'role_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'H', '隐藏', '页面隐藏不显示', 'role_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'A', '启用', '启用', 'active_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'I', '禁用', '禁用', 'active_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'H', '专用', '专用', 'active_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '0', '正常', '正常', 'base_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '1', '异常', '异常', 'base_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '0', '初始', '初始', 'user_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'H', '隐藏', '隐藏', 'user_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '1', '是', '是', 'boolean', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '0', '否', '否', 'boolean', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '1', '正常', '正常', 'user_status', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '0', '异常', '异常', 'common_staus', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '1', '正常', '正常', 'common_staus', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '0', '权限日志', '登录、用户角色管理', 'log_module', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '1', '业务日志', '业务日志', 'log_module', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '7', '添加角色', '添加角色', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '8', '修改角色', '修改角色', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, '9', '删除角色', '删除角色', 'log_type', 'A'); |
||||||
|
INSERT INTO `sys_dictionary` VALUES (NULL, 'R', '只读', '只读', 'user_status', 'A'); |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Records of sys_dict_type |
||||||
|
-- ---------------------------- |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('active_status', '启用状态', '启用状态', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('base_status', '通用状态', '通用状态(0正常)', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('boolean', '是否', '是否', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('common_staus', '通用状态', '通用状态(0异常)', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('log_module', '日志模块', '日志模块', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('log_type', '日志类型', '日志类型', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('per_level', '权限级别', '权限级别', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('role_status', '角色状态', '角色状态', 'A'); |
||||||
|
INSERT INTO `sys_dict_type` VALUES ('user_status', '系统用户状态', '系统用户状态', 'A'); |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Records of um_permission_full |
||||||
|
-- ---------------------------- |
||||||
|
INSERT INTO `um_permission_full` VALUES ('admin_dictionary', '数据字典', 'el-icon-collection', 'operater_manage', 'view', 'dictionary', 'A', '2'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('admin_permission', '权限管理', 'el-icon-unlock', 'operater_manage', 'view', 'permission', 'A', '1'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('admin_role', '角色管理', 'el-icon-user', 'system_setting', 'view', 'role', 'A', '3'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('admin_user', '用户管理', 'el-icon-user-solid', 'system_setting', 'view', 'user', 'A', '2'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('dict_delete', '删除字典', '', 'admin_dictionary', 'action', 'admin/dict/delete', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('dict_list', '数据字典查询', '', 'admin_dictionary', 'action', 'admin/dict/list', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('dict_save', '新增字典', '', 'admin_dictionary', 'action', 'admin/dict/save', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('dict_update', '修改字典', '', 'admin_dictionary', 'action', 'admin/dict/update', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('operater_buffer', '缓存管理', 'el-icon-warning', 'operater_manage', 'view', 'buffer', 'A', '3'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('operater_manage', '运维管理', 'el-icon-s-platform', null, 'group', null, 'H', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('operater_status', '状态控制', 'el-icon-setting', 'operater_manage', 'view', 'status', 'A', '4'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('oper_buffer_clean', '清空失效缓存', '', 'operater_buffer', 'action', 'admin/memory/buffer/clean', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('oper_buffer_delay', '修改缓存失效时间', '', 'operater_buffer', 'action', 'admin/memory/buffer/delay', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('oper_buffer_delete', '删除缓存', '', 'operater_buffer', 'action', 'admin/memory/buffer/delete', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('oper_buffer_list', '缓存列表', '', 'operater_buffer', 'action', 'admin/memory/buffer/list', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('per_delete', '删除权限', '', 'admin_permission', 'action', 'admin/per/delete', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('per_list', '权限查询', '', 'admin_permission', 'action', 'admin/per/list', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('per_save', '添加权限', '', 'admin_permission', 'action', 'admin/per/save', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('per_update', '修改权限', '', 'admin_permission', 'action', 'admin/per/update', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('role_delete', '删除角色', '', 'admin_role', 'action', 'admin/role/delete', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('role_list', '角色查询', '', 'admin_role', 'action', 'admin/role/list', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('role_save', '新增角色', '', 'admin_role', 'action', 'admin/role/save', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('role_update', '更新角色及其权限', '', 'admin_role', 'action', 'admin/role/update', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('status_role_list', '角色状态查询', '', 'operater_status', 'action', 'admin/role/list/all', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('status_role_update', '角色状态修改', '', 'operater_status', 'action', 'admin/role/update', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('status_user_list', '用户状态查询', '', 'operater_status', 'action', 'admin/user/list/all', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('status_user_update', '用户状态修改', '', 'operater_status', 'action', 'admin/user/update', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('system_log', '日志查询', null, 'system_setting', 'view', 'system_log', 'A', '4'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('system_log_list', '查询日志列表', null, 'system_log', 'action', 'admin/log/action', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('system_setting', '权限控制', 'el-icon-s-tools', null, 'group', null, 'A', '8'); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('user_delete', '删除用户', '', 'admin_user', 'action', 'admin/user/delete', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('user_list', '用户查询', '', 'admin_user', 'action', 'admin/user/list', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('user_reset', '重置密码', '', 'admin_user', 'action', 'admin/user/reset', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('user_save', '添加用户', '', 'admin_user', 'action', 'admin/user/save', 'A', null); |
||||||
|
INSERT INTO `um_permission_full` VALUES ('user_update', '修改用户', '', 'admin_user', 'action', 'admin/user/update', 'A', null); |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Records of um_role_full |
||||||
|
-- ---------------------------- |
||||||
|
INSERT INTO `um_role_full` VALUES ('admin', '超级管理员', '拥有系统最高权限,默认不可更改', 'R'); |
||||||
|
INSERT INTO `um_role_full` VALUES ('operator', '系统运维', '负责系统维护工作,默认不可更改', 'H'); |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Records of um_role_permission |
||||||
|
-- ---------------------------- |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'admin_role'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'admin_user'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'role_delete'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'role_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'role_save'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'role_update'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'system_log'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'system_log_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'system_setting'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'user_delete'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'user_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'user_reset'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'user_save'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('admin', 'user_update'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'admin_dictionary'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'admin_permission'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'dict_delete'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'dict_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'dict_save'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'dict_update'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'operater_buffer'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'operater_manage'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'operater_status'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'oper_buffer_clean'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'oper_buffer_delay'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'oper_buffer_delete'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'oper_buffer_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'per_delete'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'per_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'per_save'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'per_update'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'status_role_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'status_role_update'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'status_user_list'); |
||||||
|
INSERT INTO `um_role_permission` VALUES ('operator', 'status_user_update'); |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Records of um_user |
||||||
|
-- ---------------------------- |
||||||
|
INSERT INTO `um_user` VALUES ('admin', 'e10adc3949ba59abbe56e057f20f883e', '超级管理员', '13333333333', null, null, '2021-07-09 16:56:10', 'R'); |
||||||
|
INSERT INTO `um_user` VALUES ('operator', 'e10adc3949ba59abbe56e057f20f883e', '运维管理员', '13333333334', null, null, '2021-07-09 16:50:04', 'H'); |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Records of um_user_role |
||||||
|
-- ---------------------------- |
||||||
|
INSERT INTO `um_user_role` VALUES ('admin', 'admin'); |
||||||
|
INSERT INTO `um_user_role` VALUES ('operator', 'operator'); |
||||||
@ -0,0 +1,120 @@ |
|||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for sys_action_log |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `sys_action_log`; |
||||||
|
CREATE TABLE `sys_action_log` ( |
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT, |
||||||
|
`type` varchar(3) NOT NULL, |
||||||
|
`module` varchar(2) NOT NULL, |
||||||
|
`user_id` varchar(20) DEFAULT NULL, |
||||||
|
`login_ip` varchar(20) DEFAULT NULL, |
||||||
|
`time` datetime NOT NULL, |
||||||
|
`context` varchar(200) DEFAULT NULL, |
||||||
|
PRIMARY KEY (`id`) |
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=2687 DEFAULT CHARSET=utf8; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for sys_config |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `sys_config`; |
||||||
|
CREATE TABLE `sys_config` ( |
||||||
|
`cfg_key` varchar(32) NOT NULL COMMENT '配置唯一键', |
||||||
|
`cfg_name` varchar(32) NOT NULL COMMENT '配置名称', |
||||||
|
`cfg_value` varchar(64) NOT NULL COMMENT '配置值', |
||||||
|
`cfg_type` varchar(32) NOT NULL COMMENT '配置类型TEXT,DATA,NUMBER(]', |
||||||
|
`cfg_desc` varchar(128) DEFAULT NULL COMMENT '配置描述', |
||||||
|
`cfg_status` varchar(1) NOT NULL COMMENT '配置状态A:active,I:inactive', |
||||||
|
`update_time` datetime DEFAULT NULL COMMENT '最近一次修改时间', |
||||||
|
`update_user` varchar(32) DEFAULT NULL COMMENT '最近一次修改用户', |
||||||
|
PRIMARY KEY (`cfg_key`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for sys_dictionary |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `sys_dictionary`; |
||||||
|
CREATE TABLE `sys_dictionary` ( |
||||||
|
`dict_id` int(11) NOT NULL AUTO_INCREMENT, |
||||||
|
`dict_code` varchar(32) CHARACTER SET utf8 NOT NULL, |
||||||
|
`dict_name` varchar(32) CHARACTER SET utf8 NOT NULL, |
||||||
|
`dict_desc` varchar(64) CHARACTER SET utf8 DEFAULT NULL, |
||||||
|
`dict_parent` varchar(255) CHARACTER SET utf8 DEFAULT NULL, |
||||||
|
`dict_status` varchar(1) CHARACTER SET utf8 NOT NULL, |
||||||
|
PRIMARY KEY (`dict_id`) |
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=398 DEFAULT CHARSET=ascii; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for sys_dict_type |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `sys_dict_type`; |
||||||
|
CREATE TABLE `sys_dict_type` ( |
||||||
|
`type_code` varchar(32) CHARACTER SET utf8 NOT NULL, |
||||||
|
`type_name` varchar(32) CHARACTER SET utf8 NOT NULL, |
||||||
|
`type_desc` varchar(64) CHARACTER SET utf8 DEFAULT NULL, |
||||||
|
`type_status` varchar(1) CHARACTER SET utf8 NOT NULL, |
||||||
|
PRIMARY KEY (`type_code`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=ascii; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for um_permission_full |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `um_permission_full`; |
||||||
|
CREATE TABLE `um_permission_full` ( |
||||||
|
`per_code` varchar(100) NOT NULL COMMENT '权限编号', |
||||||
|
`per_name` varchar(100) NOT NULL COMMENT '权限名称', |
||||||
|
`per_desc` varchar(100) DEFAULT NULL COMMENT '权限描述', |
||||||
|
`per_parent` varchar(100) DEFAULT NULL COMMENT '父权限', |
||||||
|
`per_level` varchar(10) NOT NULL COMMENT '权限等级', |
||||||
|
`per_content` varchar(100) DEFAULT NULL COMMENT '权限内容', |
||||||
|
`per_status` varchar(1) NOT NULL COMMENT '是否启用', |
||||||
|
`per_order` int(2) DEFAULT NULL, |
||||||
|
PRIMARY KEY (`per_code`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限信息表'; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for um_role_full |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `um_role_full`; |
||||||
|
CREATE TABLE `um_role_full` ( |
||||||
|
`role_code` varchar(50) NOT NULL COMMENT '角色编号', |
||||||
|
`role_name` varchar(20) NOT NULL COMMENT '角色名称', |
||||||
|
`role_desc` varchar(100) NOT NULL COMMENT '角色描述', |
||||||
|
`role_status` varchar(1) NOT NULL, |
||||||
|
PRIMARY KEY (`role_code`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色信息表'; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for um_role_permission |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `um_role_permission`; |
||||||
|
CREATE TABLE `um_role_permission` ( |
||||||
|
`role_code` varchar(50) NOT NULL COMMENT '角色编号', |
||||||
|
`per_code` varchar(100) NOT NULL COMMENT '权限编号', |
||||||
|
PRIMARY KEY (`role_code`,`per_code`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表'; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for um_user |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `um_user`; |
||||||
|
CREATE TABLE `um_user` ( |
||||||
|
`user_id` varchar(32) NOT NULL COMMENT '用户名', |
||||||
|
`key` varchar(64) NOT NULL COMMENT '密码', |
||||||
|
`name` varchar(10) NOT NULL COMMENT '姓名', |
||||||
|
`phone` varchar(11) NOT NULL COMMENT '电话', |
||||||
|
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号码', |
||||||
|
`email` varchar(32) DEFAULT NULL COMMENT '电子邮箱', |
||||||
|
`last_login` datetime DEFAULT NULL COMMENT '上次登陆时间', |
||||||
|
`status` varchar(1) NOT NULL COMMENT '状态', |
||||||
|
PRIMARY KEY (`user_id`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
||||||
|
|
||||||
|
-- ---------------------------- |
||||||
|
-- Table structure for um_user_role |
||||||
|
-- ---------------------------- |
||||||
|
DROP TABLE IF EXISTS `um_user_role`; |
||||||
|
CREATE TABLE `um_user_role` ( |
||||||
|
`user_id` varchar(50) NOT NULL COMMENT '用户编号', |
||||||
|
`role_code` varchar(50) NOT NULL COMMENT '角色编号', |
||||||
|
PRIMARY KEY (`user_id`,`role_code`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户角色表'; |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
[*.{js,jsx,ts,tsx,vue}] |
||||||
|
indent_style = space |
||||||
|
indent_size = 2 |
||||||
|
trim_trailing_whitespace = true |
||||||
|
insert_final_newline = true |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
NODE_ENV="development" |
||||||
|
VUE_APP_BASE_URL="http://localhost" |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
.DS_Store |
||||||
|
node_modules |
||||||
|
/dist |
||||||
|
|
||||||
|
# local env files |
||||||
|
.env.local |
||||||
|
.env.*.local |
||||||
|
|
||||||
|
# Log files |
||||||
|
npm-debug.log* |
||||||
|
yarn-debug.log* |
||||||
|
yarn-error.log* |
||||||
|
pnpm-debug.log* |
||||||
|
|
||||||
|
# Editor directories and files |
||||||
|
.idea |
||||||
|
.vscode |
||||||
|
*.suo |
||||||
|
*.ntvs* |
||||||
|
*.njsproj |
||||||
|
*.sln |
||||||
|
*.sw? |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
# monitor-vue |
||||||
|
|
||||||
|
## Project setup |
||||||
|
``` |
||||||
|
yarn install |
||||||
|
``` |
||||||
|
|
||||||
|
### Compiles and hot-reloads for development |
||||||
|
``` |
||||||
|
yarn serve |
||||||
|
``` |
||||||
|
|
||||||
|
### Compiles and minifies for production |
||||||
|
``` |
||||||
|
yarn build |
||||||
|
``` |
||||||
|
|
||||||
|
### Lints and fixes files |
||||||
|
``` |
||||||
|
yarn lint |
||||||
|
``` |
||||||
|
|
||||||
|
### Customize configuration |
||||||
|
See [Configuration Reference](https://cli.vuejs.org/config/). |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
module.exports = { |
||||||
|
presets: [ |
||||||
|
'@vue/cli-plugin-babel/preset' |
||||||
|
] |
||||||
|
} |
||||||
@ -0,0 +1,70 @@ |
|||||||
|
{ |
||||||
|
"name": "admin-vue", |
||||||
|
"version": "0.0.1", |
||||||
|
"private": true, |
||||||
|
"scripts": { |
||||||
|
"dev": "vue-cli-service serve", |
||||||
|
"build": "vue-cli-service build --mode production", |
||||||
|
"lint": "vue-cli-service lint", |
||||||
|
"preview": "vue-cli-service build --mode preview", |
||||||
|
"test": "vue-cli-service build --mode test" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"core-js": "^3.6.5", |
||||||
|
"element-ui": "^2.15.3", |
||||||
|
"vue": "^2.6.11", |
||||||
|
"vue-class-component": "^7.2.3", |
||||||
|
"vue-property-decorator": "^8.4.2", |
||||||
|
"vue-router": "^3.2.0", |
||||||
|
"vuex": "^3.4.0" |
||||||
|
}, |
||||||
|
"devDependencies": { |
||||||
|
"@babel/core": "^7.10.5", |
||||||
|
"@typescript-eslint/eslint-plugin": "^2.33.0", |
||||||
|
"@typescript-eslint/parser": "^2.33.0", |
||||||
|
"@vue/cli-plugin-babel": "^4.4.0", |
||||||
|
"@vue/cli-plugin-eslint": "^4.4.0", |
||||||
|
"@vue/cli-plugin-router": "^4.4.6", |
||||||
|
"@vue/cli-plugin-typescript": "^4.4.0", |
||||||
|
"@vue/cli-plugin-vuex": "^4.4.6", |
||||||
|
"@vue/cli-service": "^4.4.0", |
||||||
|
"@vue/eslint-config-standard": "^5.1.2", |
||||||
|
"@vue/eslint-config-typescript": "^5.0.2", |
||||||
|
"axios": "^0.19.2", |
||||||
|
"babel-loader": "^8.1.0", |
||||||
|
"cache-loader": "^4.1.0", |
||||||
|
"eslint": "^6.7.2", |
||||||
|
"eslint-plugin-import": "^2.20.2", |
||||||
|
"eslint-plugin-node": "^11.1.0", |
||||||
|
"eslint-plugin-promise": "^4.2.1", |
||||||
|
"eslint-plugin-standard": "^4.0.0", |
||||||
|
"eslint-plugin-vue": "^6.2.2", |
||||||
|
"js-md5": "^0.7.3", |
||||||
|
"node-sass": "^4.14.1", |
||||||
|
"sass-loader": "^9.0.2", |
||||||
|
"typescript": "~3.9.3", |
||||||
|
"vue-cli-plugin-axios": "^0.0.4", |
||||||
|
"vue-cli-plugin-element": "^1.0.1", |
||||||
|
"vue-clipboard2": "^0.3.1", |
||||||
|
"vue-template-compiler": "^2.6.11" |
||||||
|
}, |
||||||
|
"eslintConfig": { |
||||||
|
"root": true, |
||||||
|
"env": { |
||||||
|
"node": true |
||||||
|
}, |
||||||
|
"extends": [ |
||||||
|
"plugin:vue/recommended", |
||||||
|
"@vue/standard", |
||||||
|
"@vue/typescript/recommended" |
||||||
|
], |
||||||
|
"parserOptions": { |
||||||
|
"ecmaVersion": 2020 |
||||||
|
} |
||||||
|
}, |
||||||
|
"browserslist": [ |
||||||
|
"> 1%", |
||||||
|
"last 2 versions", |
||||||
|
"not dead" |
||||||
|
] |
||||||
|
} |
||||||
|
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,17 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
||||||
|
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
||||||
|
<title>LRobust platform</title> |
||||||
|
</head> |
||||||
|
<body style="margin: 0px;"> |
||||||
|
<noscript> |
||||||
|
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
||||||
|
</noscript> |
||||||
|
<div id="app"></div> |
||||||
|
<!-- built files will be auto injected --> |
||||||
|
</body> |
||||||
|
</html> |
||||||
|
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,168 @@ |
|||||||
|
<template> |
||||||
|
<div id="header"> |
||||||
|
<el-row class="info" type="flex" justify="end" align="middle"> |
||||||
|
<el-button class="info-btn" icon="el-icon-user-solid" type="text"> |
||||||
|
{{ $store.state.userInfo.userId }} |
||||||
|
</el-button> |
||||||
|
<el-button class="info-btn" icon="el-icon-setting" type="text" @click="update = true"> |
||||||
|
修改密码 |
||||||
|
</el-button> |
||||||
|
<el-button class="info-btn" icon="el-icon-switch-button" type="text" @click="$store.commit('logout')"> |
||||||
|
注销登录 |
||||||
|
</el-button> |
||||||
|
</el-row> |
||||||
|
<el-row class="menu-row"> |
||||||
|
<el-menu class="el-menu-demo" :default-active="activeGroup" mode="horizontal" background-color="#FFF" text-color="#000" active-text-color="#4669e7"> |
||||||
|
<el-menu-item v-for="item in $store.state.menuGroups" :key="item.id" :index="item.id" @click="clickGroup(item)"> |
||||||
|
{{ item.title }} |
||||||
|
<!-- <i :class="item.desc"></i> --> |
||||||
|
</el-menu-item> |
||||||
|
</el-menu> |
||||||
|
<el-radio-group v-model="active" fill="#edf2f7" text-color="#4669e7"> |
||||||
|
<el-radio-button v-for="item in menus" :label="item.href"> |
||||||
|
{{ item.title }} |
||||||
|
</el-radio-button> |
||||||
|
</el-radio-group> |
||||||
|
</el-row> |
||||||
|
<el-dialog title="修改密码" :visible.sync="update" width="40%" top="15vh" :close-on-click-modal="false" |
||||||
|
@keydown.enter.native="confirm()"> |
||||||
|
<el-form ref="update" :model="user" :rules="rules" label-width="180px"> |
||||||
|
<el-form-item label="旧密码" prop="key"> |
||||||
|
<el-input type="password" v-model="user.key"></el-input> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="新密码" prop="newKey"> |
||||||
|
<el-input type="password" v-model="user.newKey"></el-input> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="重复新密码" prop="reKey"> |
||||||
|
<el-input type="password" v-model="user.reKey" autocomplete="off"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
<div slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="update = false;"> 取 消 </el-button> |
||||||
|
<el-button type="primary" @click="confrim"> 确 定 </el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Watch |
||||||
|
} from 'vue-property-decorator'; |
||||||
|
import md5 from 'js-md5'; |
||||||
|
import { |
||||||
|
password |
||||||
|
} from '@/static/tool/validate.js'; |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class NavHeader extends Vue { |
||||||
|
menus = []; |
||||||
|
active = 'home'; |
||||||
|
activeGroup = 'home'; |
||||||
|
update = false; |
||||||
|
user = {}; |
||||||
|
rules = { |
||||||
|
key: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入密码', |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
newKey: [{ |
||||||
|
validator: password, |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
reKey: [{ |
||||||
|
validator: this.reKey, |
||||||
|
trigger: 'blur' |
||||||
|
}] |
||||||
|
}; |
||||||
|
|
||||||
|
clickGroup(group) { |
||||||
|
this.activeGroup = group.id |
||||||
|
this.menus = group.children |
||||||
|
const children = group.children |
||||||
|
if (children.length == 0) { |
||||||
|
this.active = group.href |
||||||
|
} else { |
||||||
|
this.active = children[0].href |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
clickMenu(id) { |
||||||
|
this.active = id |
||||||
|
} |
||||||
|
|
||||||
|
toHome() { |
||||||
|
this.clickGroup(this.$store.state.menuGroups[0]) |
||||||
|
} |
||||||
|
|
||||||
|
confrim() { |
||||||
|
const that = this |
||||||
|
this.$refs.update.validate((valid) => { |
||||||
|
if (valid) { |
||||||
|
const param = JSON.parse(JSON.stringify(that.user)); |
||||||
|
param.userId = that.$store.state.userInfo.userId; |
||||||
|
param.key = md5(param.key) |
||||||
|
param.newKey = md5(param.newKey) |
||||||
|
delete param.reKey; |
||||||
|
that.$post('um/update/password', param).then(rsp => { |
||||||
|
if (rsp) { |
||||||
|
that.update = false; |
||||||
|
that.user = {}; |
||||||
|
that.$store.commit('logout') |
||||||
|
} |
||||||
|
}); |
||||||
|
} else { |
||||||
|
return false |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
reKey(rule, value, callback) { |
||||||
|
if (!value) { |
||||||
|
callback(new Error('请重复输入新密码')); |
||||||
|
} else if (value != this.user.newKey) { |
||||||
|
callback(new Error('两次输入的新密码不一致')); |
||||||
|
}else{ |
||||||
|
callback(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Watch('active') |
||||||
|
activeChang(n, o) { |
||||||
|
this.$router.push('/' + n) |
||||||
|
} |
||||||
|
|
||||||
|
created() {} |
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素 |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style scoped> |
||||||
|
|
||||||
|
.info { |
||||||
|
background-color: cadetblue; |
||||||
|
height: 50px; |
||||||
|
padding-right: 100px; |
||||||
|
} |
||||||
|
|
||||||
|
.info-btn { |
||||||
|
font-size: 17px; |
||||||
|
color: #2D3748; |
||||||
|
margin-left: 30px !important; |
||||||
|
} |
||||||
|
|
||||||
|
.menu-row { |
||||||
|
background-color: #FFFFFF; |
||||||
|
/* padding-left: 20px; */ |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,250 @@ |
|||||||
|
<template> |
||||||
|
<div id="mamageTemp"> |
||||||
|
<el-container> |
||||||
|
<el-header class="main-head"> |
||||||
|
<el-row type="flex" justify="end"> |
||||||
|
<span v-for="term in terms"> |
||||||
|
<el-date-picker v-if="term.datePicker" v-model="example[term.code]" :value-format="term.valueFormat" :type="term.type" |
||||||
|
:class="term.claze ? term.claze : 'query-medium'" :placeholder="term.desc"></el-date-picker> |
||||||
|
<el-select v-if="term.dict" v-model="example[term.code]" :class="term.claze ? term.claze : 'query-medium'" |
||||||
|
:placeholder="term.desc" :filterable="term.filterable" clearable> |
||||||
|
<el-option v-for="(val, key, i) in $store.state.dict[term.dict]" :key="key" :value="key" :label="val" /> |
||||||
|
</el-select> |
||||||
|
<el-input v-if="!term.datePicker && !term.dict" v-model="example[term.code]" :class="term.claze ? term.claze : 'query-medium'" |
||||||
|
:placeholder="term.desc" clearable /> |
||||||
|
</span> |
||||||
|
<el-button type="primary" icon="el-icon-search" @click="query(1)" v-if="urls.list && $store.state.buttons[urls.list]"> |
||||||
|
查询 </el-button> |
||||||
|
<el-button type="success" icon="el-icon-plus" @click="add()" v-if="urls.save && $store.state.buttons[urls.save]"> |
||||||
|
添加{{name}} </el-button> |
||||||
|
</el-row> |
||||||
|
</el-header> |
||||||
|
<el-main class="app-main"> |
||||||
|
<el-table :data="result.rows" :height="$store.state.sizes.pTableHei" border stripe> |
||||||
|
<el-table-column v-for="prop in props" v-if="!prop.tableHide" :prop="prop.code" :label="prop.name" |
||||||
|
:min-width="prop.width" :width="prop.type ? prop.width : ''" :type="prop.type" :formatter="(row,column,value) => getValue(prop.dict,value)" |
||||||
|
show-overflow-tooltip /> |
||||||
|
<el-table-column v-if="urls.update || urls.del || actions" label="操作" :width="actionWidth" fixed="right"> |
||||||
|
<template slot-scope="scope" v-if="!stateProp || scope.row[stateProp] != 'R'"> |
||||||
|
<el-button v-if="urls.update && $store.state.buttons[urls.update]" size="mini" type="primary" @click="modify(scope.row)"> |
||||||
|
修改 </el-button> |
||||||
|
<el-button v-if="urls.del && $store.state.buttons[urls.del]" size="mini" type="danger" @click="delate(scope.row)"> |
||||||
|
删除 </el-button> |
||||||
|
<el-button v-for="action in actions" v-if="!action.url || $store.state.buttons[action.url]" size="mini" |
||||||
|
:type="action.type" @click="$emit(action.emit,scope.row)">{{action.name}}</el-button> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination :current-page="example.page" :page-sizes="[10, 20, 50, 100]" :page-size="example.size" layout="total, sizes, prev, pager, next, jumper" |
||||||
|
:total="result.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> |
||||||
|
</el-main> |
||||||
|
</el-container> |
||||||
|
|
||||||
|
<el-dialog :title="(flag.add ? '添加':'修改') + name" :visible.sync="flag.modify" :close-on-click-modal="false" |
||||||
|
top="15vh" :width="props.length > 8 ? '60%' : '40%'" @keydown.enter.native="confirm()"> |
||||||
|
<el-form ref="update" class="full-item-form" label-width="180px" :rules="rules" :model="param"> |
||||||
|
<el-row v-if="props.length > 8"> |
||||||
|
<el-col :span="12" v-for="prop in props"> |
||||||
|
<ModifyItem :prop="prop" :flag="flag" :param="param"></ModifyItem> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<el-row v-else> |
||||||
|
<span v-for="prop in props"> |
||||||
|
<ModifyItem :prop="prop" :flag="flag" :param="param"></ModifyItem> |
||||||
|
</span> |
||||||
|
</el-row> |
||||||
|
</el-form> |
||||||
|
<div slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="flag.modify = false"> 取消 </el-button> |
||||||
|
<el-button type="primary" @click="confirm"> 确认 </el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Watch |
||||||
|
} from 'vue-property-decorator'; |
||||||
|
import ModifyItem from './modifyItem.vue'; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
components: { |
||||||
|
ModifyItem |
||||||
|
} |
||||||
|
}) |
||||||
|
export default class MamageTemp extends Vue { |
||||||
|
@Prop({ |
||||||
|
type: String |
||||||
|
}) name; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: Object |
||||||
|
}) urls; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: Array |
||||||
|
}) terms; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: Array |
||||||
|
}) props; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: Array |
||||||
|
}) actions; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: Object |
||||||
|
}) rules; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: String |
||||||
|
}) stateProp; |
||||||
|
|
||||||
|
actionWidth = 30; |
||||||
|
example = { |
||||||
|
page: 1, |
||||||
|
size: 20 |
||||||
|
}; |
||||||
|
result = { |
||||||
|
rows: [], |
||||||
|
total: 0 |
||||||
|
}; |
||||||
|
param = {}; |
||||||
|
flag = { |
||||||
|
add: false, |
||||||
|
modify: false |
||||||
|
}; |
||||||
|
|
||||||
|
handleSizeChange(val) { |
||||||
|
this.example.size = val |
||||||
|
this.query() |
||||||
|
} |
||||||
|
handleCurrentChange(val) { |
||||||
|
this.example.page = val |
||||||
|
this.query() |
||||||
|
} |
||||||
|
query(page) { |
||||||
|
const that = this |
||||||
|
if (page != null) { |
||||||
|
this.example.page = page |
||||||
|
} |
||||||
|
this.$get(that.urls.list, that.example).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.result = response |
||||||
|
} else { |
||||||
|
that.result = { |
||||||
|
rows: [], |
||||||
|
total: 0 |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
add() { |
||||||
|
if (this.$refs.update != null) { |
||||||
|
this.$refs.update.clearValidate() |
||||||
|
} |
||||||
|
this.param = {}; |
||||||
|
this.flag.add = true |
||||||
|
this.flag.modify = true |
||||||
|
} |
||||||
|
modify(row) { |
||||||
|
if (this.$refs.update != null) { |
||||||
|
this.$refs.update.clearValidate() |
||||||
|
} |
||||||
|
this.flag.add = false |
||||||
|
this.param = JSON.parse(JSON.stringify(row)) |
||||||
|
this.flag.modify = true |
||||||
|
} |
||||||
|
|
||||||
|
delate(row) { |
||||||
|
const that = this |
||||||
|
const msg = this.name ? this.name : "记录" |
||||||
|
this.$confirm('确定要删除该' + msg + '吗?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'warning' |
||||||
|
}).then(() => { |
||||||
|
this.$post(that.urls.del, row).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.query() |
||||||
|
that.$emit('change'); |
||||||
|
} |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
that.showMessage('info', '已取消删除') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
confirm() { |
||||||
|
const that = this |
||||||
|
this.$refs.update.validate((valid) => { |
||||||
|
if (valid) { |
||||||
|
const url = that.flag.add ? that.urls.save : that.urls.update; |
||||||
|
that.$post(url, that.param).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.query() |
||||||
|
that.flag.modify = false |
||||||
|
that.$emit('change'); |
||||||
|
} |
||||||
|
}) |
||||||
|
} else { |
||||||
|
return false |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
getValue(dictKey, value) { |
||||||
|
if (!dictKey) { |
||||||
|
return value; |
||||||
|
} |
||||||
|
const dict = this.$store.state.dict[dictKey] |
||||||
|
if (dict == null) { |
||||||
|
return value; |
||||||
|
} |
||||||
|
return dict[value] == null ? value : dict[value] |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
this.query(); |
||||||
|
if (this.urls.update) { |
||||||
|
this.actionWidth += 60; |
||||||
|
} |
||||||
|
if (this.urls.del) { |
||||||
|
this.actionWidth += 60; |
||||||
|
} |
||||||
|
const that = this; |
||||||
|
if (this.actions) { |
||||||
|
this.actions.forEach(i => { |
||||||
|
that.actionWidth += i.width; |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Watch('flag.modify') |
||||||
|
modifyChang(n, o) { |
||||||
|
if(!n){ |
||||||
|
this.param = {}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style scoped> |
||||||
|
#mamageTemp { |
||||||
|
padding: 20px 20px 0px 20px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,62 @@ |
|||||||
|
<template> |
||||||
|
<div id="modifyItem"> |
||||||
|
<!-- <el-form-item :label="prop.name" :prop="prop.code" v-if="!prop.hide && (!prop.addHide || !flag.add)"> --> |
||||||
|
<el-form-item :label="prop.name" :prop="prop.code" |
||||||
|
v-if="!(prop.hide || (flag.add && prop.addHide) || (!flag.add && prop.modifyHide))"> |
||||||
|
<el-select v-if="prop.dict" v-model="param[prop.code]" :disabled="!flag.add && prop.readOnly" filterable |
||||||
|
:placeholder="'请选择'+prop.name" clearable> |
||||||
|
<el-option v-if="prop.dict == 'order'" v-for="index in 99" :key="index" :value="index+''" :label="index" /> |
||||||
|
<el-option v-if="prop.dict != 'order'" v-for="(val, key, i) in $store.state.dict[prop.dict]" :key="key" |
||||||
|
:value="prop.int ? parseInt(key):key+''" :label="val" /> |
||||||
|
</el-select> |
||||||
|
<el-select v-if="prop.state" :multiple="prop.multiple" v-model="param[prop.code]" |
||||||
|
:disabled="!flag.add && prop.readOnly" :placeholder="'请选择'+prop.name" filterable clearable> |
||||||
|
<el-option v-for="item in $store.state[prop.state]" :key="item.key" :value="item.key" :label="item.value" /> |
||||||
|
</el-select> |
||||||
|
<el-autocomplete v-if="prop.autocomplete" v-model="param[prop.code]" :fetch-suggestions="prop.getData" onKeypress="return(event.keyCode != 32)" |
||||||
|
:placeholder="'请输入'+prop.name" clearable> |
||||||
|
<template slot-scope="{ item }"> |
||||||
|
<div>{{ item.value + '--' + item[prop.labelKey] }}</div> |
||||||
|
</template> |
||||||
|
</el-autocomplete> |
||||||
|
<el-input v-if="!prop.dict && !prop.state && !prop.autocomplete" v-model="param[prop.code]" onKeypress="return(event.keyCode != 32)" |
||||||
|
:disabled="!flag.add && prop.readOnly" :placeholder="prop.desc ? prop.desc : '请输入'+prop.name" clearable /> |
||||||
|
</el-form-item> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop |
||||||
|
} from "vue-property-decorator"; |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class ModifyItem extends Vue { |
||||||
|
@Prop({ |
||||||
|
type: Object |
||||||
|
}) prop; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: Object |
||||||
|
}) flag; |
||||||
|
|
||||||
|
@Prop({ |
||||||
|
type: Object |
||||||
|
}) param; |
||||||
|
|
||||||
|
created() {} //生命周期 - 创建完成(可以访问当前this实例) |
||||||
|
mounted() {} //生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} //生命周期 - 创建之前 |
||||||
|
beforeMount() {} //生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} //生命周期 - 更新之前 |
||||||
|
updated() {} //生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} //生命周期 - 销毁之前 |
||||||
|
destroyed() {} //生命周期 - 销毁完成 |
||||||
|
activated() {} //如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style scoped> |
||||||
|
|
||||||
|
</style> |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
import Vue from 'vue' |
||||||
|
import './static/plugins/axios' |
||||||
|
import App from './views/main/App.vue' |
||||||
|
import './static/plugins/element' |
||||||
|
import router from './router' |
||||||
|
import store from './store' |
||||||
|
|
||||||
|
Vue.config.productionTip = false |
||||||
|
|
||||||
|
const vue = new Vue({ |
||||||
|
router, |
||||||
|
store, |
||||||
|
render: h => h(App) |
||||||
|
}).$mount('#app') |
||||||
|
export default vue |
||||||
@ -0,0 +1,61 @@ |
|||||||
|
import Vue from 'vue' |
||||||
|
import VueRouter, { RouteConfig } from 'vue-router' |
||||||
|
|
||||||
|
Vue.use(VueRouter) |
||||||
|
|
||||||
|
const routes: Array<RouteConfig> = [ |
||||||
|
{ |
||||||
|
path: '/', |
||||||
|
redirect: '/home' |
||||||
|
},{ |
||||||
|
path: '/home', |
||||||
|
name: 'home', |
||||||
|
component: () => import('../views/main/home.vue') |
||||||
|
},{ |
||||||
|
path: '/login', |
||||||
|
name: 'Login', |
||||||
|
component: () => import('../views/main/login.vue') |
||||||
|
},{ |
||||||
|
path: '/permission', |
||||||
|
name: 'Premission', |
||||||
|
component: () => import('../views/operator/permission.vue') |
||||||
|
},{ |
||||||
|
path: '/dictionary', |
||||||
|
name: 'Dictionary', |
||||||
|
component: () => import('../views/operator/dictionary.vue') |
||||||
|
},{ |
||||||
|
path: '/buffer', |
||||||
|
name: 'Buffer', |
||||||
|
component: () => import('../views/operator/buffer.vue') |
||||||
|
},{ |
||||||
|
path: '/status', |
||||||
|
name: 'Status', |
||||||
|
component: () => import('../views/operator/status.vue') |
||||||
|
},{ |
||||||
|
path: '/user', |
||||||
|
name: 'User', |
||||||
|
component: () => import('../views/sys/user.vue') |
||||||
|
},{ |
||||||
|
path: '/role', |
||||||
|
name: 'Role', |
||||||
|
component: () => import('../views/sys/role.vue') |
||||||
|
},{ |
||||||
|
path: '/system_log', |
||||||
|
name: 'SystemLog', |
||||||
|
component: () => import('../views/sys/log.vue') |
||||||
|
} |
||||||
|
] |
||||||
|
|
||||||
|
const originalPush = VueRouter.prototype.push |
||||||
|
VueRouter.prototype.push = function push (location) { |
||||||
|
return originalPush.call(this, location).catch(err => err) |
||||||
|
} |
||||||
|
|
||||||
|
const router = new VueRouter({ |
||||||
|
routes |
||||||
|
}) |
||||||
|
|
||||||
|
router.afterEach((to, from) => { |
||||||
|
// ...
|
||||||
|
}) |
||||||
|
export default router |
||||||
@ -0,0 +1,13 @@ |
|||||||
|
import Vue, { VNode } from 'vue' |
||||||
|
|
||||||
|
declare global { |
||||||
|
namespace JSX { |
||||||
|
// tslint:disable no-empty-interface
|
||||||
|
interface Element extends VNode {} |
||||||
|
// tslint:disable no-empty-interface
|
||||||
|
interface ElementClass extends Vue {} |
||||||
|
interface IntrinsicElements { |
||||||
|
[elem: string]: any; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,4 @@ |
|||||||
|
declare module '*.vue' { |
||||||
|
import Vue from 'vue' |
||||||
|
export default Vue |
||||||
|
} |
||||||
@ -0,0 +1,248 @@ |
|||||||
|
/* eslint-disable */ |
||||||
|
import Vue from "vue"; |
||||||
|
import { Message } from "element-ui"; |
||||||
|
import axios from "axios"; |
||||||
|
import store from "@/store"; |
||||||
|
import loading from "./element" |
||||||
|
|
||||||
|
const config = { |
||||||
|
// baseURL: process.env.VUE_APP_BASE_URL || process.env.apiUrl || "",
|
||||||
|
baseURL: process.env.VUE_APP_BASE_URL ? "/api" : "", |
||||||
|
timeout: 60 * 1000, |
||||||
|
withCredentials: true // Check cross-site Access-Control
|
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
const _axios = axios.create(config); |
||||||
|
let curMsg: any; |
||||||
|
|
||||||
|
// Add a request interceptor
|
||||||
|
_axios.interceptors.request.use( |
||||||
|
function(config) { |
||||||
|
const time = new Date().getTime().toString(); |
||||||
|
if(config.params){ |
||||||
|
delEmpty(config.params); |
||||||
|
config.params.t = time; |
||||||
|
} |
||||||
|
if (config.data) { |
||||||
|
delEmpty(config.params); |
||||||
|
config.data.t = time; |
||||||
|
} |
||||||
|
return config; |
||||||
|
}, |
||||||
|
function(error) { |
||||||
|
return Promise.reject(error); |
||||||
|
} |
||||||
|
); |
||||||
|
|
||||||
|
function delEmpty(data){ |
||||||
|
if(data){ |
||||||
|
for (const item in data) { |
||||||
|
if (data.hasOwnProperty(item)) { |
||||||
|
const val = data[item]; |
||||||
|
if ((val == null || val == "null" || val == "") && val !== 0) { |
||||||
|
delete data[item]; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Add a response interceptor
|
||||||
|
_axios.interceptors.response.use( |
||||||
|
function(response) { |
||||||
|
if (!response.data.message) { |
||||||
|
return { success: true, data: response.data }; |
||||||
|
} |
||||||
|
return response.data; |
||||||
|
}, |
||||||
|
function(error) { |
||||||
|
return Promise.reject(error); |
||||||
|
} |
||||||
|
); |
||||||
|
|
||||||
|
function post(url, data = {}, noMsg, noLoading) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
if(!noLoading){ |
||||||
|
loading.start(); |
||||||
|
} |
||||||
|
_axios.post(url, data).then( |
||||||
|
(response: any) => { |
||||||
|
if(!noLoading){ |
||||||
|
loading.stop(); |
||||||
|
} |
||||||
|
if (response.success) { |
||||||
|
if (response.message) { |
||||||
|
showMessage("success", response.message, false, noMsg); |
||||||
|
resolve(true); |
||||||
|
} else { |
||||||
|
resolve(response.data); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (response.message == "session timeout") { |
||||||
|
store.commit("loginOut"); |
||||||
|
} |
||||||
|
if (response.message == "no permission") { |
||||||
|
response.message = "您暂无权访问,请联系管理员添加"; |
||||||
|
} |
||||||
|
if (response.message.indexOf("no permission for ") == 0) { |
||||||
|
response.message = "此权限尚未开放,请勿越权访问"; |
||||||
|
} |
||||||
|
showMessage("error", response.message, false, noMsg); |
||||||
|
if (response.error != null) { |
||||||
|
console.log(response.error); |
||||||
|
} |
||||||
|
resolve(response.data); |
||||||
|
} |
||||||
|
}, |
||||||
|
err => { |
||||||
|
if(!noLoading){ |
||||||
|
loading.stop(); |
||||||
|
} |
||||||
|
showMessage("error", "后台连接失败,网络异常!", false, noMsg); |
||||||
|
reject(err); |
||||||
|
} |
||||||
|
); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function get(url, data = {}, noMsg, noLoading) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
if(!noLoading){ |
||||||
|
loading.start(); |
||||||
|
} |
||||||
|
_axios.get(url, {params:data}).then( |
||||||
|
(response: any) => { |
||||||
|
if(!noLoading){ |
||||||
|
loading.stop(); |
||||||
|
} |
||||||
|
if (response.success) { |
||||||
|
if (response.message) { |
||||||
|
showMessage("success", response.message, false, noMsg); |
||||||
|
resolve(true); |
||||||
|
} else { |
||||||
|
resolve(response.data); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (response.message == "session timeout") { |
||||||
|
store.commit("loginOut"); |
||||||
|
} |
||||||
|
if (response.message == "no permission") { |
||||||
|
response.message = "您暂无权访问,请联系管理员添加"; |
||||||
|
} |
||||||
|
if (response.message.indexOf("no permission for ") == 0) { |
||||||
|
response.message = "此权限尚未开放,请勿越权访问"; |
||||||
|
} |
||||||
|
showMessage("error", response.message, false, noMsg); |
||||||
|
console.log(response.error); |
||||||
|
resolve(false); |
||||||
|
} |
||||||
|
}, |
||||||
|
err => { |
||||||
|
if(!noLoading){ |
||||||
|
loading.stop(); |
||||||
|
} |
||||||
|
showMessage("error", "后台连接失败,网络异常!", false, noMsg); |
||||||
|
reject(err); |
||||||
|
} |
||||||
|
); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function download(fileName, url, data = {}, callBack) { |
||||||
|
loading.start(); |
||||||
|
_axios({ |
||||||
|
method: "post", |
||||||
|
url: url, // 请求地址
|
||||||
|
data: data, // 参数
|
||||||
|
responseType: "blob" // 表明返回服务器返回的数据类型
|
||||||
|
}).then( |
||||||
|
response => { |
||||||
|
loading.stop(); |
||||||
|
const data = response.data; |
||||||
|
const reader = new FileReader() as any; |
||||||
|
reader.readAsText(data); |
||||||
|
reader.onload = function() { |
||||||
|
try { |
||||||
|
const result = JSON.parse(reader.result); |
||||||
|
if (typeof result === "object") { |
||||||
|
showMessage("error", result.message, false, false); |
||||||
|
if (callBack != null) { |
||||||
|
callBack(false); |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
} catch (err) {} |
||||||
|
const blob = new Blob([data], { |
||||||
|
type: "application/vnd.ms-excel" |
||||||
|
}); |
||||||
|
if (window.navigator.msSaveOrOpenBlob) { |
||||||
|
navigator.msSaveBlob(blob, fileName); |
||||||
|
} else { |
||||||
|
const link = document.createElement("a"); |
||||||
|
link.href = window.URL.createObjectURL(blob); |
||||||
|
link.download = fileName; |
||||||
|
link.click(); |
||||||
|
window.URL.revokeObjectURL(link.href); |
||||||
|
} |
||||||
|
if (callBack != null) { |
||||||
|
callBack(true); |
||||||
|
} |
||||||
|
}; |
||||||
|
}, |
||||||
|
err => { |
||||||
|
loading.stop(); |
||||||
|
showMessage("error", "下载失败,网络异常!", false, false); |
||||||
|
if (callBack != null) { |
||||||
|
callBack(false); |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
function showMessage(type, info, unClose, noMsg) { |
||||||
|
const vue = Vue as any; |
||||||
|
if (noMsg) { |
||||||
|
return; |
||||||
|
} |
||||||
|
if (curMsg != null) { |
||||||
|
curMsg.close(); |
||||||
|
} |
||||||
|
const tmp = Message({ |
||||||
|
type: type, |
||||||
|
showClose: true, |
||||||
|
message: info, |
||||||
|
duration: 3000 |
||||||
|
}); |
||||||
|
if (!unClose) { |
||||||
|
curMsg = tmp; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function showNotify(type, title, message, position) { |
||||||
|
const vue = Vue as any; |
||||||
|
if (position == null) { |
||||||
|
position = "top-right"; |
||||||
|
} |
||||||
|
vue.$notify({ |
||||||
|
title: title, |
||||||
|
type: type, |
||||||
|
message: message, |
||||||
|
position: position, |
||||||
|
duration: 0 |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
Vue.prototype.$post = post; |
||||||
|
Vue.prototype.$get = get; |
||||||
|
Vue.prototype.$download = download; |
||||||
|
Vue.prototype.$showMessage = showMessage; |
||||||
|
Vue.prototype.$showNotify = showNotify; |
||||||
|
|
||||||
|
export default { |
||||||
|
post, |
||||||
|
get, |
||||||
|
download, |
||||||
|
showMessage, |
||||||
|
showNotify |
||||||
|
} |
||||||
@ -0,0 +1,47 @@ |
|||||||
|
import Vue from 'vue' |
||||||
|
import Element from 'element-ui' |
||||||
|
import 'element-ui/lib/theme-chalk/index.css' |
||||||
|
|
||||||
|
let count = 0 |
||||||
|
let ld = null |
||||||
|
|
||||||
|
const start = () => { |
||||||
|
if (count === 0) { |
||||||
|
ld = Element.Loading.service({ |
||||||
|
lock: true, |
||||||
|
text: 'Loading', |
||||||
|
spinner: 'el-icon-loading', |
||||||
|
background: 'rgba(0, 0, 0, 0.3)' |
||||||
|
}) |
||||||
|
} |
||||||
|
count++ |
||||||
|
} |
||||||
|
|
||||||
|
const stop = () => { |
||||||
|
if (count <= 0) { |
||||||
|
return |
||||||
|
} |
||||||
|
count-- |
||||||
|
if (count === 0) { |
||||||
|
ld.close() |
||||||
|
} |
||||||
|
} |
||||||
|
Vue.prototype.$start = start |
||||||
|
Vue.prototype.$stop = stop |
||||||
|
Vue.use(Element) |
||||||
|
|
||||||
|
const icons = [ |
||||||
|
'el-icon-s-platform', 'el-icon-user-solid', 'el-icon-user', 'el-icon-unlock', 'el-icon-notebook-2', 'el-icon-school', |
||||||
|
'el-icon-check', 'el-icon-video-play', 'el-icon-s-tools', 'el-icon-setting', 'el-icon-message-solid', 'el-icon-bell', |
||||||
|
'el-icon-mobile-phone', 'el-icon-map-location', 'el-icon-location', 'el-icon-document', 'el-icon-s-check', 'el-icon-data-analysis', |
||||||
|
'el-icon-view', 'el-icon-s-home', 'el-icon-office-building', 'el-icon-picture', 'el-icon-odometer', 'el-icon-s-data', |
||||||
|
'el-icon-tickets', 'el-icon-delete-solid', 'el-icon-phone-outline', 'el-icon-phone', 'el-icon-star-on', 'el-icon-star-off', |
||||||
|
'el-icon-warning', 'el-icon-upload', 'el-icon-download', 'el-icon-s-custom', 'el-icon-house', 'el-icon-message', 'el-icon-thumb', |
||||||
|
'el-icon-search', 'el-icon-collection', 'el-icon-s-promotion', 'el-icon-refresh' |
||||||
|
] |
||||||
|
|
||||||
|
export default { |
||||||
|
start, |
||||||
|
stop, |
||||||
|
icons |
||||||
|
} |
||||||
@ -0,0 +1,75 @@ |
|||||||
|
const weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']; |
||||||
|
|
||||||
|
const formatterDateTime = function(date, type) { |
||||||
|
if (date == null) { |
||||||
|
date = new Date() |
||||||
|
} |
||||||
|
const month = date.getMonth() < 9 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1; |
||||||
|
const day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); |
||||||
|
const hour = date.getHours() < 10 ? '0' + date.getHours() : date.getHours(); |
||||||
|
const minute = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(); |
||||||
|
const second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); |
||||||
|
switch (type) { |
||||||
|
case 0: |
||||||
|
return date.getFullYear() + '年' + month + '月' + day + '日' + hour + '时' + minute + '分' + second + '秒'; |
||||||
|
default: |
||||||
|
return date.getFullYear() + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const formatterDate = function(date, type) { |
||||||
|
if (date == null) { |
||||||
|
date = new Date() |
||||||
|
} |
||||||
|
const month = date.getMonth() < 9 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1; |
||||||
|
const day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); |
||||||
|
switch (type) { |
||||||
|
case 0: |
||||||
|
return date.getFullYear() + '年' + month + '月' + day + '日'; |
||||||
|
default: |
||||||
|
return date.getFullYear() + '-' + month + '-' + day; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const formatterTime = function(date, type) { |
||||||
|
if (date == null) { |
||||||
|
date = new Date() |
||||||
|
} |
||||||
|
const hour = date.getHours() < 10 ? '0' + date.getHours() : date.getHours(); |
||||||
|
const minute = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(); |
||||||
|
const second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); |
||||||
|
const month = date.getMonth() < 9 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1; |
||||||
|
switch (type) { |
||||||
|
case 0: |
||||||
|
return hour + '时' + minute + '分' + second + '秒'; |
||||||
|
default: |
||||||
|
return hour + ':' + minute + ':' + second; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const formatterMonth = function(date, type) { |
||||||
|
if (date == null) { |
||||||
|
date = new Date() |
||||||
|
} |
||||||
|
const month = date.getMonth() < 9 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1; |
||||||
|
switch (type) { |
||||||
|
case 0: |
||||||
|
return date.getFullYear() + '年' + month + '月'; |
||||||
|
default: |
||||||
|
return date.getFullYear() + '-' + month; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const formatterWeekDay = function(date, type) { |
||||||
|
if (date == null) { |
||||||
|
date = new Date() |
||||||
|
} |
||||||
|
return weeks[date.getDay()] |
||||||
|
} |
||||||
|
export { |
||||||
|
formatterDateTime, |
||||||
|
formatterDate, |
||||||
|
formatterTime, |
||||||
|
formatterMonth, |
||||||
|
formatterWeekDay |
||||||
|
} |
||||||
@ -0,0 +1,222 @@ |
|||||||
|
function password(rule, value, callback) { |
||||||
|
if (value == null || value === '') { |
||||||
|
callback(new Error('请输入密码')) |
||||||
|
} else if (value.length < 8 || value.length > 16) { |
||||||
|
callback(new Error('密码长度为:8~16位')) |
||||||
|
} else if (!new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$').test(value)) { |
||||||
|
callback(new Error('密码至少包含大小写字母、数字和特殊字符')) |
||||||
|
} else if (!new RegExp('.*[^A-Za-z0-9]+.*').test(value)) { |
||||||
|
callback(new Error('密码至少包含大小写字母、数字和特殊字符')) |
||||||
|
} else if (!new RegExp('^[^ ]+$').test(value)) { |
||||||
|
callback(new Error('密码不能包含空格')) |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function code(rule, value, callback) { |
||||||
|
if (value == null || value == '') { |
||||||
|
callback(new Error('验证码不能为空')) |
||||||
|
} else if (!new RegExp('^[0-9]+$').test(value)) { |
||||||
|
callback(new Error('验证码只能为数字')) |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function email(rule, value, callback) { |
||||||
|
if (value != null && value.length != 0) { |
||||||
|
if ( |
||||||
|
!new RegExp( |
||||||
|
/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/ |
||||||
|
).test(value) |
||||||
|
) { |
||||||
|
callback(new Error('请输入正确的电子邮箱')) |
||||||
|
} |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function phone(rule, value, callback) { |
||||||
|
if (value != null && value.length != 0) { |
||||||
|
if ( |
||||||
|
!new RegExp( |
||||||
|
'^(0|86|17951)?(13[0-9]|15[012356789]|17[0135678]|18[0-9]|14[57])[0-9]{8}$' |
||||||
|
).test(value) |
||||||
|
) { |
||||||
|
callback(new Error('请输入正确的手机号码')) |
||||||
|
} |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function imsi(rule, value, callback) { |
||||||
|
// if(value != null && value.length != 0){
|
||||||
|
// }
|
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function userName(rule, value, callback) { |
||||||
|
if (value != null && value.length != 0) { |
||||||
|
if (!new RegExp('^[a-zA-Z0-9]{5,16}$').test(value)) { |
||||||
|
callback(new Error('用户名由字母,数字组成,长度5-16之间')) |
||||||
|
} |
||||||
|
if (/(^\_)|(\__)|(\_+$)/.test(value)) { |
||||||
|
callback(new Error("用户名首尾不能出现下划线'_'")) |
||||||
|
} |
||||||
|
if (!new RegExp('^[^ ]+$').test(value)) { |
||||||
|
callback(new Error('用户名不能包含空格')) |
||||||
|
} |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function name(rule, value, callback) { |
||||||
|
if (value) { |
||||||
|
if (!new RegExp('^[a-zA-Z\u4e00-\u9fa5]{1,10}$').test(value)) { |
||||||
|
callback(new Error('姓名由汉字或字母组成,且长度不超过10')) |
||||||
|
} |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function idCard(rule, value, callback) { |
||||||
|
if (value != null && value.length != 0) { |
||||||
|
let iSum = 0 |
||||||
|
const aCity = { |
||||||
|
11: '北京', |
||||||
|
12: '天津', |
||||||
|
13: '河北', |
||||||
|
14: '山西', |
||||||
|
15: '内蒙古', |
||||||
|
21: '辽宁', |
||||||
|
22: '吉林', |
||||||
|
23: '黑龙江', |
||||||
|
31: '上海', |
||||||
|
32: '江苏', |
||||||
|
33: '浙江', |
||||||
|
34: '安徽', |
||||||
|
35: '福建', |
||||||
|
36: '江西', |
||||||
|
37: '山东', |
||||||
|
41: '河南', |
||||||
|
42: '湖北', |
||||||
|
43: '湖南', |
||||||
|
44: '广东', |
||||||
|
45: '广西', |
||||||
|
46: '海南', |
||||||
|
50: '重庆', |
||||||
|
51: '四川', |
||||||
|
52: '贵州', |
||||||
|
53: '云南', |
||||||
|
54: '西藏', |
||||||
|
61: '陕西', |
||||||
|
62: '甘肃', |
||||||
|
63: '青海', |
||||||
|
64: '宁夏', |
||||||
|
65: '新疆', |
||||||
|
71: '台湾', |
||||||
|
81: '香港', |
||||||
|
82: '澳门', |
||||||
|
91: '国外' |
||||||
|
} |
||||||
|
if (!/^\d{17}(\d|x)$/i.test(value)) { |
||||||
|
callback(new Error('你输入的身份证长度或格式错误')) |
||||||
|
} |
||||||
|
value = value.replace(/x$/i, 'a') |
||||||
|
if (aCity[parseInt(value.substr(0, 2))] == null) { |
||||||
|
callback(new Error('你的身份证地区非法')) |
||||||
|
} |
||||||
|
|
||||||
|
const sBirthday = value.substr(6, 4) + '-' + Number(value.substr(10, 2)) + '-' + Number(value.substr(12, 2)) |
||||||
|
const d = new Date(sBirthday.replace(/-/g, '/')) |
||||||
|
if ( |
||||||
|
sBirthday != |
||||||
|
d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() |
||||||
|
) { |
||||||
|
callback(new Error('身份证上的出生日期非法')) |
||||||
|
} |
||||||
|
for (let i = 17; i >= 0; i--) { |
||||||
|
iSum += (Math.pow(2, i) % 11) * parseInt(value.charAt(17 - i), 11) |
||||||
|
} |
||||||
|
if (iSum % 11 != 1) { |
||||||
|
callback(new Error('你输入的身份证号非法')) |
||||||
|
} |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function ipv4(rule, value, callback) { |
||||||
|
if (value != null && value.length != 0) { |
||||||
|
if ( |
||||||
|
!new RegExp(/^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/).test( |
||||||
|
value |
||||||
|
) |
||||||
|
) { |
||||||
|
callback(new Error('错误的IPV4地址格式')) |
||||||
|
} |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function lon(rule, value, callback) { |
||||||
|
if ( |
||||||
|
!new RegExp( |
||||||
|
/^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/ |
||||||
|
).test(value) |
||||||
|
) { |
||||||
|
callback(new Error('请输入正确的经度')) |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function lat(rule, value, callback) { |
||||||
|
if ( |
||||||
|
!new RegExp( |
||||||
|
/^-?((0|[1-8]?[0-9]?)(([.][0-9]{1,6})?)|90(([.][0]{1,6})?))$/ |
||||||
|
).test(value) |
||||||
|
) { |
||||||
|
callback(new Error('请输入正确的纬度')) |
||||||
|
} |
||||||
|
callback() |
||||||
|
} |
||||||
|
|
||||||
|
function number(rule, value, callback) { |
||||||
|
if (value) { |
||||||
|
const min = rule.min; |
||||||
|
const max = rule.max; |
||||||
|
let msg = ''; |
||||||
|
if (min != null && max != null) { |
||||||
|
msg = 'from ' + min + ' to ' + max; |
||||||
|
} else if (min != null && max == null) { |
||||||
|
msg = 'more than or equal to' + min; |
||||||
|
} else if (min == null && max != null) { |
||||||
|
msg = 'less than or equal to' + max + '的'; |
||||||
|
} |
||||||
|
const error = new Error('Please enter an integer ' + msg); |
||||||
|
const num = parseInt(value); |
||||||
|
if (isNaN(num)) { |
||||||
|
callback(error); |
||||||
|
} |
||||||
|
if (min !== null && num < min) { |
||||||
|
callback(error); |
||||||
|
} |
||||||
|
if (max !== null && num > max) { |
||||||
|
callback(error); |
||||||
|
} |
||||||
|
} |
||||||
|
callback(); |
||||||
|
} |
||||||
|
|
||||||
|
export { |
||||||
|
password, |
||||||
|
code, |
||||||
|
email, |
||||||
|
phone, |
||||||
|
imsi, |
||||||
|
userName, |
||||||
|
name, |
||||||
|
idCard, |
||||||
|
ipv4, |
||||||
|
lon, |
||||||
|
lat, |
||||||
|
number |
||||||
|
} |
||||||
@ -0,0 +1,13 @@ |
|||||||
|
export default { |
||||||
|
|
||||||
|
init(context) { |
||||||
|
context.commit('queryMenus'); |
||||||
|
context.commit('getUserInfo'); |
||||||
|
context.commit('updateState', { |
||||||
|
prop: 'showHeader', |
||||||
|
value: true |
||||||
|
}) |
||||||
|
context.commit('initSizes') |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
import Vue from 'vue' |
||||||
|
import Vuex from 'vuex' |
||||||
|
import state from './state' |
||||||
|
import mutations from './mutations.js' |
||||||
|
import actions from './actions.js' |
||||||
|
import modules from './modules.js' |
||||||
|
|
||||||
|
Vue.use(Vuex) |
||||||
|
|
||||||
|
export default new Vuex.Store({ |
||||||
|
state, |
||||||
|
mutations, |
||||||
|
actions, |
||||||
|
modules |
||||||
|
}) |
||||||
@ -0,0 +1,155 @@ |
|||||||
|
import http from '../static/plugins/axios' |
||||||
|
import vue from '../main' |
||||||
|
import Vue from 'vue' |
||||||
|
|
||||||
|
let interval = null |
||||||
|
|
||||||
|
function stop() { |
||||||
|
if (interval == null) { |
||||||
|
return |
||||||
|
} |
||||||
|
clearInterval(interval) |
||||||
|
interval = null |
||||||
|
} |
||||||
|
|
||||||
|
function start() { |
||||||
|
stop() |
||||||
|
interval = setInterval(() => { |
||||||
|
http.get('um/user/info', null, true, true).then(rsp => { |
||||||
|
if (!rsp) { |
||||||
|
stop() |
||||||
|
vue.$router.push('/login') |
||||||
|
} |
||||||
|
}) |
||||||
|
}, 5000) |
||||||
|
} |
||||||
|
|
||||||
|
export default { |
||||||
|
updateState(state, param) { |
||||||
|
state[param.prop] = param.value; |
||||||
|
}, |
||||||
|
|
||||||
|
initSizes(state) { |
||||||
|
const height = window.innerHeight; |
||||||
|
const width = window.innerWidth; |
||||||
|
const loginHeight = 350; |
||||||
|
const loginWidth = 450; |
||||||
|
const navHead = state.showHeader ? 150 : 0; |
||||||
|
const head = 60; |
||||||
|
const pd = 40; |
||||||
|
const page = 37; |
||||||
|
Vue.set(state.sizes, 'fullHeight', height + 'px'); |
||||||
|
Vue.set(state.sizes, 'loginHeight', loginHeight + 'px'); |
||||||
|
Vue.set(state.sizes, 'loginWidth', loginWidth + 'px'); |
||||||
|
Vue.set(state.sizes, 'loginTop', (height - loginHeight) * 0.4 + 'px'); |
||||||
|
Vue.set(state.sizes, 'loginLeft', (width - loginWidth) * 0.49 + 'px'); |
||||||
|
Vue.set(state.sizes, 'headHeight', navHead + 'px'); |
||||||
|
Vue.set(state.sizes, 'mainHeight', height - navHead + 'px'); |
||||||
|
Vue.set(state.sizes, 'tableHei', height - navHead - head - pd); |
||||||
|
Vue.set(state.sizes, 'pTableHei', state.sizes.tableHei - page); |
||||||
|
}, |
||||||
|
|
||||||
|
getUserInfo(state) { |
||||||
|
http.get('um/user/info').then(response => { |
||||||
|
if (response) { |
||||||
|
state.userInfo = response |
||||||
|
start() |
||||||
|
} else { |
||||||
|
vue.$router.push('/login') |
||||||
|
} |
||||||
|
}) |
||||||
|
.catch(() => { |
||||||
|
vue.$router.push('/login') |
||||||
|
}) |
||||||
|
}, |
||||||
|
|
||||||
|
queryMenus(state) { |
||||||
|
const tmp = [{ |
||||||
|
title: '主页', |
||||||
|
id: 'home', |
||||||
|
href: 'home', |
||||||
|
children: [] |
||||||
|
}]; |
||||||
|
http.get('um/menu/tree').then(response => { |
||||||
|
if (response) { |
||||||
|
state.menuGroups = tmp.concat(response); |
||||||
|
} else { |
||||||
|
state.menuGroups = tmp; |
||||||
|
} |
||||||
|
}).catch(() => { |
||||||
|
state.menuGroups = tmp; |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
queryRoleMap(state, refresh) { |
||||||
|
if (!refresh && state.roles != null) { |
||||||
|
return |
||||||
|
} |
||||||
|
http.get('public/role/map').then(function(response) { |
||||||
|
response = response == null ? [] : response; |
||||||
|
Vue.set(state, 'roles', response) |
||||||
|
}) |
||||||
|
}, |
||||||
|
|
||||||
|
getDictMap(state, codes, callBack) { |
||||||
|
if (codes == null) { |
||||||
|
return |
||||||
|
} |
||||||
|
const arr = [] |
||||||
|
for (let i = 0; i < codes.length; i++) { |
||||||
|
if (Object.keys(state.dict).indexOf(codes[i]) == -1) { |
||||||
|
arr.push(codes[i]) |
||||||
|
} |
||||||
|
} |
||||||
|
if (arr.length == 0) { |
||||||
|
return |
||||||
|
} |
||||||
|
http.post('public/get/dict', arr).then(function(response) { |
||||||
|
if (response) { |
||||||
|
for (let i = 0; i < arr.length; i++) { |
||||||
|
const key = arr[i] |
||||||
|
state.dict[key] = {} |
||||||
|
const dicts = response[key] |
||||||
|
if (dicts == null) { |
||||||
|
continue |
||||||
|
} |
||||||
|
for (let j = 0; j < dicts.length; j++) { |
||||||
|
const tmp = dicts[j] |
||||||
|
const num = parseInt(tmp.code) |
||||||
|
if (!isNaN(num)) { |
||||||
|
state.dict[key][num] = tmp.name |
||||||
|
} else { |
||||||
|
state.dict[key][tmp.code] = tmp.name |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (callBack != null) { |
||||||
|
callBack() |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
|
||||||
|
logout(state) { |
||||||
|
http.get('um/login/out').then(response => { |
||||||
|
if (response) { |
||||||
|
vue.$router.push('/login') |
||||||
|
state.userInfo = {} |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
|
||||||
|
getActionPers(state, content) { |
||||||
|
http.get('public/my/action/per', { |
||||||
|
content: content |
||||||
|
}).then(function(response) { |
||||||
|
if (response) { |
||||||
|
state.buttons = {} |
||||||
|
for (let i = 0; i < response.length; i++) { |
||||||
|
state.buttons[response[i]] = true |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
export default { |
||||||
|
sizes: {}, |
||||||
|
userInfo: {}, |
||||||
|
showHeader: true, |
||||||
|
menuGroups: [], |
||||||
|
buttons: {}, |
||||||
|
dict: {}, |
||||||
|
roles: null |
||||||
|
} |
||||||
@ -0,0 +1,175 @@ |
|||||||
|
<template> |
||||||
|
<div id="app"> |
||||||
|
<el-container :style="{ height: $store.state.sizes.height }"> |
||||||
|
<el-header v-show="$store.state.showHeader" class="app-head" :height="$store.state.sizes.headHeight"> |
||||||
|
<NavHeader ref="header" /> |
||||||
|
</el-header> |
||||||
|
<el-main class="app-main" :style="{ height: $store.state.sizes.mainHeight }"> |
||||||
|
<router-view @init="init" @clickMenu="clickMenu" /> |
||||||
|
</el-main> |
||||||
|
</el-container> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Vue, |
||||||
|
Watch |
||||||
|
} from 'vue-property-decorator' |
||||||
|
import NavHeader from '@/components/main/NavHeader' |
||||||
|
|
||||||
|
@Component({ |
||||||
|
components: { |
||||||
|
NavHeader |
||||||
|
} |
||||||
|
}) |
||||||
|
export default class App extends Vue { |
||||||
|
initSize() { |
||||||
|
this.$store.commit('initSizes') |
||||||
|
} |
||||||
|
|
||||||
|
init() { |
||||||
|
this.$store.dispatch('init'); |
||||||
|
this.$router.push('/home') |
||||||
|
if (this.$refs.header) { |
||||||
|
this.$refs.header.toHome() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
clickMenu(groupId, menuId) { |
||||||
|
const arr = this.$store.state.menuGroups; |
||||||
|
for (let i = 0; i < arr.length; i++) { |
||||||
|
const tmp = arr[i]; |
||||||
|
if (groupId == tmp.id) { |
||||||
|
this.$refs.header.clickGroup(tmp); |
||||||
|
this.$refs.header.clickMenu(menuId); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
this.init() |
||||||
|
this.initSize() |
||||||
|
window.onresize = this.initSize; |
||||||
|
} |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style> |
||||||
|
#app { |
||||||
|
background-color: #edf2f7; |
||||||
|
} |
||||||
|
|
||||||
|
.app-head { |
||||||
|
padding: 0px !important; |
||||||
|
} |
||||||
|
|
||||||
|
.app-main { |
||||||
|
/* background-color: #ffffff; */ |
||||||
|
padding: 0px 20px !important; |
||||||
|
} |
||||||
|
|
||||||
|
/* .el-main{ |
||||||
|
padding-top: 0px !important; |
||||||
|
} */ |
||||||
|
.main-head { |
||||||
|
padding-top: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-mini { |
||||||
|
width: 100px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-smart { |
||||||
|
width: 120px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-short { |
||||||
|
width: 150px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-medium { |
||||||
|
width: 200px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-long { |
||||||
|
width: 250px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-tree { |
||||||
|
width: 300px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-longest { |
||||||
|
width: 350px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-400 { |
||||||
|
width: 400px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-450 { |
||||||
|
width: 450px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.query-500 { |
||||||
|
width: 500px !important; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.modify-dialog .el-dialog { |
||||||
|
background-color: #edf2f7; |
||||||
|
} |
||||||
|
|
||||||
|
.form-title { |
||||||
|
font-size: 18px; |
||||||
|
background-color: cadetblue; |
||||||
|
padding: 10px; |
||||||
|
height: 25px; |
||||||
|
font-weight: bold; |
||||||
|
margin-bottom: 20px; |
||||||
|
color: #FFFFFF; |
||||||
|
} |
||||||
|
|
||||||
|
.full-item-form .el-select, |
||||||
|
.full-item-form .el-date-editor, |
||||||
|
.full-item-form .el-autocomplete { |
||||||
|
width: 100% !important; |
||||||
|
} |
||||||
|
|
||||||
|
.dialog-footer { |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
|
||||||
|
.infomation-form .el-form-item { |
||||||
|
margin-top: 20px; |
||||||
|
font-size: 1.5rem; |
||||||
|
} |
||||||
|
.infomation-form .el-input { |
||||||
|
width: 350px; |
||||||
|
margin-right: 20px; |
||||||
|
} |
||||||
|
.infomation-form .el-input__inner{ |
||||||
|
background-color: #4472c4 !important; |
||||||
|
color: #FFFFFF; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,43 @@ |
|||||||
|
<template> |
||||||
|
<div id="home"> |
||||||
|
欢迎使用后台管理模版系统 |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Vue |
||||||
|
} from 'vue-property-decorator' |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class Home extends Vue { |
||||||
|
created() {} // 生命周期 - 创建完成(可以访问当前this实例) |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
//@import url(); 引入公共css类 |
||||||
|
#home { |
||||||
|
padding: 0px 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.item-to { |
||||||
|
background-color: #fef0f0; |
||||||
|
color: #f56c6c; |
||||||
|
} |
||||||
|
|
||||||
|
.item-read { |
||||||
|
background-color: #f4f4f5; |
||||||
|
color: #909399; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,194 @@ |
|||||||
|
<template> |
||||||
|
<div id="login"> |
||||||
|
<div class="loginForm" :style="{ height:$store.state.sizes.loginHeight,width:$store.state.sizes.loginWidth, |
||||||
|
'margin-top': $store.state.sizes.loginTop,'margin-left':$store.state.sizes.loginLeft}"> |
||||||
|
<el-form ref="login" class="login-form" :model="user" :rules="rules" hide-required-asterisk label-width="30px"> |
||||||
|
<div class="login-title"> |
||||||
|
后台管理模版系统 |
||||||
|
</div> |
||||||
|
<br><br> |
||||||
|
<el-form-item prop="userId"> |
||||||
|
<el-input v-model="user.userId" placeholder="用户名"> |
||||||
|
<el-button slot="prepend" icon="el-icon-user" /> |
||||||
|
</el-input> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item prop="key"> |
||||||
|
<el-input v-model="user.key" type="password" placeholder="密码"> |
||||||
|
<el-button slot="prepend" icon="el-icon-key" /> |
||||||
|
</el-input> |
||||||
|
</el-form-item> |
||||||
|
<br> |
||||||
|
<el-form-item> |
||||||
|
<el-button class="login-btn" type="primary" @click="loginSubmit">登录</el-button> |
||||||
|
<el-button style="float: right;" class="login-btn" type="primary" @click="reset">重置</el-button> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
</div> |
||||||
|
|
||||||
|
<el-dialog ref="dialog" title="您的密码为初始密码,请修改后再登录" |
||||||
|
:visible.sync="updateFlag" width="30%" top="15vh" :close-on-click-modal="false"> |
||||||
|
<el-form ref="update" :model="user" :rules="rules" label-width="120px"> |
||||||
|
<el-form-item label="新密码" prop="newPassword"> |
||||||
|
<el-input type="password" v-model="user.newKey"></el-input> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="重复新密码" prop="rePassword"> |
||||||
|
<el-input type="password" v-model="user.reKey" autocomplete="off"></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
<div slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="updateFlag = false"> 取消 </el-button> |
||||||
|
<el-button type="primary" @click="update"> 确定 </el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts"> |
||||||
|
import { |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Vue |
||||||
|
} from 'vue-property-decorator' |
||||||
|
import md5 from 'js-md5' |
||||||
|
import { |
||||||
|
password |
||||||
|
} from '@/static/tool/validate.js'; |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class Login extends Vue { |
||||||
|
marginTop = (window.innerHeight - 350) * 0.4 + 'px'; |
||||||
|
urls = { |
||||||
|
login: "um/sso/login", |
||||||
|
update: "um/update/password" |
||||||
|
} |
||||||
|
updateFlag = false; |
||||||
|
user = { |
||||||
|
userId: null, |
||||||
|
key: null |
||||||
|
}; |
||||||
|
|
||||||
|
rules = { |
||||||
|
userId: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入用户名', |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
key: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入密码', |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
newKey: [{ |
||||||
|
validator: password, |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
reKey: [{ |
||||||
|
validator: this.reKey, |
||||||
|
trigger: 'blur' |
||||||
|
}] |
||||||
|
}; |
||||||
|
|
||||||
|
loginSubmit() { |
||||||
|
const that = this as any; |
||||||
|
that.$refs.login.validate((valid) => { |
||||||
|
if (valid) { |
||||||
|
const param = JSON.parse(JSON.stringify(that.user)) |
||||||
|
param.key = md5(param.key) |
||||||
|
that.$post(that.urls.login, param).then(function(response) { |
||||||
|
if (response == true) { |
||||||
|
setTimeout(() => { |
||||||
|
that.$emit("init"); |
||||||
|
}, 300) |
||||||
|
} else if (response) { |
||||||
|
that.updateFlag = true; |
||||||
|
} |
||||||
|
}) |
||||||
|
} else { |
||||||
|
return false |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
reset() { |
||||||
|
this.user = { |
||||||
|
userId: null, |
||||||
|
key: null |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
update() { |
||||||
|
const that = this; |
||||||
|
this.$refs['update'].validate((valid) => { |
||||||
|
if (valid) { |
||||||
|
var param = JSON.parse(JSON.stringify(that.user)); |
||||||
|
param.key = md5(param.key); |
||||||
|
param.newKey = md5(param.newKey); |
||||||
|
that.$post(that.urls.update, param).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.user.key = that.user.newKey; |
||||||
|
that.updateFlag = false; |
||||||
|
} |
||||||
|
}); |
||||||
|
} else { |
||||||
|
return false; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
init(b) { |
||||||
|
this.$store.commit('updateState', { |
||||||
|
prop: 'showHeader', |
||||||
|
value: b |
||||||
|
}) |
||||||
|
this.$store.commit('initSizes') |
||||||
|
} |
||||||
|
|
||||||
|
reKey(rule, value, callback) { |
||||||
|
if (!value) { |
||||||
|
callback(new Error('请重复输入新密码')); |
||||||
|
} else if (value != this.user.newKey) { |
||||||
|
callback(new Error('两次输入的新密码不一致')); |
||||||
|
} else { |
||||||
|
callback(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
this.init(false); |
||||||
|
const that = this; |
||||||
|
document.onkeydown = function(e) { |
||||||
|
let key = e.which; |
||||||
|
if (key == 13) { |
||||||
|
that.loginSubmit(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
#login { |
||||||
|
background-color: #edf2f7; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
|
||||||
|
.loginForm { |
||||||
|
background: none; |
||||||
|
height: 350px; |
||||||
|
width: 500px; |
||||||
|
box-shadow: 0 0 25px #cac6c6 !important; |
||||||
|
padding: 30px 30px 20px 0px; |
||||||
|
} |
||||||
|
|
||||||
|
.login-title { |
||||||
|
margin: 0px 70px 20px; |
||||||
|
font-size: 1.8rem; |
||||||
|
text-align: center; |
||||||
|
color: #2d3748; |
||||||
|
} |
||||||
|
|
||||||
|
.login-btn { |
||||||
|
margin: 0px 30px; |
||||||
|
width: 100px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,184 @@ |
|||||||
|
<template> |
||||||
|
<div id="buffer"> |
||||||
|
<el-container> |
||||||
|
<el-header class="main-head"> |
||||||
|
<el-row type="flex" justify="end"> |
||||||
|
<el-button v-if="$store.state.buttons['admin/memory/buffer/list']" type="primary" icon="el-icon-search" |
||||||
|
@click="query"> |
||||||
|
刷新 |
||||||
|
</el-button> |
||||||
|
<el-button v-if="$store.state.buttons['admin/memory/buffer/clean']" type="success" icon="el-icon-delete" |
||||||
|
@click="clean"> |
||||||
|
清空失效缓存 |
||||||
|
</el-button> |
||||||
|
</el-row> |
||||||
|
</el-header> |
||||||
|
<el-main class="app-main"> |
||||||
|
<el-table :data="result" :height="$store.state.sizes.tableHei" border style="width: 100%" stripe> |
||||||
|
<el-table-column type="expand"> |
||||||
|
<template slot-scope="props"> |
||||||
|
<el-form v-if="!isObj(props.row.value)" label-position="left" inline class="demo-table-expand"> |
||||||
|
<el-form-item label="缓存值"> |
||||||
|
<span>{{ props.row.value }}</span> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
<el-form v-if="isObj(props.row.value)" label-position="left" inline class="demo-table-expand"> |
||||||
|
<el-form-item v-for="(val, key, i) in props.row.value" :key="key" :label="key" label-width="180px"> |
||||||
|
<span>{{ val }}</span> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="key" label="唯一键" min-width="200" /> |
||||||
|
<el-table-column prop="effective" label="是否有效" min-width="100" :formatter="booleanFmt" /> |
||||||
|
<el-table-column prop="loseTime" label="失效时间" min-width="180" /> |
||||||
|
<el-table-column label="操作" min-width="200" fixed="right"> |
||||||
|
<template slot-scope="scope"> |
||||||
|
<el-button type="success" size="mini" @click="delay(scope.$index, scope.row)"> |
||||||
|
修改有效期 |
||||||
|
</el-button> |
||||||
|
<el-button v-if="$store.state.buttons['admin/memory/buffer/delete']" type="danger" size="mini" @click="delate(scope.$index, scope.row)"> |
||||||
|
删除 |
||||||
|
</el-button> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</el-main> |
||||||
|
</el-container> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Vue |
||||||
|
} from 'vue-property-decorator' |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class Buffer extends Vue { |
||||||
|
urls = { |
||||||
|
list: 'admin/memory/buffer/list', |
||||||
|
clean: 'admin/memory/buffer/clean', |
||||||
|
delay: 'admin/memory/buffer/delay', |
||||||
|
del: 'admin/memory/buffer/delete' |
||||||
|
} |
||||||
|
|
||||||
|
result = []; |
||||||
|
|
||||||
|
query() { |
||||||
|
const that = this |
||||||
|
this.$post(this.urls.list).then(function(response) { |
||||||
|
that.result = [] |
||||||
|
if (response) { |
||||||
|
that.result = JSON.parse(JSON.stringify(response)) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
clean() { |
||||||
|
const that = this |
||||||
|
this.$post(this.urls.clean).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.query() |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
delay(index, row) { |
||||||
|
const that = this |
||||||
|
this.$prompt('请输入失效时间(yyyy-MM-dd HH:mm:ss)', '修改', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
inputPattern: /^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s((([0-1][0-9])|(2?[0-3]))\:([0-5]?[0-9])((\s)|(\:([0-5]?[0-9])))))?$/, |
||||||
|
inputErrorMessage: '时间格式不正确', |
||||||
|
distinguishCancelAndClose: true, |
||||||
|
showClose: false, |
||||||
|
beforeClose: (action, instance, done) => { |
||||||
|
if (action === 'close') { |
||||||
|
return |
||||||
|
} |
||||||
|
done() |
||||||
|
} |
||||||
|
}).then(({ |
||||||
|
value |
||||||
|
}) => { |
||||||
|
that.$post(that.urls.delay, { |
||||||
|
key: row.key, |
||||||
|
loseTime: value |
||||||
|
}).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.query() |
||||||
|
} |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
this.$showMessage('info', '已取消修改') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
delate(index, row) { |
||||||
|
const that = this |
||||||
|
this.$confirm('确定要删除此条缓存吗?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'danger' |
||||||
|
}).then(() => { |
||||||
|
this.$post(this.urls.del, row).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.query() |
||||||
|
} |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
this.$showMessage('info', '已取消删除') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
booleanFmt(row, column, cellValue, index) { |
||||||
|
if (cellValue) { |
||||||
|
return '是' |
||||||
|
} |
||||||
|
return '否' |
||||||
|
} |
||||||
|
|
||||||
|
isObj(data) { |
||||||
|
return typeof data === 'object' |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
this.query() |
||||||
|
this.$store.commit('getActionPers', 'buffer') |
||||||
|
} |
||||||
|
|
||||||
|
mounted() { |
||||||
|
// 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
} |
||||||
|
|
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style> |
||||||
|
#buffer { |
||||||
|
padding: 20px 20px 0px 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.demo-table-expand { |
||||||
|
font-size: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.demo-table-expand label { |
||||||
|
width: 90px; |
||||||
|
color: #99a9bf; |
||||||
|
} |
||||||
|
|
||||||
|
.demo-table-expand .el-form-item { |
||||||
|
margin-right: 0; |
||||||
|
margin-bottom: 0; |
||||||
|
width: 50%; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,252 @@ |
|||||||
|
<template> |
||||||
|
<div id="dictionary"> |
||||||
|
<el-container> |
||||||
|
<el-header class="main-head"> |
||||||
|
<el-row type="flex" justify="end"> |
||||||
|
<el-input v-model="example.name" class="query-medium" placeholder="字典类型名称(模糊查询)" clearable /> |
||||||
|
<el-input v-model="example.code" class="query-medium" placeholder="字典类型编码" clearable /> |
||||||
|
<el-select v-if="$store.state.buttons['admin/dict/save']" v-model="example.status" class="query-short" placeholder="状态" clearable> |
||||||
|
<el-option value="A" label="启用" /> |
||||||
|
<el-option value="I" label="禁用" /> |
||||||
|
</el-select> |
||||||
|
<el-button type="primary" icon="el-icon-search" @click="queryList(1)"> 查询 </el-button> |
||||||
|
<el-button type="success" icon="el-icon-plus" @click="add()"> 添加字典类型 </el-button> |
||||||
|
</el-row> |
||||||
|
</el-header> |
||||||
|
<el-main class="app-main"> |
||||||
|
<el-table :data="result.rows" :height="$store.state.sizes.pTableHei" :row-class-name="rowClass" row-key="key" |
||||||
|
border :tree-props="{children: 'children'}"> |
||||||
|
<el-table-column prop="name" label="字典名称" min-width="180" fixed="left" /> |
||||||
|
<el-table-column prop="code" label="字典编码" min-width="180" /> |
||||||
|
<el-table-column prop="desc" label="字典说明" min-width="300" /> |
||||||
|
<el-table-column label="状态" min-width="120"> |
||||||
|
<template slot-scope="scope"> |
||||||
|
<div slot="reference" class="name-wrapper"> |
||||||
|
<el-tag v-if="scope.row.status=='A'" size="medium"> |
||||||
|
启用 |
||||||
|
</el-tag> |
||||||
|
<el-tag v-else size="medium" type="danger"> |
||||||
|
禁用 |
||||||
|
</el-tag> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="操作" width="300" fixed="right"> |
||||||
|
<template slot-scope="scope"> |
||||||
|
<el-button v-if="$store.state.buttons['admin/dict/update']" size="mini" type="primary" @click="modify(scope.row)"> |
||||||
|
修改 |
||||||
|
</el-button> |
||||||
|
<el-button v-if="$store.state.buttons['admin/dict/delete']" size="mini" type="danger" @click="delate(scope.row)"> |
||||||
|
删除 |
||||||
|
</el-button> |
||||||
|
<el-button v-if="$store.state.buttons['admin/dict/save'] && scope.row.parent == null" size="mini" type="success" |
||||||
|
@click="add(scope.row)"> |
||||||
|
添加字典 |
||||||
|
</el-button> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination :current-page="example.page" :page-sizes="[10, 20, 50, 100]" :page-size="example.size" layout="total, sizes, prev, pager, next, jumper" |
||||||
|
:total="result.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> |
||||||
|
</el-main> |
||||||
|
</el-container> |
||||||
|
|
||||||
|
<el-dialog title="修改类型/字典" :visible.sync="flag.modify" :close-on-click-modal="false" top="15vh" width="40%" @keydown.enter.native="confirm()"> |
||||||
|
<el-form ref="update" class="full-item-form" label-width="100px" :rules="rules" :model="param"> |
||||||
|
<el-form-item label="字典编号" prop="code"> |
||||||
|
<el-input v-model="param.code" :disabled="!flag.add" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="字典名称" prop="name"> |
||||||
|
<el-input v-model="param.name" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="字典说明"> |
||||||
|
<el-input v-model="param.desc" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="字典状态" prop="status"> |
||||||
|
<el-select v-model="param.status" placeholder="请选择"> |
||||||
|
<el-option value="A" label="启用"> |
||||||
|
启用 |
||||||
|
</el-option> |
||||||
|
<el-option value="I" label="禁用"> |
||||||
|
禁用 |
||||||
|
</el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
<div slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="flag.modify = false"> 取 消(Esc) </el-button> |
||||||
|
<el-button type="primary" @click="confirm"> 确 定(Enter) </el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop |
||||||
|
} from 'vue-property-decorator' |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class Dictionary extends Vue { |
||||||
|
urls = { |
||||||
|
list: 'admin/dict/list', |
||||||
|
save: 'admin/dict/save', |
||||||
|
update: 'admin/dict/update', |
||||||
|
del: 'admin/dict/delete' |
||||||
|
}; |
||||||
|
|
||||||
|
rules = { |
||||||
|
code: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入字典编号', |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
name: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入字典名称', |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
status: [{ |
||||||
|
required: true, |
||||||
|
message: '请选择字典状态', |
||||||
|
trigger: 'blur' |
||||||
|
}] |
||||||
|
}; |
||||||
|
example = { |
||||||
|
page: 1, |
||||||
|
size: 10 |
||||||
|
}; |
||||||
|
|
||||||
|
param = {}; |
||||||
|
result = { |
||||||
|
rows: [], |
||||||
|
total: 0 |
||||||
|
}; |
||||||
|
|
||||||
|
flag = { |
||||||
|
add: false, |
||||||
|
modify: false |
||||||
|
} |
||||||
|
|
||||||
|
handleSizeChange(val) { |
||||||
|
this.example.size = val |
||||||
|
this.queryList() |
||||||
|
} |
||||||
|
|
||||||
|
handleCurrentChange(val) { |
||||||
|
this.example.page = val |
||||||
|
this.queryList() |
||||||
|
} |
||||||
|
|
||||||
|
queryList(page) { |
||||||
|
const that = this |
||||||
|
if (page != null) { |
||||||
|
this.example.page = page |
||||||
|
} |
||||||
|
this.$get(this.urls.list, that.example).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.result = response |
||||||
|
} else { |
||||||
|
that.result = { |
||||||
|
rows: [], |
||||||
|
total: 0 |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
rowClass(data) { |
||||||
|
if (data.row.parent == null) { |
||||||
|
return '' |
||||||
|
} |
||||||
|
return 'child-row' |
||||||
|
} |
||||||
|
|
||||||
|
modify(row) { |
||||||
|
if (this.$refs.update != null) { |
||||||
|
this.$refs.update.clearValidate() |
||||||
|
} |
||||||
|
this.flag.add = false |
||||||
|
this.param = JSON.parse(JSON.stringify(row)) |
||||||
|
this.flag.modify = true |
||||||
|
} |
||||||
|
|
||||||
|
add(row) { |
||||||
|
if (this.$refs.update != null) { |
||||||
|
this.$refs.update.clearValidate() |
||||||
|
} |
||||||
|
this.flag.add = true |
||||||
|
this.param = { |
||||||
|
status: 'A' |
||||||
|
} |
||||||
|
if (row != null) { |
||||||
|
this.param.parent = row.code |
||||||
|
} |
||||||
|
this.flag.modify = true |
||||||
|
} |
||||||
|
|
||||||
|
delate(row) { |
||||||
|
const that = this |
||||||
|
this.$confirm('确定要字典权限‘' + row.name + '’吗?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'warning' |
||||||
|
}).then(() => { |
||||||
|
this.$post(this.urls.del, row).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.queryList() |
||||||
|
} |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
showMessage('info', '已取消删除') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
confirm() { |
||||||
|
const that = this |
||||||
|
this.$refs.update.validate((valid) => { |
||||||
|
if (valid) { |
||||||
|
let url = that.urls.update |
||||||
|
if (that.flag.add) { |
||||||
|
url = that.urls.save |
||||||
|
} |
||||||
|
const param = JSON.parse(JSON.stringify(that.param)) |
||||||
|
delete param.children; |
||||||
|
that.$post(url, param).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.queryList() |
||||||
|
that.flag.modify = false |
||||||
|
} |
||||||
|
}) |
||||||
|
} else { |
||||||
|
return false |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
this.queryList() |
||||||
|
this.$store.commit('getActionPers', 'dictionary') |
||||||
|
} |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style scoped> |
||||||
|
#dictionary { |
||||||
|
padding: 20px 20px 0px 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.child-row { |
||||||
|
background: #f0f9eb !important; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,268 @@ |
|||||||
|
<template> |
||||||
|
<div id="permission"> |
||||||
|
<el-header class="main-head"> |
||||||
|
<el-row type="flex" class="row-bg" justify="end"> |
||||||
|
<el-button v-if="$store.state.buttons['admin/per/save']" type="primary" icon="el-icon-plus" @click="add()"> |
||||||
|
添加菜单组 |
||||||
|
</el-button> |
||||||
|
<el-button v-if="$store.state.buttons['admin/per/list']" type="info" icon="el-icon-refresh" @click="queryList(1)"> |
||||||
|
刷新 |
||||||
|
</el-button> |
||||||
|
</el-row> |
||||||
|
</el-header> |
||||||
|
|
||||||
|
<el-main class="app-main"> |
||||||
|
<el-table :data="result" :height="$store.state.sizes.tableHei" :row-class-name="rowClass" row-key="id" border |
||||||
|
:tree-props="{children: 'children'}"> |
||||||
|
<el-table-column prop="name" label="权限名称" min-width="200" fixed="left" /> |
||||||
|
<el-table-column prop="id" label="权限编号" min-width="220" /> |
||||||
|
<el-table-column label="菜单图标" min-width="80"> |
||||||
|
<template slot-scope="scope"> |
||||||
|
<i :class="scope.row.desc" /> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="perLevel" label="权限级别" min-width="80" :formatter="(row,column,value) => getValue('per_level',value)" /> |
||||||
|
<el-table-column prop="perOrder" label="排序优先级" min-width="80" /> |
||||||
|
<el-table-column label="权限状态" min-width="80"> |
||||||
|
<template slot-scope="scope"> |
||||||
|
<div slot="reference" class="name-wrapper"> |
||||||
|
<el-tag v-if="scope.row.perStatus=='A'" size="medium"> |
||||||
|
启用 |
||||||
|
</el-tag> |
||||||
|
<el-tag v-if="scope.row.perStatus=='H'" size="medium" type="info"> |
||||||
|
专用 |
||||||
|
</el-tag> |
||||||
|
<el-tag v-if="scope.row.perStatus=='I'" size="medium" type="danger"> |
||||||
|
禁用 |
||||||
|
</el-tag> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column prop="perContent" label="权限内容" min-width="230" /> |
||||||
|
<el-table-column label="操作" width="270" fixed="right"> |
||||||
|
<template slot-scope="scope"> |
||||||
|
<el-button v-if="$store.state.buttons['admin/per/update']" size="mini" type="primary" @click="modify(scope.row)"> |
||||||
|
修改 |
||||||
|
</el-button> |
||||||
|
<el-button v-if="$store.state.buttons['admin/per/delete']" size="mini" type="danger" @click="delate(scope.row)"> |
||||||
|
删除 |
||||||
|
</el-button> |
||||||
|
<el-button v-if="$store.state.buttons['admin/per/save'] && scope.row.perLevel != 'action'" size="mini" type="success" |
||||||
|
@click="add(scope.row)"> |
||||||
|
添加子权限 |
||||||
|
</el-button> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</el-main> |
||||||
|
|
||||||
|
<el-dialog :title="(flag.add ? '添加':'修改')+'权限'" :visible.sync="flag.modify" :close-on-click-modal="false" top="15vh" |
||||||
|
width="30%" @keydown.enter.native="confirm()"> |
||||||
|
<el-form ref="update" class="full-item-form" label-width="100px" :rules="rules" :model="param"> |
||||||
|
<el-form-item label="权限编号" prop="id"> |
||||||
|
<el-input v-model="param.id" :disabled="!flag.add" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="父权限"> |
||||||
|
<el-input v-model="param.perParent" disabled="disabled" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="权限级别"> |
||||||
|
<el-select v-model="param.perLevel" placeholder="请选择" disabled> |
||||||
|
<el-option v-for="(val, key, i) in $store.state.dict.per_level" :key="key" :value="key" :label="val" /> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="权限名称" prop="name"> |
||||||
|
<el-input v-model="param.name" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="权限内容"> |
||||||
|
<el-input v-model="param.perContent" /> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="菜单图标"> |
||||||
|
<el-select v-model="param.desc" placeholder="请选择"> |
||||||
|
<el-option v-for="item in iconsArr" :key="item" :value="item"> |
||||||
|
<span style="float: left; color: #8492a6; font-size: 16px; margin-right:20px;"> |
||||||
|
<i :class="item" /> |
||||||
|
</span> |
||||||
|
<span style="float: left">{{ item }}</span> |
||||||
|
</el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="排序优先级"> |
||||||
|
<el-select v-model="param.perOrder" placeholder="请选择"> |
||||||
|
<el-option v-for="index in order" :key="index" :value="index" /> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="权限状态" prop="dictStatus"> |
||||||
|
<el-select v-model="param.perStatus" placeholder="请选择"> |
||||||
|
<el-option v-for="(val, key, i) in $store.state.dict.active_status" :key="key" :value="key" :label="val" /> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
<div slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="flag.modify = false"> 取 消(Esc) </el-button> |
||||||
|
<el-button type="primary" @click="confirm"> 确 定(Enter) </el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Watch |
||||||
|
} from 'vue-property-decorator' |
||||||
|
import element from '@/static/plugins/element' |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class Permission extends Vue { |
||||||
|
urls = { |
||||||
|
list: 'admin/per/list', |
||||||
|
save: 'admin/per/save', |
||||||
|
update: 'admin/per/update', |
||||||
|
del: 'admin/per/delete' |
||||||
|
}; |
||||||
|
|
||||||
|
rules = { |
||||||
|
id: [{required: true,message:'请输入权限编号',trigger: 'blur'}], |
||||||
|
name: [{required: true,message:'请输入权限名称',trigger: 'blur'}] |
||||||
|
}; |
||||||
|
iconsArr = element.icons; |
||||||
|
order = 99; |
||||||
|
nodeLevel = { |
||||||
|
module: 'group', |
||||||
|
group: 'view', |
||||||
|
view: 'action' |
||||||
|
}; |
||||||
|
example = {page:1,size:10}; |
||||||
|
|
||||||
|
result = []; |
||||||
|
param = {}; |
||||||
|
flag = { |
||||||
|
modify: false, |
||||||
|
add: false |
||||||
|
}; |
||||||
|
|
||||||
|
queryList(page) { |
||||||
|
if (page != null) { |
||||||
|
this.example.page = page |
||||||
|
} |
||||||
|
const that = this |
||||||
|
this.$get(this.urls.list, this.example).then(rsp => { |
||||||
|
that.result = rsp |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
rowClass(data) { |
||||||
|
return data.row.perLevel + '-row' |
||||||
|
} |
||||||
|
|
||||||
|
modify(row) { |
||||||
|
if (this.$refs.update != null) { |
||||||
|
this.$refs.update.clearValidate() |
||||||
|
} |
||||||
|
this.flag.add = false |
||||||
|
this.param = JSON.parse(JSON.stringify(row)) |
||||||
|
this.flag.modify = true |
||||||
|
} |
||||||
|
|
||||||
|
add(row) { |
||||||
|
if (this.$refs.update != null) { |
||||||
|
this.$refs.update.clearValidate() |
||||||
|
} |
||||||
|
this.flag.add = true |
||||||
|
this.param = { |
||||||
|
perStatus: 'A' |
||||||
|
} |
||||||
|
if (row == null) { |
||||||
|
this.param.perLevel = 'group' |
||||||
|
} else { |
||||||
|
this.param.perParent = row.id |
||||||
|
this.param.perLevel = this.nodeLevel[row.perLevel] |
||||||
|
} |
||||||
|
this.flag.modify = true |
||||||
|
} |
||||||
|
|
||||||
|
delate(row) { |
||||||
|
const that = this |
||||||
|
this.$confirm('确定要删除权限‘' + row.name + '’吗?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'warning' |
||||||
|
}).then(() => { |
||||||
|
that.$post(that.urls.del, row).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.queryList() |
||||||
|
} |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
showMessage('info', '已取消删除') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
confirm() { |
||||||
|
const that = this |
||||||
|
this.$refs.update.validate((valid) => { |
||||||
|
if (valid) { |
||||||
|
let url = that.urls.update |
||||||
|
if (that.flag.add) { |
||||||
|
url = that.urls.save |
||||||
|
} |
||||||
|
delete that.param.children |
||||||
|
that.$post(url, that.param).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.queryList() |
||||||
|
that.flag.modify = false |
||||||
|
} |
||||||
|
}) |
||||||
|
} else { |
||||||
|
return false |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
getValue(dictKey, value) { |
||||||
|
const dict = this.$store.state.dict[dictKey] |
||||||
|
if (dict == null) { |
||||||
|
return '' |
||||||
|
} |
||||||
|
return dict[value] == null ? value : dict[value] |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
this.queryList() |
||||||
|
this.$store.commit('getDictMap', ['per_level', 'active_status']) |
||||||
|
this.$store.commit('getActionPers', 'permission') |
||||||
|
} |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style> |
||||||
|
#permission { |
||||||
|
padding: 20px 20px 0px 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.module-row { |
||||||
|
background-color: #ecf5ff !important; |
||||||
|
} |
||||||
|
|
||||||
|
.group-row { |
||||||
|
background-color: #f0f9eb !important; |
||||||
|
} |
||||||
|
|
||||||
|
.view-row { |
||||||
|
background-color: oldlace !important; |
||||||
|
} |
||||||
|
|
||||||
|
.action-row { |
||||||
|
background-color: #c5f9e6 !important; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,159 @@ |
|||||||
|
<template> |
||||||
|
<div id="buffer"> |
||||||
|
<div id="main"> |
||||||
|
<el-tabs v-model="type"> |
||||||
|
<el-tab-pane v-for="item in typeList" :label="item.name + '状态管理'" :name="item.type"> |
||||||
|
<el-table :data="result.rows" :height="$store.state.sizes.pTableHei - 20" border style="width: 100%" stripe> |
||||||
|
<el-table-column v-for="cl in item.columns" :prop="cl.code" :label="cl.name" min-width="150"></el-table-column> |
||||||
|
<el-table-column prop="status" label="状态" min-width="100" :formatter="getValue"></el-table-column> |
||||||
|
<el-table-column label="操作" :width="450" fixed="right"> |
||||||
|
<template slot-scope="scope"> |
||||||
|
<el-button type="primary" size="mini" @click="edit(scope.row)">修改</el-button> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="example.page" |
||||||
|
:page-sizes="[10, 20, 50, 100]" :page-size="example.size" layout="total, sizes, prev, pager, next, jumper" |
||||||
|
:total="result.total"> |
||||||
|
</el-pagination> |
||||||
|
</el-tab-pane> |
||||||
|
</el-tabs> |
||||||
|
</div> |
||||||
|
|
||||||
|
<el-dialog title="修改状态" :visible.sync="showEdit" :close-on-click-modal="false" top="15vh" width="30%" @keydown.enter.native="confirm()"> |
||||||
|
<el-form class="full-item-form" label-width="100px" :model="param"> |
||||||
|
<el-form-item label="状态"> |
||||||
|
<el-select v-model="param.status" placeholder="请选择"> |
||||||
|
<el-option v-for="(val, key, i) in status" :key="key" :value="key" :label="val"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-form> |
||||||
|
<div slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="showEdit = false">取 消(Esc)</el-button> |
||||||
|
<el-button type="primary" @click="confirm">确 定(Enter)</el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Vue, |
||||||
|
Watch |
||||||
|
} from 'vue-property-decorator' |
||||||
|
|
||||||
|
@Component |
||||||
|
export default class Buffer extends Vue { |
||||||
|
example = { |
||||||
|
page: 1, |
||||||
|
size: 10 |
||||||
|
}; |
||||||
|
param = {}; |
||||||
|
result = []; |
||||||
|
type = 'role'; |
||||||
|
typeList = [{ |
||||||
|
type: 'role', |
||||||
|
name: '角色', |
||||||
|
columns: [{ |
||||||
|
code: 'code', |
||||||
|
name: '角色编号' |
||||||
|
}, |
||||||
|
{ |
||||||
|
code: 'name', |
||||||
|
name: '角色名称' |
||||||
|
} |
||||||
|
] |
||||||
|
}, { |
||||||
|
type: 'user', |
||||||
|
name: '用户', |
||||||
|
columns: [{ |
||||||
|
code: 'userId', |
||||||
|
name: '用户名' |
||||||
|
}, |
||||||
|
{ |
||||||
|
code: 'name', |
||||||
|
name: '用户姓名' |
||||||
|
} |
||||||
|
] |
||||||
|
}]; |
||||||
|
status = {}; |
||||||
|
showEdit = false; |
||||||
|
|
||||||
|
handleSizeChange(val) { |
||||||
|
this.example.size = val; |
||||||
|
this.query(); |
||||||
|
} |
||||||
|
|
||||||
|
handleCurrentChange(val) { |
||||||
|
this.example.page = val; |
||||||
|
this.query(); |
||||||
|
} |
||||||
|
query(page) { |
||||||
|
if (page != null) { |
||||||
|
this.example.page = page; |
||||||
|
} |
||||||
|
const that = this; |
||||||
|
this.$get('admin/' + this.type + '/list/all', this.example).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.result = response; |
||||||
|
} else { |
||||||
|
that.result = []; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
edit(row) { |
||||||
|
this.status = this.$store.state.dict[this.type + '_status']; |
||||||
|
this.param = JSON.parse(JSON.stringify(row)); |
||||||
|
this.showEdit = true; |
||||||
|
} |
||||||
|
confirm() { |
||||||
|
const that = this; |
||||||
|
this.$post('admin/' + this.type + '/update', this.param).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.query(); |
||||||
|
that.showEdit = false; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
getValue(row, column, value, index) { |
||||||
|
const dict = this.$store.state.dict[this.type + '_status']; |
||||||
|
if (dict == null) { |
||||||
|
return value; |
||||||
|
} |
||||||
|
const val = dict[value]; |
||||||
|
return val == null ? value : val; |
||||||
|
} |
||||||
|
|
||||||
|
@Watch('type', { |
||||||
|
immediate: true |
||||||
|
}) |
||||||
|
typeChange(nVal, oVal) { |
||||||
|
this.query(1); |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
const arr = new Array(); |
||||||
|
for (var i = 0; i < this.typeList.length; i++) { |
||||||
|
arr.push(this.typeList[i].type + '_status'); |
||||||
|
} |
||||||
|
this.$store.commit('getDictMap', arr) |
||||||
|
this.query(); |
||||||
|
} |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style> |
||||||
|
#main { |
||||||
|
padding: 10px 100px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,101 @@ |
|||||||
|
<template> |
||||||
|
<div id="log"> |
||||||
|
<Template ref="template" name="日志" :urls="urls" :terms="terms" :props="props"></Template> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop |
||||||
|
} from "vue-property-decorator"; |
||||||
|
import Template from '@/components/template/manage.vue'; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
components: { |
||||||
|
Template |
||||||
|
} |
||||||
|
}) |
||||||
|
export default class Log extends Vue { |
||||||
|
urls = { |
||||||
|
list: 'admin/log/action' |
||||||
|
} |
||||||
|
|
||||||
|
terms = [{ |
||||||
|
code: 'userId', |
||||||
|
desc: '操作用户' |
||||||
|
}, { |
||||||
|
code: 'module', |
||||||
|
dict: 'log_module', |
||||||
|
desc: '日志模块', |
||||||
|
filterable: true |
||||||
|
}, { |
||||||
|
code: 'type', |
||||||
|
dict: 'log_type', |
||||||
|
desc: '操作类型', |
||||||
|
filterable: true |
||||||
|
}, { |
||||||
|
code: 'startTime', |
||||||
|
datePicker: true, |
||||||
|
valueFormat: 'yyyy-MM-dd HH:mm:ss', |
||||||
|
type: 'datetime', |
||||||
|
desc: '开始时间' |
||||||
|
}, { |
||||||
|
code: 'endTime', |
||||||
|
datePicker: true, |
||||||
|
valueFormat: 'yyyy-MM-dd HH:mm:ss', |
||||||
|
type: 'datetime', |
||||||
|
desc: '结束时间' |
||||||
|
}, ]; |
||||||
|
|
||||||
|
props = [{ |
||||||
|
type: 'index', |
||||||
|
name: '序号', |
||||||
|
width: 80 |
||||||
|
}, { |
||||||
|
code: 'userId', |
||||||
|
name: '操作用户', |
||||||
|
width: 120 |
||||||
|
}, { |
||||||
|
code: 'module', |
||||||
|
name: '日志模块', |
||||||
|
dict: 'log_module', |
||||||
|
width: 150, |
||||||
|
}, { |
||||||
|
code: 'type', |
||||||
|
name: '操作类型', |
||||||
|
dict: 'log_type', |
||||||
|
width: 150 |
||||||
|
}, { |
||||||
|
code: 'time', |
||||||
|
name: '操作时间', |
||||||
|
width: 180 |
||||||
|
}, { |
||||||
|
code: 'loginIp', |
||||||
|
name: '登录IP', |
||||||
|
width: 180 |
||||||
|
}, { |
||||||
|
code: 'context', |
||||||
|
name: '日志信息', |
||||||
|
width: 300 |
||||||
|
}] |
||||||
|
|
||||||
|
created() { |
||||||
|
this.$store.commit('getActionPers', 'system_log') |
||||||
|
} //生命周期 - 创建完成(可以访问当前this实例) |
||||||
|
mounted() {} //生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() { |
||||||
|
this.$store.commit('getDictMap', ['log_type', 'log_module']); |
||||||
|
} //生命周期 - 创建之前 |
||||||
|
beforeMount() {} //生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} //生命周期 - 更新之前 |
||||||
|
updated() {} //生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} //生命周期 - 销毁之前 |
||||||
|
destroyed() {} //生命周期 - 销毁完成 |
||||||
|
activated() {} //如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style scoped> |
||||||
|
|
||||||
|
</style> |
||||||
@ -0,0 +1,196 @@ |
|||||||
|
<template> |
||||||
|
<div id="role"> |
||||||
|
<Template ref="template" name="角色" :urls="urls" :props="props" :rules="rules" :actions="actions" @per="per" |
||||||
|
stateProp="status" @change="$store.commit('updateState', {prop:'roles',value:null})"></Template> |
||||||
|
|
||||||
|
<el-dialog title="分配权限" :visible.sync="flag.per" :close-on-click-modal="false" @keydown.enter.native="setPre()"> |
||||||
|
<el-tree ref="tree" check-strictly :data="perTree" show-checkbox node-key="id" :default-checked-keys="param.permissions" |
||||||
|
:props="{ children: 'children',label: 'name'}" render-after-expand @check-change="checkChange" /> |
||||||
|
<div slot="footer" class="dialog-footer"> |
||||||
|
<el-button @click="flag.per = false"> 取 消 </el-button> |
||||||
|
<el-button type="primary" @click="setPre()"> 确 定 </el-button> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Watch |
||||||
|
} from 'vue-property-decorator'; |
||||||
|
import Template from '@/components/template/manage.vue'; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
components: { |
||||||
|
Template |
||||||
|
} |
||||||
|
}) |
||||||
|
export default class Role extends Vue { |
||||||
|
urls = { |
||||||
|
tree: 'public/per/list', |
||||||
|
list: 'admin/role/list', |
||||||
|
save: 'admin/role/save', |
||||||
|
update: 'admin/role/update', |
||||||
|
del: 'admin/role/delete' |
||||||
|
}; |
||||||
|
|
||||||
|
rules = { |
||||||
|
code: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入角色编码', |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
min: 5, |
||||||
|
max: 45, |
||||||
|
message: '角色编码长度为5-45个字符', |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
], |
||||||
|
name: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入角色名称', |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
min: 2, |
||||||
|
max: 15, |
||||||
|
message: '角色名称长度为2-15个字符', |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
], |
||||||
|
desc: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入备注', |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
max: 100, |
||||||
|
message: '备注最多可包含100个字符', |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
props = [ |
||||||
|
{ |
||||||
|
code: 'code', |
||||||
|
name: '角色编码', |
||||||
|
readOnly: true, |
||||||
|
width: 120 |
||||||
|
}, { |
||||||
|
code: 'name', |
||||||
|
name: '角色名称', |
||||||
|
width: 120 |
||||||
|
}, { |
||||||
|
code: 'desc', |
||||||
|
name: '备注', |
||||||
|
width: 180 |
||||||
|
}, { |
||||||
|
code: 'status', |
||||||
|
name: '角色状态', |
||||||
|
dict: 'role_status', |
||||||
|
width: 100, |
||||||
|
hide: true |
||||||
|
}, |
||||||
|
] |
||||||
|
|
||||||
|
actions = [{ |
||||||
|
type: 'success', |
||||||
|
name: '分配权限', |
||||||
|
width: 170, |
||||||
|
emit: 'per', |
||||||
|
url: this.urls.update |
||||||
|
}]; |
||||||
|
|
||||||
|
param = {}; |
||||||
|
perTree = []; |
||||||
|
flag = { |
||||||
|
per: false |
||||||
|
}; |
||||||
|
|
||||||
|
queryPerTree() { |
||||||
|
const that = this |
||||||
|
this.$get(this.urls.tree).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.perTree = response |
||||||
|
} else { |
||||||
|
that.perTree = [] |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
per(row) { |
||||||
|
this.param = JSON.parse(JSON.stringify(row)) |
||||||
|
this.param.flag = true |
||||||
|
this.flag.per = true |
||||||
|
if (this.$refs.tree != null) { |
||||||
|
this.$refs.tree.setCheckedNodes(row.permissions) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
setPre() { |
||||||
|
const that = this |
||||||
|
const param = JSON.parse(JSON.stringify(that.param)) |
||||||
|
param.permissions = that.$refs.tree.getCheckedKeys() |
||||||
|
this.$post(this.urls.update, param).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.$refs.template.query(1); |
||||||
|
that.flag.per = false |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
checkChange(data, checked) { |
||||||
|
const child = this.$refs.tree.getNode(data).childNodes |
||||||
|
if (child != null && child.length > 0) { |
||||||
|
for (let i = 0; i < child.length; i++) { |
||||||
|
child[i].checked = checked |
||||||
|
this.checkChange(data.children[i], checked) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
created() { |
||||||
|
this.queryPerTree() |
||||||
|
this.$store.commit('getActionPers', 'role') |
||||||
|
} |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() { |
||||||
|
this.$store.commit('getDictMap', ['role_status']) |
||||||
|
} // 生命周期 - 创建之前 |
||||||
|
|
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style> |
||||||
|
#role { |
||||||
|
padding: 20px 20px 0px 20px; |
||||||
|
} |
||||||
|
|
||||||
|
.module-row { |
||||||
|
background-color: #ecf5ff !important; |
||||||
|
} |
||||||
|
|
||||||
|
.group-row { |
||||||
|
background-color: #f0f9eb !important; |
||||||
|
} |
||||||
|
|
||||||
|
.view-row { |
||||||
|
background-color: oldlace !important; |
||||||
|
} |
||||||
|
|
||||||
|
.action-row { |
||||||
|
background-color: #c5f9e6 !important; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,189 @@ |
|||||||
|
<template> |
||||||
|
<div id="user"> |
||||||
|
<Template ref="template" name="用户" :urls="urls" :terms="terms" :props="props" :rules="rules" :actions="actions" |
||||||
|
@reset="reset" stateProp="status"></Template> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
Vue, |
||||||
|
Component, |
||||||
|
Prop, |
||||||
|
Watch |
||||||
|
} from 'vue-property-decorator'; |
||||||
|
import md5 from 'js-md5'; |
||||||
|
import { |
||||||
|
userName, |
||||||
|
password, |
||||||
|
name, |
||||||
|
idCard, |
||||||
|
phone, |
||||||
|
email |
||||||
|
} from '@/static/tool/validate.js'; |
||||||
|
import Template from '@/components/template/manage.vue'; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
components: { |
||||||
|
Template |
||||||
|
} |
||||||
|
}) |
||||||
|
export default class User extends Vue { |
||||||
|
urls = { |
||||||
|
list: 'admin/user/list', |
||||||
|
save: 'admin/user/save', |
||||||
|
update: 'admin/user/update', |
||||||
|
reset: 'admin/user/reset', |
||||||
|
del: 'admin/user/delete' |
||||||
|
}; |
||||||
|
|
||||||
|
rules = { |
||||||
|
userId: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入用户名', |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
validator: userName, |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
], |
||||||
|
key: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入密码', |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
validator: password, |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
], |
||||||
|
roles: [{ |
||||||
|
required: true, |
||||||
|
message: '请选择用户角色', |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
name: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入用户姓名', |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
validator: name, |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
], |
||||||
|
idCard: [{ |
||||||
|
validator: idCard, |
||||||
|
trigger: 'blur' |
||||||
|
}], |
||||||
|
phone: [{ |
||||||
|
required: true, |
||||||
|
message: '请输入电话号码', |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
validator: phone, |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
], |
||||||
|
email: [{ |
||||||
|
validator: email, |
||||||
|
trigger: 'blur' |
||||||
|
}, |
||||||
|
{ |
||||||
|
min: 5, |
||||||
|
max: 32, |
||||||
|
message: '邮箱长度为5-32位', |
||||||
|
trigger: 'blur' |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
terms = [{ |
||||||
|
code: 'userId', |
||||||
|
desc: '用户名' |
||||||
|
}, { |
||||||
|
code: 'name', |
||||||
|
desc: '姓名' |
||||||
|
}, ]; |
||||||
|
|
||||||
|
props = [{ |
||||||
|
code: 'userId', |
||||||
|
name: '用户名', |
||||||
|
readOnly: true, |
||||||
|
width: 120 |
||||||
|
}, { |
||||||
|
code: 'key', |
||||||
|
name: '密码', |
||||||
|
tableHide: true, |
||||||
|
modifyHide: true |
||||||
|
}, { |
||||||
|
code: 'roles', |
||||||
|
name: '用户角色', |
||||||
|
tableHide: true, |
||||||
|
state: 'roles', |
||||||
|
multiple: true |
||||||
|
}, { |
||||||
|
code: 'name', |
||||||
|
name: '姓名', |
||||||
|
width: 100 |
||||||
|
}, { |
||||||
|
code: 'phone', |
||||||
|
name: '手机号码', |
||||||
|
width: 130 |
||||||
|
}, { |
||||||
|
code: 'idCard', |
||||||
|
name: '身份证号码', |
||||||
|
width: 180 |
||||||
|
}, { |
||||||
|
code: 'email', |
||||||
|
name: '邮箱', |
||||||
|
width: 180 |
||||||
|
}] |
||||||
|
|
||||||
|
actions = [{ |
||||||
|
type: 'warning', |
||||||
|
name: '重置密码', |
||||||
|
width: 170, |
||||||
|
emit: 'reset', |
||||||
|
url: this.urls.reset |
||||||
|
}]; |
||||||
|
|
||||||
|
reset(row) { |
||||||
|
const that = this |
||||||
|
this.$confirm('确定要重置用户‘' + row.userId + '’的密码吗?', '提示', { |
||||||
|
confirmButtonText: '确定', |
||||||
|
cancelButtonText: '取消', |
||||||
|
type: 'warning' |
||||||
|
}).then(() => { |
||||||
|
that.$post(that.urls.reset, row).then(function(response) { |
||||||
|
if (response) { |
||||||
|
that.queryList() |
||||||
|
} |
||||||
|
}) |
||||||
|
}).catch(() => { |
||||||
|
showMessage('info', '已取消重置密码') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
created() { |
||||||
|
this.$store.commit('getActionPers', 'user') |
||||||
|
this.$store.commit('queryRoleMap') |
||||||
|
} |
||||||
|
|
||||||
|
mounted() {} // 生命周期 - 挂载完成(可以访问DOM元素) |
||||||
|
beforeCreate() {} // 生命周期 - 创建之前 |
||||||
|
beforeMount() {} // 生命周期 - 挂载之前 |
||||||
|
beforeUpdate() {} // 生命周期 - 更新之前 |
||||||
|
updated() {} // 生命周期 - 更新之后 |
||||||
|
beforeDestroy() {} // 生命周期 - 销毁之前 |
||||||
|
destroyed() {} // 生命周期 - 销毁完成 |
||||||
|
activated() {} // 如果页面有keep-alive缓存功能,这个函数会触发 |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style> |
||||||
|
#user { |
||||||
|
padding: 20px 20px 0px 20px; |
||||||
|
} |
||||||
|
</style> |
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue