create-admin-mvp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +175 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +159 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +41 -0
- package/templates/admin-portal/ .stylelintrc.cjs +39 -0
- package/templates/admin-portal/.dockerignore +60 -0
- package/templates/admin-portal/.env +29 -0
- package/templates/admin-portal/.env.development +41 -0
- package/templates/admin-portal/.env.example +4 -0
- package/templates/admin-portal/.env.production +41 -0
- package/templates/admin-portal/.eslintrc.cjs +45 -0
- package/templates/admin-portal/.github/workflows/ci.yml +217 -0
- package/templates/admin-portal/.husky/commit-msg +11 -0
- package/templates/admin-portal/.husky/pre-commit +10 -0
- package/templates/admin-portal/.lintstagedrc.json +13 -0
- package/templates/admin-portal/.prettierrc.cjs +19 -0
- package/templates/admin-portal/.stylelintrc.cjs +35 -0
- package/templates/admin-portal/Dockerfile +35 -0
- package/templates/admin-portal/README.md +196 -0
- package/templates/admin-portal/commitlint.config.cjs +41 -0
- package/templates/admin-portal/docker-compose.yml +35 -0
- package/templates/admin-portal/index.html +13 -0
- package/templates/admin-portal/nginx.conf +45 -0
- package/templates/admin-portal/package-lock.json +10730 -0
- package/templates/admin-portal/package.json +62 -0
- package/templates/admin-portal/playwright-report/index.html +85 -0
- package/templates/admin-portal/playwright.config.ts +73 -0
- package/templates/admin-portal/pnpm-lock.yaml +1620 -0
- package/templates/admin-portal/postcss.config.cjs +56 -0
- package/templates/admin-portal/public/vite.svg +1 -0
- package/templates/admin-portal/src/App.vue +15 -0
- package/templates/admin-portal/src/assets/styles/main.css +36 -0
- package/templates/admin-portal/src/assets/vue.svg +1 -0
- package/templates/admin-portal/src/components/HelloWorld.vue +41 -0
- package/templates/admin-portal/src/layout/index.vue +23 -0
- package/templates/admin-portal/src/main.ts +12 -0
- package/templates/admin-portal/src/mock/auth.ts +26 -0
- package/templates/admin-portal/src/permission.ts +15 -0
- package/templates/admin-portal/src/router/index.ts +21 -0
- package/templates/admin-portal/src/style.css +79 -0
- package/templates/admin-portal/src/views/About.vue +15 -0
- package/templates/admin-portal/src/views/Home.vue +15 -0
- package/templates/admin-portal/src/views/login/index.vue +34 -0
- package/templates/admin-portal/test-results/.last-run.json +23 -0
- package/templates/admin-portal/test-results/results.json +882 -0
- package/templates/admin-portal/tests/e2e/example.spec.ts +52 -0
- package/templates/admin-portal/tests/unit/example.test.ts +49 -0
- package/templates/admin-portal/tsconfig.app.json +18 -0
- package/templates/admin-portal/tsconfig.json +7 -0
- package/templates/admin-portal/tsconfig.node.json +22 -0
- package/templates/admin-portal/vite.config.ts +21 -0
- package/templates/admin-portal/vitest.config.ts +49 -0
- package/templates/admin-portal/vitest.setup.ts +60 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 生产环境变量
|
|
2
|
+
# 生产环境(npm run build)会使用这些变量
|
|
3
|
+
|
|
4
|
+
# 环境模式
|
|
5
|
+
NODE_ENV=production
|
|
6
|
+
|
|
7
|
+
# API 基础 URL(生产环境)
|
|
8
|
+
VITE_API_BASE_URL=https://api.example.com/api
|
|
9
|
+
|
|
10
|
+
# 是否启用 Mock 数据(生产环境)
|
|
11
|
+
VITE_ENABLE_MOCK=false
|
|
12
|
+
|
|
13
|
+
# 是否启用性能监控(生产环境)
|
|
14
|
+
VITE_ENABLE_PERFORMANCE=true
|
|
15
|
+
|
|
16
|
+
# 是否启用错误监控(生产环境)
|
|
17
|
+
VITE_ENABLE_ERROR_TRACKING=true
|
|
18
|
+
|
|
19
|
+
# 是否启用用户行为分析(生产环境)
|
|
20
|
+
VITE_ENABLE_USER_ANALYTICS=true
|
|
21
|
+
|
|
22
|
+
# 是否启用热更新(生产环境)
|
|
23
|
+
VITE_HMR=false
|
|
24
|
+
|
|
25
|
+
# 是否启用 Source Map(生产环境)
|
|
26
|
+
VITE_SOURCE_MAP=false
|
|
27
|
+
|
|
28
|
+
# 是否启用 ESLint(生产环境)
|
|
29
|
+
VITE_ENABLE_ESLINT=false
|
|
30
|
+
|
|
31
|
+
# 是否启用 Prettier(生产环境)
|
|
32
|
+
VITE_ENABLE_PRETTIER=false
|
|
33
|
+
|
|
34
|
+
# 是否启用 Stylelint(生产环境)
|
|
35
|
+
VITE_ENABLE_STYLELINT=false
|
|
36
|
+
|
|
37
|
+
# 是否启用 Vitest(生产环境)
|
|
38
|
+
VITE_ENABLE_VITEST=false
|
|
39
|
+
|
|
40
|
+
# 是否启用 Playwright(生产环境)
|
|
41
|
+
VITE_ENABLE_PLAYWRIGHT=false
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
// 告诉 ESLint 这是项目的根配置文件,停止向上级目录继续查找
|
|
3
|
+
root: true,
|
|
4
|
+
// 声明代码运行环境:浏览器、ES2021 语法、Node.js 全局变量均可用
|
|
5
|
+
|
|
6
|
+
env: {
|
|
7
|
+
browser: true, // 告诉 ESLint 识别浏览器全局变量(window、document 等),避免误报未定义
|
|
8
|
+
es2021: true, // 允许使用 ES2021 新语法及全局变量(如 Promise.any、WeakRef),防止解析错误
|
|
9
|
+
node: true, // 识别 Node.js 全局变量(process、__dirname 等),确保在 Node 环境不报错
|
|
10
|
+
},
|
|
11
|
+
// 继承官方推荐规则集、Vue3+TypeScript 推荐规则集、Prettier 格式化冲突覆盖
|
|
12
|
+
|
|
13
|
+
extends: [
|
|
14
|
+
'eslint:recommended',
|
|
15
|
+
'plugin:@typescript-eslint/recommended',
|
|
16
|
+
'plugin:vue/vue3-recommended',
|
|
17
|
+
'prettier',
|
|
18
|
+
],
|
|
19
|
+
// 解析器选项:使用最新 ECMAScript 版本、@typescript-eslint/parser 解析 TS、按 ESModule 解析
|
|
20
|
+
parserOptions: {
|
|
21
|
+
ecmaVersion: 'latest',
|
|
22
|
+
parser: '@typescript-eslint/parser',
|
|
23
|
+
sourceType: 'module',
|
|
24
|
+
},
|
|
25
|
+
// 显式启用 vue 与 @typescript-eslint 插件,让对应规则生效
|
|
26
|
+
plugins: ['vue', '@typescript-eslint'],
|
|
27
|
+
// 自定义规则:关闭 Vue 多词组件名强制;未使用变量报错;any 类型仅警告;生产环境 console/debugger 警告,开发环境关闭
|
|
28
|
+
rules: {
|
|
29
|
+
'vue/multi-word-component-names': 'off',
|
|
30
|
+
'vue/no-unused-vars': 'error',
|
|
31
|
+
'@typescript-eslint/no-unused-vars': 'error',
|
|
32
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
33
|
+
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
34
|
+
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
35
|
+
},
|
|
36
|
+
// 针对 *.vue 文件单独覆盖:强制 script 标签内部使用 2 空格缩进,且相对 <script> 标签再缩进 1 级
|
|
37
|
+
overrides: [
|
|
38
|
+
{
|
|
39
|
+
files: ['*.vue'],
|
|
40
|
+
rules: {
|
|
41
|
+
'vue/script-indent': ['error', 2, { baseIndent: 1 }],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# CI/CD 配置文件
|
|
2
|
+
# 用于自动化构建、测试和部署
|
|
3
|
+
|
|
4
|
+
name: CI/CD
|
|
5
|
+
|
|
6
|
+
# 触发条件
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches:
|
|
10
|
+
- main
|
|
11
|
+
- develop
|
|
12
|
+
pull_request:
|
|
13
|
+
branches:
|
|
14
|
+
- main
|
|
15
|
+
- develop
|
|
16
|
+
|
|
17
|
+
# 环境变量
|
|
18
|
+
env:
|
|
19
|
+
NODE_VERSION: '18'
|
|
20
|
+
|
|
21
|
+
# 任务
|
|
22
|
+
jobs:
|
|
23
|
+
# 代码检查
|
|
24
|
+
lint:
|
|
25
|
+
name: 代码检查
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
# 检出代码
|
|
30
|
+
- name: 检出代码
|
|
31
|
+
uses: actions/checkout@v4
|
|
32
|
+
|
|
33
|
+
# 设置 Node.js 环境
|
|
34
|
+
- name: 设置 Node.js 环境
|
|
35
|
+
uses: actions/setup-node@v4
|
|
36
|
+
with:
|
|
37
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
38
|
+
cache: 'npm'
|
|
39
|
+
|
|
40
|
+
# 安装依赖
|
|
41
|
+
- name: 安装依赖
|
|
42
|
+
run: npm ci
|
|
43
|
+
|
|
44
|
+
# 运行 ESLint
|
|
45
|
+
- name: 运行 ESLint
|
|
46
|
+
run: npm run lint:eslint
|
|
47
|
+
|
|
48
|
+
# 运行 Prettier
|
|
49
|
+
- name: 运行 Prettier
|
|
50
|
+
run: npm run lint:prettier
|
|
51
|
+
|
|
52
|
+
# 运行 Stylelint
|
|
53
|
+
- name: 运行 Stylelint
|
|
54
|
+
run: npm run lint:stylelint
|
|
55
|
+
|
|
56
|
+
# 单元测试
|
|
57
|
+
test:
|
|
58
|
+
name: 单元测试
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
|
|
61
|
+
steps:
|
|
62
|
+
# 检出代码
|
|
63
|
+
- name: 检出代码
|
|
64
|
+
uses: actions/checkout@v4
|
|
65
|
+
|
|
66
|
+
# 设置 Node.js 环境
|
|
67
|
+
- name: 设置 Node.js 环境
|
|
68
|
+
uses: actions/setup-node@v4
|
|
69
|
+
with:
|
|
70
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
71
|
+
cache: 'npm'
|
|
72
|
+
|
|
73
|
+
# 安装依赖
|
|
74
|
+
- name: 安装依赖
|
|
75
|
+
run: npm ci
|
|
76
|
+
|
|
77
|
+
# 运行单元测试
|
|
78
|
+
- name: 运行单元测试
|
|
79
|
+
run: npm run test:unit
|
|
80
|
+
|
|
81
|
+
# 上传测试覆盖率报告
|
|
82
|
+
- name: 上传测试覆盖率报告
|
|
83
|
+
uses: codecov/codecov-action@v3
|
|
84
|
+
with:
|
|
85
|
+
files: ./coverage/coverage-final.json
|
|
86
|
+
flags: unittests
|
|
87
|
+
name: codecov-umbrella
|
|
88
|
+
|
|
89
|
+
# E2E 测试
|
|
90
|
+
e2e:
|
|
91
|
+
name: E2E 测试
|
|
92
|
+
runs-on: ubuntu-latest
|
|
93
|
+
|
|
94
|
+
steps:
|
|
95
|
+
# 检出代码
|
|
96
|
+
- name: 检出代码
|
|
97
|
+
uses: actions/checkout@v4
|
|
98
|
+
|
|
99
|
+
# 设置 Node.js 环境
|
|
100
|
+
- name: 设置 Node.js 环境
|
|
101
|
+
uses: actions/setup-node@v4
|
|
102
|
+
with:
|
|
103
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
104
|
+
cache: 'npm'
|
|
105
|
+
|
|
106
|
+
# 安装依赖
|
|
107
|
+
- name: 安装依赖
|
|
108
|
+
run: npm ci
|
|
109
|
+
|
|
110
|
+
# 安装 Playwright 浏览器
|
|
111
|
+
- name: 安装 Playwright 浏览器
|
|
112
|
+
run: npx playwright install --with-deps
|
|
113
|
+
|
|
114
|
+
# 运行 E2E 测试
|
|
115
|
+
- name: 运行 E2E 测试
|
|
116
|
+
run: npm run test:e2e
|
|
117
|
+
|
|
118
|
+
# 上传测试报告
|
|
119
|
+
- name: 上传测试报告
|
|
120
|
+
if: always()
|
|
121
|
+
uses: actions/upload-artifact@v3
|
|
122
|
+
with:
|
|
123
|
+
name: playwright-report
|
|
124
|
+
path: playwright-report/
|
|
125
|
+
retention-days: 30
|
|
126
|
+
|
|
127
|
+
# 构建
|
|
128
|
+
build:
|
|
129
|
+
name: 构建
|
|
130
|
+
runs-on: ubuntu-latest
|
|
131
|
+
needs: [lint, test]
|
|
132
|
+
|
|
133
|
+
steps:
|
|
134
|
+
# 检出代码
|
|
135
|
+
- name: 检出代码
|
|
136
|
+
uses: actions/checkout@v4
|
|
137
|
+
|
|
138
|
+
# 设置 Node.js 环境
|
|
139
|
+
- name: 设置 Node.js 环境
|
|
140
|
+
uses: actions/setup-node@v4
|
|
141
|
+
with:
|
|
142
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
143
|
+
cache: 'npm'
|
|
144
|
+
|
|
145
|
+
# 安装依赖
|
|
146
|
+
- name: 安装依赖
|
|
147
|
+
run: npm ci
|
|
148
|
+
|
|
149
|
+
# 构建项目
|
|
150
|
+
- name: 构建项目
|
|
151
|
+
run: npm run build
|
|
152
|
+
|
|
153
|
+
# 上传构建产物
|
|
154
|
+
- name: 上传构建产物
|
|
155
|
+
uses: actions/upload-artifact@v3
|
|
156
|
+
with:
|
|
157
|
+
name: build
|
|
158
|
+
path: dist/
|
|
159
|
+
retention-days: 7
|
|
160
|
+
|
|
161
|
+
# 部署
|
|
162
|
+
deploy:
|
|
163
|
+
name: 部署
|
|
164
|
+
runs-on: ubuntu-latest
|
|
165
|
+
needs: [build]
|
|
166
|
+
if: github.ref == 'refs/heads/main'
|
|
167
|
+
|
|
168
|
+
steps:
|
|
169
|
+
# 检出代码
|
|
170
|
+
- name: 检出代码
|
|
171
|
+
uses: actions/checkout@v4
|
|
172
|
+
|
|
173
|
+
# 设置 Node.js 环境
|
|
174
|
+
- name: 设置 Node.js 环境
|
|
175
|
+
uses: actions/setup-node@v4
|
|
176
|
+
with:
|
|
177
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
178
|
+
cache: 'npm'
|
|
179
|
+
|
|
180
|
+
# 安装依赖
|
|
181
|
+
- name: 安装依赖
|
|
182
|
+
run: npm ci
|
|
183
|
+
|
|
184
|
+
# 下载构建产物
|
|
185
|
+
- name: 下载构建产物
|
|
186
|
+
uses: actions/download-artifact@v3
|
|
187
|
+
with:
|
|
188
|
+
name: build
|
|
189
|
+
path: dist/
|
|
190
|
+
|
|
191
|
+
# 登录 Docker Hub
|
|
192
|
+
- name: 登录 Docker Hub
|
|
193
|
+
uses: docker/login-action@v3
|
|
194
|
+
with:
|
|
195
|
+
username: ${{ secrets.DOCKER_USERNAME }}
|
|
196
|
+
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
197
|
+
|
|
198
|
+
# 构建 Docker 镜像
|
|
199
|
+
- name: 构建 Docker 镜像
|
|
200
|
+
run: docker build -t ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }} .
|
|
201
|
+
|
|
202
|
+
# 推送 Docker 镜像
|
|
203
|
+
- name: 推送 Docker 镜像
|
|
204
|
+
run: docker push ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}
|
|
205
|
+
|
|
206
|
+
# 部署到服务器
|
|
207
|
+
- name: 部署到服务器
|
|
208
|
+
uses: appleboy/ssh-action@v1.0.0
|
|
209
|
+
with:
|
|
210
|
+
host: ${{ secrets.SERVER_HOST }}
|
|
211
|
+
username: ${{ secrets.SERVER_USERNAME }}
|
|
212
|
+
key: ${{ secrets.SERVER_SSH_KEY }}
|
|
213
|
+
script: |
|
|
214
|
+
docker pull ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}
|
|
215
|
+
docker stop my-app || true
|
|
216
|
+
docker rm my-app || true
|
|
217
|
+
docker run -d --name my-app -p 80:80 ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
# filepath: /Users/xuhuiping/admin-mvp/packages/cli/templates/admin-portal/.husky/commit-msg
|
|
3
|
+
# Git commit-msg hook
|
|
4
|
+
# 在提交信息输入后执行,检查提交信息的格式
|
|
5
|
+
|
|
6
|
+
# 使用 commitlint 检查提交信息格式是否符合规范
|
|
7
|
+
# 1. npx:调用 Node 包执行器,确保使用本地依赖中的 commitlint
|
|
8
|
+
# 2. --no:禁止自动安装缺失的包,避免意外修改依赖
|
|
9
|
+
# 3. commitlint:执行 commitlint 命令,读取项目中的 commitlint 配置
|
|
10
|
+
# 4. --edit "$1":告诉 commitlint 读取 Git 传入的提交信息文件路径($1),并对其进行格式校验
|
|
11
|
+
npx --no -- commitlint --edit "$1"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
# filepath: /Users/xuhuiping/admin-mvp/packages/cli/templates/admin-portal/.husky/pre-commit
|
|
3
|
+
# Git pre-commit hook
|
|
4
|
+
# 在提交前执行,检查代码规范
|
|
5
|
+
|
|
6
|
+
# 使用 lint-staged 对暂存区的文件进行检查和格式化
|
|
7
|
+
# 1. npx:调用 Node 包执行器,确保使用本地依赖中的 lint-staged
|
|
8
|
+
# 2. --no:禁止自动安装缺失的包,避免意外修改依赖
|
|
9
|
+
# 3. lint-staged:执行 lint-staged 命令,读取项目中的 .lintstagedrc.json 配置
|
|
10
|
+
npx --no lint-staged
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
// 是否使用分号
|
|
3
|
+
semi: true,
|
|
4
|
+
|
|
5
|
+
// 缩进空格数
|
|
6
|
+
tabWidth: 2,
|
|
7
|
+
|
|
8
|
+
// 是否使用单引号
|
|
9
|
+
singleQuote: true,
|
|
10
|
+
|
|
11
|
+
// 每行最大字符数
|
|
12
|
+
printWidth: 100,
|
|
13
|
+
|
|
14
|
+
// 尾随逗号(ES5 兼容)
|
|
15
|
+
trailingComma: 'es5',
|
|
16
|
+
|
|
17
|
+
// 箭头函数参数括号(单参数时省略)
|
|
18
|
+
arrowParens: 'avoid'
|
|
19
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
extends: [
|
|
3
|
+
'stylelint-config-standard',
|
|
4
|
+
'stylelint-config-recommended-vue',
|
|
5
|
+
'stylelint-config-prettier',
|
|
6
|
+
],
|
|
7
|
+
rules: {
|
|
8
|
+
'selector-class-pattern': null,
|
|
9
|
+
'no-descending-specificity': null,
|
|
10
|
+
'comment-empty-line-before': null,
|
|
11
|
+
'number-leading-zero': null,
|
|
12
|
+
'rule-empty-line-before': null,
|
|
13
|
+
'value-keyword-case': null,
|
|
14
|
+
'color-function-notation': null,
|
|
15
|
+
'alpha-value-notation': null,
|
|
16
|
+
'selector-id-pattern': null,
|
|
17
|
+
'selector-type-no-unknown': null,
|
|
18
|
+
'selector-pseudo-class-no-unknown': [
|
|
19
|
+
true,
|
|
20
|
+
{
|
|
21
|
+
ignorePseudoClasses: ['deep'],
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
overrides: [
|
|
26
|
+
{
|
|
27
|
+
files: ['**/*.vue'],
|
|
28
|
+
customSyntax: 'postcss-html',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
files: ['**/*.less'],
|
|
32
|
+
customSyntax: 'postcss-less',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Dockerfile
|
|
2
|
+
# 用于构建 Docker 镜像
|
|
3
|
+
|
|
4
|
+
# 阶段1:构建阶段
|
|
5
|
+
FROM node:18-alpine AS builder
|
|
6
|
+
|
|
7
|
+
# 设置工作目录
|
|
8
|
+
WORKDIR /app
|
|
9
|
+
|
|
10
|
+
# 复制 package.json 和 package-lock.json
|
|
11
|
+
COPY package*.json ./
|
|
12
|
+
|
|
13
|
+
# 安装依赖
|
|
14
|
+
RUN npm ci
|
|
15
|
+
|
|
16
|
+
# 复制源代码
|
|
17
|
+
COPY . .
|
|
18
|
+
|
|
19
|
+
# 构建项目
|
|
20
|
+
RUN npm run build
|
|
21
|
+
|
|
22
|
+
# 阶段2:生产阶段
|
|
23
|
+
FROM nginx:alpine
|
|
24
|
+
|
|
25
|
+
# 复制 nginx 配置文件
|
|
26
|
+
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
27
|
+
|
|
28
|
+
# 从构建阶段复制构建产物
|
|
29
|
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
|
30
|
+
|
|
31
|
+
# 暴露端口
|
|
32
|
+
EXPOSE 80
|
|
33
|
+
|
|
34
|
+
# 启动 nginx
|
|
35
|
+
CMD ["nginx", "-g", "daemon off;"]
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Admin Portal
|
|
2
|
+
|
|
3
|
+
企业级 Vue 3 + TypeScript + Vite 项目脚手架,包含完整的工程化配置。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 🚀 **Vue 3** - 使用 Composition API
|
|
8
|
+
- 💎 **TypeScript** - 类型安全
|
|
9
|
+
- ⚡ **Vite** - 快速的构建工具
|
|
10
|
+
- 🎨 **代码规范** - ESLint + Prettier + Stylelint
|
|
11
|
+
- 🔒 **Git Hooks** - Husky + lint-staged + Commitlint
|
|
12
|
+
- 🧪 **自动化测试** - Vitest + Playwright
|
|
13
|
+
- 🐳 **Docker** - 容器化部署
|
|
14
|
+
- 🚀 **CI/CD** - GitHub Actions
|
|
15
|
+
|
|
16
|
+
## 快速开始
|
|
17
|
+
|
|
18
|
+
### 安装依赖
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 启动开发服务器
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm run dev
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 构建生产版本
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm run build
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 预览生产构建
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm run preview
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 代码规范
|
|
43
|
+
|
|
44
|
+
### 运行代码检查
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# ESLint
|
|
48
|
+
npm run lint:eslint
|
|
49
|
+
|
|
50
|
+
# Prettier
|
|
51
|
+
npm run lint:prettier
|
|
52
|
+
|
|
53
|
+
# Stylelint
|
|
54
|
+
npm run lint:stylelint
|
|
55
|
+
|
|
56
|
+
# 所有检查
|
|
57
|
+
npm run lint
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 自动修复
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# ESLint 自动修复
|
|
64
|
+
npm run lint:eslint -- --fix
|
|
65
|
+
|
|
66
|
+
# Prettier 自动修复
|
|
67
|
+
npm run lint:prettier -- --write
|
|
68
|
+
|
|
69
|
+
# Stylelint 自动修复
|
|
70
|
+
npm run lint:stylelint -- --fix
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 测试
|
|
74
|
+
|
|
75
|
+
### 单元测试
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 运行单元测试
|
|
79
|
+
npm run test:unit
|
|
80
|
+
|
|
81
|
+
# 运行单元测试并生成覆盖率报告
|
|
82
|
+
npm run test:unit -- --coverage
|
|
83
|
+
|
|
84
|
+
# 监听模式
|
|
85
|
+
npm run test:unit -- --watch
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### E2E 测试
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 运行 E2E 测试
|
|
92
|
+
npm run test:e2e
|
|
93
|
+
|
|
94
|
+
# 运行 E2E 测试并生成报告
|
|
95
|
+
npm run test:e2e -- --reporter=html
|
|
96
|
+
|
|
97
|
+
# 调试模式
|
|
98
|
+
npm run test:e2e -- --debug
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Docker
|
|
102
|
+
|
|
103
|
+
### 构建 Docker 镜像
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
docker build -t my-app .
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 运行 Docker 容器
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
docker run -p 80:80 my-app
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 使用 Docker Compose
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# 启动所有服务
|
|
119
|
+
docker-compose up -d
|
|
120
|
+
|
|
121
|
+
# 停止所有服务
|
|
122
|
+
docker-compose down
|
|
123
|
+
|
|
124
|
+
# 查看服务状态
|
|
125
|
+
docker-compose ps
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## CI/CD
|
|
129
|
+
|
|
130
|
+
### 配置 GitHub Secrets
|
|
131
|
+
|
|
132
|
+
在 GitHub 仓库中配置以下 Secrets:
|
|
133
|
+
|
|
134
|
+
| Secret 名称 | 说明 |
|
|
135
|
+
|------------|------|
|
|
136
|
+
| `DOCKER_USERNAME` | Docker Hub 用户名 |
|
|
137
|
+
| `DOCKER_PASSWORD` | Docker Hub 密码 |
|
|
138
|
+
| `SERVER_HOST` | 服务器地址 |
|
|
139
|
+
| `SERVER_USERNAME` | 服务器用户名 |
|
|
140
|
+
| `SERVER_SSH_KEY` | 服务器 SSH 密钥 |
|
|
141
|
+
|
|
142
|
+
### 触发 CI/CD
|
|
143
|
+
|
|
144
|
+
推送到 `main` 或 `develop` 分支会自动触发 CI/CD 流程。
|
|
145
|
+
|
|
146
|
+
## 项目结构
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
.
|
|
150
|
+
├── .github/workflows/ # CI/CD 配置
|
|
151
|
+
├── .husky/ # Git Hooks
|
|
152
|
+
├── public/ # 公共资源
|
|
153
|
+
├── src/
|
|
154
|
+
│ ├── assets/ # 静态资源
|
|
155
|
+
│ │ └── styles/ # 样式文件
|
|
156
|
+
│ ├── router/ # 路由配置
|
|
157
|
+
│ ├── views/ # 页面组件
|
|
158
|
+
│ ├── App.vue # 根组件
|
|
159
|
+
│ └── main.ts # 入口文件
|
|
160
|
+
├── tests/
|
|
161
|
+
│ ├── e2e/ # E2E 测试
|
|
162
|
+
│ └── unit/ # 单元测试
|
|
163
|
+
├── .env # 环境变量
|
|
164
|
+
├── .env.development # 开发环境变量
|
|
165
|
+
├── .env.production # 生产环境变量
|
|
166
|
+
├── Dockerfile # Docker 配置
|
|
167
|
+
├── docker-compose.yml # Docker Compose 配置
|
|
168
|
+
├── nginx.conf # Nginx 配置
|
|
169
|
+
├── package.json # 项目配置
|
|
170
|
+
├── tsconfig.json # TypeScript 配置
|
|
171
|
+
└── vite.config.ts # Vite 配置
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## 环境变量
|
|
175
|
+
|
|
176
|
+
| 变量名 | 说明 | 默认值 |
|
|
177
|
+
|--------|------|--------|
|
|
178
|
+
| `VITE_APP_NAME` | 应用名称 | `Admin Portal` |
|
|
179
|
+
| `VITE_API_BASE_URL` | API 基础 URL | `/api` |
|
|
180
|
+
| `VITE_ENABLE_MOCK` | 是否启用 Mock | `false` |
|
|
181
|
+
|
|
182
|
+
## 贡献指南
|
|
183
|
+
|
|
184
|
+
1. Fork 本仓库
|
|
185
|
+
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
|
|
186
|
+
3. 提交更改 (`git commit -m 'feat: add some AmazingFeature'`)
|
|
187
|
+
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
|
188
|
+
5. 创建 Pull Request
|
|
189
|
+
|
|
190
|
+
## 许可证
|
|
191
|
+
|
|
192
|
+
MIT License
|
|
193
|
+
|
|
194
|
+
## 联系方式
|
|
195
|
+
|
|
196
|
+
如有问题,请创建 Issue。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// filepath: /Users/xuhuiping/admin-mvp/packages/cli/templates/admin-portal/commitlint.config.cjs
|
|
2
|
+
// Commitlint 配置文件
|
|
3
|
+
// 规范 Git 提交信息的格式
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
// 继承标准的提交信息规范(Conventional Commits)
|
|
7
|
+
extends: ['@commitlint/config-conventional'],
|
|
8
|
+
rules: {
|
|
9
|
+
// 限制提交信息的类型,只允许以下类型
|
|
10
|
+
'type-enum': [
|
|
11
|
+
2, // 错误级别:2 = error(提交失败)
|
|
12
|
+
'always', // 必须匹配,不允许其他类型
|
|
13
|
+
[
|
|
14
|
+
'feat', // 新功能(feature)
|
|
15
|
+
'fix', // 修复bug(bug fix)
|
|
16
|
+
'docs', // 文档变更(documentation)
|
|
17
|
+
'style', // 代码格式调整(不影响代码运行的变动)
|
|
18
|
+
'refactor', // 重构(既不是新增功能,也不是修复bug的代码变动)
|
|
19
|
+
'perf', // 性能优化(performance)
|
|
20
|
+
'test', // 测试相关(tests)
|
|
21
|
+
'chore', // 构建过程或辅助工具变动(如更新依赖)
|
|
22
|
+
'revert', // 回退之前的提交(revert)
|
|
23
|
+
'build', // 打包(build system)
|
|
24
|
+
],
|
|
25
|
+
],
|
|
26
|
+
// 关闭类型大小写检查(允许大写或小写)
|
|
27
|
+
'type-case': [0],
|
|
28
|
+
// 关闭类型不能为空的检查(允许没有类型)
|
|
29
|
+
'type-empty': [0],
|
|
30
|
+
// 关闭作用域不能为空的检查(允许没有作用域)
|
|
31
|
+
'scope-empty': [0],
|
|
32
|
+
// 关闭作用域大小写检查(允许大写或小写)
|
|
33
|
+
'scope-case': [0],
|
|
34
|
+
// 关闭主题不能以句号结尾的检查(允许句号结尾)
|
|
35
|
+
'subject-full-stop': [0, 'never'],
|
|
36
|
+
// 关闭主题大小写检查(允许大写或小写)
|
|
37
|
+
'subject-case': [0, 'never'],
|
|
38
|
+
// 关闭标题最大长度检查(允许超过72个字符)
|
|
39
|
+
'header-max-length': [0, 'always', 72],
|
|
40
|
+
},
|
|
41
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# docker-compose.yml
|
|
2
|
+
# 用于编排 Docker 容器
|
|
3
|
+
|
|
4
|
+
version: '3.8'
|
|
5
|
+
|
|
6
|
+
services:
|
|
7
|
+
# 前端应用
|
|
8
|
+
app:
|
|
9
|
+
build:
|
|
10
|
+
context: .
|
|
11
|
+
dockerfile: Dockerfile
|
|
12
|
+
ports:
|
|
13
|
+
- "80:80"
|
|
14
|
+
environment:
|
|
15
|
+
- NODE_ENV=production
|
|
16
|
+
restart: always
|
|
17
|
+
networks:
|
|
18
|
+
- app-network
|
|
19
|
+
|
|
20
|
+
# API 服务(可选)
|
|
21
|
+
api:
|
|
22
|
+
image: node:18-alpine
|
|
23
|
+
working_dir: /app
|
|
24
|
+
volumes:
|
|
25
|
+
- ./api:/app
|
|
26
|
+
ports:
|
|
27
|
+
- "3000:3000"
|
|
28
|
+
command: npm start
|
|
29
|
+
restart: always
|
|
30
|
+
networks:
|
|
31
|
+
- app-network
|
|
32
|
+
|
|
33
|
+
networks:
|
|
34
|
+
app-network:
|
|
35
|
+
driver: bridge
|