From 6f6a3566ac50bcb9bcae4ae68744c9f49b75933c Mon Sep 17 00:00:00 2001 From: 疯狂的狮子li <15040126243@163.com> Date: 星期日, 26 九月 2021 17:15:40 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into satoken --- /dev/null | 32 ----- ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java | 20 ++- ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java | 162 ++++++++++++++------------ ruoyi-ui/src/views/tool/gen/editTable.vue | 20 +- ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java | 3 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java | 32 +++++ ruoyi-generator/src/main/resources/vm/vue/index.vue.vm | 2 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java | 33 ++++ pom.xml | 8 ruoyi-admin/src/main/resources/application.yml | 27 ++++ README.md | 3 11 files changed, 210 insertions(+), 132 deletions(-) diff --git a/README.md b/README.md index fd4f62c..a7957e5 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ | 鍔熻兘浠嬬粛 | 浣跨敤鎶�鏈� | 鏂囨。鍦板潃 | 鐗规�ф敞鎰忎簨椤� | |---|---|---|---| | 褰撳墠妗嗘灦 | RuoYi-Vue-Plus | [RuoYi-Vue-Plus鏂囨。](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) | 閲嶅啓RuoYi-Vue鍏ㄦ柟浣嶅崌绾�(涓嶅吋瀹瑰師妗嗘灦) | +| satoken鍒嗘敮 | RuoYi-Vue-Plus-satoken | [satoken鍒嗘敮鍦板潃](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/) | 浣跨敤satoken閲嶆瀯鏉冮檺閴存潈(浠呬緵瀛︿範涓嶆帹鑽愪笂鐢熶骇) | +| 鍗曚綋鍒嗘敮 | RuoYi-Vue-Plus-fast | [fast鍒嗘敮鍦板潃](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) | 鍗曚綋搴旂敤缁撴瀯 | | 鍘熸鏋� | RuoYi-Vue | [RuoYi-Vue瀹樼綉](http://ruoyi.vip/) | 瀹氭湡鍚屾闇�瑕佺殑鍔熻兘 | | 鍓嶇寮�鍙戞鏋� | Vue銆丒lement UI | [Element UI瀹樼綉](https://element.eleme.cn/#/zh-CN) | | | 鍚庣寮�鍙戞鏋� | SpringBoot | [SpringBoot瀹樼綉](https://spring.io/projects/spring-boot/#learn) | | @@ -69,6 +71,7 @@ * 鍚屾鍗囩骇 RuoYi-Vue * GitHub 鍦板潃 [RuoYi-Vue-Plus-github](https://github.com/JavaLionLi/RuoYi-Vue-Plus) * 鍗曟ā鍧� fast 鍒嗘敮 [RuoYi-Vue-Plus-fast](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) +* satoken 鍒嗘敮 [RuoYi-Vue-Plus-satoken](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/) * 鐢ㄦ埛鎵╁睍椤圭洰 [鎵╁睍椤圭洰鍒楄〃](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4478302&doc_id=1469725) ## 鍔犵兢涓庢崘鐚� diff --git a/pom.xml b/pom.xml index 52ebaad..c6cb024 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ <properties> <ruoyi-vue-plus.version>3.1.0</ruoyi-vue-plus.version> - <spring-boot.version>2.5.4</spring-boot.version> + <spring-boot.version>2.5.5</spring-boot.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> @@ -26,14 +26,14 @@ <easyexcel.version>2.2.11</easyexcel.version> <velocity.version>1.7</velocity.version> <satoken.version>1.26.0</satoken.version> - <mybatis-plus.version>3.4.3.3</mybatis-plus.version> + <mybatis-plus.version>3.4.3.4</mybatis-plus.version> <p6spy.version>3.9.1</p6spy.version> <hutool.version>5.7.13</hutool.version> <feign.version>3.0.3</feign.version> <feign-okhttp.version>11.6</feign-okhttp.version> <okhttp.version>4.9.1</okhttp.version> <spring-boot-admin.version>2.5.1</spring-boot-admin.version> - <redisson.version>3.16.2</redisson.version> + <redisson.version>3.16.3</redisson.version> <lock4j.version>2.2.1</lock4j.version> <dynamic-ds.version>3.4.1</dynamic-ds.version> @@ -43,7 +43,7 @@ <!-- OSS 閰嶇疆 --> <qiniu.version>7.8.0</qiniu.version> <aliyun.oss.version>3.13.1</aliyun.oss.version> - <qcloud.cos.version>5.6.51</qcloud.cos.version> + <qcloud.cos.version>5.6.55</qcloud.cos.version> <minio.version>8.3.0</minio.version> <!-- docker 閰嶇疆 --> diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index b88f100..3d5e8df 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -122,6 +122,28 @@ # 鏄惁杈撳嚭鎿嶄綔鏃ュ織 is-log: true +# security閰嶇疆 +security: + # 鐧诲嚭璺緞 + logout-url: /logout + # 鍖垮悕璺緞 + anonymous: + - /login + - /register + - /captchaImage + # swagger 鏂囨。閰嶇疆 + - /doc.html + - /swagger-resources/** + - /webjars/** + - /*/api-docs + # druid 鐩戞帶閰嶇疆 + - /druid/** + # actuator 鐩戞帶閰嶇疆 + - /actuator + - /actuator/** + # 鐢ㄦ埛鏀捐 + permit-all: + # 閲嶅鎻愪氦 repeat-submit: # 鍏ㄥ眬闂撮殧鏃堕棿(姣) @@ -237,6 +259,11 @@ name: Lion Li email: crazylionli@163.com url: https://gitee.com/JavaLionLi/RuoYi-Vue-Plus + groups: + - name: 婕旂ず妗堜緥 + basePackage: com.ruoyi.demo + - name: 绯荤粺妯″潡 + basePackage: com.ruoyi.admin # 闃叉XSS鏀诲嚮 xss: diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java deleted file mode 100644 index 23a25e0..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ /dev/null @@ -1,260 +0,0 @@ -package com.ruoyi.common.core.redis; - -import com.google.common.collect.Lists; -import org.redisson.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; - -/** - * spring redis 宸ュ叿绫� - * - * @author shenxinquan - * @see com.ruoyi.common.utils.RedisUtils - * @deprecated 3.2.0 鍒犻櫎姝ょ被 - **/ -@SuppressWarnings(value = {"unchecked", "rawtypes"}) -@Component -@Deprecated -public class RedisCache { - - @Autowired - private RedissonClient redissonClient; - - /** - * 鍙戝竷閫氶亾娑堟伅 - * - * @param channelKey 閫氶亾key - * @param msg 鍙戦�佹暟鎹� - * @param consumer 鑷畾涔夊鐞� - */ - public <T> void publish(String channelKey, T msg, Consumer<T> consumer) { - RTopic topic = redissonClient.getTopic(channelKey); - topic.publish(msg); - consumer.accept(msg); - } - - public <T> void publish(String channelKey, T msg) { - RTopic topic = redissonClient.getTopic(channelKey); - topic.publish(msg); - } - - /** - * 璁㈤槄閫氶亾鎺ユ敹娑堟伅 - * - * @param channelKey 閫氶亾key - * @param clazz 娑堟伅绫诲瀷 - * @param consumer 鑷畾涔夊鐞� - */ - public <T> void subscribe(String channelKey, Class<T> clazz, Consumer<T> consumer) { - RTopic topic = redissonClient.getTopic(channelKey); - topic.addListener(clazz, (channel, msg) -> consumer.accept(msg)); - } - - /** - * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛� - * - * @param key 缂撳瓨鐨勯敭鍊� - * @param value 缂撳瓨鐨勫�� - */ - public <T> void setCacheObject(final String key, final T value) { - redissonClient.getBucket(key).set(value); - } - - /** - * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛� - * - * @param key 缂撳瓨鐨勯敭鍊� - * @param value 缂撳瓨鐨勫�� - * @param timeout 鏃堕棿 - * @param timeUnit 鏃堕棿棰楃矑搴� - */ - public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { - RBucket<T> result = redissonClient.getBucket(key); - result.set(value); - result.expire(timeout, timeUnit); - } - - /** - * 璁剧疆鏈夋晥鏃堕棿 - * - * @param key Redis閿� - * @param timeout 瓒呮椂鏃堕棿 - * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 - */ - public boolean expire(final String key, final long timeout) { - return expire(key, timeout, TimeUnit.SECONDS); - } - - /** - * 璁剧疆鏈夋晥鏃堕棿 - * - * @param key Redis閿� - * @param timeout 瓒呮椂鏃堕棿 - * @param unit 鏃堕棿鍗曚綅 - * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 - */ - public boolean expire(final String key, final long timeout, final TimeUnit unit) { - RBucket rBucket = redissonClient.getBucket(key); - return rBucket.expire(timeout, unit); - } - - /** - * 鑾峰緱缂撳瓨鐨勫熀鏈璞°�� - * - * @param key 缂撳瓨閿�� - * @return 缂撳瓨閿�煎搴旂殑鏁版嵁 - */ - public <T> T getCacheObject(final String key) { - RBucket<T> rBucket = redissonClient.getBucket(key); - return rBucket.get(); - } - - /** - * 鍒犻櫎鍗曚釜瀵硅薄 - * - * @param key - */ - public boolean deleteObject(final String key) { - return redissonClient.getBucket(key).delete(); - } - - /* */ - - /** - * 鍒犻櫎闆嗗悎瀵硅薄 - * - * @param collection 澶氫釜瀵硅薄 - * @return - */ - public void deleteObject(final Collection collection) { - RBatch batch = redissonClient.createBatch(); - collection.forEach(t->{ - batch.getBucket(t.toString()).deleteAsync(); - }); - batch.execute(); - } - - /** - * 缂撳瓨List鏁版嵁 - * - * @param key 缂撳瓨鐨勯敭鍊� - * @param dataList 寰呯紦瀛樼殑List鏁版嵁 - * @return 缂撳瓨鐨勫璞� - */ - public <T> boolean setCacheList(final String key, final List<T> dataList) { - RList<T> rList = redissonClient.getList(key); - return rList.addAll(dataList); - } - - /** - * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄 - * - * @param key 缂撳瓨鐨勯敭鍊� - * @return 缂撳瓨閿�煎搴旂殑鏁版嵁 - */ - public <T> List<T> getCacheList(final String key) { - RList<T> rList = redissonClient.getList(key); - return rList.readAll(); - } - - /** - * 缂撳瓨Set - * - * @param key 缂撳瓨閿�� - * @param dataSet 缂撳瓨鐨勬暟鎹� - * @return 缂撳瓨鏁版嵁鐨勫璞� - */ - public <T> boolean setCacheSet(final String key, final Set<T> dataSet) { - RSet<T> rSet = redissonClient.getSet(key); - return rSet.addAll(dataSet); - } - - /** - * 鑾峰緱缂撳瓨鐨剆et - * - * @param key - * @return - */ - public <T> Set<T> getCacheSet(final String key) { - RSet<T> rSet = redissonClient.getSet(key); - return rSet.readAll(); - } - - /** - * 缂撳瓨Map - * - * @param key - * @param dataMap - */ - public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { - if (dataMap != null) { - RMap<String, T> rMap = redissonClient.getMap(key); - rMap.putAll(dataMap); - } - } - - /** - * 鑾峰緱缂撳瓨鐨凪ap - * - * @param key - * @return - */ - public <T> Map<String, T> getCacheMap(final String key) { - RMap<String, T> rMap = redissonClient.getMap(key); - return rMap.getAll(rMap.keySet()); - } - - /** - * 寰�Hash涓瓨鍏ユ暟鎹� - * - * @param key Redis閿� - * @param hKey Hash閿� - * @param value 鍊� - */ - public <T> void setCacheMapValue(final String key, final String hKey, final T value) { - RMap<String, T> rMap = redissonClient.getMap(key); - rMap.put(hKey, value); - } - - /** - * 鑾峰彇Hash涓殑鏁版嵁 - * - * @param key Redis閿� - * @param hKey Hash閿� - * @return Hash涓殑瀵硅薄 - */ - public <T> T getCacheMapValue(final String key, final String hKey) { - RMap<String, T> rMap = redissonClient.getMap(key); - return rMap.get(hKey); - } - - /** - * 鑾峰彇澶氫釜Hash涓殑鏁版嵁 - * - * @param key Redis閿� - * @param hKeys Hash閿泦鍚� - * @return Hash瀵硅薄闆嗗悎 - */ - public <K,V> Map<K,V> getMultiCacheMapValue(final String key, final Set<K> hKeys) { - RMap<K,V> rMap = redissonClient.getMap(key); - return rMap.getAll(hKeys); - } - - /** - * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛� - * - * @param pattern 瀛楃涓插墠缂� - * @return 瀵硅薄鍒楄〃 - */ - public Collection<String> keys(final String pattern) { - Iterable<String> iterable = redissonClient.getKeys().getKeysByPattern(pattern); - return Lists.newArrayList(iterable); - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index 03c608a..bd7522c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -27,6 +27,9 @@ public static String getRealAddressByIP(String ip) { String address = UNKNOWN; + if (StringUtils.isBlank(ip)){ + return address; + } // 鍐呯綉涓嶆煡璇� ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); if (NetUtil.isInnerIP(ip)) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java deleted file mode 100644 index b5b7de3..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ruoyi.framework.config; - -import javax.servlet.http.HttpServletRequest; -import org.springframework.stereotype.Component; -import com.ruoyi.common.utils.ServletUtils; - -/** - * 鏈嶅姟鐩稿叧閰嶇疆 - * - * @author ruoyi - */ -@Component -public class ServerConfig -{ - /** - * 鑾峰彇瀹屾暣鐨勮姹傝矾寰勶紝鍖呮嫭锛氬煙鍚嶏紝绔彛锛屼笂涓嬫枃璁块棶璺緞 - * - * @return 鏈嶅姟鍦板潃 - */ - public String getUrl() - { - HttpServletRequest request = ServletUtils.getRequest(); - return getDomain(request); - } - - public static String getDomain(HttpServletRequest request) - { - StringBuffer url = request.getRequestURL(); - String contextPath = request.getServletContext().getContextPath(); - return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java index 2c65ac6..4da3b99 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java @@ -1,11 +1,12 @@ package com.ruoyi.framework.config; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import com.ruoyi.common.properties.TokenProperties; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.SwaggerProperties; -import io.swagger.annotations.ApiOperation; import io.swagger.models.auth.In; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; @@ -15,6 +16,7 @@ import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; +import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; @@ -27,82 +29,92 @@ @EnableKnife4j public class SwaggerConfig { - @Autowired - private SwaggerProperties swaggerProperties; + @Autowired + private SwaggerProperties swaggerProperties; - /** - * 鍒涘缓API - */ - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.OAS_30) - .enable(swaggerProperties.getEnabled()) - // 鐢ㄦ潵鍒涘缓璇PI鐨勫熀鏈俊鎭紝灞曠ず鍦ㄦ枃妗g殑椤甸潰涓紙鑷畾涔夊睍绀虹殑淇℃伅锛� - .apiInfo(apiInfo()) - // 璁剧疆鍝簺鎺ュ彛鏆撮湶缁橲wagger灞曠ず - .select() - // 鎵弿鎵�鏈夋湁娉ㄨВ鐨刟pi锛岀敤杩欑鏂瑰紡鏇寸伒娲� - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) - // 鎵弿鎸囧畾鍖呬腑鐨剆wagger娉ㄨВ - // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) - // 鎵弿鎵�鏈� .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build() - /* 璁剧疆瀹夊叏妯″紡锛宻wagger鍙互璁剧疆璁块棶token */ - .securitySchemes(securitySchemes()) - .securityContexts(securityContexts()) - .pathMapping(swaggerProperties.getPathMapping()); - } + @Autowired + private TokenProperties tokenProperties; - /** - * 瀹夊叏妯″紡锛岃繖閲屾寚瀹歵oken閫氳繃Authorization澶磋姹傚ご浼犻�� - */ - private List<SecurityScheme> securitySchemes() { - List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>(); - apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); - return apiKeyList; - } + /** + * 鍒涘缓API + */ + @PostConstruct + public void createRestApi() { + for (SwaggerProperties.Groups group : swaggerProperties.getGroups()) { + String basePackage = group.getBasePackage(); + Docket docket = new Docket(DocumentationType.OAS_30) + .enable(swaggerProperties.getEnabled()) + // 鐢ㄦ潵鍒涘缓璇PI鐨勫熀鏈俊鎭紝灞曠ず鍦ㄦ枃妗g殑椤甸潰涓紙鑷畾涔夊睍绀虹殑淇℃伅锛� + .apiInfo(apiInfo()) + // 璁剧疆鍝簺鎺ュ彛鏆撮湶缁橲wagger灞曠ず + .select() + // 鎵弿鎵�鏈夋湁娉ㄨВ鐨刟pi锛岀敤杩欑鏂瑰紡鏇寸伒娲� + //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 鎵弿鎸囧畾鍖呬腑鐨剆wagger娉ㄨВ + .apis(RequestHandlerSelectors.basePackage(basePackage)) + // 鎵弿鎵�鏈� .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + .groupName(group.getName()) + // 璁剧疆瀹夊叏妯″紡锛宻wagger鍙互璁剧疆璁块棶token + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(swaggerProperties.getPathMapping()); + String beanName = StringUtils.substringAfterLast(basePackage, ".") + "Docket"; + SpringUtils.registerBean(beanName, docket); + } + } - /** - * 瀹夊叏涓婁笅鏂� - */ - private List<SecurityContext> securityContexts() { - List<SecurityContext> securityContexts = new ArrayList<>(); - securityContexts.add( - SecurityContext.builder() - .securityReferences(defaultAuth()) - .operationSelector(o -> o.requestMappingPattern().matches("/.*")) - .build()); - return securityContexts; - } + /** + * 瀹夊叏妯″紡锛岃繖閲屾寚瀹歵oken閫氳繃Authorization澶磋姹傚ご浼犻�� + */ + private List<SecurityScheme> securitySchemes() { + List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>(); + String header = tokenProperties.getHeader(); + apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue())); + return apiKeyList; + } - /** - * 榛樿鐨勫畨鍏ㄤ笂寮曠敤 - */ - private List<SecurityReference> defaultAuth() { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - List<SecurityReference> securityReferences = new ArrayList<>(); - securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); - return securityReferences; - } + /** + * 瀹夊叏涓婁笅鏂� + */ + private List<SecurityContext> securityContexts() { + List<SecurityContext> securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } - /** - * 娣诲姞鎽樿淇℃伅 - */ - private ApiInfo apiInfo() { - // 鐢ˋpiInfoBuilder杩涜瀹氬埗 - SwaggerProperties.Contact contact = swaggerProperties.getContact(); - return new ApiInfoBuilder() - // 璁剧疆鏍囬 - .title(swaggerProperties.getTitle()) - // 鎻忚堪 - .description(swaggerProperties.getDescription()) - // 浣滆�呬俊鎭� - .contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) - // 鐗堟湰 - .version(swaggerProperties.getVersion()) - .build(); - } + /** + * 榛樿鐨勫畨鍏ㄤ笂寮曠敤 + */ + private List<SecurityReference> defaultAuth() { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List<SecurityReference> securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference(tokenProperties.getHeader(), authorizationScopes)); + return securityReferences; + } + + /** + * 娣诲姞鎽樿淇℃伅 + */ + private ApiInfo apiInfo() { + // 鐢ˋpiInfoBuilder杩涜瀹氬埗 + SwaggerProperties.Contact contact = swaggerProperties.getContact(); + return new ApiInfoBuilder() + // 璁剧疆鏍囬 + .title(swaggerProperties.getTitle()) + // 鎻忚堪 + .description(swaggerProperties.getDescription()) + // 浣滆�呬俊鎭� + .contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) + // 鐗堟湰 + .version(swaggerProperties.getVersion()) + .build(); + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java new file mode 100644 index 0000000..c83ffcc --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java @@ -0,0 +1,32 @@ +package com.ruoyi.framework.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Security 閰嶇疆灞炴�� + * + * @author Lion Li + */ +@Data +@Component +@ConfigurationProperties(prefix = "security") +public class SecurityProperties { + + /** + * 閫�鍑虹櫥褰晆rl + */ + private String logoutUrl; + + /** + * 鍖垮悕鏀捐璺緞 + */ + private String[] anonymous; + + /** + * 鐢ㄦ埛浠绘剰璁块棶鏀捐璺緞 + */ + private String[] permitAll; + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java index ece75ef..9c4cd23 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java @@ -5,6 +5,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; +import java.util.List; + /** * swagger 閰嶇疆灞炴�� * @@ -41,23 +43,46 @@ */ private Contact contact; + /** + * 缁勯厤缃� + */ + private List<Groups> groups; + @Data @NoArgsConstructor - public static class Contact{ + public static class Contact { /** * 鑱旂郴浜� - **/ + */ private String name; + /** * 鑱旂郴浜簎rl - **/ + */ private String url; + /** * 鑱旂郴浜篹mail - **/ + */ private String email; } + @Data + @NoArgsConstructor + public static class Groups { + + /** + * 缁勫悕 + */ + private String name; + + /** + * 鍩虹鍖呰矾寰� + */ + private String basePackage; + + } + } diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm index 1644929..99e05c1 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -557,7 +557,7 @@ /** ${subTable.functionName}鍒犻櫎鎸夐挳鎿嶄綔 */ handleDelete${subClassName}() { if (this.checked${subClassName}.length == 0) { - this.msgError("璇峰厛閫夋嫨瑕佸垹闄ょ殑${subTable.functionName}鏁版嵁"); + this.#[[$modal]]#.msgError("璇峰厛閫夋嫨瑕佸垹闄ょ殑${subTable.functionName}鏁版嵁"); } else { const ${subclassName}List = this.${subclassName}List; const checked${subClassName} = this.checked${subClassName}; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java index 6bee29f..3207a46 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -77,9 +77,14 @@ asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"), request); throw new UserPasswordNotMatchException(); } + else + { + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage(), request); + throw new ServiceException(e.getMessage()); + } asyncService.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); - recordLoginInfo(user); + recordLoginInfo(user.getUserId()); // 鐢熸垚token StpUtil.login(user.getUserId(), "PC"); return StpUtil.getTokenValue(); @@ -109,12 +114,15 @@ /** * 璁板綍鐧诲綍淇℃伅 + * + * @param userId 鐢ㄦ埛ID */ - public void recordLoginInfo(SysUser user) + public void recordLoginInfo(Long userId) { - user.setLoginIp(ServletUtils.getClientIP()); - user.setLoginDate(DateUtils.getNowDate()); - user.setUpdateBy(user.getUserName()); - userService.updateUserProfile(user); + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(ServletUtils.getClientIP()); + sysUser.setLoginDate(DateUtils.getNowDate()); + userService.updateUserProfile(sysUser); } } diff --git a/ruoyi-ui/src/views/tool/gen/editTable.vue b/ruoyi-ui/src/views/tool/gen/editTable.vue index b9ad258..95b12cf 100644 --- a/ruoyi-ui/src/views/tool/gen/editTable.vue +++ b/ruoyi-ui/src/views/tool/gen/editTable.vue @@ -4,8 +4,8 @@ <el-tab-pane label="鍩烘湰淇℃伅" name="basic"> <basic-info-form ref="basicInfo" :info="info" /> </el-tab-pane> - <el-tab-pane label="瀛楁淇℃伅" name="cloum"> - <el-table ref="dragTable" :data="cloumns" row-key="columnId" :max-height="tableHeight"> + <el-tab-pane label="瀛楁淇℃伅" name="columnInfo"> + <el-table ref="dragTable" :data="columns" row-key="columnId" :max-height="tableHeight"> <el-table-column label="搴忓彿" type="index" min-width="5%" class-name="allowDrag" /> <el-table-column label="瀛楁鍒楀悕" @@ -141,13 +141,13 @@ data() { return { // 閫変腑閫夐」鍗$殑 name - activeName: "cloum", + activeName: "columnInfo", // 琛ㄦ牸鐨勯珮搴� tableHeight: document.documentElement.scrollHeight - 245 + "px", // 琛ㄤ俊鎭� tables: [], // 琛ㄥ垪淇℃伅 - cloumns: [], + columns: [], // 瀛楀吀淇℃伅 dictOptions: [], // 鑿滃崟淇℃伅 @@ -161,7 +161,7 @@ if (tableId) { // 鑾峰彇琛ㄨ缁嗕俊鎭� getGenTable(tableId).then(res => { - this.cloumns = res.data.rows; + this.columns = res.data.rows; this.info = res.data.info; this.tables = res.data.tables; }); @@ -184,7 +184,7 @@ const validateResult = res.every(item => !!item); if (validateResult) { const genTable = Object.assign({}, basicForm.model, genForm.model); - genTable.columns = this.cloumns; + genTable.columns = this.columns; genTable.params = { treeCode: genTable.treeCode, treeName: genTable.treeName, @@ -220,10 +220,10 @@ const sortable = Sortable.create(el, { handle: ".allowDrag", onEnd: evt => { - const targetRow = this.cloumns.splice(evt.oldIndex, 1)[0]; - this.cloumns.splice(evt.newIndex, 0, targetRow); - for (let index in this.cloumns) { - this.cloumns[index].sort = parseInt(index) + 1; + const targetRow = this.columns.splice(evt.oldIndex, 1)[0]; + this.columns.splice(evt.newIndex, 0, targetRow); + for (let index in this.columns) { + this.columns[index].sort = parseInt(index) + 1; } } }); -- Gitblit v1.9.3