zxl
12 小时以前 762eba0553917215d158eac8575ac0437c3216a7
订单敏感信息,以及导出权限控制
9个文件已修改
2个文件已添加
174 ■■■■■ 已修改文件
framework/src/main/java/cn/lili/modules/lmk/enums/general/AdminRoleEnum.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/MyCollectServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/permission/service/RoleService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/utils/CommonUtil.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/order/OrderManagerController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/enums/general/AdminRoleEnum.java
New file
@@ -0,0 +1,25 @@
package cn.lili.modules.lmk.enums.general;
import lombok.Getter;
@Getter
public enum AdminRoleEnum {
    ORDER_INFO_PERMISSION("order_info_permission","订单敏感信息"),
    COUPON_PERMISSION("coupon_permission","优惠卷敏感信息");
    private String value;
    private String desc;
    AdminRoleEnum(String value, String desc) {
        this.value = value;
        this.desc = desc;
    }
    public static AdminRoleEnum getByValue(String value) {
        for (AdminRoleEnum e : AdminRoleEnum.values()) {
            if (e.value.equals(value)) {
                return e;
            }
        }
        return null;
    }
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/MyCollectServiceImpl.java
@@ -3,11 +3,14 @@
import cn.lili.common.enums.CollectTypeEnum;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.lmk.domain.query.AuthorVideoQuery;
import cn.lili.modules.lmk.domain.vo.*;
import cn.lili.modules.lmk.service.MySubscribeService;
import cn.lili.modules.lmk.service.VideoService;
import cn.lili.modules.member.entity.vo.GoodsCollectionVO;
import cn.lili.modules.member.service.GoodsCollectionService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.CommentTagsEnum;
import cn.lili.rocketmq.tags.VideoTagsEnum;
@@ -52,8 +55,7 @@
    private final LmkFileServiceImpl fileService;
    private final RocketMQTemplate rocketMQTemplate;
    private final VideoServiceMakeUpImpl serviceMakeUp;
    private final GoodsCollectionService goodsCollectionService;
    /**
     * 收藏/取消收藏
@@ -200,7 +202,15 @@
            videoQuery.setPageNumber(query.getPageNumber());
            return serviceMakeUp.getAuthorCollectVideoPage(videoQuery);
        }else if (CollectTypeEnum.goods.getType().equals(query.getType())) {
            baseMapper.getGoodsCollectPage(page, userId);
            PageVO pageVo = new PageVO();
            pageVo.setPageSize((int) query.getPageSize());
            pageVo.setPageNumber((int) query.getPageNumber());
            IPage<GoodsCollectionVO> goodsCollectionVOIPage = goodsCollectionService.goodsCollection(pageVo);
            for (GoodsCollectionVO goodsCollectionVO : goodsCollectionVOIPage.getRecords()) {
                goodsCollectionVO.setImage(fileService.getPreviewUrl(goodsCollectionVO.getImage()));
            }
            return Result.ok().data(goodsCollectionVOIPage.getRecords()).total(goodsCollectionVOIPage.getTotal());
        }
framework/src/main/java/cn/lili/modules/order/order/entity/vo/OrderSimpleVO.java
@@ -153,6 +153,12 @@
    @ApiModelProperty(value = "卖家订单备注")
    private String sellerRemark;
    /**
     * 敏感信息
     */
    private String consigneeName;
    private String consigneeMobile;
    public List<OrderItemVO> getOrderItems() {
        if (CharSequenceUtil.isEmpty(groupGoodsId)) {
            return new ArrayList<>();
framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
@@ -82,8 +82,10 @@
     * @return 简短订单分页
     */
    @Select("select o.sn,o.flow_price,o.create_time,o.order_status,o.pay_status,o.payment_method,o.payment_time,o.member_name,o.store_name as " +
            "store_name,o.store_id as store_id,o.client_type,o.order_type,o.deliver_status,o.order_promotion_type,o.seller_remark " +
            ",GROUP_CONCAT(oi.goods_id) as group_goods_id," +
            "store_name,o.store_id as store_id,o.client_type,o.order_type,o.deliver_status,o.order_promotion_type,o.seller_remark, " +
            "o.consignee_name AS consigneeName," +
            "o.consignee_mobile AS consigneeMobile," +
            " GROUP_CONCAT(oi.goods_id) as group_goods_id," +
            " GROUP_CONCAT(oi.sku_id) as group_sku_id," +
            " GROUP_CONCAT(oi.num) as group_num" +
            ",GROUP_CONCAT(oi.image) as group_images" +
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -16,6 +16,7 @@
import cn.lili.common.event.TransactionCommitSendMQEvent;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
@@ -25,6 +26,7 @@
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
@@ -38,6 +40,9 @@
import cn.lili.modules.order.trade.entity.dos.OrderLog;
import cn.lili.modules.order.trade.service.OrderLogService;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.permission.entity.dos.AdminUser;
import cn.lili.modules.permission.service.AdminUserService;
import cn.lili.modules.permission.service.RoleService;
import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.service.PintuanService;
import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO;
@@ -61,6 +66,7 @@
import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.trigger.util.DelayQueueTools;
import cn.lili.utils.COSUtil;
import cn.lili.utils.CommonUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -88,7 +94,7 @@
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
import cn.lili.modules.permission.entity.dos.Role;
/**
 * 子订单业务层实现
 *
@@ -175,6 +181,12 @@
    private GoodsService goodsService;
    @Autowired
    private COSUtil cosUtil;
    @Autowired
    private AdminUserService adminUserService;
    @Autowired
    private RoleService roleService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void intoDB(TradeDTO tradeDTO) {
@@ -233,8 +245,18 @@
        QueryWrapper queryWrapper = orderSearchParams.queryWrapper();
        queryWrapper.groupBy("o.id");
        queryWrapper.orderByDesc("o.id");
        return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), queryWrapper);
        IPage<OrderSimpleVO> page =  this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), queryWrapper);
        if (!adminUserService.havePermissionRole(AdminRoleEnum.ORDER_INFO_PERMISSION)){
            for (OrderSimpleVO vo : page.getRecords()){
                vo.setConsigneeName(CommonUtil.maskName(vo.getConsigneeName()));
                vo.setConsigneeMobile(CommonUtil.maskMobile(vo.getConsigneeMobile()));
            }
        }
        return page;
    }
    @Override
    public IPage<OrderSimpleXcxVO> queryByXcxParams(OrderSearchXcxParams orderSearchParams) {
@@ -376,8 +398,17 @@
    @Override
    public void queryExportOrder(HttpServletResponse response, OrderSearchParams orderSearchParams) {
        List<OrderExportDTO> orderExportDTOS = this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper());
        XSSFWorkbook workbook = initOrderExportData(this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper()));
        if (!adminUserService.havePermissionRole(AdminRoleEnum.ORDER_INFO_PERMISSION)){
            for (OrderExportDTO vo : orderExportDTOS){
                vo.setConsigneeName(CommonUtil.maskName(vo.getConsigneeName()));
                vo.setConsigneeMobile(CommonUtil.maskMobile(vo.getConsigneeMobile()));
            }
        }
        XSSFWorkbook workbook = initOrderExportData(orderExportDTOS);
        try {
            // 设置响应头
            String fileName = URLEncoder.encode("订单列表", "UTF-8");
framework/src/main/java/cn/lili/modules/permission/service/AdminUserService.java
@@ -3,6 +3,7 @@
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token;
import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
import cn.lili.modules.permission.entity.dos.AdminUser;
import cn.lili.modules.permission.entity.dto.AdminUserDTO;
import cn.lili.modules.permission.entity.vo.AdminUserVO;
@@ -42,6 +43,9 @@
    AdminUser findByUsername(String username);
    AdminUser findByUserById(String id);
    boolean havePermissionRole(AdminRoleEnum adminRoleEnum);
    /**
     * 更新管理员
     *
framework/src/main/java/cn/lili/modules/permission/service/RoleService.java
@@ -14,6 +14,8 @@
 */
public interface RoleService extends IService<Role> {
    List<Role> findRoles(List<String> ids);
    /**
     * 获取默认角色
     *
framework/src/main/java/cn/lili/modules/permission/serviceimpl/AdminUserServiceImpl.java
@@ -11,6 +11,7 @@
import cn.lili.common.security.token.Token;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
import cn.lili.modules.permission.entity.dos.AdminUser;
import cn.lili.modules.permission.entity.dos.Department;
import cn.lili.modules.permission.entity.dos.Role;
@@ -163,7 +164,35 @@
    public AdminUser findByUsername(String username) {
        return getOne(new LambdaQueryWrapper<AdminUser>().eq(AdminUser::getUsername, username), false);
    }
    @Override
    public AdminUser findByUserById(String id){
        return getOne(new LambdaQueryWrapper<AdminUser>().eq(AdminUser::getId,id).eq(AdminUser::getDeleteFlag,Boolean.FALSE),false);
    }
    @Override
    public boolean havePermissionRole(AdminRoleEnum adminRoleEnum) {
        AuthUser currentUser = UserContext.getCurrentUser();
        boolean orderInfoPermission = false;
        if (currentUser != null) {
            if (currentUser.getIsSuper()){
                orderInfoPermission = true;
            }else {
                if (StringUtils.isNotBlank(currentUser.getId())){
                    AdminUser adminUser = this.findByUserById(currentUser.getId());
                    String[] roleIds = adminUser.getRoleIds().split(",");
                    List<Role> list = roleService.findRoles(Arrays.asList(roleIds));
                    for (Role item: list){
                        if (adminRoleEnum.getValue().equals(item.getName())){
                            orderInfoPermission = true;
                            break;
                        }
                    }
                }
            }
        }
        return orderInfoPermission;
    }
    @Override
    @SystemLogPoint(description = "修改管理员", customerLog = "'修改管理员:'+#adminUser.username")
framework/src/main/java/cn/lili/modules/permission/serviceimpl/RoleServiceImpl.java
@@ -12,6 +12,7 @@
import cn.lili.modules.permission.service.RoleService;
import cn.lili.modules.permission.service.UserRoleService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -45,6 +46,12 @@
    private Cache cache;
    @Override
    public List<Role> findRoles(List<String> ids){
        return new LambdaQueryChainWrapper<>(baseMapper)
                .in(Role::getId,ids).eq(Role::getDeleteFlag,Boolean.FALSE).list();
    }
    @Override
    public List<Role> findByDefaultRole(Boolean defaultRole) {
        QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("default_role", true);
framework/src/main/java/cn/lili/utils/CommonUtil.java
New file
@@ -0,0 +1,41 @@
package cn.lili.utils;
import cn.lili.common.utils.StringUtils;
/**
 * lmk-shop-java
 * 工具
 *
 * @author : zxl
 * @date : 2025-08-07 14:40
 **/
public class CommonUtil {
    public static String maskName(String name) {
        if (StringUtils.isBlank(name)) {
            return "";
        }
        // 规则:保留第一个字符,其余替换为 *
        return name.charAt(0) + StringUtils.repeat("*", name.length() - 1);
    }
    /**
     * 通用手机号脱敏:无论位数多少,均替换中间4位
     * 示例:
     * - 13812345678 → 138****5678
     * - 12345678 → 12****78
     * - 12345 → 1****5 (不足4位时全部替换)
     */
    public static String maskMobile(String mobile) {
        String digits = mobile.replaceAll("[^0-9]", "");
        int length = digits.length();
        // 2. 短号码直接隐藏
        if (length <= 4) {
            return "****";
        }
        // 3. 保留前2位和后2位,替换中间
        return digits.replaceAll("(\\d{2})\\d+(\\d{2})", "$1****$2");
    }
}
manager-api/src/main/java/cn/lili/controller/order/OrderManagerController.java
@@ -67,6 +67,7 @@
    @ApiOperation(value = "查询订单导出列表")
    @GetMapping("/queryExportOrder")
    public void queryExportOrder(OrderSearchParams orderSearchParams) {
        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
        orderService.queryExportOrder(response,orderSearchParams);
    }