【招生主控端】 修复# 1、支持用户修改账号密码;2、修改标题名称

master
kaeery 2025-03-10 16:26:08 +08:00
parent 1c912f58a5
commit 40c084c1f6
8 changed files with 286 additions and 141 deletions

View File

@ -1,71 +1,68 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-CN"> <html lang="zh-CN">
<head>
<head> <meta charset="UTF-8" />
<meta charset="UTF-8" /> <link rel="icon" href="/favicon.ico" />
<link rel="icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>易客云-后台管理系统</title>
<title>粤好生活-后台管理系统</title> <style>
<style> * {
* { margin: 0;
margin: 0; padding: 0;
padding: 0;
}
.preload {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
width: 100vw;
}
.circular {
height: 42px;
width: 42px;
animation: loading-rotate 2s linear infinite;
}
.circular .path {
animation: loading-dash 1.5s ease-in-out infinite;
stroke-dasharray: 90, 150;
stroke-dashoffset: 0;
stroke-width: 2;
stroke: #4073fa;
stroke-linecap: round;
}
@keyframes loading-rotate {
100% {
transform: rotate(1turn);
} }
}
@keyframes loading-dash { .preload {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
width: 100vw;
}
0% { .circular {
height: 42px;
width: 42px;
animation: loading-rotate 2s linear infinite;
}
.circular .path {
animation: loading-dash 1.5s ease-in-out infinite;
stroke-dasharray: 90, 150; stroke-dasharray: 90, 150;
stroke-dashoffset: -40px; stroke-dashoffset: 0;
stroke-width: 2;
stroke: #4073fa;
stroke-linecap: round;
} }
100% { @keyframes loading-rotate {
stroke-dasharray: 90, 150; 100% {
stroke-dashoffset: -120px; transform: rotate(1turn);
}
} }
}
</style>
<script src="https://map.qq.com/api/gljs?libraries=tools&v=1.exp&key=2SABZ-S4TWH-AMCDO-W742B-SKEOE-UWBKJ"></script>
</head>
<body> @keyframes loading-dash {
<div id="app"> 0% {
<div class="preload"> stroke-dasharray: 90, 150;
<svg viewBox="25 25 50 50" class="circular"> stroke-dashoffset: -40px;
<circle cx="50" cy="50" r="20" fill="none" class="path"></circle> }
</svg>
100% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -120px;
}
}
</style>
<script src="https://map.qq.com/api/gljs?libraries=tools&v=1.exp&key=2SABZ-S4TWH-AMCDO-W742B-SKEOE-UWBKJ"></script>
</head>
<body>
<div id="app">
<div class="preload">
<svg viewBox="25 25 50 50" class="circular">
<circle cx="50" cy="50" r="20" fill="none" class="path"></circle>
</svg>
</div>
</div> </div>
</div> <script type="module" src="/src/main.ts"></script>
<script type="module" src="/src/main.ts"></script> </body>
</body> </html>
</html>

BIN
primary-admin.zip 100644

Binary file not shown.

View File

@ -8,7 +8,7 @@
*/ */
const config = { const config = {
terminal: 1, //终端 terminal: 1, //终端
title: '粤好生活-后台管理系统', //网站默认标题 title: '易客云-后台管理系统', //网站默认标题
version: '1.3.3', //版本号 version: '1.3.3', //版本号
baseUrl: `${import.meta.env.VITE_APP_BASE_URL || ''}/`, //请求接口域名 baseUrl: `${import.meta.env.VITE_APP_BASE_URL || ''}/`, //请求接口域名
urlPrefix: 'api', //请求默认前缀 urlPrefix: 'api', //请求默认前缀

View File

@ -1,11 +1,11 @@
<template> <template>
<footer class="layout-footer bg-[#f5f5f5] bg-opacity-90 text-center"> <footer class="layout-footer bg-[#f5f5f5] bg-opacity-90 text-center">
<div class="p-2 text-xs text-tx-secondary max-w-[900px] mx-auto"> <div class="p-2 text-xs text-tx-secondary max-w-[900px] mx-auto">
<a href="http://beian.miit.gov.cn" class="my-[10px]">Copyright © 2023 粤ICP备2023059183号 - 广东粤好生活服务有限公司版权所有</a> <a href="http://beian.miit.gov.cn" class="my-[10px]">Copyright © 2023 粤ICP备2023059183号 - 广东合创云科技有限公司版权所有</a>
</div> </div>
</footer> </footer>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import useAppStore from '@/stores/modules/app' import useAppStore from '@/stores/modules/app'

View File

@ -34,20 +34,20 @@ export const constantRoutes: Array<RouteRecordRaw> = [
path: PageEnum.LOGIN, path: PageEnum.LOGIN,
component: () => import('@/views/account/login.vue') component: () => import('@/views/account/login.vue')
}, },
// { {
// path: '/user', path: '/user',
// component: LAYOUT, component: LAYOUT,
// children: [ children: [
// { {
// path: 'setting', path: 'setting',
// name: Symbol(), name: Symbol(),
// component: () => import('@/views/user/setting.vue'), component: () => import('@/views/user/setting.vue'),
// meta: { meta: {
// title: '个人设置' title: '个人设置'
// } }
// } }
// ] ]
// }, },
{ {
path: '/dev_tools', path: '/dev_tools',
component: LAYOUT, component: LAYOUT,

View File

@ -6,7 +6,15 @@
<el-input v-model="formData.account" placeholder="请输入账号名称" clearable :maxlength="20" show-word-limit /> <el-input v-model="formData.account" placeholder="请输入账号名称" clearable :maxlength="20" show-word-limit />
</el-form-item> </el-form-item>
<el-form-item v-if="formData.id == ''" label="账号密码" prop="password"> <el-form-item v-if="formData.id == ''" label="账号密码" prop="password">
<el-input v-model="formData.password" placeholder="请输入账号密码" clearable :maxlength="20" show-word-limit /> <el-input
v-model="formData.password"
placeholder="请输入账号密码"
clearable
:maxlength="20"
show-word-limit
type="password"
show-password
/>
</el-form-item> </el-form-item>
<el-form-item label="客户名称" prop="clientName"> <el-form-item label="客户名称" prop="clientName">
<el-input v-model="formData.clientName" placeholder="请输入客户名称" clearable :maxlength="20" show-word-limit /> <el-input v-model="formData.clientName" placeholder="请输入客户名称" clearable :maxlength="20" show-word-limit />

View File

@ -1,66 +1,65 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>粤好生活-后台管理系统</title> <title>易客云-后台管理系统</title>
<style> <style>
* { * {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
.preload { .preload {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
height: 100vh; height: 100vh;
width: 100vw; width: 100vw;
} }
.circular { .circular {
height: 42px; height: 42px;
width: 42px; width: 42px;
animation: loading-rotate 2s linear infinite; animation: loading-rotate 2s linear infinite;
} }
.circular .path { .circular .path {
animation: loading-dash 1.5s ease-in-out infinite; animation: loading-dash 1.5s ease-in-out infinite;
stroke-dasharray: 90, 150; stroke-dasharray: 90, 150;
stroke-dashoffset: 0; stroke-dashoffset: 0;
stroke-width: 2; stroke-width: 2;
stroke: #4073fa; stroke: #4073fa;
stroke-linecap: round; stroke-linecap: round;
} }
@keyframes loading-rotate { @keyframes loading-rotate {
100% { 100% {
transform: rotate(1turn); transform: rotate(1turn);
} }
} }
@keyframes loading-dash { @keyframes loading-dash {
0% {
0% { stroke-dasharray: 90, 150;
stroke-dasharray: 90, 150; stroke-dashoffset: -40px;
stroke-dashoffset: -40px; }
}
100% {
100% { stroke-dasharray: 90, 150;
stroke-dasharray: 90, 150; stroke-dashoffset: -120px;
stroke-dashoffset: -120px; }
} }
} </style>
</style> </head>
</head> <body>
<body> <div id="app">
<div id="app"> <div class="preload">
<div class="preload"> <svg viewBox="25 25 50 50" class="circular">
<svg viewBox="25 25 50 50" class="circular"> <circle cx="50" cy="50" r="20" fill="none" class="path"></circle>
<circle cx="50" cy="50" r="20" fill="none" class="path"></circle> </svg>
</svg> </div>
</div> </div>
</div> <script type="module" src="/src/main.ts"></script>
<script type="module" src="/src/main.ts"></script> </body>
</body>
</html> </html>

View File

@ -0,0 +1,141 @@
<!-- 个人资料 -->
<template>
<div class="user-setting">
<el-card class="!border-none" shadow="never">
<el-form ref="formRef" class="ls-form" :model="formData" :rules="rules" label-width="100px">
<el-form-item label="头像:" prop="avatar">
<material-picker v-model="formData.avatar" :limit="1" />
</el-form-item>
<el-form-item label="账号:" prop="username">
<div class="w-80">
<el-input v-model="formData.username" disabled />
</div>
</el-form-item>
<el-form-item label="名称:" prop="nickname">
<div class="w-80">
<el-input v-model="formData.nickname" placeholder="请输入名称" />
</div>
</el-form-item>
<el-form-item label="当前密码:" prop="currPassword">
<div class="w-80">
<el-input v-model.trim="formData.currPassword" placeholder="修改密码时必填, 不修改密码时留空" type="password" show-password />
</div>
</el-form-item>
<el-form-item label="新的密码:" prop="password">
<div class="w-80">
<el-input v-model.trim="formData.password" placeholder="修改密码时必填, 不修改密码时留空" type="password" show-password />
</div>
</el-form-item>
<el-form-item label="确定密码:" prop="passwordConfirm">
<div class="w-80">
<el-input
v-model.trim="formData.passwordConfirm"
placeholder="修改密码时必填, 不修改密码时留空"
type="password"
show-password
/>
</div>
</el-form-item>
</el-form>
</el-card>
<footer-btns v-perms="['setting.web.web_setting/setAgreement']">
<el-button type="primary" @click="handleSubmit"></el-button>
</footer-btns>
</div>
</template>
<script setup lang="ts">
import { setUserInfo } from '@/api/user'
import useUserStore from '@/stores/modules/user'
import feedback from '@/utils/feedback'
import type { FormInstance } from 'element-plus'
const formRef = ref<FormInstance>()
const userStore = useUserStore()
//
const formData = reactive({
avatar: '', //
username: '', //
nickname: '', //
currPassword: '', //
password: '', //
passwordConfirm: '' //
})
//
const rules = reactive<object>({
avatar: [
{
required: true,
message: '头像不能为空',
trigger: ['change']
}
],
nickname: [
{
required: true,
message: '请输入名称',
trigger: ['blur']
}
]
})
//
const getUser = async () => {
const userInfo = userStore.userInfo
for (const key in formData) {
//@ts-ignore
formData[key] = userInfo[key]
}
}
//
const setUser = async () => {
if (formData.currPassword || formData.password || formData.passwordConfirm) {
if (!formData.currPassword) {
return feedback.msgError('请输入当前密码')
}
if (!formData.password) {
return feedback.msgError('请输入新的密码')
}
if (!formData.passwordConfirm) {
return feedback.msgError('请输入确定密码')
}
if (formData.passwordConfirm != formData.password) {
return feedback.msgError('两次输入的密码不一样')
}
}
if (formData.currPassword && formData.password && formData.passwordConfirm) {
if (formData.currPassword.length < 6 || formData.currPassword.length > 32) {
return feedback.msgError('密码长度在6到32之间')
}
if (formData.password.length < 6 || formData.password.length > 32) {
return feedback.msgError('密码长度在6到32之间')
}
if (formData.passwordConfirm.length < 6 || formData.passwordConfirm.length > 32) {
return feedback.msgError('密码长度在6到32之间')
}
}
await setUserInfo(formData)
userStore.getUserInfo()
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
await setUser()
userStore.logout()
}
getUser()
</script>
<style lang="scss" scoped></style>