ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetPermissionConfigurationDTO.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.chargingPile.api.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; import java.util.Map; /** * @author zhibing.pu * @Date 2024/8/9 10:30 */ @Data @ApiModel public class GetPermissionConfigurationDTO { @ApiModelProperty(value = "备注") private String permissionRemarks; @ApiModelProperty(value = "权限菜单") private Map<String, Object> menu; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/GetSiteListDTO.java
@@ -43,4 +43,12 @@ private Integer accountingStrategyId; @ApiModelProperty("计费策略类型(1=平台添加,2=自定义策略)") private Integer accountingStrategyType; @ApiModelProperty(value = "计费策略权限") private boolean authAccountingStrategy = true; @ApiModelProperty(value = "合作商权限") private boolean authPartner = true; @ApiModelProperty(value = "编辑权限") private boolean authUpdate = true; @ApiModelProperty(value = "删除权限") private boolean authDelete = true; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PageChargingPileListDTO.java
@@ -37,5 +37,13 @@ private String equipmentType; @ApiModelProperty(value = "额定功率") private BigDecimal ratedPower; @ApiModelProperty(value = "查看权限") private boolean authQueryInfo = true; @ApiModelProperty(value = "编辑权限") private boolean authUpdate = true; @ApiModelProperty(value = "删除权限") private boolean authDelete = true; @ApiModelProperty(value = "新增接口权限") private boolean authAddChargingGun = true; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java
@@ -98,4 +98,9 @@ @TableField("password") @ApiModelProperty(value = "登录密码", required = true) private String password; /** * 权限备注 */ @TableField("permission_remarks") private String permissionRemarks; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TSiteMenu.java
@@ -64,7 +64,7 @@ @TableField("is_cache") private Integer isCache; @ApiModelProperty(value = "菜单类型(M目录 C菜单 F按钮)") @ApiModelProperty(value = "菜单类型(M目录 C菜单 F按钮 D数据)") @TableField("menu_type") private String menuType; ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/SetPermissionConfiguration.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.chargingPile.api.query; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2024/8/9 11:13 */ @Data @ApiModel public class SetPermissionConfiguration { @ApiModelProperty(value = "备注") private String permissionRemarks; @ApiModelProperty(value = "权限菜单id数组", required = true) private List<Integer> menuId; @ApiModelProperty(value = "站点id", required = true) private Integer siteId; @ApiModelProperty(value = "合作商id", required = true) private Integer partnerId; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingGunVO.java
@@ -11,5 +11,23 @@ @ApiModelProperty(value = "策略名称") private String strategyName; @ApiModelProperty(value = "编辑权限") private boolean authUpdate = true; @ApiModelProperty(value = "删除权限") private boolean authDelete = true; @ApiModelProperty(value = "查看费率权限") private boolean authViewRates = true; @ApiModelProperty(value = "编辑权限") private boolean authDownloadQRCode = true; @ApiModelProperty(value = "编辑权限") private boolean authQueryInfo = true; @ApiModelProperty(value = "编辑权限") private boolean authEndCharge = true; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
@@ -62,11 +62,6 @@ /** 用户头像 */ private String avatar; /** * 登录账号 */ @TableField("account") private String account; /** 密码 */ @NotBlank(message = "密码不能为空") @@ -269,14 +264,6 @@ public void setAvatar(String avatar) { this.avatar = avatar; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -86,11 +86,6 @@ } @Override public R<SysUser> queryUserByAccount(String account) { return null; } @Override public R<SysUser> queryUserByUserName(String userName) { return R.fail("通过账号查询用户失败:" + cause.getMessage()); } @@ -102,7 +97,7 @@ @Override public R resetPassword(SysUser user) { return null; return R.fail("重置用户密码失败:" + cause.getMessage()); } }; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
@@ -86,15 +86,6 @@ */ @PostMapping("/user/queryUserByPhone") R<SysUser> queryUserByPhone(@RequestBody String phone); /** * 根据账号获取用户数据 * @param account * @return */ @PostMapping("/user/queryUserByAccount") R<SysUser> queryUserByAccount(@RequestBody String account); /** * 通过账号查询用户 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -1,5 +1,7 @@ package com.ruoyi.gateway.filter; import com.alibaba.fastjson.JSONObject; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -7,7 +9,10 @@ import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import com.ruoyi.common.core.constant.CacheConstants; @@ -20,7 +25,14 @@ import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties; import io.jsonwebtoken.Claims; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicReference; /** * 网关鉴权 @@ -37,9 +49,6 @@ @Autowired private RedisService redisService; @Value("${security.sign}") private boolean parameter_signature; @Override @@ -70,15 +79,7 @@ if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) { return unauthorizedResponse(exchange, "令牌验证失败"); } if(parameter_signature){ String sign = request.getHeaders().getFirst(TokenConstants.SING); String nonce_str = request.getHeaders().getFirst(TokenConstants.NONCE_STR); if(StringUtils.isEmpty(sign) || StringUtils.isEmpty(nonce_str)){ log.error("[鉴权签名异常处理]请求路径:{}", exchange.getRequest().getPath()); return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "签名校验失败", HttpStatus.BAD_REQUEST); } } // 设置用户信息到请求 addHeader(mutate, SecurityConstants.USER_KEY, userkey); addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid); @@ -126,10 +127,11 @@ } return token; } @Override public int getOrder() { return -200; return -300; } } ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java
New file @@ -0,0 +1,98 @@ package com.ruoyi.gateway.filter; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.constant.HttpStatus; import com.ruoyi.common.core.constant.TokenConstants; import com.ruoyi.common.core.utils.ServletUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.html.EscapeUtil; import com.ruoyi.gateway.config.properties.XssProperties; import io.netty.buffer.ByteBufAllocator; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.*; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicReference; /** * 跨站脚本过滤器 * * @author ruoyi */ @Component public class RequestParamGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange); return chain.filter(exchange.mutate().request(httpRequestDecorator).build()); } private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) { ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) { @Override public Flux<DataBuffer> getBody() { Flux<DataBuffer> body = super.getBody(); return body.buffer().map(dataBuffers -> { DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); DataBuffer join = dataBufferFactory.join(dataBuffers); byte[] content = new byte[join.readableByteCount()]; join.read(content); DataBufferUtils.release(join); String bodyStr = new String(content, StandardCharsets.UTF_8); // 转成字节 byte[] bytes = bodyStr.getBytes(); NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT); DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length); buffer.write(bytes); return buffer; }); } @Override public HttpHeaders getHeaders() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length httpHeaders.remove(HttpHeaders.CONTENT_LENGTH); httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); return httpHeaders; } }; return serverHttpRequestDecorator; } @Override public int getOrder() { return HIGHEST_PRECEDENCE; } } ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
New file @@ -0,0 +1,181 @@ package com.ruoyi.gateway.filter; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.HttpStatus; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.TokenConstants; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.ServletUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties; import io.jsonwebtoken.Claims; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequestDecorator; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicReference; /** * 网关鉴权 * * @author ruoyi */ @Component public class SignFilter implements GlobalFilter, Ordered { private static final Logger log = LoggerFactory.getLogger(SignFilter.class); // 排除过滤的 uri 地址,nacos自行添加 @Autowired private IgnoreWhiteProperties ignoreWhite; @Autowired private RedisService redisService; @Value("${security.sign}") private boolean parameter_signature; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest.Builder mutate = request.mutate(); HttpMethod method = request.getMethod(); if(method != HttpMethod.POST){ return chain.filter(exchange.mutate().request(mutate.build()).build()); } String sing = request.getHeaders().getFirst(TokenConstants.SING); String nonce_str = request.getHeaders().getFirst(TokenConstants.NONCE_STR); if (parameter_signature && StringUtils.isEmpty(sing)) { return unauthorizedResponse(exchange, "签名不能为空!"); } if (parameter_signature && StringUtils.isEmpty(nonce_str)) { return unauthorizedResponse(exchange, "签名不能为空!"); } if(parameter_signature && !authSign(exchange)){ return unauthorizedResponse(exchange, "签名不通过!"); } return chain.filter(exchange.mutate().request(mutate.build()).build()); } private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) { log.error("[签名异常处理]请求路径:{}", exchange.getRequest().getPath()); return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.BAD_REQUEST); } /** * 校验签名 * @param exchange * @return */ private boolean authSign(ServerWebExchange exchange){ return false; } /** * 签名校验 * @param httpRequestDecorator * @return */ private boolean authSign(ServerHttpRequestDecorator httpRequestDecorator) { HttpHeaders headers = httpRequestDecorator.getHeaders(); Flux<DataBuffer> body = httpRequestDecorator.getBody(); AtomicReference<JSONObject> jsonObject = new AtomicReference<>(new JSONObject()); httpRequestDecorator.getBody().map(dataBuffers -> dataBuffers.toString()); JSONObject params = jsonObject.get(); String sign = headers.getFirst(TokenConstants.SING); if(StringUtils.isEmpty(sign)){ return false; } String nonce_str = headers.getFirst(TokenConstants.NONCE_STR); if(StringUtils.isEmpty(nonce_str)){ return false; } String signUrlEncode = localSignUrl(params, nonce_str); signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(") .replaceAll("& #41;", "\\)") .replaceAll("\\+", " "); if(sign.equals(signUrlEncode)){ return true; } return false; } /** * 组装签名路径 * @param params * @return */ public static String localSignUrl(JSONObject params, String key) { List<String> keySet = new ArrayList<>(params.keySet()); // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) Collections.sort(keySet, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); // 构造签名键值对的格式 StringBuilder sb = new StringBuilder(); for (String k : keySet) { String v = params.getString(k); if(StringUtils.isNotEmpty(v)){ sb.append(k + "=" + v + "&"); } } String signUrl = sb.substring(0, sb.length() - 1); return signUrlEncode(signUrl, key); } /** * 签名字符串加密 * @param signUrl * @param encryptKey * @return */ public static String signUrlEncode(String signUrl, String encryptKey) { byte[] signByte = new byte[0]; try { signByte = HMACSHA1.HmacSHA1Encrypt(signUrl, encryptKey); } catch (Exception e) { throw new RuntimeException(e); } String localSign = Base64.encodeBase64String(signByte); return localSign; } @Override public int getOrder() { return -200; } } ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
@@ -50,52 +50,41 @@ // 跨站脚本的 xss 配置,nacos自行添加 @Autowired private XssProperties xss; @Value("${security.sign}") private boolean parameter_signature; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); // xss开关未开启 或 通过nacos关闭,不过滤 if (!xss.getEnabled()) { if (!xss.getEnabled()) { return chain.filter(exchange); } // GET DELETE 不过滤 HttpMethod method = request.getMethod(); if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) { if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) { return chain.filter(exchange); } // 非json类型,不过滤 if (!isJsonRequest(exchange)) { if (!isJsonRequest(exchange)) { return chain.filter(exchange); } // excludeUrls 不过滤 String url = request.getURI().getPath(); if (StringUtils.matches(url, xss.getExcludeUrls())) { if (StringUtils.matches(url, xss.getExcludeUrls())) { return chain.filter(exchange); } ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange); if(parameter_signature && !authSign(httpRequestDecorator)){ log.error("[鉴权签名异常处理]请求路径:{}", exchange.getRequest().getPath()); return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "签名校验失败", HttpStatus.BAD_REQUEST); } return chain.filter(exchange.mutate().request(httpRequestDecorator).build()); } private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) { ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) { private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) { ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) { @Override public Flux<DataBuffer> getBody() { public Flux<DataBuffer> getBody() { Flux<DataBuffer> body = super.getBody(); return body.buffer().map(dataBuffers -> { DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); @@ -116,8 +105,7 @@ } @Override public HttpHeaders getHeaders() { public HttpHeaders getHeaders() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length @@ -135,104 +123,10 @@ * * @param exchange HTTP请求 */ public boolean isJsonRequest(ServerWebExchange exchange) { public boolean isJsonRequest(ServerWebExchange exchange) { String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); } /** * 签名校验 * @param httpRequestDecorator * @return */ private boolean authSign(ServerHttpRequestDecorator httpRequestDecorator) { HttpHeaders headers = httpRequestDecorator.getHeaders(); AtomicReference<JSONObject> jsonObject = new AtomicReference<>(new JSONObject()); httpRequestDecorator.getBody().buffer().map(dataBuffers -> { DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); DataBuffer join = dataBufferFactory.join(dataBuffers); byte[] content = new byte[join.readableByteCount()]; join.read(content); DataBufferUtils.release(join); String bodyStr = new String(content, StandardCharsets.UTF_8); jsonObject.set(JSON.parseObject(bodyStr)); // 防xss攻击过滤 bodyStr = EscapeUtil.clean(bodyStr); // 转成字节 byte[] bytes = bodyStr.getBytes(); NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT); DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length); buffer.write(bytes); return buffer; }); JSONObject params = jsonObject.get(); String sign = headers.getFirst(TokenConstants.SING); if(StringUtils.isEmpty(sign)){ return false; } String nonce_str = headers.getFirst(TokenConstants.NONCE_STR); if(StringUtils.isEmpty(nonce_str)){ return false; } String signUrlEncode = localSignUrl(params, nonce_str); signUrlEncode = signUrlEncode.replaceAll("& #40;", "\\(") .replaceAll("& #41;", "\\)") .replaceAll("\\+", " "); if(sign.equals(signUrlEncode)){ return true; } return false; } /** * 组装签名路径 * @param params * @return */ public static String localSignUrl(JSONObject params, String key) { List<String> keySet = new ArrayList<>(params.keySet()); // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) Collections.sort(keySet, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); // 构造签名键值对的格式 StringBuilder sb = new StringBuilder(); for (String k : keySet) { String v = params.getString(k); if(StringUtils.isNotEmpty(v)){ sb.append(k + "=" + v + "&"); } } String signUrl = sb.substring(0, sb.length() - 1); return signUrlEncode(signUrl, key); } /** * 签名字符串加密 * @param signUrl * @param encryptKey * @return */ public static String signUrlEncode(String signUrl, String encryptKey) { byte[] signByte = new byte[0]; try { signByte = HMACSHA1.HmacSHA1Encrypt(signUrl, encryptKey); } catch (Exception e) { throw new RuntimeException(e); } String localSign = Base64.encodeBase64String(signByte); return localSign; } @Override public int getOrder() ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -356,7 +356,7 @@ } @PostMapping("/updateSysUser") @Transactional(propagation = Propagation.REQUIRES_NEW) @Transactional(rollbackFor = Exception.class) public R<Boolean> updateSysUser(@RequestBody SysUser sysUser) { try { sysUser.setUpdateBy(SecurityUtils.getUsername()); @@ -675,19 +675,6 @@ .last("LIMIT 1")); return R.ok(user); } /** * 根据账号获取用户数据 * @param account * @return */ @PostMapping("/queryUserByAccount") public R<SysUser> queryUserByAccount(@RequestBody String account){ SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class) .eq(SysUser::getAccount, account) .eq(SysUser::getDelFlag, "0")); return R.ok(user); } /** @@ -711,7 +698,7 @@ */ @ResponseBody @PostMapping("/addSysUser") @Transactional(propagation = Propagation.REQUIRES_NEW) @Transactional(rollbackFor = Exception.class) public R addSysUser(@RequestBody SysUser user){ user.setUserName(user.getPhonenumber()); if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){ @@ -720,7 +707,7 @@ if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { throw new RuntimeException("手机号已开通账号"); } if (StringUtils.isNotEmpty(user.getAccount()) && !userService.checkAccountUnique(user)) { if (StringUtils.isNotEmpty(user.getUserName()) && !userService.checkUserNameUnique(user)) { throw new RuntimeException("登录账号已存在"); } user.setCreateBy(SecurityUtils.getUsername()); ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -121,13 +121,6 @@ */ public SysUser checkPhoneUnique(String phonenumber); /** * 校验登录账号是否唯一 * @param account 登录账号 * @return */ SysUser checkAccountUnique(String account); /** ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -85,8 +85,6 @@ * @return 结果 */ public boolean checkPhoneUnique(SysUser user); boolean checkAccountUnique(SysUser user); /** * 校验email是否唯一 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -198,16 +198,6 @@ } @Override public boolean checkAccountUnique(SysUser user) { SysUser info = userMapper.checkAccountUnique(user.getAccount()); if (StringUtils.isNotNull(info) ) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验email是否唯一 * ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -13,7 +13,6 @@ <result property="phonenumber" column="phonenumber" /> <result property="sex" column="sex" /> <result property="avatar" column="avatar" /> <result property="account" column="account" /> <result property="password" column="password" /> <result property="status" column="status" /> <result property="delFlag" column="del_flag" /> @@ -119,11 +118,6 @@ <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult"> select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1 </select> <select id="checkAccountUnique" resultMap="SysUserResult"> select user_id, account from sys_user where account = #{account} and del_flag = '0' limit 1 </select> <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult"> ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
@@ -2,13 +2,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ruoyi.chargingPile.api.dto.GetPermissionConfigurationDTO; import com.ruoyi.chargingPile.api.dto.PartnerListDTO; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.query.GetPartnerList; import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @@ -27,6 +32,10 @@ @Resource private IPartnerService partnerService; @Resource private SysUserClient sysUserClient; @@ -91,10 +100,38 @@ @ResponseBody @PostMapping("/getPartner") @GetMapping("/getPartner") @ApiOperation(value = "获取所有合作商", tags = {"管理后台-站点管理"}) public AjaxResult<List<Partner>> getPartner(){ List<Partner> list = partnerService.list(new LambdaQueryWrapper<Partner>().eq(Partner::getDelFlag, 0)); SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); Integer roleType = sysUser.getRoleType(); Integer objectId = sysUser.getObjectId(); LambdaQueryWrapper<Partner> wrapper = new LambdaQueryWrapper<Partner>().eq(Partner::getDelFlag, 0); if(2 == roleType){ wrapper.eq(Partner::getId, objectId); } List<Partner> list = partnerService.list(wrapper); return AjaxResult.success(list); } @ResponseBody @GetMapping("/getPermissionConfiguration/{siteId}") @ApiOperation(value = "获取合作商权限设置", tags = {"管理后台-站点管理"}) public AjaxResult<GetPermissionConfigurationDTO> getPermissionConfiguration(@PathVariable("siteId") Integer siteId, @RequestParam("partnerId") Integer partnerId){ GetPermissionConfigurationDTO permissionConfiguration = partnerService.getPermissionConfiguration(siteId, partnerId); return AjaxResult.success(permissionConfiguration); } @ResponseBody @PostMapping("/setPermissionConfiguration/{siteId}") @ApiOperation(value = "设置合作商权限", tags = {"管理后台-站点管理"}) public AjaxResult setPermissionConfiguration(@RequestBody SetPermissionConfiguration req){ partnerService.setPermissionConfiguration(req); return AjaxResult.success(); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -8,9 +8,14 @@ import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.SiteDetailVO; import com.ruoyi.chargingPile.api.vo.SiteVO; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @@ -30,6 +35,17 @@ @Resource private ISiteService siteService; @Resource private IPartnerService partnerService; @Resource private SysUserClient sysUserClient; @ResponseBody @@ -98,8 +114,16 @@ @GetMapping("/getAllSiteList") @ApiOperation(value = "获取所有站点数据", tags = {"管理后台-充电桩信息"}) public AjaxResult<List<Site>> getAllSiteList(){ List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0) .orderByDesc(Site::getCreateTime)); //校验当前账户站点权限 SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); Integer roleType = sysUser.getRoleType(); Integer objectId = sysUser.getObjectId(); LambdaQueryWrapper<Site> wrapper = new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0); if(2 == roleType){ List<Integer> list = partnerService.authSite(objectId, SiteMenu.SITE_LIST); wrapper.in(Site::getId, list); } List<Site> list = siteService.list(wrapper.orderByDesc(Site::getCreateTime)); return AjaxResult.success(list); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -57,7 +57,10 @@ */ @ApiOperation(tags = {"小程序-充电桩"},value = "查询充电桩列表") @PostMapping(value = "/list") public AjaxResult<List<TChargingPile>> list(@RequestParam(name = "siteId",value = "站点id",required = false)Integer siteId) { @ApiImplicitParams({ @ApiImplicitParam(name = "siteId", value = "站点id") }) public AjaxResult<List<TChargingPile>> list(@RequestParam("siteId") Integer siteId) { return AjaxResult.ok(chargingPileService.list(Wrappers.lambdaQuery(TChargingPile.class) .eq(TChargingPile::getSiteId,siteId))); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/domain/SiteMenu.java
New file @@ -0,0 +1,72 @@ package com.ruoyi.chargingPile.domain; /** * @author zhibing.pu * @Date 2024/8/9 15:28 */ public enum SiteMenu { //站点管理 SITE_LIST("/data/site"), //站点计费策略 SITE_ACCOUNTING_STRATEGY("/data/site/accounting_strategy"), //站点编辑 SITE_UPDATE("/data/site/update"), //站点删除 SITE_DELETE("/data/site/delete"), //充电桩信息 CHARGING_PILE("/data/charging_pile"), //充电桩查看 CHARGING_PILE_QUERY_INFO("/data/charging_pile/query_info"), //充电桩编辑 CHARGING_PILE_UPDATE("/data/charging_pile/update"), //充电桩删除 CHARGING_PILE_DELETE("/data/charging_pile/delete"), //充电桩新增接口 CHARGING_PILE_ADD_CHARGING_GUN("/data/charging_pile/add_charging_gun"), //接口信息 CHARGING_GUN("/data/charging_gun"), //接口编辑 CHARGING_GUN_UPDATE("/data/charging_gun/update"), //接口删除 CHARGING_GUN_DELETE("/data/charging_gun/delete"), //接口查看费率 CHARGING_GUN_VIEW_RATES("/data/charging_gun/view_rates"), //接口下载二维码 CHARGING_GUN_DOWNLOAD_QR_CODE("/data/charging_gun/download_qr_code"), //接口查看详情 CHARGING_GUN_QUERY_INFO("/data/charging_gun/query_info"), //接口结束充电 CHARGING_GUN_END_CHARGE("/data/charging_gun/end_charge"), //停车场配置 PARKING_LOT("/data/parking_lot"), //停车场查看 PARKING_LOT_QUERY_INFO("/data/parking_lot/query_info"), //停车场编辑 PARKING_LOT_UPDATE("/data/parking_lot/update"), //停车场删除 PARKING_LOT_DELETE("/data/parking_lot/delete"), //停车场监控 PARKING_LOT_MONITOR("/data/parking_lot/monitor"), //停车场新增车库 PARKING_LOT_ADD_GARAGE("/data/parking_lot/add_garage"), //监控管理 MONITOR("/data/monitor"), //监控查看 MONITOR_QUERY_INFO("/data/monitor/query_info"), ; private String value; SiteMenu(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java
@@ -25,7 +25,7 @@ * @param siteList * @return */ List<GetSiteListDTO> getSiteList(PageInfo<GetSiteListDTO> pageInfo, @Param("item") GetSiteList siteList); List<GetSiteListDTO> getSiteList(PageInfo<GetSiteListDTO> pageInfo, @Param("item") GetSiteList siteList, @Param("ids") List<Integer> ids); /** * 获取站点分页列表 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java
@@ -27,6 +27,6 @@ * @param pageInfo * @return */ List<TChargingGunVO> pageList(@Param("query") TChargingGunQuery query, @Param("pageInfo")PageInfo<TChargingGunVO> pageInfo); List<TChargingGunVO> pageList(@Param("query") TChargingGunQuery query, @Param("pageInfo")PageInfo<TChargingGunVO> pageInfo, @Param("siteIds") List<Integer> siteIds); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java
@@ -27,7 +27,7 @@ * @param page * @return */ List<PageChargingPileListDTO> pageChargingPileList(PageInfo<PageChargingPileListDTO> pageInfo, @Param("item") PageChargingPileList page); List<PageChargingPileListDTO> pageChargingPileList(PageInfo<PageChargingPileListDTO> pageInfo, @Param("item") PageChargingPileList page, @Param("siteIds") List<Integer> siteIds); /** ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/IPartnerService.java
@@ -1,15 +1,20 @@ package com.ruoyi.chargingPile.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.chargingPile.api.dto.GetPermissionConfigurationDTO; import com.ruoyi.chargingPile.api.dto.PartnerListDTO; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.query.GetPartnerList; import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * @author zhibing.pu @@ -59,4 +64,35 @@ * @param resetPassword */ AjaxResult resetPassword(ResetPassword resetPassword); /** * 获取合作商权限 * @param siteId * @return */ GetPermissionConfigurationDTO getPermissionConfiguration(Integer siteId, Integer partnerId); /** * 合作商权限配置 * @param req */ void setPermissionConfiguration(SetPermissionConfiguration req); /** * 获取合作商授权的站点数据 * @param siteMenu 授权菜单路径枚举类 * @return */ List<Integer> authSite(Integer partnerId, SiteMenu siteMenu); /** * 判断当前账户是否有权限 * @param siteId 站点id * @param siteMenu 菜单路径枚举类 * @return */ boolean authMenu(Integer partnerId, Integer siteId, SiteMenu siteMenu); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java
@@ -2,18 +2,20 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.chargingPile.api.dto.GetPermissionConfigurationDTO; import com.ruoyi.chargingPile.api.dto.PartnerListDTO; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.*; import com.ruoyi.chargingPile.api.query.GetPartnerList; import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.chargingPile.mapper.PartnerMapper; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysRoleClient; @@ -22,10 +24,10 @@ import io.seata.spring.annotation.GlobalTransactional; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Arrays; import java.util.List; import java.util.*; import java.util.stream.Collectors; /** @@ -43,6 +45,15 @@ @Resource private ISiteService siteService; @Resource private TPartnerSiteService partnerSiteService; @Resource private TSiteMenuService siteMenuService; @Resource private TChargingPileService chargingPileService; @@ -85,7 +96,7 @@ * @return */ @Override @GlobalTransactional//分布式事务 @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult addPartner(Partner partner) { //校验参数和重复数据 AjaxResult ajaxResult = addPartnerParameterCheck(partner); @@ -110,9 +121,8 @@ this.save(partner); //添加登录账户 SysUser user = new SysUser(); user.setAccount(partner.getAccount()); user.setPhonenumber(partner.getPhoneOne()); user.setUserName(partner.getName()); user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); @@ -189,7 +199,7 @@ * @return */ @Override @GlobalTransactional//分布式事务 @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult editPartner(Partner partner) { //校验参数和重复数据 AjaxResult ajaxResult = addPartnerParameterCheck(partner); @@ -211,7 +221,7 @@ return AjaxResult.error("登录账号不能重复"); } Partner oldPartner = this.getById(partner.getId()); SysUser user = sysUserClient.queryUserByAccount(oldPartner.getAccount()).getData(); SysUser user = sysUserClient.queryUserByUserName(oldPartner.getAccount()).getData(); //修改数据 this.updateById(partner); @@ -220,9 +230,8 @@ user = new SysUser(); user.setStatus("0"); user.setDelFlag("0"); user.setAccount(partner.getAccount()); user.setPhonenumber(partner.getPhoneOne()); user.setUserName(partner.getName()); user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); @@ -234,9 +243,8 @@ throw new RuntimeException(r.getMsg()); } }else{ user.setAccount(partner.getAccount()); user.setPhonenumber(partner.getPhoneOne()); user.setUserName(partner.getName()); user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); @@ -255,16 +263,19 @@ * @param id 合作商id */ @Override @GlobalTransactional//分布式事务 @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult delPartner(Integer id) { //查询有无关联数据 //站点 long count = siteService.count(new LambdaQueryWrapper<Site>().eq(Site::getPartnerId, id).eq(Site::getDelFlag, 0)); if(count > 0){ return AjaxResult.error("当前合作商有关联得站点,删除失败!"); return AjaxResult.error("当前合作商有关联站点,删除失败!"); } // todo 代码完善 //充电桩 long count1 = chargingPileService.count(new LambdaQueryWrapper<TChargingPile>().eq(TChargingPile::getPartnerId, id).eq(TChargingPile::getDelFlag, 0)); if(count1 > 0){ return AjaxResult.error("当前合作商有关联充电桩,删除失败!"); } Partner partner = this.getById(id); if(null == partner){ @@ -272,7 +283,7 @@ } partner.setDelFlag(true); this.updateById(partner); SysUser user = sysUserClient.queryUserByAccount(partner.getAccount()).getData(); SysUser user = sysUserClient.queryUserByUserName(partner.getAccount()).getData(); user.setDelFlag("2"); sysUserClient.updateUser(user); return AjaxResult.success(); @@ -284,7 +295,7 @@ * @param resetPassword */ @Override @GlobalTransactional//分布式事务 @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult resetPassword(ResetPassword resetPassword) { if(null == resetPassword.getId()){ return AjaxResult.error("合作商id不能为空"); @@ -296,9 +307,116 @@ partner.setPassword(resetPassword.getPassword()); this.updateById(partner); //修改登录账号的密码 SysUser user = sysUserClient.queryUserByAccount(partner.getAccount()).getData(); SysUser user = sysUserClient.queryUserByUserName(partner.getAccount()).getData(); user.setPassword(partner.getPassword()); sysUserClient.resetPassword(user); return AjaxResult.success(); } /** * 获取合作商权限 * @return */ @Override public GetPermissionConfigurationDTO getPermissionConfiguration(Integer siteId, Integer partnerId) { Partner partner = this.getById(partnerId); GetPermissionConfigurationDTO dto = new GetPermissionConfigurationDTO(); dto.setPermissionRemarks(partner.getPermissionRemarks()); Map<String, Object> menu = new HashMap<>(); List<TPartnerSite> list = partnerSiteService.list(new LambdaQueryWrapper<TPartnerSite>() .eq(TPartnerSite::getPartnerId, partnerId) .eq(TPartnerSite::getSiteId, siteId)); List<Integer> collect = list.stream().map(TPartnerSite::getSiteMenuId).collect(Collectors.toList()); List<TSiteMenu> tSiteMenus = siteMenuService.list(new LambdaQueryWrapper<TSiteMenu>() .eq(TSiteMenu::getParentId, 0) .eq(TSiteMenu::getVisible, 0) .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum)); for (TSiteMenu tSiteMenu : tSiteMenus) { menu.put("id", tSiteMenu.getMenuId()); menu.put("name", tSiteMenu.getMenuName()); menu.put("path", tSiteMenu.getPath()); menu.put("type", tSiteMenu.getMenuType()); List<TSiteMenu> tSiteMenus1 = siteMenuService.list(new LambdaQueryWrapper<TSiteMenu>() .eq(TSiteMenu::getParentId, tSiteMenu.getMenuId()) .eq(TSiteMenu::getVisible, 0) .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum)); Map<String, Object> child = new HashMap<>(); for (TSiteMenu siteMenu : tSiteMenus1) { child.put("id", siteMenu.getMenuId()); child.put("name", siteMenu.getMenuName()); child.put("path", siteMenu.getPath()); child.put("type", siteMenu.getMenuType()); child.put("selected", collect.contains(siteMenu.getMenuId())); } menu.put("selected", child.keySet().size() > 0 ? true : false); menu.put("child", child); } dto.setMenu(menu); return dto; } /** * 合作商权限配置 * @param req */ @Override @Transactional(rollbackFor = Exception.class) public void setPermissionConfiguration(SetPermissionConfiguration req) { //删除原始配置 partnerSiteService.remove(new LambdaQueryWrapper<TPartnerSite>().eq(TPartnerSite::getPartnerId, req.getPartnerId()).eq(TPartnerSite::getSiteId, req.getSiteId())); //添加新的配置 List<TPartnerSite> sites = new ArrayList<>(); List<Integer> list = req.getMenuId(); for (Integer integer : list) { TPartnerSite partnerSite = new TPartnerSite(); partnerSite.setPartnerId(req.getPartnerId()); partnerSite.setSiteId(req.getSiteId()); partnerSite.setSiteMenuId(integer); sites.add(partnerSite); } partnerSiteService.saveBatch(sites); //修改权限配置 Partner partner = this.getById(req.getPartnerId()); partner.setPermissionRemarks(req.getPermissionRemarks()); this.updateById(partner); } /** * 获取合作商授权的站点数据 * @param siteMenu 授权菜单路径枚举类 * @return */ @Override public List<Integer> authSite(Integer partnerId, SiteMenu siteMenu) { TSiteMenu one = siteMenuService.getOne(new LambdaQueryWrapper<TSiteMenu>().eq(TSiteMenu::getPath, siteMenu.getValue()).eq(TSiteMenu::getStatus, 0)); List<TPartnerSite> list = partnerSiteService.list(new LambdaQueryWrapper<TPartnerSite>() .eq(TPartnerSite::getPartnerId, partnerId) .eq(TPartnerSite::getSiteMenuId, one.getMenuId())); List<Integer> collect = list.stream().map(TPartnerSite::getSiteId).collect(Collectors.toList()); if(collect.size() == 0){ collect.add(-1); } return collect; } /** * 判断当前账户是否有权限 * @param siteId 站点id * @param siteMenu 菜单路径枚举类 * @return */ @Override public boolean authMenu(Integer partnerId, Integer siteId, SiteMenu siteMenu) { TSiteMenu one = siteMenuService.getOne(new LambdaQueryWrapper<TSiteMenu>().eq(TSiteMenu::getPath, siteMenu.getValue()).eq(TSiteMenu::getStatus, 0)); TPartnerSite partnerSite = partnerSiteService.getOne(new LambdaQueryWrapper<TPartnerSite>() .eq(TPartnerSite::getPartnerId, partnerId) .eq(TPartnerSite::getSiteMenuId, one.getMenuId()) .eq(TPartnerSite::getSiteId, siteId)); return null == partnerSite ? false : true; } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -5,17 +5,24 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.GetSiteList; import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.SiteDetailVO; import com.ruoyi.chargingPile.api.vo.SiteVO; import com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.SiteMapper; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -33,6 +40,15 @@ @Resource private TChargingGunService chargingGunService; @Resource private TChargingPileService chargingPileService; @Resource private SysUserClient sysUserClient; @Resource private IPartnerService partnerService; /** @@ -42,10 +58,30 @@ */ @Override public PageInfo<GetSiteListDTO> getSiteList(GetSiteList siteList) { List<Integer> ids = null; //校验合作商权限 SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); Integer roleType = sysUser.getRoleType(); Integer objectId = sysUser.getObjectId(); //合作商 if(roleType == 2){ ids = partnerService.authSite(objectId, SiteMenu.SITE_LIST); } PageInfo<GetSiteListDTO> pageInfo = new PageInfo<>(siteList.getPageCurr(), siteList.getPageSize()); List<GetSiteListDTO> list = this.baseMapper.getSiteList(pageInfo, siteList); List<GetSiteListDTO> list = this.baseMapper.getSiteList(pageInfo, siteList, ids); for (GetSiteListDTO getSiteListDTO : list) { Integer siteId = getSiteListDTO.getId(); getSiteListDTO.setAuthAccountingStrategy(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_ACCOUNTING_STRATEGY)); //平台账号才有此权限 getSiteListDTO.setAuthPartner(roleType == 1 ? true : false); getSiteListDTO.setAuthUpdate(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_UPDATE)); getSiteListDTO.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_DELETE)); } return pageInfo.setRecords(list); } /** * 添加站点信息 @@ -149,7 +185,10 @@ public AjaxResult delSite(Integer id) { //查询是否有关联数据 //充电桩 // todo 待完善 long count1 = chargingPileService.count(new LambdaQueryWrapper<TChargingPile>().eq(TChargingPile::getSiteId, id).eq(TChargingPile::getDelFlag, 0)); if(count1 > 0){ return AjaxResult.error("该站点有关联充电桩,删除失败!"); } Site site = this.getById(id); site.setDelFlag(true); this.updateById(site); @@ -176,7 +215,7 @@ * @param accountingStrategyId 计费策略id */ @Override @Transactional(propagation = Propagation.REQUIRES_NEW) @Transactional(rollbackFor = Exception.class) public void setAccountingStrategy(Integer id, Integer accountingStrategyId) { Site site = this.getById(id); site.setAccountingStrategyId(accountingStrategyId); ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
@@ -7,13 +7,19 @@ import com.ruoyi.chargingPile.api.query.TChargingGunQuery; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.chargingPile.api.vo.TMonitoringEquipmentVO; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.TChargingGunMapper; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** @@ -26,11 +32,38 @@ */ @Service public class TChargingGunServiceImpl extends ServiceImpl<TChargingGunMapper, TChargingGun> implements TChargingGunService { @Resource private SysUserClient sysUserClient; @Resource private IPartnerService partnerService; @Override public PageInfo<TChargingGunVO> pageList(TChargingGunQuery query) { List<Integer> siteIds = null; //校验合作商权限 SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); Integer roleType = sysUser.getRoleType(); Integer objectId = sysUser.getObjectId(); //合作商 if(roleType == 2){ siteIds = partnerService.authSite(objectId, SiteMenu.CHARGING_GUN); } PageInfo<TChargingGunVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TChargingGunVO> list = this.baseMapper.pageList(query,pageInfo); List<TChargingGunVO> list = this.baseMapper.pageList(query,pageInfo, siteIds); for (TChargingGunVO tChargingGunVO : list) { Integer siteId = tChargingGunVO.getSiteId(); tChargingGunVO.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_DELETE)); tChargingGunVO.setAuthDownloadQRCode(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_DOWNLOAD_QR_CODE)); tChargingGunVO.setAuthEndCharge(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_END_CHARGE)); tChargingGunVO.setAuthQueryInfo(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_QUERY_INFO)); tChargingGunVO.setAuthUpdate(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_UPDATE)); tChargingGunVO.setAuthViewRates(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_GUN_VIEW_RATES)); } pageInfo.setRecords(list); return pageInfo; } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -7,12 +7,17 @@ import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.BatchSetAccountingStrategy; import com.ruoyi.chargingPile.api.query.PageChargingPileList; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.TChargingPileMapper; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -33,6 +38,12 @@ @Resource private TChargingGunService chargingGunService; @Resource private SysUserClient sysUserClient; @Resource private IPartnerService partnerService; @@ -43,8 +54,24 @@ */ @Override public PageInfo<PageChargingPileListDTO> pageChargingPileList(PageChargingPileList page) { List<Integer> siteIds = null; //校验合作商权限 SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData(); Integer roleType = sysUser.getRoleType(); Integer objectId = sysUser.getObjectId(); //合作商 if(roleType == 2){ siteIds = partnerService.authSite(objectId, SiteMenu.CHARGING_PILE); } PageInfo<PageChargingPileListDTO> pageInfo = new PageInfo<>(page.getPageCurr(), page.getPageSize()); List<PageChargingPileListDTO> list = this.baseMapper.pageChargingPileList(pageInfo, page); List<PageChargingPileListDTO> list = this.baseMapper.pageChargingPileList(pageInfo, page, siteIds); for (PageChargingPileListDTO pageChargingPileListDTO : list) { Integer siteId = pageChargingPileListDTO.getSiteId(); pageChargingPileListDTO.setAuthAddChargingGun(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_ADD_CHARGING_GUN)); pageChargingPileListDTO.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_DELETE)); pageChargingPileListDTO.setAuthQueryInfo(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_QUERY_INFO)); pageChargingPileListDTO.setAuthUpdate(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.CHARGING_PILE_UPDATE)); } return pageInfo.setRecords(list); } ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml
@@ -16,6 +16,7 @@ <result column="remark" property="remark" /> <result column="account" property="account" /> <result column="password" property="password" /> <result column="permission_remarks" property="permissionRemarks"/> <result column="create_time" property="createTime" /> <result column="del_flag" property="delFlag" /> </resultMap> ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml
@@ -94,6 +94,12 @@ <if test="null != item.districtsCode and '' != item.districtsCode"> and a.districts_code = #{item.districtsCode} </if> <if test="null != ids"> and a.id in <foreach collection="ids" item="itemm" index="index" open="(" separator="," close=")"> #{itemm} </foreach> </if> order by a.sort desc, a.create_time desc limit #{item.pageCurr}, #{item.pageSize} </select> ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml
@@ -57,6 +57,12 @@ <if test="query.chargeMode != null"> AND tas.chargeMode = #{query.chargeMode} </if> <if test="null != siteIds"> and tcg.site_id in <foreach collection="siteIds" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </if> AND tas.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} </where> ORDER BY tas.create_time DESC ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml
@@ -56,6 +56,12 @@ <if test="null != item.type"> and a.type = #{item.type} </if> <if test="null != siteIds"> and a.site_id in <foreach collection="siteIds" item="itemm" index="index" open="(" separator="," close=")"> #{itemm} </foreach> </if> order by a.create_time desc limit #{item.pageCurr}, #{item.pageSize} </select>