create-web-kit 25.728.1412 → 25.728.1502
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/README.md +1 -1
- package/dist/assets/html/ie.html +256 -0
- package/dist/config/frameworks.js +2 -7
- package/dist/generators/nextjs-csr.js +20 -12
- package/dist/templates/electron-react/eslint.config.js +7 -0
- package/dist/templates/electron-vue/eslint.config.js +7 -0
- package/dist/templates/nextjs-csr/.devcontainer/devcontainer.json +32 -0
- package/dist/templates/nextjs-csr/eslint.config.mjs +16 -0
- package/dist/templates/nextjs-csr/next.config.ts +28 -0
- package/dist/templates/nextjs-csr/prettier.config.json +21 -0
- package/dist/templates/nextjs-csr/src/app/error.tsx +326 -0
- package/dist/templates/nextjs-csr/src/app/layout.tsx +47 -0
- package/dist/templates/nextjs-csr/src/app/not-found.tsx +16 -0
- package/dist/templates/nextjs-csr/src/components/build-info.tsx +20 -0
- package/dist/templates/nextjs-csr/src/components/providers/index.tsx +15 -0
- package/dist/templates/nextjs-csr/src/components/providers/query.tsx +45 -0
- package/dist/templates/nextjs-csr/src/components/providers/theme.tsx +17 -0
- package/dist/templates/nextjs-csr/src/components/show.tsx +12 -0
- package/dist/templates/nextjs-csr/src/lib/request.ts +204 -0
- package/dist/templates/vue3/vite.config.ts +12 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8" />
|
|
6
|
+
<title>请升级您的浏览器</title>
|
|
7
|
+
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
|
|
8
|
+
<meta name="renderer" content="webkit">
|
|
9
|
+
<base target="_blank" />
|
|
10
|
+
<style type="text/css">
|
|
11
|
+
html,
|
|
12
|
+
body,
|
|
13
|
+
div,
|
|
14
|
+
span,
|
|
15
|
+
applet,
|
|
16
|
+
object,
|
|
17
|
+
iframe,
|
|
18
|
+
h1,
|
|
19
|
+
h2,
|
|
20
|
+
h3,
|
|
21
|
+
h4,
|
|
22
|
+
h5,
|
|
23
|
+
h6,
|
|
24
|
+
p,
|
|
25
|
+
blockquote,
|
|
26
|
+
pre,
|
|
27
|
+
a,
|
|
28
|
+
abbr,
|
|
29
|
+
acronym,
|
|
30
|
+
address,
|
|
31
|
+
big,
|
|
32
|
+
cite,
|
|
33
|
+
code,
|
|
34
|
+
del,
|
|
35
|
+
dfn,
|
|
36
|
+
em,
|
|
37
|
+
img,
|
|
38
|
+
ins,
|
|
39
|
+
kbd,
|
|
40
|
+
q,
|
|
41
|
+
s,
|
|
42
|
+
samp,
|
|
43
|
+
small,
|
|
44
|
+
strike,
|
|
45
|
+
strong,
|
|
46
|
+
sub,
|
|
47
|
+
sup,
|
|
48
|
+
tt,
|
|
49
|
+
var,
|
|
50
|
+
b,
|
|
51
|
+
u,
|
|
52
|
+
i,
|
|
53
|
+
center,
|
|
54
|
+
dl,
|
|
55
|
+
dt,
|
|
56
|
+
dd,
|
|
57
|
+
ol,
|
|
58
|
+
ul,
|
|
59
|
+
li,
|
|
60
|
+
fieldset,
|
|
61
|
+
form,
|
|
62
|
+
label,
|
|
63
|
+
legend,
|
|
64
|
+
table,
|
|
65
|
+
caption,
|
|
66
|
+
tbody,
|
|
67
|
+
tfoot,
|
|
68
|
+
thead,
|
|
69
|
+
tr,
|
|
70
|
+
th,
|
|
71
|
+
td,
|
|
72
|
+
article,
|
|
73
|
+
aside,
|
|
74
|
+
canvas,
|
|
75
|
+
details,
|
|
76
|
+
embed,
|
|
77
|
+
figure,
|
|
78
|
+
figcaption,
|
|
79
|
+
footer,
|
|
80
|
+
header,
|
|
81
|
+
hgroup,
|
|
82
|
+
menu,
|
|
83
|
+
nav,
|
|
84
|
+
output,
|
|
85
|
+
ruby,
|
|
86
|
+
section,
|
|
87
|
+
summary,
|
|
88
|
+
time,
|
|
89
|
+
mark,
|
|
90
|
+
audio,
|
|
91
|
+
video {
|
|
92
|
+
border: 0;
|
|
93
|
+
font-size: 100%;
|
|
94
|
+
font: inherit;
|
|
95
|
+
vertical-align: baseline;
|
|
96
|
+
margin: 0;
|
|
97
|
+
padding: 0
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
article,
|
|
101
|
+
aside,
|
|
102
|
+
details,
|
|
103
|
+
figcaption,
|
|
104
|
+
figure,
|
|
105
|
+
footer,
|
|
106
|
+
header,
|
|
107
|
+
hgroup,
|
|
108
|
+
menu,
|
|
109
|
+
nav,
|
|
110
|
+
section {
|
|
111
|
+
display: block
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
body {
|
|
115
|
+
line-height: 1
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
ol,
|
|
119
|
+
ul {
|
|
120
|
+
list-style: none
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
blockquote,
|
|
124
|
+
q {
|
|
125
|
+
quotes: none
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
blockquote:before,
|
|
129
|
+
blockquote:after,
|
|
130
|
+
q:before,
|
|
131
|
+
q:after {
|
|
132
|
+
content: none
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
table {
|
|
136
|
+
border-collapse: collapse;
|
|
137
|
+
border-spacing: 0
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
a {
|
|
141
|
+
text-decoration: none;
|
|
142
|
+
color: #0072c6;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
a:hover {
|
|
146
|
+
text-decoration: none;
|
|
147
|
+
color: #004d8c;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
body {
|
|
151
|
+
width: 960px;
|
|
152
|
+
margin: 0 auto;
|
|
153
|
+
padding: 10px;
|
|
154
|
+
font-size: 14px;
|
|
155
|
+
line-height: 24px;
|
|
156
|
+
color: #454545;
|
|
157
|
+
font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', DengXian, SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif;
|
|
158
|
+
overflow-y: scroll
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
h1 {
|
|
162
|
+
font-size: 40px;
|
|
163
|
+
line-height: 80px;
|
|
164
|
+
font-weight: 100;
|
|
165
|
+
margin-bottom: 10px;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
h2 {
|
|
169
|
+
font-size: 20px;
|
|
170
|
+
line-height: 25px;
|
|
171
|
+
font-weight: 100;
|
|
172
|
+
margin: 10px 0;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
em {
|
|
176
|
+
color: red
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
p {
|
|
180
|
+
margin-bottom: 10px;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
hr {
|
|
184
|
+
margin: 20px 0;
|
|
185
|
+
border: 0;
|
|
186
|
+
border-top: 1px solid #dadada
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
span {
|
|
190
|
+
display: block;
|
|
191
|
+
font-size: 12px;
|
|
192
|
+
line-height: 12px;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.clean {
|
|
196
|
+
clear: both;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.browser {
|
|
200
|
+
padding: 10px 10px;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.browser li {
|
|
204
|
+
width: auto;
|
|
205
|
+
padding: 0 80px;
|
|
206
|
+
margin-top: 30px;
|
|
207
|
+
height: 34px;
|
|
208
|
+
line-height: 22px;
|
|
209
|
+
float: left;
|
|
210
|
+
list-style: none;
|
|
211
|
+
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAADMCAYAAAAWCXEwAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAC7ESURBVHja5Lx5dFRV1rBfgHwYRQQVtB26ZWhtabtfeUGxGxFbUGZF8RMHGkVbRkekVYiKisicVhE0gEwBokgDAhEMMSSQkAECwcxkrlRSqVTqJqnxzs/vj5t7qUyAvr9e37fWV2vtleSm6p6n9t5nn733OVU2RaUaEP5PiqJSbeMXPBTA5/Xhzk9Vnd9vo3HFx21E2LYJX9IRgh6npvyCe9uaqS4K4C3IpXHFx9S99CTuJ8Z0KLVjRlA7ZgTuJ8ZgXxmJL+kIlwAkXBQk6HFq9pWRVA8fSvXwodYgdS892a6EA1UNvouqwXdR99KTeAtyfz2IL+kI1cOHYh9wqwVwKWJqpXbMCOv19gG3Imzb1JF2OgZxfr/NukH4jcNVfyEAE8IU+4BbKet1PfaVke3BtA/i/H6b8aIBt7a4mWmaC0nr55vmqRp8F5V33Mm5LhHtwbQF8SUdsSDCb1I1+K42g1xIWgOYYh9wK+e6RCBs29QxSIWus37aJM51iWjx4so77mwD1d5AHQ1eecedlN9yuyVlva6nrNf14Q7cEmRn4W7u3T2E9ME3UX7L7W1uZg5Weced1s3sA2613ql5LXzQjuRclwjcT4wxTXQeRHC7GLdnHPeensiCVwa3e0PznZk3EbZtwluQa0kofz8NcVNxr++Ce30XnNuv61Bcu7viXt8Fvyu7JYipjfGHxzD+8Bh2j+7fAiZcC+Y0zPDIbCyD6DyV6DyVeDcIQR2C39J4oieNJ3oSOnkVcnZ35Ozu6MVdDHF0N6S4C43OqJYg/0ydzb27hzDx0FjuPT2R+asfa6OVsl7X40s6QoWus/CQk6fWZPHChhxe3lbMCxtyrN9TyxSQSwidvMoC0XK6tRGybPjSRmOuNUKVo4Zxe8YxIu4+Jh4ay/jDY7j39MQWWjnXJYLGFR9Toes8tSaLiavTrIHDxfxfapkCwW8hy9YuhCmhk1fR1FRnaCS1NM4yy8RDYy2tjIkZRXq/HtYsCnqc2sJDTkYsTrU00J6YkEJQR7M/eEGY0MmrcOenqjZA2JmyzTJLuJiOe65LBHUvPUmGR2bE4lQmrk7jqTVZHcrE1WkMWpRIdJ4KnpUXBCHLRl3e16EWIOEaMU00/vAY9na/gsYVH/NdgYe+8w9bMBeSQYsSWXjICcFvL2ga+dhlFwcJ10rjio/ZklprgbSWiavTWvzdd/5hXt5W/OtATC201sq9u4eQ+PVijmSW0nf+YQYtSmTQosR2gUYsTmXQokT6zj9saeRCpmkJ0hxD2gOZeGgsI+Lu45+ps7FXlFmDmDDtSd/5h+k7/zCpZQpa9cwOQciyIR+77LyzFhXlMyZmFOP2jLP8orVWRsTdR2ppHFtSa+k6ZZM1WHvSdcomwyxySceayO4OWTY88TdirygzUkWf18eL2//RQiutYcwYE/Q4tagDOUQ8uo6uUzbRZ3qMJV2nbCLi0XU8tSbrolNXzu6OfOyylgEN4NOkaO5acw/j9ozr0ET37h5imehIZimPL91rAfSZHsOQBfuISS7E7vaTETeX0MmrOoQInbwK+dhlNKWsahni0zPSuGvNPW1M1BrI1NrOwt0WkCn2ijJSS+MYt2ccuQk3oxd36RCi8URPY+HLT1VbgGiSzPsx71laCddMe2Yygf6ZOtuScXvG0XfJn/n8YL+LQnjibyQ34WZ8Xl/bfKSoKL+FVi4EYwKZcu/uIQzaPoExMaPQcrq1ADFX33AI1+6u1OV9HVI6ShU/TYqm75I/dwjTHtDEQ2MZt2ccg7ZPaGGScIDWEBlxc42UoSMQ00StYdoDCgcbtH0Cbx+8p40ZTIBwiFM7RmB3+y+exZvT2YRpDdR6ZoVrw1xRWwN44m/Euf06A6Ki7NLrmnDNmH7TEdSg7RP4/GA/yLK1GdwEKNzSk1M7RlDlqPl1JefOlG2MXTGmXaAxMaMsB/XE34h4tH+7ANlrB7T2iV8OAlDlqOH9mPcsIBPKlF3R16Ad7GwlxoVberYAKCrKv1ghfmkg5sPldLIzZVsLqLErxpC9doAlp3aMICNurlGyVpRdSAu/HqS1Q58rd1JUlI87P1UtKsrHXlGG3e1HCOoov+x2wiX3RxT+o49L1IgutXxVUCfDIxNfLraQDI+M3e3/NdCXbhohqBNfLrIsVzZqmoT6dmXG0SBLTrmJLxd/CVRLECXcDGFaSC1TmHE0yKg4B0P2uxiy38WoOAePHaptAfHYoVqG7HcxcGc5o+IcfFfgsbQUPoYoSa213BbE78oGucTSwpJTbobFFjNgbQHdvi6g8/Z6Om+vZ8h+VxsQE7T/97UMWFvA+Og0UvIryfDIZBQ4CeXvt8a5IAhAY/RImlJWUaHrPHaolhuXFXHN+8e58qNcbomq5P6t3xG973WePLzPgnnsUG0LiP7f1zJwZzk3LisyctfSOFxOJ4lfLzYToQubxu/KpmpWBFWzInguOokrP8ql7/zDRMxLpFfUabasHwlZNnITbmbgznI6b6+3Bu7/fa2lrW5fF9Ar6jQD1hYwLLaYx5fupdi+EiGok748koa4qa010xKkKWUV2UM7kd6vB7tH9yfpnUFkLzQiZOGWnmgHO9N4oie9ok5bA4YPbkqvqNNc8/5xIuYl8tSaLOLLRXambENXF+PxNJD0ziAanVHhYaEliH1lJD/1iqD0qSsIzu2M/N550TZ3QjvYmS3rR1qDtwdhgpgwnabGMj46zRjQsxJdXYw7P1X1pY0GuaRjkMKxPah5qxuV8y6nct7l1LzVDfdyo6miHexM+ou9mblwKfdv/Y77t37HNe8fbwMQDhIxL5FOU2PZklqLJjUYdU7wWxBuN+ricBAF0KQG6pcNovZpw0fCQao/MEBcu7tSOLYHjnu7EZzbmeDczqyfNokrP8ptMXi4XDnzAJ0n72TIgn1oUoMB4VlpgIjj24I0payi9KkrqHj+Ssth2wM5c38f8p68D2nbHKRtc3h86d42A/eZHsOVMw9Y0nXKJmxDvyS1NA70z8Gz0qh5hNvbzpr6ZYMofzyiBUwLkOVdjfR/eVcao0dSl/d1aHx0GhHzEi0TXDnzAJ2mxtJpaixdp2yypM/0GLrcs5D3Y94ztNDsK7qjuxmzDBBz2rYGqZoVQc1b3dr4yfppk+g8eWeLd91aAxGPrqPbyKV0G7mUiEfXMWdz+nmQ0Jsgn1AbT/SkMXrkeZC6vK9DpU9d0S5I5bzLqf6gq6UV7WBn5q9+zDJBuEQ8us4SE6LLPQvpcs9CjmSW4ndlo1XPNBxWLiE34WbSX+wNapEBEsrfT/njERSO7WGBmDA1b3Wj9KkrSO/Xg1WjBjJl/CT+8sQ8a0BT/eGDhwN0uWchXe94ia07YkE+oSLc3gxyQt2yfiSrRg0E+YRqgRSO7UHh2B4UT7ragqmcdznFk67mp14ROO7txpTxk7AN/bLFgN1GLsU29EvrejiACdG59xQjKgu3GzVP9UwIvcmCVwYb102NmBHVBDFNVDUrgjP39yF98E0E5xox5Dcj5lsDhwOYQObg4dK59xR2RV8D4njEo/0NIEd3dkVfgy9t9HkfMTWSO6pXG63kjupF8aSrqXj+SoJzO1M573KmjJ/Eb0bM5y9PzGPBK4Mp3GKUEFvWj+Q3I+a3AOjcewp/eWKesUQ0T1mz2att7oSU9+F5EE2SqXvpSbKHdrIGNmHCoapmRVgh33LezZ3QNncyloGDnVnwyuA2IFvWj0Q+dplREzu6Wy0r9/KubVvg9pWRpPfrwZn7+1haMSHCxdSM/J4RWWufjiC9Xw/m9PgtN9w0uo1JbrhpNI0njAXTrAIbT/TEvb4LjdEj2641vqQjpPfrQfrgm1qYKHxKlz51BbmjerFj4G2WtAYwtWDKglcGG2ZoXrldu43AWDUrAmnbnLaRVZMayHvyPn7qZThoa38pfeoKap+OIDi3M6tGDeSGm0a3GTT82g03jeaGm0bj3H4d8rHLrN0I93LDpDsG3kb68si2a425hfZTrwjSB9/UBiZcM+YM6ghoyvhJpL/Ym+yFhknc67tYQVF+z3gjc3r8Fuf32zpOFTMeHXpRGDNfMYF2j+7PqlEDWTVqIOkv9rZ8SNvcCff6LlTOu9yK1Okv9mZOj9+S8ehQNKmBDhs17vxU9adeES1gwoHKH49oFyhcwhfKynmXWzOu4vkryR7aieyhnQjl7+84QzNNJGzbxN7uV1gw7WmntYZaLw2mmNdrn44ge2gnztzfx9od7zBnDa9t0pdHtgsTDhRustaaCndwEyLj0aG481PVS9r3FSUJj6eBrConMZHvnodpntrh2gkHCgcLl/TBN7G3+xXGLMlIo0LXjU7ixeoaUZIQ3C7OlTtJya8kJvJddgy8DctvWgGFaylcHPd2Y2/3K5jT47esGjWQrTtiyapy4nI6jUrvUmpfUytFRfmkZ6SxdUcs66dNYsfA2ywNtQBrJeb/dgy8jZjId/kx4YgF4fP6Ln1L3uyhhWvnSGYpOw6lEBP5LuunTWLDAw+x4YGHrAi74YGHWD9tEuunTSIm8l227ohtAyBK0i8/pNDagTVJxuf1YXf7OVfuJKvKMF16RhrpGWkcySwlJb+SrCqn1awRgjqaJP9nO0b/Zxo1v+ahS0ZqKJ9QCX5rJMyhN42aRj6h/udB5BKjiAp+i64uNrJ2M0Vs3rUiy4aU92G42X49iCYZDZjUMoX4ctFIcILfGgVU6E0LwEyCxKP98aWNxpc2GvFof+RjlyHlfdjxWnOxh93tJya5kIWHnDx2qJbnopP4NCmaYvtKC0LL6WYkQps70RA3laaUVbjzU1V7RRn2ijK8BbkWUJsM7VIAog7k8MyuPKtD1AJA/9zQQpYN9/oubFk/kpkLl7J4a0KbtrdZa/vSRrfMWS8GcSSzlGd25TH5VIjptTpR9T5SS+OMsrHZD3RHd7SDnTm1YwSzY2KsTtL46DSei07iSGZpm/tKeR8a5gnf0+vI8zfE5zAstpjptTrvifBJeeZ5LTQDkGXDtbsr0fte59mjDmaWaUyv1ZlZpvH3XJlRcQ6Grj5OTHJhy/t7VhrpwMVAog7kMCrOwcs+nZWaccak2L7S0oLpC6d2jGDJiUyWN8E6FVZqsLwJ5ruwYO5O9jFoUSIb4nPOT+/gtxf3kZjkQobFFreAaHRGGZoQbm+hhWd25fHsUQevHilgbo7bAmoNM2S/i6Grj3Mks9Tolcgn1Hb39MzHuXInw9edZrJd4z3xPISuLrYgCrf0ZOuOWKLzVFLLFDIKmlfr5EJmHMxhfoWvDczkUyELxl5RduFUUZNkIvdm8+BpkZd9eocQPyYc6XDnocpRQ+TebObmuFmptdTK5FMhBqwt4K1vMi4cWTMKnIyKczDZrvFJeWaHEBdrbVc5aphxMIflTR1rJaPA2TFI1IEc7k72tZwdYRCLtyZc6h4MMcmF7WrlwRSRAWsLiNyb3T6Iz+vjmV15jIpztIHwxN/I7JgY4svFS47CHk9DG62Y5hm4s5zx0Wntb0CnlikMiy3m06ToFpFSO9iZnSnbeGZXHkcyS8kocF6SHMksZc7m9AuaJyW/si3IltRaZsfEGNM09KZVs2bEzWV5EyzLlXn1SEG7MuNgTruy5JS73dlzd7IvPMi1BIlJLmRnyjbLJFawar7ZHi5NdrSS9jRyd7KPXlGnzQDXyjSlcYY2mk1SuKUnS05kslI7f9M9/HKgdaoh74nn/cR02NV7M9t2A9A/t/qf2uZOvB/zHvNdxk3Mm0bV+36VzK8wxHTWVutPmEbkE6q1hjQ3/yefCvGeeB7k1SPGlLsUeeubDOtnezJnczpvfZPBuXJnGEjzAqSri9FyulG4pSf3b/3OCvErNQNmxsEczpU70ST5kuWXJc9yiZXemQ3du5N9TK/VedmnW1qZm+M+v3r+gpTS42nA42nA5XRa4vE0hFd8zSDBb63cInvtAAYtSuTuZB+T7ZoFYy7tz+zK6+igQZtHRoGTyL3ZLab4M7vyGB+dxpAF+1i8NaEliLmWyNndsa+MZPi60/T/vpaJhTKT7ZqllZWaoZW3vsnA42m4IMS5cifPRScxN8fNeyK87NOZXqszsdDITa55/3i4dgVb0OPUTG2IR/vjzk9Vt6Qau5R3J/uYWCi3MJEJM2dzOkcyS80Q3WKrPia50IIIX2cmnwrxYIpIr6jTPBed1Mo0apFgpv0NcVMR3C5ESWLO5nS6fV3Ag6fFdmHmV/iYcTCHyL3ZRB3IsSRybzbP7MpjfoWvXYj+39cyZME+c7aEgTQ36smy0RA31dostrv9DF193IIJ9xcTxgSam+O2xAQwg9fMMo2JhTIPnjYgBi1KbC+RPq8REyR8iT9X7rRgWptpvssYLBwqHGB6rc7fc2ULYsh+F4MWJbLjUErH09c8ytcaxNTMCxtyGLC2oIUDT6/VO5TJdkMLJsTAneUMWpTYNotvE0eaj3rKxy6zun2t69mdKdt4fOley4lN35ls11pIOIC51D8XnWQu9xcGUQCteibyscuM5n31TKNqD5fm1H9DfA7PRScxdPVxhsUWMyy22Dq4MGS/i2GxxQxfd9oC2HEopb1WVcdtCU2Sqcv7OmTWpGbRLOV9SCh/P0GPUwvPvDIKnMQkFxK5N5s5m9N5LjqJ56KTeOubDFbvzSQlv7LN1P5FxzZ8Xp918v8SWk5WsWStLbr0a5oLHRdY/+GjPP8vtq7+0yCiJOHz+hDcLlxOJ2bzxeV0Irhdlk/9x0B8Xh9VjhoEt6s5rZTaFU1qQHC7qHLU/PpZ05EGqhw1uJxO0CVESSIlv5KoAznM2ZxufTJgzuZ0og7kkJJfaR1mcjmdVDlqflkc6ahSs1eUWdMzJrmQQYsSrYMJNy4raiHmYQWzD2IC2SvKLpa/dAzi8/qsc6cZBU6GLNjHlTMPcEtUJVMSdd45qRGdp7KxDOvDPu+c1JhxNMgtUZVcOfMAQxbss0K7vaLsQqbq+GCtCbEhPodOU2O58qNcZhwNsrMK4t0Xlp1VMONokCs/yqXT1FgrE7sATPvbJK0hblxWxDsnNWugvc7zcqFry3JlbomqbANzSdskpk9kFDjpOmWTpQnzne6sMgbbWWWYY8kpN0tOuYnOU1v8z9TcOyc1blxWRNcpmwwz6dLFjxr7vD5rY+eO13YSMS+Rh/co1iAby4wBluXKLDnl5rsCD1lVxk7FdwUelpxysyxXbvHcjWUwYb9CxLxE7nhtp7X10spELUHMMiHqQA6dJ+9k8KYaJh1u6ZRLTrnZklrb+hS3lURtSa1lySm39fyNZTAlUWfwpho6T95p1rqtS5LzICapJsmWNkbEBpiSqLMs1/gY3DsntfAuT4tDlkrYtci92bxzUmNjmaG9KYk6I2IDbbTStsBqjhma1EBKfiVdp2xiwNoCHt6jMOmwxjsnNev46KWUkaIksfCQk2W5Mu+c1Jh0WGPCfoUBawvoOmWT1d4Miy3nQczIuXpvJp2mxjJ4Uw0T9hsg09KM6fhcdBIxyYWXJM9FJzHjaJBpaTDpsAEzeFMNnabGGhVec+RtA1LlqAFd4vGley0Q8wZTEnWmpWGdWX3sUC3PHnW0K+b/n0qoZ1oaTEszfCQc5PGle0GXwv0k7PxI87S9EMjMMo35rvMdILPDbErrzlA4iOmw4SBh0/iXgUxLg8mnQvw9V2Zmmdau/D1XtpoxpiYe3qPw8B6FW6IqreOCvwpkWhqMinMwaFEi46PTfrFMXG38HLr6OHe8ttPykXZNYzrr4q0JdJoay4C1BS2cdfCmGuZsTrd6Hv/T5ozZJ7no9L1xWZE1fU0bD193unXx3GESFZNcyIb4nDazaUN8Dh6PkTy1O307CmgT9itM2K9YWnkuOumi26wTV6dZR43NXOXKj3LpPHknEY+us0DaDWiWnwCr92bSdcomBm+q4eE9ShsThTXh2jRn5mxOZ/CmmjYzZkRsgE5TY40Q33bhu/iiF66VcJjh604TuTfbUnnk3myGrzttQZgzZtJhzQrvfabHWGNccNELnz2tfSUcJjxADVhbwIC1BdYsMyOp+fyH9yhWGnAks/TS0gDTV4qK8q2NxU5TY7klqrIFTDhQ6+gZ/hwzdoSbpKgo/9LPj5hnR8yUwEwVw810MRkRG7BSRXPpLyrKv/RUsT2YI5mlLZLnEbEBK1q2lhGxASt5vuO1nZY5ioryL5TJX7icENwuioryjV1rr4+oAzkMWbDvouXEkAX7iDqQg8/rQ5MaLgZxaQWWJslWSWkWWBkFzl9UYP2PvgjFPNrj8/osM/2YcIQfE46QnpFmfL7K7SLocWpBj1Mz6+D0jLQWzzPb3b/6aI8SVnCbvXTTVOZxno6kqCjfKlPNUH4pIP9XPGz/N319UFnrf2iKLGi6LmggqCBoIOi6JuiqIqCrgqIrgqyrgoYu6JpiiK4LKgigCpquCCEdQdVVAU0VdP2iMGW29tplmtbcQNQ1QEXXNDQdQGsWHZBbvdQsKkTQfaiaBJrc/PyLPpQ2zqqbL9U10GV0TUbTZUCyQAoaJPaVinx5RmbVKZnVWRpf56r8WKlQFww2Q4bf8VdMXwsEtfkdGb97xSAb8yRG7df4zYYQ3deEsK2WsK1UsK1U6LIqxJWfKQzcEODVw0GS7KbG1F8Pout6C7WuL5Dpv1PBtlLEFgWXfyHTY61Ery91rvkiwLWfB7h6jcxV/5LoskLF9gl0+tjLI7FesuuxzKnrHeqneQdL143Bjacj6wqg4ZFUph8JYvusCdsXIldvhGvXi/T+SuS6dQrXrZO4fp3Ib76UuH5NiD6fi1z/mcgNnwa5epWMbbHG1StEvsoSjbeoq2i60h6MYNN1XTAhNF1vdlBoVFSG7/Nh+1Ti2o1Brl8v03uDyDVfN3DDVz5u+FKh15cKvdbp9FoHvT5X6PW5wjVr4LrPda6NkugTJdL1EwXbIpkVx5sdGaXZ8S9gGgNIJ6ipPHgghO3TED23h+ixTafXZpmb1ofos0ml+9dw1VcaV3wapMvKIF1WSVz+qULPzxV6faZw9Wc613yq0Xt1iN9Ehei+WMG2QObz03JHDtxsGk07P2XRmZ/hx7ZG5rqtMjdubqTHFonrNov8doPMZRvA9pmPqz8X+MNWhb/tkrg/VuGWaJXLPmmk85Imen6m0+sz6BMlcsNqP9etVujysU63jwIcrwy1N6UFm6Zrgma4KKBxrE7lyq999PnaT58dcMNWjV5bFa7d6sP2lcj/+szP6/FNHK2SqQtpSKqIKItUN2psyJH52yYXtkV+uq9UuP5fMj1XqVy9WuWGFSE6LQgxbHMQv6kVXW92B12wKZouSEjGNNMVJvwgYdugcGOsym+2q/TZqnD9dh3bVz5u3h4guVJtnpJa808zkJlBMMS7SQG6vB/gimUKvVdK9Fmu0nu5zLXLZGzvaWzLDhggmoysqwYIKoKqG+rKqVO5douP62JUfvutxg2xCn1iZTpv0rgpRuF0XQAIgRJElSUURUWWZWRZRpFlgrIKeIEg7yaC7X2FXkslei+XDVkmY1sQ4pFNDaA3hwcdNF0XbGjNZwNQWXZaxrZV5XexMjftFLnpW4ne34rYNvjZUywBQUJqEEkMoEk6oqIgySqipCCKEt6Qis8fRNEaAB+TtijYInV6Lwtx7VKRPstkIj5S6PGBRGFtwFCgApquCDYFTQANXZeZkiARsVPnlu9kfhcr0/cbiYivA4w94DM0oet4VQVJUQiJGiFRIiTKBEMSAX+QhoBIvU/C1SQCfpIKGrl8kZerFitcu0Tkuk9ErlsiYXtDYuMpYyobE0gVbIouC6DiDsgMiwtx406Z/rs0+u6WGPCNSI8tIZbnSoCCEvITkBRkWSMUkAgEJbz+EE2+IA3eAPUNjTR6fNTWSni9PuoFN/d8KtBpkcg1n3jp82GQ3h/6sc33seAHb/P6pYOmCTY0VQCNEkHhrgMhfrdL5k/fafT/XqT/boU+sRI/2r0AhESFYFDCF1TwBSWa/CE8TQHcjQFcDX6cdQGq63w43PWU1AoEmup4emMjtvl+enzop/d7Aa57N4Btvo/Z37jCHBzBpuqaAHDOHWDo/iD99in8+XuZO/er/H6fxsB/h0irDgGqoYGAhOAL0eALUd/oo87TRK2nCUddI3anQKXTTUl1DUVVNXga6nh2mwvb6066L3Bz3btOekU2YXtd5MVNDmuVVtEFm6brAmiUu4OMPODnjv0idx+UGHpQ4q6DEnf928+h0iCg0egN0OgXqW8MUCd4cXm81LgbqHIJlDs9lFd5KK90U1hWQ3GlgLOqlrs/rsQ2q45rFjq57q0yukc6sL3iYc62akBDR0fRNcGmq5oAQYSAyuQEibsPhnjgkMYD8T4ePOTnv/ZrfJrtBTWE4A3ibvRTJ3hx1jdRXddApbOeMoebEruL3Ao3p8vqOVVSR1JuDZkFtbywvgDb0zl0eqmanm+Wct2bFdhmlvP2Po/hH6qIrmiCTdNUAVVElTVeyfTz10My435UGHNE5JGfJIYf1ZiV4kFo8uILBKirD+LwBHC43Dhq6ymurqfAUU9ORS05RSU0NHmQVRW/JCMqOho6354U6DEri04z8+nxWim2fxSx8ZgLEAlJCqoiCzZZUwVZVECDjUVNDD8s8sRRlSmJOs8mwbPHZJ466iO2yI8aDNJU56a8tpGqaicOZx2FVfWcLa8lq7CMBn8IHfAGZQKSik/SQAoBOjEZtdiezqTTS/l0fzmPrFIBNB9CUCcoSYJN0TTBKymgS5TXBXn8pwCTj8lMT1WZmarx+nGR2Rk680+GOFleh9/bgMtZR3V1HYWVLvJKajiTV0pVjRsV8IVEgrLaLApeERSCAAx5/xS2+48zZvlZAmKIQFMTHq+PppAi2DRdFQIyyKIfRImoMz6ePO7lpUyJl08r/PN0iMjTEh9kS6zNEUgp92GvaaDAXstZh4DLG0JoChAMyviDMn5Jxi/K+EISIVnFr0h4JWPZ33a8mNteSCI6vhpZbMDhaqChyYfHHxRsmhYURBECoRDoMvkukVfTFN7IlHk7W+aDXIlVOSHW5ob4qhi2F4v8WNLIiSov5wLgkVVERSUYMqa2LyTjF1UCkkpQ1vGLImJAxCsai2SdKFJQ6aG0ooqK+gBuVxOCTxBsuq4IkqQSFCVCkgyqzg8lXt5J9/H+WViVJ7G+KMSOEoVdJSp77DJxdRrH3Rq5goLDJyMERRqCIt6QbPiHqBAQFSRJJSCrhGSZJklDUs/nIefsNRRXe3DWefE0NjUf21BURFEiGDRWVH9I5Nu8Rt7Pk/lXocbWIpFvKzT2VSr8YJdIcEqk1Svke2TsPhV3SMYTEmkISngDCr6QTFBSCUkqQUnFL2kEJUNLflFF1aGuyUepow6HuxG34DdyVkVRkCQFUVLxBWR0ScEfFPmuuIG1hTIxpSr/rpA46FBIqJHJdGmcqVPJa1Co9MrUBiTcQQlPQKYhoNAUUvCJCn5JJSApBCTZEr8oEVJU/IpKiaOOmnov9Q1+QyOqqiErGqKiIYk6/mAATQ4QalRItPvZU+EnvkrmxxqJRJdIVp1KTr1GQaNChVei2idTE9BwBRTqAzKeoEyjKNMkKvglhaCkNAMZogAeX4DS6npcDQE8jYHmM0aajqLqyLJOSNbwSTJev0woEKCxyU9OdZCEkgAJ1UGSBYWsBo3cRihq0qj0KVT5ZBwBjdqQRn1IRhBVGiWVRlklqOiIikZQ1hAV4ytjJE2n0ummqt6LU/AjNAYEm64jaBqoqo6iaEiKhiirBESVhkAQr9eH0ChSUu3nVGkdGY4mUmt8ZLoC5DWoFDUplHpVKnw6VT6ZWn+IuqCEJ6TQEFINzUgSflXFJ8nUe304XALVdQ3UNwaob/TT5A0ZILoO4TCyrBKSZHxBGcEfxNPgpdETwO32U+ZoIKesnrPlHrLtbn6urCfPXk+B3U2R3cO5qgbOVTVQUilwrkKgtEqguLKe4sp6yhwNlNg9VLkEhKYgjd4QTX6RYFA+X2Dpuo6maaiqiqqqKIqGKKn4QwrekERjIIC70YenMUBjk0S9EKK23our3ovb48Xj8SI0BfD4ROq9IdyNQeoa/Lg8AZxuPzV1PuobRASfguAN0egP4Q1KBEMykqwKNkAxMnpDNM1oSxhQGrKiI6oqTapIkyTiDYUIiDLBkEwoICOGjHghKxqKqqCoEooqEVJFgkqIkBIiKIsEpBB+MYA/FMAXkgiICiHRmK2KoilWo6bZRIKu61bjRdd1QdEQVBVBkzRBlVRBFhVBVTRBUXRBknVB1hAUECQQNF0XUHVB13RB0XRBVDRBUjRBUTVBUlRBlBRBlGQhJGuCJOuCouiCpuqCqqpl/7Eemqor5HnS2Ja/hPezpvCP1PuYlfo3vvo5EnfA0baH9qs+CKZpBIIh7DUuyuw1lNprqHDU4mnwoqoamq5xyn2YVTkv8cKJO3n+TH+eTB7Ao/H9eSr+TnbmrfyfgdiddZzKKaK0yklhuYN6oWVfvabay+6Tu3gzaSJPpPZm9E9XMmnvH1n60wKSanZypuEg35WuZlrCMLb9vPSXgzicdWTkFLX7vya5Dq/spk62s8v1AW+cu53ns29kSd6z/Fi9mZ/L8tpqVFfZeHYxBe7MSwdJy85v8Xd1oJwDFRtZlTeTD88+wcKsMSzMGsv8rL8wNbMnc7LuJN6xg6AcsF6TW1xBkzfQct9P8pDrSkfT1QuDKKrKz8UV1t+V3kKi89/m1YyhvHlyMPOz/ouFZ4fwYe59fJAzjLfO3s66wuep8p7jbF0iUTkzOe76/rzZ6jxUVteGtch06gL2C4PIikJFtcv6e3/ZeuamDOHNU//NivwxfFY8jnXlE/iyYiKflz/Eh4WD2Gv/CL/YQIJjI2+dvJvXTt7FtJS+LPt5OvVBY383KEoUlFaGzSz5wqb5ubC0WSsyG3PfZUbKnXzw8wOsKX6EdWUT+NI+nq8cY1nrGMnikjuJd0Xhld1sr3iTt37+IyuLHmZN0WMszxnPzLSBvJnxMMWNPxv7vUITLrdw8VlzMswnNud+xD+O3cGy3LF8ce5R1pZN4IuKsXzlGM0X1SP4uPJ2jgpraJAcfFb+CJHnbuOz8pF8UT6OL0om8nnRJFblPcrLaXfxxolROHzGd2idq7xIHBEavTQFQwAcLNvMP5Lu5JOcsawpmsRnJROIKnuYtVWjWVP9Vz6q7McRz0pUTSa2Zh6LSgeytOJPfGa/j3UVY1lTMoFPz01kdcEjLM95hNmp/8UHmU+j6MYnlrJyz3UMknHW0IbDW8rLyfexIGs4nxU8zqqi8Xx07gGiKkfyheN+ltnvJEFYGdYOFWlUqjniWcGK8iFElQ1jTek4Pi2awOqCR1iZ9wgfnx3Hs4l9+aHc+BqH2voGRFFqC+JpaEKSjOR2Y84iZqX8majcx1ieN57Xc+/hvXPD+aziAZaX30VGY0yH0/1s00E+KR7KquL7+ezceFbnT2BFzkSW5Uzg7VP38UbKQ3hCdc1aKWoLktHsG06/nbnJ9/H+6VGsyJnIC9l38kreMNaUPsKSkkHsdy26aABMcK3lw4L/5l9FY1mdP56lOeP55Ox4Psh+mOeT7+BAyUZj17O8qiWIKMkUlNoBOFQaw4zkQSw+M5bZp+7in7mPsKnkFVade4DPSsfTJNVeFCSk+lhbPIVl+Q+wMnccS8+OY/GZsXxwZjTTj9/OkqwXACi3O/H5A+dBKhy1lFQac33t2bf5R/KdvJnxFxadnkSyYzuf5j3BssIR/Kt4DBvLp/NF2dOsqXiSNRVPsKbyCeNnxZN8XjaFz4ufJrr4Bf5V8Agr8h5iWc5YPs4ey4enR/P+6YeYnfZn3kh9CAUfqgz2Gtd5kLOFpZTYjUMHH516jmlJA3jjxHCO2XexteBtFpwZyqqC0awo+huLCv7Eu4W38V7x73mvtD/vl/Xl/bJ+vFfye94tuo2F+X/g3dw/szT/b6zIHcMnZ0fz0ZmHWXT6ISKzRvJq5mBeSh5MSeNZyzyyrBggWTlFlNsNssiMKYz9oQe7i/9FmmM/r6bezZKfx7Is5yGW5f+NFYUjWHXuflaXDmN12V+JKhtGVNkwVpX9lZXFw1lRNILl+Q/ySc6DfHRmFIuyRhF5ciRvZ/6NNzPvZ3baIJ5N+AM/1xsfXcg9V47XH2wLMidpFE/9eAcVQg7Lsp7j9fShfHTmIT4+M4rIrKG8ljGAeSf78eaZfszP7sc/z/bln9n9mH+mH29m9eO1jP7MPfF7ZibfxvSE3zP1UD+eiruVxw/cxIT9fRj+764Mje3M6bqjAOQVl+MPhgyQvHPllFQapnkhfgRf5y7haNV3PJvwe945+QDvnnyAf2bcQ0zR22S7fySzbj+Z7n2cdO/jZP1eTtbvI9O9j8y6fWS49pHm3Edq9T6OV+0luXIPRyt2k1C+i/jybzhYupUfSrfjV40wX1zhQNN0A8RR66bEbjjr5p+Xc9IRz9snJvJ88h94O/N+3s64j1dS7mJLXuT/v0e/vT6qa93nnVXXdXLOlRtJi6qSWLmL8Yd682rGvcxLG8qbJ4byRuoQXj56L+UNuRcdoDHk5kDJNvaXbuZA2Rb2l21hX9nX7C3byNaCKJKr4pqnbw3+QLBlQDttxn4dPsh4hseP3sjcjP/m5dRBvJYymNdTBjMtvh8rT865KMja0wsZvqsr4/f3ZNyBnjx88CpGxV3BiAM2bt5iY8PPKwz/KKlsG1lDooTgCRJAYPKR/jyb2pcZaQOZdfyPzDn+J145/l/MSfojU364lW05yzuE2F30FU/80JcZSQN5+fifmH38Tmam3MGM1Dt4LOE6pv90DyHFCGLZ+SXtL3pn88rJCR5hbPy1TEq6jqnJv2XGsduZdfwPzD52By8n/5FZSX9g8sGbeDflGU7VHMUTqKMhVM/Z2hMsSZ/JY3G38I/E25l77I/MOv4HZhy/nRkptzE1+Rbu+beNhMrvjLEKSi+cj0T+8AaPZfTi2eQ/8Gj89fz96C3MSB7AjOTfMzPpNmYn3c7MowN4/IdrmXKoPy8l3MtLP/2Fpw7fxiMHr+HFxH7MTrqNmUm/56XkAbyY3I/pyb/jr/tsRJ542hqnOGydaRdkxv6J/DXBxvflX/Fd0Rru2W3jmYTrmZnUnxlJ/ZhxtB+zjg5g1tH+vJBwM1Pjr+fZ+Ot5PuFmZiX2Y9ZR43kvJfXlpeR+PJ90M3/da2Nm4gME5MZ2c5F2QV5OeYA/7rZxrOYgANE/f8S933ViTFxXZiX1ZfbRvsxK7MusxFuZnXgrs8JkZuKtzEi8lZlHf8espL48Gd+Lu3fbeDVpLA1BY+kvc7T7ZTktQUQlyLQjg/nzv20cyo+zrsdX7OKR/bcybLeNp368hpd+uok5ib9lbuKtzfI75ib+jtmJv2PGT7fwfMJveOj7zty/O4JPs+YjKsYUdTc04Wloav/YRusLz/04lAeTIsgsPENewfnc0is1EH32Qx47MICH913F+O//F+O/t/H4wW7877gIHtnfhXHfd2Hs91cyZl9v3k19lgLPaev15TV1NDR6Oz4/0vrC26ceYVhcL45X/GB4d2Eljf7Q+cJI9pHqiGPVqVeZd+wRZicOZ0bCvbyS9DAfpD3PnnNfUuO3ny9NVI2T+eVI8oVPGrUB2ZsfzX1HehJTtMK6FgyJZOYW0+gXf1EIz8wro9LhvKTn2lrugkMoFOS5n/7C0APXYK8tb3GepMrh5HB8Cmknz5JbXEpBSQVlFbVU2N0UlVWRW1RK1s95/JCQzMkzPyPLMpqm4ff7CQQChEIhJElCURQ0TcPsVOm6fn6tCT+oUOkq4bGE27n/qzv4KeMIwVCQQCBAbV0ttXW1VFRWkJ19lrS0DJKSj5F4NInk5OOcPHmK/Px8amtrcbvd1NTU4HQ6cbvdNDU1WTCyLKOqaguYDmvfgNzE4bIYdpWv4UT5EezuMkQl9B877PT/DQC7cLwx8LR3hQAAAABJRU5ErkJggg==) no-repeat;
|
|
212
|
+
padding-left: 40px
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.browser .browser-firefox {
|
|
216
|
+
background-position: 0 -34px
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.browser .browser-ie {
|
|
220
|
+
background-position: 0 -68px;
|
|
221
|
+
margin-left: 0px
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.browser .browser-360 {
|
|
225
|
+
background-position: 0 -170px;
|
|
226
|
+
margin-left: -27px
|
|
227
|
+
}
|
|
228
|
+
</style>
|
|
229
|
+
</head>
|
|
230
|
+
|
|
231
|
+
<body style="margin-top:50px">
|
|
232
|
+
<h1>请升级您的浏览器,以便我们更好的为您提供服务!</h1>
|
|
233
|
+
<p>您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。</p>
|
|
234
|
+
<hr>
|
|
235
|
+
<h2>请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束</h2>
|
|
236
|
+
<p>自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11
|
|
237
|
+
以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 <a
|
|
238
|
+
href="https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support">微软对 Internet Explorer 早期版本的支持将于
|
|
239
|
+
2016 年 1 月 12 日结束的说明</a> 。</p>
|
|
240
|
+
<hr>
|
|
241
|
+
<h2>您可以选择更先进的浏览器</h2>
|
|
242
|
+
<p>推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。</p>
|
|
243
|
+
<ul class="browser">
|
|
244
|
+
<li class="browser-chrome"><a
|
|
245
|
+
href="https://www.google.cn/chrome/browser/desktop/index.html?hl=zh-CN&standalone=1"> 谷歌浏览器<span>Google
|
|
246
|
+
Chrome</span></a></li>
|
|
247
|
+
<li class="browser-firefox"><a href="https://www.mozilla.org/zh-CN/firefox/new/"> 火狐浏览器<span>Mozilla
|
|
248
|
+
Firefox</span></a></li>
|
|
249
|
+
<li class="browser-ie"><a href="https://windows.microsoft.com/zh-cn/internet-explorer/download-ie"> IE 11
|
|
250
|
+
浏览器<span>Internet Explorer</span></a></li>
|
|
251
|
+
<div class="clean"></div>
|
|
252
|
+
</ul>
|
|
253
|
+
<hr>
|
|
254
|
+
</body>
|
|
255
|
+
|
|
256
|
+
</html>
|
|
@@ -32,15 +32,10 @@ export const FRAMEWORKS = [
|
|
|
32
32
|
workingDir: "target",
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
command: "pnpm add date-fns",
|
|
35
|
+
command: "pnpm add date-fns next-themes motion",
|
|
36
36
|
description: "Installing date-fns for date utilities",
|
|
37
37
|
workingDir: "target",
|
|
38
38
|
},
|
|
39
|
-
{
|
|
40
|
-
command: "pnpm add next-themes",
|
|
41
|
-
description: "Installing next-themes for theme support",
|
|
42
|
-
workingDir: "target",
|
|
43
|
-
},
|
|
44
39
|
{
|
|
45
40
|
command: "pnpm dlx shadcn@latest add --all",
|
|
46
41
|
description: "Installing all shadcnui components",
|
|
@@ -64,7 +59,7 @@ export const FRAMEWORKS = [
|
|
|
64
59
|
workingDir: "target",
|
|
65
60
|
},
|
|
66
61
|
{
|
|
67
|
-
command: "pnpm add @tanstack/react-query next-auth prisma",
|
|
62
|
+
command: "pnpm add @tanstack/react-query next-auth prisma motion",
|
|
68
63
|
description: "Installing SSR dependencies",
|
|
69
64
|
workingDir: "target",
|
|
70
65
|
},
|
|
@@ -5,30 +5,38 @@ const TEMPLATE_NAME = "nextjs-csr";
|
|
|
5
5
|
const TEMPLATE_FILES = [
|
|
6
6
|
// Config files
|
|
7
7
|
{ source: "prettier.config.json", destination: ".prettierrc", isJson: true },
|
|
8
|
-
{ source: "eslint.config.
|
|
9
|
-
{ source: "next.config.
|
|
8
|
+
{ source: "eslint.config.mjs", destination: "eslint.config.mjs" },
|
|
9
|
+
{ source: "next.config.ts", destination: "next.config.ts" },
|
|
10
10
|
// DevContainer
|
|
11
11
|
{
|
|
12
|
-
source: "devcontainer.json",
|
|
12
|
+
source: ".devcontainer/devcontainer.json",
|
|
13
13
|
destination: ".devcontainer/devcontainer.json",
|
|
14
14
|
isJson: true,
|
|
15
15
|
},
|
|
16
16
|
// App files
|
|
17
|
-
{ source: "layout.tsx", destination: "src/app/layout.tsx" },
|
|
18
|
-
{ source: "not-found.tsx", destination: "src/app/not-found.tsx" },
|
|
17
|
+
{ source: "src/app/layout.tsx", destination: "src/app/layout.tsx" },
|
|
18
|
+
{ source: "src/app/not-found.tsx", destination: "src/app/not-found.tsx" },
|
|
19
|
+
{ source: "src/app/error.tsx", destination: "src/app/error.tsx" },
|
|
19
20
|
// Components
|
|
20
|
-
{ source: "show.tsx", destination: "src/components/show.tsx" },
|
|
21
|
-
{ source: "build-info.tsx", destination: "src/components/build-info.tsx" },
|
|
21
|
+
{ source: "src/components/show.tsx", destination: "src/components/show.tsx" },
|
|
22
22
|
{
|
|
23
|
-
source: "
|
|
24
|
-
destination: "src/components/
|
|
23
|
+
source: "src/components/build-info.tsx",
|
|
24
|
+
destination: "src/components/build-info.tsx",
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
source: "
|
|
28
|
-
destination: "src/components/providers/
|
|
27
|
+
source: "src/components/providers/theme.tsx",
|
|
28
|
+
destination: "src/components/providers/theme.tsx",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
source: "src/components/providers/query.tsx",
|
|
32
|
+
destination: "src/components/providers/query.tsx",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
source: "src/components/providers/index.tsx",
|
|
36
|
+
destination: "src/components/providers/index.tsx",
|
|
29
37
|
},
|
|
30
38
|
// Utils
|
|
31
|
-
{ source: "request.ts", destination: "src/
|
|
39
|
+
{ source: "src/lib/request.ts", destination: "src/lib/request.ts" },
|
|
32
40
|
];
|
|
33
41
|
export function createNextjsCSRFiles(root) {
|
|
34
42
|
// Copy all template files
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "node:v22.9.0",
|
|
3
|
+
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
|
|
4
|
+
"customizations": {
|
|
5
|
+
"vscode": {
|
|
6
|
+
"extensions": [
|
|
7
|
+
"bradlc.vscode-tailwindcss",
|
|
8
|
+
"esbenp.prettier-vscode",
|
|
9
|
+
"dbaeumer.vscode-eslint",
|
|
10
|
+
"ms-vscode.js-debug",
|
|
11
|
+
"yoavbls.pretty-ts-errors",
|
|
12
|
+
"github.vscode-github-actions"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"remoteUser": "node",
|
|
17
|
+
"mounts": [
|
|
18
|
+
"source=${localEnv:HOME}/.ssh,target=/home/node/.ssh,type=bind,readonly",
|
|
19
|
+
"source=/etc/localtime,target=/etc/localtime,type=bind",
|
|
20
|
+
"source=/etc/timezone,target=/etc/timezone,type=bind"
|
|
21
|
+
],
|
|
22
|
+
"remoteEnv": {
|
|
23
|
+
"SSH_AUTH_SOCK": "/ssh-agent",
|
|
24
|
+
"TZ": "Asia/Shanghai"
|
|
25
|
+
},
|
|
26
|
+
"initializeCommand": "mkdir -p ${localEnv:HOME}/.ssh",
|
|
27
|
+
"runArgs": [
|
|
28
|
+
"--volume=/run/host-services/ssh-auth.sock:/ssh-agent",
|
|
29
|
+
"--network=host",
|
|
30
|
+
"--privileged"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { dirname } from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
3
|
+
import { FlatCompat } from "@eslint/eslintrc";
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
|
|
8
|
+
const compat = new FlatCompat({
|
|
9
|
+
baseDirectory: __dirname,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const eslintConfig = [
|
|
13
|
+
...compat.extends("next/core-web-vitals", "next/typescript", "prettier"),
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
export default eslintConfig;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { format } from 'date-fns';
|
|
2
|
+
|
|
3
|
+
const nextConfig = {};
|
|
4
|
+
|
|
5
|
+
const proxy = async () => {
|
|
6
|
+
return [
|
|
7
|
+
{
|
|
8
|
+
source: '/api/:path*',
|
|
9
|
+
destination: 'http://localhost:8000/api/:path*',
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
switch (process.env.NODE_ENV) {
|
|
15
|
+
case 'production':
|
|
16
|
+
nextConfig.output = 'export';
|
|
17
|
+
nextConfig.images = {};
|
|
18
|
+
nextConfig.images.unoptimized = true;
|
|
19
|
+
nextConfig.distDir = 'dist';
|
|
20
|
+
break;
|
|
21
|
+
case 'development':
|
|
22
|
+
nextConfig.rewrites = proxy;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
process.env.NEXT_PUBLIC_BUILD_TIME = format(new Date(), 'yyyy-MM-dd HH:mm');
|
|
27
|
+
|
|
28
|
+
export default nextConfig;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"semi": true,
|
|
3
|
+
"trailingComma": "all",
|
|
4
|
+
"singleQuote": true,
|
|
5
|
+
"printWidth": 80,
|
|
6
|
+
"tabWidth": 2,
|
|
7
|
+
"useTabs": false,
|
|
8
|
+
"importOrder": [
|
|
9
|
+
"^@core/(.*)$",
|
|
10
|
+
"^@server/(.*)$",
|
|
11
|
+
"^@ui/(.*)$",
|
|
12
|
+
"^[./]"
|
|
13
|
+
],
|
|
14
|
+
"importOrderSeparation": true,
|
|
15
|
+
"importOrderSortSpecifiers": true,
|
|
16
|
+
"endOfLine": "auto",
|
|
17
|
+
"plugins": [
|
|
18
|
+
"prettier-plugin-tailwindcss",
|
|
19
|
+
"@trivago/prettier-plugin-sort-imports"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { motion } from "motion/react";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { Button } from "@/components/ui/button";
|
|
5
|
+
|
|
6
|
+
export default function ErrorPage({
|
|
7
|
+
error,
|
|
8
|
+
reset,
|
|
9
|
+
}: {
|
|
10
|
+
error: Error;
|
|
11
|
+
reset: () => void;
|
|
12
|
+
}) {
|
|
13
|
+
const springConfig = { type: "spring", damping: 10, stiffness: 100 };
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<div className="flex flex-col items-center justify-center min-h-screen bg-gray-50 px-4">
|
|
17
|
+
<title>Error </title>
|
|
18
|
+
<motion.h1
|
|
19
|
+
className="text-3xl font-bold text-gray-800 text-center"
|
|
20
|
+
initial={{ y: -50, opacity: 0 }}
|
|
21
|
+
animate={{ y: 0, opacity: 1 }}
|
|
22
|
+
transition={springConfig}
|
|
23
|
+
>
|
|
24
|
+
出错了
|
|
25
|
+
</motion.h1>
|
|
26
|
+
|
|
27
|
+
<motion.p
|
|
28
|
+
className="text-gray-600 text-center"
|
|
29
|
+
initial={{ y: 50, opacity: 0 }}
|
|
30
|
+
animate={{ y: 0, opacity: 1 }}
|
|
31
|
+
transition={{ ...springConfig, delay: 0.1 }}
|
|
32
|
+
>
|
|
33
|
+
{error.message}
|
|
34
|
+
</motion.p>
|
|
35
|
+
|
|
36
|
+
<motion.div
|
|
37
|
+
initial={{ scale: 0.8, opacity: 0 }}
|
|
38
|
+
animate={{ scale: 1, opacity: 1 }}
|
|
39
|
+
transition={{ ...springConfig, delay: 0.2 }}
|
|
40
|
+
className="w-full max-w-sm mx-auto my-10"
|
|
41
|
+
>
|
|
42
|
+
<UnDrawError />
|
|
43
|
+
</motion.div>
|
|
44
|
+
<div className="flex gap-2">
|
|
45
|
+
<motion.div
|
|
46
|
+
initial={{ opacity: 0 }}
|
|
47
|
+
animate={{ opacity: 1 }}
|
|
48
|
+
transition={{ delay: 0.3, duration: 0.5 }}
|
|
49
|
+
>
|
|
50
|
+
<Button onClick={reset} variant="outline">
|
|
51
|
+
重试
|
|
52
|
+
</Button>
|
|
53
|
+
</motion.div>
|
|
54
|
+
<motion.div
|
|
55
|
+
initial={{ opacity: 0 }}
|
|
56
|
+
animate={{ opacity: 1 }}
|
|
57
|
+
transition={{ delay: 0.4, duration: 0.5 }}
|
|
58
|
+
>
|
|
59
|
+
<Link href="/">
|
|
60
|
+
<Button>返回首页</Button>
|
|
61
|
+
</Link>
|
|
62
|
+
</motion.div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function UnDrawError() {
|
|
69
|
+
return (
|
|
70
|
+
<motion.svg
|
|
71
|
+
animate={{
|
|
72
|
+
y: [0, -10, 0],
|
|
73
|
+
rotate: [0, -1, 1, 0],
|
|
74
|
+
}}
|
|
75
|
+
transition={{
|
|
76
|
+
duration: 5,
|
|
77
|
+
ease: "easeInOut",
|
|
78
|
+
times: [0, 0.2, 0.5, 0.8, 1],
|
|
79
|
+
repeat: Infinity,
|
|
80
|
+
repeatDelay: 1,
|
|
81
|
+
}}
|
|
82
|
+
className="w-full h-auto"
|
|
83
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
84
|
+
data-name="Layer 1"
|
|
85
|
+
width="690"
|
|
86
|
+
height="448.7592"
|
|
87
|
+
viewBox="0 0 690 448.7592"
|
|
88
|
+
>
|
|
89
|
+
<path
|
|
90
|
+
d="M466.81292,645.7313c4.66847-10.08358,9.33339-20.31666,11.35946-31.24223s1.17569-22.78293-4.627-32.25932-17.22813-15.90241-28.13153-13.76022c-8.95532,1.75945-16.14605,8.81268-20.35651,16.90992S419.15759,602.60959,417.52,611.588c-.52917-10.2001-1.0896-20.56436-4.478-30.19975s-10.06045-18.61463-19.5694-22.34313-21.87886-.79648-26.89061,8.1032c-7.06074,12.53818,2.30155,30.12541-5.81734,42.0058-1.39265-11.917-13.85471-21.33234-25.69879-19.4159s-20.70109,14.78128-18.2646,26.5294c1.44978,6.99047,6.21931,12.93631,11.92156,17.232s12.33421,9.27436,18.89475,12.09Z"
|
|
91
|
+
transform="translate(-255 -225.6204)"
|
|
92
|
+
fill="#f2f2f2"
|
|
93
|
+
/>
|
|
94
|
+
<path
|
|
95
|
+
d="M323.01987,598.15781c9.40825,3.28851,18.903,6.61425,27.49226,11.75558,7.698,4.60786,14.553,10.81187,18.88231,18.7569a33.35556,33.35556,0,0,1,4.12583,13.85861c.06251,1.01759,1.65458,1.02469,1.59164,0-.55661-9.061-4.97238-17.353-11.087-23.91075-6.704-7.18984-15.39158-12.10041-24.3611-15.91043-5.31821-2.259-10.76859-4.17895-16.2208-6.08468-.96887-.33866-1.3854,1.19842-.42311,1.53477Z"
|
|
96
|
+
transform="translate(-255 -225.6204)"
|
|
97
|
+
fill="#fff"
|
|
98
|
+
/>
|
|
99
|
+
<path
|
|
100
|
+
d="M377.28745,560.62486a143.38254,143.38254,0,0,1,13.79113,30.61557,145.11672,145.11672,0,0,1,6.361,32.96846,143.30543,143.30543,0,0,1,.15151,18.83685c-.05905,1.02328,1.53278,1.01989,1.59163,0a145.1941,145.1941,0,0,0-2.04032-33.82049,146.92647,146.92647,0,0,0-9.769-32.44022,143.25,143.25,0,0,0-8.71162-16.9635.79641.79641,0,0,0-1.37432.80333Z"
|
|
101
|
+
transform="translate(-255 -225.6204)"
|
|
102
|
+
fill="#fff"
|
|
103
|
+
/>
|
|
104
|
+
<path
|
|
105
|
+
d="M455.188,569.76743a232.04359,232.04359,0,0,0-17.11648,57.57847q-1.34225,8.36487-2.07791,16.81182c-.089,1.02023,1.50317,1.01426,1.59163,0a231.20919,231.20919,0,0,1,12.73788-58.02528q2.83382-7.89209,6.23921-15.56169c.412-.92791-.959-1.73862-1.37433-.80332Z"
|
|
106
|
+
transform="translate(-255 -225.6204)"
|
|
107
|
+
fill="#fff"
|
|
108
|
+
/>
|
|
109
|
+
<rect
|
|
110
|
+
x="709.17625"
|
|
111
|
+
y="639.47815"
|
|
112
|
+
width="9.88235"
|
|
113
|
+
height="46.58824"
|
|
114
|
+
transform="translate(1112.59535 -285.4804) rotate(89.25872)"
|
|
115
|
+
fill="#e6e6e6"
|
|
116
|
+
/>
|
|
117
|
+
<path
|
|
118
|
+
d="M754.02652,669.61624l-6.65257-.0194-4.11239-7.33712,4.445-7.31237,6.1811.01792a11.99893,11.99893,0,1,0,.13889,14.651Z"
|
|
119
|
+
transform="translate(-255 -225.6204)"
|
|
120
|
+
fill="#e6e6e6"
|
|
121
|
+
/>
|
|
122
|
+
<path
|
|
123
|
+
d="M674.20833,669.61624l6.65258-.0194,4.11239-7.33712-4.445-7.31237-6.18109.01792a11.99892,11.99892,0,1,1-.1389,14.651Z"
|
|
124
|
+
transform="translate(-255 -225.6204)"
|
|
125
|
+
fill="#e6e6e6"
|
|
126
|
+
/>
|
|
127
|
+
<path
|
|
128
|
+
d="M944,646.58958H256a1,1,0,0,1,0-2H944a1,1,0,0,1,0,2Z"
|
|
129
|
+
transform="translate(-255 -225.6204)"
|
|
130
|
+
fill="#3f3d56"
|
|
131
|
+
/>
|
|
132
|
+
<circle cx="540.48622" cy="197.96918" r="33" fill="#2f2e41" />
|
|
133
|
+
<polygon
|
|
134
|
+
points="553.859 383.226 556.401 395.219 603.871 391.124 600.12 373.423 553.859 383.226"
|
|
135
|
+
fill="#ffb8b8"
|
|
136
|
+
/>
|
|
137
|
+
<path
|
|
138
|
+
d="M789.18809,618.49673h38.53073a0,0,0,0,1,0,0v14.88687a0,0,0,0,1,0,0H804.07494a14.88685,14.88685,0,0,1-14.88685-14.88685v0A0,0,0,0,1,789.18809,618.49673Z"
|
|
139
|
+
transform="translate(108.71051 1320.97269) rotate(-101.96466)"
|
|
140
|
+
fill="#2f2e41"
|
|
141
|
+
/>
|
|
142
|
+
<polygon
|
|
143
|
+
points="524.12 382.586 518.777 393.621 473.673 378.264 481.559 361.979 524.12 382.586"
|
|
144
|
+
fill="#ffb8b8"
|
|
145
|
+
/>
|
|
146
|
+
<path
|
|
147
|
+
d="M771.03745,617.45562h23.64388a0,0,0,0,1,0,0v14.88687a0,0,0,0,1,0,0H756.15059a0,0,0,0,1,0,0v0A14.88685,14.88685,0,0,1,771.03745,617.45562Z"
|
|
148
|
+
transform="translate(-379.9408 824.86818) rotate(-64.16458)"
|
|
149
|
+
fill="#2f2e41"
|
|
150
|
+
/>
|
|
151
|
+
<path
|
|
152
|
+
d="M690.25925,586.41362a10.74272,10.74272,0,0,0,12.70881-10.48016l74.37388-68.5711-18.47-14.30549-67.33743,71.94341a10.80091,10.80091,0,0,0-1.27527,21.41334Z"
|
|
153
|
+
transform="translate(-255 -225.6204)"
|
|
154
|
+
fill="#ffb8b8"
|
|
155
|
+
/>
|
|
156
|
+
<circle cx="536.34449" cy="207.89831" r="24.56103" fill="#ffb8b8" />
|
|
157
|
+
<path
|
|
158
|
+
d="M813.38612,577.89329c-17.22851.00049-37.978-3.62842-50.77856-18.477l-.28833-.33447.29663-.32813c.09668-.10693,9.51367-10.86865.11084-30.061L749.799,532.67015,736.9286,515.68138l7.12964-21.38916,29.17749-23.50391a26.75074,26.75074,0,0,1,14.6106-5.78906,80.21058,80.21058,0,0,0,27.78467-7.91309,27.906,27.906,0,0,1,12.7998-2.79834l.57373.01611a9.95022,9.95022,0,0,1,9.64063,10.70752c-1.97852,25.62989-5.47242,87.54346,4.7915,108.86133l.26514.55078-.59229.15039A136.1132,136.1132,0,0,1,813.38612,577.89329Z"
|
|
159
|
+
transform="translate(-255 -225.6204)"
|
|
160
|
+
fill="#000000"
|
|
161
|
+
/>
|
|
162
|
+
<path
|
|
163
|
+
d="M765.98622,559.08958s-65-6-72,13,1,28,13,32,41,9,41,9l13-16,34,2s37.88482,21.9732,48.35975,45.47377A30.76193,30.76193,0,0,0,869.12343,662.802c8.398.58447,15.86279-2.5874,15.86279-15.7124,0-30-42-73-42-73Z"
|
|
164
|
+
transform="translate(-255 -225.6204)"
|
|
165
|
+
fill="#2f2e41"
|
|
166
|
+
/>
|
|
167
|
+
<path
|
|
168
|
+
d="M716.48622,588.58958s17-5,44,8"
|
|
169
|
+
transform="translate(-255 -225.6204)"
|
|
170
|
+
fill="#2f2e41"
|
|
171
|
+
/>
|
|
172
|
+
<path
|
|
173
|
+
d="M766.84286,417.85547a73.04115,73.04115,0,0,0,31.59919,10.4119l-3.33084-3.991a24.4775,24.4775,0,0,0,7.5611,1.50142,8.28066,8.28066,0,0,0,6.74954-3.15917,7.70229,7.70229,0,0,0,.51556-7.115,14.58851,14.58851,0,0,0-4.58936-5.7385,27.32286,27.32286,0,0,0-25.43066-4.54493,16.32974,16.32974,0,0,0-7.59542,4.8722,9.23578,9.23578,0,0,0-1.86256,8.56086"
|
|
174
|
+
transform="translate(-255 -225.6204)"
|
|
175
|
+
fill="#2f2e41"
|
|
176
|
+
/>
|
|
177
|
+
<path
|
|
178
|
+
d="M795.30911,398.22407A75.48468,75.48468,0,0,1,814.446,371.70269c5.292-4.70276,11.47246-8.74308,18.44626-9.9627s14.83309.86982,19.11055,6.51116c3.49772,4.613,4.15213,10.79276,3.76672,16.569s-1.67632,11.49651-1.5527,17.28428a35.46794,35.46794,0,0,0,50.52712,31.351c-6.02152,3.32885-10.714,8.59777-16.3048,12.60812s-12.96272,6.7601-19.31233,4.11012c-6.71812-2.80378-9.79963-10.41937-12.20607-17.28984L846.189,402.2443c-1.82434-5.20852-3.739-10.57156-7.462-14.6454s-9.76461-6.5568-14.88927-4.50871c-3.884,1.55225-6.41275,5.25755-8.63029,8.804s-4.557,7.31984-8.30359,9.17935-9.29837.7147-10.52292-3.28471"
|
|
179
|
+
transform="translate(-255 -225.6204)"
|
|
180
|
+
fill="#2f2e41"
|
|
181
|
+
/>
|
|
182
|
+
<rect
|
|
183
|
+
x="802.91902"
|
|
184
|
+
y="543.31418"
|
|
185
|
+
width="9.88235"
|
|
186
|
+
height="46.58824"
|
|
187
|
+
transform="translate(-416.74744 524.13837) rotate(-45.74128)"
|
|
188
|
+
fill="#e6e6e6"
|
|
189
|
+
/>
|
|
190
|
+
<path
|
|
191
|
+
d="M821.51005,579.90944a9.88235,9.88235,0,1,0,13.97459-.18081A9.88238,9.88238,0,0,0,821.51005,579.90944Zm10.111,9.8527a4.23529,4.23529,0,1,1-.07749-5.98911A4.2354,4.2354,0,0,1,831.62105,589.76214Z"
|
|
192
|
+
transform="translate(-255 -225.6204)"
|
|
193
|
+
fill="#e6e6e6"
|
|
194
|
+
/>
|
|
195
|
+
<path
|
|
196
|
+
d="M784.47962,533.54889l4.69037,4.7178-2.28023,8.096-8.3137,2.02755-4.358-4.38337a11.99891,11.99891,0,1,0,10.26158-10.458Z"
|
|
197
|
+
transform="translate(-255 -225.6204)"
|
|
198
|
+
fill="#e6e6e6"
|
|
199
|
+
/>
|
|
200
|
+
<path
|
|
201
|
+
d="M803.736,577.97923a11.579,11.579,0,0,1-1.26831-.07032,11.02341,11.02341,0,0,1-9.68018-9.68115,11.00337,11.00337,0,0,1,10.93115-12.25,10.62483,10.62483,0,0,1,1.46607.10938L838.76332,520.342l-3.50513-11.68457,17.605-7.8916,4.93384,12.06006a20.48972,20.48972,0,0,1-6.17724,23.67236l-36.96119,29.40088a10.25885,10.25885,0,0,1,.06006,1.07861,11.01824,11.01824,0,0,1-3.66382,8.19678A10.87186,10.87186,0,0,1,803.736,577.97923Z"
|
|
202
|
+
transform="translate(-255 -225.6204)"
|
|
203
|
+
fill="#ffb8b8"
|
|
204
|
+
/>
|
|
205
|
+
<path
|
|
206
|
+
d="M829.98622,459.08958h0a9.45335,9.45335,0,0,1,12.628,5.1563l17.372,43.84371-27,18Z"
|
|
207
|
+
transform="translate(-255 -225.6204)"
|
|
208
|
+
fill="#000000"
|
|
209
|
+
/>
|
|
210
|
+
<path
|
|
211
|
+
d="M703.48622,469.32728V250.8827a25.29812,25.29812,0,0,0-25.2623-25.2623H334.95386a25.29813,25.29813,0,0,0-25.2623,25.2623V469.32728a25.29813,25.29813,0,0,0,25.2623,25.2623H678.22392A25.29812,25.29812,0,0,0,703.48622,469.32728ZM334.95386,491.61754a22.31743,22.31743,0,0,1-22.29026-22.29026V250.8827a22.31744,22.31744,0,0,1,22.29026-22.29027H678.22392a22.31744,22.31744,0,0,1,22.29027,22.29027V469.32728a22.31744,22.31744,0,0,1-22.29027,22.29026Z"
|
|
212
|
+
transform="translate(-255 -225.6204)"
|
|
213
|
+
fill="#3f3d56"
|
|
214
|
+
/>
|
|
215
|
+
<path
|
|
216
|
+
d="M700.51419,264.92368H312.6636a1.486,1.486,0,1,1,0-2.972H700.51419a1.486,1.486,0,0,1,0,2.972Z"
|
|
217
|
+
transform="translate(-255 -225.6204)"
|
|
218
|
+
fill="#3f3d56"
|
|
219
|
+
/>
|
|
220
|
+
<circle cx="82.9259" cy="20.80425" r="7.43009" fill="#000000" />
|
|
221
|
+
<circle cx="108.1882" cy="20.80425" r="7.43009" fill="#000000" />
|
|
222
|
+
<circle cx="133.4505" cy="20.80425" r="7.43009" fill="#000000" />
|
|
223
|
+
<path
|
|
224
|
+
d="M443.97867,424.85206a.99974.99974,0,0,1-1-1c0-10.42675-4.5708-16.24218-11.94531-22.24707a.99992.99992,0,1,1,1.2627-1.55078c7.83007,6.375,12.68261,12.58008,12.68261,23.79785A.99973.99973,0,0,1,443.97867,424.85206Z"
|
|
225
|
+
transform="translate(-255 -225.6204)"
|
|
226
|
+
/>
|
|
227
|
+
<path
|
|
228
|
+
d="M358.31656,424.85206a.99974.99974,0,0,1-1-1c0-11.21777,4.85254-17.42285,12.68262-23.79785a.99992.99992,0,1,1,1.2627,1.55078c-7.37452,6.00489-11.94532,11.82129-11.94532,22.24707A.99973.99973,0,0,1,358.31656,424.85206Z"
|
|
229
|
+
transform="translate(-255 -225.6204)"
|
|
230
|
+
/>
|
|
231
|
+
<path
|
|
232
|
+
d="M435.41324,356.32179a1,1,0,0,1-.63183-1.77539c7.58056-6.17139,8.19726-14.93848,8.19726-24.92334a1,1,0,0,1,2,0c0,10.50488-.67236,19.74756-8.93457,26.47412A.99381.99381,0,0,1,435.41324,356.32179Z"
|
|
233
|
+
transform="translate(-255 -225.6204)"
|
|
234
|
+
/>
|
|
235
|
+
<path
|
|
236
|
+
d="M366.88248,355.78663a.99383.99383,0,0,1-.63086-.22461c-8.26269-6.72705-8.93506-15.72705-8.93506-25.939a1,1,0,0,1,2,0c0,10.03662.60352,18.20557,8.19776,24.38818a1,1,0,0,1-.63184,1.77539Z"
|
|
237
|
+
transform="translate(-255 -225.6204)"
|
|
238
|
+
/>
|
|
239
|
+
<path
|
|
240
|
+
d="M456.82828,377.77247H435.41276a1,1,0,0,1,0-2h21.41552a1,1,0,1,1,0,2Z"
|
|
241
|
+
transform="translate(-255 -225.6204)"
|
|
242
|
+
/>
|
|
243
|
+
<path
|
|
244
|
+
d="M366.883,377.77247H345.46744a1,1,0,0,1,0-2H366.883a1,1,0,0,1,0,2Z"
|
|
245
|
+
transform="translate(-255 -225.6204)"
|
|
246
|
+
/>
|
|
247
|
+
<path
|
|
248
|
+
d="M401.14762,420.56886a.99974.99974,0,0,1-1-1V351.03908a1,1,0,0,1,2,0v68.52978A.99974.99974,0,0,1,401.14762,420.56886Z"
|
|
249
|
+
transform="translate(-255 -225.6204)"
|
|
250
|
+
/>
|
|
251
|
+
<path
|
|
252
|
+
d="M401.14762,420.56886A35.30522,35.30522,0,0,1,365.883,385.30372V359.58644c0-16.46826,13.5127-26.69873,35.26465-26.69873,22.74121,0,35.26514,9.48193,35.26514,26.69873v25.71728A35.30533,35.30533,0,0,1,401.14762,420.56886Zm0-85.68115c-16.08106,0-33.26465,6.48828-33.26465,24.69873v25.71728a33.2649,33.2649,0,1,0,66.52979,0V359.58644C434.41276,338.09669,413.571,334.88771,401.14762,334.88771Z"
|
|
253
|
+
transform="translate(-255 -225.6204)"
|
|
254
|
+
/>
|
|
255
|
+
<path
|
|
256
|
+
d="M380.651,339.06154a1.0002,1.0002,0,0,1-.9292-.62989,14.08794,14.08794,0,0,1-.98828-4.53173A22.47566,22.47566,0,0,1,401.089,311.49074h.11475a22.46679,22.46679,0,0,1,22.35938,22.35693,12.22735,12.22735,0,0,1-.91016,4.21094,1,1,0,0,1-1.84961-.76075,10.19507,10.19507,0,0,0,.76074-3.4873,20.45407,20.45407,0,0,0-20.36279-20.31982h-.10986a20.46143,20.46143,0,0,0-20.35938,20.36181,12.07569,12.07569,0,0,0,.84717,3.83789,1.00121,1.00121,0,0,1-.92822,1.3711Z"
|
|
257
|
+
transform="translate(-255 -225.6204)"
|
|
258
|
+
/>
|
|
259
|
+
<path
|
|
260
|
+
d="M502.71045,333.62308h-12a7,7,0,0,1,0-14h12a7,7,0,0,1,0,14Z"
|
|
261
|
+
transform="translate(-255 -225.6204)"
|
|
262
|
+
fill="#ccc"
|
|
263
|
+
/>
|
|
264
|
+
<path
|
|
265
|
+
d="M584.71045,363.12308h-12a7,7,0,0,1,0-14h12a7,7,0,0,1,0,14Z"
|
|
266
|
+
transform="translate(-255 -225.6204)"
|
|
267
|
+
fill="#ccc"
|
|
268
|
+
/>
|
|
269
|
+
<path
|
|
270
|
+
d="M622.71045,363.12308h-12a7,7,0,0,1,0-14h12a7,7,0,0,1,0,14Z"
|
|
271
|
+
transform="translate(-255 -225.6204)"
|
|
272
|
+
fill="#ccc"
|
|
273
|
+
/>
|
|
274
|
+
<path
|
|
275
|
+
d="M660.71045,363.12308h-12a7,7,0,0,1,0-14h12a7,7,0,0,1,0,14Z"
|
|
276
|
+
transform="translate(-255 -225.6204)"
|
|
277
|
+
fill="#ccc"
|
|
278
|
+
/>
|
|
279
|
+
<path
|
|
280
|
+
d="M585.71045,334.12308h-56a7,7,0,0,1,0-14h56a7,7,0,0,1,0,14Z"
|
|
281
|
+
transform="translate(-255 -225.6204)"
|
|
282
|
+
fill="#ccc"
|
|
283
|
+
/>
|
|
284
|
+
<path
|
|
285
|
+
d="M546.71045,362.12308h-56a7,7,0,0,1,0-14h56a7,7,0,0,1,0,14Z"
|
|
286
|
+
transform="translate(-255 -225.6204)"
|
|
287
|
+
fill="#ccc"
|
|
288
|
+
/>
|
|
289
|
+
<path
|
|
290
|
+
d="M656.71045,334.12308h-43a7,7,0,0,1,0-14h43a7,7,0,0,1,0,14Z"
|
|
291
|
+
transform="translate(-255 -225.6204)"
|
|
292
|
+
fill="#ccc"
|
|
293
|
+
/>
|
|
294
|
+
<path
|
|
295
|
+
d="M502.71045,392.62308h-12a7,7,0,0,1,0-14h12a7,7,0,0,1,0,14Z"
|
|
296
|
+
transform="translate(-255 -225.6204)"
|
|
297
|
+
fill="#ccc"
|
|
298
|
+
/>
|
|
299
|
+
<path
|
|
300
|
+
d="M585.71045,393.12308h-56a7,7,0,0,1,0-14h56a7,7,0,0,1,0,14Z"
|
|
301
|
+
transform="translate(-255 -225.6204)"
|
|
302
|
+
fill="#ccc"
|
|
303
|
+
/>
|
|
304
|
+
<path
|
|
305
|
+
d="M656.71045,393.12308h-43a7,7,0,0,1,0-14h43a7,7,0,0,1,0,14Z"
|
|
306
|
+
transform="translate(-255 -225.6204)"
|
|
307
|
+
fill="#ccc"
|
|
308
|
+
/>
|
|
309
|
+
<path
|
|
310
|
+
d="M637.71045,416.62308a7.00786,7.00786,0,0,1,7-7h12a7,7,0,0,1,0,14h-12A7.00785,7.00785,0,0,1,637.71045,416.62308Z"
|
|
311
|
+
transform="translate(-255 -225.6204)"
|
|
312
|
+
fill="#ccc"
|
|
313
|
+
/>
|
|
314
|
+
<path
|
|
315
|
+
d="M554.71045,417.12308a7.00786,7.00786,0,0,1,7-7h56a7,7,0,0,1,0,14h-56A7.00785,7.00785,0,0,1,554.71045,417.12308Z"
|
|
316
|
+
transform="translate(-255 -225.6204)"
|
|
317
|
+
fill="#ccc"
|
|
318
|
+
/>
|
|
319
|
+
<path
|
|
320
|
+
d="M483.71045,417.12308a7.00786,7.00786,0,0,1,7-7h43a7,7,0,0,1,0,14h-43A7.00785,7.00785,0,0,1,483.71045,417.12308Z"
|
|
321
|
+
transform="translate(-255 -225.6204)"
|
|
322
|
+
fill="#ccc"
|
|
323
|
+
/>
|
|
324
|
+
</motion.svg>
|
|
325
|
+
);
|
|
326
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { Inter } from "next/font/google";
|
|
3
|
+
import "./globals.css";
|
|
4
|
+
import { Providers } from "@/components/providers";
|
|
5
|
+
|
|
6
|
+
const inter = Inter({ subsets: ["latin"] });
|
|
7
|
+
|
|
8
|
+
export const metadata: Metadata = {
|
|
9
|
+
title: "Create Next App",
|
|
10
|
+
description: "Generated by create next app",
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default function RootLayout({
|
|
14
|
+
children,
|
|
15
|
+
}: {
|
|
16
|
+
children: React.ReactNode;
|
|
17
|
+
}) {
|
|
18
|
+
return (
|
|
19
|
+
<html lang="en" suppressHydrationWarning>
|
|
20
|
+
<head>
|
|
21
|
+
<meta httpEquiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
|
22
|
+
<meta name="renderer" content="webkit" />
|
|
23
|
+
<meta
|
|
24
|
+
name="viewport"
|
|
25
|
+
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
|
|
26
|
+
/>
|
|
27
|
+
{/* eslint-disable-next-line @next/next/no-before-interactive-script-outside-document */}
|
|
28
|
+
<script
|
|
29
|
+
dangerouslySetInnerHTML={{
|
|
30
|
+
__html: `
|
|
31
|
+
(function() {
|
|
32
|
+
var isIE = /MSIE|Trident/.test(navigator.userAgent);
|
|
33
|
+
var isOldIE = /MSIE [1-9]\\.|MSIE 10\\./.test(navigator.userAgent);
|
|
34
|
+
if (isOldIE) {
|
|
35
|
+
window.location.href = '/ie.html';
|
|
36
|
+
}
|
|
37
|
+
})();
|
|
38
|
+
`,
|
|
39
|
+
}}
|
|
40
|
+
/>
|
|
41
|
+
</head>
|
|
42
|
+
<body className={inter.className} suppressHydrationWarning>
|
|
43
|
+
<Providers>{children}</Providers>
|
|
44
|
+
</body>
|
|
45
|
+
</html>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import Link from "next/link";
|
|
2
|
+
|
|
3
|
+
export default function NotFound() {
|
|
4
|
+
return (
|
|
5
|
+
<div className="flex min-h-screen flex-col items-center justify-center">
|
|
6
|
+
<h2 className="text-2xl font-bold">页面未找到</h2>
|
|
7
|
+
<p className="mt-4 text-gray-600">抱歉,您访问的页面不存在。</p>
|
|
8
|
+
<Link
|
|
9
|
+
href="/"
|
|
10
|
+
className="mt-6 rounded bg-blue-500 px-4 py-2 text-white hover:bg-blue-600"
|
|
11
|
+
>
|
|
12
|
+
返回首页
|
|
13
|
+
</Link>
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
|
|
5
|
+
import pkg from "../../package.json";
|
|
6
|
+
|
|
7
|
+
export default function BuildInfo() {
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const print = (key: string, value: string) =>
|
|
10
|
+
console.log(
|
|
11
|
+
`%c ${key} %c ${value} %c `,
|
|
12
|
+
"background:#20232a ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff",
|
|
13
|
+
"background:#61dafb ;padding: 1px; border-radius: 0 3px 3px 0; color: #20232a; font-weight: bold;",
|
|
14
|
+
"background:transparent"
|
|
15
|
+
);
|
|
16
|
+
print(pkg.name, pkg.version);
|
|
17
|
+
print("build time", `${process.env.NEXT_PUBLIC_BUILD_TIME}`);
|
|
18
|
+
}, []);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ThemeProvider } from "./theme";
|
|
2
|
+
import { QueryProvider } from "./query";
|
|
3
|
+
import { Toaster } from "sonner";
|
|
4
|
+
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
5
|
+
|
|
6
|
+
export function Providers({ children }: React.PropsWithChildren) {
|
|
7
|
+
return (
|
|
8
|
+
<QueryProvider>
|
|
9
|
+
<ThemeProvider>
|
|
10
|
+
<TooltipProvider>{children}</TooltipProvider>
|
|
11
|
+
<Toaster position="top-right" richColors />
|
|
12
|
+
</ThemeProvider>
|
|
13
|
+
</QueryProvider>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
4
|
+
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
|
|
7
|
+
export function QueryProvider({ children }: { children: React.ReactNode }) {
|
|
8
|
+
const [queryClient] = useState(
|
|
9
|
+
() =>
|
|
10
|
+
new QueryClient({
|
|
11
|
+
defaultOptions: {
|
|
12
|
+
queries: {
|
|
13
|
+
// 数据缓存时间 (默认 5 分钟)
|
|
14
|
+
staleTime: 5 * 60 * 1000,
|
|
15
|
+
// 数据在内存中的缓存时间 (默认 5 分钟)
|
|
16
|
+
gcTime: 5 * 60 * 1000,
|
|
17
|
+
// 重试次数
|
|
18
|
+
retry: 3,
|
|
19
|
+
// 重试延迟
|
|
20
|
+
retryDelay: (attemptIndex) =>
|
|
21
|
+
Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
22
|
+
// 窗口重新获得焦点时是否重新获取数据
|
|
23
|
+
refetchOnWindowFocus: false,
|
|
24
|
+
// 网络重新连接时是否重新获取数据
|
|
25
|
+
refetchOnReconnect: true,
|
|
26
|
+
},
|
|
27
|
+
mutations: {
|
|
28
|
+
// 重试次数
|
|
29
|
+
retry: 1,
|
|
30
|
+
// 重试延迟
|
|
31
|
+
retryDelay: 1000,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<QueryClientProvider client={queryClient}>
|
|
39
|
+
{children}
|
|
40
|
+
{/* {process.env.NODE_ENV === 'development' && (
|
|
41
|
+
<ReactQueryDevtools initialIsOpen={false} />
|
|
42
|
+
)} */}
|
|
43
|
+
</QueryClientProvider>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { ThemeProvider as NextThemesProvider } from "next-themes";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
|
|
6
|
+
export function ThemeProvider({ children }: React.PropsWithChildren) {
|
|
7
|
+
return (
|
|
8
|
+
<NextThemesProvider
|
|
9
|
+
attribute="class"
|
|
10
|
+
defaultTheme="system"
|
|
11
|
+
enableSystem
|
|
12
|
+
disableTransitionOnChange
|
|
13
|
+
>
|
|
14
|
+
{children}
|
|
15
|
+
</NextThemesProvider>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP 请求类封装(强类型,无 any)
|
|
3
|
+
* 配合 React Query 使用,简化超时和重试逻辑
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { toast } from "sonner";
|
|
7
|
+
|
|
8
|
+
interface RequestConfig {
|
|
9
|
+
baseURL?: string;
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface RequestOptions extends RequestInit {
|
|
14
|
+
params?: Record<string, string | number | boolean>;
|
|
15
|
+
data?: unknown; // 用于传递请求体
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface ApiResponse<T> {
|
|
19
|
+
data: T;
|
|
20
|
+
status?: number;
|
|
21
|
+
ok?: boolean;
|
|
22
|
+
code?: number; // 后端业务状态码
|
|
23
|
+
msg?: string | null; // 后端消息
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 后端 API 响应结构
|
|
27
|
+
interface BackendResponse<T> {
|
|
28
|
+
code: number;
|
|
29
|
+
msg: string | null;
|
|
30
|
+
data: T;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class HttpClient {
|
|
34
|
+
private baseURL: string;
|
|
35
|
+
private defaultHeaders: Record<string, string>;
|
|
36
|
+
|
|
37
|
+
constructor(config: RequestConfig = {}) {
|
|
38
|
+
this.baseURL = config.baseURL || "";
|
|
39
|
+
this.defaultHeaders = {
|
|
40
|
+
"Content-Type": "application/json",
|
|
41
|
+
...config.headers,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
updateToken(token: string) {
|
|
45
|
+
// this.defaultHeaders['Authorization'] = `Bearer ${token}`;
|
|
46
|
+
this.defaultHeaders["token"] = `${token}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private buildURL(url: string, params?: Record<string, unknown>): string {
|
|
50
|
+
let fullURL = url.startsWith("http") ? url : `${this.baseURL}${url}`;
|
|
51
|
+
|
|
52
|
+
if (params) {
|
|
53
|
+
const searchParams = new URLSearchParams();
|
|
54
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
55
|
+
if (value !== null && value !== undefined) {
|
|
56
|
+
searchParams.append(key, String(value));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const paramString = searchParams.toString();
|
|
60
|
+
if (paramString) {
|
|
61
|
+
fullURL += `${fullURL.includes("?") ? "&" : "?"}${paramString}`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return fullURL;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async request<T>(
|
|
69
|
+
url: string,
|
|
70
|
+
options: RequestOptions = {}
|
|
71
|
+
): Promise<ApiResponse<T>> {
|
|
72
|
+
const { params, data, ...fetchOptions } = options;
|
|
73
|
+
|
|
74
|
+
const fullURL = this.buildURL(url, params);
|
|
75
|
+
|
|
76
|
+
const headers: HeadersInit = {
|
|
77
|
+
...this.defaultHeaders,
|
|
78
|
+
...(fetchOptions.headers || {}),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
let body = fetchOptions.body;
|
|
82
|
+
|
|
83
|
+
// 如果提供了 data,优先使用
|
|
84
|
+
if (data !== undefined) {
|
|
85
|
+
if (data instanceof FormData) {
|
|
86
|
+
body = data;
|
|
87
|
+
Reflect.deleteProperty(headers, "Content-Type"); // FormData 不需要手动设置 Content-Type
|
|
88
|
+
} else {
|
|
89
|
+
body = JSON.stringify(data);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const response = await fetch(fullURL, {
|
|
94
|
+
...fetchOptions,
|
|
95
|
+
headers,
|
|
96
|
+
body,
|
|
97
|
+
});
|
|
98
|
+
const contentType = response.headers.get("content-type");
|
|
99
|
+
let responseData: T;
|
|
100
|
+
if (contentType?.includes("application/json")) {
|
|
101
|
+
const jsonResponse: BackendResponse<T> = await response.json();
|
|
102
|
+
if (jsonResponse.code == 401) {
|
|
103
|
+
// 清除本地存储
|
|
104
|
+
localStorage.clear();
|
|
105
|
+
|
|
106
|
+
// 退出用户状态
|
|
107
|
+
if (typeof window !== "undefined") {
|
|
108
|
+
// 动态导入store避免循环依赖
|
|
109
|
+
import("@/store")
|
|
110
|
+
.then(({ useStore }) => {
|
|
111
|
+
const { logout, openLoginDialog } = useStore.getState();
|
|
112
|
+
logout();
|
|
113
|
+
openLoginDialog();
|
|
114
|
+
})
|
|
115
|
+
.catch(console.error);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
toast.error("登录信息已过期,请重新登录");
|
|
119
|
+
}
|
|
120
|
+
return jsonResponse;
|
|
121
|
+
} else if (contentType?.startsWith("text/")) {
|
|
122
|
+
responseData = (await response.text()) as T;
|
|
123
|
+
} else {
|
|
124
|
+
responseData = (await response.blob()) as T;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
data: responseData,
|
|
129
|
+
status: response.status,
|
|
130
|
+
ok: response.ok,
|
|
131
|
+
};
|
|
132
|
+
} catch (error: unknown) {
|
|
133
|
+
if (error instanceof Error) {
|
|
134
|
+
throw new Error(error.message);
|
|
135
|
+
}
|
|
136
|
+
throw new Error("网络请求失败");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// GET 请求
|
|
141
|
+
get<T>(
|
|
142
|
+
url: string,
|
|
143
|
+
params?: Record<string, string | number | boolean>,
|
|
144
|
+
options?: Omit<RequestOptions, "params">
|
|
145
|
+
) {
|
|
146
|
+
return this.request<T>(url, { ...options, method: "GET", params });
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// POST 请求
|
|
150
|
+
post<T = unknown, B = unknown>(
|
|
151
|
+
url: string,
|
|
152
|
+
data?: B,
|
|
153
|
+
options?: Omit<RequestOptions, "data">
|
|
154
|
+
) {
|
|
155
|
+
return this.request<T>(url, { ...options, method: "POST", data });
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// PUT 请求
|
|
159
|
+
put<T = unknown, B = unknown>(
|
|
160
|
+
url: string,
|
|
161
|
+
data?: B,
|
|
162
|
+
options?: Omit<RequestOptions, "data">
|
|
163
|
+
) {
|
|
164
|
+
return this.request<T>(url, { ...options, method: "PUT", data });
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// PATCH 请求
|
|
168
|
+
patch<T = unknown, B = unknown>(
|
|
169
|
+
url: string,
|
|
170
|
+
data?: B,
|
|
171
|
+
options?: Omit<RequestOptions, "data">
|
|
172
|
+
) {
|
|
173
|
+
return this.request<T>(url, { ...options, method: "PATCH", data });
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// DELETE 请求
|
|
177
|
+
delete<T = unknown>(url: string, options?: RequestOptions) {
|
|
178
|
+
return this.request<T>(url, { ...options, method: "DELETE" });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// 上传文件
|
|
182
|
+
upload<T = unknown>(
|
|
183
|
+
url: string,
|
|
184
|
+
formData: FormData,
|
|
185
|
+
options?: Omit<RequestOptions, "data" | "body">
|
|
186
|
+
) {
|
|
187
|
+
return this.request<T>(url, { ...options, method: "POST", data: formData });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// 创建默认实例
|
|
192
|
+
export const http = new HttpClient({
|
|
193
|
+
baseURL: `${process.env.NEXT_PUBLIC_API_URL || "/api"}`,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// 快捷导出函数
|
|
197
|
+
export const get = http.get.bind(http);
|
|
198
|
+
export const post = http.post.bind(http);
|
|
199
|
+
export const put = http.put.bind(http);
|
|
200
|
+
export const patch = http.patch.bind(http);
|
|
201
|
+
export const del = http.delete.bind(http);
|
|
202
|
+
export const upload = http.upload.bind(http);
|
|
203
|
+
|
|
204
|
+
export default http;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-web-kit",
|
|
3
|
-
"version": "25.0728.
|
|
3
|
+
"version": "25.0728.1502",
|
|
4
4
|
"description": "A powerful scaffolding tool for creating modern frontend projects with Vue, Next.js, and Electron templates",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"node": "^18.0.0 || >=20.0.0"
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
|
-
"build": "tsc -d --outDir dist",
|
|
16
|
+
"build": "tsc -d --outDir dist && node scripts/copy-templates.mjs",
|
|
17
17
|
"dev": "pnpx tsx src/index.ts",
|
|
18
18
|
"start": "node dist/index.js"
|
|
19
19
|
},
|