Commit 3ab6e756 authored by shengnan hu's avatar shengnan hu
Browse files

init

parents
Pipeline #294 passed with stage
in 2 minutes and 13 seconds
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>mall4cloud-api</artifactId>
<groupId>com.mall4j.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall4cloud-api-rbac</artifactId>
<packaging>jar</packaging>
<description>用户角色权限对内接口</description>
<dependencies>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
package com.mall4j.cloud.api.rbac.bo;
/**
* uri权限bo
*
* @author FrozenWatermelon
* @date 2020/9/3
*/
public class UriPermissionBO {
/**
* 请求方法 1.GET 2.POST 3.PUT 4.DELETE
*/
private Integer method;
/**
* uri
*/
private String uri;
/**
* permission
*/
private String permission;
public Integer getMethod() {
return method;
}
public void setMethod(Integer method) {
this.method = method;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
@Override
public String toString() {
return "UriPermissionBO{" + "method=" + method + ", uri='" + uri + '\'' + ", permission='" + permission + '\''
+ '}';
}
}
package com.mall4j.cloud.api.rbac.constant;
import java.util.Objects;
/**
* 请求方法 1.GET 2.POST 3.PUT 4.DELETE http方法枚举
* @author FrozenWatermelon
* @date 2020/9/3
*/
public enum HttpMethodEnum {
/**
* GET
*/
GET(1, "GET"),
/**
* POST
*/
POST(2, "POST"),
/**
* PUT
*/
PUT(3, "PUT"),
/**
* DELETE
*/
DELETE(4, "DELETE"),;
private final Integer value;
private final String method;
public Integer value() {
return value;
}
public String method() {
return this.method;
}
HttpMethodEnum(Integer value, String method) {
this.value = value;
this.method = method;
}
public static HttpMethodEnum valueOf(Integer value) {
for (HttpMethodEnum httpMethodEnum : values()) {
if (Objects.equals(httpMethodEnum.value(), value)) {
return httpMethodEnum;
}
}
return null;
}
}
package com.mall4j.cloud.api.rbac.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
/**
* @author FrozenWatermelon
* @date 2020/9/2
*/
public class CheckPermissionDTO {
/**
* 用户id
*/
@NotNull(message = "userId not null")
private Long userId;
/**
* 系统类型
*/
@NotNull(message = "sysType not null")
private Integer sysType;
/**
* uri
*/
@NotBlank(message = "uri not blank")
private String uri;
/**
* 是否是管理员
*/
@NotNull(message = "isAdmin not null")
private Integer isAdmin;
/**
* 请求方法 1.GET 2.POST 3.PUT 4.DELETE
*/
private Integer method;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Integer getSysType() {
return sysType;
}
public void setSysType(Integer sysType) {
this.sysType = sysType;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public Integer getIsAdmin() {
return isAdmin;
}
public void setIsAdmin(Integer isAdmin) {
this.isAdmin = isAdmin;
}
public Integer getMethod() {
return method;
}
public void setMethod(Integer method) {
this.method = method;
}
@Override
public String toString() {
return "CheckPermissionDTO{" + "userId=" + userId + ", sysType=" + sysType + ", uri='" + uri + '\''
+ ", isAdmin=" + isAdmin + ", method=" + method + '}';
}
}
package com.mall4j.cloud.api.rbac.dto;
import jakarta.validation.constraints.NotNull;
/**
* @author FrozenWatermelon
* @date 2020/11/27
*/
public class ClearUserPermissionsCacheDTO {
/**
* 用户id
*/
@NotNull(message = "userId not null")
private Long userId;
/**
* 系统类型
*/
@NotNull(message = "sysType not null")
private Integer sysType;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Integer getSysType() {
return sysType;
}
public void setSysType(Integer sysType) {
this.sysType = sysType;
}
@Override
public String toString() {
return "ClearUserPermissionsCacheDTO{" +
"userId=" + userId +
", sysType=" + sysType +
'}';
}
}
package com.mall4j.cloud.api.rbac.dto;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.util.List;
/**
* @author FrozenWatermelon
* @date 2020/11/27
*/
public class UserRoleDTO {
/**
* 用户id
*/
@NotNull(message = "userId not null")
private Long userId;
/**
* 角色id列表
*/
@NotEmpty(message = "userId not null")
private List<Long> roleIds;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public List<Long> getRoleIds() {
return roleIds;
}
public void setRoleIds(List<Long> roleIds) {
this.roleIds = roleIds;
}
@Override
public String toString() {
return "UserRoleDTO{" +
"userId=" + userId +
", roleIds=" + roleIds +
'}';
}
}
package com.mall4j.cloud.api.rbac.feign;
import com.mall4j.cloud.api.rbac.dto.ClearUserPermissionsCacheDTO;
import com.mall4j.cloud.common.constant.Auth;
import com.mall4j.cloud.common.feign.FeignInsideAuthConfig;
import com.mall4j.cloud.common.response.ServerResponseEntity;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
*
* @author FrozenWatermelon
* @date 2020/09/02
*/
@FeignClient(value = PermissionFeignClient.SERVICE_NAME,contextId = "permission")
public interface PermissionFeignClient {
String SERVICE_NAME = "mall4cloud-rbac";
/**
* 校验是否有某个uri的权限
* @param userId
* @param sysType
* @param uri
* @param isAdmin
* @param method
* @return 是否有某个uri的权限
*/
@GetMapping(value = Auth.CHECK_RBAC_URI)
ServerResponseEntity<Boolean> checkPermission(@RequestParam("userId") Long userId,@RequestParam("sysType") Integer sysType,
@RequestParam("uri") String uri,@RequestParam("isAdmin") Integer isAdmin,
@RequestParam("method") Integer method);
/**
* 清除用户权限缓存
* @param clearUserPermissionsCacheDTO
* @return 是否调用成功
*/
@PostMapping(value = FeignInsideAuthConfig.FEIGN_INSIDE_URL_PREFIX + "/insider/permission/clearUserPermissionsCache")
ServerResponseEntity<Void> clearUserPermissionsCache(@RequestBody ClearUserPermissionsCacheDTO clearUserPermissionsCacheDTO);
}
package com.mall4j.cloud.api.rbac.feign;
import com.mall4j.cloud.api.rbac.dto.UserRoleDTO;
import com.mall4j.cloud.common.feign.FeignInsideAuthConfig;
import com.mall4j.cloud.common.response.ServerResponseEntity;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author FrozenWatermelon
* @date 2020/11/25
*/
@FeignClient(value = "mall4cloud-rbac",contextId = "userRole")
public interface UserRoleFeignClient {
/**
* 保存用户角色关联信息
* @param userRoleDTO 用户角色关联信息
* @return void
*/
@PostMapping(value = FeignInsideAuthConfig.FEIGN_INSIDE_URL_PREFIX + "/userRole/saveByUserIdAndSysType")
ServerResponseEntity<Void> saveByUserIdAndSysType(@RequestBody UserRoleDTO userRoleDTO);
/**
* 更新用户角色关联信息
* @param userRoleDTO 用户角色关联信息
* @return void
*/
@PutMapping(value = FeignInsideAuthConfig.FEIGN_INSIDE_URL_PREFIX + "/userRole/updateByUserIdAndSysType")
ServerResponseEntity<Void> updateByUserIdAndSysType(@RequestBody UserRoleDTO userRoleDTO);
/**
* 删除用户角色关联信息
* @param userId 用户id
* @return void
*/
@DeleteMapping(value = FeignInsideAuthConfig.FEIGN_INSIDE_URL_PREFIX + "/userRole/deleteByUserIdAndSysType")
ServerResponseEntity<Void> deleteByUserIdAndSysType(@RequestParam("userId") Long userId);
/**
* 获取用户角色关联信息
* @param userId 用户id
* @return 用户角色关联ids
*/
@GetMapping(value = FeignInsideAuthConfig.FEIGN_INSIDE_URL_PREFIX + "/userRole/getRoleIds")
ServerResponseEntity<List<Long>> getRoleIds(@RequestParam("userId") Long userId);
}
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>mall4cloud-api</artifactId>
<groupId>com.mall4j.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall4cloud-api-search</artifactId>
<packaging>jar</packaging>
<description>搜索对内接口</description>
<dependencies>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.mall4j.cloud.api.dto;
import com.mall4j.cloud.common.util.PrincipalUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import java.util.Arrays;
/**
* @author FrozenWatermelon
* @date 2020/11/16
*/
public class EsPageDTO{
public static final String ASC = "ASC";
public static final String DESC = "DESC";
/**
* 最大分页大小,如果分页大小大于500,则用500作为分页的大小。防止有人直接传入一个较大的数,导致服务器内存溢出宕机
*/
public static final Integer MAX_PAGE_SIZE = 500;
/**
* 当前页
*/
@NotNull(message = "pageNum 不能为空")
@Schema(description = "当前页" , requiredMode = Schema.RequiredMode.REQUIRED)
private Integer pageNum;
@NotNull(message = "pageSize 不能为空")
@Schema(description = "每页大小" , requiredMode = Schema.RequiredMode.REQUIRED)
private Integer pageSize;
@Schema(description = "排序字段数组,用逗号分割" )
private String[] columns;
@Schema(description = "排序字段方式,用逗号分割,ASC正序,DESC倒序" )
private String[] orders;
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
if (pageSize > MAX_PAGE_SIZE) {
this.pageSize = MAX_PAGE_SIZE;
return;
}
this.pageSize = pageSize;
}
public String getOrderBy() {
return order(this.columns, this.orders);
}
public String[] getColumns() {
return columns;
}
public void setColumns(String[] columns) {
this.columns = columns;
}
public String[] getOrders() {
return orders;
}
public void setOrders(String[] orders) {
this.orders = orders;
}
public static String order(String[] columns, String[] orders) {
if (columns == null || columns.length == 0) {
return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int x = 0; x < columns.length; x++) {
String column = columns[x];
String order;
if (orders != null && orders.length > x) {
order = orders[x].toUpperCase();
if (!(order.equals(ASC) || order.equals(DESC))) {
throw new IllegalArgumentException("非法的排序策略:" + column);
}
}else {
order = ASC;
}
// 判断列名称的合法性,防止SQL注入。只能是【字母,数字,下划线】
if (PrincipalUtil.isField(column)) {
throw new IllegalArgumentException("非法的排序字段名称:" + column);
}
// 驼峰转换为下划线
column = humpConversionUnderscore(column);
if (x != 0) {
stringBuilder.append(", ");
}
stringBuilder.append("`").append(column).append("` ").append(order);
}
return stringBuilder.toString();
}
public static String humpConversionUnderscore(String value) {
StringBuilder stringBuilder = new StringBuilder();
char[] chars = value.toCharArray();
for (char character : chars) {
if (Character.isUpperCase(character)) {
stringBuilder.append("_");
character = Character.toLowerCase(character);
}
stringBuilder.append(character);
}
return stringBuilder.toString();
}
@Override
public String toString() {
return "EsPageDTO{" +
"pageNum=" + pageNum +
", pageSize=" + pageSize +
", columns=" + Arrays.toString(columns) +
", orders=" + Arrays.toString(orders) +
'}';
}
}
package com.mall4j.cloud.api.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import java.util.Map;
/**
* @author FrozenWatermelon
* @date 2020/11/16
*/
public class ProductSearchDTO {
@Schema(description = "页面传递过来的全文匹配关键字" )
private String keyword;
@Schema(description = "品牌id,可以多选" )
private String brandIds;
@Schema(description = "商家一级分类id" )
private Long shopPrimaryCategoryId;
@Schema(description = "商家二级分类id" )
private Long shopSecondaryCategoryId;
@Schema(description = "平台一级分类id" )
private Long primaryCategoryId;
@Schema(description = "平台三级分类id" )
private Long categoryId;
@Schema(description = "排序:1新品,2销量倒序,3销量正序,4商品价格倒序,5商品价格正序,6评论(暂无评论)" )
private Integer sort;
@Schema(description = "自营店 1:自营店 2:非自营店" )
private Integer selfShop;
@Schema(description = "是否显示有货" )
private Integer hasStock;
@Schema(description = "价格区间查询-最低价" )
private Long minPrice;
@Schema(description = "价格区间查询-最高价" )
private Long maxPrice;
@Schema(description = "店铺id" )
private Long shopId;
@Schema(description = "属性值ids(属性之间用^拼接;属性于属性值id用_拼接;多个属性值id间用,拼接)" )
private String attrIds;
@Schema(description = "商品状态" )
private Integer spuStatus;
@Schema(description = "属性值ids(多个id间使用 , 分隔)" )
private String attrValueIds;
@Schema(description = "spuId列表" )
private List<Long> spuIds;
@Schema(description = "销量区间查询-最低销量" )
private Long minSaleNum;
@Schema(description = "销量区间查询-最高销量" )
private Long maxSaleNum;
@Schema(description = "商品编码列表(逗号分隔)" )
private String partyCodes;
@Schema(description = "商品条形码列表(逗号分隔)" )
private String modelIds;
@Schema(description = "0.全部 1.销售中 2.已售罄 3.已下架" )
private Integer dataType;
@Schema(description = "当前页" )
private Integer pageNum;
@Schema(description = "每页大小" )
private Integer pageSize;
/**
* 对应SearchTypeEnum
* 搜索类型 1:用户端搜索 2:店铺spu列表 3.平台spu管理列表
*/
private Integer searchType;
/**
* 搜索属性信息
*/
private Map<String, List<String>> attrMap;
public Map<String, List<String>> getAttrMap() {
return attrMap;
}
public void setAttrMap(Map<String, List<String>> attrMap) {
this.attrMap = attrMap;
}
public String getAttrIds() {
return attrIds;
}
public void setAttrIds(String attrIds) {
this.attrIds = attrIds;
}
public Long getMinSaleNum() {
return minSaleNum;
}
public void setMinSaleNum(Long minSaleNum) {
this.minSaleNum = minSaleNum;
}
public Long getMaxSaleNum() {
return maxSaleNum;
}
public void setMaxSaleNum(Long maxSaleNum) {
this.maxSaleNum = maxSaleNum;
}
public String getPartyCodes() {
return partyCodes;
}
public void setPartyCodes(String partyCodes) {
this.partyCodes = partyCodes;
}
public String getModelIds() {
return modelIds;
}
public void setModelIds(String modelIds) {
this.modelIds = modelIds;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public String getBrandIds() {
return brandIds;
}
public void setBrandIds(String brandIds) {
this.brandIds = brandIds;
}
public Long getShopPrimaryCategoryId() {
return shopPrimaryCategoryId;
}
public void setShopPrimaryCategoryId(Long shopPrimaryCategoryId) {
this.shopPrimaryCategoryId = shopPrimaryCategoryId;
}
public Long getShopSecondaryCategoryId() {
return shopSecondaryCategoryId;
}
public void setShopSecondaryCategoryId(Long shopSecondaryCategoryId) {
this.shopSecondaryCategoryId = shopSecondaryCategoryId;
}
public Long getPrimaryCategoryId() {
return primaryCategoryId;
}
public void setPrimaryCategoryId(Long primaryCategoryId) {
this.primaryCategoryId = primaryCategoryId;
}
public Long getCategoryId() {
return categoryId;
}
public void setCategoryId(Long categoryId) {
this.categoryId = categoryId;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public Integer getSelfShop() {
return selfShop;
}
public void setSelfShop(Integer selfShop) {
this.selfShop = selfShop;
}
public Integer getHasStock() {
return hasStock;
}
public void setHasStock(Integer hasStock) {
this.hasStock = hasStock;
}
public Long getMinPrice() {
return minPrice;
}
public void setMinPrice(Long minPrice) {
this.minPrice = minPrice;
}
public Long getMaxPrice() {
return maxPrice;
}
public void setMaxPrice(Long maxPrice) {
this.maxPrice = maxPrice;
}
public Long getShopId() {
return shopId;
}
public void setShopId(Long shopId) {
this.shopId = shopId;
}
public Integer getSpuStatus() {
return spuStatus;
}
public void setSpuStatus(Integer spuStatus) {
this.spuStatus = spuStatus;
}
public String getAttrValueIds() {
return attrValueIds;
}
public void setAttrValueIds(String attrValueIds) {
this.attrValueIds = attrValueIds;
}
public List<Long> getSpuIds() {
return spuIds;
}
public void setSpuIds(List<Long> spuIds) {
this.spuIds = spuIds;
}
public Integer getDataType() {
return dataType;
}
public void setDataType(Integer dataType) {
this.dataType = dataType;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getSearchType() {
return searchType;
}
public void setSearchType(Integer searchType) {
this.searchType = searchType;
}
@Override
public String toString() {
return "ProductSearchDTO{" +
"keyword='" + keyword + '\'' +
", brandIds='" + brandIds + '\'' +
", shopPrimaryCategoryId=" + shopPrimaryCategoryId +
", shopSecondaryCategoryId=" + shopSecondaryCategoryId +
", primaryCategoryId=" + primaryCategoryId +
", categoryId=" + categoryId +
", sort=" + sort +
", selfShop=" + selfShop +
", hasStock=" + hasStock +
", minPrice=" + minPrice +
", maxPrice=" + maxPrice +
", shopId=" + shopId +
", attrIds='" + attrIds + '\'' +
", spuStatus=" + spuStatus +
", attrValueIds='" + attrValueIds + '\'' +
", spuIds=" + spuIds +
", minSaleNum=" + minSaleNum +
", maxSaleNum=" + maxSaleNum +
", partyCodes='" + partyCodes + '\'' +
", modelIds='" + modelIds + '\'' +
", dataType=" + dataType +
", pageNum=" + pageNum +
", pageSize=" + pageSize +
", searchType=" + searchType +
", attrMap=" + attrMap +
'}';
}
}
package com.mall4j.cloud.api.feign;
import com.mall4j.cloud.api.vo.EsPageVO;
import com.mall4j.cloud.api.vo.search.EsOrderVO;
import com.mall4j.cloud.common.dto.OrderSearchDTO;
import com.mall4j.cloud.common.feign.FeignInsideAuthConfig;
import com.mall4j.cloud.common.response.ServerResponseEntity;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
/**
* 订单搜索
* @author FrozenWatermelon
* @date 2021/02/05
*/
@FeignClient(value = "mall4cloud-search",contextId = "searchOrder")
public interface SearchOrderFeignClient {
/**
* 订单搜索
* @param orderSearch 订单搜索参数
* @return 订单列表
*/
@PutMapping(value = FeignInsideAuthConfig.FEIGN_INSIDE_URL_PREFIX + "/insider/searchOrder/getOrderPage")
ServerResponseEntity<EsPageVO<EsOrderVO>> getOrderPage(@RequestBody OrderSearchDTO orderSearch);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment