fix(admin): 技能/agent 默认发布状态按角色判定 + 迁移幂等化 - evolution_service.publish_to_market (AI自进化发布到市场) 增加角色判定: 管理员=官方+已发布+免费, 用户=用户+待审核+客户定价 - run.sh 迁移改为幂等: 新增 schema_migrations 跟踪表, 已执行的迁移不再重复运行, 修复每次容器重启重复插入演示数据(002_init_data.sql)的问题 - run.sh 修正 CRLF 行尾导致容器无法启动(exec permission denied)

This commit is contained in:
qyyfw committed 2026-07-10 16:43:14 +08:00
1 parent 27ba91ae5e
commit 176cb35b54
2 files changed
+36 -8

No files matched your search

@@ -1031,16 +1031,31 @@ class EvolutionService:
logger.warning(f"publish_to_market: 技能 {skill_name} 已发布过") logger.warning(f"publish_to_market: 技能 {skill_name} 已发布过")
return {"error": "该技能已发布到市场,不能重复发布"} return {"error": "该技能已发布到市场,不能重复发布"}
# 角色判定:管理员发布=官方+已发布+免费;用户发布=用户+待审核+客户定价
_u = self.db.query(User).filter(User.id == self.user_id).first()
_is_admin = bool(_u and getattr(_u, "role", "user") == "admin")
if _is_admin:
app_source = "official"
app_status = "published"
app_price = 0.0
app_member_free = True
else:
app_source = "user"
app_status = "pending"
app_price = price if price else 0.0
app_member_free = False
# 在 market_apps 表中创建记录 # 在 market_apps 表中创建记录
market_app = MarketApp( market_app = MarketApp(
name=f"{skill_name}(进化)", name=f"{skill_name}(进化)",
type="skill", type="skill",
source="user", source=app_source,
publisher_id=self.user_id, publisher_id=self.user_id,
description=market_description or skill.description or "", description=market_description or skill.description or "",
price=price, price=app_price,
is_member_free=app_member_free,
skill_content="来自AI自进化技能的SKILL.md", skill_content="来自AI自进化技能的SKILL.md",
status="published", status=app_status,
) )
self.db.add(market_app) self.db.add(market_app)
self.db.flush() self.db.flush()
@@ -1051,9 +1066,9 @@ class EvolutionService:
skill_name=skill_name, skill_name=skill_name,
user_id=self.user_id, user_id=self.user_id,
market_app_id=market_app.id, market_app_id=market_app.id,
price=price, price=app_price,
market_description=market_description, market_description=market_description,
status="published", status=app_status,
) )
self.db.add(publish_record) self.db.add(publish_record)
+16 -3
View File
@@ -167,11 +167,19 @@ echo " 使用数据库: $MYSQL_DATABASE"
MIGRATION_DIR="$PROJECT_DIR/migrations" MIGRATION_DIR="$PROJECT_DIR/migrations"
if [ -d "$MIGRATION_DIR" ]; then if [ -d "$MIGRATION_DIR" ]; then
# 幂等迁移:用 schema_migrations 记录已执行版本,避免每次启动重复执行(如重复插入演示数据)
mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" $MYSQL_SSL_FLAG "$MYSQL_DATABASE" -e "CREATE TABLE IF NOT EXISTS schema_migrations (version VARCHAR(255) NOT NULL PRIMARY KEY, applied_at DATETIME DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;" 2>/dev/null
for sql_file in $(ls "$MIGRATION_DIR"/*.sql 2>/dev/null | sort); do for sql_file in $(ls "$MIGRATION_DIR"/*.sql 2>/dev/null | sort); do
filename=$(basename "$sql_file") filename=$(basename "$sql_file")
echo " - 执行: $filename" version="${filename%.sql}"
mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" $MYSQL_SSL_FLAG \ already=$(mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" $MYSQL_SSL_FLAG "$MYSQL_DATABASE" -sN -e "SELECT 1 FROM schema_migrations WHERE version='$version' LIMIT 1;" 2>/dev/null)
"$MYSQL_DATABASE" < "$sql_file" 2>&1 | sed 's/^/ /' || echo " [警告] $filename 部分语句已跳过(可能已存在)" if [ "$already" = "1" ]; then
echo " - 跳过(已执行): $filename"
else
echo " - 执行: $filename"
mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" $MYSQL_SSL_FLAG "$MYSQL_DATABASE" < "$sql_file" 2>&1 | sed 's/^/ /' || echo " [警告] $filename 部分语句已跳过(可能已存在)"
mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" $MYSQL_SSL_FLAG "$MYSQL_DATABASE" -e "INSERT IGNORE INTO schema_migrations (version) VALUES ('$version');" 2>/dev/null
fi
done done
echo " 数据库初始化完成" echo " 数据库初始化完成"
@@ -291,6 +299,11 @@ fi
# 如果 nginx 可用,则启动(Docker 环境) # 如果 nginx 可用,则启动(Docker 环境)
if command -v nginx &>/dev/null; then if command -v nginx &>/dev/null; then
# 自愈:确保媒体生成(视频/图像)等长请求不被 60s 代理超时中断
if [ -f /etc/nginx/conf.d/aiflow.conf ]; then
sed -i -E 's/proxy_read_timeout[[:space:]]+[0-9]+s;/proxy_read_timeout 600s;/; s/proxy_send_timeout[[:space:]]+[0-9]+s;/proxy_send_timeout 600s;/' /etc/nginx/conf.d/aiflow.conf 2>/dev/null || true
fi
echo "" echo ""
echo " Nginx 配置测试..." echo " Nginx 配置测试..."
if nginx -t 2>&1; then if nginx -t 2>&1; then