Files
gangyan/chat_web_front/src/views/login/index.vue
liuguancen 108022cebd feat: 品牌升级(知冶→战知) + 应用工具广场重构 + 新增工具集成
品牌升级:
- 全站品牌从"知冶"更名为"战知"
- 更换 favicon、侧边栏 logo、登录页 logo
- 更新登录页标语和首页欢迎语

应用广场重构:
- 从后端数据库驱动改为前端静态配置,按分类 tab 展示
- 新增工具卡片 UI,支持 logo 图片和 emoji 图标

新增工具部署:
- Stirling PDF (端口18080) - PDF 处理工具箱
- Excalidraw (端口18081) - 手绘风格白板,集成 AI 绘图
- TrWebOCR (端口18083) - 中文离线 OCR
- LibreTranslate (端口18084) - 中英翻译引擎
- PPTist (端口18085) - 在线 PPT 编辑器
- PPTist AI 后端 (端口18086) - 对接 deepseek-v3 生成大纲/PPT/写作
- Excalidraw AI 代理 (端口18082) - 对接 deepseek-v3 生成 Mermaid 图

其他:
- 智能场景仅保留"选题推荐"
- vite 代理配置增加 /pdf/ 和 /draw/ 路由

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 17:24:51 +08:00

191 lines
4.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="loginPage">
<Waves></Waves>
<div>
<img :src="projectLogo" alt="" class="loginLogo" />
</div>
<div class="loginContent">
<div class="loginTitle">
<div>
聚尖端之力创多维平台
<br />
<span class="loginInfo">
聚合科技动能扩展创新疆界引领行业跃迁升级
</span>
</div>
</div>
<div class="loginOperate">
<img
:src="projectLogo2"
class="logoImg"
alt=""
/>
<el-form
ref="ruleFormRef"
label-position="top"
label-width="auto"
:model="ruleForm"
:rules="rules"
style="width: 20vw; margin-top: 5%"
hide-required-asterisk
>
<el-form-item label="手机号" prop="tel">
<el-input v-model.trim="ruleForm.tel" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model.trim="ruleForm.password" show-password />
</el-form-item>
<el-form-item prop="checked">
<el-checkbox v-model="ruleForm.checked" label="" size="large" />
<span
>勾选即代表您阅读并同意<a
target="_blank"
href="http://www.metalinfo.cn/agreement.html?pageId=c03923c64e6b4d0896488212054b1742"
style="color: #0969da"
>用户协议</a
></span
>
</el-form-item>
<el-form-item>
<el-button
type="primary"
style="width: 100%; margin-top: 20px"
@click="submitForm(ruleFormRef)"
:disabled="isDisabled"
>
{{ loginTip }}
</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang='ts'>
import { computed, ref, onMounted, reactive } from "vue";
import projectLogo from "@/assets/images/login/projectLogo-white.svg";
import projectLogo2 from "@/assets/images/login/projectLogo.svg";
import type { FormInstance, FormRules } from "element-plus";
import { fetchVerify } from "@/api";
import { useAuthStore } from "@/store";
import { useRouter } from "vue-router";
import Waves from "../../components/Waves.vue";
interface RuleForm {
tel: string;
password: string;
checked: boolean;
loginType: number;
}
interface Token {
token: string;
refreshToken: string;
expiresIn: number;
}
const ruleForm = reactive<RuleForm>({
tel: "",
password: "",
checked: true,
loginType: 3,
});
const ruleFormRef = ref<FormInstance>();
const authStore = useAuthStore();
const router = useRouter();
const isDisabled = ref<Boolean>(false);
const loginTip = ref<string>("登录");
const validateChecked = (rule: any, value: any, callback: any) => {
if (!value) {
callback(new Error("请勾选“用户协议”"));
} else {
callback();
}
};
const rules = reactive<FormRules<RuleForm>>({
tel: [{ required: true, message: "请输入手机号", trigger: "blur" }],
password: [{ required: true, message: "请输入密码", trigger: "blur" }],
checked: {
required: true,
message: "请勾选“用户协议”",
trigger: "blur",
validator: validateChecked,
},
});
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
isDisabled.value = true;
loginTip.value = "登录中...";
handleVerify();
} else {
console.log("error submit!", fields);
}
});
};
const handleVerify = async () => {
try {
fetchVerify<Token>(ruleForm).then((res) => {
if (res.code === 200) {
authStore.setToken(res.data.token);
router.push("/chat");
} else {
isDisabled.value = false;
loginTip.value = "登录";
ElMessage.error(res.msg);
}
});
} finally {
}
};
</script>
<style scoped lang="scss">
.loginPage {
width: 100vw;
height: 100vh;
background-image: url("../../assets/images/login/loginBg.png");
background-size: cover;
display: flex;
flex-direction: column;
}
.loginLogo {
position: absolute;
height: 6.1vh;
margin: 2rem;
}
.loginContent {
height: 100vh;
display: flex;
justify-content: space-around;
align-items: center;
z-index: 1;
}
.loginTitle {
font-weight: 700;
font-size: 7vh;
color: white;
display: flex;
flex-direction: column;
}
.loginInfo {
font-weight: 300;
font-size: 2vh;
}
.loginOperate {
background: white;
display: flex;
flex-direction: column;
border-radius: 0.75rem;
align-items: center;
padding: 4vh;
.logoImg {
height: 5vh;
}
}
::v-deep .is-required .el-form-item__label::after {
content: "*";
color: #ff0000;
margin-left: 4px;
}
</style>