feat(flows): 新增流程编辑器基础功能与相关组件
feat(backend): 添加流程模型与服务支持 feat(frontend): 实现流程编辑器UI与交互 feat(assets): 添加流程节点图标资源 feat(plugins): 实现上下文菜单和运行时插件 feat(components): 新增基础节点和侧边栏组件 feat(routes): 添加流程相关路由配置 feat(models): 创建流程和运行日志数据模型 feat(services): 实现流程服务层逻辑 feat(migration): 添加流程相关数据库迁移 feat(config): 更新前端配置支持流程编辑器 feat(utils): 增强axios错误处理和工具函数
This commit is contained in:
@ -1,6 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
API="http://127.0.0.1:8080/api"
|
||||
API_BASE="${BACKEND_API:-http://127.0.0.1:9898}"
|
||||
API="${API_BASE%/}/api"
|
||||
# 新增:可配置的 admin 新密码,默认 123456
|
||||
ADMIN_PASSWORD="${ADMIN_PASSWORD:-123456}"
|
||||
|
||||
extract_id() { sed -n -E 's/.*"id":([0-9]+).*/\1/p'; }
|
||||
|
||||
@ -76,10 +79,36 @@ JSON
|
||||
}
|
||||
|
||||
# 1) Admin login
|
||||
LOGIN_JSON=$(printf '{"username":"admin","password":"Admin@123"}' | curl -s -X POST "$API/auth/login" -H "Content-Type: application/json" --data-binary @-)
|
||||
TOKEN=$(echo "$LOGIN_JSON" | sed -n -E 's/.*"access_token":"([^"]*)".*/\1/p')
|
||||
if [ -z "$TOKEN" ]; then echo "[ERROR] Admin 登录失败: $LOGIN_JSON"; exit 1; fi
|
||||
# 优先使用新密码尝试登录;失败则回退到历史默认密码 Admin@123,并在成功后重置为新密码
|
||||
LOGIN_JSON=$(printf '{"username":"admin","password":"%s"}' "$ADMIN_PASSWORD" | curl -s -X POST "$API/auth/login" -H "Content-Type: application/json" --data-binary @-)
|
||||
TOKEN=$(echo "$LOGIN_JSON" | sed -n 's/.*"access_token":"\([^"]*\)".*/\1/p')
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo "[WARN] 使用新密码登录失败,尝试旧密码 Admin@123"
|
||||
LOGIN_JSON=$(printf '{"username":"admin","password":"Admin@123"}' | curl -s -X POST "$API/auth/login" -H "Content-Type: application/json" --data-binary @-)
|
||||
TOKEN=$(echo "$LOGIN_JSON" | sed -n 's/.*"access_token":"\([^"]*\)".*/\1/p')
|
||||
if [ -z "$TOKEN" ]; then echo "[ERROR] Admin 登录失败: $LOGIN_JSON"; exit 1; fi
|
||||
NEED_RESET=1
|
||||
else
|
||||
NEED_RESET=0
|
||||
fi
|
||||
H_AUTH="Authorization: Bearer $TOKEN"
|
||||
|
||||
# 若使用旧密码登录成功,则将 admin 密码重置为 ADMIN_PASSWORD 并刷新 Token
|
||||
if [ "$NEED_RESET" = "1" ]; then
|
||||
ADMIN_JSON=$(curl -s -X GET "$API/users?page=1&page_size=50&keyword=admin" -H "$H_AUTH")
|
||||
ADMIN_ID=$(echo "$ADMIN_JSON" | sed -n -E 's/.*"id":([0-9]+).*"username":"admin".*/\1/p')
|
||||
if [ -n "$ADMIN_ID" ]; then
|
||||
RESET_JSON=$(printf '{"password":"%s"}' "$ADMIN_PASSWORD" | curl -s -X POST "$API/users/$ADMIN_ID/reset_password" -H "$H_AUTH" -H "Content-Type: application/json" --data-binary @-)
|
||||
echo "$RESET_JSON" | grep -q '"code":0' && echo "[OK] 已将 admin 密码重置为 $ADMIN_PASSWORD" || echo "[WARN] 重置 admin 密码可能失败: $RESET_JSON"
|
||||
# 刷新 Token
|
||||
LOGIN_JSON=$(printf '{"username":"admin","password":"%s"}' "$ADMIN_PASSWORD" | curl -s -X POST "$API/auth/login" -H "Content-Type: application/json" --data-binary @-)
|
||||
TOKEN=$(echo "$LOGIN_JSON" | sed -n 's/.*"access_token":"\([^"]*\)".*/\1/p')
|
||||
if [ -n "$TOKEN" ]; then H_AUTH="Authorization: Bearer $TOKEN"; fi
|
||||
else
|
||||
echo "[WARN] 未获取到 admin 用户ID,跳过密码重置"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "[OK] Admin 登录成功"
|
||||
|
||||
# 1b) 去重清理:仅保留最早创建的根菜单,删除其余重复的根及子树
|
||||
@ -154,9 +183,70 @@ PY
|
||||
fi
|
||||
}
|
||||
|
||||
# 如数据库已存在相同根菜单,先做去重清理
|
||||
# 如数据库已存在相同根菜单,先做去重清理(按名称在不同 type 下也去重)
|
||||
cleanup_duplicate_roots "演示-系统管理" 0 || true
|
||||
cleanup_duplicate_roots "演示-系统管理" 1 || true
|
||||
cleanup_duplicate_roots "演示-系统管理" 2 || true
|
||||
cleanup_duplicate_roots "系统管理" 0 || true
|
||||
cleanup_duplicate_roots "系统管理" 1 || true
|
||||
cleanup_duplicate_roots "系统管理" 2 || true
|
||||
|
||||
# 当需要彻底移除历史演示菜单时,设置 PURGE_DEMO=1 会删除单个“演示-系统管理”根及其子树(叶优先)
|
||||
if [ "${PURGE_DEMO:-0}" = "1" ]; then
|
||||
MENUS_JSON=$(curl -s -X GET "$API/menus" -H "$H_AUTH")
|
||||
DEMO_ROOT_ID=$(echo "$MENUS_JSON" | python3 - <<'PY'
|
||||
import json,sys
|
||||
try:
|
||||
data=json.load(sys.stdin)
|
||||
menus=data.get("data", [])
|
||||
except Exception:
|
||||
menus=[]
|
||||
for m in menus:
|
||||
if m.get("name")=="演示-系统管理" and m.get("parent_id") is None:
|
||||
print(m.get("id"), end="")
|
||||
break
|
||||
PY
|
||||
)
|
||||
if [ -n "${DEMO_ROOT_ID:-}" ]; then
|
||||
ORDER=$(echo "$MENUS_JSON" | RID="$DEMO_ROOT_ID" python3 - <<'PY'
|
||||
import json,sys,os
|
||||
try:
|
||||
data=json.load(sys.stdin)
|
||||
menus=data.get("data", [])
|
||||
except Exception:
|
||||
menus=[]
|
||||
root_id=int(os.environ.get("RID"))
|
||||
children={}
|
||||
for m in menus:
|
||||
pid=m.get("parent_id")
|
||||
if isinstance(pid,int):
|
||||
children.setdefault(pid,[]).append(m.get("id"))
|
||||
order=[]
|
||||
def dfs(nid):
|
||||
for cid in children.get(nid,[]) or []:
|
||||
dfs(cid)
|
||||
order.append(nid)
|
||||
dfs(root_id)
|
||||
print(",".join(str(i) for i in order), end="")
|
||||
PY
|
||||
)
|
||||
if [ -n "$ORDER" ]; then
|
||||
for id in $(echo "$ORDER" | tr ',' ' '); do
|
||||
RES=$(curl -s -X DELETE "$API/menus/$id" -H "$H_AUTH" || true)
|
||||
echo "$RES" | grep -q '"code":0' || {
|
||||
sleep 0.2
|
||||
RES=$(curl -s -X DELETE "$API/menus/$id" -H "$H_AUTH" || true)
|
||||
echo "$RES" | grep -q '"code":0' || echo "[WARN] 删除演示菜单失败(id=$id): $RES"
|
||||
}
|
||||
done
|
||||
echo "[OK] 已彻底移除历史演示菜单(含根)"
|
||||
else
|
||||
echo "[INFO] 未计算到需删除的演示菜单"
|
||||
fi
|
||||
else
|
||||
echo "[INFO] 未发现现存的 演示-系统管理 根"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 2) Create demo menus(可通过环境变量 SKIP_DEMO=1 跳过)
|
||||
if [ "${SKIP_DEMO:-0}" != "1" ]; then
|
||||
@ -195,6 +285,7 @@ fi
|
||||
|
||||
# [INFO] 演示菜单已通过幂等逻辑创建/获取,避免重复
|
||||
# 3) Create demo role
|
||||
if [ "${SKIP_DEMO:-0}" != "1" ]; then
|
||||
TS=$(date +%s)
|
||||
ROLE_NAME="演示-经理-${TS}"
|
||||
ROLE_CODE="demo_manager_${TS}"
|
||||
@ -209,6 +300,7 @@ for v in "${USERS_ID:-}" "${ROLES_ID:-}" "${MENUS_ID:-}" "${PERMS_ID:-}" "${DEPT
|
||||
if [ -n "$v" ]; then
|
||||
if [ -n "$IDS" ]; then IDS="$IDS,$v"; else IDS="$v"; fi
|
||||
fi
|
||||
|
||||
done
|
||||
if [ -n "$IDS" ]; then
|
||||
BIND_MENU_JSON=$(printf '{"ids":[%s]}' "$IDS" | curl -s -X PUT "$API/roles/$ROLE_ID/menus" -H "$H_AUTH" -H "Content-Type: application/json" --data-binary @-)
|
||||
@ -250,6 +342,9 @@ if [ -z "$TOKEN2" ]; then echo "[ERROR] 新用户登录失败: $LOGIN2_JSON"; ex
|
||||
|
||||
MENUS2=$(curl -s -X GET "$API/auth/menus" -H "Authorization: Bearer $TOKEN2")
|
||||
echo "[RESULT] 新用户可见菜单响应: $MENUS2"
|
||||
else
|
||||
echo "[INFO] 已设置 SKIP_DEMO=1,跳过演示角色/用户创建与绑定"
|
||||
fi
|
||||
|
||||
# 7) Check permissions and seed defaults if empty
|
||||
PERMS_LIST=$(curl -s -X GET "$API/permissions?page=1&page_size=100" -H "$H_AUTH") || true
|
||||
@ -276,7 +371,7 @@ if [ "$PERMS_TOTAL" = "0" ]; then
|
||||
echo "[RESULT] 初始化后权限总数: $PERMS_TOTAL"
|
||||
fi
|
||||
|
||||
echo "[SUMMARY] DEMO_ROOT=${DEMO_ROOT_ID:-} USERS=${USERS_ID:-} ROLES=${ROLES_ID:-} MENUS=${MENUS_ID:-} PERMS=${PERMS_ID:-} ROLE=$ROLE_ID USER=$USER_ID USERNAME=$USER_NAME"
|
||||
echo "[SUMMARY] DEMO_ROOT=${DEMO_ROOT_ID:-} USERS=${USERS_ID:-} ROLES=${ROLES_ID:-} MENUS=${MENUS_ID:-} PERMS=${PERMS_ID:-} ROLE=${ROLE_ID:-} USER=${USER_ID:-} USERNAME=${USER_NAME:-}"
|
||||
|
||||
# 8) Seed formal "系统管理" menus and Super Admin role
|
||||
# 获取或创建 系统管理 根菜单:查找时不依赖字段顺序
|
||||
@ -317,8 +412,11 @@ MENUS2_ID=$(create_menu_under_sys "菜单管理" "/menus" "Menus" "AppstoreOutli
|
||||
PERMS2_ID=$(create_menu_under_sys "权限管理" "/permissions" "Permissions" "KeyOutlined" 50); [ -z "$PERMS2_ID" ] && echo "[WARN] 权限管理 菜单ID获取失败"
|
||||
DEPTS2_ID=$(create_menu_under_sys "部门管理" "/departments" "Departments" "AppstoreOutlined" 60); [ -z "$DEPTS2_ID" ] && echo "[WARN] 部门管理 菜单ID获取失败"
|
||||
POSITIONS2_ID=$(create_menu_under_sys "岗位管理" "/positions" "Positions" "IdcardOutlined" 65); [ -z "$POSITIONS2_ID" ] && echo "[WARN] 岗位管理 菜单ID获取失败"
|
||||
# 新增:流程相关菜单
|
||||
FLOWS2_ID=$(create_menu_under_sys "流程管理" "/flows" "FlowList" "AppstoreAddOutlined" 70); [ -z "$FLOWS2_ID" ] && echo "[WARN] 流程管理 菜单ID获取失败"
|
||||
FLOWLOGS2_ID=$(create_menu_under_sys "流程运行日志" "/flow-run-logs" "FlowRunLogs" "HistoryOutlined" 80); [ -z "$FLOWLOGS2_ID" ] && echo "[WARN] 流程运行日志 菜单ID获取失败"
|
||||
|
||||
echo "[OK] 正式系统菜单准备完成: ROOT=$SYS_ROOT_ID USERS=$USERS2_ID ROLES=$ROLES2_ID MENUS=$MENUS2_ID PERMS=$PERMS2_ID DEPTS=$DEPTS2_ID POSITIONS=$POSITIONS2_ID"
|
||||
echo "[OK] 正式系统菜单准备完成: ROOT=$SYS_ROOT_ID USERS=$USERS2_ID ROLES=$ROLES2_ID MENUS=$MENUS2_ID PERMS=$PERMS2_ID DEPTS=$DEPTS2_ID POSITIONS=$POSITIONS2_ID FLOWS=$FLOWS2_ID FLOW_LOGS=$FLOWLOGS2_ID"
|
||||
|
||||
# 工具函数:根据 parent_id + perms 查找或创建按钮菜单(使用 Python 解析)
|
||||
create_or_get_button(){
|
||||
|
||||
Reference in New Issue
Block a user