Commit 8c3f7f22a0541456e4b8894f87d975012e10755a
Merge branch 'sqy_dev' into 'main'
'fix:解决refreshToken问题' See merge request huang/yun-teng-iot-front!150
Showing
8 changed files
with
61 additions
and
46 deletions
@@ -56,10 +56,15 @@ export function doLogout() { | @@ -56,10 +56,15 @@ export function doLogout() { | ||
56 | // return defHttp.get({ url: Api.Logout }); | 56 | // return defHttp.get({ url: Api.Logout }); |
57 | } | 57 | } |
58 | export function doRefreshToken(params: RefreshTokenParams) { | 58 | export function doRefreshToken(params: RefreshTokenParams) { |
59 | - return defHttp.post<LoginResultModel>({ | ||
60 | - url: Api.RefreshToken, | ||
61 | - params, | ||
62 | - }); | 59 | + return defHttp.post<LoginResultModel>( |
60 | + { | ||
61 | + url: Api.RefreshToken, | ||
62 | + params, | ||
63 | + }, | ||
64 | + { | ||
65 | + joinPrefix: false, | ||
66 | + } | ||
67 | + ); | ||
63 | } | 68 | } |
64 | export function smsCodeLoginApi(params: SmsLoginParams, mode: ErrorMessageMode = 'modal') { | 69 | export function smsCodeLoginApi(params: SmsLoginParams, mode: ErrorMessageMode = 'modal') { |
65 | return defHttp.post<LoginResultModel>( | 70 | return defHttp.post<LoginResultModel>( |
@@ -72,3 +77,10 @@ export function smsCodeLoginApi(params: SmsLoginParams, mode: ErrorMessageMode = | @@ -72,3 +77,10 @@ export function smsCodeLoginApi(params: SmsLoginParams, mode: ErrorMessageMode = | ||
72 | } | 77 | } |
73 | ); | 78 | ); |
74 | } | 79 | } |
80 | + | ||
81 | +export function forgetPasswordApi(params) { | ||
82 | + return defHttp.post({ | ||
83 | + url: '', | ||
84 | + params, | ||
85 | + }); | ||
86 | +} |
@@ -10,7 +10,7 @@ export const PageEnum = { | @@ -10,7 +10,7 @@ export const PageEnum = { | ||
10 | // error log page path | 10 | // error log page path |
11 | ERROR_LOG_PAGE: '/error-log/list', | 11 | ERROR_LOG_PAGE: '/error-log/list', |
12 | //消息配置 | 12 | //消息配置 |
13 | - MESSAGE_CONFIG: '/config/message', | 13 | + MESSAGE_CONFIG: '/message/config', |
14 | //设备配置 | 14 | //设备配置 |
15 | DEVICE_PROFILE: '/device/profiles', | 15 | DEVICE_PROFILE: '/device/profiles', |
16 | }; | 16 | }; |
@@ -217,7 +217,7 @@ export const formSchema: FormSchema[] = [ | @@ -217,7 +217,7 @@ export const formSchema: FormSchema[] = [ | ||
217 | label: '模板用途', | 217 | label: '模板用途', |
218 | required: true, | 218 | required: true, |
219 | component: 'ApiSelect', | 219 | component: 'ApiSelect', |
220 | - helpMessage: ['用户登录、忘记密码模板平台只提供"code"参数', '初始密码设置平台提供"name"参数'], | 220 | + helpMessage: ['用户登录、忘记密码模板平台只提供"code"参数'], |
221 | componentProps: { | 221 | componentProps: { |
222 | api: findDictItemByCode, | 222 | api: findDictItemByCode, |
223 | params: { | 223 | params: { |
@@ -2,24 +2,25 @@ | @@ -2,24 +2,25 @@ | ||
2 | <template v-if="getShow"> | 2 | <template v-if="getShow"> |
3 | <LoginFormTitle class="enter-x" /> | 3 | <LoginFormTitle class="enter-x" /> |
4 | <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef"> | 4 | <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef"> |
5 | - <FormItem name="account" class="enter-x"> | ||
6 | - <Input | ||
7 | - size="large" | ||
8 | - v-model:value="formData.account" | ||
9 | - :placeholder="t('sys.login.userName')" | ||
10 | - /> | ||
11 | - </FormItem> | ||
12 | - | ||
13 | <FormItem name="mobile" class="enter-x"> | 5 | <FormItem name="mobile" class="enter-x"> |
14 | <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" /> | 6 | <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" /> |
15 | </FormItem> | 7 | </FormItem> |
16 | <FormItem name="sms" class="enter-x"> | 8 | <FormItem name="sms" class="enter-x"> |
17 | <CountdownInput | 9 | <CountdownInput |
10 | + :sendCodeApi="sendLoginSms" | ||
18 | size="large" | 11 | size="large" |
19 | v-model:value="formData.sms" | 12 | v-model:value="formData.sms" |
20 | :placeholder="t('sys.login.smsCode')" | 13 | :placeholder="t('sys.login.smsCode')" |
21 | /> | 14 | /> |
22 | </FormItem> | 15 | </FormItem> |
16 | + <FormItem name="password" class="enter-x"> | ||
17 | + <InputPassword | ||
18 | + size="large" | ||
19 | + v-model:value="formData.password" | ||
20 | + visibilityToggle | ||
21 | + :placeholder="t('sys.login.password')" | ||
22 | + /> | ||
23 | + </FormItem> | ||
23 | 24 | ||
24 | <FormItem class="enter-x"> | 25 | <FormItem class="enter-x"> |
25 | <Button type="primary" size="large" block @click="handleReset" :loading="loading"> | 26 | <Button type="primary" size="large" block @click="handleReset" :loading="loading"> |
@@ -35,30 +36,46 @@ | @@ -35,30 +36,46 @@ | ||
35 | <script lang="ts" setup> | 36 | <script lang="ts" setup> |
36 | import { reactive, ref, computed, unref } from 'vue'; | 37 | import { reactive, ref, computed, unref } from 'vue'; |
37 | import LoginFormTitle from './LoginFormTitle.vue'; | 38 | import LoginFormTitle from './LoginFormTitle.vue'; |
38 | - import { Form, Input, Button } from 'ant-design-vue'; | 39 | + import { Form, Input, Button, message } from 'ant-design-vue'; |
39 | import { CountdownInput } from '/@/components/CountDown'; | 40 | import { CountdownInput } from '/@/components/CountDown'; |
40 | import { useI18n } from '/@/hooks/web/useI18n'; | 41 | import { useI18n } from '/@/hooks/web/useI18n'; |
41 | import { useLoginState, useFormRules, LoginStateEnum } from './useLogin'; | 42 | import { useLoginState, useFormRules, LoginStateEnum } from './useLogin'; |
42 | - | 43 | + import { forgetPasswordApi } from '/@/api/sys/user'; |
43 | const FormItem = Form.Item; | 44 | const FormItem = Form.Item; |
44 | const { t } = useI18n(); | 45 | const { t } = useI18n(); |
45 | - const { handleBackLogin, getLoginState } = useLoginState(); | 46 | + const { handleBackLogin, getLoginState, setLoginState } = useLoginState(); |
46 | const { getFormRules } = useFormRules(); | 47 | const { getFormRules } = useFormRules(); |
47 | 48 | ||
48 | const formRef = ref(); | 49 | const formRef = ref(); |
49 | const loading = ref(false); | 50 | const loading = ref(false); |
50 | - | 51 | + const InputPassword = Input.Password; |
51 | const formData = reactive({ | 52 | const formData = reactive({ |
52 | - account: '', | ||
53 | mobile: '', | 53 | mobile: '', |
54 | sms: '', | 54 | sms: '', |
55 | + password: '', | ||
55 | }); | 56 | }); |
56 | 57 | ||
57 | const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD); | 58 | const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD); |
58 | 59 | ||
59 | async function handleReset() { | 60 | async function handleReset() { |
61 | + setLoginState(LoginStateEnum.LOGIN); | ||
60 | const form = unref(formRef); | 62 | const form = unref(formRef); |
61 | if (!form) return; | 63 | if (!form) return; |
62 | await form.resetFields(); | 64 | await form.resetFields(); |
63 | } | 65 | } |
66 | + | ||
67 | + async function sendLoginSms() { | ||
68 | + const reg = | ||
69 | + /^[1](([3][0-9])|([4][0,1,4-9])|([5][0-3,5-9])|([6][2,5,6,7])|([7][0-8])|([8][0-9])|([9][0-3,5-9]))[0-9]{8}$/; | ||
70 | + if (reg.test(formData.mobile)) { | ||
71 | + const sendRes = await forgetPasswordApi(formData.mobile); | ||
72 | + if (!sendRes) { | ||
73 | + message.error('发送失败'); | ||
74 | + return false; | ||
75 | + } | ||
76 | + return true; | ||
77 | + } else { | ||
78 | + message.error('请输入正确手机号码'); | ||
79 | + } | ||
80 | + } | ||
64 | </script> | 81 | </script> |
@@ -56,7 +56,6 @@ | @@ -56,7 +56,6 @@ | ||
56 | import { useI18n } from '/@/hooks/web/useI18n'; | 56 | import { useI18n } from '/@/hooks/web/useI18n'; |
57 | import { useDesign } from '/@/hooks/web/useDesign'; | 57 | import { useDesign } from '/@/hooks/web/useDesign'; |
58 | import { useLocaleStore } from '/@/store/modules/locale'; | 58 | import { useLocaleStore } from '/@/store/modules/locale'; |
59 | - import { useUserStore } from '/@/store/modules/user'; | ||
60 | defineProps({ | 59 | defineProps({ |
61 | sessionTimeout: { | 60 | sessionTimeout: { |
62 | type: Boolean, | 61 | type: Boolean, |
@@ -88,7 +88,7 @@ export function useFormRules(formData?: Recordable) { | @@ -88,7 +88,7 @@ export function useFormRules(formData?: Recordable) { | ||
88 | // reset password form rules | 88 | // reset password form rules |
89 | case LoginStateEnum.RESET_PASSWORD: | 89 | case LoginStateEnum.RESET_PASSWORD: |
90 | return { | 90 | return { |
91 | - account: accountFormRule, | 91 | + password: passwordFormRule, |
92 | ...mobileRule, | 92 | ...mobileRule, |
93 | }; | 93 | }; |
94 | 94 |
@@ -37,39 +37,25 @@ | @@ -37,39 +37,25 @@ | ||
37 | await resetFields(); | 37 | await resetFields(); |
38 | setDrawerProps({ confirmLoading: false }); | 38 | setDrawerProps({ confirmLoading: false }); |
39 | isUpdate.value = !!data?.isUpdate; | 39 | isUpdate.value = !!data?.isUpdate; |
40 | + let treeData: any[] = await getOrganizationList(); | ||
40 | 41 | ||
41 | //如果是编辑操作,设置页面数据 | 42 | //如果是编辑操作,设置页面数据 |
42 | if (unref(isUpdate)) { | 43 | if (unref(isUpdate)) { |
43 | //为表单赋值 | 44 | //为表单赋值 |
44 | - await setFieldsValue({ | ||
45 | - ...data.record, | ||
46 | - }); | ||
47 | - organizationId = Reflect.get(data.record, 'id'); | ||
48 | - let treeData: any = await getOrganizationList(); | ||
49 | - | 45 | + await setFieldsValue(data.record); |
46 | + const organizationId = Reflect.get(data.record, 'id'); | ||
50 | // 过滤当前选中的组织, | 47 | // 过滤当前选中的组织, |
51 | - function filterTransFun(treeData: any[]) { | 48 | + (function filterTransFun(treeData: any[]) { |
52 | treeData.forEach((item, index, arr) => { | 49 | treeData.forEach((item, index, arr) => { |
53 | - if (item.id === organizationId) { | ||
54 | - arr.splice(index, 1); | ||
55 | - } | ||
56 | - if (item.children.length) { | ||
57 | - filterTransFun(item.children); | ||
58 | - } | 50 | + if (item.id === organizationId) arr.splice(index, 1); |
51 | + if (item.children.length) filterTransFun(item.children); | ||
59 | }); | 52 | }); |
60 | - } | ||
61 | - filterTransFun(treeData); | ||
62 | - await updateSchema({ | ||
63 | - field: 'parentId', | ||
64 | - componentProps: { treeData }, | ||
65 | - }); | ||
66 | - } else { | ||
67 | - let treeData = await getOrganizationList(); | ||
68 | - await updateSchema({ | ||
69 | - field: 'parentId', | ||
70 | - componentProps: { treeData }, | ||
71 | - }); | 53 | + })(treeData); |
72 | } | 54 | } |
55 | + await updateSchema({ | ||
56 | + field: 'parentId', | ||
57 | + componentProps: { treeData }, | ||
58 | + }); | ||
73 | }); | 59 | }); |
74 | 60 | ||
75 | //得到页面标题 | 61 | //得到页面标题 |
@@ -37,6 +37,7 @@ export const formSchema: FormSchema[] = [ | @@ -37,6 +37,7 @@ export const formSchema: FormSchema[] = [ | ||
37 | key: 'id', | 37 | key: 'id', |
38 | value: 'id', | 38 | value: 'id', |
39 | }, | 39 | }, |
40 | + maxTagCount: 10, | ||
40 | getPopupContainer: () => document.body, | 41 | getPopupContainer: () => document.body, |
41 | }, | 42 | }, |
42 | }, | 43 | }, |