新增邮件群发和数据可视化

This commit is contained in:
eoao
2025-06-17 09:20:00 +08:00
parent ea309f9171
commit 605829f180
65 changed files with 2352 additions and 900 deletions

View File

@@ -2,6 +2,23 @@
<div class="box">
<div class="pass">
<div class="title">账户与密码</div>
<div class="pass-item">
<div>用户名</div>
<div>
<span v-if="setNameShow" class="edit-name-input">
<el-input v-model="accountName" ></el-input>
<span class="edit-name" @click="setName">
保存
</span>
</span>
<span v-else class="user-name">
<span >{{ userStore.user.name }}</span>
<span class="edit-name" @click="showSetName">
修改
</span>
</span>
</div>
</div>
<div class="pass-item">
<div>邮箱</div>
<div>{{ userStore.user.email }}</div>
@@ -9,7 +26,7 @@
<div class="pass-item">
<div>密码</div>
<div>
<el-button type="primary" @click="pwdShow = true">修改密码</el-button>
<el-button type="primary" @click="pwdShow = true">修改密码</el-button>
</div>
</div>
</div>
@@ -23,11 +40,11 @@
</div>
</div>
<el-dialog v-model="pwdShow" title="修改密码" width="340">
<div class="update-pwd">
<el-input type="password" placeholder="新的密码" v-model="form.password"/>
<el-input type="password" placeholder="确认密码" v-model="form.newPwd"/>
<el-button type="primary" :loading="setPwdLoading" @click="submitPwd">保存</el-button>
</div>
<div class="update-pwd">
<el-input type="password" placeholder="新的密码" v-model="form.password"/>
<el-input type="password" placeholder="确认密码" v-model="form.newPwd"/>
<el-button type="primary" :loading="setPwdLoading" @click="submitPwd">保存</el-button>
</div>
</el-dialog>
</div>
</template>
@@ -35,16 +52,60 @@
import {defineOptions} from "vue";
import {reactive, ref} from 'vue'
import {resetPassword, userDelete} from "@/request/my.js";
import {ElMessage, ElMessageBox} from "element-plus";
import {useUserStore} from "@/store/user.js";
import router from "@/router/index.js";
import {accountSetName} from "@/request/account.js";
import {useAccountStore} from "@/store/account.js";
const accountStore = useAccountStore()
const userStore = useUserStore();
const setPwdLoading = ref(false)
const setNameShow = ref(false)
const accountName = ref(null)
defineOptions({
name: 'setting'
})
function showSetName() {
accountName.value = userStore.user.name
setNameShow.value = true
}
function setName() {
if (!accountName.value) {
ElMessage({
message: '用户名不能为空',
type: 'error',
plain: true,
})
return;
}
setNameShow.value = false
let name = accountName.value
if (name === userStore.user.name) {
return
}
userStore.user.name = accountName.value
accountSetName(userStore.user.accountId,name).then(() => {
ElMessage({
message: '修改成功',
type: 'success',
plain: true,
})
accountStore.changeUserAccountName = name
}).catch(() => {
userStore.user.name = name
})
}
const pwdShow = ref(false)
const form = reactive({
password: '',
@@ -121,6 +182,10 @@ function submitPwd() {
.box {
padding: 40px 40px;
@media (max-width: 767px) {
padding: 30px 30px;
}
.update-pwd {
display: flex;
flex-direction: column;
@@ -134,8 +199,7 @@ function submitPwd() {
.pass {
font-size: 14px;
display: flex;
flex-direction: column;
display: grid;
gap: 20px;
margin-bottom: 40px;
@@ -143,12 +207,39 @@ function submitPwd() {
display: grid;
grid-template-columns: 50px 1fr;
gap: 140px;
@media (max-width: 767px) {
gap: 80px;
position: relative;
.user-name {
display: grid;
grid-template-columns: auto 1fr;
span:first-child {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.edit-name-input {
position: absolute;
bottom: -6px;
.el-input {
width: min(200px,calc(100vw - 222px));
}
}
.edit-name {
color: #4dabff;
padding-left: 10px;
cursor: pointer;
}
@media (max-width: 767px) {
gap: 70px;
}
div:first-child {
font-weight: bold;
}
div:last-child {
overflow: hidden;
white-space: nowrap;