|
|
@@ -1304,13 +1304,20 @@ def create_user(
|
|
|
request, req_err = _resolve_admin_payload_with_crypto_fallback(request, current_user)
|
|
|
if req_err is not None:
|
|
|
return req_err
|
|
|
- # 检查用户名唯一性
|
|
|
- existing = user_crud.get_by_username(db, request.get("username"))
|
|
|
+ username = (request.get("username") or "").strip() if isinstance(request, dict) else ""
|
|
|
+ if not username:
|
|
|
+ return error_response(400, "用户名不能为空")
|
|
|
+ # uk_username 覆盖软删行:活跃账号直接拒绝;已软删则释放用户名后允许重建
|
|
|
+ existing = user_crud.get_by_username_any(db, username)
|
|
|
if existing:
|
|
|
- return error_response(400, "用户名已存在")
|
|
|
-
|
|
|
+ if getattr(existing, "is_del", 0) == 0:
|
|
|
+ return error_response(400, "用户名已存在")
|
|
|
+ existing.username = user_crud._release_username(existing.username, existing.id)
|
|
|
+ db.flush()
|
|
|
+
|
|
|
creator = {"user_id": current_user.get("user_id"), "real_name": current_user.get("real_name")}
|
|
|
body = dict(request) if request else {}
|
|
|
+ body["username"] = username
|
|
|
region_ids = body.pop("regionIds", None)
|
|
|
if body.get("avatarUrl") == "":
|
|
|
body["avatarUrl"] = None
|
|
|
@@ -1318,6 +1325,12 @@ def create_user(
|
|
|
user, initial_password = user_crud.create_with_password(db, body, creator)
|
|
|
except ValueError as e:
|
|
|
return error_response(400, str(e))
|
|
|
+ except IntegrityError as e:
|
|
|
+ db.rollback()
|
|
|
+ err = str(getattr(e.orig, "args", e) or e)
|
|
|
+ if "uk_username" in err or "username" in err.lower():
|
|
|
+ return error_response(400, "用户名已存在")
|
|
|
+ raise
|
|
|
|
|
|
if isinstance(region_ids, list):
|
|
|
_replace_user_region_scopes(db, user.id, region_ids, current_user.get("user_id"), current_user.get("real_name"))
|