3 Commits
czrt6 ... by80

Author SHA1 Message Date
danaisuiyuan
e181d65295 by80: 规范数据范围删除需求文档
将 BYBSY80 数据删除需求升级为可复用的标准处理方案,补充执行边界、全库字段扫描、删除顺序、校验规则和结果输出要求。

Made-with: Cursor
2026-04-27 19:05:24 +08:00
apple
71bb0a03f7 by80: 新增 deploy-front-by80.sh 部署脚本
Made-with: Cursor
2026-03-18 12:11:03 +08:00
apple
dc401eafff by80: 更新 application 配置
Made-with: Cursor
2026-03-18 12:02:47 +08:00
4 changed files with 301 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
crmeb: crmeb:
imagePath: /www/wwwroot/shop.bosenyuan.com/ # 服务器图片路径配置 斜杠结尾 imagePath: /www/wwwroot/shop.bosenyuan.com/ # /www/wwwroot/shop.bosenyuan.com/ 服务器图片路径配置 斜杠结尾
asyncConfig: true #是否同步config表数据到redis asyncConfig: true #是否同步config表数据到redis
server: server:

View File

@@ -32,7 +32,7 @@ server:
spring: spring:
profiles: profiles:
active: miao33 active: miao80
servlet: servlet:
multipart: multipart:
max-file-size: 50MB #设置单个文件大小 max-file-size: 50MB #设置单个文件大小

View File

@@ -0,0 +1,82 @@
#!/bin/bash
# 编译并部署 miao-front用户端 API到 by80 云服务器
# 部署前在云服务器上备份原有 jar
# 使用: ./shell/deploy-front-by80.sh在 backend 目录下)
# 或指定密钥: SSH_IDENTITY=~/.ssh/your_key ./shell/deploy-front-by80.sh
set -e
ENV_NAME="by80"
SSH_IDENTITY="${SSH_IDENTITY:-$HOME/.ssh/id_ed25519_crmeb_deploy}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
DEPLOY_CONF="$BACKEND_DIR/deploy.conf"
# 解析 by80 段配置deploy.conf 中 by80 段到 miao33 段之前的 KEY=value
get_conf() {
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)
SERVER_PORT=$(get_conf SERVER_PORT)
REMOTE_DIR_JAR=$(get_conf REMOTE_DIR_JAR)
FRONT_JAR_NAME=$(get_conf FRONT_JAR_NAME)
FRONT_LOCAL_PORT=$(get_conf FRONT_LOCAL_PORT)
SPRING_PROFILE="miao80"
[[ -z "$SERVER_HOST" ]] && SERVER_HOST=123.56.214.80
[[ -z "$REMOTE_DIR_JAR" ]] && REMOTE_DIR_JAR=/www/wwwroot/crmeb
[[ -z "$FRONT_JAR_NAME" ]] && FRONT_JAR_NAME=miao-front-2.2.jar
[[ -z "$FRONT_LOCAL_PORT" ]] && FRONT_LOCAL_PORT=30031
[[ -z "$SERVER_USER" ]] && SERVER_USER=root
[[ -z "$SERVER_PORT" ]] && SERVER_PORT=22
JAR_PATH="$BACKEND_DIR/crmeb-front/target/$FRONT_JAR_NAME"
REMOTE_JAR="$REMOTE_DIR_JAR/$FRONT_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)"
echo "=== 部署 miao-front用户端 API$ENV_NAME 云服务器 ==="
echo " 服务器: $SERVER_USER@$SERVER_HOST"
echo " 目标目录: $REMOTE_DIR_JAR"
echo " Profile: $SPRING_PROFILE"
echo ""
echo "=== 1. 编译 crmeb-frontmiao-front-2.2.jar==="
cd "$BACKEND_DIR"
mvn clean package -pl crmeb-front -am -DskipTests -q
echo "已生成: $JAR_PATH"
[[ ! -f "$JAR_PATH" ]] && { echo "错误: jar 未生成"; exit 1; }
echo ""
echo "=== 2. 云服务器备份原有 jar ==="
"${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/${FRONT_JAR_NAME}.${BACKUP_SUFFIX}"
echo "已备份: $REMOTE_DIR_JAR/backups/${FRONT_JAR_NAME}.${BACKUP_SUFFIX}"
else
echo "远程无原有 jar跳过备份"
fi
REMOTE_BACKUP
echo ""
echo "=== 3. 上传 $FRONT_JAR_NAME$REMOTE_DIR_JAR ==="
"${SCP_CMD[@]}" "$JAR_PATH" "$SERVER_USER@$SERVER_HOST:$REMOTE_DIR_JAR/"
echo "jar 上传完成."
echo ""
echo "=== 4. 远程重启 miao-front 服务 (profile=$SPRING_PROFILE, port=$FRONT_LOCAL_PORT) ==="
"${SSH_CMD[@]}" "cd $REMOTE_DIR_JAR && \
(pkill -f $FRONT_JAR_NAME || true) && \
sleep 2 && \
nohup java -Xms128m -Xmx256m -jar $FRONT_JAR_NAME --spring.profiles.active=$SPRING_PROFILE --server.port=$FRONT_LOCAL_PORT > front.log 2>&1 & \
sleep 3 && \
(pgrep -f $FRONT_JAR_NAME && echo 'miao-front 已启动' || (echo '启动可能失败,请检查 front.log'; tail -20 front.log))"
echo ""
echo "=== miao-front 部署完成 ==="

View File

@@ -0,0 +1,217 @@
# 公司名称:宝应博森元
## mysql数据库配置信息
host ip: 123.56.214.80
datasource:
name: yangtangyoupin
username: yangtangyoupin
password: 5Fn8eWrbYFtAhCZw
---
## 数据删除任务
- **用户id数据范围**
93257
93255
93247
93246
93245
93244
93243
93242
93240
93237
93236
93235
93234
93232
93231
93230
93229
93227
93226
93225
93224
93223
93222
93221
93220
93219
93215
93210
93209
93208
93206
93205
93204
93203
93202
93201
93199
93198
93197
93196
93195
93191
93188
93181
93180
93178
93176
93175
93174
93173
93172
93165
93162
93158
93154
93151
93149
93141
93099
93098
93096
93095
93079
93076
93063
93041
93003
93001
92959
92951
92885
92884
92880
92850
92792
92754
92671
91757
---
## 需求目标
删除数据库中“用户id数据范围”内用户在所有相关表中的业务数据保留不在该范围内的其他用户及其业务数据。
本文件可作为后续同类“按用户范围删除数据”需求的标准处理方案文档。执行时只需替换公司信息、数据库连接信息和用户 ID 范围。
## 执行边界
- **删除方向**:删除用户 ID 范围内的数据,保留范围外数据。
- **表范围**:不只处理显式列出的表,需要扫描目标库所有表结构,找出用户关联字段后统一处理。
- **字段范围**:重点处理以下用户关联字段:
- `uid`
- `user_id`
- `seller_id`
- `buyer_id`
- `out_user_id`
- `bargain_user_id`
- `pay_uid`
- 其他明确表示用户 ID 的字段
- **核心用户表**
- `wa_users.id`
- `eb_user.uid`
- **特殊字段边界**
- `eb_user.spread_uid` 表示“当前用户的推荐人”。
-`spread_uid` 命中待删除用户 ID 时,不删除这些范围外用户,也不默认清空该字段。
- `spread_uid` 仅作为预检报告项,除非需求另行明确要求处理。
## 预检要求
执行删除前必须先做只读预检:
1. 确认连接的数据库为目标库 `yangtangyoupin`
2. 扫描 `INFORMATION_SCHEMA.COLUMNS`,找出所有用户关联字段。
3. 对每个命中的表字段统计目标用户 ID 的命中行数。
4. 单独报告 `eb_user.spread_uid` 命中数量,但不纳入删除范围。
5. 输出清理前基线统计,作为最终删除数量核对依据。
参考字段扫描范围:
```sql
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND (
COLUMN_NAME IN (
'uid',
'user_id',
'seller_id',
'buyer_id',
'out_user_id',
'bargain_user_id',
'pay_uid',
'spread_uid'
)
OR COLUMN_NAME LIKE '%user%'
OR COLUMN_NAME LIKE '%uid%'
OR COLUMN_NAME LIKE '%seller%'
OR COLUMN_NAME LIKE '%buyer%'
)
ORDER BY TABLE_NAME, COLUMN_NAME;
```
## 删除规则
### `wa_*` 相关表
删除用户 ID 范围内的相关记录:
- `wa_users`:删除 `id` 在用户 ID 范围内的记录。
- `wa_order`:删除 `seller_id``buyer_id` 在用户 ID 范围内的订单。同一订单只删除一次。
- `wa_merchandise`:删除 `user_id` 在用户 ID 范围内的寄售商品。
- `wa_selfbonus_log`:删除 `user_id` 在用户 ID 范围内的记录。
- `wa_sharebonus_log`:删除 `user_id` 在用户 ID 范围内的记录。
- `wa_coupon_log`:删除 `user_id` 在用户 ID 范围内的记录。
- `wa_address``wa_alipay``wa_bank``wa_money_log``wa_withdraw` 等存在 `user_id` 字段的表:删除 `user_id` 在用户 ID 范围内的记录。
### `eb_*` 相关表
删除用户 ID 范围内的相关记录:
- `eb_user`:删除 `uid` 在用户 ID 范围内的记录。
- `eb_user_integral_record`:删除 `uid` 在用户 ID 范围内的记录。
- `eb_user_address``eb_user_bill``eb_user_brokerage_record``eb_user_experience_record``eb_user_extract``eb_user_level``eb_user_recharge``eb_user_sign``eb_user_token``eb_user_visit_record` 等存在 `uid` 字段的用户表:删除 `uid` 在用户 ID 范围内的记录。
- `eb_store_order``eb_store_cart``eb_store_coupon_user``eb_store_pink``eb_store_product_log``eb_store_product_relation``eb_store_product_reply` 等存在 `uid` / `pay_uid` / `bargain_user_id` 的业务表:删除相关字段在用户 ID 范围内的记录。
- `eb_pay_component_order.out_user_id` 等明确表示用户 ID 的字段:删除字段值在用户 ID 范围内的记录。
### 其他相关表
- `t_platform_account.user_id` 等非 `wa_*` / `eb_*` 表:如字段语义明确为用户 ID删除字段值在用户 ID 范围内的记录。
- 仅字段名包含 `username``user_phone``user_address` 等非用户 ID 语义字段时,不按用户 ID 范围删除。
## 执行顺序
1. 先删除业务子表和日志表数据。
2. 再删除订单、商品、积分、账单、访问记录等用户关联数据。
3. 最后删除核心用户表:
- `wa_users WHERE id IN (...)`
- `eb_user WHERE uid IN (...)`
4. 不处理 `eb_user.spread_uid IN (...)` 的范围外用户。
## 校验要求
删除完成后必须逐表校验:
- 所有纳入删除范围的 `uid``user_id``seller_id``buyer_id``out_user_id``bargain_user_id``pay_uid` 等字段,对目标用户 ID 的命中数应为 `0`
- `wa_users.id` 在目标用户 ID 范围内的记录数应为 `0`
- `eb_user.uid` 在目标用户 ID 范围内的记录数应为 `0`
- `wa_order``seller_id``buyer_id` 在目标用户 ID 范围内的记录数应为 `0`
- `eb_user.spread_uid` 命中范围内 ID 的记录可以继续存在,作为保留边界说明输出。
## 输出要求
执行完成后输出以下结果:
- 每张表清理前命中数。
- 每张表实际删除数。
- 每张表清理后剩余命中数。
- `eb_user.spread_uid` 的保留说明。
- 最终结论:是否所有纳入删除范围的相关数据均已清零。