一个基于 Midway.js + Vue3 + TypeScript + TypeORM + Bootstrap5 的现代化全栈开发模板,提供完整的用户管理、权限控制、文件上传等功能。
template/ ├── bin/ # 脚本文件 │ ├── init.js # 项目初始化脚本(自动安装依赖) │ ├── dev.sh # 开发环境启动脚本 │ ├── build.sh # 构建脚本 │ └── deploy.sh # 部署脚本 ├── src/ # 后端源码 │ ├── config/ # 配置文件 │ │ ├── config.default.ts # 默认配置 │ │ ├── config.local.ts # 本地配置 │ │ └── devops.config.ts # DevOps 配置 │ ├── controller/ # 控制器 │ │ ├── admin.controller.ts # 管理员接口 │ │ ├── user.controller.ts # 用户接口 │ │ ├── session.controller.ts # 会话接口 │ │ └── home.controller.ts # 主页接口 │ ├── service/ # 业务逻辑层 │ │ ├── user.service.ts # 用户服务 │ │ ├── session.service.ts # 会话服务 │ │ └── account.service.ts # 账户服务 │ ├── model/ # 数据模型 (TypeORM 实体) │ │ └── user.entity.ts # 用户实体 │ ├── dto/ # 数据传输对象 │ ├── filter/ # 过滤器 │ ├── guard/ # 守卫 │ └── configuration.ts # 应用配置 ├── web/ # 前端源码 │ ├── src/ │ │ ├── platform/ # 平台核心 │ │ │ ├── App.vue # 根组件 │ │ │ ├── index.ts # 入口文件 │ │ │ └── router.ts # 路由配置 │ │ ├── pages/ # 页面组件 │ │ │ └── login.vue # 登录页面 │ │ ├── components/ # 公共组件 │ │ │ ├── dataGrid/ # 数据表格 │ │ │ ├── loading/ # 加载组件 │ │ │ ├── modal/ # 模态框 │ │ │ └── toast/ # 消息提示 │ │ ├── service/ # API 服务 │ │ │ ├── login.ts # 登录服务 │ │ │ ├── account.ts # 账户服务 │ │ │ └── base.ts # 基础服务 │ │ ├── stores/ # 状态管理 (Pinia) │ │ │ └── session.ts # 会话状态 │ │ ├── utils/ # 工具函数 │ │ ├── base/ # 基础层 │ │ └── domain/ # 领域层 │ ├── public/ # 静态资源 │ ├── view/ # HTML 模板 │ └── vite.config.ts # Vite 配置 ├── data/ # 数据文件 │ └── db_myproject_t_user.sql # 数据库初始化脚本 ├── logs/ # 日志目录 ├── dist/ # 构建输出 ├── typings/ # 类型定义 ├── .env # 环境变量 ├── bootstrap.js # 启动入口 ├── package.json # 后端依赖 └── README.md # 项目文档
git clone <repository-url>
cd template
# 自动检测并使用 pnpm(优先)或 npm 安装所有依赖
npm run init
# 安装后端依赖
npm install
# 安装前端依赖
cd web
npm install
cd ..
复制环境变量模板并修改:
cp .tpl.env .env
编辑 .env 文件,配置数据库和其他环境变量:
# 数据库配置 DB_HOST=localhost DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=your_password DB_DATABASE=db_myproject # 服务器配置 PORT=7001 IP=127.0.0.1 # 前端配置 VITE_PORT=5173 PREFIX=/api API_URL=http://localhost:7001/api # 其他配置 TITLE=WebServer Application
# 导入数据库结构和初始数据
mysql -u root -p db_myproject < data/db_myproject_t_user.sql
npm run dev
这将同时启动前后端开发服务器。
# 启动后端 (端口 7001)
npm run dev:midway
# 启动前端 (端口 5173)
npm run dev:vue
// src/controller/example.controller.ts
import { Controller, Get, Provide } from '@midwayjs/core';
import { BaseController } from '@cicctencent/midwayjs-base';
@Provide()
@Controller('/api/example')
export class ExampleController extends BaseController {
@Get('/list')
async list() {
return {
ret: 0,
data: [],
msg: 'success'
};
}
}
// src/service/example.service.ts
import { Provide, Inject } from '@midwayjs/core';
@Provide()
export class ExampleService {
async getData() {
return [];
}
}
// src/model/example.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
import BaseEntity from '@fefeding/common/dist/models/base/baseORM';
@Entity('t_example')
export class ExampleEntity extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 100 })
name: string;
}
<!-- web/src/pages/example.vue --> <template> <div class="container"> <h1>示例页面</h1> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; </script>
// web/src/service/example.ts
import { request } from '../utils/request';
export const getExampleList = () => {
return request.get('/api/example/list');
};
// web/src/stores/example.ts
import { defineStore } from 'pinia';
export const useExampleStore = defineStore('example', {
state: () => ({
data: []
}),
actions: {
async fetchData() {
// 获取数据逻辑
}
}
});
# 构建前后端
npm run build
# 使用 PM2 启动
npm start
# 或直接启动
node bootstrap.js
docker-compose -f bin/docker/dev-docker-compose.yml up --build
docker-compose -f bin/docker/prod-docker-compose.yml up -d
npm run tars:deploy
| 接口 | 方法 | 路径 | 描述 |
|---|---|---|---|
| 用户搜索 | POST | /api/user/search | 分页获取用户列表 |
| 用户详情 | POST | /api/user/getUserDetail | 获取用户详细信息 |
| 创建用户 | POST | /api/user/create | 创建新用户 |
| 更新用户 | POST | /api/user/update | 更新用户信息 |
| 修改密码 | POST | /api/user/updatePassword | 修改用户密码 |
| 设置状态 | POST | /api/user/setStatus | 启用/禁用用户 |
| 上传头像 | POST | /api/user/uploadAvatar | 上传用户头像 |
interface ApiResponse<T> {
ret: number; // 0 成功,1 失败
data?: T; // 数据
msg: string; // 消息
}
# 后端测试
npm test
# 前端单元测试
cd web && npm run test:unit
# 测试覆盖率
npm run cov
# 代码规范检查
npm run lint
# 自动修复
npm run lint:fix
npm run init - 一键安装所有依赖(自动检测 pnpm/npm)npm run dev - 启动开发环境(前后端)npm run dev:midway - 仅启动后端npm run dev:vue - 仅启动前端npm run dev:all - 并行启动前后端npm run build - 构建生产版本npm run build:vue - 构建前端npm run build:midway - 构建后端npm start - 生产环境启动npm restart - 重启服务npm stop - 停止服务npm run deploy - 完整部署流程npm run zip - 打包为 server.zipnpm run docker - 构建 Docker 镜像config.default.ts - 默认配置config.local.ts - 本地开发配置devops.config.ts - DevOps 相关配置web/vite.config.ts - Vite 构建配置web/tsconfig.json - TypeScript 配置详见 .env.example 文件中的配置说明。
git checkout -b feature/new-featuregit commit -am 'Add new feature'git push origin feature/new-feature本项目基于 MIT 许可证开源。
A: 在 src/model/ 目录下创建新的实体文件,然后运行数据库迁移。
A: 修改 src/config/devops.config.ts 中的 prefixUrl 配置。
A: 后端默认支持 CORS,可在 src/config/config.default.ts 中进行详细配置。
A: 使用 @decorators.checkLogin() 装饰器,或在配置中添加 auth.ignores 规则。
如有问题,请提交 Issue 或联系项目维护者。
注意: 这是一个模板项目,请根据实际业务需求进行调整和扩展。