Browse Source

fix: 登录403+员工多记录+JAR部署 — selectList查激活员工/租户白名单/LIMIT1/部署脚本/运维手册

alphah 13 hours ago
parent
commit
2f4d86aba5

+ 20 - 0
deploy.sh

@@ -0,0 +1,20 @@
+#!/bin/bash
+set -e
+cd /tmp/docker-build
+cp /opt/payment/app.jar ./app.jar
+cat > Dockerfile << 'ENDOFDOCKERFILE'
+FROM xjz/java-backend:1.0.0
+COPY app.jar /app/app.jar
+ENDOFDOCKERFILE
+docker build --no-cache -t pay:latest .
+docker stop java-backend 2>/dev/null || true
+docker rm java-backend 2>/dev/null || true
+docker run -d --name java-backend --network app-net -p 8001:8001 \
+  -e SPRING_PROFILES_ACTIVE=prod -e JAVA_OPTS="-Xms256m -Xmx512m" \
+  -e SPRING_DATASOURCE_DRUID_URL=jdbc:postgresql://postgres:5432/payment_platform_java?currentSchema=public \
+  -e SPRING_DATASOURCE_DRUID_USERNAME=admin -e SPRING_DATASOURCE_DRUID_PASSWORD=xjz#123321 \
+  -e SPRING_DATA_REDIS_HOST=redis -e SPRING_DATA_REDIS_PORT=6379 \
+  -e SPRING_DATA_REDIS_DATABASE=0 -e SPRING_DATA_REDIS_PASSWORD=123456#xjz \
+  pay:latest
+sleep 30
+docker exec java-backend sh -c "unzip -p /app/app.jar BOOT-INF/classes/com/payment/platform/module/payment/facetoface/controller/FacetofaceController.class | grep -ao trade/precreate"

BIN
docs/api清单.docx


+ 152 - 0
docs/ops.md

@@ -0,0 +1,152 @@
+# 运维手册
+
+## 服务信息
+
+| 服务 | 端口 | 容器名 | 镜像 |
+|---|---|---|---|
+| Java 后端 | 8001 | java-backend | xjz/java-backend:1.0.0 |
+| 前端 | 5173 | frontend | xjz/frontend:2.5.4 |
+
+---
+
+## 后端部署
+
+### 首次启动
+
+```bash
+docker run -d --name java-backend \
+  -p 8001:8001 \
+  --network payment-platform_app-tier \
+  -e TZ=Asia/Shanghai \
+  -e SPRING_PROFILES_ACTIVE=prod \
+  -e JAVA_OPTS="-Xms256m -Xmx512m" \
+  -e SPRING_DATASOURCE_DRUID_URL="jdbc:postgresql://postgres:5432/payment_platform_java?currentSchema=public" \
+  -e SPRING_DATASOURCE_DRUID_USERNAME=admin \
+  -e SPRING_DATASOURCE_DRUID_PASSWORD='xjz#123321' \
+  -e SPRING_DATA_REDIS_HOST=redis \
+  -e SPRING_DATA_REDIS_PORT=6379 \
+  -e SPRING_DATA_REDIS_DATABASE=0 \
+  -e SPRING_DATA_REDIS_PASSWORD='123456#xjz' \
+  xjz/java-backend:1.0.0
+```
+
+### 更新部署(重启 JAR)
+
+```bash
+# 1. 本地构建 JAR
+cd /home/payments/code/payment-platform/java
+mvn package -DskipTests -q
+
+# 2. 复制到容器
+docker cp target/payment-platform-1.0.0.jar java-backend:/app.jar
+
+# 3. 停止旧容器,删除并重建
+docker stop java-backend && docker rm java-backend
+
+# 4. 重新启动(使用首次启动的 docker run 命令)
+docker run -d --name java-backend \
+  -p 8001:8001 \
+  --network payment-platform_app-tier \
+  -e TZ=Asia/Shanghai \
+  -e SPRING_PROFILES_ACTIVE=prod \
+  -e JAVA_OPTS="-Xms256m -Xmx512m" \
+  -e SPRING_DATASOURCE_DRUID_URL="jdbc:postgresql://postgres:5432/payment_platform_java?currentSchema=public" \
+  -e SPRING_DATASOURCE_DRUID_USERNAME=admin \
+  -e SPRING_DATASOURCE_DRUID_PASSWORD='xjz#123321' \
+  -e SPRING_DATA_REDIS_HOST=redis \
+  -e SPRING_DATA_REDIS_PORT=6379 \
+  -e SPRING_DATA_REDIS_DATABASE=0 \
+  -e SPRING_DATA_REDIS_PASSWORD='123456#zjz' \
+  xjz/java-backend:1.0.0
+```
+
+> **注意:** 不要用 `docker restart`,容器缓存可能导致 JAR 不更新。必须 `stop` + `rm` + `run`。
+
+### 验证部署
+
+```bash
+# 1. 确认容器运行中
+docker ps | grep java-backend
+
+# 2. 确认启动成功(等 30 秒后)
+docker logs java-backend --tail 20
+
+# 3. 健康检查
+curl http://localhost:8001/api/v1/payment/notify/health
+# 应返回: {"code":0,...}
+
+# 4. 确认代码版本
+docker cp java-backend:/app.jar /tmp/app.jar
+unzip -p /tmp/app.jar "BOOT-INF/classes/com/payment/platform/module/system/auth/service/AuthService.class" > /tmp/AS.class
+strings /tmp/AS.class | grep "<关键字>"
+```
+
+---
+
+## 前端部署
+
+```bash
+# 本地构建
+cd /home/payments/code/payment-platform/frontend
+npm run build
+
+# 复制到容器
+docker cp dist/. frontend:/usr/share/nginx/html/
+
+# 重载 nginx(如果容器内配置了 nginx)
+docker exec frontend nginx -s reload
+```
+
+---
+
+## 小程部署
+
+```bash
+cd /home/payments/code/payment-mini
+npm run build:alipay
+
+# 打开支付宝开发者工具 → 上传
+```
+
+---
+
+## 常用命令
+
+### 查看日志
+
+```bash
+# 后端实时日志
+docker logs -f java-backend
+
+# 最近 100 行
+docker logs java-backend --tail 100
+
+# 过滤错误
+docker logs java-backend --tail 200 2>&1 | grep -iE "ERROR|WARN"
+```
+
+### 数据库
+
+```bash
+# 连接 PostgreSQL
+docker exec -it postgres psql -U admin -d payment_platform_java
+```
+
+### RocketMQ
+
+```bash
+# 查看消息队列
+docker logs rocketmq-broker --tail 50
+```
+
+---
+
+## 环境变量
+
+| 变量 | 默认值 | 说明 |
+|---|---|---|
+| `SPRING_PROFILES_ACTIVE` | prod | Spring 配置环境 |
+| `JAVA_OPTS` | -Xms256m -Xmx512m | JVM 参数 |
+| `SPRING_DATASOURCE_DRUID_URL` | — | PG 连接串 |
+| `SPRING_DATA_REDIS_HOST` | redis | Redis 地址 |
+| `SPRING_DATA_REDIS_PASSWORD` | — | Redis 密码 |

BIN
docs/调用接口代商家发起开通当面付申请.docx


+ 1 - 0
java/src/main/java/com/payment/platform/core/tenant/TenantInnerInterceptor.java

@@ -39,6 +39,7 @@ public class TenantInnerInterceptor extends TenantLineInnerInterceptor {
             "sys_user_social",    // 用户第三方登录(无 tenant_id 列)
             "pay_service_provider",         // 服务商配置(无 tenant_id 列)
             "pay_service_provider_profile", // 服务商业务凭证(无 tenant_id 列)
+            "pay_employee",         // 员工表(登录时无租户上下文)
             "sys_invitation_code" // 邀请码表(无 tenant_id 列,系统级功能)
     );
 

+ 9 - 4
java/src/main/java/com/payment/platform/module/system/auth/service/AuthService.java

@@ -3,6 +3,7 @@ package com.payment.platform.module.system.auth.service;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
+import com.alibaba.fastjson.JSONObject;
 import io.jsonwebtoken.ExpiredJwtException;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.payment.platform.common.enums.RedisInitKeyConfig;
@@ -25,6 +26,7 @@ import org.springframework.stereotype.Service;
 import java.time.Duration;
 import java.time.OffsetDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 import java.util.UUID;
 
 @Slf4j
@@ -133,10 +135,13 @@ public class AuthService {
             throw new BusinessException(403, "用户已被停用");
         }
 
-        // 员工激活状态检查 — 对应 Python EmployeeModel.user_id == user.id
-        EmployeeEntity employee = employeeMapper.selectOne(
-                new LambdaQueryWrapper<EmployeeEntity>().eq(EmployeeEntity::getUserId, user.getId()));
-        if (employee != null && !"EMPLOYEE_ACTIVATED".equals(employee.getStatus())) {
+        // 员工激活状态检查 — 只要存在至少一条 ACTIVATED 员工即允许登录(修复:用 selectList 避免 selectOne 因多条记录或租户过滤失败)
+        boolean hasActive = employeeMapper.selectList(
+                new LambdaQueryWrapper<EmployeeEntity>()
+                        .eq(EmployeeEntity::getUserId, user.getId())
+                        .eq(EmployeeEntity::getStatus, "ACTIVATED"))
+                .stream().anyMatch(e -> "ACTIVATED".equals(e.getStatus()));
+        if (!hasActive) {
             throw new BusinessException(403, "员工未激活或被禁用,无法登录");
         }
 

+ 1 - 1
java/src/main/resources/application.yml

@@ -30,7 +30,7 @@ spring:
 
   data:
     redis:
-      host: redis
+      host: localhost
       port: 6379
       database: 1
       password: '123456#xjz'