wujingjing
2024-07-26 782c5748ec0462791c95cd5c456813d28ac059c3
Merge branch 'master' of http://47.103.154.90:83/r/WI/Web.V1.0
已修改4个文件
179 ■■■■ 文件已修改
src/api/ai/chat.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/ai/user.ts 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/component/sidebar/components/MenuList.vue 134 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/ai/chat.ts
@@ -2,7 +2,8 @@
import { toFormData } from '/@/utils/util';
const GET_SECTION_SAMPLE_API = '/section/get_section_sample';
const GET_SECTION_A_LIST_API = '/section/get_section_a_list';
export const NO_AUTH_API_LIST = [GET_SECTION_SAMPLE_API, GET_SECTION_A_LIST_API];
export const Get_LOGIN_SMS = '/login_sms';
export const NO_AUTH_API_LIST = [GET_SECTION_SAMPLE_API, GET_SECTION_A_LIST_API, Get_LOGIN_SMS];
//#region ====================== knowledge ======================
@@ -298,7 +299,6 @@
    });
};
export const reportHistoryProblem = async (params, req: any = request) => {
    return req({
        url: 'history/report_history_problem',
@@ -309,7 +309,6 @@
        },
    });
};
export const querySimilarityHistory = async (params, req: any = request) => {
    return req({
@@ -322,8 +321,6 @@
    });
};
export const filterQuery = async (params, req: any = request) => {
    return req({
        url: 'chat/filter_query',
@@ -333,4 +330,4 @@
            'Content-Type': 'application/x-www-form-urlencoded',
        },
    });
};
};
src/api/ai/user.ts
@@ -1,6 +1,7 @@
import { Get_LOGIN_SMS } from './chat';
import request from '/@/utils/request';
import { toFormData } from '/@/utils/util';
export const LOGIN_URL = '/login';
export const TEL_LOGIN_URL = '/send_login_sms';
/**
 * @summary description
 */
@@ -24,3 +25,27 @@
        method: 'POST',
    });
};
//发送短信验证码
export const loginVerifyMessage = async (params, req: any = request) => {
    return req({
        url: TEL_LOGIN_URL,
        method: 'POST',
        data: params,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
    });
};
//发送短信验证码登录
export const loginMessageUser = async (params, req: any = request) => {
    return req({
        url: Get_LOGIN_SMS,
        method: 'POST',
        data: params,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
    });
};
src/layout/component/sidebar/components/MenuList.vue
@@ -42,14 +42,49 @@
            <div class="sign_in">
                <i class="ywicon icon-guanbi closes" @click="handleClose"></i>
                <h1><span>登录 WI 水务</span></h1>
                <el-form ref="loginFormRef" :model="state.loginForm" :rules="loginRules" class="demo-ruleForm mt-[24px]" size="large">
                    <el-form-item label="账号" prop="account">
                        <el-input v-model="state.loginForm.account" clearable />
                    </el-form-item>
                    <el-form-item label="密码" prop="pwd">
                        <el-input v-model="state.loginForm.pwd" type="password" autocomplete="off" clearable />
                    </el-form-item>
                </el-form>
                <el-tabs v-model="state.activeLoginName" class="mt-[24px]" @tab-change="handleUserClick">
                    <el-tab-pane label="账户密码登录" name="accountUser">
                        <el-form
                            ref="loginFormRef"
                            :model="state.loginForm"
                            :rules="loginRules"
                            class="demo-ruleForm mt-[24px] min-h-[140px]"
                            size="large"
                        >
                            <el-form-item label="账号" prop="account">
                                <el-input v-model="state.loginForm.account" clearable />
                            </el-form-item>
                            <el-form-item label="密码" prop="pwd">
                                <el-input v-model="state.loginForm.pwd" type="password" autocomplete="off" clearable />
                            </el-form-item>
                        </el-form>
                    </el-tab-pane>
                    <el-tab-pane label="手机号登录" name="phoneUser">
                        <el-form
                            ref="formPhoneRef"
                            :rules="loginPhoneRules"
                            :model="state.loginPhoneForm"
                            size="large"
                            class="mt-[24px] min-h-[140px]"
                        >
                            <el-form-item label="手机号" prop="phoneUser">
                                <el-input v-model="state.loginPhoneForm.phoneUser" placeholder="请输入手机号码" clearable>
                                    <template #prepend>+86</template>
                                </el-input>
                            </el-form-item>
                            <el-form-item prop="verifyCode" label="验证码">
                                <el-input v-model="state.loginPhoneForm.verifyCode" placeholder="请输入四位验证码" maxlength="6" clearable>
                                    <template #append>
                                        <el-button type="primary" @click="handleSendVerifyCode" :disabled="countdown > 0">{{
                                            countdown > 0 ? `${countdown}秒后重试` : '获取验证码'
                                        }}</el-button>
                                    </template>
                                </el-input>
                            </el-form-item>
                        </el-form>
                    </el-tab-pane>
                </el-tabs>
                <div class="mt-[24px]">
                    <el-button type="primary" @click="onSubmit" class="set-login_btn">登录</el-button>
                </div>
@@ -59,19 +94,19 @@
</template>
<script setup lang="ts">
import type { FormInstance } from 'element-plus';
import { ElMessage, type FormInstance } from 'element-plus';
import { computed, onMounted, reactive, ref, watchEffect } from 'vue';
import { PostLogin } from '/@/api/ai/user';
import { PostLogin, loginMessageUser, loginVerifyMessage } from '/@/api/ai/user';
import router from '/@/router';
import emitter from '/@/utils/mitt';
import { accessSessionKey, userNameKey } from '/@/utils/request';
import { gotoRoute } from '/@/utils/route';
import { Local, LoginInfo } from '/@/utils/storage';
const loginFormRef = ref<FormInstance>(null);
const loginFormRef = ref<FormInstance>(null); //账户密码登录
const formPhoneRef = ref(); //手机号登录
const isLoginStatus = ref(!!Local.get(accessSessionKey));
const userName = ref('');
const countdown = ref(0);
const firstUserCharacter = computed(() => userName.value?.[0]?.toUpperCase());
watchEffect(() => {
    if (!isLoginStatus.value) return;
@@ -109,11 +144,23 @@
        account: '',
        pwd: '',
    },
    loginPhoneForm: {
        phoneUser: '',
        verifyCode: '',
    },
    activeLoginName: 'accountUser',
});
const loginRules = reactive({
    account: [{ required: true, message: '请输入账号', trigger: 'blur' }],
    pwd: [{ required: true, message: '请输入密码', trigger: 'blur' }],
});
const loginPhoneRules = {
    phoneUser: [
        { required: true, message: '请输入手机号码', trigger: 'blur' },
        { pattern: /^1\d{10}$/, message: '请输入正确的手机号码', trigger: 'blur' },
    ],
    verifyCode: [{ required: true, message: '请输入验证码', trigger: 'blur' }],
};
const handleClick = (item) => {
    gotoRoute({ name: item.routerName });
};
@@ -126,14 +173,29 @@
};
//登录
const onSubmit = async () => {
    const isValid = await loginFormRef.value.validate().catch(() => {});
    if (!isValid) return;
    const res = await PostLogin({
        user: state.loginForm.account,
        pass: state.loginForm.pwd,
    });
    if (state.activeLoginName === 'accountUser') {
        //账户密码登录
        const isValid = await loginFormRef.value.validate().catch(() => {});
        if (!isValid) return;
        const res = await PostLogin({
            user: state.loginForm.account,
            pass: state.loginForm.pwd,
        });
    LoginInfo.set(res.hswatersession,state.loginForm.account);
        LoginInfo.set(res.hswatersession, state.loginForm.account);
    } else if (state.activeLoginName === 'phoneUser') {
        //手机登录
        const isValid = await formPhoneRef.value.validate().catch(() => {});
        if (!isValid) return;
        const res = await loginMessageUser({
            phone: state.loginPhoneForm.phoneUser,
            code: state.loginPhoneForm.verifyCode,
        });
        if (!res.json_ok) {
            return ElMessage.warning(res.json_msg);
        }
        LoginInfo.set(res.hswatersession, state.loginPhoneForm.phoneUser);
    }
    state.isShowLogin = false;
    isLoginStatus.value = true;
    window.location.reload();
@@ -158,7 +220,33 @@
        state.isShowExitLogin = false;
    }
};
//切换用户登录页面
const handleUserClick = (item) => {
    state.activeLoginName = item;
    // formPhoneRef?.value?.resetFields();
    // loginFormRef.value.resetFields();
};
//获取验证码
const handleSendVerifyCode = async () => {
    formPhoneRef.value.validateField('phoneUser', async (valid: boolean) => {
        if (valid) {
            const res = await loginVerifyMessage({
                phone: state.loginPhoneForm.phoneUser,
            });
            if (res.json_ok) {
                countdown.value = 60; //开启倒计时
                // 倒计时逻辑
                const intervalId = setInterval(() => {
                    if (countdown.value > 0) {
                        countdown.value--;
                    } else {
                        clearInterval(intervalId);
                    }
                }, 1000);
            }
        }
    });
};
onMounted(() => {
    emitter.on('openLoginDlg', () => {
        if (state.isShowLogin || isLoginStatus.value) return;
@@ -343,6 +431,7 @@
    -ms-flex-pack: center;
    justify-content: center;
}
.pc-login {
    position: fixed;
    top: 0;
@@ -405,6 +494,9 @@
                    background-color: #fff;
                    border-radius: 5px;
                }
                :deep(.el-form-item--large .el-form-item__error) {
                    padding: unset !important;
                }
            }
            .set-pwd {
                text-align: right;
src/utils/request.ts
@@ -1,12 +1,12 @@
import type { AxiosInstance, AxiosRequestConfig } from 'axios';
import axios from 'axios';
import { ElMessage } from 'element-plus';
import { NO_AUTH_API_LIST } from '../api/ai/chat';
import { LOGIN_URL, TEL_LOGIN_URL } from '../api/ai/user';
import emitter from './mitt';
import { debounce } from './util';
import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants';
import { Local, LoginInfo, Session } from '/@/utils/storage';
import { LOGIN_URL } from '../api/ai/user';
import { NO_AUTH_API_LIST } from '../api/ai/chat';
// import JSONbig from 'json-bigint';
//#region ====================== 后端 res.err_code ======================
@@ -48,7 +48,7 @@
                    // 将 token 添加到请求报文头中
                    config.headers['hswatersession'] = accessSession;
                } else {
                    if (config.url !== LOGIN_URL) {
                    if (config.url !== LOGIN_URL && config.url !== TEL_LOGIN_URL) {
                        handleNoAuth(config.url);
                        throw '权限验证失败';
                    }
@@ -88,7 +88,7 @@
            if (!serveData.json_ok) {
                switch (serveData?.err_code) {
                    case ErrorCode.Auth:
                        if (res.config.url !== LOGIN_URL) {
                        if (res.config.url !== LOGIN_URL && res.config.url !== TEL_LOGIN_URL) {
                            handleNoAuth();
                            throw '权限验证失败';
                        }
@@ -97,7 +97,6 @@
                        ElMessage.error('内部错误!');
                        throw '内部错误';
                }
            }
            return res.data;
        },