fix(mp): DevTools 卡死 + 主包 2MB→766KB + 代码质量 4 项全通过

根因:主包 2MB 全量组件注入导致 DevTools 渲染引擎内存渐增,
叠加离线时固定 3s 抑制期后的请求洪泛。

修复:
- app.config.ts 添加 lazyCodeLoading: requiredComponents
  主包 2.0MB→766KB,taro.js 526→131KB,vendors.js 230→28KB
- request.ts 离线抑制改为指数退避(3s→6s→12s→30s cap)
  后端不可达时自动延长抑制,防止请求风暴
- SegmentTabs Tab 接口改为 readonly,修复 TS 编译错误
- AbortController polyfill 补齐小程序运行时缺失
- 健康首页/设备同步/健康档案/报告/设置页 UI 重构
- 文章页公开端点适配游客访问
- 健康首页 Swiper 间隔优化 4s→5s,动画 500→300ms
This commit is contained in:
iven
2026-05-24 11:32:40 +08:00
parent 675f8a4b10
commit 1e59007bd5
58 changed files with 4950 additions and 494 deletions

View File

@@ -1,7 +1,7 @@
//! 文章分类 Handler
use axum::Extension;
use axum::extract::{FromRef, Json, Path, State};
use axum::extract::{FromRef, Json, Path, Query, State};
use erp_core::error::AppError;
use erp_core::rbac::require_permission;
use erp_core::types::{ApiResponse, TenantContext};
@@ -12,6 +12,32 @@ use crate::state::HealthState;
use validator::Validate;
// ---------------------------------------------------------------------------
// 公开端点(小程序游客 / 无需认证)
// ---------------------------------------------------------------------------
#[derive(Debug, serde::Deserialize)]
pub struct PublicCategoryQuery {
pub tenant_id: uuid::Uuid,
}
/// GET /public/article-categories — 公开分类列表(无需认证)
pub async fn list_public_categories<S>(
State(state): State<HealthState>,
Query(params): Query<PublicCategoryQuery>,
) -> Result<Json<ApiResponse<Vec<CategoryResp>>>, AppError>
where
HealthState: FromRef<S>,
S: Clone + Send + Sync + 'static,
{
let result = article_category_service::list_categories(&state, params.tenant_id).await?;
Ok(Json(ApiResponse::ok(result)))
}
// ---------------------------------------------------------------------------
// 管理端端点(需要认证)
// ---------------------------------------------------------------------------
pub async fn list_categories<S>(
State(state): State<HealthState>,
Extension(ctx): Extension<TenantContext>,

View File

@@ -45,6 +45,7 @@ where
params.category_id,
params.tag_id,
params.keyword,
None, // 管理端不过滤 is_public
)
.await?;
Ok(Json(ApiResponse::ok(result)))
@@ -69,6 +70,7 @@ pub async fn list_public_articles(
params.category_id,
params.tag_id,
params.keyword,
Some(true), // 公开端点只返回 is_public=true 的文章
)
.await?;
Ok(Json(ApiResponse::ok(result)))