create-young-proj 1.5.0 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +33 -0
- package/package.json +1 -1
- package/template-nuxt-admin/README.md +1 -1
- package/template-nuxt-admin/nuxt.config.ts +4 -5
- package/template-nuxt-admin/package.json +0 -1
- package/template-nuxt-admin/server/plugins/env.ts +8 -0
- package/template-nuxt-admin/yarn.lock +0 -5
- package/template-nuxt-mobile/.nvmrc +1 -0
- package/{template-vue-mobile → template-nuxt-mobile}/.vscode/extensions.json +5 -3
- package/template-nuxt-mobile/.vscode/settings.json +39 -0
- package/{template-vue-mobile → template-nuxt-mobile}/Dockerfile +12 -13
- package/template-nuxt-mobile/README.md +90 -0
- package/template-nuxt-mobile/_gitignore +26 -0
- package/template-nuxt-mobile/_npmrc +2 -0
- package/template-nuxt-mobile/_nvmrc +1 -0
- package/template-nuxt-mobile/app.vue +79 -0
- package/template-nuxt-mobile/boot.mjs +17 -0
- package/template-nuxt-mobile/components/young/CodeInput.vue +72 -0
- package/template-nuxt-mobile/composables/api.ts +57 -0
- package/template-nuxt-mobile/composables/apis/get.ts +22 -0
- package/template-nuxt-mobile/composables/apis/index.ts +8 -0
- package/template-nuxt-mobile/composables/apis/post.ts +39 -0
- package/template-nuxt-mobile/composables/share.ts +22 -0
- package/template-nuxt-mobile/composables/user.ts +48 -0
- package/template-nuxt-mobile/composables/utils.ts +80 -0
- package/template-nuxt-mobile/config/.devrc +2 -0
- package/template-nuxt-mobile/env.d.ts +65 -0
- package/template-nuxt-mobile/error.vue +69 -0
- package/template-nuxt-mobile/eslint.config.js +33 -0
- package/template-nuxt-mobile/layouts/blank.vue +11 -0
- package/template-nuxt-mobile/layouts/default.vue +32 -0
- package/template-nuxt-mobile/layouts/tabbar.vue +29 -0
- package/template-nuxt-mobile/middleware/auth.global.ts +34 -0
- package/template-nuxt-mobile/nuxt.config.ts +78 -0
- package/template-nuxt-mobile/package.json +40 -0
- package/template-nuxt-mobile/pages/base/login.vue +124 -0
- package/template-nuxt-mobile/pages/base/resetPasswd.vue +84 -0
- package/template-nuxt-mobile/pages/index.vue +22 -0
- package/template-nuxt-mobile/pages/my.vue +18 -0
- package/template-nuxt-mobile/pages/sub/[id].vue +21 -0
- package/template-nuxt-mobile/public/favicon.ico +0 -0
- package/template-nuxt-mobile/public/robots.txt +2 -0
- package/template-nuxt-mobile/server/plugins/init.ts +94 -0
- package/template-nuxt-mobile/server/routes/get/env.ts +13 -0
- package/template-nuxt-mobile/server/tsconfig.json +3 -0
- package/template-nuxt-mobile/server/utils/index.ts +12 -0
- package/template-nuxt-mobile/server/utils/proxy.ts +59 -0
- package/template-nuxt-mobile/tsconfig.json +4 -0
- package/template-nuxt-mobile/typings/system.d.ts +22 -0
- package/template-nuxt-mobile/uno.config.ts +40 -0
- package/template-nuxt-mobile/utils/tool.ts +153 -0
- package/template-nuxt-mobile/yarn.lock +7737 -0
- package/template-nuxt-website/README.md +3 -1
- package/template-nuxt-website/nuxt.config.ts +4 -5
- package/template-vitepress/.vitepress/components/HomePage.vue +9 -7
- package/template-vitepress/.vitepress/components/TodoItem.vue +7 -3
- package/template-vitepress/.vscode/settings.json +39 -0
- package/template-vitepress/README.md +2 -0
- package/template-vitepress/boot.mjs +7 -8
- package/template-vitepress/eslint.config.js +46 -0
- package/template-vitepress/nitro.config.ts +1 -2
- package/template-vitepress/package.json +19 -6
- package/template-vitepress/tsconfig.json +1 -1
- package/template-vitepress/yarn.lock +5459 -0
- package/template-vue-mobile/.vscode/base.code-snippets +0 -24
- package/template-vue-mobile/.vscode/settings.json +0 -7
- package/template-vue-mobile/README.md +0 -71
- package/template-vue-mobile/_env +0 -6
- package/template-vue-mobile/_gitignore +0 -30
- package/template-vue-mobile/boot.mjs +0 -16
- package/template-vue-mobile/build/custom-plugin.ts +0 -30
- package/template-vue-mobile/build/index.ts +0 -7
- package/template-vue-mobile/build/plugins.ts +0 -68
- package/template-vue-mobile/config/.devrc +0 -2
- package/template-vue-mobile/index.html +0 -25
- package/template-vue-mobile/nitro.config.ts +0 -19
- package/template-vue-mobile/package.json +0 -48
- package/template-vue-mobile/plugins/env.ts +0 -26
- package/template-vue-mobile/public/vite.svg +0 -1
- package/template-vue-mobile/rome.json +0 -24
- package/template-vue-mobile/routes/[...all].ts +0 -11
- package/template-vue-mobile/routes/get/env.ts +0 -25
- package/template-vue-mobile/src/App.vue +0 -29
- package/template-vue-mobile/src/auto-components.d.ts +0 -24
- package/template-vue-mobile/src/auto-imports.d.ts +0 -289
- package/template-vue-mobile/src/components/Init.vue +0 -36
- package/template-vue-mobile/src/global.d.ts +0 -7
- package/template-vue-mobile/src/hooks/useVerifyCode.ts +0 -46
- package/template-vue-mobile/src/layouts/blank.vue +0 -9
- package/template-vue-mobile/src/layouts/default.vue +0 -27
- package/template-vue-mobile/src/layouts/sub.vue +0 -20
- package/template-vue-mobile/src/main.ts +0 -35
- package/template-vue-mobile/src/modules/1-router.ts +0 -40
- package/template-vue-mobile/src/modules/2-pinia.ts +0 -10
- package/template-vue-mobile/src/modules/3-net.ts +0 -46
- package/template-vue-mobile/src/modules/4-auth.ts +0 -64
- package/template-vue-mobile/src/views/[...all_404].vue +0 -557
- package/template-vue-mobile/src/views/base/login.vue +0 -110
- package/template-vue-mobile/src/views/base/resetPasswd.vue +0 -88
- package/template-vue-mobile/src/views/index.vue +0 -18
- package/template-vue-mobile/src/views/my.vue +0 -15
- package/template-vue-mobile/src/views/sub.vue +0 -18
- package/template-vue-mobile/src/vite-env.d.ts +0 -43
- package/template-vue-mobile/tsconfig.json +0 -21
- package/template-vue-mobile/tsconfig.node.json +0 -9
- package/template-vue-mobile/unocss.config.ts +0 -47
- package/template-vue-mobile/vite.config.ts +0 -32
- package/template-vue-mobile/yarn.lock +0 -4395
- /package/{template-vue-mobile → template-nuxt-mobile}/config/.onlinerc +0 -0
- /package/{template-vue-mobile → template-nuxt-mobile}/config/.testrc +0 -0
package/CHANGELOG.md
CHANGED
@@ -1,6 +1,39 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
3
|
|
4
|
+
## v1.6.1
|
5
|
+
|
6
|
+
[compare changes](https://github.com/BluesYoung-web/create-young-proj/compare/v1.6.0...v1.6.1)
|
7
|
+
|
8
|
+
### 🎨 Styles
|
9
|
+
|
10
|
+
- 🎨 add lint ([7c1538a](https://github.com/BluesYoung-web/create-young-proj/commit/7c1538a))
|
11
|
+
- 🎨 lint fix ([0ab6e4d](https://github.com/BluesYoung-web/create-young-proj/commit/0ab6e4d))
|
12
|
+
|
13
|
+
### ❤️ Contributors
|
14
|
+
|
15
|
+
- 张扬 <bluesyoung_web@163.com>
|
16
|
+
|
17
|
+
## v1.6.0
|
18
|
+
|
19
|
+
[compare changes](https://github.com/BluesYoung-web/create-young-proj/compare/v1.5.0...v1.6.0)
|
20
|
+
|
21
|
+
### 🚀 Enhancements
|
22
|
+
|
23
|
+
- 🚀 优化后台移动端表现 ([7895259](https://github.com/BluesYoung-web/create-young-proj/commit/7895259))
|
24
|
+
- 🚀 template-nuxt-mobile ([664dcdb](https://github.com/BluesYoung-web/create-young-proj/commit/664dcdb))
|
25
|
+
|
26
|
+
### 🏡 Chore
|
27
|
+
|
28
|
+
- 🏡 后台无用依赖删除 ([48ce806](https://github.com/BluesYoung-web/create-young-proj/commit/48ce806))
|
29
|
+
- 🏡 remove template-vue-mobile ([df30f76](https://github.com/BluesYoung-web/create-young-proj/commit/df30f76))
|
30
|
+
- 🏡 后台模板兼容配置调整 ([f662f94](https://github.com/BluesYoung-web/create-young-proj/commit/f662f94))
|
31
|
+
- 🏡 官网模板兼容配置调整 ([3138569](https://github.com/BluesYoung-web/create-young-proj/commit/3138569))
|
32
|
+
|
33
|
+
### ❤️ Contributors
|
34
|
+
|
35
|
+
- 张扬 <bluesyoung_web@163.com>
|
36
|
+
|
4
37
|
## v1.5.0
|
5
38
|
|
6
39
|
[compare changes](https://github.com/BluesYoung-web/create-young-proj/compare/v1.4.0...v1.5.0)
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-09-21 15:57:55
|
4
|
-
* @LastEditTime: 2023-11-
|
4
|
+
* @LastEditTime: 2023-11-30 11:03:49
|
5
5
|
* @Description:
|
6
6
|
*/
|
7
7
|
import { resolve } from 'node:path'
|
@@ -84,11 +84,10 @@ export default defineNuxtConfig({
|
|
84
84
|
|
85
85
|
vite: {
|
86
86
|
build: {
|
87
|
-
// 兼容钉钉浏览器
|
88
|
-
target: 'es2015',
|
89
87
|
sourcemap: false,
|
90
|
-
|
91
|
-
|
88
|
+
// 兼容旧浏览器
|
89
|
+
target: ['chrome58'],
|
90
|
+
cssTarget: ['chrome58'],
|
92
91
|
},
|
93
92
|
css: {
|
94
93
|
preprocessorOptions: {
|
@@ -62,6 +62,14 @@ export default defineNitroPlugin(async (nitroApp) => {
|
|
62
62
|
})
|
63
63
|
|
64
64
|
nitroApp.hooks.hook('render:html', (html, { event }) => {
|
65
|
+
// 设定视口高度,防止软键盘影响布局
|
66
|
+
html.bodyPrepend.push(`
|
67
|
+
<script>
|
68
|
+
const metaElement = document.querySelector('#viewportMeta');
|
69
|
+
metaElement.setAttribute('content', \`maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0,height=\${window.innerHeight}\`);
|
70
|
+
</script>
|
71
|
+
`)
|
72
|
+
|
65
73
|
// 直接注入环境变量到前端
|
66
74
|
html.bodyPrepend.push(`
|
67
75
|
<!-- 注入环境变量 -->
|
@@ -2284,11 +2284,6 @@ acorn@8.11.2, acorn@^8.10.0, acorn@^8.5.0, acorn@^8.6.0, acorn@^8.8.2, acorn@^8.
|
|
2284
2284
|
resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b"
|
2285
2285
|
integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
|
2286
2286
|
|
2287
|
-
add@^2.0.6:
|
2288
|
-
version "2.0.6"
|
2289
|
-
resolved "https://registry.npmmirror.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235"
|
2290
|
-
integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q==
|
2291
|
-
|
2292
2287
|
adler-32@~1.3.0:
|
2293
2288
|
version "1.3.1"
|
2294
2289
|
resolved "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
|
@@ -0,0 +1 @@
|
|
1
|
+
20.9.0
|
@@ -1,10 +1,12 @@
|
|
1
1
|
{
|
2
2
|
"recommendations": [
|
3
|
-
"
|
4
|
-
"
|
5
|
-
"
|
3
|
+
"dbaeumer.vscode-eslint",
|
4
|
+
"editorconfig.editorconfig",
|
5
|
+
"mhutchie.git-graph",
|
6
6
|
"vue.vscode-typescript-vue-plugin",
|
7
7
|
"antfu.unocss",
|
8
|
+
"antfu.vscode-server-controller",
|
9
|
+
"vue.volar",
|
8
10
|
"voorjaar.windicss-intellisense"
|
9
11
|
]
|
10
12
|
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
{
|
2
|
+
"prettier.enable": false,
|
3
|
+
"editor.formatOnSave": false,
|
4
|
+
|
5
|
+
// Enable the ESlint flat config support
|
6
|
+
"eslint.experimental.useFlatConfig": true,
|
7
|
+
// Auto fix
|
8
|
+
"editor.codeActionsOnSave": {
|
9
|
+
"source.fixAll.eslint": "explicit",
|
10
|
+
"source.organizeImports": "never"
|
11
|
+
},
|
12
|
+
|
13
|
+
// Silent the stylistic rules in you IDE, but still auto fix them
|
14
|
+
"eslint.rules.customizations": [
|
15
|
+
{ "rule": "style/*", "severity": "off" },
|
16
|
+
{ "rule": "*-indent", "severity": "off" },
|
17
|
+
{ "rule": "*-spacing", "severity": "off" },
|
18
|
+
{ "rule": "*-spaces", "severity": "off" },
|
19
|
+
{ "rule": "*-order", "severity": "off" },
|
20
|
+
{ "rule": "*-dangle", "severity": "off" },
|
21
|
+
{ "rule": "*-newline", "severity": "off" },
|
22
|
+
{ "rule": "*quotes", "severity": "off" },
|
23
|
+
{ "rule": "*semi", "severity": "off" }
|
24
|
+
],
|
25
|
+
|
26
|
+
// Enable eslint for all supported languages
|
27
|
+
"eslint.validate": [
|
28
|
+
"javascript",
|
29
|
+
"javascriptreact",
|
30
|
+
"typescript",
|
31
|
+
"typescriptreact",
|
32
|
+
"vue",
|
33
|
+
"html",
|
34
|
+
"markdown",
|
35
|
+
"json",
|
36
|
+
"jsonc",
|
37
|
+
"yaml"
|
38
|
+
]
|
39
|
+
}
|
@@ -1,8 +1,14 @@
|
|
1
1
|
# 拉取基础镜像
|
2
|
-
FROM node:
|
2
|
+
FROM intranet-harbor.laiyouxi.com/base/alpine/node:20.9.0 as builder
|
3
|
+
# 添加部分元数据,暂无意义
|
4
|
+
LABEL vendor="Lyx-yunwei" \
|
5
|
+
com.example.release-date="2022-11-10" \
|
6
|
+
com.example.version.is-production="false"
|
3
7
|
|
4
8
|
# 维护者
|
5
9
|
MAINTAINER BluesYoung "bluesyoung_web@163.com"
|
10
|
+
# 配置环境变量
|
11
|
+
ENV WORK_DIR=/app
|
6
12
|
|
7
13
|
# 工作目录
|
8
14
|
WORKDIR /app
|
@@ -23,20 +29,13 @@ COPY . /app
|
|
23
29
|
RUN yarn build
|
24
30
|
|
25
31
|
# 打包完成,构建最终的极简镜像
|
26
|
-
FROM node:
|
32
|
+
FROM intranet-harbor.laiyouxi.com/base/alpine/node:20.9.0
|
27
33
|
|
28
|
-
# 工作目录
|
29
34
|
WORKDIR /app
|
30
|
-
|
31
|
-
# 复制运行需要的文件[及依赖]
|
32
|
-
# 直接复制源代码
|
35
|
+
# 复制源码
|
33
36
|
COPY boot.mjs /app/
|
34
37
|
COPY config /app/config
|
35
|
-
#
|
36
|
-
COPY --from=builder /app
|
37
|
-
|
38
|
-
# 暴露指定的端口号,暂不需要
|
39
|
-
# EXPOSE 3001
|
38
|
+
# 复制编译后的代码
|
39
|
+
COPY --from=builder /app/dist /app/dist
|
40
40
|
|
41
|
-
|
42
|
-
ENTRYPOINT ["node", "boot.mjs"]
|
41
|
+
ENTRYPOINT ["node", "boot.mjs"]
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# 基于 Nuxt 3 的服务端渲染响应式网站
|
2
|
+
|
3
|
+
|
4
|
+
[![](https://img.shields.io/badge/Author-BluesYoung--web-blue)](https://gitee.com/BluesYoung-web)
|
5
|
+
|
6
|
+
[![code style](https://antfu.me/badge-code-style.svg)](https://github.com/antfu/eslint-config)
|
7
|
+
|
8
|
+
## 特性
|
9
|
+
|
10
|
+
- 基于 [@nuxtjs/device](https://github.com/nuxt-modules/device) 的设备判断
|
11
|
+
|
12
|
+
- 基于 [@unocss/nuxt](https://github.com/unocss/unocss) 的样式自动生成
|
13
|
+
|
14
|
+
- 理论最低兼容 `chrome58`
|
15
|
+
|
16
|
+
## 配套 git 提交工具
|
17
|
+
|
18
|
+
### 安装
|
19
|
+
|
20
|
+
```bash
|
21
|
+
npm i -g young-commit
|
22
|
+
```
|
23
|
+
|
24
|
+
### 使用
|
25
|
+
|
26
|
+
- 正常使用 `git add` 将要提交的文件添加到暂存区
|
27
|
+
|
28
|
+
- 提交步骤使用 `yc` 或者 `young-commit` 进行提交
|
29
|
+
|
30
|
+
#### 命令选项
|
31
|
+
|
32
|
+
- `yc -i` 初始化(仅刚创建项目时使用,会自动执行 `git init`)
|
33
|
+
|
34
|
+
- `yc -r` 进行版本发布,会根据之前的提交及最近一个 `tag` 生成 `changelog`
|
35
|
+
|
36
|
+
|
37
|
+
## 使用响应式布局
|
38
|
+
|
39
|
+
兼容 `PC` 端与移动端,大屏表现为 `800px` 居中
|
40
|
+
|
41
|
+
## 常用的操作
|
42
|
+
|
43
|
+
### 抛出错误
|
44
|
+
|
45
|
+
```ts
|
46
|
+
throw createError({ statusCode: 404, message: '数据迷路了' })
|
47
|
+
```
|
48
|
+
|
49
|
+
### 响应式屏幕尺寸
|
50
|
+
|
51
|
+
|
52
|
+
```ts
|
53
|
+
/*
|
54
|
+
export const WindowSize = reactive({
|
55
|
+
'lt-sm': useMediaQuery('(max-width: 639.9px)'),
|
56
|
+
'sm': useMediaQuery('(min-width: 640px)'),
|
57
|
+
'lt-md': useMediaQuery('(max-width: 767.9px)'),
|
58
|
+
'md': useMediaQuery('(min-width: 768px)'),
|
59
|
+
'lt-lg': useMediaQuery('(max-width: 1023.9px)'),
|
60
|
+
'lg': useMediaQuery('(min-width: 1024px)'),
|
61
|
+
'lt-xl': useMediaQuery('(max-width: 1279.9px)'),
|
62
|
+
'xl': useMediaQuery('(min-width: 1280px)'),
|
63
|
+
'lt-2xl': useMediaQuery('(max-width: 1535.9px)'),
|
64
|
+
'2xl': useMediaQuery('(min-width: 1536px)'),
|
65
|
+
});
|
66
|
+
*/
|
67
|
+
```
|
68
|
+
|
69
|
+
### 设备判断
|
70
|
+
|
71
|
+
```ts
|
72
|
+
const $device = useDevice()
|
73
|
+
|
74
|
+
$device.isDesktop
|
75
|
+
$device.isMobile
|
76
|
+
$device.isTablet
|
77
|
+
$device.isMobileOrTablet
|
78
|
+
$device.isDesktopOrTablet
|
79
|
+
$device.isIos
|
80
|
+
$device.isWindows
|
81
|
+
$device.isMacOS
|
82
|
+
$device.isApple
|
83
|
+
$device.isAndroid
|
84
|
+
$device.isFirefox
|
85
|
+
$device.isEdge
|
86
|
+
$device.isChrome
|
87
|
+
$device.isSafari
|
88
|
+
$device.isSamsung
|
89
|
+
$device.isCrawler
|
90
|
+
```
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Nuxt dev/build outputs
|
2
|
+
.output
|
3
|
+
.data
|
4
|
+
.nuxt
|
5
|
+
.nitro
|
6
|
+
.cache
|
7
|
+
dist
|
8
|
+
|
9
|
+
# Node dependencies
|
10
|
+
node_modules
|
11
|
+
|
12
|
+
# Logs
|
13
|
+
logs
|
14
|
+
*.log
|
15
|
+
|
16
|
+
# Misc
|
17
|
+
.DS_Store
|
18
|
+
.fleet
|
19
|
+
.idea
|
20
|
+
|
21
|
+
# Local env files
|
22
|
+
.env
|
23
|
+
.env.*
|
24
|
+
!.env.example
|
25
|
+
|
26
|
+
config/*.js
|
@@ -0,0 +1 @@
|
|
1
|
+
20.9.0
|
@@ -0,0 +1,79 @@
|
|
1
|
+
<!--
|
2
|
+
* @Author: zhangyang
|
3
|
+
* @Date: 2023-05-25 19:53:07
|
4
|
+
* @LastEditTime: 2023-11-29 16:57:22
|
5
|
+
* @Description:
|
6
|
+
-->
|
7
|
+
<script lang="ts" setup>
|
8
|
+
import '@unocss/reset/tailwind-compat.css'
|
9
|
+
|
10
|
+
const app = useNuxtApp()
|
11
|
+
|
12
|
+
// !!! 这两个钩子函数不能异步调用,否则会造成页面的 useFetch 报错 !!!
|
13
|
+
app.hook('page:start', () => {
|
14
|
+
// console.log('loading...');
|
15
|
+
showLoading()
|
16
|
+
})
|
17
|
+
// !!! 这两个钩子函数不能异步调用,否则会造成页面的 useFetch 报错 !!!
|
18
|
+
app.hook('page:finish', () => {
|
19
|
+
// console.log('loading end ...')
|
20
|
+
hideLoading()
|
21
|
+
})
|
22
|
+
|
23
|
+
const title = process.server ? '' : window.__YOUNG_ENV__.VITE_TITLE
|
24
|
+
</script>
|
25
|
+
|
26
|
+
<template>
|
27
|
+
<Title>{{ title }}</Title>
|
28
|
+
<NuxtLayout>
|
29
|
+
<NuxtPage />
|
30
|
+
</NuxtLayout>
|
31
|
+
</template>
|
32
|
+
|
33
|
+
<style>
|
34
|
+
img,
|
35
|
+
video {
|
36
|
+
max-width: 100%;
|
37
|
+
height: auto;
|
38
|
+
}
|
39
|
+
|
40
|
+
.reset-img img,
|
41
|
+
.reset-img video,
|
42
|
+
.reset-img svg,
|
43
|
+
.reset-img audio {
|
44
|
+
display: initial;
|
45
|
+
}
|
46
|
+
|
47
|
+
::-webkit-scrollbar {
|
48
|
+
width: 8px;
|
49
|
+
height: 8px
|
50
|
+
}
|
51
|
+
|
52
|
+
::-webkit-scrollbar-track {
|
53
|
+
background-color: #fff;
|
54
|
+
border-radius: 2em
|
55
|
+
}
|
56
|
+
|
57
|
+
::-webkit-scrollbar-thumb {
|
58
|
+
background-color: #aaa;
|
59
|
+
border-radius: 2em;
|
60
|
+
}
|
61
|
+
|
62
|
+
::-webkit-scrollbar-corner {
|
63
|
+
background-color: transparent
|
64
|
+
}
|
65
|
+
|
66
|
+
:root {
|
67
|
+
--van-nav-bar-background: #0083CE !important;
|
68
|
+
--van-nav-bar-title-text-color: #FFFFFF !important;
|
69
|
+
--van-nav-bar-icon-color: #fff !important;
|
70
|
+
--van-grid-item-text-color: #111 !important;
|
71
|
+
}
|
72
|
+
|
73
|
+
html,
|
74
|
+
body {
|
75
|
+
width: 100%;
|
76
|
+
height: 100%;
|
77
|
+
background: #F7F8FA;
|
78
|
+
}
|
79
|
+
</style>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/*
|
2
|
+
* @Author: zhangyang
|
3
|
+
* @Date: 2022-09-07 09:31:12
|
4
|
+
* @LastEditTime: 2023-11-29 16:36:36
|
5
|
+
* @Description:
|
6
|
+
*/
|
7
|
+
(async () => {
|
8
|
+
const env = process.env.DEPLOY_ENV
|
9
|
+
const listenPort = process.env.LISTEN_PORT || 3003
|
10
|
+
|
11
|
+
console.log('当前环境:', env)
|
12
|
+
console.log('服务监听端口:', listenPort)
|
13
|
+
|
14
|
+
process.env.NITRO_PORT = listenPort
|
15
|
+
|
16
|
+
await import('./dist/server/index.mjs')
|
17
|
+
})()
|
@@ -0,0 +1,72 @@
|
|
1
|
+
<!--
|
2
|
+
* @Author: zhangyang
|
3
|
+
* @Date: 2023-09-28 11:09:14
|
4
|
+
* @LastEditTime: 2023-11-29 17:36:42
|
5
|
+
* @Description:
|
6
|
+
-->
|
7
|
+
<script lang="ts" setup>
|
8
|
+
import { YoungSlideVerify } from '@bluesyoung/ui-vue3'
|
9
|
+
import { useVerifyCode } from '@bluesyoung/ui-vue3-element-plus'
|
10
|
+
|
11
|
+
interface Props {
|
12
|
+
modelValue: string
|
13
|
+
tel: string
|
14
|
+
maxlength?: number
|
15
|
+
forceEl?: boolean
|
16
|
+
}
|
17
|
+
|
18
|
+
const props = withDefaults(defineProps<Props>(), {
|
19
|
+
maxlength: 6,
|
20
|
+
forceEl: false,
|
21
|
+
})
|
22
|
+
|
23
|
+
const emit = defineEmits<{
|
24
|
+
(e: 'update:modelValue', v: string): void
|
25
|
+
(e: 'enter'): void
|
26
|
+
}>()
|
27
|
+
|
28
|
+
const canGet = computed(() => {
|
29
|
+
return props.tel.length === 11
|
30
|
+
})
|
31
|
+
|
32
|
+
const {
|
33
|
+
getCode,
|
34
|
+
tip,
|
35
|
+
showSlider,
|
36
|
+
pass,
|
37
|
+
cancel,
|
38
|
+
disabled,
|
39
|
+
} = useVerifyCode(async () => {
|
40
|
+
apis.get.sendCode(props.tel)
|
41
|
+
showNotify({
|
42
|
+
message: '短信已发送至您的手机,请注意查收!',
|
43
|
+
type: 'success',
|
44
|
+
})
|
45
|
+
})
|
46
|
+
</script>
|
47
|
+
|
48
|
+
<template>
|
49
|
+
<div class="w-full">
|
50
|
+
<VanField
|
51
|
+
v-bind="$attrs"
|
52
|
+
class="mt-4 rounded-md" :model-value="modelValue" type="text" placeholder="请输入验证码"
|
53
|
+
@update:model-value="(e) => emit('update:modelValue', e)" @keyup.enter="emit('enter')"
|
54
|
+
>
|
55
|
+
<template #button>
|
56
|
+
<VanButton v-if="!disabled" type="primary" class="!text-[#1AAADA]" :disabled="!canGet" plain @click="getCode">
|
57
|
+
{{ tip }}
|
58
|
+
</VanButton>
|
59
|
+
<div v-else class="text-[#ccc]">
|
60
|
+
{{ tip }}
|
61
|
+
</div>
|
62
|
+
</template>
|
63
|
+
</VanField>
|
64
|
+
<YoungSlideVerify :show="showSlider" @success="pass" @close="cancel" />
|
65
|
+
</div>
|
66
|
+
</template>
|
67
|
+
|
68
|
+
<style>
|
69
|
+
.vue-puzzle-vcode {
|
70
|
+
z-index: 10001 !important;
|
71
|
+
}
|
72
|
+
</style>
|
@@ -0,0 +1,57 @@
|
|
1
|
+
/*
|
2
|
+
* @Author: zhangyang
|
3
|
+
* @Date: 2023-06-20 17:14:58
|
4
|
+
* @LastEditTime: 2023-11-29 17:50:40
|
5
|
+
* @Description:
|
6
|
+
*/
|
7
|
+
import { useHttp } from '@bluesyoung/http'
|
8
|
+
import { useGet, usePost } from './apis'
|
9
|
+
|
10
|
+
const http = useHttp<{
|
11
|
+
code: number
|
12
|
+
data: any
|
13
|
+
msg: string
|
14
|
+
}>({
|
15
|
+
timeout: -1,
|
16
|
+
loading: {
|
17
|
+
start: showLoading,
|
18
|
+
end: hideLoading,
|
19
|
+
},
|
20
|
+
fail: (err: any) => {
|
21
|
+
console.log('🚀 ~ file: api.ts:28 ~ err:', err)
|
22
|
+
const user = useUserStore()
|
23
|
+
if (err?.response?.status === 401) {
|
24
|
+
user.removeToken()
|
25
|
+
checkLogin(true)
|
26
|
+
|
27
|
+
throw err
|
28
|
+
}
|
29
|
+
|
30
|
+
if (typeof err === 'string') {
|
31
|
+
// 通用失败,弹出提示信息
|
32
|
+
ElMessage.error(err)
|
33
|
+
}
|
34
|
+
if ((err as any) instanceof Error) {
|
35
|
+
ElMessage.error(err?.response?.data?.message
|
36
|
+
|| err?.response?.data?.msg
|
37
|
+
|| err?.response?.data
|
38
|
+
|| err.message
|
39
|
+
|| '网络错误!')
|
40
|
+
}
|
41
|
+
|
42
|
+
throw err
|
43
|
+
},
|
44
|
+
headers: {
|
45
|
+
getAuthHeaders: () => {
|
46
|
+
const { token } = storeToRefs(useUserStore())
|
47
|
+
return {
|
48
|
+
Authorization: `Bearer ${token.value}`,
|
49
|
+
}
|
50
|
+
},
|
51
|
+
},
|
52
|
+
})
|
53
|
+
|
54
|
+
export const apis = http.__mixin__({
|
55
|
+
get: useGet(http),
|
56
|
+
post: usePost(http),
|
57
|
+
})
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/*
|
2
|
+
* @Author: zhangyang
|
3
|
+
* @Date: 2023-07-21 09:09:37
|
4
|
+
* @LastEditTime: 2023-11-29 17:36:23
|
5
|
+
* @Description:
|
6
|
+
*/
|
7
|
+
import type { YoungHttp, YoungHttpAuthReq, YoungHttpFreeReq } from '@bluesyoung/http'
|
8
|
+
|
9
|
+
export function useGet(http: YoungHttp) {
|
10
|
+
const FreeReq: YoungHttpFreeReq = args => http.freeReq({ method: 'GET', ...args })
|
11
|
+
const AuthReq: YoungHttpAuthReq = args => http.authReq({ method: 'GET', ...args })
|
12
|
+
|
13
|
+
return {
|
14
|
+
/**
|
15
|
+
* 发送短信验证码
|
16
|
+
*/
|
17
|
+
sendCode: async (phone: string) => {
|
18
|
+
showToast(`todo: ${phone}发送短信验证码`)
|
19
|
+
// await FreeReq({ url: '/v1/user/sendCode', params: { phone } });
|
20
|
+
},
|
21
|
+
}
|
22
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
/*
|
2
|
+
* @Author: zhangyang
|
3
|
+
* @Date: 2023-07-21 09:21:02
|
4
|
+
* @LastEditTime: 2023-11-29 17:53:30
|
5
|
+
* @Description:
|
6
|
+
*/
|
7
|
+
import type { YoungHttp, YoungHttpAuthReq, YoungHttpFreeReq } from '@bluesyoung/http'
|
8
|
+
import { telMasaike } from '@bluesyoung/utils'
|
9
|
+
|
10
|
+
export function usePost(http: YoungHttp) {
|
11
|
+
const FreeReq: YoungHttpFreeReq = args => http.freeReq({ method: 'POST', ...args })
|
12
|
+
const AuthReq: YoungHttpAuthReq = args => http.authReq({ method: 'POST', ...args })
|
13
|
+
|
14
|
+
return {
|
15
|
+
login: async (args: LoginForm) => {
|
16
|
+
console.log('🚀 ~ file: post.ts:15 ~ login: ~ args:', args)
|
17
|
+
|
18
|
+
return {
|
19
|
+
uuid: '9527',
|
20
|
+
nickname: '用户xxx',
|
21
|
+
headimgurl: 'https://avatars.githubusercontent.com/u/55608642?v=4',
|
22
|
+
token: 'xxxxxxxxx',
|
23
|
+
phone: telMasaike(args.tel),
|
24
|
+
} as UserLoginRes
|
25
|
+
},
|
26
|
+
changePassword: async (args: ResetPasswdForm) => {
|
27
|
+
console.log('🚀 ~ file: post.ts:15 ~ login: ~ args:', args)
|
28
|
+
showToast('todo: user change password')
|
29
|
+
|
30
|
+
return {
|
31
|
+
uuid: '9527',
|
32
|
+
nickname: '用户xxx',
|
33
|
+
headimgurl: 'https://avatars.githubusercontent.com/u/55608642?v=4',
|
34
|
+
token: 'xxx',
|
35
|
+
phone: telMasaike(args.tel),
|
36
|
+
} as UserLoginRes
|
37
|
+
},
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/*
|
2
|
+
* @Author: zhangyang
|
3
|
+
* @Date: 2023-06-25 15:01:47
|
4
|
+
* @LastEditTime: 2023-09-27 12:00:49
|
5
|
+
* @Description:
|
6
|
+
*/
|
7
|
+
export const useShareStore = defineStore('useShareStore', {
|
8
|
+
state: () => {
|
9
|
+
const jssdkShareSign = ref({
|
10
|
+
timestamp: '',
|
11
|
+
nonceStr: '',
|
12
|
+
signature: '',
|
13
|
+
})
|
14
|
+
|
15
|
+
return {
|
16
|
+
jssdkShareSign,
|
17
|
+
}
|
18
|
+
},
|
19
|
+
})
|
20
|
+
|
21
|
+
if (import.meta.hot)
|
22
|
+
import.meta.hot.accept(acceptHMRUpdate(useShareStore, import.meta.hot))
|