Day4-5:Web 双端适配与 Admin 系统全栈落地实录

简介: 本文档整合了 Day 4 与 Day 5 的开发进展,核心涵盖 Web 端响应式 UI 复现、云端资讯 API 接入,以及 Admin 管理系统的架构设计与模块化开发步骤,打通了从用户体验到后台管理的完整链路。

Day4(Web 端桌面/移动适配 + 样式复现 + 云端资讯接入)

今日目标

根据 design 设计稿,对照 apps/web/src 现有代码,完成以下三件事并沉淀为可复盘记录:

  1. 设计并落地各页面桌面端/移动端
  2. 复现设计稿核心视觉样式
  3. 接入云端 API,获取最新 AI 资讯

Step 1:页面设计拆解与端形态确认(已完成)

1.1 设计稿范围确认

已逐一核对以下 4 组页面设计稿(桌面 + 移动):

  • design/Portal/desktop.html
  • design/Portal/mobile.html
  • design/Todos/desktop.html
  • design/Todos/mobile.html
  • design/AiNews/desktop.html
  • design/AiNews/mobile.html
  • design/Info/desktop.html
  • design/Info/mobile.html

1.2 Web 路由与页面映射确认

已确认 apps/web/src/App.tsx 中页面路由与设计稿主题对应关系:

  • / -> 门户页(Portal)
  • /todos -> 待办页(Todos)
  • /ai-news -> 资讯页(AiNews)
  • /web -> 个人信息页(Info/Profile)

对应实现文件:

  • apps/web/src/pages/PortalPage.tsx
  • apps/web/src/pages/TodoPage.tsx
  • apps/web/src/pages/AiNewsPage.tsx
  • apps/web/src/pages/DashboardPage.tsx

1.3 双端布局策略确认

统一采用响应式分支:

  • 移动端:lg:hidden
  • 桌面端:hidden lg:block

并在桌面端通过 DesktopShellLayout.tsx 统一左侧导航与头部骨架,保证 Todos / AiNews / Profile 三页视觉一致性。


Step 2:样式复现与组件对齐(已完成)

2.1 门户页样式复现

PortalPage.tsx 已复现设计稿核心结构与视觉:

  • 固定半透明顶部导航 + 毛玻璃效果
  • Hero 区域渐变标题与双 CTA
  • 桌面端大卡片 mockup + 移动端 mockup
  • Features 模块桌面网格/移动卡片双布局
  • 品牌色体系以 teal/emerald 为主,保持与设计稿一致

2.2 业务内页(Todos / AiNews / Profile)样式复现

已对齐设计稿中的关键风格特征:

  • 左侧导航(桌面)与底部 Tab(移动)
  • 卡片圆角、边框层级、阴影强弱
  • 标题层级、信息密度、状态色(teal/amber/rose/slate)
  • 资讯转待办标识(“来自 AI 资讯”)
  • 顶部渐变背景装饰与列表滚动区分层

涉及文件:

  • apps/web/src/pages/TodoPage.tsx
  • apps/web/src/pages/AiNewsPage.tsx
  • apps/web/src/pages/DashboardPage.tsx
  • apps/web/src/pages/components/DesktopShellLayout.tsx
  • apps/web/src/pages/components/NavIcons.tsx

2.3 状态与交互细节复现

已覆盖设计稿强调的主要交互状态:

  • loading / error / empty 状态文案
  • 按钮禁用态(如“已加入待办”)
  • hover / active / transition 反馈
  • 编辑态与普通态切换(待办页)

Step 3:接入云端 API 获取最新资讯(已完成)

3.1 API Client 接入

apps/web/src/lib/api.ts 中通过 @aitodos/api-sdk 创建客户端:

  • createApiClient(baseUrl)
  • baseUrl 来源:VITE_API_BASE_URL
  • 默认回退:http://localhost:3000/api

3.2 资讯 Store 能力

apps/web/src/store/news.store.ts 已落地三类能力:

  • fetchNews:读取资讯列表(api.listAiNews()
  • refreshNewsFromCloud:从云端抓取最新资讯(api.refreshAiNews()
  • addToTodo:资讯一键加入待办(api.addAiNewsToTodo(newsId, userId)

并包含基础状态管理:items / loading / error

3.3 页面触发与用户反馈

apps/web/src/pages/AiNewsPage.tsx 已完成接入与交互:

  • 页面初次加载自动执行 fetchNews()
  • 点击刷新按钮触发 refreshNewsFromCloud()
  • 刷新成功/失败均有文案反馈(actionMessage
  • 支持“加入待办”并跳转待办页,携带提示消息

结论:云端资讯获取链路已打通,具备“拉取最新资讯 -> 展示 -> 转待办”的完整闭环。


今日产出总结

  • 已完成设计稿到 React 页面的桌面/移动双端映射
  • 已完成核心视觉样式复现(门户 + 三个业务页)
  • 已完成云端资讯 API 的接入与页面联动
  • 当前可支持个人博客向外说明:Day4 聚焦于“UI 复刻 + 响应式 + 云端资讯能力闭环”

Day5(Admin 管理系统:设计落地到开发步骤)

今日目标

基于 docs/Todo/day5.mddesign/Admin/*.html 设计稿,沉淀一份可直接执行的开发步骤,确保:

  1. 管理后台四大模块可路由访问(Dashboard / Users / AI News / System)
  2. UI 与设计稿一致(桌面端侧边栏 + 移动端底部导航)
  3. 包含关键样板代码、配置说明、核心实现要点

Step 1:项目骨架与路由(先跑起来)

1.1 页面与路由清单

建议页面文件:

  • apps/admin/src/pages/AdminDashboardPage.tsx
  • apps/admin/src/pages/AdminUsersPage.tsx
  • apps/admin/src/pages/AdminAiNewsPage.tsx
  • apps/admin/src/pages/AdminSystemPage.tsx

建议路由:

  • /admin/dashboard
  • /admin/users
  • /admin/ai-news
  • /admin/system

1.2 路由样板代码(React Router)

// apps/admin/src/App.tsx
import { Navigate, Route, Routes } from 'react-router-dom'
import { AdminShellLayout } from './components/admin/AdminShellLayout'
import { AdminDashboardPage } from './pages/AdminDashboardPage'
import { AdminUsersPage } from './pages/AdminUsersPage'
import { AdminAiNewsPage } from './pages/AdminAiNewsPage'
import { AdminSystemPage } from './pages/AdminSystemPage'

export default function App() {
  return (
    <Routes>
      <Route path="/admin" element={<AdminShellLayout />}>
        <Route index element={<Navigate to="dashboard" replace />} />
        <Route path="dashboard" element={<AdminDashboardPage />} />
        <Route path="users" element={<AdminUsersPage />} />
        <Route path="ai-news" element={<AdminAiNewsPage />} />
        <Route path="system" element={<AdminSystemPage />} />
      </Route>
    </Routes>
  )
}

关键说明:

  • 用嵌套路由把公共壳层(Header / SideNav / BottomNav)收敛到一个布局组件。
  • index -> dashboard 保证进入后台就有默认页面。

Step 2:AdminShellLayout(响应式导航一次做对)

2.1 设计约束(根据最新稿)

  • 桌面端(lg 及以上):左侧 SideNav + 顶部 TopBar
  • 移动端(lg 以下):简化 Header + 底部 BottomTabBar
  • 仪表盘不提供全局搜索

2.2 样板代码(布局骨架)

// apps/admin/src/components/admin/AdminShellLayout.tsx
import { NavLink, Outlet } from 'react-router-dom'

const tabs = [
  { to: '/admin/dashboard', label: '仪表盘' },
  { to: '/admin/users', label: '用户' },
  { to: '/admin/ai-news', label: '资讯' },
  { to: '/admin/system', label: '系统' },
]

export function AdminShellLayout() {
  return (
    <div className="bg-slate-50 min-h-screen text-slate-800">
      <header className="lg:hidden fixed top-0 inset-x-0 h-16 bg-white/90 backdrop-blur border-b border-slate-200 z-50" />

      <div className="flex pt-16 lg:pt-0 pb-24 lg:pb-0 min-h-screen">
        <aside className="hidden lg:flex w-64 shrink-0 border-r border-slate-200 bg-white fixed inset-y-0" />

        <div className="flex-1 lg:pl-64 flex flex-col">
          <header className="hidden lg:flex h-16 border-b border-slate-200 bg-white/80 backdrop-blur items-center px-8">
            <p className="text-sm text-slate-400 italic">管理员仪表盘 - 数据监控中</p>
          </header>

          <main className="flex-1 p-4 lg:p-8">
            <Outlet />
          </main>
        </div>
      </div>

      <nav className="lg:hidden fixed bottom-0 inset-x-0 h-[68px] bg-white/95 border-t border-slate-200 z-50 flex items-center justify-around">
        {tabs.map((tab) => (
          <NavLink key={tab.to} to={tab.to} className="text-xs">
            {tab.label}
          </NavLink>
        ))}
      </nav>
    </div>
  )
}

关键说明:

  • pb-24 防止移动端内容被底部导航遮挡。
  • 导航激活态建议统一用 NavLinkisActive 控制品牌色。

Step 3:基础配置(Tailwind / 主题 / API)

3.1 Tailwind 品牌色(与设计稿一致)

// tailwind.config.ts
export default {
   
  theme: {
   
    extend: {
   
      colors: {
   
        brand: {
   
          50: '#f0fdfa',
          100: '#ccfbf1',
          200: '#99f6e4',
          500: '#14b8a6',
          600: '#0d9488',
        },
      },
      fontFamily: {
   
        sans: ['Inter', 'sans-serif'],
      },
    },
  },
}

3.2 API SDK 统一入口

// apps/admin/src/lib/api.ts
import {
    createApiClient } from '@aitodos/api-sdk'

export const api = createApiClient(
  import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000/api'
)

关键说明:

  • 后台不要散落 fetch,统一走 SDK,便于后续鉴权、拦截、错误处理。
  • 建议按领域分组 SDK 方法:statsApi / userAdminApi / aiNewsApi / systemApi

Step 4:Dashboard(先完成“可看”)

4.1 数据结构建议

type Overview = {
   
  totalUsers: number
  addedUserCount: number
  totalAiNewsCount: number
  newsToTodoRate: number
}

4.2 store 样板(Zustand)

// apps/admin/src/store/adminDashboard.store.ts
import {
    create } from 'zustand'
import {
    api } from '../lib/api'

type State = {
   
  overview: Overview | null
  loading: boolean
  error: string | null
  fetchOverview: () => Promise<void>
}

export const useAdminDashboardStore = create<State>((set) => ({
   
  overview: null,
  loading: false,
  error: null,
  fetchOverview: async () => {
   
    set({
    loading: true, error: null })
    try {
   
      const data = await api.statsApi.getOverview()
      set({
    overview: data, loading: false })
    } catch {
   
      set({
    error: '加载概览数据失败', loading: false })
    }
  },
}))

关键说明:

  • 先打通 KPI + 趋势图,再补活跃热力块和来源分布。
  • 页面必须有 loading/empty/error 三态。

Step 5:Users(可筛选 + 可变更)

5.1 接口动作

  • GET /admin/users
  • PATCH /admin/users/:id/role
  • PATCH /admin/users/:id/status

5.2 关键交互清单

  • 筛选:角色 / 状态 / 关键词
  • 操作:改角色、启停账号
  • 反馈:二次确认 + Toast

样板交互代码(伪代码):

await updateUserRole(userId, role)
toast.success('角色更新成功')
await fetchUsers()

Step 6:AI News(同步链路)

6.1 接口动作

  • GET /ai-news
  • POST /ai-news/refresh

6.2 页面实现要点

  • 顶部“立即同步抓取”按钮
  • 列表展示来源、抓取时间、转化人数
  • 同步中禁用按钮 + 状态提示条

样板代码(刷新按钮):

<button disabled={refreshing} onClick={refreshNews}>
  {refreshing ? '同步中...' : '立即同步抓取'}
</button>

Step 7:System(合并日志/设置/管理员信息)

7.1 接口动作(建议)

  • GET /admin/system/profile
  • GET /admin/system/logs
  • PATCH /admin/system/settings
  • POST /admin/system/cache/clear

页面包含三块:

  1. 管理员信息卡
  2. 最近操作日志
  3. 全局设置(推送时间、开放注册、缓存清理)

关键说明:

  • “缓存清理”属于危险操作,必须二次确认。
  • 系统设置建议单独 API 分组(systemApi)。

Step 8:执行清单(开发顺序)

  • [ ] 搭建 Admin 路由与壳层布局
  • [ ] 完成桌面侧边栏与移动底部导航切换
  • [ ] 移除 TopBar 搜索并统一头部样式
  • [ ] 接入 Dashboard 概览与趋势数据
  • [ ] 完成 Users 筛选与角色/状态变更
  • [ ] 接入 AI News 列表与手动同步
  • [ ] 完成 System 三大模块(信息/日志/设置)
  • [ ] 全页面补齐 loading/empty/error 三态
  • [ ] 自测桌面/移动端布局不遮挡、不跳动

今日结论

Day5 的核心不是“把页面画出来”,而是把 Admin 的实现路径标准化:

  • 先壳层后页面
  • 先数据骨架后细节交互
  • 先闭环后增强

按本文步骤执行,可直接进入 apps/admin 的 Step2 开发阶段。

相关文章
|
2天前
|
人工智能 NoSQL API
从 0 到后端闭环: Day2 跑通 Prisma 7 + NestJS + Redis 的实战记录
记录我在 AiTodos Day2 打通后端闭环的过程:完成 Prisma 7 迁移、NestJS + Fastify 接入,以及 AI 资讯/Todo/统计接口和 Redis 日缓存落地。
|
3天前
|
人工智能 监控 安全
多模态AI(图像+文本)该怎么测试?不是把图片丢给模型这么简单
本文系统阐述多模态AI测试新范式:突破传统文本测试局限,聚焦图像理解、图文对齐、跨模态推理、幻觉防控、安全注入与鲁棒性验证六大核心维度,提出分层模型、六维测试矩阵及自动化评测体系,强调“证据链”验证——答案必须可追溯至图片真实信息。
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
3837 12
|
26天前
|
安全 JavaScript 前端开发
React2Shell 漏洞自动化凭证窃取攻击机理与防御研究
CVE-2025-55182(React2Shell)是CVSS 10.0的高危RCE漏洞,可无认证、无交互远程接管Next.js等RSC应用服务器。2026年已爆发规模化自动化凭证窃取攻击,单日入侵766台服务器。本文系统剖析漏洞机理与攻击链,构建检测、监控、防御、响应一体化闭环体系,提供可落地的代码与方案。(239字)
206 16
|
26天前
|
人工智能 安全 搜索推荐
生成式 AI 驱动下网络安全手册重构与防御体系研究
本文探讨生成式AI如何颠覆传统网络安全防御体系,指出其使静态特征检测、固定响应流程和边界信任模型全面失效。文章提出以行为意图识别、持续信任验证和人机协同决策为核心的AI原生安全框架,并提供可落地的代码实现与运营规范,助力组织构建自适应、可解释、有制衡的下一代防御能力。(239字)
118 9
|
26天前
|
运维 Kubernetes 应用服务中间件
CI/CD流水线镜像拉取耗时从47分钟降到2分钟,我做了这几件事
换镜像加速源,CI/CD构建从47分钟骤降至2分钟!非代码/硬件优化,仅切换为毫秒镜像(1ms.run)——全源加速(Docker Hub、GHCR、k8s.gcr等),30台服务器10分钟批量配置,失败率归零,凌晨发布成功率100%。
168 16
|
27天前
|
人工智能 JavaScript 前端开发
从零开始:手把手教你用Vue构建完美复刻大模型打字效果的对话界面
本文深入解析AI对话应用中流式输出(Streaming)的实现原理与工程实践,涵盖SSE协议选型、Fetch+ReadableStream替代EventSource、Vue响应式流处理、Markdown实时渲染、光标动画、平滑滚动、AbortController中断、DOM性能优化及XSS防护等核心环节,助力打造专业级流式交互体验。(239字)
341 0
|
27天前
|
SQL 存储 关系型数据库
干掉 90% 慢 SQL!MySQL 全链路排查与优化方法论,从执行计划到表结构全拆解
本文系统讲解MySQL慢SQL优化全链路方法:从慢查询日志精准定位、EXPLAIN执行计划深度解析,到10大索引失效场景根因拆解、8大SQL改写实战技巧;涵盖表结构设计规范与Java层防控实践,强调“先定位、再看执行计划、后优化”,助力开发者高效解决80%以上数据库性能瓶颈。
355 1
|
28天前
|
Ubuntu 算法 关系型数据库
Debian/Ubuntu 环境 PolarDB-X 单机版 DEB 包安装综合指南
本文整合阿里云文档,详解Ubuntu 18.04与Debian 10下PolarDB-X单机版安装:因官方仅提供RPM包,需用alien转DEB,但二者压缩格式不同(Ubuntu用zstd,Debian 10不支持),必须在目标系统本地转换,不可复用。含依赖处理、配置初始化及启动验证全流程。
400 19
|
28天前
|
人工智能 Python
别再乱问AI了!掌握这3个“指令性提示词”,效率提升300%
别再乱问AI了!掌握这3个“指令性提示词”,效率提升300%
273 5

热门文章

最新文章