竞彩网全栈项目实战:克隆与重构,从零构建 Vue3 + .NET 9 现代彩票网站

原网站

QClaw克隆

增加主题切换

升级为vue

📋 项目概述

本文记录了如何使用 **Vue 3 ** 和 **.NET 9** 从零构建一个完整的彩票资讯网站,包含前端展示系统和后端 API 服务。

✨ 核心功能

| 模块 | 说明 |

|------|------|

| 🏠 首页展示 | 轮播Banner、开奖公告、赛事投注表 |

| 🎨 主题切换 | 深色/浅色模式,localStorage记忆 |

| 👤 用户系统 | 注册、登录、JWT认证 |

| 📱 响应式 | 完美适配 PC 端 |


🖥️ 技术架构

```

┌─────────────────────────────────────────────────────┐

│ 前端 (Vue 3) │

├─────────────────────────────────────────────────────┤

│ • Vue 3.4 + Composition API │

│ • Pinia 状态管理 │

│ • Vite 5 构建工具 │

│ • CSS Variables 主题系统 │

└─────────────────────────────────────────────────────┘

↓ HTTP API

┌─────────────────────────────────────────────────────┐

│ 后端 (.NET 9) │

├─────────────────────────────────────────────────────┤

│ • ASP.NET Core Web API │

│ • Entity Framework Core + Pomelo MySQL │

│ • JWT Bearer 认证 │

│ • BCrypt 密码加密 │

└─────────────────────────────────────────────────────┘

```


🎨 前端实现

1. 项目结构

```

sporttery-vue3/

├── src/

│ ├── components/ # 14个Vue组件

│ │ ├── TopBar.vue # 顶部导航条

│ │ ├── SiteHeader.vue # Logo+搜索+主题切换

│ │ ├── MainNav.vue # 多级导航菜单

│ │ ├── Banner.vue # 轮播Banner

│ │ ├── LotteryCard.vue # 开奖公告

│ │ ├── MatchTable.vue # 赛事投注表

│ │ ├── NewsSection.vue # 新闻资讯

│ │ ├── AuthModal.vue # 登录/注册弹窗 ⭐

│ │ └── ...

│ ├── stores/ # Pinia状态管理

│ │ ├── theme.js # 主题状态

│ │ └── auth.js # 用户认证 ⭐

│ ├── api/ # API请求封装 ⭐

│ └── composables/ # 可复用逻辑

```

2. 主题切换系统

使用 CSS 变量实现一键主题切换:

```css

/* 浅色主题 */

:root {

--color-bg-primary: #FFFFFF;

--color-text-primary: #333333;

--color-border: #DDDDDD;

}

/* 深色主题 */

data-theme="dark"\] { --color-bg-primary: #1A1A1A; --color-text-primary: #E8E8E8; --color-border: #3D3D3D; } \`\`\` ### 3. 用户认证模块 使用 Pinia 管理登录状态: \`\`\`javascript // stores/auth.js **export** **const** useAuthStore = defineStore('auth', () =\> { **const** token = ref(localStorage.getItem('token') \|\| '') **const** user = ref(**null**) **async** **function** login(account, password) { **const** res = **await** api.login({ account, password }) token.value = res.data.token user.value = res.data.user } }) \`\`\` --- ## ⚙️ 后端实现 ### 1. 项目结构 \`\`\` sporttery-api/ ├── src/ │ ├── Controllers/ │ │ ├── AuthController.cs # 认证接口 ⭐ │ │ └── HealthController.cs # 健康检查 │ ├── Services/ │ │ ├── UserService.cs # 用户业务逻辑 │ │ └── JwtService.cs # JWT生成 ⭐ │ ├── Models/ │ │ └── User.cs # 用户实体 │ ├── Data/ │ │ └── AppDbContext.cs # EF Core上下文 │ └── DTOs/ │ └── DTOs.cs # 数据传输对象 └── appsettings.json # 配置文件 \`\`\` ### 2. 核心接口 \| 接口 \| 方法 \| 说明 \| \|------\|------\|------\| \| \`/api/auth/register\` \| POST \| 用户注册 \| \| \`/api/auth/login\` \| POST \| 用户登录 \| \| \`/api/auth/me\` \| GET \| 获取当前用户信息 \| ### 3. JWT 认证 \`\`\`csharp // Services/JwtService.cs public string GenerateToken(int userId, string username) { var claims = new\[

{

new Claim(ClaimTypes.NameIdentifier, userId.ToString()),

new Claim(ClaimTypes.Name, username)

};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey));

var token = new JwtSecurityToken(..., claims, ..., signingCredentials);

return new JwtSecurityTokenHandler().WriteToken(token);

}

```

4. 数据库设计

```sql

CREATE TABLE users (

id INT AUTO_INCREMENT PRIMARY KEY,

username VARCHAR(50) NOT NULL UNIQUE,

email VARCHAR(100) NOT NULL UNIQUE,

password_hash VARCHAR(255) NOT NULL,

phone VARCHAR(20),

created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP,

is_active TINYINT(1) DEFAULT 1

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

```


🚀 项目演示

前端地址

```

http://localhost:5174/

```

后端 API

```

http://localhost:5001/api/auth/register

http://localhost:5001/api/auth/login

```

核心界面

  1. **首页** - 轮播Banner + 开奖公告 + 赛事表

  2. **主题切换** - 点击右上角月亮/太阳图标

  3. **用户中心** - 点击登录/注册,体验完整流程


📦 技术要点总结

Vue 3 亮点

  • ✅ `<script setup>` 语法糖,代码更简洁

  • ✅ Pinia 状态管理,代码更解耦

  • ✅ Teleport 组件,实现弹窗更优雅

  • ✅ CSS Variables,主题切换更丝滑

.NET 9 亮点

  • ✅ 最小 API,配置更简洁

  • ✅ EF Core 9,性能更强

  • ✅ JWT Bearer,认证更安全

  • ✅ 依赖注入,代码更可维护


📝 源代码

| 项目 | 路径 |

|------|------|

| 前端 Vue3 | `/Users/dev/.qclaw/workspace/sporttery-vue3/` |

| 后端 .NET | `/Users/dev/.qclaw/workspace/sporttery-api/` |

🙏 致谢

感谢 QClaw AI 助手提供的开发支持!

*本文由 AI 辅助编写,完整记录了项目开发全过程*

相关推荐
程序猿阿伟13 小时前
《QClaw重构开发的四个底层逻辑,看懂少走半年弯路》
人工智能·重构
charlie11451419116 小时前
嵌入式现代C++工程实践——第14篇:第二次重构 —— 模板登场,编译时绑定端口和引脚
开发语言·c++·stm32·安全·重构
Chef_Chen1 天前
论文解读:不需要OCR,不需要描述生成——ColPali重构了文档检索的底层逻辑
重构·ocr
AI先驱体验官2 天前
BotCash:Nvidia企业级Agent生态,智能体平台战争的新变量
大数据·人工智能·深度学习·重构·aigc
AI先驱体验官2 天前
臻灵:数字人+大模型,实时交互的技术临界点在哪里
大数据·人工智能·深度学习·microsoft·重构·开源·交互
我是唐青枫2 天前
C#.NET ValueTaskSource 深入解析:零分配异步、ManualResetValueTaskSourceCore 与使用边界
c#·.net
leijiwen2 天前
BDCM(比干数商模型):以数据为生产要素的全链路商业闭环,重构数字时代商业文明
重构
oioihoii2 天前
Token成本失控?两大开源方案如何重构AI编程成本结构
重构·开源·ai编程
葫三生2 天前
《论三生原理》系列:文化自信、知识范式重构与科技自主创新的思想运动源头?
大数据·人工智能·科技·深度学习·算法·重构·transformer
freewlt2 天前
当地图拥有大脑:AI Agent如何重构下一代位置服务
人工智能·重构