create-young-proj 0.10.0 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # 从现有模板快速创建工程
2
2
 
3
+ ```bash
4
+ npm create young-proj@latest
5
+ yarn create young-proj@latest
6
+ pnpm create young-proj@latest
7
+ ```
8
+
3
9
  🚧 WIP
4
10
 
5
11
  - [x] template-vue-thin
package/init.mjs CHANGED
@@ -1,10 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { execa } from 'execa'
3
-
4
2
  try {
5
- await execa('npx', ['simple-git-hooks'])
3
+ await import('simple-git-hooks/postinstall.js')
6
4
  console.log('simple-git-hooks installed successfully')
7
5
  }
8
6
  catch (error) {
9
- console.log('just intsall to use, not dev')
7
+ console.log('just use, not dev')
10
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-young-proj",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "create project from template",
5
5
  "author": "BluesYoung-web",
6
6
  "license": "MIT",
@@ -44,7 +44,6 @@
44
44
  "@types/node": "16",
45
45
  "cross-spawn": "^7.0.3",
46
46
  "eslint": "^8.48.0",
47
- "execa": "^8.0.1",
48
47
  "jiti": "^1.19.3",
49
48
  "kolorist": "^1.6.0",
50
49
  "lint-staged": "^14.0.1",
@@ -1,11 +1,12 @@
1
1
  <!--
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-07-21 16:31:41
4
- * @LastEditTime: 2023-07-24 15:04:21
4
+ * @LastEditTime: 2023-09-08 10:35:46
5
5
  * @Description:
6
6
  -->
7
7
  <script lang="ts" setup>
8
- const { avatar, nick, cookie } = storeToRefs(useUserStore())
8
+ const user = useUserStore()
9
+ const { avatar, nick } = storeToRefs(user)
9
10
 
10
11
  function loginOut() {
11
12
  showDialog({
@@ -13,8 +14,7 @@ function loginOut() {
13
14
  message: '确认退出登录?',
14
15
  showCancelButton: true,
15
16
  }).then(() => {
16
- // @ts-expect-error
17
- cookie.value = undefined
17
+ user.removeToken()
18
18
  navigateTo(`/login?redirect=${encodeURIComponent(location.href.replace(location.origin, ''))}`)
19
19
  }).catch(() => null)
20
20
  }
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-07-24 14:21:55
4
- * @LastEditTime: 2023-08-02 10:38:16
4
+ * @LastEditTime: 2023-09-08 10:34:56
5
5
  * @Description:
6
6
  -->
7
7
  <script lang="ts" setup>
@@ -33,7 +33,7 @@ const form = reactive<LoginForm>({
33
33
  password: '',
34
34
  })
35
35
 
36
- const { cookie } = storeToRefs(useUserStore())
36
+ const user = useUserStore()
37
37
 
38
38
  const formRef = ref<FormInstance>()
39
39
  function sure() {
@@ -41,11 +41,11 @@ function sure() {
41
41
  if (valid) {
42
42
  await apis.post.changePassword(form)
43
43
  hide()
44
- await showDialog({
44
+ showNotify({
45
45
  message: '密码修改成功,请重新登录',
46
+ type: 'success',
46
47
  })
47
- // @ts-expect-error
48
- cookie.value = undefined
48
+ user.removeToken()
49
49
  const redirect = location.pathname === '/login' ? '/' : encodeURIComponent(location.href.replace(location.origin, ''))
50
50
  navigateTo(`/login?redirect=${redirect}`)
51
51
  }
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-07-21 12:25:23
4
- * @LastEditTime: 2023-09-04 09:24:44
4
+ * @LastEditTime: 2023-09-08 09:11:37
5
5
  * @Description:
6
6
  -->
7
7
  <script lang="ts" setup>
@@ -68,6 +68,7 @@ const { isCollapse, nav_arr } = storeToRefs(useNavStore())
68
68
 
69
69
  :deep(.el-scrollbar__wrap) {
70
70
  overflow-x: hidden;
71
+ height: calc(100vh - $base-nav-bar-height);
71
72
 
72
73
  .el-menu {
73
74
  border: 0;
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-06-20 17:14:58
4
- * @LastEditTime: 2023-07-26 11:56:53
4
+ * @LastEditTime: 2023-09-08 10:09:03
5
5
  * @Description:
6
6
  */
7
7
  import { useHttp } from '@bluesyoung/http'
@@ -29,25 +29,10 @@ const http = useHttp<{
29
29
  },
30
30
  fail: (err: any) => {
31
31
  console.log('🚀 ~ file: api.ts:28 ~ err:', err)
32
- const { cookie } = storeToRefs(useUserStore())
32
+ const user = useUserStore()
33
33
  if (err?.response?.status === 401) {
34
- showDialog({
35
- title: '温馨提示',
36
- message: '未登录或登录过期,请登录后再继续!',
37
- showCancelButton: true,
38
- })
39
- .then(() => {
40
- cookie.value && (cookie.value.uuid = '')
41
- navigateTo(
42
- `/login?redirect=${encodeURIComponent(location.href.replace(location.origin, ''))}`,
43
- )
44
- })
45
- .catch(() => {
46
- navigateTo({
47
- path: '/',
48
- replace: true,
49
- })
50
- })
34
+ user.removeToken()
35
+ checkLogin(true)
51
36
 
52
37
  throw err
53
38
  }
@@ -1,18 +1,34 @@
1
1
  /*
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-06-21 12:03:42
4
- * @LastEditTime: 2023-07-24 14:05:13
4
+ * @LastEditTime: 2023-09-08 10:33:28
5
5
  * @Description:
6
6
  */
7
7
  export const useUserStore = defineStore('useUserStore', () => {
8
8
  const cookie = useLocalStorage<UserLoginRes>('token', {} as UserLoginRes)
9
9
 
10
- const hasLogin = computed(() => !!cookie.value?.uuid)
11
10
  const avatar = computed(() => cookie.value?.headimgurl)
12
11
  const nick = computed(() => cookie.value?.nickname)
13
- const token = computed(() => cookie.value?.token)
12
+ const token = computed(() => {
13
+ if (!validateToken())
14
+ removeToken()
15
+
16
+ return cookie.value?.token
17
+ })
18
+ const hasLogin = computed(() => !!token.value)
14
19
 
15
20
  const SaveFlag = useLocalStorage('n天免登', true)
21
+ const Exptime = useLocalStorage('token过期时间', 0)
22
+
23
+ function validateToken() {
24
+ const now = Date.now()
25
+ const exp = Exptime.value
26
+ return now < exp
27
+ }
28
+
29
+ function removeToken() {
30
+ cookie.value = undefined
31
+ }
16
32
 
17
33
  return {
18
34
  cookie,
@@ -21,6 +37,8 @@ export const useUserStore = defineStore('useUserStore', () => {
21
37
  nick,
22
38
  token,
23
39
  SaveFlag,
40
+ Exptime,
41
+ removeToken,
24
42
  }
25
43
  })
26
44
 
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-07-21 10:02:19
4
- * @LastEditTime: 2023-08-02 14:57:03
4
+ * @LastEditTime: 2023-09-08 10:10:28
5
5
  * @Description:
6
6
  */
7
7
  export default defineNuxtRouteMiddleware(async (to, from) => {
@@ -30,12 +30,19 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
30
30
 
31
31
  if (!hasLogin.value && to.path !== '/login') {
32
32
  // 页面需要登录,但是未登录
33
- showFailToast('未登录或登录过期,请重新登录')
34
- return navigateTo(`/login?redirect=${encodeURIComponent(to.fullPath)}`)
33
+ showNotify({
34
+ type: 'danger',
35
+ message: '未登录或登录过期,请重新登录',
36
+ })
37
+ return navigateTo(`/login?redirect=${encodeURIComponent(to.fullPath)}`, {
38
+ replace: true,
39
+ })
35
40
  }
36
41
  else if (hasLogin.value && to.path === '/login') {
37
42
  // 已登录进入登录页
38
- return navigateTo('/')
43
+ return navigateTo('/', {
44
+ replace: true,
45
+ })
39
46
  }
40
47
  else {
41
48
  nav_arr.value.length === 0 && (await generateNavData())
@@ -7,7 +7,7 @@
7
7
  "dev": "nuxt dev --host",
8
8
  "generate": "nuxt generate",
9
9
  "preview": "nuxt preview --host",
10
- "postinstall": "nuxt prepare",
10
+ "postinstall": "nuxt prepare && simple-git-hooks",
11
11
  "lint": "eslint .",
12
12
  "lint:fix": "eslint . --fix"
13
13
  },
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-07-21 10:03:11
4
- * @LastEditTime: 2023-08-02 10:39:05
4
+ * @LastEditTime: 2023-09-08 10:03:40
5
5
  * @Description:
6
6
  -->
7
7
  <script lang="ts" setup>
@@ -24,7 +24,7 @@ const {
24
24
  NUXT_PUBLIC_CURRENT_VERSION: Version,
25
25
  } = window.__YOUNG_ENV__
26
26
 
27
- const { SaveFlag, hasLogin, cookie } = storeToRefs(useUserStore())
27
+ const { SaveFlag, hasLogin, cookie, Exptime } = storeToRefs(useUserStore())
28
28
 
29
29
  const loginType = ref<'account' | 'code'>('account')
30
30
 
@@ -46,6 +46,8 @@ function loginHandler() {
46
46
  const data = await apis.post.login(form)
47
47
  if (data) {
48
48
  cookie.value = data
49
+ // 三天后过期
50
+ Exptime.value = Date.now() + 1000 * 60 * 60 * 24 * 3
49
51
  height.value > width.value && enter()
50
52
  showSuccessToast('登录成功!')
51
53
  navigateTo('/')
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * @Author: zhangyang
3
3
  * @Date: 2023-05-28 16:01:24
4
- * @LastEditTime: 2023-07-31 14:45:23
4
+ * @LastEditTime: 2023-09-08 10:12:37
5
5
  * @Description:
6
6
  */
7
7
  import { randomId } from '@bluesyoung/utils'
@@ -55,16 +55,6 @@ export const WindowSize = reactive({
55
55
  '2xl': useMediaQuery('(min-width: 1536px)'),
56
56
  })
57
57
 
58
- /**
59
- * 分页是否超过一页
60
- */
61
- export function moreThanOnePage(query: {
62
- total: number
63
- limit: number
64
- }) {
65
- return query.total > query.limit
66
- }
67
-
68
58
  /**
69
59
  * 当前浏览器是否支持下载
70
60
  */
@@ -81,23 +71,16 @@ export function checkLogin(force = true) {
81
71
  const { hasLogin } = storeToRefs(useUserStore())
82
72
 
83
73
  if (!hasLogin.value) {
84
- force
85
- && showDialog({
86
- title: '温馨提示',
87
- message: '未登录,请登录后再继续!',
88
- showCancelButton: true,
74
+ if (force) {
75
+ showNotify({
76
+ type: 'danger',
77
+ message: '未登录或登录过期,请登录后再试',
89
78
  })
90
- .then(() => {
91
- navigateTo(
92
- `/login?redirect=${encodeURIComponent(location.href.replace(location.origin, ''))}`,
93
- )
94
- })
95
- .catch(() => {
96
- navigateTo({
97
- path: '/',
98
- replace: true,
99
- })
100
- })
79
+
80
+ navigateTo(`/login?redirect=${encodeURIComponent(location.href.replace(location.origin, ''))}`, {
81
+ replace: true,
82
+ })
83
+ }
101
84
  return false
102
85
  }
103
86
  else {
@@ -122,61 +105,54 @@ export function useScrollOver(distance = 40) {
122
105
  */
123
106
  export async function generateNavData() {
124
107
  const { hasLogin } = storeToRefs(useUserStore())
125
- if (!hasLogin.value) {
126
- showNotify({
127
- type: 'danger',
128
- message: '登录过期,请重新登录!',
129
- })
130
-
131
- return navigateTo('/login')
132
- }
133
-
134
- // 清除没有子元素的children
135
- const clearChildren = (arr: NavArrItem[]) => {
136
- for (const item of arr) {
137
- if (
138
- item?.children?.length === 0
108
+ if (checkLogin(true)) {
109
+ // 清除没有子元素的children
110
+ const clearChildren = (arr: NavArrItem[]) => {
111
+ for (const item of arr) {
112
+ if (
113
+ item?.children?.length === 0
139
114
  || item.children?.filter(n => +n.visible === 1).length === 0
140
- )
141
- delete item.children
142
- else if (item.children)
143
- clearChildren(item.children)
115
+ )
116
+ delete item.children
117
+ else if (item.children)
118
+ clearChildren(item.children)
119
+ }
120
+ return arr
144
121
  }
145
- return arr
146
- }
147
122
 
148
- const { nav_arr, flat_nav_arr, auth_routes } = storeToRefs(useNavStore())
123
+ const { nav_arr, flat_nav_arr, auth_routes } = storeToRefs(useNavStore())
149
124
 
150
- const tree = await apis.get.getUserMenuTree()
151
- const menu = Object.values(tree)
125
+ const tree = await apis.get.getUserMenuTree()
126
+ const menu = Object.values(tree)
152
127
 
153
- let role_route: string[] = []
154
- const generateRoleRoute = (arr: NavArrItem[], num?: number): string[] => {
155
- if (num === 1) {
156
- role_route = []
157
- flat_nav_arr.value = []
158
- }
159
- for (const item of arr) {
160
- if (item.component) {
161
- role_route.push(item.component);
162
- +item.visible === 1 && flat_nav_arr.value.push(item)
128
+ let role_route: string[] = []
129
+ const generateRoleRoute = (arr: NavArrItem[], num?: number): string[] => {
130
+ if (num === 1) {
131
+ role_route = []
132
+ flat_nav_arr.value = []
163
133
  }
164
- // 子节点递归遍历
165
- if (Array.isArray(item.children) && item.children.length > 0) {
166
- const part = JSON.parse(JSON.stringify(item.children))
167
- // 尾递归优化
168
- generateRoleRoute(part)
134
+ for (const item of arr) {
135
+ if (item.component) {
136
+ role_route.push(item.component);
137
+ +item.visible === 1 && flat_nav_arr.value.push(item)
138
+ }
139
+ // 子节点递归遍历
140
+ if (Array.isArray(item.children) && item.children.length > 0) {
141
+ const part = JSON.parse(JSON.stringify(item.children))
142
+ // 尾递归优化
143
+ generateRoleRoute(part)
144
+ }
169
145
  }
146
+ return role_route
170
147
  }
171
- return role_route
172
- }
173
148
 
174
- auth_routes.value = generateRoleRoute(menu, 1)
149
+ auth_routes.value = generateRoleRoute(menu, 1)
175
150
 
176
- /**
151
+ /**
177
152
  * 最终导航数组
178
153
  */
179
- nav_arr.value = clearChildren(menu.filter(item => +item.visible === 1))
154
+ nav_arr.value = clearChildren(menu.filter(item => +item.visible === 1))
155
+ }
180
156
  }
181
157
 
182
158
  /**