【招生主控端】 修复# 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>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>粤好生活-后台管理系统</title>
<style>
* {
margin: 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);
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>易客云-后台管理系统</title>
<style>
* {
margin: 0;
padding: 0;
}
}
@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-dashoffset: -40px;
stroke-dashoffset: 0;
stroke-width: 2;
stroke: #4073fa;
stroke-linecap: round;
}
100% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -120px;
@keyframes loading-rotate {
100% {
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>
<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>
@keyframes loading-dash {
0% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -40px;
}
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>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

BIN
primary-admin.zip 100644

Binary file not shown.

View File

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

View File

@ -1,11 +1,11 @@
<template>
<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">
<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>
</footer>
</template>
<script setup lang="ts">
import useAppStore from '@/stores/modules/app'

View File

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

View File

@ -6,7 +6,15 @@
<el-input v-model="formData.account" placeholder="请输入账号名称" clearable :maxlength="20" show-word-limit />
</el-form-item>
<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 label="客户名称" prop="clientName">
<el-input v-model="formData.clientName" placeholder="请输入客户名称" clearable :maxlength="20" show-word-limit />

View File

@ -1,66 +1,65 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>粤好生活-后台管理系统</title>
<style>
* {
margin: 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 {
0% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -40px;
}
100% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -120px;
}
}
</style>
</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>
<script type="module" src="/src/main.ts"></script>
</body>
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>易客云-后台管理系统</title>
<style>
* {
margin: 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 {
0% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -40px;
}
100% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -120px;
}
}
</style>
</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>
<script type="module" src="/src/main.ts"></script>
</body>
</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>