Merge main into shccd159,保留 shccd159 配置(jjy/ccd 域名)

Made-with: Cursor
This commit is contained in:
apple
2026-03-18 10:35:08 +08:00
35 changed files with 355 additions and 81 deletions

View File

@@ -220,11 +220,13 @@ public class UserController {
/**
* 积分记录
* @param type 可选记录类型1=收入2=支出,不传返回全部
*/
@ApiOperation(value = "积分记录")
@RequestMapping(value = "/integral/list", method = RequestMethod.GET)
public CommonResult<CommonPage<UserIntegralRecord>> getIntegralList(@Validated PageParamRequest pageParamRequest) {
return CommonResult.success(CommonPage.restPage(userCenterService.getUserIntegralRecordList(pageParamRequest)));
public CommonResult<CommonPage<UserIntegralRecord>> getIntegralList(@Validated PageParamRequest pageParamRequest,
@RequestParam(required = false) Integer type) {
return CommonResult.success(CommonPage.restPage(userCenterService.getUserIntegralRecordList(pageParamRequest, type)));
}
/**

View File

@@ -176,9 +176,10 @@ public interface UserCenterService extends IService<User> {
/**
* 用户积分记录列表
* @param pageParamRequest 分页参数
* @param type 可选记录类型1=收入2=支出null=全部
* @return List<UserIntegralRecord>
*/
List<UserIntegralRecord> getUserIntegralRecordList(PageParamRequest pageParamRequest);
List<UserIntegralRecord> getUserIntegralRecordList(PageParamRequest pageParamRequest, Integer type);
/**
* 微信app登录

View File

@@ -912,12 +912,13 @@ public class UserCenterServiceImpl extends ServiceImpl<UserDao, User> implements
* 用户积分记录列表
*
* @param pageParamRequest 分页参数
* @param type 可选记录类型1=收入2=支出null=全部
* @return List<UserIntegralRecord>
*/
@Override
public List<UserIntegralRecord> getUserIntegralRecordList(PageParamRequest pageParamRequest) {
public List<UserIntegralRecord> getUserIntegralRecordList(PageParamRequest pageParamRequest, Integer type) {
Integer uid = userService.getUserIdException();
return userIntegralRecordService.findUserIntegralRecordList(uid, pageParamRequest);
return userIntegralRecordService.findUserIntegralRecordList(uid, pageParamRequest, type);
}
/**

View File

@@ -62,6 +62,15 @@ public interface UserIntegralRecordService extends IService<UserIntegralRecord>
*/
List<UserIntegralRecord> findUserIntegralRecordList(Integer uid, PageParamRequest pageParamRequest);
/**
* H5用户积分列表按类型筛选
* @param uid 用户uid
* @param pageParamRequest 分页参数
* @param type 可选1=收入2=支出null=全部
* @return List
*/
List<UserIntegralRecord> findUserIntegralRecordList(Integer uid, PageParamRequest pageParamRequest, Integer type);
/**
* 获取用户冻结的积分
* @param uid 用户uid

View File

@@ -217,11 +217,19 @@ public class UserIntegralRecordServiceImpl extends ServiceImpl<UserIntegralRecor
*/
@Override
public List<UserIntegralRecord> findUserIntegralRecordList(Integer uid, PageParamRequest pageParamRequest) {
return findUserIntegralRecordList(uid, pageParamRequest, null);
}
@Override
public List<UserIntegralRecord> findUserIntegralRecordList(Integer uid, PageParamRequest pageParamRequest, Integer type) {
PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
LambdaQueryWrapper<UserIntegralRecord> lqw = Wrappers.lambdaQuery();
lqw.select(UserIntegralRecord::getId, UserIntegralRecord::getTitle, UserIntegralRecord::getType, UserIntegralRecord::getIntegral, UserIntegralRecord::getUpdateTime);
lqw.eq(UserIntegralRecord::getUid, uid);
lqw.eq(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE);
if (type != null) {
lqw.eq(UserIntegralRecord::getType, type);
}
lqw.orderByDesc(UserIntegralRecord::getUpdateTime);
return dao.selectList(lqw);
}

View File

@@ -8,6 +8,23 @@ SERVER_USER=root
SERVER_PORT=22
REMOTE_DIR_JAR=/www/wwwroot/crmeb
REMOTE_DIR_ADMIN=/www/wwwroot/jfadmin.bosenyuan.com
VUE_APP_BASE_API_EXPECTED=http://jfadmin-bsy.bosenyuan.com
FRONT_LOCAL_PORT=30031
FRONT_JAR_NAME=miao-front-2.2.jar
ADMIN_LOCAL_PORT=30032
ADMIN_JAR_NAME=miao-admin-2.2.jar
miao33:
spring:
profiles:
active: miao33
SERVER_HOST=39.106.63.33
SERVER_USER=root
SERVER_PORT=22
REMOTE_DIR_JAR=/www/wwwroot/crmeb
REMOTE_DIR_ADMIN=/www/wwwroot/jfadmin.xiashengjun.com
VUE_APP_BASE_API_EXPECTED=http://jfadmin.xiashengjun.com
FRONT_LOCAL_PORT=30031
FRONT_JAR_NAME=miao-front-2.2.jar
ADMIN_LOCAL_PORT=30032

View File

@@ -13,9 +13,9 @@ ROOT_DIR="$(cd "$BACKEND_DIR/.." && pwd)"
FRONTEND_DIR="$ROOT_DIR/frontend"
DEPLOY_CONF="$BACKEND_DIR/deploy.conf"
# 解析 by80 段配置deploy.conf 中 by80 段到 miao50 段之的 KEY=value
# 解析 by80 段配置deploy.conf 中 by80 段到 miao33 段之的 KEY=value
get_conf() {
sed -n '1,/^miao50:/p' "$DEPLOY_CONF" | grep -E "^${1}=" | tail -1 | cut -d= -f2-
sed -n '1,/^miao33:/p' "$DEPLOY_CONF" | grep -E "^${1}=" | tail -1 | cut -d= -f2-
}
SERVER_HOST=$(get_conf SERVER_HOST)
SERVER_USER=$(get_conf SERVER_USER)
@@ -48,7 +48,23 @@ echo "已生成: $JAR_PATH"
[[ ! -f "$JAR_PATH" ]] && { echo "错误: jar 未生成"; exit 1; }
echo ""
echo "=== 2. 编译前端 (admin 后台) ==="
echo "=== 2. 检查前端 API 地址 (frontend/.env.production) ==="
VUE_APP_BASE_API_EXPECTED=$(get_conf VUE_APP_BASE_API_EXPECTED)
if [[ -n "$VUE_APP_BASE_API_EXPECTED" ]]; then
ENV_FILE="$FRONTEND_DIR/.env.production"
CURRENT_API=$(grep -E '^[[:space:]]*VUE_APP_BASE_API[[:space:]]*=' "$ENV_FILE" 2>/dev/null | head -1 | sed -E "s/^[^=]*=[[:space:]]*['\"]?([^'\"]*)['\"]?[[:space:]]*/\1/" | tr -d ' ')
if [[ "$CURRENT_API" != "$VUE_APP_BASE_API_EXPECTED" ]]; then
echo "错误: 打包前请确认 API 接口地址为本项目的。"
echo " 当前 frontend/.env.production: VUE_APP_BASE_API = '$CURRENT_API'"
echo " by80 期望: VUE_APP_BASE_API = '$VUE_APP_BASE_API_EXPECTED'"
echo "请修改 frontend/.env.production 后重新执行。"
exit 1
fi
echo "已确认 VUE_APP_BASE_API = '$CURRENT_API'"
fi
echo ""
echo "=== 3. 编译前端 (admin 后台) ==="
cd "$FRONTEND_DIR"
# Node.js 17+ OpenSSL 兼容
export NODE_OPTIONS="${NODE_OPTIONS:-} --openssl-legacy-provider"
@@ -57,7 +73,7 @@ echo "已生成: $FRONTEND_DIR/dist"
[[ ! -d "$FRONTEND_DIR/dist" ]] && { echo "错误: dist 未生成"; exit 1; }
echo ""
echo "=== 3. 远程备份原有文件 ==="
echo "=== 4. 远程备份原有文件 ==="
"${SSH_CMD[@]}" "bash -s" << REMOTE_BACKUP
set -e
mkdir -p "$REMOTE_DIR_JAR/backups"
@@ -73,19 +89,19 @@ fi
REMOTE_BACKUP
echo ""
echo "=== 4. 上传 miao-admin-2.2.jar 到 $REMOTE_DIR_JAR ==="
echo "=== 5. 上传 miao-admin-2.2.jar 到 $REMOTE_DIR_JAR ==="
"${SCP_CMD[@]}" "$JAR_PATH" "$SERVER_USER@$SERVER_HOST:$REMOTE_DIR_JAR/"
echo "jar 上传完成."
echo ""
echo "=== 5. 上传 admin 后台静态 (dist) 到 $REMOTE_DIR_ADMIN ==="
echo "=== 6. 上传 admin 后台静态 (dist) 到 $REMOTE_DIR_ADMIN ==="
# 先清空远程目录再上传,避免残留旧文件(远程可能无 rsync统一用 tar 管道)
"${SSH_CMD[@]}" "mkdir -p $REMOTE_DIR_ADMIN && (rm -rf ${REMOTE_DIR_ADMIN}/* ${REMOTE_DIR_ADMIN}/.??* 2>/dev/null; true)"
(cd "$FRONTEND_DIR/dist" && tar cf - .) | "${SSH_CMD[@]}" "mkdir -p $REMOTE_DIR_ADMIN && cd $REMOTE_DIR_ADMIN && tar xf -"
echo "后台静态上传完成."
echo ""
echo "=== 6. 远程重启 admin 服务 (profile=miao80, port=$ADMIN_LOCAL_PORT) ==="
echo "=== 7. 远程重启 admin 服务 (profile=miao80, port=$ADMIN_LOCAL_PORT) ==="
"${SSH_CMD[@]}" "cd $REMOTE_DIR_JAR && \
(pkill -f $ADMIN_JAR_NAME || true) && \
sleep 2 && \

View File

@@ -0,0 +1,120 @@
#!/bin/bash
# 编译前后端,使用 spring profile miao33 打包 miao-admin-2.2.jar
# 备份远程原有文件后通过 SSH 上传并重启admin jar + admin 后台静态)
# 一次性配置免密: ssh-copy-id -i ~/.ssh/id_ed25519_crmeb_deploy.pub root@8.152.170.46
# 或指定密钥: SSH_IDENTITY=~/.ssh/your_key ./shell/deploy-admin-miao33.sh
# 使用: ./shell/deploy-admin-miao33.sh在 backend 目录下)
set -e
SSH_IDENTITY="${SSH_IDENTITY:-$HOME/.ssh/id_ed25519_crmeb_deploy}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
ROOT_DIR="$(cd "$BACKEND_DIR/.." && pwd)"
FRONTEND_DIR="$ROOT_DIR/frontend"
DEPLOY_CONF="$BACKEND_DIR/deploy.conf"
# 解析 miao33 段配置deploy.conf 中 miao33 段到 miao50 段之间的 KEY=value
get_conf() {
sed -n '/^miao33:/,/^miao50:/p' "$DEPLOY_CONF" | grep -E "^${1}=" | tail -1 | cut -d= -f2-
}
SERVER_HOST=$(get_conf SERVER_HOST)
SERVER_USER=$(get_conf SERVER_USER)
SERVER_PORT=$(get_conf SERVER_PORT)
REMOTE_DIR_JAR=$(get_conf REMOTE_DIR_JAR)
REMOTE_DIR_ADMIN=$(get_conf REMOTE_DIR_ADMIN)
ADMIN_JAR_NAME=$(get_conf ADMIN_JAR_NAME)
ADMIN_LOCAL_PORT=$(get_conf ADMIN_LOCAL_PORT)
[[ -z "$SERVER_HOST" ]] && SERVER_HOST=8.152.170.46
[[ -z "$REMOTE_DIR_JAR" ]] && REMOTE_DIR_JAR=/www/wwwroot/crmeb
[[ -z "$REMOTE_DIR_ADMIN" ]] && REMOTE_DIR_ADMIN=/www/wwwroot/jfadmin.xiashengjun.com
[[ -z "$ADMIN_JAR_NAME" ]] && ADMIN_JAR_NAME=miao-admin-2.2.jar
[[ -z "$ADMIN_LOCAL_PORT" ]] && ADMIN_LOCAL_PORT=30032
[[ -z "$SERVER_USER" ]] && SERVER_USER=root
[[ -z "$SERVER_PORT" ]] && SERVER_PORT=22
JAR_PATH="$BACKEND_DIR/crmeb-admin/target/$ADMIN_JAR_NAME"
REMOTE_JAR="$REMOTE_DIR_JAR/$ADMIN_JAR_NAME"
[[ -f "$SSH_IDENTITY" ]] && SSH_OPTS=(-o "IdentityFile=$SSH_IDENTITY") || SSH_OPTS=()
SSH_CMD=(ssh "${SSH_OPTS[@]}" -o StrictHostKeyChecking=accept-new -p "$SERVER_PORT" "$SERVER_USER@$SERVER_HOST")
SCP_CMD=(scp "${SSH_OPTS[@]}" -o StrictHostKeyChecking=accept-new -P "$SERVER_PORT")
BACKUP_SUFFIX="backup_$(date +%Y%m%d_%H%M%S)"
APP_YML="$BACKEND_DIR/crmeb-admin/src/main/resources/application.yml"
echo "=== 1. 设置 spring.profiles.active=miao33 后编译后端 ==="
cd "$BACKEND_DIR"
# 打包前临时改为 miao33编译后恢复兼容 Linux/macOS
if [[ -f "$APP_YML" ]]; then
cp -a "$APP_YML" "${APP_YML}.bak"
sed 's/active: *miao[0-9]*/active: miao33/' "$APP_YML" > "${APP_YML}.new" && mv "${APP_YML}.new" "$APP_YML"
trap 'cp -a "${APP_YML}.bak" "$APP_YML"; rm -f "${APP_YML}.bak"; trap - EXIT' EXIT
fi
mvn clean package -pl crmeb-admin -am -DskipTests -q
echo "已生成: $JAR_PATH"
[[ ! -f "$JAR_PATH" ]] && { echo "错误: jar 未生成"; exit 1; }
# 恢复 application.yml
if [[ -f "${APP_YML}.bak" ]]; then cp -a "${APP_YML}.bak" "$APP_YML"; rm -f "${APP_YML}.bak"; trap - EXIT; fi
echo ""
echo "=== 2. 检查前端 API 地址 (frontend/.env.production) ==="
VUE_APP_BASE_API_EXPECTED=$(get_conf VUE_APP_BASE_API_EXPECTED)
if [[ -n "$VUE_APP_BASE_API_EXPECTED" ]]; then
ENV_FILE="$FRONTEND_DIR/.env.production"
CURRENT_API=$(grep -E '^[[:space:]]*VUE_APP_BASE_API[[:space:]]*=' "$ENV_FILE" 2>/dev/null | head -1 | sed -E "s/^[^=]*=[[:space:]]*['\"]?([^'\"]*)['\"]?[[:space:]]*/\1/" | tr -d ' ')
if [[ "$CURRENT_API" != "$VUE_APP_BASE_API_EXPECTED" ]]; then
echo "错误: 打包前请确认 API 接口地址为本项目的。"
echo " 当前 frontend/.env.production: VUE_APP_BASE_API = '$CURRENT_API'"
echo " miao33 期望: VUE_APP_BASE_API = '$VUE_APP_BASE_API_EXPECTED'"
echo "请修改 frontend/.env.production 后重新执行。"
exit 1
fi
echo "已确认 VUE_APP_BASE_API = '$CURRENT_API'"
fi
echo ""
echo "=== 3. 编译前端 (admin 后台) ==="
cd "$FRONTEND_DIR"
export NODE_OPTIONS="${NODE_OPTIONS:-} --openssl-legacy-provider"
npm run build:prod
echo "已生成: $FRONTEND_DIR/dist"
[[ ! -d "$FRONTEND_DIR/dist" ]] && { echo "错误: dist 未生成"; exit 1; }
echo ""
echo "=== 4. 远程备份原有文件 ==="
"${SSH_CMD[@]}" "bash -s" << REMOTE_BACKUP
set -e
mkdir -p "$REMOTE_DIR_JAR/backups"
if [ -f "$REMOTE_JAR" ]; then
cp -a "$REMOTE_JAR" "$REMOTE_DIR_JAR/backups/${ADMIN_JAR_NAME}.${BACKUP_SUFFIX}"
echo "已备份 jar: $REMOTE_DIR_JAR/backups/${ADMIN_JAR_NAME}.${BACKUP_SUFFIX}"
fi
if [ -d "$REMOTE_DIR_ADMIN" ] && [ "\$(ls -A $REMOTE_DIR_ADMIN 2>/dev/null)" ]; then
BACKUP_TAR="$REMOTE_DIR_ADMIN/../jfadmin_${BACKUP_SUFFIX}.tar.gz"
tar -czf "\$BACKUP_TAR" -C "$REMOTE_DIR_ADMIN" .
echo "已备份后台静态: \$BACKUP_TAR"
fi
REMOTE_BACKUP
echo ""
echo "=== 5. 上传 $ADMIN_JAR_NAME$REMOTE_DIR_JAR ==="
"${SCP_CMD[@]}" "$JAR_PATH" "$SERVER_USER@$SERVER_HOST:$REMOTE_DIR_JAR/"
echo "jar 上传完成."
echo ""
echo "=== 6. 上传 admin 后台静态 (dist) 到 $REMOTE_DIR_ADMIN ==="
"${SSH_CMD[@]}" "mkdir -p $REMOTE_DIR_ADMIN && (rm -rf ${REMOTE_DIR_ADMIN}/* ${REMOTE_DIR_ADMIN}/.??* 2>/dev/null; true)"
(cd "$FRONTEND_DIR/dist" && tar cf - .) | "${SSH_CMD[@]}" "mkdir -p $REMOTE_DIR_ADMIN && cd $REMOTE_DIR_ADMIN && tar xf -"
echo "后台静态上传完成."
echo ""
echo "=== 7. 远程重启 admin 服务 (profile=miao33, port=$ADMIN_LOCAL_PORT) ==="
"${SSH_CMD[@]}" "cd $REMOTE_DIR_JAR && \
(pkill -f $ADMIN_JAR_NAME || true) && \
sleep 2 && \
nohup java -jar $ADMIN_JAR_NAME --spring.profiles.active=miao33 --server.port=$ADMIN_LOCAL_PORT > admin.log 2>&1 & \
sleep 3 && \
(pgrep -f $ADMIN_JAR_NAME && echo 'Admin 进程已启动' || echo '请检查 admin.log 启动是否失败')"
echo ""
echo "=== miao33 部署完成 ==="

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# 使用 miao33 配置启动 crmeb-front 服务nohup 后台)
# 端口见 application-miao33.yml30031
set -e
BACKEND_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$BACKEND_DIR"
JAR="$BACKEND_DIR/crmeb-front/target/miao-front-2.2.jar"
LOG="${LOG:-$BACKEND_DIR/front-miao33.log}"
if [ ! -f "$JAR" ]; then
echo "未找到 jar请先执行: mvn clean package -pl crmeb-front -am -DskipTests"
exit 1
fi
echo "启动: nohup java -jar $JAR --spring.profiles.active=miao33 > $LOG 2>&1 &"
nohup java -jar "$JAR" --spring.profiles.active=miao33 >> "$LOG" 2>&1 &
echo "PID: $!"
echo "日志: $LOG"

View File

@@ -0,0 +1,53 @@
#!/usr/bin/env bash
# 测试 api/front/integral/list 是否返回支出明细type=2
# 用法: BASE_URL=http://localhost:8081 ./test-integral-list.sh
# 或: ./test-integral-list.sh (默认 BASE_URL=http://localhost:8081)
set -e
BASE="${BASE_URL:-http://localhost:8081}"
USER="13739117991"
PASS="123456"
echo "=== 测试 integral/list 支出明细 (type=2) ==="
echo "BASE_URL=$BASE"
echo ""
echo "1. 登录 ($USER / $PASS) ..."
LOGIN=$(curl -s -X POST "$BASE/api/front/loginV2" \
-H "Content-Type: application/json" \
-d "{\"account\":\"$USER\",\"password\":\"$PASS\"}")
if echo "$LOGIN" | grep -qE '"code":\s*(0|200)'; then
echo " 登录成功"
else
echo " 登录失败 (若为「此账号未注册」请在本环境用已注册账号或本地起后端测试): $LOGIN"
exit 1
fi
TOKEN=$(echo "$LOGIN" | sed -n 's/.*"token":"\([^"]*\)".*/\1/p')
if [ -z "$TOKEN" ]; then
echo " 未获取到 token"
exit 1
fi
echo " Token: ${TOKEN:0:24}..."
echo ""
echo "2. GET api/front/integral/list?page=1&limit=20&type=2 (支出明细) ..."
RES=$(curl -s -X GET "$BASE/api/front/integral/list?page=1&limit=20&type=2" \
-H "Content-Type: application/json" \
-H "Authori-zation: $TOKEN")
echo "$RES" | head -c 800
echo ""
echo ""
if echo "$RES" | grep -qE '"code":\s*(0|200)'; then
echo "3. 结果: 接口返回成功 (code=0/200)"
if echo "$RES" | grep -q '"list":'; then
echo " data.list 已返回;带 type=2 时仅包含支出明细,见上方 JSON。"
fi
exit 0
else
echo "3. 结果: 接口未成功 (需登录或 code 非 0/200)"
exit 1
fi