feat: 初始化考培练系统项目

- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
111
2026-01-24 19:33:28 +08:00
commit 998211c483
1197 changed files with 228429 additions and 0 deletions

View File

@@ -0,0 +1,267 @@
#!/usr/bin/env python3
"""
修复数据库中的中文乱码问题
重新插入正确的中文数据
"""
import asyncio
import aiomysql
from pathlib import Path
import sys
# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
async def fix_chinese_data():
"""修复中文数据"""
print("🔧 开始修复数据库中的中文乱码问题...")
# 正确的课程数据
correct_courses = [
{
"id": 1,
"name": "皮肤生理学基础",
"description": "学习皮肤结构、功能和常见问题,为专业护理打下基础",
"category": "technology",
"status": "published",
"duration_hours": 16.0,
"difficulty_level": 2,
"tags": ["皮肤学", "基础理论", "必修课"],
"sort_order": 100,
"is_featured": True
},
{
"id": 2,
"name": "医美产品知识与应用",
"description": "全面了解各类医美产品的成分、功效和适用人群",
"category": "technology",
"status": "published",
"duration_hours": 20.0,
"difficulty_level": 3,
"tags": ["产品知识", "医美", "专业技能"],
"sort_order": 110,
"is_featured": True
},
{
"id": 3,
"name": "美容仪器操作与维护",
"description": "掌握各类美容仪器的操作方法、注意事项和日常维护",
"category": "technology",
"status": "published",
"duration_hours": 24.0,
"difficulty_level": 3,
"tags": ["仪器操作", "实操技能", "设备维护"],
"sort_order": 120,
"is_featured": False
},
{
"id": 4,
"name": "医美项目介绍与咨询",
"description": "详细了解各类医美项目的原理、效果和适应症",
"category": "technology",
"status": "published",
"duration_hours": 30.0,
"difficulty_level": 4,
"tags": ["医美项目", "专业咨询", "风险告知"],
"sort_order": 170,
"is_featured": True
},
{
"id": 5,
"name": "轻医美销售技巧",
"description": "学习专业的销售话术、客户需求分析和成交技巧",
"category": "business",
"status": "published",
"duration_hours": 16.0,
"difficulty_level": 2,
"tags": ["销售技巧", "客户沟通", "业绩提升"],
"sort_order": 130,
"is_featured": True
},
{
"id": 6,
"name": "客户服务与投诉处理",
"description": "提升服务意识,掌握客户投诉处理的方法和技巧",
"category": "business",
"status": "published",
"duration_hours": 12.0,
"difficulty_level": 2,
"tags": ["客户服务", "危机处理", "沟通技巧"],
"sort_order": 140,
"is_featured": False
},
{
"id": 7,
"name": "社媒营销与私域运营",
"description": "学习如何通过社交媒体进行品牌推广和客户维护",
"category": "business",
"status": "published",
"duration_hours": 16.0,
"difficulty_level": 2,
"tags": ["社媒营销", "私域流量", "客户维护"],
"sort_order": 180,
"is_featured": False
},
{
"id": 8,
"name": "门店运营管理",
"description": "学习门店日常管理、团队建设和业绩管理",
"category": "management",
"status": "published",
"duration_hours": 20.0,
"difficulty_level": 3,
"tags": ["门店管理", "团队管理", "运营策略"],
"sort_order": 160,
"is_featured": False
},
{
"id": 9,
"name": "卫生消毒与感染控制",
"description": "学习医美机构的卫生标准和消毒流程,确保服务安全",
"category": "general",
"status": "published",
"duration_hours": 8.0,
"difficulty_level": 1,
"tags": ["卫生安全", "消毒规范", "合规管理"],
"sort_order": 150,
"is_featured": True
},
{
"id": 10,
"name": "Python编程基础",
"description": "Python语言入门课程适合零基础学员",
"category": "technology",
"status": "published",
"duration_hours": 40.0,
"difficulty_level": 2,
"tags": ["Python", "编程基础", "入门"],
"sort_order": 200,
"is_featured": False
},
{
"id": 11,
"name": "数据分析基础",
"description": "学习数据分析方法和工具,提升数据驱动决策能力",
"category": "technology",
"status": "published",
"duration_hours": 32.0,
"difficulty_level": 3,
"tags": ["数据分析", "Excel", "可视化"],
"sort_order": 210,
"is_featured": False
}
]
# 正确的岗位数据
correct_positions = [
{"id": 1, "name": "区域经理", "code": "region_manager", "description": "负责多家门店的运营管理和业绩达成", "status": "active", "skills": ["团队管理", "业绩分析", "战略规划", "客户关系"], "level": "expert", "sort_order": 10},
{"id": 2, "name": "店长", "code": "store_manager", "description": "负责门店日常运营管理,团队建设和业绩达成", "status": "active", "skills": ["门店管理", "团队建设", "销售管理", "客户维护"], "level": "senior", "sort_order": 20},
{"id": 3, "name": "美容顾问", "code": "beauty_consultant", "description": "为客户提供专业的美容咨询和方案设计", "status": "active", "skills": ["产品知识", "销售技巧", "方案设计", "客户沟通"], "level": "intermediate", "sort_order": 30},
{"id": 4, "name": "医美咨询师", "code": "medical_beauty_consultant", "description": "提供医疗美容项目咨询和方案制定", "status": "active", "skills": ["医美知识", "风险评估", "方案设计", "合规意识"], "level": "senior", "sort_order": 35},
{"id": 5, "name": "美容技师", "code": "beauty_therapist", "description": "为客户提供专业的美容护理服务", "status": "active", "skills": ["护肤技术", "仪器操作", "手法技巧", "服务意识"], "level": "intermediate", "sort_order": 40},
{"id": 6, "name": "护士", "code": "nurse", "description": "协助医生进行医美项目操作,负责术后护理", "status": "active", "skills": ["护理技术", "无菌操作", "应急处理", "医疗知识"], "level": "intermediate", "sort_order": 45},
{"id": 7, "name": "前台接待", "code": "receptionist", "description": "负责客户接待、预约管理和前台事务", "status": "active", "skills": ["接待礼仪", "沟通能力", "信息管理", "服务意识"], "level": "junior", "sort_order": 50},
{"id": 8, "name": "市场专员", "code": "marketing_specialist", "description": "负责门店营销活动策划和执行", "status": "active", "skills": ["活动策划", "社媒运营", "数据分析", "创意设计"], "level": "intermediate", "sort_order": 60}
]
# 正确的用户数据
correct_users = [
{"id": 1, "username": "superadmin", "full_name": "超级管理员"},
{"id": 2, "username": "admin", "full_name": "系统管理员"},
{"id": 3, "username": "testuser", "full_name": "测试学员"}
]
try:
# 连接数据库
conn = await aiomysql.connect(
host="localhost",
port=3306,
user="root",
password="root",
db="kaopeilian",
charset="utf8mb4",
use_unicode=True,
init_command="SET character_set_client=utf8mb4, character_set_connection=utf8mb4, character_set_results=utf8mb4"
)
cursor = await conn.cursor()
print("✅ 数据库连接成功")
# 开始事务
await cursor.execute("START TRANSACTION")
# 更新课程数据
print("\n📚 更新课程数据...")
for course in correct_courses:
sql = """
UPDATE courses SET
name = %s,
description = %s,
tags = %s,
updated_at = NOW()
WHERE id = %s
"""
tags_json = str(course["tags"]).replace("'", '"')
await cursor.execute(sql, (course["name"], course["description"], tags_json, course["id"]))
print(f" ✅ 更新课程: {course['name']}")
# 更新岗位数据
print("\n👥 更新岗位数据...")
for position in correct_positions:
sql = """
UPDATE positions SET
name = %s,
description = %s,
skills = %s,
updated_at = NOW()
WHERE id = %s
"""
skills_json = str(position["skills"]).replace("'", '"')
await cursor.execute(sql, (position["name"], position["description"], skills_json, position["id"]))
print(f" ✅ 更新岗位: {position['name']}")
# 更新用户数据
print("\n👤 更新用户数据...")
for user in correct_users:
sql = """
UPDATE users SET
full_name = %s,
updated_at = NOW()
WHERE id = %s
"""
await cursor.execute(sql, (user["full_name"], user["id"]))
print(f" ✅ 更新用户: {user['full_name']}")
# 提交事务
await cursor.execute("COMMIT")
print("\n✅ 所有数据更新完成!")
# 验证更新结果
print("\n🔍 验证更新结果...")
await cursor.execute("SELECT id, name FROM courses LIMIT 3")
courses = await cursor.fetchall()
for course_id, course_name in courses:
print(f" 课程 {course_id}: {course_name}")
await cursor.execute("SELECT id, name FROM positions LIMIT 3")
positions = await cursor.fetchall()
for pos_id, pos_name in positions:
print(f" 岗位 {pos_id}: {pos_name}")
await cursor.execute("SELECT id, full_name FROM users LIMIT 3")
users = await cursor.fetchall()
for user_id, user_name in users:
print(f" 用户 {user_id}: {user_name}")
await cursor.close()
conn.close()
print("\n🎉 中文乱码修复完成!")
except Exception as e:
print(f"❌ 修复失败: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
asyncio.run(fix_chinese_data())