刘帅
2026-09-21 86ce1aaf6819a6d62cfba4233219fa4661aacbff
bug:测试问题统一修改
1个文件已添加
45个文件已修改
332 ■■■■■ 已修改文件
cloud-server-account/src/main/java/com/dsh/account/model/RefereeList.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/resources/mapper/RefereeMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/controller/THuiminCardController.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/resources/mapper/CoursePackagePaymentConfigMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/RefereeList.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TFinanceController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TShopController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/BallController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/SensitiveDataController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/UserMgrController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/IncomeVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/UserListVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/resources/mapper/UserMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/common/_container.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/ball/yuyue.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/operatorIncome.html 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/platformIncome.html 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/finance/Income.html 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/finance/RegistrationOrder.html 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/referee/referee.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/tIntegral/TIntegral.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/tPayHuimin/tPayHuimin.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/tShopEvaluation/TShop.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/userAudit/userAudit.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/vipDetail/vip_detail.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/vipPayment/vip_payment.html 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/js/common/sensitive-info.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/ball/yuyue.js 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/finance/RegistrationOrder.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/finance/income.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/operator/operator.js 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/referee/referee.js 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/tIntegral/tIntegral.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/tPayHuimin/tPayHuimin.js 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/tShopEvaluation/tShop.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/user/user.js 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/userAudit/userAudit.js 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/vipDetail/vipDetail.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/vipPayment/vipPayment.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-other/src/main/resources/mapper/GameMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/java/com/dsh/account/model/RefereeList.java
@@ -8,6 +8,8 @@
 */
@Data
public class RefereeList {
    /** 裁判 ID,敏感信息查询时用于精确定位单条记录。 */
    private Integer id;
    /**
     * 姓名
     */
cloud-server-account/src/main/resources/mapper/RefereeMapper.xml
@@ -12,6 +12,9 @@
        CONCAT(province, city) as province,
        state
        from t_referee where state != 3
        <if test="null != item.id">
            and id = #{item.id}
        </if>
        <if test="null != item.name and '' != item.name">
            and name like CONCAT('%', #{item.name}, '%')
        </if>
@@ -32,6 +35,9 @@
        select
        count(*)
        from t_referee where state != 3
        <if test="null != item.id">
            and id = #{item.id}
        </if>
        <if test="null != item.name and '' != item.name">
            and name like CONCAT('%', #{item.name}, '%')
        </if>
cloud-server-activity/src/main/java/com/dsh/activity/controller/THuiminCardController.java
@@ -71,6 +71,7 @@
        if (tHuiminCard.getStatus() != null){
            queryWrapper.eq("status",tHuiminCard.getStatus());
        }
        queryWrapper.orderByDesc("sort").orderByDesc("id");
        Page<THuiminCard> page = new Page<>();
        page.setCurrent(tHuiminCard.getCurrent());
        page.setSize(tHuiminCard.getSize());
cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
@@ -355,13 +355,19 @@
            }
            Store store = storeClient.queryStoreById(re.getStoreId());
            TAppUser appUser = appUserClient.queryAppUser1(re.getAppUserId());
            String studentId = re.getStudentId();
            String[] split = studentId.split(";");
            StringBuilder stringBuilder = new StringBuilder("");
            String studentId = re.getStudentId();
            if (studentId != null && !studentId.trim().isEmpty()) {
                String[] split = studentId.split(";");
            for (String s : split) {
                    if (s == null || s.trim().isEmpty()) {
                        continue;
                    }
                Student student = studentClient.queryStudentById(Integer.valueOf(s));
                stringBuilder.append(student.getName()+",");
                    if (student != null) {
                        stringBuilder.append(student.getName()).append(",");
                    }
                }
            }
            String string = stringBuilder.toString();
            if (string.length() > 0) {
cloud-server-course/src/main/resources/mapper/CoursePackagePaymentConfigMapper.xml
@@ -28,7 +28,13 @@
        t1.payUserName as buyTypeName, t1.classHours as classHours,t1.insertTime as insertTime,t1.coursePackageId as coursePackageId,
        CONCAT(t2.province,t2.city) as provinceAndCity,t2.coursePackageTypeId,t2.storeId,t2.name as coursePackage,
        t3.name as coursePackageType,t1.orderNumber
        from t_course_package_order t1
        from (
            select * from t_course_package_order1
            union all select * from t_course_package_order2
            union all select * from t_course_package_order3
            union all select * from t_course_package_order4
            union all select * from t_course_package_order5
        ) t1
        left join t_course_package t2 on t1.coursePackageId = t2.id
        left join t_course_package_type t3 on t2.coursePackageTypeId = t3.id
        <where>
cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/RefereeList.java
@@ -8,6 +8,8 @@
 */
@Data
public class RefereeList {
    /** 裁判 ID,敏感信息查询时用于精确定位单条记录。 */
    private Integer id;
    /**
     * 姓名
     */
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
@@ -104,9 +104,7 @@
        return storeId;
    }
    /**
     * 运营商统计的门店范围:平台(0)统计平台门店,其他值统计对应运营商门店。
     */
    /** 平台(0)或运营商统计均以门店的 operatorId 作为唯一归属依据。 */
    private List<TStore> listStatisticsStores(Integer operatorId, boolean enabledOnly) {
        LambdaQueryWrapper<TStore> wrapper = new LambdaQueryWrapper<>();
        if (enabledOnly) {
@@ -116,10 +114,8 @@
        }
        if (operatorId == null) {
            // 平台统计:所有门店总和,不按门店所属运营商过滤。
        } else if (Integer.valueOf(0).equals(operatorId)) {
            wrapper.eq(TStore::getType, 1);
        } else {
            wrapper.eq(TStore::getType, 2).eq(TStore::getOperatorId, operatorId);
            wrapper.eq(TStore::getOperatorId, operatorId);
        }
        return storeService.list(wrapper);
    }
@@ -299,7 +295,9 @@
        // 下游多处查询会在门店集合为空时忽略门店过滤。运营商没有任何门店时,
        // 直接返回完整的零值结构,避免被误统计为全平台数据。
        if (operatorId != null && storeId == null
                && listStatisticsStores(operatorId, false).isEmpty()) {
                && storeService.count(new LambdaQueryWrapper<TStore>()
                        .eq(TStore::getOperatorId, operatorId)
                        .ne(TStore::getState, 3)) == 0) {
            Map<String, Object> emptyIncomeData = buildIncomeStatistics(Collections.emptyList());
            emptyIncomeData.put("incomeTypeNet", buildIncomeTypeNet(Collections.emptyList(), null));
            Map<String, Object> emptyTicketIncome = new HashMap<>();
@@ -1293,7 +1291,9 @@
    @RequestMapping(value = "/userAndVipPt")
    @ResponseBody
    public Object userAndVipPt(Integer type) {
        HashMap<String, Object> map = appUserClient.userAndVipYys(listStatisticsAppUserIds(null));
        // 平台用户统计按用户归属全量统计,不能以“已有消费记录”筛选,
        // 否则会遗漏尚未在门店消费的新注册用户。
        HashMap<String, Object> map = appUserClient.userAndVipPt(1);
        return map;
    }
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TFinanceController.java
@@ -340,6 +340,7 @@
                    TAppUser tAppUser = appUserClient.queryById(vipPayment.getAppUserId());
                    IncomeVO temp = new IncomeVO();
                    temp.setId(vipPayment.getId().toString());
                    temp.setAppUserId(vipPayment.getAppUserId());
                    if (tAppUser!=null){
                        if (tAppUser.getProvince()!=null){
                            temp.setProvince(tAppUser.getProvince());
@@ -371,6 +372,7 @@
                    TAppUser tAppUser = appUserClient.queryById(rechargeRecordsVO.getAppUserId());
                    IncomeVO temp = new IncomeVO();
                    temp.setId(rechargeRecordsVO.getId().toString());
                    temp.setAppUserId(rechargeRecordsVO.getAppUserId());
                    if (tAppUser!=null){
                        if (tAppUser.getProvince()!=null){
                            temp.setProvince(tAppUser.getProvince());
@@ -402,6 +404,7 @@
                    TAppUser tAppUser = appUserClient.queryById(registerOrderVO.getAppUserId());
                    IncomeVO temp = new IncomeVO();
                    temp.setId(registerOrderVO.getId().toString());
                    temp.setAppUserId(registerOrderVO.getAppUserId());
                    if (tAppUser!=null){
                        if (tAppUser.getProvince()!=null){
                            temp.setProvince(tAppUser.getProvince());
@@ -458,6 +461,7 @@
                            temp.setStoreName(substring);
                        }
                        temp.setId(competition.getId().toString());
                        temp.setAppUserId(competition.getAppUserId());
                        if (tAppUser!=null){
                            if (tAppUser.getProvince()!=null){
                                temp.setProvince(tAppUser.getProvince());
@@ -492,6 +496,7 @@
                    Store store = storeClient.getStoreById(siteBooking.getStoreId());
                    temp.setId(siteBooking.getId().toString());
                    temp.setAppUserId(siteBooking.getAppUserId());
                    temp.setProvince(siteBooking.getProvince());
                    temp.setCity(siteBooking.getCity());
                    temp.setStoreName(store.getName());
@@ -916,4 +921,3 @@
}
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java
@@ -168,7 +168,19 @@
        tHuiminCard.setObjectType(objectType);
        Integer objectId = user.getObjectId();
        tHuiminCard.setObjectId(objectId);
        return super.packForBT(huiminCardClient.queryPage(tHuiminCard));
        Page<THuiminCard> page = huiminCardClient.queryPage(tHuiminCard);
        page.getRecords().sort(Comparator
                .comparing((THuiminCard card) -> parseSort(card.getSort()), Comparator.nullsLast(Comparator.reverseOrder()))
                .thenComparing(THuiminCard::getId, Comparator.nullsLast(Comparator.reverseOrder())));
        return super.packForBT(page);
    }
    private Long parseSort(String sort) {
        try {
            return sort == null ? null : Long.valueOf(sort);
        } catch (NumberFormatException ignored) {
            return null;
        }
    }
    /**
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TShopController.java
@@ -698,10 +698,17 @@
                        }
                    }
                }else {
                    TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getId, tStore.getProvinceCode()));
                    // 编辑页提交的是行政区划编码;按 id 查询会导致查不到省、市,随后访问名称时抛出 NPE。
                    TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getProvinceCode()));
                    if (one == null) {
                        return ERROR;
                    }
                    tStore.setProvince(one.getName());
                    tStore.setProvinceCode(one.getCode());
                    TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getId, tStore.getCityCode()));
                    TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getCityCode()));
                    if (one1 == null) {
                        return ERROR;
                    }
                    tStore.setCity(one1.getName());
                    tStore.setCityCode(one1.getCode());
                }
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/BallController.java
@@ -292,7 +292,9 @@
        User user = UserExt.getUser();
        ballQueryDto.setType(user.getObjectType());
        ballQueryDto.setId(user.getObjectId());
        return ballClient.list(ballQueryDto);
        List<Game> games = ballClient.list(ballQueryDto);
        games.sort(Comparator.comparing(Game::getId, Comparator.nullsLast(Comparator.reverseOrder())));
        return games;
    }
    @ResponseBody
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/SensitiveDataController.java
@@ -1,12 +1,19 @@
package com.dsh.guns.modular.system.controller.system;
import com.dsh.course.feignClient.account.AppUserClient;
import com.dsh.course.feignClient.account.CoachClient;
import com.dsh.course.feignClient.account.RefereeClient;
import com.dsh.course.feignClient.account.model.CoachSerchVO;
import com.dsh.course.feignClient.account.model.RefereeList;
import com.dsh.guns.config.UserExt;
import com.dsh.guns.core.common.exception.BizExceptionEnum;
import com.dsh.guns.core.exception.GunsException;
import com.dsh.guns.modular.system.audit.ManagementAuditWriter;
import com.dsh.guns.modular.system.model.SiteBooking;
import com.dsh.guns.modular.system.model.TOperator;
import com.dsh.guns.modular.system.model.CoachQuery;
import com.dsh.guns.modular.system.service.ISiteBookingService;
import com.dsh.guns.modular.system.service.TOperatorService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,6 +24,7 @@
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -28,6 +36,9 @@
    @Resource private ManagementAuditWriter auditWriter;
    @Resource private IUserService userService;
    @Resource private ISiteBookingService siteBookingService;
    @Resource private CoachClient coachClient;
    @Resource private RefereeClient refereeClient;
    @Resource private TOperatorService operatorService;
    @GetMapping("/app-user/{id}")
    public Map<String, Object> appUser(@PathVariable Integer id) {
@@ -81,6 +92,67 @@
        return result;
    }
    @GetMapping("/coach/{id}")
    public Map<String, Object> coach(@PathVariable Integer id) {
        assertAdmin();
        // 与教练管理页 /tCoach/list 使用同一个查询入口,确保返回字段和数据权限一致。
        CoachQuery query = new CoachQuery();
        query.setId(id);
        List<CoachSerchVO> coaches = coachClient.listAll(query);
        CoachSerchVO coach = coaches == null || coaches.isEmpty() ? null : coaches.get(0);
        Map<String, Object> result = null;
        if (coach != null) {
            result = new HashMap<String, Object>();
            result.put("id", coach.getId());
            result.put("name", coach.getName());
            result.put("phone", coach.getPhone());
            result.put("idCard", coach.getIdcard());
        }
        writeAudit("coach", id, coach == null ? null : coach.getName(), result == null ? "NOT_FOUND" : "SUCCESS");
        return result;
    }
    @GetMapping("/referee/{id}")
    public Map<String, Object> referee(@PathVariable Integer id) {
        assertAdmin();
        // 使用裁判管理页 /referee/listAll 对应的列表查询接口精确查询该裁判。
        RefereeList query = new RefereeList();
        query.setId(id);
        query.setOffset(0);
        query.setLimit(1);
        Map<String, Object> listResult = refereeClient.getRefereeList(query);
        List<Map<String, Object>> referees = listResult == null ? null
                : (List<Map<String, Object>>) listResult.get("rows");
        Map<String, Object> referee = referees == null || referees.isEmpty() ? null : referees.get(0);
        Map<String, Object> result = null;
        if (referee != null) {
            result = new HashMap<String, Object>();
            result.put("id", referee.get("id"));
            result.put("name", referee.get("name"));
            result.put("phone", referee.get("phone"));
        }
        writeAudit("referee", id, referee == null ? null : String.valueOf(referee.get("name")),
                result == null ? "NOT_FOUND" : "SUCCESS");
        return result;
    }
    @GetMapping("/operator/{id}")
    public Map<String, Object> operator(@PathVariable Integer id) {
        assertAdmin();
        TOperator operator = operatorService.getById(id);
        User employee = operator == null ? null : userService.getById(operator.getUserId());
        Map<String, Object> result = null;
        if (employee != null) {
            result = new HashMap<String, Object>();
            result.put("id", employee.getId());
            result.put("name", employee.getName());
            result.put("phone", employee.getPhone());
            result.put("idCard", employee.getIdCard());
        }
        writeAudit("operator", id, operator == null ? null : operator.getName(), result == null ? "NOT_FOUND" : "SUCCESS");
        return result;
    }
    private void assertAdmin() {
        if (UserExt.getUser() == null || !"admin".equalsIgnoreCase(UserExt.getUser().getAccount())) {
            throw new GunsException(BizExceptionEnum.NO_PERMITION);
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/UserMgrController.java
@@ -175,6 +175,11 @@
        }
        roleLambdaQueryWrapper.eq(Role::getObjType,UserExt.getUser().getObjectType());
        List<Role> list = roleService.list(roleLambdaQueryWrapper);
        // 员工可能是由平台账号创建、后续归属到门店的,原角色不一定属于当前登录人的角色范围。
        // 编辑时仍需保留该角色作为可选项,避免下拉框无法回显。
        if (role != null && list.stream().noneMatch(item -> Objects.equals(item.getId(), role.getId()))) {
            list.add(role);
        }
        model.addAttribute("list",list);
        model.addAttribute("language",UserExt.getLanguage());
        // 部门列表
@@ -461,6 +466,11 @@
                oldUser.setObjectId(null);
            }
        }
        // 门店关联会维护员工归属信息,但不能覆盖编辑页明确选择的角色。
        // 必须在关联处理后写入,否则有门店的员工会被上面的兼容逻辑强制改回角色 3。
        if (!StringUtils.isEmpty(user.getRoleid())) {
            oldUser.setRoleid(user.getRoleid());
        }
        this.userService.updateById(oldUser);
        return SUCCESS_TIP;
    }
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/IncomeVO.java
@@ -23,6 +23,8 @@
          {title:  '状态', field: 'state', visible: true, align: 'center', valign: 'middle',formatter:function (data) {return{1:"已支付",2:"未支付"}[data]}}
     */
    private String id;
    /** 关联用户 ID,仅用于管理端受审计的敏感信息查询。 */
    private Integer appUserId;
    private String province;
    private String city;
    private String storeName;
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/UserListVO.java
@@ -27,6 +27,8 @@
    private String idCard;
    // 所在部门
    private String deptName;
    // 角色名称
    private String roleName;
    // 状态 1=正常 2=冻结
    private Integer status;
cloud-server-management/src/main/resources/mapper/UserMapper.xml
@@ -134,7 +134,8 @@
    </select>
    <select id="searchUsers" resultType="com.dsh.guns.modular.system.model.UserListVO">
        select t1.id,t1.name ,t1.phone ,t1.avatar,t1.birthday,t1.sex,t1.idCard,t1.status,t1.version
        ,t2.simplename as deptName from sys_user t1
        ,t2.simplename as deptName,
        (select group_concat(r.name separator ',') from sys_role r where find_in_set(r.id, t1.roleid)) as roleName from sys_user t1
        left join sys_dept t2 on t1.deptid = t2.id
        <where>
            <if test="query.name != null and query.name != ''">
cloud-server-management/src/main/webapp/WEB-INF/view/common/_container.html
@@ -64,6 +64,7 @@
    <script src="${ctxPath}/js/common/web-upload-object.js"></script>
    <script src="${ctxPath}/js/common/ztree-object.js"></script>
    <script src="${ctxPath}/js/common/Feng.js"></script>
    <script src="${ctxPath}/js/common/sensitive-info.js"></script>
    <script src="${ctxPath}/js/plugins/sweetalert/sweetalert.min.js"></script>
    <script src="${ctxPath}/layui/layui.js"></script>
cloud-server-management/src/main/webapp/WEB-INF/view/system/ball/yuyue.html
@@ -106,6 +106,7 @@
                            <#button name="取消预约" icon="fa-edit" clickFun="TStudent.openTStudentDetail4()" space="true"/>
                            <#button name="手动支付" icon="fa-edit" clickFun="TStudent.openTStudentDetail6()" space="true"/>
                            <#button name="查看详情" icon="fa-edit" clickFun="TStudent.openTStudentDetail5()" space="true"/>
                            <#button name="查看敏感信息" icon="fa-eye" clickFun="TStudent.viewSensitiveData()" space="true"/>
                            <#button name="导出" icon="fa-download" clickFun="TStudent.exportData()" space="true"/>
<!--                            <button id="exportButton">TTTTTTTTTT</button>-->
                        </div>
cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/operatorIncome.html
@@ -1930,6 +1930,8 @@
    var yearX = [];
    var timeX = [];
    var dataX = [];
    // 仅允许接口真实数据渲染,禁止历史遗留的演示图表覆盖统计结果。
    var renderDemoStatistics = false;
    // 创建一个日期对象
    var currentDate = new Date();
    // 获取当前日期的号数
@@ -1966,6 +1968,9 @@
            jxtj()
            srtj()
            income()
        }
        if (!renderDemoStatistics) {
            return;
        }
        var chartDom = document.getElementById('cookieTicket');
        var myChart = echarts.init(chartDom);
@@ -2005,6 +2010,9 @@
    myChart.setOption(option);
    });
    $(function(){
        if (!renderDemoStatistics) {
            return;
        }
        var chartDom = document.getElementById('cookieCourse');
        var myChart = echarts.init(chartDom);
        var option;
@@ -2042,6 +2050,9 @@
        myChart.setOption(option);
    });
    $(function(){
        if (!renderDemoStatistics) {
            return;
        }
        var chartDom = document.getElementById('cookieBooking');
        var myChart = echarts.init(chartDom);
        var option;
@@ -2079,6 +2090,9 @@
        myChart.setOption(option);
    });
    $(function(){
        if (!renderDemoStatistics) {
            return;
        }
        var chartDom = document.getElementById('cookieAge');
        var myChart = echarts.init(chartDom);
        var option;
@@ -2115,6 +2129,9 @@
        myChart.setOption(option);
    });
    $(function(){
        if (!renderDemoStatistics) {
            return;
        }
        var chartDom = document.getElementById('cookieGender');
        var myChart = echarts.init(chartDom);
        var option;
@@ -2151,6 +2168,9 @@
        myChart.setOption(option);
    });
    $(function(){
        if (!renderDemoStatistics) {
            return;
        }
        var chartDom = document.getElementById('cookieTeachCourse');
        var myChart = echarts.init(chartDom);
        var option;
cloud-server-management/src/main/webapp/WEB-INF/view/system/dataStatistics/platformIncome.html
@@ -355,6 +355,12 @@
        var number = Number(value);
        return isFinite(number) ? number.toFixed(2) : '0.00';
    }
    // 首次进入页面时,收入类型来自服务端模板变量;同样按两位小数展示。
    $(function () {
        $('#fee1, #fee2, #fee3, #fee4, #fee5, #fee7').each(function () {
            $(this).text(formatStatisticNumber($(this).text()));
        });
    });
    laydate.render({
        elem: '#beginTime'
        , trigger: 'click'
cloud-server-management/src/main/webapp/WEB-INF/view/system/finance/Income.html
@@ -43,6 +43,9 @@
                                <#button name="重置" icon="fa-trash" clickFun="TCompetition.resetSearch()" space="true"/>
                            </div>
                        </div>
                        <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
                            <#button name="查看敏感信息" icon="fa-eye" clickFun="TCompetition.viewSensitiveData()"/>
                        </div>
                            <div class="ibox-title" style="display: flex">
                                <h3 id ="totalMoney"></h3><h3>元</h3>
                            </div>
cloud-server-management/src/main/webapp/WEB-INF/view/system/finance/RegistrationOrder.html
@@ -83,6 +83,9 @@
                                <#button name="重置" icon="fa-trash" clickFun="TCompetition.resetSearch()" space="true"/>
                            </div>
                        </div>
                        <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
                            <#button name="查看敏感信息" icon="fa-eye" clickFun="TCompetition.viewSensitiveData()"/>
                        </div>
                            <div class="ibox-title" style="display: flex">
                                <h3 id ="totalOrder"></h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                                <h3 id ="cashPayment"></h3><h3>元</h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cloud-server-management/src/main/webapp/WEB-INF/view/system/operator/Operator.html
@@ -41,6 +41,7 @@
                            <#button name="解冻" icon="fa-check" clickFun="TSite.onShelf()" space="true"/>
                            <#button name="重置密码" icon="fa-search" clickFun="TSite.reload()" space="true"/>
                            <#button name="绑定商户号" icon="fa-search" clickFun="TSite.bindWx()" space="true"/>
                            <#button name="查看敏感信息" icon="fa-eye" clickFun="TSite.viewSensitiveData()" space="true"/>
                        </div>
                        <#table id="TSiteTable"/>
                    </div>
cloud-server-management/src/main/webapp/WEB-INF/view/system/referee/referee.html
@@ -59,6 +59,7 @@
              @}
              @if(shiro.hasPermission("/referee/onShelf")){
              <#button name="解冻" icon="fa-edit" clickFun="Referee.onShelf()" space="true"/>
              <#button name="查看敏感信息" icon="fa-eye" clickFun="Referee.viewSensitiveData()" space="true"/>
              @}
            </div>
            <#table id="RefereeTable"/>
cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html
@@ -59,6 +59,7 @@
                    <#button name="解冻" icon="fa-check" clickFun="TSite.onShelf()" space="true"/>
                    <#button name="冻结" icon="fa-remove" clickFun="TSite.offShelf()" space="true"/>
                    <#button name="查看详情" icon="fa-search" clickFun="TSite.openInfo()" space="true"/>
                    <#button name="查看敏感信息" icon="fa-eye" clickFun="TSite.viewSensitiveData()" space="true"/>
                </div>
                <#table id="TSiteTable"/>
            </div>
cloud-server-management/src/main/webapp/WEB-INF/view/system/tIntegral/TIntegral.html
@@ -43,6 +43,7 @@
                </div>
                <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
                    <#button name="赠送积分" icon="fa-plus" clickFun="TSite.openAdd()"/>
                    <#button name="查看敏感信息" icon="fa-eye" clickFun="TSite.viewSensitiveData()" space="true"/>
                </div>
                <#table id="TSiteTable"/>
cloud-server-management/src/main/webapp/WEB-INF/view/system/tPayHuimin/tPayHuimin.html
@@ -76,6 +76,7 @@
                            @}
                            @if(shiro.hasPermission("/tPayHuimin/export")){
                                <#button name="导出" icon="fa-edit" clickFun="TPayHuimin.export()" space="true"/>
                                <#button name="查看敏感信息" icon="fa-eye" clickFun="TPayHuimin.viewSensitiveData()" space="true"/>
                            @}
                            <div class="form-group">
                                <label> 售卖总金额:¥</label>
cloud-server-management/src/main/webapp/WEB-INF/view/system/tShopEvaluation/TShop.html
@@ -55,6 +55,7 @@
                    <#button name="上架" icon="fa-plus" clickFun="TCompetition.updateState(1)"/>
                    <#button name="下架" icon="fa-edit" clickFun="TCompetition.updateState(2)" space="true"/>
                    <#button name="查看详情" icon="fa-remove" clickFun="TCompetition.info()" space="true"/>
                    <#button name="查看敏感信息" icon="fa-eye" clickFun="TCompetition.viewSensitiveData()" space="true"/>
                </div>
                <#table id="TCompetitionTable"/>
            </div>
cloud-server-management/src/main/webapp/WEB-INF/view/system/userAudit/userAudit.html
@@ -27,6 +27,7 @@
                        </div>
                        <div class="hidden-xs" id="DriverApplyRefundTableToolbar" role="group">
                            <#button name="批量审核" icon="fa-plus" clickFun="DriverApplyRefund.auditBatch()"/>
                            <#button name="查看敏感信息" icon="fa-eye" clickFun="DriverApplyRefund.viewSensitiveData()" space="true"/>
                        </div>
                        <#table id="DriverApplyRefundTable"/>
                    </div>
cloud-server-management/src/main/webapp/WEB-INF/view/system/vipDetail/vip_detail.html
@@ -83,6 +83,7 @@
                        <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
                            @if(objectType==1){
                            <#button name="导出" icon="fa-plus" clickFun="TCompetition.export()"/>
                            <#button name="查看敏感信息" icon="fa-eye" clickFun="TCompetition.viewSensitiveData()" space="true"/>
                            @}
                        </div>
                <#table id="TCompetitionTable"/>
cloud-server-management/src/main/webapp/WEB-INF/view/system/vipPayment/vip_payment.html
@@ -47,6 +47,7 @@
                </div>
                        <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
                            <#button name="导出" icon="fa-plus" clickFun="TCompetition.export()"/>
                            <#button name="查看敏感信息" icon="fa-eye" clickFun="TCompetition.viewSensitiveData()" space="true"/>
                        </div>
                <#table id="TCompetitionTable"/>
            </div>
cloud-server-management/src/main/webapp/static/js/common/sensitive-info.js
New file
@@ -0,0 +1,41 @@
/** Admin-only sensitive-information viewer. Every request is audited by the server. */
var SensitiveInfo = {
    view: function (url) {
        layer.confirm('查看完整敏感信息将记录操作日志,是否继续?', {
            icon: 3,
            title: '敏感信息查看'
        }, function (index) {
            $.ajax({
                url: Feng.ctxPath + url,
                type: 'GET',
                success: function (data) {
                    layer.close(index);
                    if (!data) {
                        Feng.info('未查询到敏感信息');
                        return;
                    }
                    // 弹窗只展示手机号;接口中的 id、name 等定位字段不应暴露给页面。
                    var phone = data.phone || data.mobile || data.telephone || data.tel || data.name;
                    if (!phone) {
                        Feng.info('未查询到手机号');
                        return;
                    }
                    var content = '<div class="form-horizontal" style="padding:20px"><div class="form-group">'
                        + '<label class="col-sm-4 control-label">手机号:</label><div class="col-sm-8">'
                        + '<p class="form-control-static">' + SensitiveInfo.escape(String(phone))
                        + '</p></div></div></div>';
                    layer.open({type: 1, title: '敏感信息', area: ['480px', 'auto'], content: content});
                },
                error: function (xhr) {
                    layer.close(index);
                    Feng.error(xhr.responseJSON && xhr.responseJSON.message ? xhr.responseJSON.message : '敏感信息查询失败');
                }
            });
        });
    },
    escape: function (value) {
        return value.replace(/[&<>'"]/g, function (char) {
            return {'&': '&amp;', '<': '&lt;', '>': '&gt;', "'": '&#39;', '"': '&quot;'}[char];
        });
    }
};
cloud-server-management/src/main/webapp/static/modular/system/ball/yuyue.js
@@ -123,6 +123,10 @@
    }
};
TStudent.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/booking/' + this.seItem.id);
};
/**
 * 点击添加
 */
cloud-server-management/src/main/webapp/static/modular/system/finance/RegistrationOrder.js
@@ -49,6 +49,10 @@
    }
};
TCompetition.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/app-user/' + this.seItem.appUserId);
};
@@ -148,4 +152,3 @@
    TCompetition.table = table.init();
    TCompetition.getData();
});
cloud-server-management/src/main/webapp/static/modular/system/finance/income.js
@@ -50,6 +50,12 @@
    }
};
TCompetition.viewSensitiveData = function () {
    if (!this.check()) return;
    if (!this.seItem.appUserId) { Feng.info('该收入记录未关联可查询用户'); return; }
    SensitiveInfo.view('/system/sensitive/app-user/' + this.seItem.appUserId);
};
@@ -147,4 +153,3 @@
    TCompetition.table = table.init();
    TCompetition.getData();
});
cloud-server-management/src/main/webapp/static/modular/system/operator/operator.js
@@ -51,6 +51,10 @@
        return true;
    }
};
TSite.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/operator/' + this.seItem.id);
};
/**
 * 商户号认证
 */
cloud-server-management/src/main/webapp/static/modular/system/referee/referee.js
@@ -45,6 +45,10 @@
        return true;
    }
};
Referee.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/referee/' + this.seItem.id);
};
/**
 * 商户号认证
 */
cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js
@@ -61,6 +61,10 @@
        return true;
    }
};
TSite.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/coach/' + this.seItem.id);
};
/**
 * 上架
 */
cloud-server-management/src/main/webapp/static/modular/system/tIntegral/tIntegral.js
@@ -59,6 +59,13 @@
        return true;
    }
};
TSite.viewSensitiveData = function () {
    if (!this.check()) return;
    var userId = this.seItem.appUserId || this.seItem.userId;
    if (!userId) { Feng.info('该积分记录未关联用户'); return; }
    SensitiveInfo.view('/system/sensitive/app-user/' + userId);
};
TSite.oneChange = function (e) {
    var oneId=$(e).val();
    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
cloud-server-management/src/main/webapp/static/modular/system/tPayHuimin/tPayHuimin.js
@@ -81,6 +81,10 @@
    }
};
TPayHuimin.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/app-user/' + this.seItem.appUserId);
};
/**
 * 点击添加玩湃惠民卡
 */
cloud-server-management/src/main/webapp/static/modular/system/tShopEvaluation/tShop.js
@@ -78,6 +78,13 @@
    }
};
TCompetition.viewSensitiveData = function () {
    if (!this.check()) return;
    var userId = this.seItem.appUserId || this.seItem.userId;
    if (!userId) { Feng.info('该评价未关联用户'); return; }
    SensitiveInfo.view('/system/sensitive/app-user/' + userId);
};
/**
 * 点击添加车辆管理
 */
cloud-server-management/src/main/webapp/static/modular/system/user/user.js
@@ -41,6 +41,7 @@
            }
        },
        {title:  '身份证号', field: 'idCard', align: 'center', valign: 'middle', sortable: true},
        {title:  '角色', field: 'roleName', align: 'center', valign: 'middle', sortable: true},
        {title:  '所在部门', field: 'deptName', align: 'center', valign: 'middle', sortable: true},
        {title:  '状态', field: 'status', align: 'center', valign: 'middle', sortable: true,
            formatter:function (data) {
cloud-server-management/src/main/webapp/static/modular/system/userAudit/userAudit.js
@@ -105,6 +105,10 @@
    return true;
};
DriverApplyRefund.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/app-user/' + this.seItem.userId);
};
/**
 * 打开编辑
cloud-server-management/src/main/webapp/static/modular/system/vipDetail/vipDetail.js
@@ -39,6 +39,17 @@
    ];
};
TCompetition.check = function () {
    var selected = $('#' + this.id).bootstrapTable('getSelections');
    if (selected.length === 0) { Feng.info('请先选中表格中的某一记录!'); return false; }
    TCompetition.seItem = selected[0];
    return true;
};
TCompetition.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/app-user/' + this.seItem.appUserId);
};
TCompetition.export = function (){
    var queryData = TCompetition.getQueryParam();
cloud-server-management/src/main/webapp/static/modular/system/vipPayment/vipPayment.js
@@ -56,6 +56,17 @@
    ];
};
TCompetition.check = function () {
    var selected = $('#' + this.id).bootstrapTable('getSelections');
    if (selected.length === 0) { Feng.info('请先选中表格中的某一记录!'); return false; }
    TCompetition.seItem = selected[0];
    return true;
};
TCompetition.viewSensitiveData = function () {
    if (this.check()) SensitiveInfo.view('/system/sensitive/app-user/' + this.seItem.appUserId);
};
TCompetition.export = function (){
    var queryData = TCompetition.getQueryParam();
    // 生成带参数的完整URL
cloud-server-other/src/main/resources/mapper/GameMapper.xml
@@ -33,7 +33,7 @@
            and si.`name` like concat('%',#{query.site},'%')
        </if>
        order by ga.id desc
    </select>
    <select id="orderlist" resultType="map">