-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathREADME.html
319 lines (293 loc) · 10.1 KB
/
README.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>写在前面</title>
<style>
/* From extension vscode.github */
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
.vscode-dark img[src$=\#gh-light-mode-only],
.vscode-light img[src$=\#gh-dark-mode-only] {
display: none;
}
</style>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex/dist/katex.min.css">
<link href="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/highlight.css">
<style>
.task-list-item {
list-style-type: none;
}
.task-list-item-checkbox {
margin-left: -20px;
vertical-align: middle;
pointer-events: none;
}
</style>
<style>
:root {
--color-note: #0969da;
--color-tip: #1a7f37;
--color-warning: #9a6700;
--color-severe: #bc4c00;
--color-caution: #d1242f;
--color-important: #8250df;
}
</style>
<style>
@media (prefers-color-scheme: dark) {
:root {
--color-note: #2f81f7;
--color-tip: #3fb950;
--color-warning: #d29922;
--color-severe: #db6d28;
--color-caution: #f85149;
--color-important: #a371f7;
}
}
</style>
<style>
.markdown-alert {
padding: 0.5rem 1rem;
margin-bottom: 16px;
color: inherit;
border-left: .25em solid #888;
}
.markdown-alert>:first-child {
margin-top: 0
}
.markdown-alert>:last-child {
margin-bottom: 0
}
.markdown-alert .markdown-alert-title {
display: flex;
font-weight: 500;
align-items: center;
line-height: 1
}
.markdown-alert .markdown-alert-title .octicon {
margin-right: 0.5rem;
display: inline-block;
overflow: visible !important;
vertical-align: text-bottom;
fill: currentColor;
}
.markdown-alert.markdown-alert-note {
border-left-color: var(--color-note);
}
.markdown-alert.markdown-alert-note .markdown-alert-title {
color: var(--color-note);
}
.markdown-alert.markdown-alert-important {
border-left-color: var(--color-important);
}
.markdown-alert.markdown-alert-important .markdown-alert-title {
color: var(--color-important);
}
.markdown-alert.markdown-alert-warning {
border-left-color: var(--color-warning);
}
.markdown-alert.markdown-alert-warning .markdown-alert-title {
color: var(--color-warning);
}
.markdown-alert.markdown-alert-tip {
border-left-color: var(--color-tip);
}
.markdown-alert.markdown-alert-tip .markdown-alert-title {
color: var(--color-tip);
}
.markdown-alert.markdown-alert-caution {
border-left-color: var(--color-caution);
}
.markdown-alert.markdown-alert-caution .markdown-alert-title {
color: var(--color-caution);
}
</style>
</head>
<body class="vscode-body vscode-light">
<h1 id="写在前面">写在前面</h1>
<ol>
<li>该项目有两个版本一个是prisma版本,一个是typeorm版本,你可以切换分支,master分支是typeorm版本,这边推荐使用prisma版本(我会优先修复prisma版本)。</li>
<li>该项目是cms的后端项目,具体前端代码在<a href="https://github.com/LeoKun1231/VUE3-CMS-TS-PINIA">VUE3-CMS-TS-PINIA</a>,<a href="https://cms.hqk10.xyz">在这里可以访问体验网站</a>。具体后端接口可以看<a href="https://apifox.com/apidoc/shared-ede0e4ad-7f38-42fd-a749-3c8df4d8b7ba">apifox</a>里的接口。</li>
<li>这边推荐使用docker-compose进行环境搭建,如果你是window,你需要使用WSL,如果不使用docker-compose,需要自行安装mysql、redis。</li>
<li>jwt所需要使用的公钥和私钥,需要自行生成,并且在.env.*文件中配置,如果不想则直接使用默认的即可。</li>
<li>具体操作步骤,请看后面的安装步骤。</li>
<li>如果有什么问题,可以在issue中提出,我会尽快回复。</li>
</ol>
<h2 id="技术栈">技术栈</h2>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th>技术栈</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>后端框架</td>
<td>nest</td>
<td>完成</td>
</tr>
<tr>
<td>2</td>
<td>数据库</td>
<td>mysql</td>
<td>完成</td>
</tr>
<tr>
<td>3</td>
<td>orm</td>
<td>prisma</td>
<td>完成</td>
</tr>
<tr>
<td>4</td>
<td>redis</td>
<td>ioredis</td>
<td>完成</td>
</tr>
<tr>
<td>5</td>
<td>docker</td>
<td>docker</td>
<td>完成</td>
</tr>
<tr>
<td>6</td>
<td>日志</td>
<td>winston</td>
<td>完成</td>
</tr>
<tr>
<td>7</td>
<td>编译器</td>
<td>swc</td>
<td>完成</td>
</tr>
<tr>
<td>8</td>
<td>鉴权</td>
<td>jwt</td>
<td>完成</td>
</tr>
<tr>
<td>9</td>
<td>rbac</td>
<td>rbac</td>
<td>完成</td>
</tr>
<tr>
<td>10</td>
<td>二维码登录</td>
<td>qrcode</td>
<td>完成</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
</table>
<h2 id="生成jwt的公钥和私钥">生成jwt的公钥和私钥</h2>
<h3 id="1通过docker生成脚本">1.通过docker生成脚本</h3>
<pre><code class="language-bash">./scripts/generate-jwt-keys
</code></pre>
<p>将输出类似于此的内容。 您只需要将其添加到.env文件中。</p>
<pre><code>为了设置JWT密钥,请将以下值添加到.env文件中:
JWT_PUBLIC_KEY_BASE64="(long base64 content)"
JWT_PRIVATE_KEY_BASE64="(long base64 content)"
</code></pre>
<h3 id="2不通过docker生成脚本">2.不通过docker生成脚本</h3>
<pre><code class="language-bash">$ <span class="hljs-built_in">cd</span> <span class="hljs-built_in">local</span>
$ ssh-keygen -t rsa -b 2048 -m PEM -f jwtRS256.key
<span class="hljs-comment"># Don't add passphrase</span>
$ openssl rsa -<span class="hljs-keyword">in</span> jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub
</code></pre>
<p>你应该这些密钥文件保存在<code>./local</code>目录中,并使用base64编码密钥:</p>
<pre><code class="language-bash"><span class="hljs-built_in">base64</span> -i <span class="hljs-built_in">local</span>/jwtRS256.key
<span class="hljs-built_in">base64</span> -i <span class="hljs-built_in">local</span>/jwtRS256.key.pub
</code></pre>
<p>必须在.env中输入密钥文件的base64:</p>
<pre><code class="language-bash">JWT_PUBLIC_KEY_BASE64=这里填入经过<span class="hljs-built_in">base64</span>编码的公钥
JWT_PRIVATE_KEY_BASE64=这里填入经过<span class="hljs-built_in">base64</span>编码的私钥
</code></pre>
<h2 id="运行项目">运行项目</h2>
<p>你可以使用docker运行项目,也可以不使用docker运行项目。
这边建议使用docker-compose进行运行,如果不使用docker-compose,需要自行安装mysql、redis。
<strong>另外,对于windows用户,如果你要使用docker,你需要使用WSL,进入到linux环境进行创建项目,否则可能遇到一些问题。</strong></p>
<h3 id="对于windows用户">对于windows用户</h3>
<ol>
<li>
<p>你需要下载mysql、redis,并且在.env、.env.development、.env.production中配置好数据库和redis的连接信息。</p>
<pre><code class="language-bash">DATABASE_URL=<span class="hljs-string">"mysql://数据库地址:数据库密码@mysql:3306/demo?timezone=Asia/Shanghai"</span>
REDIS_PORT=6379
REDIS_HOST=redis地址
REDIS_PASSWORD=redis密码
</code></pre>
</li>
<li>
<p>配置数据库、redis之后,你需要在项目根目录下执行下面的命令,运行项目。</p>
<pre><code class="language-bash"><span class="hljs-comment"># 安装依赖</span>
pnpm i
<span class="hljs-comment"># 生成prisma类型</span>
pnpx prisma generate
<span class="hljs-comment">#推送数据到数据库</span>
pnpm seed
<span class="hljs-comment">#运行项目</span>
pnpm start:dev
</code></pre>
</li>
</ol>
<h3 id="对于maclinux用户">对于Mac、Linux用户</h3>
<ol>
<li>
<p>生产环境下的启动命令</p>
<pre><code class="language-bash">$ pnpm i
<span class="hljs-comment"># 生成prisma类型</span>
$ pnpx prisma generate;
<span class="hljs-comment"># 本机没有安装mysql和redis的情况下(仅第一次运行使用,创建mysql,redis以及app容器)</span>
$ sudo docker-compose -f docker-compose.prod.yml up
<span class="hljs-comment"># 推送数据到数据库(仅第一次运行使用)</span>
$ pnpm seed
<span class="hljs-comment"># 本机有安装mysql和redis的情况下(第二次以及往后请执行这个)</span>
$ sudo docker compose -f docker-compose.app.prod.yml up
</code></pre>
</li>
<li>
<p>开发环境下的启动命令</p>
<pre><code class="language-bash"><span class="hljs-comment"># 安装依赖</span>
$ pnpm i
<span class="hljs-comment"># 生成prisma类型</span>
$ pnpx prisma generate;
<span class="hljs-comment"># 打包,生成dist,这一步非常重要哦</span>
$ pnpm build
<span class="hljs-comment"># 本机没有安装mysql和redis的情况下(仅第一次运行使用,创建mysql,redis以及app容器)</span>
$ sudo docker-compose -f docker-compose.dev.yml up
<span class="hljs-comment"># 推送数据到数据库(仅第一次运行使用)</span>
$ pnpm seed
<span class="hljs-comment"># 本机有安装mysql和redis的情况下(第二次以及往后请执行这个)</span>
$ sudo docker compose -f docker-compose.app.dev.yml up
</code></pre>
</li>
<li>
<p>如果不想使用docker-compose,可以使用下面的命令进行运行(这种方法也需要手动安装redis和Mysql)。</p>
<pre><code class="language-bash"><span class="hljs-comment"># build image</span>
$ docker build -t my-app .
$ docker run -p 3000:3000 --volume <span class="hljs-string">'pwd'</span>:/usr/src/app --env-file .env.development my-app
</code></pre>
</li>
</ol>
<h2 id="prisma操作">Prisma操作</h2>
<p>具体见<a href="https://www.prisma.io/docs/concepts/components/prisma-client/crud">prisma官网</a></p>
<script async src="https://cdn.jsdelivr.net/npm/katex-copytex@latest/dist/katex-copytex.min.js"></script>
</body>
</html>