src 目录下面新建 api/request.ts
ts
import axios from 'axios'
// 创建 axios 实例
const request = axios.create({
baseURL: '/api', // 基础路径
timeout: 15000, // 请求超时时间
})
// 请求拦截器
request.interceptors.request.use(
(config) => {
return config
},
(error) => {
return Promise.reject(error)
}
)
// 响应拦截器
request.interceptors.response.use(
(response) => {
return response.data
},
(error) => {
return Promise.reject(error)
}
)
export default request
在 api 文件夹下面在添加 login.ts
ts
import request from './request'
// 登录接口返回token
export const adminLoginApi = (data: unknown) => {
return request.post('/admin/login', data)
}

然后在登录页面点击登录的时候调用该登录接口
html
<template>
<div class="login-rule-form">
<div class="content">
<div class="title">商品管理系统</div>
<el-form ref="ruleFormRef" :model="ruleForm" status-icon :rules="rules" label-width="60px">
<el-form-item prop="username" label="账号">
<el-input v-model="ruleForm.username" type="text" placeholder="请输入账号"/>
</el-form-item>
<el-form-item prop="pwd" label="密码">
<el-input v-model="ruleForm.pwd" type="password" placeholder="请输入密码"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loginFn()">登录</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script lang='ts' setup>
import { onMounted, reactive, ref } from 'vue'
import { adminLoginApi } from '@/api/login'
let ruleForm = reactive({
username: "",
pwd: ""
})
// 自定义密码校验规则(_variable - 未使用的变量 ts不校验)
const validatePwd = (_rule: unknown, value: string | undefined, callback: (msg?: string) => void) => {
if(!value) {
callback('密码不能为空')
} else {
callback()
}
}
// 校验规则
let rules = reactive({
username: [
{
required: true,
message: '用户名不能为空',
trigger: 'blur'
}
],
pwd: [
{
required: true,
validator: validatePwd,
trigger: 'blur'
}
]
})
// 获取el-form组件对象
let ruleFormRef = ref()
onMounted(() => {
console.log('组件实例:', ruleFormRef.value)
console.log('DOM 元素:', ruleFormRef.value?.$el)
})
// 登录
const loginFn = () => {
ruleFormRef.value.validate().then(() => {
adminLoginApi({
username: ruleForm.username,
password: ruleForm.pwd
}).then((res) => {
console.log(res)
})
}).catch(() => {
console.log('校验不通过')
})
}
</script>
<style lang='less' scoped>
.login-rule-form {
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #f5f5f5;
overflow: hidden;
box-sizing: border-box;
margin: 0;
padding: 0;
.content {
width: 420px;
padding: 40px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
box-sizing: border-box;
.title {
font-size: 28px;
font-weight: bold;
text-align: center;
margin-bottom: 30px;
}
}
:deep(.el-form) {
.el-form-item {
margin-bottom: 20px;
&:last-child {
margin-bottom: 0;
}
}
.el-button {
width: 100%;
}
}
}
</style>
此外需要配置一下 @ 符号
vite.config.ts 配置
ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import path from 'path'
// https://vite.dev/config/
export default defineConfig({
plugins: [
vue(),
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
})
tsconfig.app.json 配置
json
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"types": ["vite/client"],
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
},
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"erasableSyntaxOnly": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}
点击登录我们就可以看到接口报 404 了
