create-young-proj 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +3 -6
- package/template-nuxt-admin/README.md +22 -0
- package/template-nuxt-admin/_gitignore +23 -0
- package/template-nuxt-admin/_npmrc +2 -0
- package/template-nuxt-admin/components/YoungChangePassword.vue +4 -4
- package/template-nuxt-admin/components/layout/Main.vue +2 -17
- package/template-nuxt-admin/components/layout/SideBar.vue +2 -3
- package/template-nuxt-admin/components/layout/TabsBar.vue +2 -2
- package/template-nuxt-admin/composables/tags.ts +26 -20
- package/template-nuxt-admin/middleware/auth.global.ts +15 -4
- package/template-nuxt-admin/package.json +9 -9
- package/template-nuxt-admin/pages/login.vue +5 -5
- package/template-nuxt-admin/pages/system/api.vue +5 -5
- package/template-nuxt-admin/pages/system/menuList.vue +8 -8
- package/template-nuxt-admin/pages/system/role.vue +5 -5
- package/template-nuxt-admin/pages/system/user.vue +6 -6
- package/template-nuxt-admin/yarn.lock +2322 -2068
- package/template-uni-app/README.md +20 -0
- package/template-uni-app/_env +1 -1
- package/template-uni-app/_env.development +2 -2
- package/template-uni-app/_env.production +0 -3
- package/template-uni-app/_env.test +0 -3
- package/template-uni-app/auto-imports.d.ts +3 -0
- package/template-uni-app/dist/dev/mp-weixin/apis/index.js +44 -0
- package/template-uni-app/dist/dev/mp-weixin/apis/lib/index.js +90 -0
- package/template-uni-app/dist/dev/mp-weixin/apis/requests/get.js +10 -0
- package/template-uni-app/dist/dev/mp-weixin/apis/requests/index.js +1 -0
- package/template-uni-app/dist/dev/mp-weixin/apis/requests/post.js +15 -0
- package/template-uni-app/dist/dev/mp-weixin/app.js +93 -0
- package/template-uni-app/dist/dev/mp-weixin/app.json +51 -0
- package/template-uni-app/dist/dev/mp-weixin/app.wxss +2378 -0
- package/template-uni-app/dist/dev/mp-weixin/common/assets.js +13 -0
- package/template-uni-app/dist/dev/mp-weixin/common/vendor.js +10189 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading/young-loading.js +22 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading/young-loading.json +4 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading/young-loading.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading/young-loading.wxss +0 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading-mini/young-loading-mini.js +22 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading-mini/young-loading-mini.json +4 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading-mini/young-loading-mini.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-loading-mini/young-loading-mini.wxss +0 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-navbar/young-navbar.js +82 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-navbar/young-navbar.json +4 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-navbar/young-navbar.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-navbar/young-navbar.wxss +108 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-tabbar/young-tabbar.js +56 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-tabbar/young-tabbar.json +4 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-tabbar/young-tabbar.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/components/young-tabbar/young-tabbar.wxss +88 -0
- package/template-uni-app/dist/dev/mp-weixin/config/enum.js +21 -0
- package/template-uni-app/dist/dev/mp-weixin/config/index.js +1 -0
- package/template-uni-app/dist/dev/mp-weixin/config/map.js +1 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/default.js +30 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/default.json +6 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/default.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/default.wxss +0 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/tabbar.js +56 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/tabbar.json +9 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/tabbar.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/layouts/tabbar.wxss +0 -0
- package/template-uni-app/dist/dev/mp-weixin/node-modules/@dcloudio/uni-ui/lib/uni-card/uni-card.js +98 -0
- package/template-uni-app/dist/dev/mp-weixin/node-modules/@dcloudio/uni-ui/lib/uni-card/uni-card.json +4 -0
- package/template-uni-app/dist/dev/mp-weixin/node-modules/@dcloudio/uni-ui/lib/uni-card/uni-card.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/node-modules/@dcloudio/uni-ui/lib/uni-card/uni-card.wxss +125 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/demo/index.js +38 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/demo/index.json +5 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/demo/index.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/demo/index.wxss +0 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/index.js +51 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/index.json +5 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/index.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/index.wxss +0 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/my.js +22 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/my.json +3 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/my.wxml +1 -0
- package/template-uni-app/dist/dev/mp-weixin/pages/my.wxss +0 -0
- package/template-uni-app/dist/dev/mp-weixin/project.config.json +56 -0
- package/template-uni-app/dist/dev/mp-weixin/static/back.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/static/h.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/static/home.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/static/home_active.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/static/more.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/static/my.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/static/my_active.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/static/network.png +0 -0
- package/template-uni-app/dist/dev/mp-weixin/store/index.js +8 -0
- package/template-uni-app/dist/dev/mp-weixin/store/local/index.js +11 -0
- package/template-uni-app/dist/dev/mp-weixin/store/system.js +14 -0
- package/template-uni-app/dist/dev/mp-weixin/utils/modal.js +82 -0
- package/template-uni-app/dist/dev/mp-weixin/utils/route.js +85 -0
- package/template-uni-app/dist/dev/mp-weixin/utils/system.js +27 -0
- package/template-uni-app/src/apis/index.ts +17 -14
- package/template-uni-app/src/components/young-loading/young-loading.vue +6 -13
- package/template-uni-app/src/components/young-loading-mini/young-loading-mini.vue +3 -10
- package/template-uni-app/src/layouts/default.vue +2 -3
- package/template-uni-app/src/layouts/tabbar.vue +17 -10
- package/template-uni-app/src/pages/index.vue +23 -18
- package/template-uni-app/src/pages/my.vue +15 -8
- package/template-uni-app/src/pages.json +8 -2
- package/template-uni-app/src/store/system.ts +4 -3
- package/template-uni-app/src/typings/global.d.ts +7 -0
- package/template-uni-app/src/utils/auth.ts +71 -1
- package/template-uni-app/src/utils/modal.ts +30 -7
- package/template-vue-admin/src/views/system/menuList.vue +3 -3
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "create-young-proj",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.8.0",
|
4
4
|
"description": "create project from template",
|
5
5
|
"main": "index.mjs",
|
6
6
|
"bin": {
|
@@ -32,21 +32,18 @@
|
|
32
32
|
"author": "BluesYoung-web",
|
33
33
|
"license": "MIT",
|
34
34
|
"devDependencies": {
|
35
|
-
"
|
36
|
-
"changelogen": "^0.4.0",
|
35
|
+
"@types/node": "16",
|
37
36
|
"cross-spawn": "^7.0.3",
|
38
37
|
"kolorist": "^1.6.0",
|
39
38
|
"minimist": "^1.2.7",
|
40
39
|
"prompts": "^2.4.2",
|
41
40
|
"rome": "^10.0.1",
|
42
|
-
"unbuild": "^1.0.1"
|
43
|
-
"@types/node": "16"
|
41
|
+
"unbuild": "^1.0.1"
|
44
42
|
},
|
45
43
|
"scripts": {
|
46
44
|
"dev": "unbuild --stub",
|
47
45
|
"build": "unbuild",
|
48
46
|
"format": "rome format . --write",
|
49
|
-
"release": "changelogen && bumpp --no-push",
|
50
47
|
"push": "pnpm publish --access public"
|
51
48
|
}
|
52
49
|
}
|
@@ -1,5 +1,27 @@
|
|
1
1
|
# 基于 Nuxt 3 的后台
|
2
2
|
|
3
|
+
## 配套 git 提交工具
|
4
|
+
|
5
|
+
### 安装
|
6
|
+
|
7
|
+
```bash
|
8
|
+
npm i -g young-commit
|
9
|
+
```
|
10
|
+
|
11
|
+
### 使用
|
12
|
+
|
13
|
+
- 正常使用 `git add` 将要提交的文件添加到暂存区
|
14
|
+
|
15
|
+
- 提交步骤使用 `yc` 或者 `young-commit` 进行提交
|
16
|
+
|
17
|
+
#### 命令选项
|
18
|
+
|
19
|
+
- `yc -i` 初始化(仅刚创建项目时使用,会自动执行 `git init`)
|
20
|
+
|
21
|
+
- `yc -r` 进行版本发布,会根据之前的提交及最近一个 `tag` 生成 `changelog`
|
22
|
+
|
23
|
+
> **受限于 Nuxt3 的 keep-alive 机制,setup 直接执行 / onMounted 包裹的,需要替换为 useTabReOpen 包裹的**
|
24
|
+
|
3
25
|
## 使用响应式布局
|
4
26
|
|
5
27
|
兼容 `PC` 端与移动端
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Nuxt dev/build outputs
|
2
|
+
.output
|
3
|
+
.nuxt
|
4
|
+
.nitro
|
5
|
+
.cache
|
6
|
+
dist
|
7
|
+
|
8
|
+
# Node dependencies
|
9
|
+
node_modules
|
10
|
+
|
11
|
+
# Logs
|
12
|
+
logs
|
13
|
+
*.log
|
14
|
+
|
15
|
+
# Misc
|
16
|
+
.DS_Store
|
17
|
+
.fleet
|
18
|
+
.idea
|
19
|
+
|
20
|
+
# Local env files
|
21
|
+
.env
|
22
|
+
.env.*
|
23
|
+
!.env.example
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-24 14:21:55
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-02 10:38:16
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -65,16 +65,16 @@ defineExpose({
|
|
65
65
|
{ required: true, trigger: 'blur', message: '请输入手机号' },
|
66
66
|
{ message: '请输入合法的手机号', trigger: 'blur', validator: (_: any, v: string) => isMobile(v) }
|
67
67
|
]" class="mt-20px">
|
68
|
-
<ElInput v-model="form.mobile" placeholder="请输入手机号" maxlength="11" class="!h-52px" clearable />
|
68
|
+
<ElInput v-model.trim="form.mobile" placeholder="请输入手机号" maxlength="11" class="!h-52px" clearable />
|
69
69
|
</ElFormItem>
|
70
70
|
<ElFormItem prop="vercode" :rules="[{ required: true, trigger: 'blur', message: '请输入验证码' }]">
|
71
|
-
<YoungCodeInput v-model="form.vercode" :tel="form.mobile" />
|
71
|
+
<YoungCodeInput v-model.trim="form.vercode" :tel="form.mobile" />
|
72
72
|
</ElFormItem>
|
73
73
|
<ElFormItem prop="password" :rules="[
|
74
74
|
{ required: true, trigger: 'blur', message: '请输入密码' },
|
75
75
|
{ min: 8, max: 16, trigger: 'blur', message: '请输入8-16位字符!' }
|
76
76
|
]">
|
77
|
-
<ElInput type="password" v-model="form.password" minlength="8" maxlength="16" placeholder="请输入密码"
|
77
|
+
<ElInput type="password" v-model.trim="form.password" minlength="8" maxlength="16" placeholder="请输入密码"
|
78
78
|
class="!h-52px" clearable show-password @keyup.enter="sure" />
|
79
79
|
</ElFormItem>
|
80
80
|
</ElForm>
|
@@ -1,27 +1,12 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-21 11:55:27
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-25 16:49:08
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
|
-
<script lang="ts" setup>
|
8
|
-
const { cachedViews, visitedViews } = storeToRefs(useTagsStore());
|
9
|
-
const route = useRoute();
|
10
|
-
const name = computed(() => route.name);
|
11
|
-
const isCached = computed(() => {
|
12
|
-
// 无需缓存的界面
|
13
|
-
if (route.meta.noCache) {
|
14
|
-
return false;
|
15
|
-
}
|
16
|
-
const arr = visitedViews.value.map((view) => view.name);
|
17
|
-
// 已经缓存,或者首次打开(防止二次初始化)
|
18
|
-
return cachedViews.value.includes(name.value) || !arr.includes(name.value as unknown as string);
|
19
|
-
});
|
20
|
-
</script>
|
21
|
-
|
22
7
|
<template>
|
23
8
|
<main class="app-main-height w-full">
|
24
|
-
<NuxtPage :keepalive="
|
9
|
+
<NuxtPage ref="page" :keepalive="!$route.meta.noCache" />
|
25
10
|
</main>
|
26
11
|
</template>
|
27
12
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-21 12:25:23
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-09-04 09:24:44
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -14,8 +14,7 @@ const { isCollapse, nav_arr } = storeToRefs(useNavStore());
|
|
14
14
|
|
15
15
|
<ElScrollbar>
|
16
16
|
<ElMenu background-color="#001529" text-color="hsla(0,0%,100%,.65)" active-text-color="#fff" unique-opened
|
17
|
-
:collapse="isCollapse || WindowSize['lt-lg']"
|
18
|
-
:collapse-transition="false">
|
17
|
+
:collapse="isCollapse || WindowSize['lt-lg']" menu-trigger="click" :collapse-transition="false">
|
19
18
|
<LayoutSubMenu :menuList="nav_arr" />
|
20
19
|
</ElMenu>
|
21
20
|
</ElScrollbar>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-21 17:05:40
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-09-04 09:27:21
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -61,7 +61,7 @@ const closeAllTab = () => {
|
|
61
61
|
<template>
|
62
62
|
<div class="tabs-bar-container">
|
63
63
|
<div class="tabs-content">
|
64
|
-
<ElTabs v-if="visitedViews.length > 0" type="card"
|
64
|
+
<ElTabs v-if="visitedViews.length > 0" type="card" :model-value="$route.path" @tab-click="tabClick"
|
65
65
|
@tab-remove="removeTab">
|
66
66
|
<ElTabPane v-for="item in visitedViews" type="card" :key="item.path" :path="item.path"
|
67
67
|
:label="(item.meta.title as string)" :name="item.path" :closable="!isAffix(item)">
|
@@ -1,31 +1,37 @@
|
|
1
1
|
/*
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-21 17:13:59
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-25 16:49:28
|
5
5
|
* @Description:
|
6
6
|
*/
|
7
7
|
import type { RouteLocationNormalized } from 'vue-router';
|
8
8
|
|
9
|
-
|
9
|
+
// hack nuxt3 的 keep-alive 没办法像 vue3 那样自由控制
|
10
|
+
export const useTabReOpen = (cbk: Function = () => console.log('this tab page is reopen')) => {
|
11
|
+
const tagState = useTagsStore();
|
12
|
+
const route = useRoute();
|
13
|
+
|
14
|
+
tagState.$onAction(({ name, args, after }) => {
|
15
|
+
if (name === 'addToCache') {
|
16
|
+
if (args[0].name === route.name) {
|
17
|
+
after(() => cbk());
|
18
|
+
}
|
19
|
+
}
|
20
|
+
});
|
21
|
+
|
22
|
+
cbk();
|
23
|
+
};
|
10
24
|
|
11
|
-
interface TagsViewState {
|
12
|
-
/**
|
13
|
-
* 访问过的页面,路由对象
|
14
|
-
*/
|
15
|
-
visitedViews: RouteLocationNormalized[];
|
16
|
-
/**
|
17
|
-
* 已缓存的页面名称
|
18
|
-
*/
|
19
|
-
cachedViews: CachedView[];
|
20
|
-
}
|
21
25
|
// @ts-ignore
|
22
26
|
export const useTagsStore = defineStore('useTagsStore', {
|
23
27
|
state: () => {
|
24
|
-
const
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
28
|
+
const visitedViews = ref<RouteLocationNormalized[]>([]);
|
29
|
+
const cachedViews = ref<string[]>([]);
|
30
|
+
|
31
|
+
return {
|
32
|
+
visitedViews,
|
33
|
+
cachedViews,
|
34
|
+
};
|
29
35
|
},
|
30
36
|
actions: {
|
31
37
|
/**
|
@@ -54,10 +60,10 @@ export const useTagsStore = defineStore('useTagsStore', {
|
|
54
60
|
*/
|
55
61
|
addToCache(view: RouteLocationNormalized) {
|
56
62
|
// 查询该标签是否已缓存
|
57
|
-
if (this.cachedViews.includes(view.name)) {
|
63
|
+
if (this.cachedViews.includes(view.name as string)) {
|
58
64
|
null;
|
59
65
|
} else if (!view.meta?.noCache) {
|
60
|
-
this.cachedViews.push(view.name);
|
66
|
+
this.cachedViews.push(view.name as string);
|
61
67
|
}
|
62
68
|
},
|
63
69
|
/**
|
@@ -80,7 +86,7 @@ export const useTagsStore = defineStore('useTagsStore', {
|
|
80
86
|
* 删除页面缓存
|
81
87
|
*/
|
82
88
|
delCachedView(view: RouteLocationNormalized) {
|
83
|
-
const index = this.cachedViews.indexOf(view.name);
|
89
|
+
const index = this.cachedViews.indexOf(view.name as string);
|
84
90
|
index > -1 && this.cachedViews.splice(index, 1);
|
85
91
|
},
|
86
92
|
/**
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-21 10:02:19
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-02 14:57:03
|
5
5
|
* @Description:
|
6
6
|
*/
|
7
7
|
export default defineNuxtRouteMiddleware(async (to, from) => {
|
@@ -9,17 +9,27 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
|
|
9
9
|
throw createError({ message: '页面不存在', statusCode: 404 });
|
10
10
|
}
|
11
11
|
|
12
|
+
const { hasLogin } = storeToRefs(useUserStore());
|
13
|
+
const { nav_arr, flat_nav_arr } = storeToRefs(useNavStore());
|
14
|
+
|
15
|
+
const changeTitle = () => {
|
16
|
+
const nav = flat_nav_arr.value.find((item) => item.component === to.path);
|
17
|
+
if (nav && nav.title) {
|
18
|
+
to.meta.title = nav.title;
|
19
|
+
}
|
20
|
+
|
21
|
+
document.title = (to.meta.title as string) || window.__YOUNG_ENV__.NUXT_PUBLIC_TITLE;
|
22
|
+
};
|
23
|
+
|
12
24
|
const { addView } = useTagsStore();
|
13
25
|
|
14
26
|
// 页面无需登录
|
15
27
|
if (to.meta.auth === false) {
|
28
|
+
changeTitle();
|
16
29
|
addView(to);
|
17
30
|
return;
|
18
31
|
}
|
19
32
|
|
20
|
-
const { hasLogin } = storeToRefs(useUserStore());
|
21
|
-
const { nav_arr } = storeToRefs(useNavStore());
|
22
|
-
|
23
33
|
if (!hasLogin.value && to.path !== '/login') {
|
24
34
|
// 页面需要登录,但是未登录
|
25
35
|
showFailToast('未登录或登录过期,请重新登录');
|
@@ -30,6 +40,7 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
|
|
30
40
|
} else {
|
31
41
|
nav_arr.value.length === 0 && (await generateNavData());
|
32
42
|
if (hasPermission(to.path)) {
|
43
|
+
changeTitle();
|
33
44
|
addView(to);
|
34
45
|
return;
|
35
46
|
} else {
|
@@ -3,36 +3,36 @@
|
|
3
3
|
"private": true,
|
4
4
|
"scripts": {
|
5
5
|
"build": "nuxt build",
|
6
|
-
"dev": "nuxt dev",
|
6
|
+
"dev": "nuxt dev --host",
|
7
7
|
"generate": "nuxt generate",
|
8
|
-
"preview": "nuxt preview",
|
8
|
+
"preview": "nuxt preview --host",
|
9
9
|
"postinstall": "nuxt prepare"
|
10
10
|
},
|
11
11
|
"devDependencies": {
|
12
12
|
"@bluesyoung/logger": "^0.0.1",
|
13
13
|
"@element-plus/nuxt": "^1.0.5",
|
14
14
|
"@iconify/json": "^2.2.93",
|
15
|
-
"@nuxt/devtools": "^0.
|
15
|
+
"@nuxt/devtools": "^0.8.2",
|
16
16
|
"@pinia/nuxt": "^0.4.11",
|
17
17
|
"@types/file-saver": "^2.0.5",
|
18
|
-
"@types/node": "
|
18
|
+
"@types/node": "20.5.7",
|
19
19
|
"@types/qrcode": "^1.5.1",
|
20
|
-
"@unocss/nuxt": "^0.
|
20
|
+
"@unocss/nuxt": "^0.55.4",
|
21
21
|
"@vant/nuxt": "^1.0.2",
|
22
22
|
"@vueuse/nuxt": "^10.2.1",
|
23
23
|
"dayjs": "^1.11.9",
|
24
24
|
"element-plus": "^2.3.8",
|
25
|
-
"nuxt": "^3.
|
25
|
+
"nuxt": "^3.7.0",
|
26
26
|
"nuxt-lazy-load": "^3.0.4",
|
27
27
|
"pinia": "^2.1.4",
|
28
28
|
"sass": "^1.64.0",
|
29
29
|
"vant": "^4.6.2"
|
30
30
|
},
|
31
31
|
"dependencies": {
|
32
|
-
"@bluesyoung/http": "0.3.
|
32
|
+
"@bluesyoung/http": "0.3.4",
|
33
33
|
"@bluesyoung/ui-vue3": "^0.1.1",
|
34
|
-
"@bluesyoung/ui-vue3-element-plus": "0.11.
|
35
|
-
"@bluesyoung/utils": "^0.1
|
34
|
+
"@bluesyoung/ui-vue3-element-plus": "0.11.5",
|
35
|
+
"@bluesyoung/utils": "^0.2.1",
|
36
36
|
"c12": "^1.4.2",
|
37
37
|
"file-saver": "^2.0.5",
|
38
38
|
"http-proxy": "^1.18.1",
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-21 10:03:11
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-02 10:39:05
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -87,13 +87,13 @@ onMounted(() => {
|
|
87
87
|
{ required: true, trigger: 'blur', message: '请输入手机号' },
|
88
88
|
{ message: '请输入合法的手机号', trigger: 'blur', validator: (_: any, v: string) => isMobile(v) }
|
89
89
|
]" class="mt-20px">
|
90
|
-
<ElInput v-model="form.mobile" placeholder="请输入手机号" maxlength="11" class="!h-52px" clearable />
|
90
|
+
<ElInput v-model.trim="form.mobile" placeholder="请输入手机号" maxlength="11" class="!h-52px" clearable />
|
91
91
|
</ElFormItem>
|
92
92
|
<ElFormItem v-if="loginType === 'account'" prop="password" :rules="[
|
93
93
|
{ required: true, trigger: 'blur', message: '请输入密码' },
|
94
94
|
{ min: 8, max: 16, trigger: 'blur', message: '请输入8-16位字符!' }
|
95
95
|
]">
|
96
|
-
<ElInput type="password" v-model="form.password" minlength="8" maxlength="16" placeholder="请输入密码"
|
96
|
+
<ElInput type="password" v-model.trim="form.password" minlength="8" maxlength="16" placeholder="请输入密码"
|
97
97
|
class="!h-52px" clearable show-password @keyup.enter="loginHandler" />
|
98
98
|
</ElFormItem>
|
99
99
|
</VanTab>
|
@@ -102,11 +102,11 @@ onMounted(() => {
|
|
102
102
|
{ required: true, trigger: 'blur', message: '请输入手机号' },
|
103
103
|
{ message: '请输入合法的手机号', trigger: 'blur', validator: (_: any, v: string) => isMobile(v) }
|
104
104
|
]" class="mt-20px">
|
105
|
-
<ElInput v-model="form.mobile" placeholder="请输入手机号" maxlength="11" class="!h-52px" clearable />
|
105
|
+
<ElInput v-model.trim="form.mobile" placeholder="请输入手机号" maxlength="11" class="!h-52px" clearable />
|
106
106
|
</ElFormItem>
|
107
107
|
<ElFormItem v-if="loginType === 'code'" prop="vercode"
|
108
108
|
:rules="[{ required: true, trigger: 'blur', message: '请输入验证码' }]">
|
109
|
-
<YoungCodeInput v-model="form.vercode" :tel="form.mobile" @enter="loginHandler" />
|
109
|
+
<YoungCodeInput v-model.trim="form.vercode" :tel="form.mobile" @enter="loginHandler" />
|
110
110
|
</ElFormItem>
|
111
111
|
</VanTab>
|
112
112
|
</VanTabs>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-25 16:44:56
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-25 16:54:08
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -122,7 +122,7 @@ const queryScheme: YoungSearchScheme<Query> = {
|
|
122
122
|
|
123
123
|
const roleList = ref<SelectOptionItem<number>[]>([]);
|
124
124
|
|
125
|
-
getList
|
125
|
+
useTabReOpen(getList);
|
126
126
|
</script>
|
127
127
|
<template>
|
128
128
|
<ElCard>
|
@@ -144,10 +144,10 @@ getList();
|
|
144
144
|
<template #body>
|
145
145
|
<ElForm ref="formRef" :model="form" label-width="100px" :label-position="WindowSize['lt-lg'] ? 'top' : 'left'">
|
146
146
|
<ElFormItem label="分组名称" prop="category" :rules="{ required: true, message: '请填写分组名称', trigger: 'blur' }">
|
147
|
-
<ElInput v-model="form.category" class="!w-300px" />
|
147
|
+
<ElInput v-model.trim="form.category" class="!w-300px" />
|
148
148
|
</ElFormItem>
|
149
149
|
<ElFormItem label="接口描述" prop="desc" :rules="{ required: true, message: '请填写接口描述', trigger: 'blur' }">
|
150
|
-
<ElInput v-model="form.desc" class="!w-300px" />
|
150
|
+
<ElInput v-model.trim="form.desc" class="!w-300px" />
|
151
151
|
</ElFormItem>
|
152
152
|
<ElFormItem label="请求方法">
|
153
153
|
<YoungSelect v-model="form.method" class="!w-300px"
|
@@ -155,7 +155,7 @@ getList();
|
|
155
155
|
</ElFormItem>
|
156
156
|
<ElFormItem label="接口路径" prop="path"
|
157
157
|
:rules="{ message: '请填写合法的接口路径, eg: /user/list', trigger: 'blur', validator: (_: any, v: string) => /\/(.*)\/(.*)/.test(v) }">
|
158
|
-
<ElInput v-model="form.path" class="!w-300px" />
|
158
|
+
<ElInput v-model.trim="form.path" class="!w-300px" />
|
159
159
|
</ElFormItem>
|
160
160
|
<ElFormItem label="关联角色">
|
161
161
|
<YoungSelect v-model="form.roleIds" multiple placeholder="请选择角色" class="!w-300px" :options="roleList" />
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-25 16:45:17
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-25 16:55:00
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -66,10 +66,10 @@ const topMenuOption = ref<Partial<NavArrItem>[]>([]);
|
|
66
66
|
/**
|
67
67
|
* 生成节点映射
|
68
68
|
*/
|
69
|
-
const nodeMap = new Map<string
|
69
|
+
const nodeMap = new Map<string, NavArrItem>();
|
70
70
|
const generateNodeMap = (list: NavArrItem[]) => {
|
71
71
|
for (const node of list) {
|
72
|
-
nodeMap.set(node.id, node);
|
72
|
+
nodeMap.set(node.id.toString(), node);
|
73
73
|
if (node.children && node.children?.length > 0) {
|
74
74
|
generateNodeMap(node.children);
|
75
75
|
}
|
@@ -261,7 +261,7 @@ const tableHead: TableHeadItem<NavArrItem>[] = [
|
|
261
261
|
}
|
262
262
|
];
|
263
263
|
|
264
|
-
getList
|
264
|
+
useTabReOpen(getList);
|
265
265
|
</script>
|
266
266
|
|
267
267
|
<template>
|
@@ -287,10 +287,10 @@ getList();
|
|
287
287
|
@update:model-value="(e: any) => form.parentId = e[e.length - 1]" />
|
288
288
|
</ElFormItem>
|
289
289
|
<ElFormItem label="英文名称" prop="name" :rules="{ required: true, message: '请输入英文名', trigger: 'blur' }">
|
290
|
-
<ElInput v-model="form.name" placeholder="请输入英文名" />
|
290
|
+
<ElInput v-model.trim="form.name" placeholder="请输入英文名" />
|
291
291
|
</ElFormItem>
|
292
292
|
<ElFormItem label="标题" prop="title" :rules="{ required: true, message: '请输入页面标题', trigger: 'blur' }">
|
293
|
-
<ElInput v-model="form.title" placeholder="请输入页面标题" />
|
293
|
+
<ElInput v-model.trim="form.title" placeholder="请输入页面标题" />
|
294
294
|
</ElFormItem>
|
295
295
|
<ElFormItem label="图标">
|
296
296
|
<ElSelect v-model="form.icon" class="select_icon" placeholder="请选择图标">
|
@@ -303,7 +303,7 @@ getList();
|
|
303
303
|
</ElSelect>
|
304
304
|
</ElFormItem>
|
305
305
|
<ElFormItem label="排序">
|
306
|
-
<
|
306
|
+
<ElInputNumber v-model.number="form.sort" />
|
307
307
|
</ElFormItem>
|
308
308
|
<ElFormItem label="是否显示">
|
309
309
|
<ElRadioGroup v-model="form.visible">
|
@@ -314,7 +314,7 @@ getList();
|
|
314
314
|
<ElFormItem label="路径" prop="component" :rules="form.parentId === 0 ? {} :
|
315
315
|
{ message: '请输入合法的路径, eg: /path/page', trigger: 'blur', validator: (_: any, v: string) => v.trim() === '' || /\/(.*)\/(.*)/.test(v) }
|
316
316
|
">
|
317
|
-
<ElInput v-model="form.component" />
|
317
|
+
<ElInput v-model.trim="form.component" />
|
318
318
|
</ElFormItem>
|
319
319
|
</ElForm>
|
320
320
|
</template>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-25 16:45:39
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-25 16:55:10
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -27,7 +27,7 @@ const { showPriority, menu } = useRoleMenu();
|
|
27
27
|
|
28
28
|
const { showApi, api } = useRoleApi();
|
29
29
|
|
30
|
-
getList
|
30
|
+
useTabReOpen(getList);
|
31
31
|
</script>
|
32
32
|
|
33
33
|
<template>
|
@@ -64,13 +64,13 @@ getList();
|
|
64
64
|
<ElForm ref="baseFormRef" :model="base.form" label-width="120px"
|
65
65
|
:label-position="WindowSize['lt-lg'] ? 'top' : 'left'">
|
66
66
|
<ElFormItem label="角色名称(中文)" prop="name" :rules="[{ required: true, message: '请填写角色名称', trigger: 'blur' }]">
|
67
|
-
<ElInput v-model="base.form.name" class="!w-300px" />
|
67
|
+
<ElInput v-model.trim="base.form.name" class="!w-300px" />
|
68
68
|
</ElFormItem>
|
69
69
|
<ElFormItem label="关键字(英文)" prop="keyword" :rules="[{ required: true, message: '请填写关键字', trigger: 'blur' }]">
|
70
|
-
<ElInput v-model="base.form.keyword" class="!w-300px" />
|
70
|
+
<ElInput v-model.trim="base.form.keyword" class="!w-300px" />
|
71
71
|
</ElFormItem>
|
72
72
|
<ElFormItem label="角色描述">
|
73
|
-
<ElInput v-model="base.form.desc" class="!w-300px" />
|
73
|
+
<ElInput v-model.trim="base.form.desc" class="!w-300px" />
|
74
74
|
</ElFormItem>
|
75
75
|
</ElForm>
|
76
76
|
</template>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<!--
|
2
2
|
* @Author: zhangyang
|
3
3
|
* @Date: 2023-07-25 16:46:00
|
4
|
-
* @LastEditTime: 2023-
|
4
|
+
* @LastEditTime: 2023-08-25 16:55:17
|
5
5
|
* @Description:
|
6
6
|
-->
|
7
7
|
<script lang="ts" setup>
|
@@ -170,7 +170,7 @@ const queryScheme: YoungSearchScheme<Query> = {
|
|
170
170
|
|
171
171
|
const roleList = ref<SelectOptionItem<number>[]>([]);
|
172
172
|
|
173
|
-
getList
|
173
|
+
useTabReOpen(getList);
|
174
174
|
</script>
|
175
175
|
<template>
|
176
176
|
<ElCard>
|
@@ -193,20 +193,20 @@ getList();
|
|
193
193
|
<template #body>
|
194
194
|
<ElForm ref="formRef" :model="form" label-width="100px" :label-position="WindowSize['lt-lg'] ? 'top' : 'left'">
|
195
195
|
<ElFormItem label="用户名" prop="username" :rules="{ required: true, message: '请输用户名', trigger: 'blur' }">
|
196
|
-
<ElInput v-model="form.username" class="!w-300px" />
|
196
|
+
<ElInput v-model.trim="form.username" class="!w-300px" />
|
197
197
|
</ElFormItem>
|
198
198
|
<ElFormItem label="昵称" prop="nickname" :rules="{ required: true, message: '请输昵称(用于右上角展示)', trigger: 'blur' }">
|
199
|
-
<ElInput v-model="form.nickname" class="!w-300px" />
|
199
|
+
<ElInput v-model.trim="form.nickname" class="!w-300px" />
|
200
200
|
</ElFormItem>
|
201
201
|
<ElFormItem label="手机号" prop="mobile" :rules="{ required: true, message: '请输手机号', trigger: 'blur' }">
|
202
|
-
<ElInput v-model="form.mobile" :maxlength="11" class="!w-300px" />
|
202
|
+
<ElInput v-model.trim="form.mobile" :maxlength="11" class="!w-300px" />
|
203
203
|
</ElFormItem>
|
204
204
|
<ElFormItem label="角色">
|
205
205
|
<YoungSelect v-model="form.roleId" placeholder="请选择角色" :options="roleList" />
|
206
206
|
</ElFormItem>
|
207
207
|
<ElFormItem v-if="isAdd" label="初始密码" prop="initPassword"
|
208
208
|
:rules="{ required: true, message: '请输初始密码', trigger: 'blur' }">
|
209
|
-
<ElInput v-model="form.initPassword" class="!w-300px" />
|
209
|
+
<ElInput v-model.trim="form.initPassword" class="!w-300px" />
|
210
210
|
</ElFormItem>
|
211
211
|
</ElForm>
|
212
212
|
</template>
|