refactor: 清理废弃模块并重构管理端与全端代码
- 移除所有废弃的旧首页配置模块,包括destinationHero、demand相关、HomeExperience、vehicleService等表结构与代码,新增数据库迁移删除遗留表 - 重构管理端后台布局为标准RuoYi风格,新增Sidebar、Navbar、SettingsDrawer等组件,替换旧的过渡菜单实现 - 调整移动端响应断点为768px,更新布局相关测试用例,新增布局组件测试 - 删除OperationsTools发布/重置页面,移除/tools菜单入口,清理对应的API调用与测试代码 - 重构玩法模块编辑器:替换旧的图片手动输入框为图片上传组件,移除冗余的取消按钮 - 新增线索查询offset参数支持,完善查询参数处理逻辑 - 优化rbac菜单构建逻辑,新增可见性控制参数 - 修正管家编辑器提示文案,优化系统资源编辑器表单初始化逻辑 - 清理小程序端废弃的体验推荐组件与相关测试代码 - 更新文档与种子脚本,匹配新的API契约与使用说明
This commit is contained in:
1 parent
f6c5ad589f
commit
fbf2c772a8
63 files changed
+2272
-1991
No files matched your search
@@ -9,14 +9,13 @@ from app.database import get_db
|
||||
from app.main import create_app
|
||||
from app.models import (
|
||||
AdminUser,
|
||||
HomeExperience,
|
||||
HomeTeamBuilding,
|
||||
HomeWanfaRecommendation,
|
||||
HomeWildArchive,
|
||||
WanfaCategory,
|
||||
WanfaRoute,
|
||||
)
|
||||
from app.schemas import HomeExperienceCreate, HomeTeamBuildingCreate, HomeWanfaRecommendationCreate, HomeWildArchiveCreate
|
||||
from app.schemas import HomeTeamBuildingCreate, HomeWanfaRecommendationCreate, HomeWildArchiveCreate
|
||||
|
||||
|
||||
class FakeScalarResult:
|
||||
@@ -76,22 +75,6 @@ def make_admin_user():
|
||||
)
|
||||
|
||||
|
||||
def make_experience(**overrides):
|
||||
return HomeExperience(
|
||||
id=overrides.get("id", "waterfall-descent"),
|
||||
badge=overrides.get("badge", "玩过推荐"),
|
||||
category=overrides.get("category", "瀑降体验"),
|
||||
title=overrides.get("title", "悬崖瀑降"),
|
||||
englishTitle=overrides.get("englishTitle", "WATERFALL DESCENT"),
|
||||
image=overrides.get("image", "https://example.test/waterfall.jpg"),
|
||||
demandKeyword=overrides.get("demandKeyword", "悬崖瀑降"),
|
||||
isActive=overrides.get("isActive", True),
|
||||
sortOrder=overrides.get("sortOrder", 0),
|
||||
createdAt=datetime(2026, 1, 1),
|
||||
updatedAt=datetime(2026, 1, 2),
|
||||
)
|
||||
|
||||
|
||||
def make_team(**overrides):
|
||||
return HomeTeamBuilding(
|
||||
id=overrides.get("id", "wild-challenge"),
|
||||
@@ -162,33 +145,6 @@ def admin_app(fake_db):
|
||||
return app
|
||||
|
||||
|
||||
def test_home_experience_schema_normalizes_text_and_url():
|
||||
item = HomeExperienceCreate(
|
||||
badge=" 玩过推荐 ",
|
||||
category=" 瀑降体验 ",
|
||||
title=" 悬崖瀑降 ",
|
||||
englishTitle=" WATERFALL DESCENT ",
|
||||
image=" https://example.test/waterfall.jpg ",
|
||||
demandKeyword=" 悬崖瀑降 ",
|
||||
)
|
||||
|
||||
assert item.title == "悬崖瀑降"
|
||||
assert item.image == "https://example.test/waterfall.jpg"
|
||||
assert item.sortOrder is None
|
||||
|
||||
|
||||
def test_home_experience_schema_rejects_invalid_image_url():
|
||||
with pytest.raises(ValidationError):
|
||||
HomeExperienceCreate(
|
||||
badge="玩过推荐",
|
||||
category="瀑降体验",
|
||||
title="悬崖瀑降",
|
||||
englishTitle="WATERFALL DESCENT",
|
||||
image="/waterfall.jpg",
|
||||
demandKeyword="悬崖瀑降",
|
||||
)
|
||||
|
||||
|
||||
def test_home_wild_archive_schema_normalizes_detail_image_urls():
|
||||
item = HomeWildArchiveCreate(
|
||||
title=" 石龙洞 ",
|
||||
@@ -217,21 +173,6 @@ def test_home_team_building_schema_normalizes_detail_content():
|
||||
assert item.detailParagraphs == ["第一段", "第二段"]
|
||||
|
||||
|
||||
def test_admin_home_experience_list_returns_full_record():
|
||||
fake_db = FakeDb(items=[make_experience()])
|
||||
app = admin_app(fake_db)
|
||||
try:
|
||||
response = TestClient(app).get("/api/admin/home/experiences")
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
assert response.status_code == 200
|
||||
item = response.json()["data"]["items"][0]
|
||||
assert item["id"] == "waterfall-descent"
|
||||
assert item["isActive"] is True
|
||||
assert item["createdAt"] == "2026-01-01T00:00:00"
|
||||
|
||||
|
||||
def test_admin_home_team_create_appends_to_end():
|
||||
fake_db = FakeDb(scalar_values=[2])
|
||||
app = admin_app(fake_db)
|
||||
@@ -321,42 +262,6 @@ def test_admin_home_wild_create_persists_detail_images():
|
||||
]
|
||||
|
||||
|
||||
def test_admin_home_delete_normalizes_remaining_order():
|
||||
first = make_experience(id="experience-1", sortOrder=0)
|
||||
second = make_experience(id="experience-2", sortOrder=1)
|
||||
fake_db = FakeDb(items=[first, second])
|
||||
app = admin_app(fake_db)
|
||||
try:
|
||||
response = TestClient(app).delete("/api/admin/home/experiences/experience-1")
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {
|
||||
"code": 200,
|
||||
"msg": "success",
|
||||
"data": {"id": "experience-1"},
|
||||
}
|
||||
assert second.sortOrder == 0
|
||||
assert fake_db.committed
|
||||
|
||||
|
||||
def test_admin_home_reorder_rejects_incomplete_ids():
|
||||
fake_db = FakeDb(items=[make_experience(id="experience-1"), make_experience(id="experience-2", sortOrder=1)])
|
||||
app = admin_app(fake_db)
|
||||
try:
|
||||
response = TestClient(app).patch(
|
||||
"/api/admin/home/experiences/reorder",
|
||||
json={"itemIds": ["experience-1"]},
|
||||
)
|
||||
finally:
|
||||
app.dependency_overrides.clear()
|
||||
|
||||
assert response.status_code == 400
|
||||
assert response.json()["errorCode"] == "HOME_REORDER_INVALID"
|
||||
assert not fake_db.committed
|
||||
|
||||
|
||||
def test_home_wanfa_recommendation_schema_requires_category_id():
|
||||
item = HomeWanfaRecommendationCreate(categoryId=" family-route ")
|
||||
|
||||
@@ -386,7 +291,6 @@ def test_public_home_places_active_wanfa_category_recommendations_in_experiences
|
||||
app = create_app()
|
||||
fake_db = FakeDb(
|
||||
items_by_model={
|
||||
HomeExperience: [],
|
||||
HomeTeamBuilding: [],
|
||||
HomeWildArchive: [],
|
||||
HomeWanfaRecommendation: [recommendation],
|
||||
@@ -424,7 +328,6 @@ def test_public_home_returns_rendering_fields_for_all_sections():
|
||||
app = create_app()
|
||||
fake_db = FakeDb(
|
||||
items_by_model={
|
||||
HomeExperience: [make_experience()],
|
||||
HomeTeamBuilding: [make_team()],
|
||||
HomeWildArchive: [make_archive()],
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user