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:
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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user