From 98d1455efaa4cd3d5d3213e047ccc0ac187ba05c Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期一, 03 八月 2026 17:30:53 +0800
Subject: [PATCH] feat(admin): 添加政策文章管理和商户功能增强
---
talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminManagementService.java | 47 ++++++++++++++++++++++++++++++++++-------------
1 files changed, 34 insertions(+), 13 deletions(-)
diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminManagementService.java b/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminManagementService.java
index c93a34b..9aac12c 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminManagementService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminManagementService.java
@@ -1,21 +1,42 @@
package com.talentcard.server.business.admin;
+
+import com.alibaba.fastjson.JSON;
import com.talentcard.server.business.DatabaseRows;
import com.talentcard.server.business.merchant.auth.MerchantPasswordHasher;
-import com.talentcard.server.common.*;
+import com.talentcard.server.common.BusinessException;
+import com.talentcard.server.common.ErrorCode;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import java.util.*;
-@Service public class AdminManagementService {
- private final JdbcTemplate jdbc; public AdminManagementService(JdbcTemplate jdbc) { this.jdbc=jdbc; }
- public Map<String,Object> settings() { Map<String,Object> result=new LinkedHashMap<>(); for(Map<String,Object> row: rows("select setting_key, setting_value from admin_setting")) result.put(String.valueOf(row.get("settingKey")), row.get("settingValue")); return result; }
- @Transactional public Map<String,Object> saveSettings(Map<String,String> body) { for(String key: List.of("bookstoreDiscount","hotelSubsidy","homeVideoUrl","miniProgramUrl")) jdbc.update("insert into admin_setting(setting_key, setting_value) values (?, ?) on duplicate key update setting_value = values(setting_value)",key,body.getOrDefault(key,"")); return settings(); }
- public List<Map<String,Object>> roles() { return rows("select id, role_name, role_code, remark, status, created_at from admin_role order by id"); }
- @Transactional public Map<String,Object> createRole(AdminRoleRequest r) { jdbc.update("insert into admin_role(role_name,role_code,remark,status) values (?,?,?,?)",r.roleName().trim(),r.roleCode().trim(),r.remark(),r.status()); return one("select id, role_name, role_code, remark, status, created_at from admin_role where id=last_insert_id()"); }
- @Transactional public Map<String,Object> updateRole(Long id, AdminRoleRequest r) { if(jdbc.update("update admin_role set role_name=?,role_code=?,remark=?,status=? where id=?",r.roleName().trim(),r.roleCode().trim(),r.remark(),r.status(),id)==0) throw new BusinessException(ErrorCode.NOT_FOUND,"角色不存在"); return one("select id, role_name, role_code, remark, status, created_at from admin_role where id=?",id); }
- public List<Map<String,Object>> staff() { return rows("select id,account,display_name,role_code,status,created_at from admin_operator where deleted=0 order by id"); }
- @Transactional public Map<String,Object> createStaff(AdminStaffRequest r) { if(r.password()==null||r.password().isBlank()) throw new BusinessException(ErrorCode.BAD_REQUEST,"新建员工必须设置登录密码"); jdbc.update("insert into admin_operator(account,password_hash,display_name,role_code,status) values (?,?,?,?,?)",r.account().trim(),MerchantPasswordHasher.encode(r.password()),r.displayName().trim(),r.roleCode(),r.status()); return one("select id,account,display_name,role_code,status,created_at from admin_operator where id=last_insert_id()"); }
- @Transactional public Map<String,Object> updateStaff(Long id, AdminStaffRequest r) { String sql=(r.password()==null||r.password().isBlank())?"update admin_operator set account=?,display_name=?,role_code=?,status=? where id=?":"update admin_operator set account=?,password_hash=?,display_name=?,role_code=?,status=? where id=?"; int n=(r.password()==null||r.password().isBlank())?jdbc.update(sql,r.account().trim(),r.displayName().trim(),r.roleCode(),r.status(),id):jdbc.update(sql,r.account().trim(),MerchantPasswordHasher.encode(r.password()),r.displayName().trim(),r.roleCode(),r.status(),id); if(n==0) throw new BusinessException(ErrorCode.NOT_FOUND,"员工不存在"); return one("select id,account,display_name,role_code,status,created_at from admin_operator where id=?",id); }
- private List<Map<String,Object>> rows(String sql,Object...args){return DatabaseRows.normalize(jdbc.queryForList(sql,args));} private Map<String,Object> one(String sql,Object...args){List<Map<String,Object>> r=rows(sql,args);if(r.isEmpty())throw new BusinessException(ErrorCode.NOT_FOUND,"记录不存在");return r.get(0);}
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class AdminManagementService {
+ private final JdbcTemplate jdbc;
+ public AdminManagementService(JdbcTemplate jdbc) { this.jdbc = jdbc; }
+
+ public Map<String, Object> settings() { Map<String, Object> result = new LinkedHashMap<>(); for (Map<String, Object> row : rows("select setting_key, setting_value from admin_setting")) result.put(String.valueOf(row.get("settingKey")), row.get("settingValue")); return result; }
+ @Transactional public Map<String, Object> saveSettings(Map<String, String> body) { for (String key : List.of("bookstoreDiscount", "hotelSubsidy", "homeVideoUrl", "miniProgramUrl")) jdbc.update("insert into admin_setting(setting_key, setting_value) values (?, ?) on duplicate key update setting_value = values(setting_value)", key, body.getOrDefault(key, "")); return settings(); }
+
+ public List<Map<String, Object>> roles() { return rows("select id, role_name, role_code, remark, permission_codes, status, created_at from admin_role order by id"); }
+ @Transactional public Map<String, Object> createRole(AdminRoleRequest request) { String code = roleCode(request.roleCode()); jdbc.update("insert into admin_role(role_name,role_code,remark,permission_codes,status) values (?,?,?,?,?)", request.roleName().trim(), code, request.remark(), permissions(request.permissionCodes()), request.status()); return one("select id, role_name, role_code, remark, permission_codes, status, created_at from admin_role where id=last_insert_id()"); }
+ @Transactional public Map<String, Object> updateRole(Long id, AdminRoleRequest request) { String code = request.roleCode() == null || request.roleCode().isBlank() ? existingRoleCode(id) : request.roleCode().trim(); if (jdbc.update("update admin_role set role_name=?,role_code=?,remark=?,permission_codes=?,status=? where id=?", request.roleName().trim(), code, request.remark(), permissions(request.permissionCodes()), request.status(), id) == 0) throw new BusinessException(ErrorCode.NOT_FOUND, "Role does not exist"); return one("select id, role_name, role_code, remark, permission_codes, status, created_at from admin_role where id=?", id); }
+
+ public List<Map<String, Object>> staff() { return rows("select id,account,display_name,mobile,role_code,position_name,customer_wechat,status,created_at from admin_operator where deleted=0 order by id"); }
+ @Transactional public Map<String, Object> createStaff(AdminStaffRequest request) { if (request.password() == null || request.password().isBlank()) throw new BusinessException(ErrorCode.BAD_REQUEST, "A password is required for a new staff account"); jdbc.update("insert into admin_operator(account,password_hash,display_name,mobile,role_code,position_name,customer_wechat,status) values (?,?,?,?,?,?,?,?)", request.account().trim(), MerchantPasswordHasher.encode(request.password()), request.displayName().trim(), blankToNull(request.mobile()), request.roleCode(), request.positionName().trim(), blankToNull(request.customerWechat()), request.status()); return staffOne("last_insert_id()"); }
+ @Transactional public Map<String, Object> updateStaff(Long id, AdminStaffRequest request) { String sql = request.password() == null || request.password().isBlank() ? "update admin_operator set account=?,display_name=?,mobile=?,role_code=?,position_name=?,customer_wechat=?,status=? where id=?" : "update admin_operator set account=?,password_hash=?,display_name=?,mobile=?,role_code=?,position_name=?,customer_wechat=?,status=? where id=?"; int updated = request.password() == null || request.password().isBlank() ? jdbc.update(sql, request.account().trim(), request.displayName().trim(), blankToNull(request.mobile()), request.roleCode(), request.positionName().trim(), blankToNull(request.customerWechat()), request.status(), id) : jdbc.update(sql, request.account().trim(), MerchantPasswordHasher.encode(request.password()), request.displayName().trim(), blankToNull(request.mobile()), request.roleCode(), request.positionName().trim(), blankToNull(request.customerWechat()), request.status(), id); if (updated == 0) throw new BusinessException(ErrorCode.NOT_FOUND, "Staff account does not exist"); return staffOne("?", id); }
+ @Transactional public Map<String, Object> resetStaffPassword(Long id, String password) { if (password == null || password.length() < 6 || password.length() > 64) throw new BusinessException(ErrorCode.BAD_REQUEST, "Password must be 6-64 characters"); int updated = jdbc.update("update admin_operator set password_hash=?, login_failed_count=0, locked_until=null where id=? and deleted=0", MerchantPasswordHasher.encode(password), id); if (updated == 0) throw new BusinessException(ErrorCode.NOT_FOUND, "Staff account does not exist"); return Map.of("id", id, "reset", true); }
+ @Transactional public Map<String, Object> deleteStaff(Long id) { int updated = jdbc.update("update admin_operator set deleted=1, status=0 where id=? and deleted=0 and account <> 'admin'", id); if (updated == 0) throw new BusinessException(ErrorCode.CONFLICT, "The account cannot be deleted or does not exist"); return Map.of("id", id, "deleted", true); }
+
+ private String roleCode(String supplied) { return supplied == null || supplied.isBlank() ? "role_" + System.currentTimeMillis() : supplied.trim(); }
+ private Map<String, Object> staffOne(String where, Object... args) { return one("select id,account,display_name,mobile,role_code,position_name,customer_wechat,status,created_at from admin_operator where id=" + where, args); }
+ private String blankToNull(String value) { return value == null || value.isBlank() ? null : value.trim(); }
+ private String existingRoleCode(Long id) { List<Map<String, Object>> result = rows("select role_code from admin_role where id=?", id); if (result.isEmpty()) throw new BusinessException(ErrorCode.NOT_FOUND, "Role does not exist"); return String.valueOf(result.get(0).get("roleCode")); }
+ private String permissions(List<String> values) { LinkedHashSet<String> clean = new LinkedHashSet<>(); if (values != null) for (String value : values) if (value != null && !value.isBlank()) clean.add(value.trim()); return JSON.toJSONString(clean); }
+ private List<Map<String, Object>> rows(String sql, Object... args) { return DatabaseRows.normalize(jdbc.queryForList(sql, args)); }
+ private Map<String, Object> one(String sql, Object... args) { List<Map<String, Object>> result = rows(sql, args); if (result.isEmpty()) throw new BusinessException(ErrorCode.NOT_FOUND, "Record does not exist"); return result.get(0); }
}
--
Gitblit v1.7.1