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 | 56 | // return defHttp.get({ url: Api.Logout }); |
57 | 57 | } |
58 | 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 | 69 | export function smsCodeLoginApi(params: SmsLoginParams, mode: ErrorMessageMode = 'modal') { |
65 | 70 | return defHttp.post<LoginResultModel>( |
... | ... | @@ -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 | +} | ... | ... |
... | ... | @@ -217,7 +217,7 @@ export const formSchema: FormSchema[] = [ |
217 | 217 | label: '模板用途', |
218 | 218 | required: true, |
219 | 219 | component: 'ApiSelect', |
220 | - helpMessage: ['用户登录、忘记密码模板平台只提供"code"参数', '初始密码设置平台提供"name"参数'], | |
220 | + helpMessage: ['用户登录、忘记密码模板平台只提供"code"参数'], | |
221 | 221 | componentProps: { |
222 | 222 | api: findDictItemByCode, |
223 | 223 | params: { | ... | ... |
... | ... | @@ -2,24 +2,25 @@ |
2 | 2 | <template v-if="getShow"> |
3 | 3 | <LoginFormTitle class="enter-x" /> |
4 | 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 | 5 | <FormItem name="mobile" class="enter-x"> |
14 | 6 | <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" /> |
15 | 7 | </FormItem> |
16 | 8 | <FormItem name="sms" class="enter-x"> |
17 | 9 | <CountdownInput |
10 | + :sendCodeApi="sendLoginSms" | |
18 | 11 | size="large" |
19 | 12 | v-model:value="formData.sms" |
20 | 13 | :placeholder="t('sys.login.smsCode')" |
21 | 14 | /> |
22 | 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 | 25 | <FormItem class="enter-x"> |
25 | 26 | <Button type="primary" size="large" block @click="handleReset" :loading="loading"> |
... | ... | @@ -35,30 +36,46 @@ |
35 | 36 | <script lang="ts" setup> |
36 | 37 | import { reactive, ref, computed, unref } from 'vue'; |
37 | 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 | 40 | import { CountdownInput } from '/@/components/CountDown'; |
40 | 41 | import { useI18n } from '/@/hooks/web/useI18n'; |
41 | 42 | import { useLoginState, useFormRules, LoginStateEnum } from './useLogin'; |
42 | - | |
43 | + import { forgetPasswordApi } from '/@/api/sys/user'; | |
43 | 44 | const FormItem = Form.Item; |
44 | 45 | const { t } = useI18n(); |
45 | - const { handleBackLogin, getLoginState } = useLoginState(); | |
46 | + const { handleBackLogin, getLoginState, setLoginState } = useLoginState(); | |
46 | 47 | const { getFormRules } = useFormRules(); |
47 | 48 | |
48 | 49 | const formRef = ref(); |
49 | 50 | const loading = ref(false); |
50 | - | |
51 | + const InputPassword = Input.Password; | |
51 | 52 | const formData = reactive({ |
52 | - account: '', | |
53 | 53 | mobile: '', |
54 | 54 | sms: '', |
55 | + password: '', | |
55 | 56 | }); |
56 | 57 | |
57 | 58 | const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD); |
58 | 59 | |
59 | 60 | async function handleReset() { |
61 | + setLoginState(LoginStateEnum.LOGIN); | |
60 | 62 | const form = unref(formRef); |
61 | 63 | if (!form) return; |
62 | 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 | 81 | </script> | ... | ... |
... | ... | @@ -56,7 +56,6 @@ |
56 | 56 | import { useI18n } from '/@/hooks/web/useI18n'; |
57 | 57 | import { useDesign } from '/@/hooks/web/useDesign'; |
58 | 58 | import { useLocaleStore } from '/@/store/modules/locale'; |
59 | - import { useUserStore } from '/@/store/modules/user'; | |
60 | 59 | defineProps({ |
61 | 60 | sessionTimeout: { |
62 | 61 | type: Boolean, | ... | ... |
... | ... | @@ -37,39 +37,25 @@ |
37 | 37 | await resetFields(); |
38 | 38 | setDrawerProps({ confirmLoading: false }); |
39 | 39 | isUpdate.value = !!data?.isUpdate; |
40 | + let treeData: any[] = await getOrganizationList(); | |
40 | 41 | |
41 | 42 | //如果是编辑操作,设置页面数据 |
42 | 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 | 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 | //得到页面标题 | ... | ... |