- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
268 lines
11 KiB
Python
268 lines
11 KiB
Python
#!/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())
|