diff --git a/src/main/java/com/example/demo/Util/StringToListTypeHandler.java b/src/main/java/com/example/demo/Util/StringToListTypeHandler.java new file mode 100644 index 0000000..cd5fcf0 --- /dev/null +++ b/src/main/java/com/example/demo/Util/StringToListTypeHandler.java @@ -0,0 +1,43 @@ +package com.example.demo.Util; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.List; + +public class StringToListTypeHandler extends BaseTypeHandler> { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + // 将 List 转换为字符串 + ps.setString(i, String.join(",", parameter)); + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return parseStringToList(rs.getString(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return parseStringToList(rs.getString(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return parseStringToList(cs.getString(columnIndex)); + } + + private List parseStringToList(String str) { + if (str == null || str.isEmpty()) { + return null; + } + return Arrays.asList(str.split(",")); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/AdminController.java b/src/main/java/com/example/demo/controller/AdminController.java index ab56559..0af8e9f 100644 --- a/src/main/java/com/example/demo/controller/AdminController.java +++ b/src/main/java/com/example/demo/controller/AdminController.java @@ -1,13 +1,11 @@ package com.example.demo.controller; import com.example.demo.Util.JWTUtil; -import com.example.demo.Util.TokenPayload; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.Password; import com.example.demo.domain.vo.Result; +import com.example.demo.mapper.AdminMapper; import com.example.demo.service.AdminService; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -30,15 +28,24 @@ import org.springframework.web.bind.annotation.*; public class AdminController { @Autowired private AdminService adminService; + @Autowired + private AdminMapper adminMapper; + + @PostMapping("/test") + public void testGetAdmin() { + Admin admin = adminMapper.getAdmin("14518"); + System.out.println(admin.getMarkets()); // 应该输出 "马来西亚,新加坡,美国" + } @PostMapping("/login") - public Result login(@RequestBody Admin admin) { + public Result login(@RequestBody Admin admin) { try { admin = adminService.login(admin); String token = JWTUtil.createJWT(admin); System.out.println(token); admin.setPassword(null); + return Result.success(token, admin); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/example/demo/controller/RoleController.java b/src/main/java/com/example/demo/controller/RoleController.java index 237b919..4265642 100644 --- a/src/main/java/com/example/demo/controller/RoleController.java +++ b/src/main/java/com/example/demo/controller/RoleController.java @@ -46,6 +46,12 @@ public class RoleController { List list = roleService.selectAllRole(); return Result.success(list); } + //获取上级角色的下属角色列表 + @PostMapping("/selectSub") + public List selectSub(Integer fatherId) { + + return roleService.selectSubRole(fatherId); + } } diff --git a/src/main/java/com/example/demo/controller/WorkbenchController.java b/src/main/java/com/example/demo/controller/WorkbenchController.java index 429a95f..a3f4b03 100644 --- a/src/main/java/com/example/demo/controller/WorkbenchController.java +++ b/src/main/java/com/example/demo/controller/WorkbenchController.java @@ -43,7 +43,7 @@ public class WorkbenchController { */ @PostMapping("getCard") public ResponseEntity card1(@RequestBody WorkbenchCard workbench){ - WorkbenchCard result =workbenchService.getCardCache(workbench.getMarkets()); + WorkbenchCard result =workbenchService.getCard(workbench.getMarkets()); return ResponseEntity.ok(result); } /* diff --git a/src/main/java/com/example/demo/domain/entity/Admin.java b/src/main/java/com/example/demo/domain/entity/Admin.java index 7f8fdc7..f46d1d1 100644 --- a/src/main/java/com/example/demo/domain/entity/Admin.java +++ b/src/main/java/com/example/demo/domain/entity/Admin.java @@ -24,7 +24,9 @@ public class Admin implements UserDetails, Serializable { private String password; // 密码 private String machineId; // 机器码,限两个 private Byte adminStatus; // 状态(启用/不启用) - private List market; // 地区 + private List market; // 地区列表 + private String markets; // 地区 + private String postiton; // 职位 private String remark; // 备注 @@ -34,7 +36,10 @@ public class Admin implements UserDetails, Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date updateTime; // 更新时间 private Integer roleId; - + // 添加一个方法来方便测试和调试 + // public void setMarket(String marketStr) { + // this.market = Arrays.asList(marketStr.split(",")); + //} @Override @JsonIgnore diff --git a/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java b/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java index 3abc2cd..025490d 100644 --- a/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java +++ b/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java @@ -32,6 +32,9 @@ public class WorkbenchCard implements Serializable { private Date endDate; // 结束时间 private Integer sumWow; // 总周同比(%) private Integer sumDaily; // 总日环比(%) + //更新时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date updateTime; } diff --git a/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java b/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java index fb1ea4b..1554bdc 100644 --- a/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java +++ b/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java @@ -38,7 +38,7 @@ public class WorkbenchMarketCard implements Serializable { private Integer yearlyRecharge; // 全年累计充值金币数 private Integer yearlyMoney; // 全年累计金额 - // 卡片三:当日消费/退款/消耗相关 + // 卡片三:昨日消费/退款/消耗相关 private Integer consumePermanent; // 昨日新增消费(永久) private Integer consumeFreeJune; // 昨日新增消费(六月免费) private Integer consumeFreeDecember; // 昨日新增消费(十二月免费) @@ -54,6 +54,7 @@ public class WorkbenchMarketCard implements Serializable { // 卡片四:人头数相关 private Integer rechargeNum; // 当日充值人数 + private Integer ydayRechargeNum; // 当日充值人数 private Integer firstRecharge; // 当日首充人数 private Integer wow; // 周同比(%) private Integer daily; // 日环比(%) @@ -61,8 +62,8 @@ public class WorkbenchMarketCard implements Serializable { private Integer sumDaily; // 总日环比(%) private Integer yearlyRechargeNum; // 全年累计充值人头数 -/* //更新时间 + //更新时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") - private Date updateTime;*/ + private Date updateTime; } diff --git a/src/main/java/com/example/demo/mapper/RoleMapper.java b/src/main/java/com/example/demo/mapper/RoleMapper.java index ab01315..1e9d624 100644 --- a/src/main/java/com/example/demo/mapper/RoleMapper.java +++ b/src/main/java/com/example/demo/mapper/RoleMapper.java @@ -31,4 +31,6 @@ public interface RoleMapper { //新建角色 void addRole(RoleVo roleVo); + //根据父级id查下属角色 + List selectByFatherId(Integer fatherId); } diff --git a/src/main/java/com/example/demo/service/RoleService.java b/src/main/java/com/example/demo/service/RoleService.java index b802381..decce7e 100644 --- a/src/main/java/com/example/demo/service/RoleService.java +++ b/src/main/java/com/example/demo/service/RoleService.java @@ -22,4 +22,6 @@ public interface RoleService { //查找全部角色 List selectAllRole(); + //根据父级id查找下属角色 + List selectSubRole(Integer fatherId); } diff --git a/src/main/java/com/example/demo/serviceImpl/AdminServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/AdminServiceImpl.java index f044210..73c8a4e 100644 --- a/src/main/java/com/example/demo/serviceImpl/AdminServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/AdminServiceImpl.java @@ -11,14 +11,10 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.time.LocalDateTime; import java.util.Date; import java.util.regex.Pattern; @@ -41,6 +37,7 @@ public class AdminServiceImpl implements AdminService { Admin adminInDB = adminMapper.getAdmin(account); System.out.println("adminInDB:" + adminInDB); + System.out.println("adminInDB markets: " + adminInDB.getMarkets()); // 添加日志检查 if (adminInDB == null) { throw new RuntimeException("无此精网号"); } @@ -56,6 +53,8 @@ public class AdminServiceImpl implements AdminService { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(account, admin.getPassword()); Authentication authentication = authenticationManager.authenticate(token); + Admin authenticatedAdmin = (Admin) authentication.getPrincipal(); + System.out.println("authenticatedAdmin markets: " + authenticatedAdmin.getMarkets()); // 添加日志检查 return (Admin) authentication.getPrincipal(); } catch (Exception e) { diff --git a/src/main/java/com/example/demo/serviceImpl/PermissionServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/PermissionServiceImpl.java index 9e7a52a..1586303 100644 --- a/src/main/java/com/example/demo/serviceImpl/PermissionServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/PermissionServiceImpl.java @@ -90,6 +90,7 @@ public class PermissionServiceImpl implements PermissionService { } else { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); admin.setPassword(passwordEncoder.encode(("123456"))); + // 将地区列表转换为逗号分隔的字符串 String markets = String.join(",", admin.getMarket()); admin.setMarket(Collections.singletonList(markets)); diff --git a/src/main/java/com/example/demo/serviceImpl/RoleServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RoleServiceImpl.java index 50c7db9..2c18c4c 100644 --- a/src/main/java/com/example/demo/serviceImpl/RoleServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/RoleServiceImpl.java @@ -69,6 +69,11 @@ public class RoleServiceImpl implements RoleService { public List selectAllRole() { return roleMapper.selectAllRole(); } + + @Override + public List selectSubRole(Integer fatherId) { + return roleMapper.selectByFatherId(fatherId); + } } diff --git a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java index f16e12e..89af8d7 100644 --- a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java @@ -92,8 +92,9 @@ public class WorkbenchServiceImpl implements WorkbenchService { .collect(Collectors.toList()); Integer sumWow= calculateAllWeekOverWeek(date); Integer sumDaily=calculateAllDayOverDay(date); + Date updateTime = findLatestUpdateTime(currentStatsList); - return new WorkbenchCard(marketCards, new ArrayList<>(), markets, new Date(), new Date(),sumWow,sumDaily); + return new WorkbenchCard(marketCards, new ArrayList<>(), markets, new Date(), new Date(),sumWow,sumDaily,updateTime); } @Override @@ -163,14 +164,15 @@ public class WorkbenchServiceImpl implements WorkbenchService { card.setYearlyReduce(card.getYearlyConsume() - card.getYearlyRefund());//年累计消耗 // 卡片四:人头数相关 card.setRechargeNum(currentStatistics.getRechargeNum()); + card.setYdayRechargeNum(ydayStatistics.getRechargeNum()); card.setFirstRecharge(currentStatistics.getFirstRecharge()); card.setYearlyRechargeNum(currentStatistics.getYearlyRechargeNum()); // 周环比、日同比 card.setWow(calculateWeekOverWeek(market, currentDate)); card.setDaily(calculateDayOverDay(market, currentDate)); - /* //更新时间 - card.setUpdateTime(currentStatistics.getUpdateTime());*/ + //更新时间 + card.setUpdateTime(currentStatistics.getUpdateTime()); } return card; } @@ -178,7 +180,7 @@ public class WorkbenchServiceImpl implements WorkbenchService { @Override public WorkbenchCard getGraph( Date startDate, Date endDate, List markets) { if (markets == null || markets.isEmpty()) { - return new WorkbenchCard(new ArrayList<>(), new ArrayList<>(), markets, startDate, endDate,0,0); + return new WorkbenchCard(new ArrayList<>(), new ArrayList<>(), markets, startDate, endDate,0,0,new Date()); } // 单次批量查询 @@ -216,7 +218,7 @@ public class WorkbenchServiceImpl implements WorkbenchService { marketGraphs.add(graph); } - return new WorkbenchCard(new ArrayList<>(), marketGraphs, markets, startDate, endDate,0,0); + return new WorkbenchCard(new ArrayList<>(), marketGraphs, markets, startDate, endDate,0,0,new Date()); } /* @@ -365,6 +367,16 @@ public class WorkbenchServiceImpl implements WorkbenchService { .atStartOfDay(ZoneId.systemDefault()) .toInstant()); } + //获取最近的更新时间 + private Date findLatestUpdateTime(List statsList) { + // 使用流式处理来找到最新的 updateTime + Optional latestUpdateTime = statsList.stream() + .map(Statistics::getUpdateTime) + .filter(Objects::nonNull) + .max(Date::compareTo); + + return latestUpdateTime.orElse(new Date(0)); // 如果没有找到,则返回一个较早的时间点 + } } diff --git a/src/main/resources/mapper/AdminMapper.xml b/src/main/resources/mapper/AdminMapper.xml index 83a9c7f..1687ab4 100644 --- a/src/main/resources/mapper/AdminMapper.xml +++ b/src/main/resources/mapper/AdminMapper.xml @@ -3,11 +3,36 @@ SELECT id,role_name FROM role +