From 6df61832b9b3339ec3e877447272040744bee4a2 Mon Sep 17 00:00:00 2001 From: qaq <1937228092@qq.com> Date: Wed, 18 Jun 2025 14:41:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=81=E9=87=8F=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go-gost/main.go | 1 - go-gost/traffic_reporter.go | 4 +- go-gost/x/handler/forward/local/handler.go | 2 +- .../admin/common/dto/ChangePasswordDto.java | 3 + .../com/admin/controller/FlowController.java | 162 +++---- .../admin/service/impl/UserServiceImpl.java | 41 +- vue-frontend/src/router/index.js | 4 +- vue-frontend/src/views/ChangePassword.vue | 414 ++++++++++++++++++ vue-frontend/src/views/Login.vue | 11 + 9 files changed, 554 insertions(+), 88 deletions(-) create mode 100644 vue-frontend/src/views/ChangePassword.vue diff --git a/go-gost/main.go b/go-gost/main.go index c7ffbf5..1cb9887 100644 --- a/go-gost/main.go +++ b/go-gost/main.go @@ -118,7 +118,6 @@ func main() { log := xlogger.NewLogger() logger.SetDefault(log) - // 使用内存流量管理器 trafficMgr := traffic.GetGlobalManager() defer trafficMgr.Close() diff --git a/go-gost/traffic_reporter.go b/go-gost/traffic_reporter.go index 7d258fc..259e0c5 100644 --- a/go-gost/traffic_reporter.go +++ b/go-gost/traffic_reporter.go @@ -36,13 +36,13 @@ func StartTrafficReporter(trafficMgr traffic.Manager) { return } - ticker := time.NewTicker(1 * time.Second) + ticker := time.NewTicker(5 * time.Second) go func() { defer ticker.Stop() for range ticker.C { - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) // 先获取流量统计(不清零) stats, err := trafficMgr.GetAllServicesStats(ctx) diff --git a/go-gost/x/handler/forward/local/handler.go b/go-gost/x/handler/forward/local/handler.go index c1b7d5d..5d18880 100644 --- a/go-gost/x/handler/forward/local/handler.go +++ b/go-gost/x/handler/forward/local/handler.go @@ -126,7 +126,7 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand if h.trafficManager != nil { go func() { - ticker := time.NewTicker(1 * time.Second) + ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() // 记录上次的流量值 diff --git a/springboot-backend/src/main/java/com/admin/common/dto/ChangePasswordDto.java b/springboot-backend/src/main/java/com/admin/common/dto/ChangePasswordDto.java index 9d2d9b0..c6d6bd3 100644 --- a/springboot-backend/src/main/java/com/admin/common/dto/ChangePasswordDto.java +++ b/springboot-backend/src/main/java/com/admin/common/dto/ChangePasswordDto.java @@ -7,6 +7,9 @@ import javax.validation.constraints.NotBlank; @Data public class ChangePasswordDto { + @NotBlank(message = "新用户名不能为空") + private String newUsername; + @NotBlank(message = "当前密码不能为空") private String currentPassword; diff --git a/springboot-backend/src/main/java/com/admin/controller/FlowController.java b/springboot-backend/src/main/java/com/admin/controller/FlowController.java index 3c902fd..2d82947 100644 --- a/springboot-backend/src/main/java/com/admin/controller/FlowController.java +++ b/springboot-backend/src/main/java/com/admin/controller/FlowController.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; /** * 流量上报控制器 * 处理节点上报的流量数据,更新用户和隧道的流量统计 - * + *

* 主要功能: * 1. 接收并处理节点上报的流量数据 * 2. 更新转发、用户和隧道的流量统计 @@ -31,7 +31,7 @@ import java.util.stream.Collectors; * 7. 检查用户状态,状态不为1时暂停所有服务 * 8. 检查转发状态,状态不为1时暂停对应转发 * 9. 检查用户隧道权限状态,状态不为1时暂停对应转发 - * + *

* 并发安全解决方案: * 1. 使用UpdateWrapper进行数据库层面的原子更新操作,避免读取-修改-写入的竞态条件 * 2. 使用synchronized锁确保同一用户/隧道的流量更新串行执行 @@ -60,10 +60,12 @@ public class FlowController extends BaseController { public String test() { return "test"; } + /** * 处理流量数据上报 + * * @param flowDataList 流量数据列表 - * @param secret 节点密钥 + * @param secret 节点密钥 * @return 处理结果 */ @RequestMapping("/upload") @@ -102,24 +104,34 @@ public class FlowController extends BaseController { // 6. 获取流量计费类型 int flowType = getFlowType(forward); - // 7. 更新流量统计:转发存在就更新转发流量 + // 7. 先更新所有流量统计 - 确保流量数据的一致性 + // 7.1 更新转发流量 if (forward != null) { updateForwardFlow(forwardId, flowStats); } - // 8. 用户存在就更新用户流量和进行用户相关检查 + // 7.2 更新用户流量 if (user != null) { updateUserFlow(userId, flowStats, flowType); - checkUserRelatedLimits(user, userTunnelId, forward); } - // 9. 隧道权限存在就更新隧道权限流量和进行隧道相关检查 + // 7.3 更新隧道权限流量 if (userTunnel != null) { - updateUserTunnelFlow(userTunnelId, flowStats, flowType, forwardId, userId); - checkUserTunnelRelatedLimits(userTunnel, forwardId, userId, userTunnelId, forward); + updateUserTunnelFlow(userTunnelId, flowStats); } - // 10. 转发存在就进行转发状态检查 + // 8. 流量更新完成后,再进行各种检查和服务暂停操作 + // 8.1 用户相关检查 + if (user != null) { + checkUserRelatedLimits(user, userTunnelId); + } + + // 8.2 隧道权限相关检查 + if (userTunnel != null) { + checkUserTunnelRelatedLimits(userTunnel, forwardId, userId, userTunnelId, forward, flowType); + } + + // 8.3 转发状态检查 if (forward != null) { checkForwardStatus(forward, userId, userTunnelId); } @@ -135,15 +147,6 @@ public class FlowController extends BaseController { return nodeCount > 0; } - /** - * 过滤有效的流量数据 - */ - private List filterValidFlowData(List flowDataList) { - return flowDataList.stream() - .filter(flow -> flow.getU() != null && flow.getD() != null) - .filter(flow -> flow.getU() > 0 && flow.getD() > 0) - .collect(Collectors.toList()); - } /** * 解析服务名称获取ID信息 @@ -158,12 +161,12 @@ public class FlowController extends BaseController { private FlowStatistics calculateTotalFlow(List validFlowData) { long totalUpload = 0L; long totalDownload = 0L; - + for (FlowDto flow : validFlowData) { totalUpload += flow.getU(); totalDownload += flow.getD(); } - + return new FlowStatistics(totalUpload, totalDownload); } @@ -172,38 +175,38 @@ public class FlowController extends BaseController { */ private int getFlowType(Forward forward) { int defaultFlowType = FLOW_TYPE_BIDIRECTIONAL; - + if (forward != null) { Tunnel tunnel = tunnelService.getById(forward.getTunnelId()); if (tunnel != null) { return tunnel.getFlow(); } } - + return defaultFlowType; } /** * 更新转发流量统计 - 使用原子操作避免并发问题 */ - private void updateForwardFlow(String forwardId, FlowStatistics flowStats) { + private boolean updateForwardFlow(String forwardId, FlowStatistics flowStats) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", forwardId); updateWrapper.setSql("in_flow = in_flow + " + flowStats.getDownload()); updateWrapper.setSql("out_flow = out_flow + " + flowStats.getUpload()); - - forwardService.update(null, updateWrapper); + + return forwardService.update(null, updateWrapper); } /** * 更新用户流量统计 - 使用原子操作避免并发问题 */ - private void updateUserFlow(String userId, FlowStatistics flowStats, int flowType) { + private boolean updateUserFlow(String userId, FlowStatistics flowStats, int flowType) { // 对相同用户的流量更新进行同步,避免并发覆盖 synchronized (getUserLock(userId)) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", userId); - + // 使用SQL的原子更新操作,避免读取-修改-写入的并发问题 if (flowType == FLOW_TYPE_BIDIRECTIONAL) { // 双向计费:同时更新上传和下载流量 @@ -213,18 +216,17 @@ public class FlowController extends BaseController { // 仅上传计费:只更新上传流量 updateWrapper.setSql("out_flow = out_flow + " + flowStats.getUpload()); } - - userService.update(null, updateWrapper); + + return userService.update(null, updateWrapper); } } /** - * 更新用户隧道流量统计并检查限制 - 优化版本,避免重复查询 + * 更新用户隧道流量统计 - 优化版本,仅负责流量更新 */ - private void updateUserTunnelFlow(String userTunnelId, FlowStatistics flowStats, - int flowType, String forwardId, String userId) { + private boolean updateUserTunnelFlow(String userTunnelId, FlowStatistics flowStats) { if (Objects.equals(userTunnelId, DEFAULT_USER_TUNNEL_ID)) { - return; + return true; // 默认隧道不需要更新,返回成功 } // 对相同用户隧道的流量更新进行同步,避免并发覆盖 @@ -233,31 +235,22 @@ public class FlowController extends BaseController { updateWrapper.eq("id", userTunnelId); updateWrapper.setSql("in_flow = in_flow + " + flowStats.getDownload()); updateWrapper.setSql("out_flow = out_flow + " + flowStats.getUpload()); - - boolean updateSuccess = userTunnelService.update(null, updateWrapper); - if (!updateSuccess) { - return; // 更新失败,可能记录不存在 - } - } - // 重新获取最新的流量数据进行限制检查 - UserTunnel updatedUserTunnel = userTunnelService.getById(userTunnelId); - if (updatedUserTunnel != null) { - checkUserTunnelFlowLimit(updatedUserTunnel, flowType, forwardId, userId, userTunnelId); + return userTunnelService.update(null, updateWrapper); } } /** * 检查用户隧道流量限制 - 优化版本,使用传入的UserTunnel实体 */ - private void checkUserTunnelFlowLimit(UserTunnel userTunnel, int flowType, - String forwardId, String userId, String userTunnelId) { - long currentFlow = (flowType == FLOW_TYPE_UPLOAD_ONLY) ? - userTunnel.getOutFlow() : - userTunnel.getInFlow() + userTunnel.getOutFlow(); + private void checkUserTunnelFlowLimit(UserTunnel userTunnel, int flowType, + String forwardId, String userId, String userTunnelId) { + long currentFlow = (flowType == FLOW_TYPE_UPLOAD_ONLY) ? + userTunnel.getOutFlow() : + userTunnel.getInFlow() + userTunnel.getOutFlow(); long flowLimit = userTunnel.getFlow() * BYTES_TO_GB; - + if (flowLimit < currentFlow) { pauseServiceDueToTunnelLimit(userTunnel.getTunnelId(), forwardId, userId, userTunnelId); } @@ -266,15 +259,15 @@ public class FlowController extends BaseController { /** * 因隧道流量超限暂停服务 */ - private void pauseServiceDueToTunnelLimit(Integer tunnelId, String forwardId, - String userId, String userTunnelId) { + private void pauseServiceDueToTunnelLimit(Integer tunnelId, String forwardId, + String userId, String userTunnelId) { Tunnel tunnel = tunnelService.getById(tunnelId); if (tunnel != null) { Node node = nodeService.getNodeById(tunnel.getInNodeId()); if (node != null) { String serviceName = buildServiceName(forwardId, userId, userTunnelId); GostUtil.PauseService(node.getIp() + ":" + node.getPort(), serviceName, node.getSecret()); - + // 隧道转发需要同时暂停远端服务 if (tunnel.getType() == 2) { // TUNNEL_TYPE_TUNNEL_FORWARD Node outNode = nodeService.getNodeById(tunnel.getOutNodeId()); @@ -296,15 +289,15 @@ public class FlowController extends BaseController { /** * 因隧道权限到期暂停服务 */ - private void pauseServiceDueToTunnelExpiration(Integer tunnelId, String forwardId, - String userId, String userTunnelId) { + private void pauseServiceDueToTunnelExpiration(Integer tunnelId, String forwardId, + String userId, String userTunnelId) { Tunnel tunnel = tunnelService.getById(tunnelId); if (tunnel != null) { Node node = nodeService.getNodeById(tunnel.getInNodeId()); if (node != null) { String serviceName = buildServiceName(forwardId, userId, userTunnelId); GostUtil.PauseService(node.getIp() + ":" + node.getPort(), serviceName, node.getSecret()); - + // 隧道转发需要同时暂停远端服务 if (tunnel.getType() == 2) { // TUNNEL_TYPE_TUNNEL_FORWARD Node outNode = nodeService.getNodeById(tunnel.getOutNodeId()); @@ -326,39 +319,54 @@ public class FlowController extends BaseController { /** * 检查用户相关的所有限制 - 用户存在时统一处理 */ - private void checkUserRelatedLimits(User user, String userTunnelId, Forward forward) { + private void checkUserRelatedLimits(User user, String userTunnelId) { + // 重新查询用户以获取最新的流量数据 + User updatedUser = userService.getById(user.getId()); + if (updatedUser == null) { + return; + } + // 检查用户总流量限制 - long userFlowLimit = user.getFlow() * BYTES_TO_GB; - long userCurrentFlow = user.getInFlow() + user.getOutFlow(); + long userFlowLimit = updatedUser.getFlow() * BYTES_TO_GB; + long userCurrentFlow = updatedUser.getInFlow() + updatedUser.getOutFlow(); if (userFlowLimit < userCurrentFlow) { - pauseAllUserServices(user.getId().toString(), userTunnelId); + pauseAllUserServices(updatedUser.getId().toString(), userTunnelId); return; // 用户流量超限,直接返回,不需要再检查其他项 } // 检查用户到期时间 - if (user.getExpTime() != null && user.getExpTime() <= System.currentTimeMillis()) { - pauseAllUserServices(user.getId().toString(), userTunnelId); + if (updatedUser.getExpTime() != null && updatedUser.getExpTime() <= System.currentTimeMillis()) { + pauseAllUserServices(updatedUser.getId().toString(), userTunnelId); return; // 用户到期,直接返回 } // 检查用户状态 - if (user.getStatus() != 1) { - pauseAllUserServices(user.getId().toString(), userTunnelId); + if (updatedUser.getStatus() != 1) { + pauseAllUserServices(updatedUser.getId().toString(), userTunnelId); } } /** * 检查用户隧道权限相关的所有限制 - 隧道权限存在时统一处理 */ - private void checkUserTunnelRelatedLimits(UserTunnel userTunnel, String forwardId, String userId, String userTunnelId, Forward forward) { + private void checkUserTunnelRelatedLimits(UserTunnel userTunnel, String forwardId, String userId, String userTunnelId, Forward forward, int flowType) { + // 重新查询用户隧道权限以获取最新的流量数据 + UserTunnel updatedUserTunnel = userTunnelService.getById(userTunnel.getId()); + if (updatedUserTunnel == null) { + return; + } + + // 检查隧道权限流量限制 + checkUserTunnelFlowLimit(updatedUserTunnel, flowType, forwardId, userId, userTunnelId); + // 检查隧道权限到期时间 - if (userTunnel.getExpTime() != null && userTunnel.getExpTime() <= System.currentTimeMillis()) { - pauseServiceDueToTunnelExpiration(userTunnel.getTunnelId(), forwardId, userId, userTunnelId); + if (updatedUserTunnel.getExpTime() != null && updatedUserTunnel.getExpTime() <= System.currentTimeMillis()) { + pauseServiceDueToTunnelExpiration(updatedUserTunnel.getTunnelId(), forwardId, userId, userTunnelId); return; // 隧道权限到期,直接返回 } // 检查用户隧道权限状态 - if (userTunnel.getStatus() != 1) { + if (updatedUserTunnel.getStatus() != 1) { if (forward != null) { pauseSpecificForward(forward, userId, userTunnelId); } @@ -385,7 +393,7 @@ public class FlowController extends BaseController { if (node != null) { String serviceName = buildServiceName(String.valueOf(forward.getId()), userId, userTunnelId); GostUtil.PauseService(node.getIp() + ":" + node.getPort(), serviceName, node.getSecret()); - + // 隧道转发需要同时暂停远端服务 if (tunnel.getType() == 2) { // TUNNEL_TYPE_TUNNEL_FORWARD Node outNode = nodeService.getNodeById(tunnel.getOutNodeId()); @@ -395,7 +403,7 @@ public class FlowController extends BaseController { } } } - + // 更新转发状态为暂停 forward.setStatus(0); forwardService.updateById(forward); @@ -406,7 +414,7 @@ public class FlowController extends BaseController { */ private void pauseAllUserServices(String userId, String userTunnelId) { List userForwards = forwardService.list(new QueryWrapper().eq("user_id", userId)); - + for (Forward forward : userForwards) { Tunnel tunnel = tunnelService.getById(forward.getTunnelId()); if (tunnel != null) { @@ -416,7 +424,7 @@ public class FlowController extends BaseController { String actualUserTunnelId = findActualUserTunnelId(userId, forward.getTunnelId().toString()); String serviceName = buildServiceName(String.valueOf(forward.getId()), userId, actualUserTunnelId); GostUtil.PauseService(node.getIp() + ":" + node.getPort(), serviceName, node.getSecret()); - + // 隧道转发需要同时暂停远端服务 if (tunnel.getType() == 2) { // TUNNEL_TYPE_TUNNEL_FORWARD Node outNode = nodeService.getNodeById(tunnel.getOutNodeId()); @@ -426,7 +434,7 @@ public class FlowController extends BaseController { } } } - + forward.setStatus(0); forwardService.updateById(forward); } @@ -437,11 +445,11 @@ public class FlowController extends BaseController { */ private String findActualUserTunnelId(String userId, String tunnelId) { UserTunnel userTunnel = userTunnelService.getOne( - new QueryWrapper() - .eq("user_id", userId) - .eq("tunnel_id", tunnelId) + new QueryWrapper() + .eq("user_id", userId) + .eq("tunnel_id", tunnelId) ); - + return userTunnel != null ? String.valueOf(userTunnel.getId()) : DEFAULT_USER_TUNNEL_ID; } diff --git a/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java index ee113cf..7874a03 100644 --- a/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java +++ b/springboot-backend/src/main/java/com/admin/service/impl/UserServiceImpl.java @@ -89,10 +89,15 @@ public class UserServiceImpl extends ServiceImpl implements Us private static final String ERROR_PASSWORD_NOT_MATCH = "新密码和确认密码不匹配"; private static final String SUCCESS_PASSWORD_UPDATE = "密码修改成功"; + /** 默认账号密码 */ + private static final String DEFAULT_USERNAME = "admin_user"; + private static final String DEFAULT_PASSWORD = "admin_user"; + /** 登录响应字段名 */ private static final String LOGIN_TOKEN_FIELD = "token"; private static final String LOGIN_NAME_FIELD = "name"; private static final String LOGIN_ROLE_ID_FIELD = "role_id"; + private static final String LOGIN_REQUIRE_PASSWORD_CHANGE_FIELD = "requirePasswordChange"; // ========== 依赖注入 ========== @@ -141,10 +146,14 @@ public class UserServiceImpl extends ServiceImpl implements Us User user = validationResult.getUser(); String token = JwtUtil.generateToken(user); + // 3. 检查是否使用默认账号密码 + boolean requirePasswordChange = isDefaultCredentials(loginDto.getUsername(), loginDto.getPassword()); + return R.ok(MapUtil.builder() .put(LOGIN_TOKEN_FIELD, token) .put(LOGIN_NAME_FIELD, user.getName()) .put(LOGIN_ROLE_ID_FIELD, user.getRoleId()) + .put(LOGIN_REQUIRE_PASSWORD_CHANGE_FIELD, requirePasswordChange) .build()); } @@ -285,10 +294,10 @@ public class UserServiceImpl extends ServiceImpl implements Us } /** - * 修改密码 - * 验证当前密码、新密码确认、更新用户密码 + * 修改账号密码 + * 验证当前密码、新密码确认、用户名唯一性、更新用户账号密码 * - * @param changePasswordDto 修改密码数据传输对象 + * @param changePasswordDto 修改账号密码数据传输对象 * @return 修改结果响应 */ @Override @@ -312,18 +321,27 @@ public class UserServiceImpl extends ServiceImpl implements Us return R.err(ERROR_CURRENT_PASSWORD_WRONG); } - // 4. 更新密码 + // 4. 验证新用户名唯一性(如果与当前用户名不同) + if (!user.getUser().equals(changePasswordDto.getNewUsername())) { + R usernameValidationResult = validateUsernameUniqueness(changePasswordDto.getNewUsername(), user.getId()); + if (usernameValidationResult.getCode() != 0) { + return usernameValidationResult; + } + } + + // 5. 更新用户名和密码 User updateUser = new User(); updateUser.setId(user.getId()); + updateUser.setUser(changePasswordDto.getNewUsername()); updateUser.setPwd(Md5Util.md5(changePasswordDto.getNewPassword())); updateUser.setUpdatedTime(System.currentTimeMillis()); boolean result = this.updateById(updateUser); - return result ? R.ok(SUCCESS_PASSWORD_UPDATE) : R.err(ERROR_UPDATE_FAILED); + return result ? R.ok("账号密码修改成功") : R.err(ERROR_UPDATE_FAILED); } catch (Exception e) { e.printStackTrace(); - return R.err("修改密码时发生错误:" + e.getMessage()); + return R.err("修改账号密码时发生错误:" + e.getMessage()); } } @@ -352,6 +370,17 @@ public class UserServiceImpl extends ServiceImpl implements Us return LoginValidationResult.success(user); } + /** + * 检查是否使用默认账号密码 + * + * @param username 用户名 + * @param password 密码 + * @return 是否是默认凭据 + */ + private boolean isDefaultCredentials(String username, String password) { + return DEFAULT_USERNAME.equals(username) && DEFAULT_PASSWORD.equals(password); + } + /** * 验证用户名唯一性 * diff --git a/vue-frontend/src/router/index.js b/vue-frontend/src/router/index.js index 9268635..95ae22b 100644 --- a/vue-frontend/src/router/index.js +++ b/vue-frontend/src/router/index.js @@ -5,6 +5,7 @@ import VueRouter from 'vue-router'; import Home from "@/views/Home.vue"; import Login from "@/views/Login.vue"; +import ChangeAccountPassword from "@/views/ChangePassword.vue"; import Index from "@/views/Index"; import User from "@/views/User"; import Node from "@/views/node"; @@ -19,6 +20,7 @@ Vue.use(VueRouter); const routes = [ {path: '/', redirect: '/login'}, {path: '/login', component: Login}, + {path: '/change-password', component: ChangeAccountPassword}, { path: '/home', component: Home, redirect: '/index', children: [ {path: '/index', component: Index}, @@ -38,7 +40,7 @@ const router = new VueRouter({ }) router.beforeEach((to, from, next) => { - if (to.path === '/login') return next(); + if (to.path === '/login' || to.path === '/change-password') return next(); const tokenStr = localStorage.getItem('token') if (!tokenStr) { return next('/login') diff --git a/vue-frontend/src/views/ChangePassword.vue b/vue-frontend/src/views/ChangePassword.vue new file mode 100644 index 0000000..278be04 --- /dev/null +++ b/vue-frontend/src/views/ChangePassword.vue @@ -0,0 +1,414 @@ + + + + + \ No newline at end of file diff --git a/vue-frontend/src/views/Login.vue b/vue-frontend/src/views/Login.vue index 5879a2e..fcd80e2 100644 --- a/vue-frontend/src/views/Login.vue +++ b/vue-frontend/src/views/Login.vue @@ -104,6 +104,17 @@ export default { login(this.loginForm).then(res=>{ this.loading = false if (res.code !== 0) return this.$message.error(res.msg) + + // 检查是否需要强制修改密码 + if (res.data.requirePasswordChange) { + localStorage.setItem('token', res.data.token); + localStorage.setItem("role_id", res.data.role_id) + localStorage.setItem("name", res.data.name) + this.$message.warning('检测到您使用的是默认账号密码,为了安全请立即修改'); + this.$router.push("/change-password"); + return; + } + localStorage.setItem('token', res.data.token); localStorage.setItem("e", '/index') localStorage.setItem("role_id", res.data.role_id)