TP8+Vue3
后台管理系统
全流程知识清单
从架构设计到部署运维的完整知识体系,专为非科班自学者打造的企业级应用开发指南
前后端分离
采用现代化前后端分离架构,提升开发效率和系统可维护性
工程化实践
完整的工程化流程,从代码规范到自动化部署全覆盖
企业级安全
全面的安全防护体系,从API安全到数据加密多层保护
系统架构概览
系统整体架构与核心思想
采用前后端分离架构,前端聚焦Vue3生态进行高效开发,后端利用ThinkPHP8构建安全的RESTful API
前后端分离架构
性能体验
提升系统性能和用户体验,单页应用避免频繁整页刷新,前后端可独立进行性能优化
RESTful API设计原则
将一切资源抽象化,通过唯一URI标识,使用HTTP标准方法定义操作:GET获取资源、POST创建资源、PUT更新资源、DELETE删除资源 [123]
项目初始化与目录结构
Vue3 + Vite + TypeScript
使用
npm create vite@latest 创建项目
选择
vue-ts 模板预配置TypeScript
项目结构包含components、views、router、store等模块
配置
vite.config.ts 路径别名和代理
ThinkPHP8多应用模式
使用Composer创建项目:
composer create-project topthink/think tp8-project
启用多应用模式:
auto_multi_app = true
创建admin、api、common等应用模块
每个应用拥有独立的controller、model、middleware
技术选型与版本管理
前端技术栈
后端技术栈
版本管理
采用Git Flow分支管理策略
前端工程化(Vue3)
深入Vue3生态系统,掌握现代化前端开发的核心技术和最佳实践
Vue3基础与核心机制
Composition API
基于函数的组织方式,将相同功能的逻辑代码组合在一起,提高代码可读性和可维护性
响应式原理
基于ES6 Proxy实现,一次性代理整个对象,无需递归遍历,提供更优的性能和更全面的响应式能力
生命周期钩子
Composition API中以函数形式提供,可在setup中灵活组合相关生命周期逻辑
组件化与状态管理
组件封装与通信
组件设计原则
- 封装内部实现细节,通过props和events暴露接口
- 遵循单一职责原则,每个组件只负责一个特定功能
- 实现组件复用,避免重复代码
通信方式
- 父子通信: props向下传递,events向上通知
- 兄弟通信: 通过共同父组件作为中介
- 跨层级通信: provide/inject机制
Pinia全局状态管理
State
存储应用状态数据,响应式更新
Getters
从state派生新状态,类似computed
Actions
修改state的唯一途径,支持异步
Vue Router路由管理
基础配置
const routes = [
{ path: '/users', component: UserManagement },
{ path: '/users/:id', component: UserDetail }
]
导航守卫
- • 全局守卫:权限检查、登录验证
- • 路由独享守卫:特定路由权限控制
- • 组件内守卫:离开确认、数据保存
性能优化与工程化
路由懒加载
const routes = [
{
path: '/users',
component: () => import('@/views/UserManagement.vue')
}
]
只有当用户访问到某个路由时,才去加载该路由对应的组件代码,显著减小初始加载体积
Vite插件优化
-
unplugin-auto-import: 自动导入API
-
unplugin-vue-components: 组件自动导入
-
vite-plugin-imagemin: 图片压缩
代码规范与提交规范
代码质量保证
- ESLint - 代码检查
- Prettier - 代码格式化
- Husky - Git钩子
提交规范
- Commitlint - 提交信息检查
- 约定式提交规范
- 自动生成变更日志
权限控制与代码生成
页面级权限控制
推荐方案:动态路由加载
用户登录后根据权限动态生成路由配置,通过router.addRoutes()动态添加到路由实例中 [49]
静态路由方案
- • 初始化即挂载全部路由
- • 路由meta中定义权限
- • 全局守卫中验证权限
缺点:影响首屏性能,灵活性差
动态路由方案
- • 只加载静态路由
- • 后端返回权限数据
- • 动态生成并添加路由
优势:提升首屏速度,前后端解耦
按钮级权限控制
CRUD代码生成工具
提升开发效率的关键
通过可视化界面配置,自动生成前后端全套CRUD代码,包括数据库迁移、API控制器、前端页面等 [152]
数据库表配置
选择表,定义字段类型,设置验证规则
代码生成
读取元数据,根据模板渲染生成代码文件
前后端代码
生成完整的API、服务层、前端页面组件
后端架构(ThinkPHP8)
利用ThinkPHP8的强大功能,构建安全、高效、可扩展的后端服务
框架基础与MVC模式
ThinkPHP8请求生命周期
路由定义
支持路由注解和配置文件方式,灵活定义URL与控制器方法的映射关系
#[Route('user/:id', 'GET')]
public function show($id) {
// ...
}
控制器编写
遵循"瘦控制器,胖服务"原则,控制器只负责接收请求、调用服务、返回响应
public function index(Request $request) {
$page = $request->param('page', 1);
$userList = app(UserService::class)
->getUserList($page);
return json(['code' => 200, 'data' => $userList]);
}
数据操作与API开发
ORM与数据库操作
基础操作
$users = User::select();
$user = User::find($id);
$user = new User();
$user->name = 'John';
$user->save();
$user = User::find(1);
$user->email = 'new@example.com';
$user->save();
高级查询
$users = User::where('status', 1)
->whereLike('name', '%admin%')
->order('create_time', 'desc')
->limit(10)
->select();
关联查询:
$user = User::find(1);
$articles = $user->articles()->select();
RESTful API设计
统一响应格式
// 成功响应
return json([
'code' => 200,
'msg' => 'success',
'data' => $data
]);
// 错误响应
return json([
'code' => 400,
'msg' => 'error message'
], 400);
数据验证与中间件
验证器机制
class UserValidate {
protected $rule = [
'name' => 'require|max:25',
'email' => 'email',
];
}
在控制器中使用
$this->validate() 方法进行验证
[37]
中间件应用
- Auth中间件: 用户认证检查
- Cors中间件: 跨域请求处理
- Log中间件: 请求日志记录
实现横切关注点,代码解耦
服务层与依赖注入
业务逻辑层(Service)
分层架构
实现高内聚、低耦合,提高代码可维护性和可测试性
服务类示例
class UserService {
public function register($data) {
// 业务规则验证
// 密码加密
// 创建用户
// 发送欢迎邮件
return $user;
}
}
依赖注入(DI)
构造函数注入
public function __construct(
UserService $userService
) {
$this->userService = $userService;
}
方法参数注入
public function index(
UserService $userService
) {
return $userService->list();
}
属性注入
#[Inject]
protected UserService $userService;
队列处理耗时任务
任务投递
Queue::push(SendEmailJob::class, [
'to' => 'user@example.com',
'subject' => '欢迎邮件',
'content' => '欢迎注册...'
]);
任务处理
class SendEmailJob {
public function fire($job, $data) {
// 发送邮件逻辑
$job->delete();
}
}
适用场景:
API安全与防护
接口安全防护
防篡改攻击
请求签名机制,使用HMAC-SHA256加密验证数据完整性
防重放攻击
时间戳+随机数机制,限制请求有效期和唯一性
JWT认证
基于Token的身份验证,无状态会话管理
输入验证与SQL注入防护
敏感数据保护
密码存储
绝对不允许明文存储,必须使用加盐哈希算法(bcrypt、Argon2)
敏感信息加密
身份证号、手机号等使用AES-256等加密算法存储,妥善保管密钥
数据传输安全
强制使用HTTPS协议,防止传输过程中数据被窃听或篡改
数据展示脱敏
前端界面显示时进行脱敏处理,如手机号中间四位显示为星号
参考实践:
BuildAdmin 项目中的"字段级修改保护"特性
[152]
数据库设计与优化
从概念设计到性能优化的完整数据库知识体系,确保数据安全与高效访问
关系型数据库基础
CRUD操作
- CREATE:
INSERT - READ:
SELECT - UPDATE:
UPDATE - DELETE:
DELETE
事务ACID
- Atomicity - 原子性
- Consistency - 一致性
- Isolation - 隔离性
- Durability - 持久性
索引原理
- • B-Tree/B+Tree结构
- • 提高查询速度
- • 避免全表扫描
- • 需要权衡写入性能
MySQL隔离级别
默认隔离级别为可重复读(Repeatable Read),避免脏读和不可重复读,但可能出现幻读
数据库建模与设计
数据库范式
第一范式
字段值不可再分,确保原子性
第二范式
消除部分依赖,完全依赖主键
第三范式
消除传递依赖,字段相互独立
反范式化:
在特定场景下为提升查询性能,可故意引入冗余数据,减少表连接操作
E-R图数据建模
基本元素
关系类型
- 一对一 (1:1): 用户与用户详情
- 一对多 (1:N): 用户与订单
- 多对多 (M:N): 学生与课程
字段类型与约束
数据类型选择
约束类型
SQL优化与性能调优
慢查询分析与EXPLAIN
慢查询日志
long_query_time = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
记录执行时间超过指定阈值的SQL语句,快速定位性能瓶颈
EXPLAIN分析
EXPLAIN SELECT * FROM users
WHERE name LIKE '%admin%'
ORDER BY created_at DESC;
SQL优化策略
查询优化
- 确保查询使用索引
- 避免在索引列上使用函数
- 避免SELECT *,只查询需要字段
- 优化JOIN操作,小表驱动大表
索引策略
- 组合索引列顺序优化
- 选择性高的列放在前面
- 使用覆盖索引减少回表
- 定期清理冗余索引
高级架构概念
数据库连接池
预先创建数据库连接,复用连接池中的连接,减少连接创建开销
读写分离
主库处理写操作,从库处理读操作,分散负载,提升读取性能
数据安全与备份
定期备份与恢复策略
全量备份
定期完整备份整个数据库
增量备份
只备份变化数据,节省空间
异地备份
备份存储在不同物理位置
最小权限原则
用户权限管理
-
禁用root用户为每个应用创建独立数据库用户
-
精细化权限只授予完成任务必需的最小权限
-
来源限制限制用户登录的主机名或IP地址
权限分配示例
-- 报表用户
GRANT SELECT ON report_db.* TO 'report_user'@'172.16.%.%';
-- 应用用户
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.*
TO 'app_user'@'localhost';
敏感信息加密存储
加密方法
密码加密
使用bcrypt或Argon2算法
数据加密
使用AES-256对称加密
脱敏策略
手机号脱敏
138****8888
身份证号脱敏
110***********1234
银行卡号脱敏
**** **** **** 5678
DevOps与项目部署
实现自动化部署和持续交付,构建现代化的开发运维流程
DevOps文化与流程
DevOps核心价值
快速交付
缩短开发到上线周期
高质量
自动化测试保证软件质量
高稳定性
环境一致性减少问题
好协作
打破部门墙,提升效率
CI/CD流水线
容器化与自动化部署
Docker基础概念
镜像 (Image)
只读模板,容器的"蓝图",包含应用及其依赖
容器 (Container)
镜像的运行实例,独立的、隔离的进程
仓库 (Registry)
存储和分发镜像的服务,如Docker Hub
常用Docker命令
docker build - 构建镜像
docker images - 查看镜像
docker push - 推送镜像
docker run - 运行容器
docker ps - 查看容器
docker exec - 执行命令
Dockerfile构建应用镜像
# 使用官方PHP镜像作为基础
FROM php:8.1-fpm
# 安装系统依赖和PHP扩展
RUN apt-get update && apt-get install -y \
git \
unzip \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql
# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 设置工作目录
WORKDIR /var/www/html
# 复制应用代码到镜像中
COPY . .
# 安装PHP依赖
RUN composer install --no-dev --optimize-autoloader
# 设置文件权限
RUN chown -R www-data:www-data /var/www/html
# 暴露端口
EXPOSE 9000
# 定义容器启动时执行的命令
CMD ["php-fpm"]
构建命令:
docker build -t my-app .
Docker Compose编排多容器
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./:/var/www/html
depends_on:
- db
- redis
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: myapp
MYSQL_ROOT_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
redis:
image: redis:alpine
volumes:
db_data:
启动命令:
docker-compose up -d
CI/CD流水线搭建
CI/CD工具选择
GitHub Actions
- 与GitHub生态无缝集成
- 配置简单,YAML文件定义
- 开源项目免费使用
- 适合个人或中小团队
Jenkins
- 功能强大,插件生态丰富
- 高度可定制和可扩展
- 支持自托管部署
- 适合大型企业复杂需求
GitHub Actions工作流配置
name: CI/CD Pipeline
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies and build frontend
run: |
cd frontend
npm ci
npm run build
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
- name: Install Composer dependencies
run: |
cd backend
composer install --no-dev --optimize-autoloader
- name: Run tests
run: |
cd backend
./vendor/bin/phpunit
- name: Deploy to server
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
docker-compose -f /path/to/docker-compose.yml down
docker-compose -f /path/to/docker-compose.yml pull
docker-compose -f /path/to/docker-compose.yml up -d
密钥管理与环境变量
GitHub Secrets
${{ secrets.HOST }}
${{ secrets.USERNAME }}
${{ secrets.SSH_KEY }}
${{ secrets.DATABASE_PASSWORD }}
在仓库Settings > Secrets and variables中设置,安全存储敏感信息
环境变量配置
- 区分开发、测试、生产环境
- 不在代码中硬编码配置
- 使用.env文件或配置中心
- CI/CD流程中动态注入
服务器运维与监控
Nginx反向代理配置
server {
listen 80;
server_name yourdomain.com;
# 静态资源处理
location / {
root /var/www/html/public;
index index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
}
# 反向代理到PHP-FPM
location ~ \.php$ {
fastcgi_pass app:9000; # 'app'是docker-compose中PHP服务的名称
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 负载均衡配置
upstream backend {
server app1:9000;
server app2:9000;
}
}
Linux服务器基础运维
基础运维
-
用户和权限管理useradd, usermod, chmod, chown
-
进程管理ps, top, htop, kill
-
网络管理netstat, ss, curl, wget
-
日志管理tail -f, journalctl, grep
安全加固
-
禁用root远程登录PermitRootLogin no
-
使用密钥认证禁用密码登录
-
配置防火墙ufw, firewalld
-
定期更新系统安装安全补丁
监控与日志方案
日志收集 (ELK/EFK)
性能监控 (Prometheus + Grafana)
测试与质量保证
构建全面的测试体系,确保软件质量和系统稳定性
测试的重要性与类型
测试金字塔
金字塔原则: 单元测试数量最多,集成测试次之,端到端测试数量最少
单元测试
测试程序中的单个"单元"(函数或类),验证逻辑正确性
- • 运行速度快
- • 反馈及时
- • 通过模拟隔离依赖
集成测试
测试多个单元或模块组合,验证接口和交互正确性
- • 验证模块间通信
- • 测试数据库交互
- • 检查外部依赖
端到端测试
从用户角度模拟完整操作流程,覆盖真实使用场景
- • 真实浏览器环境
- • 完整用户流程
- • 运行速度较慢
测试驱动开发(TDD)
编写失败的测试
先明确需求,编写一个必然失败的测试
编写最少代码
编写最少量的代码让测试通过
重构代码
在测试保护下改进代码结构和可读性
编写与执行测试
前端单元测试 (Vitest + @vue/test-utils)
测试内容
- Props和事件: 测试组件接收props和触发事件
- 渲染输出: 快照测试验证渲染结果
- 用户交互: 模拟点击、输入等操作
- 生命周期: 测试生命周期钩子执行
测试示例
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import MyButton from '@/components/MyButton.vue'
describe('MyButton', () => {
it('renders correctly with props', () => {
const wrapper = mount(MyButton, {
props: { label: 'Click me' }
})
expect(wrapper.text()).toContain('Click me')
})
it('emits click event when clicked', async () => {
const wrapper = mount(MyButton)
await wrapper.trigger('click')
expect(wrapper.emitted()).toHaveProperty('click')
})
})
后端API测试 (PHPUnit)
测试类型
- 单元测试: 测试单个类或函数逻辑
- 功能测试: 测试完整API接口
- 集成测试: 测试数据库交互
- Mock测试: 模拟外部依赖
测试示例
use think\testing\TestCase;
class UserControllerTest extends TestCase
{
public function testUserLogin()
{
$response = $this->post('/api/login', [
'username' => 'testuser',
'password' => 'testpassword'
]);
$response->assertStatus(200)
->assertJsonStructure([
'code',
'data' => ['token'],
'msg'
]);
}
}
接口测试工具 (Apifox)
接口调试
快速测试接口功能
自动化测试
编写测试脚本断言
Mock服务
模拟API响应
API文档
自动生成文档
优势: 集调试、测试、Mock、文档于一体,提升前后端协作效率
代码质量与文档
代码审查(Code Review)
审查重点
- 代码逻辑: 是否正确实现需求,是否存在潜在bug
- 代码风格: 是否遵循团队编码规范
- 可读性: 是否清晰易懂,易于维护和扩展
- 性能: 是否存在性能问题
- 安全性: 是否存在安全漏洞
最佳实践
- 保持积极建设性态度,共同提高代码质量
- 使用Pull Request功能进行代码审查
- 关注代码设计而非个人风格
- 提供具体改进建议,而非简单批评
代码注释规范
注释原则
解释"为什么"而不是"什么"
// 使用二分查找提高搜索效率
// i++ // 增加i的值
使用TODO和FIXME标记
// TODO: 优化算法复杂度
// FIXME: 处理边界条件异常
文档注释
/**
* 计算用户年龄
*
* @param string $birthDate 出生日期(YYYY-MM-DD)
* @return int 年龄(周岁)
* @throws \InvalidArgumentException 日期格式错误
*/
public function calculateAge(string $birthDate): int
{
// 实现代码
}
使用PHPDoc/JSDoc规范,支持IDE提示和自动生成文档
自动生成API文档
Swagger/OpenAPI
- 通过代码注解描述API
- 生成交互式HTML文档
- 支持在线API测试
- 多语言客户端生成
/**
* @OA\Get(
* path="/api/users",
* summary="获取用户列表",
* @OA\Response(response=200, description="成功")
* )
*/
Apifox
- 可视化API设计界面
- 一键生成前后端代码
- 集成调试、Mock、测试
- 团队协作功能完善