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 | }, |