create-pubinfo 2.1.3-beta.2 → 2.1.4

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.
Files changed (74) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/{helper-DqRlR095.js → helper.js} +39 -22
  3. package/dist/index.d.ts +6 -1
  4. package/dist/index.js +1 -1
  5. package/package.json +4 -3
  6. package/templates/pubinfo-monorepo/.browserslistrc +5 -0
  7. package/templates/pubinfo-monorepo/.editorconfig +10 -0
  8. package/templates/pubinfo-monorepo/.vscode/settings.json +50 -0
  9. package/templates/pubinfo-monorepo/_gitignore +38 -0
  10. package/templates/pubinfo-monorepo/_npmrc +5 -0
  11. package/templates/pubinfo-monorepo/apps/basic/.env +2 -0
  12. package/templates/pubinfo-monorepo/apps/basic/.env.development +4 -0
  13. package/templates/pubinfo-monorepo/apps/basic/.env.production +10 -0
  14. package/templates/pubinfo-monorepo/apps/basic/index.html +47 -0
  15. package/templates/pubinfo-monorepo/apps/basic/openapi.config.ts.hbs +33 -0
  16. package/templates/pubinfo-monorepo/apps/basic/package.json.hbs +26 -0
  17. package/templates/pubinfo-monorepo/apps/basic/pubinfo.config.ts +9 -0
  18. package/templates/pubinfo-monorepo/apps/basic/public/browser_upgrade/chrome.png +0 -0
  19. package/templates/pubinfo-monorepo/apps/basic/public/browser_upgrade/edge.png +0 -0
  20. package/templates/pubinfo-monorepo/apps/basic/public/browser_upgrade/index.css +49 -0
  21. package/templates/pubinfo-monorepo/apps/basic/public/loading.css +92 -0
  22. package/templates/pubinfo-monorepo/apps/basic/src/App.vue +7 -0
  23. package/templates/pubinfo-monorepo/apps/basic/src/api/modules/auth/index.ts +3 -0
  24. package/templates/pubinfo-monorepo/apps/basic/src/api/modules/auth/renzhengfuwu.ts +145 -0
  25. package/templates/pubinfo-monorepo/apps/basic/src/api/modules/auth/typings.d.ts +97 -0
  26. package/templates/pubinfo-monorepo/apps/basic/src/api/request.ts +125 -0
  27. package/templates/pubinfo-monorepo/apps/basic/src/assets/icons/logo.svg +1 -0
  28. package/templates/pubinfo-monorepo/apps/basic/src/assets/icons/process-management.svg +1 -0
  29. package/templates/pubinfo-monorepo/apps/basic/src/assets/icons/workbench.svg +1 -0
  30. package/templates/pubinfo-monorepo/apps/basic/src/assets/images/login-bg.webp +0 -0
  31. package/templates/pubinfo-monorepo/apps/basic/src/assets/images/login-bg_dark.webp +0 -0
  32. package/templates/pubinfo-monorepo/apps/basic/src/assets/images/login-small.png +0 -0
  33. package/templates/pubinfo-monorepo/apps/basic/src/assets/images/login-small_dark.webp +0 -0
  34. package/templates/pubinfo-monorepo/apps/basic/src/components/UIProvider/index.vue +51 -0
  35. package/templates/pubinfo-monorepo/apps/basic/src/layouts/index.vue +48 -0
  36. package/templates/pubinfo-monorepo/apps/basic/src/main.ts.hbs +26 -0
  37. package/templates/pubinfo-monorepo/apps/basic/src/modules/captcha.ts +8 -0
  38. package/templates/pubinfo-monorepo/apps/basic/src/modules/rbac.ts +10 -0
  39. package/templates/pubinfo-monorepo/apps/basic/src/routes/index.ts +71 -0
  40. package/templates/pubinfo-monorepo/apps/basic/src/routes/modules/demo/breadcrumb.example.ts +62 -0
  41. package/templates/pubinfo-monorepo/apps/basic/src/routes/modules/demo/link.ts +15 -0
  42. package/templates/pubinfo-monorepo/apps/basic/src/routes/modules/demo/multilevel.menu.example.ts +68 -0
  43. package/templates/pubinfo-monorepo/apps/basic/src/routes/modules/demo/other.page.ts +37 -0
  44. package/templates/pubinfo-monorepo/apps/basic/src/routes/modules/demo/single.ts +14 -0
  45. package/templates/pubinfo-monorepo/apps/basic/src/settings.ts.hbs +8 -0
  46. package/templates/pubinfo-monorepo/apps/basic/src/stores/index.ts +2 -0
  47. package/templates/pubinfo-monorepo/apps/basic/src/stores/modules/conter.ts +16 -0
  48. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/breadcrumb_example/detail1.vue +11 -0
  49. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/breadcrumb_example/detail2.vue +11 -0
  50. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/breadcrumb_example/list1.vue +11 -0
  51. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/breadcrumb_example/list2.vue +11 -0
  52. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/multilevel_menu_example/level2/level3/page1.vue +11 -0
  53. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/multilevel_menu_example/level2/level3/page2.vue +11 -0
  54. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/multilevel_menu_example/level2/page.vue +11 -0
  55. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/multilevel_menu_example/page.vue +11 -0
  56. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/other_page/des.vue +13 -0
  57. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/other_page/index.vue +25 -0
  58. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/preview-empty/index.vue +17 -0
  59. package/templates/pubinfo-monorepo/apps/basic/src/views/demo/single/index.vue +13 -0
  60. package/templates/pubinfo-monorepo/apps/basic/src/views/system/index.vue +5 -0
  61. package/templates/pubinfo-monorepo/apps/basic/src/views/system/login/components/LoginForm.vue +29 -0
  62. package/templates/pubinfo-monorepo/apps/basic/src/views/system/login/components/LoginWithPhone.vue +213 -0
  63. package/templates/pubinfo-monorepo/apps/basic/src/views/system/login/components/PasswordLogin.vue +178 -0
  64. package/templates/pubinfo-monorepo/apps/basic/src/views/system/login/components/Savephone.vue +17 -0
  65. package/templates/pubinfo-monorepo/apps/basic/src/views/system/login/components/Useragreement.vue +26 -0
  66. package/templates/pubinfo-monorepo/apps/basic/src/views/system/login/composables.ts +63 -0
  67. package/templates/pubinfo-monorepo/apps/basic/src/views/system/login/index.vue +142 -0
  68. package/templates/pubinfo-monorepo/apps/basic/tsconfig.json +3 -0
  69. package/templates/pubinfo-monorepo/apps/basic/uno.config.ts +17 -0
  70. package/templates/pubinfo-monorepo/eslint.config.ts +3 -0
  71. package/templates/pubinfo-monorepo/package.json.hbs +46 -0
  72. package/templates/pubinfo-monorepo/pnpm-lock.yaml +12686 -0
  73. package/templates/pubinfo-monorepo/pnpm-workspace.yaml +11 -0
  74. package/templates/pubinfo-monorepo/stylelint.config.js +3 -0
@@ -0,0 +1,178 @@
1
+ <script setup lang="ts">
2
+ import type { FormInstance, Rule } from 'ant-design-vue/es/form';
3
+ import type { UnwrapRef } from 'vue';
4
+ import { PubinfoVerifyInput } from '@pubinfo/module-captcha';
5
+ import { useToggle } from '@vueuse/core';
6
+ import { message, Modal } from 'ant-design-vue';
7
+ import { RESPONSE_CODE, useUserStore } from 'pubinfo';
8
+ import { useFocusElement } from '../composables';
9
+ import Useragreement from './Useragreement.vue';
10
+
11
+ defineOptions({
12
+ name: 'PasswordLogin',
13
+ });
14
+
15
+ interface FormState {
16
+ account: string
17
+ password: string
18
+ captchas: string
19
+ captchaHash: string
20
+ checked: boolean
21
+ }
22
+
23
+ interface HttpError {
24
+ code: RESPONSE_CODE
25
+ data: any
26
+ hint: string
27
+ msg: string
28
+ success: boolean
29
+ }
30
+
31
+ function isHttpError(error: unknown): error is HttpError {
32
+ return (error as HttpError).code !== undefined;
33
+ }
34
+
35
+ const pubinfoVerifyInputRef = ref<InstanceType<typeof PubinfoVerifyInput> | null>(null);
36
+ const userStore = useUserStore();
37
+ const router = useRouter();
38
+ const route = useRoute();
39
+ const { focusElementDataId } = useFocusElement();
40
+
41
+ const loginForm = ref<FormInstance | null>(null);
42
+ const formState: UnwrapRef<FormState & { captchaType?: string }> = reactive({
43
+ account: '',
44
+ password: '',
45
+ captchas: '',
46
+ checked: true,
47
+ captchaHash: '',
48
+ captchaType: '',
49
+ });
50
+
51
+ const rules: Record<string, Rule[]> = {
52
+ account: [{ required: true, whitespace: true, message: '请输入账号' }],
53
+ password: [{ required: true, whitespace: true, message: '请输入密码' }],
54
+ captchas: [{ required: true, whitespace: true, message: '请输入验证码' }],
55
+ };
56
+
57
+ function getCaptchaHash(hash: string) {
58
+ formState.captchaHash = hash;
59
+ }
60
+
61
+ const [loading, setLoading] = useToggle(false);
62
+
63
+ async function onSubmit() {
64
+ if (loading.value) {
65
+ return;
66
+ }
67
+ setLoading(true);
68
+ try {
69
+ await loginForm.value?.validate();
70
+ await userStore.signIn(formState);
71
+ message.success('登录成功');
72
+ router.push(route.query.redirect?.toString() ?? '/');
73
+ }
74
+ catch (error) {
75
+ if (isHttpError(error)) {
76
+ const code = error.code;
77
+ switch (code) {
78
+ case RESPONSE_CODE.LOGINNAME_PASSWORD_WRONG:
79
+ case RESPONSE_CODE.CODE_OVERTIME:
80
+ case RESPONSE_CODE.CODE_WRONG:
81
+ pubinfoVerifyInputRef.value?.refresh();
82
+ break;
83
+ case RESPONSE_CODE.CHANGE_INIT_PASSWORD:
84
+ case RESPONSE_CODE.PASSWORD_EXPIRED:
85
+ createChangePasswordModal(error.msg, error?.data?.accessToken);
86
+ break;
87
+ default:
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ finally {
93
+ setLoading(false);
94
+ }
95
+ }
96
+
97
+ function createChangePasswordModal(msg: string, token: string) {
98
+ Modal.confirm({
99
+ title: '提示',
100
+ content() {
101
+ return msg;
102
+ },
103
+ okText: '修改密码',
104
+ cancelText: '暂不登录',
105
+ onOk() {
106
+ router.push({
107
+ name: 'ChangePassword',
108
+ params: {
109
+ changePassWordToken: token,
110
+ },
111
+ });
112
+ },
113
+ });
114
+ }
115
+ </script>
116
+
117
+ <template>
118
+ <div class="mt-10">
119
+ <AForm ref="loginForm" :model="formState" :rules="rules" @finish="onSubmit">
120
+ <a-form-item name="account">
121
+ <a-input
122
+ v-model:value="formState.account"
123
+ allow-clear
124
+ size="large"
125
+ placeholder="请输入登录账号"
126
+ data-id="account"
127
+ >
128
+ <template #prefix>
129
+ <PubinfoIcon v-if="focusElementDataId === 'account'" name="i-solar-user-bold" color="#1578FF" />
130
+ <PubinfoIcon v-else name="i-solar-user-broken" color="#AFB0B2" />
131
+ </template>
132
+ </a-input>
133
+ </a-form-item>
134
+ <a-form-item name="password">
135
+ <a-input-password
136
+ v-model:value="formState.password"
137
+ allow-clear
138
+ size="large"
139
+ placeholder="请输入登录密码"
140
+ visibility-toggle
141
+ data-id="password"
142
+ >
143
+ <template #prefix>
144
+ <PubinfoIcon v-if="focusElementDataId === 'password'" name="i-solar-lock-password-unlocked-bold" color="#1578FF" />
145
+ <PubinfoIcon v-else name="i-solar-lock-password-unlocked-broken" color="#AFB0B2" />
146
+ </template>
147
+ </a-input-password>
148
+ </a-form-item>
149
+ <a-form-item name="captchas">
150
+ <PubinfoVerifyInput ref="pubinfoVerifyInputRef" v-model="formState.captchas" size="large" @get-captcha-hash="getCaptchaHash" />
151
+ </a-form-item>
152
+ <a-form-item>
153
+ <Useragreement v-model:checked="formState.checked" />
154
+ </a-form-item>
155
+ <a-form-item>
156
+ <div w-full h-48px>
157
+ <a-button
158
+ class="h-48px!"
159
+ type="primary"
160
+ html-type="submit"
161
+ block
162
+ :disabled="!formState.checked"
163
+ :loading="loading"
164
+ >
165
+ 登录
166
+ </a-button>
167
+ </div>
168
+ </a-form-item>
169
+ </AForm>
170
+ </div>
171
+ </template>
172
+
173
+ <style scoped>
174
+ :deep(.ant-input-group-addon) {
175
+ padding: 0 !important;
176
+ overflow: hidden;
177
+ }
178
+ </style>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ defineOptions({
3
+ name: 'Savephone',
4
+ });
5
+
6
+ const checked = defineModel(
7
+ 'checked',
8
+ {
9
+ type: Boolean, default: false,
10
+ });
11
+ </script>
12
+
13
+ <template>
14
+ <a-checkbox v-model:checked="checked">
15
+ 记住手机号
16
+ </a-checkbox>
17
+ </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ defineOptions({
3
+ name: 'Useragreement',
4
+ });
5
+
6
+ const checked = defineModel(
7
+ 'checked',
8
+ {
9
+ type: Boolean, default: true,
10
+ });
11
+
12
+ function jumpUseragreementPage() {
13
+ // 暂未实现用户协议、隐私政策
14
+ }
15
+ </script>
16
+
17
+ <template>
18
+ <a-checkbox v-model:checked="checked">
19
+ 我已阅读并同意<span
20
+ hover:underline
21
+ decoration-2
22
+ text="#1578FF"
23
+ @click.prevent="jumpUseragreementPage"
24
+ >用户协议、隐私政策</span>
25
+ </a-checkbox>
26
+ </template>
@@ -0,0 +1,63 @@
1
+ import type { Component, MaybeRef } from 'vue';
2
+ import { useActiveElement } from '@vueuse/core';
3
+
4
+ interface LoginTabs {
5
+ title: string
6
+ component: Component
7
+ }
8
+
9
+ export function useLoginTabs() {
10
+ const tabs: LoginTabs[] = [
11
+ {
12
+ title: '账号登录',
13
+ component: defineAsyncComponent(() => import('./components/PasswordLogin.vue')),
14
+ },
15
+ {
16
+ title: '手机号登录',
17
+ component: defineAsyncComponent(() => import('./components/LoginWithPhone.vue')),
18
+ },
19
+ ];
20
+ const initialTab = ref(0);
21
+
22
+ function changeActiveTab(activeTab: number): void {
23
+ initialTab.value = activeTab;
24
+ }
25
+ return {
26
+ tabs,
27
+ initialTab,
28
+ changeActiveTab,
29
+ };
30
+ }
31
+
32
+ export function useFocusElement() {
33
+ const activeElement = useActiveElement();
34
+ const focusElementDataId = computed(() =>
35
+ activeElement.value?.dataset?.id || 'null',
36
+ );
37
+ return {
38
+ focusElementDataId,
39
+ };
40
+ }
41
+
42
+ export function useCountdown(initialTime: MaybeRef<number> = 60) {
43
+ const count = ref(toValue(initialTime));
44
+ const isStart = computed(() => {
45
+ return toValue(count) !== toValue(initialTime);
46
+ });
47
+
48
+ function start() {
49
+ count.value--;
50
+ const timer = setInterval(() => {
51
+ count.value--;
52
+ if (count.value === 0) {
53
+ clearInterval(timer);
54
+ count.value = toValue(initialTime);
55
+ }
56
+ }, 1000);
57
+ }
58
+ return {
59
+ count,
60
+ start,
61
+ isStart,
62
+ };
63
+ }
@@ -0,0 +1,142 @@
1
+ <script setup lang="ts">
2
+ import LoginFrom from './components/LoginForm.vue';
3
+
4
+ defineOptions({
5
+ name: 'Login',
6
+ });
7
+
8
+ const title = ref(import.meta.env.VITE_APP_TITLE);
9
+
10
+ const designDescription = [
11
+ {
12
+ title: '快速',
13
+ description: '快速搭建技术中台系统',
14
+ },
15
+ {
16
+ title: '灵活',
17
+ description: '灵活配置系统功能',
18
+ },
19
+ {
20
+ title: '便捷',
21
+ description: '高效提升系统开发效率',
22
+ },
23
+ ];
24
+ </script>
25
+
26
+ <template>
27
+ <div class="warp">
28
+ <div class="warp-blank">
29
+ <div
30
+ hidden
31
+ smd:block
32
+ class="w-full pl-[5vw] pt-[7vh]"
33
+ >
34
+ <div class="logo-group">
35
+ <PubinfoIcon
36
+ name="logo"
37
+ color="transparent"
38
+ mr="10px"
39
+ :size="32"
40
+ />
41
+ <span text="black dark:[#C9D6EF]">{{ title }}</span>
42
+ </div>
43
+ <div class="title-group">
44
+ <span text="black dark:[#C9D6EF]">一体化技术架构 一站式技术支撑</span>
45
+ <div flex="~ row" mt="30px">
46
+ <div
47
+ v-for="(item, index) in designDescription"
48
+ :key="index"
49
+ w-84px
50
+ h-36px
51
+ bg="#2F6BFF"
52
+ rounded-20px
53
+ text="20px #F7F7F7 dark:[#fff]"
54
+ font-normal
55
+ flex="~ center"
56
+ mr="15px"
57
+ >
58
+ {{ item.title }}
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ <div
65
+ h-full
66
+ bg="[rgba(255,255,255,0.1)] smd:[rgba(255,255,255,1)] dark:[#0F1E3B]"
67
+ backdrop-blur-sm
68
+ w="full smd:1/2 xl:800px 2xl:900px"
69
+ transition-all
70
+ flex="~ col"
71
+ justify-between
72
+ pb="40px"
73
+ relative
74
+ >
75
+ <div
76
+ smd:hidden
77
+ flex="~ row center"
78
+ w-full
79
+ h-200px
80
+ absolute
81
+ disable="none"
82
+ >
83
+ <PubinfoIcon
84
+ name="logo"
85
+ color="transparent"
86
+ :size="42"
87
+ mr-15px
88
+ />
89
+ <span text="33px" font="bold">{{ title }}</span>
90
+ </div>
91
+ <div
92
+ w-full
93
+ flex="~"
94
+ justify-center
95
+ pt="20vh"
96
+ >
97
+ <LoginFrom />
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </template>
102
+
103
+ <style scoped>
104
+ .warp {
105
+ --at-apply: relative flex flex-row w-full h-full overflow-hidden;
106
+ background: url("@/assets/images/login-bg.webp") no-repeat;
107
+ background-size: cover;
108
+ }
109
+
110
+ .warp .warp-blank {
111
+ --at-apply: flex-auto basis-0 overflow-hidden;
112
+ }
113
+
114
+ .warp .logo-group {
115
+ --at-apply: flex flex-row items-center h-33px mb-35px text-6 font-400 text-[#151e26];
116
+ }
117
+
118
+ .warp .title-group {
119
+ --at-apply: h-52px text-38px font-800 text-[#072347] tracking-[1.5px];
120
+ }
121
+
122
+ @media (width < 1024px) {
123
+ .warp {
124
+ background: url("@/assets/images/login-small.png") no-repeat left;
125
+ background-size: cover;
126
+ }
127
+ }
128
+
129
+ [data-theme="dark"] {
130
+ .warp {
131
+ background: url("@/assets/images/login-bg_dark.webp") no-repeat;
132
+ background-size: cover;
133
+ }
134
+
135
+ @media (width < 1024px) {
136
+ .warp {
137
+ background: url("@/assets/images/login-small_dark.webp") no-repeat left;
138
+ background-size: cover;
139
+ }
140
+ }
141
+ }
142
+ </style>
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "./.pubinfo/tsconfig.app.json"
3
+ }
@@ -0,0 +1,17 @@
1
+ import { presetUnocss } from 'pubinfo/node';
2
+ import { defineConfig } from 'unocss';
3
+
4
+ export default defineConfig({
5
+ presets: [
6
+ presetUnocss(),
7
+ ],
8
+
9
+ content: {
10
+ pipeline: {
11
+ include: [
12
+ /\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/,
13
+ 'src/routes/**/*.ts',
14
+ ],
15
+ },
16
+ },
17
+ });
@@ -0,0 +1,3 @@
1
+ import pubinfo from '@pubinfo/config/eslint';
2
+
3
+ export default pubinfo();
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "pubinfo-template",
3
+ "type": "module",
4
+ "private": true,
5
+ "packageManager": "pnpm@10.12.4",
6
+ "scripts": {
7
+ "commit": "pubinfo-commit",
8
+ "prepare": "pubinfo-commit --init",
9
+ "lint": "pnpm run lint:eslint && pnpm run lint:stylelint",
10
+ "lint:eslint": "eslint . --cache --fix",
11
+ "lint:stylelint": "stylelint \"apps/*/src/**/*.{css,scss,vue}\" --cache --fix",
12
+ "viewer:eslint-rule": "pnpx @eslint/config-inspector",
13
+ "generate": "pubinfo generate"
14
+ },
15
+ "dependencies": {
16
+ "@ant-design/icons-vue": "^7.0.1",
17
+ "@pubinfo/pro-components": "^1.8.1",
18
+ "@vueuse/core": "^14.0.0",
19
+ "alova": "^3.3.4",
20
+ "ant-design-vue": "^4.2.6",
21
+ "dayjs": "^1.11.19"
22
+ },
23
+ "devDependencies": {
24
+ "@pubinfo/commitlint": "{{version}}",
25
+ "@pubinfo/config": "{{version}}",
26
+ "eslint": "^9.39.1",
27
+ "lint-staged": "^16.2.6",
28
+ "simple-git-hooks": "^2.13.1",
29
+ "stylelint": "^16.25.0",
30
+ "typescript": "^5.9.3"
31
+ },
32
+ "simple-git-hooks": {
33
+ "pre-commit": "pnpm lint-staged && pnpm run lint",
34
+ "commit-msg": "pnpm exec pubinfo-commit --edit $1"
35
+ },
36
+ "lint-staged": {
37
+ "*.{vue,js,ts,jsx,tsx,md,json}": "eslint --cache --fix",
38
+ "*.{css,scss,vue}": "stylelint --cache --fix"
39
+ },
40
+ "config": {
41
+ "commitizen": {
42
+ "path": "node_modules/cz-git",
43
+ "czConfig": ".pubinfo/cz.config.cjs"
44
+ }
45
+ }
46
+ }