Browse Source

feat: 添加管理员密码重置功能 历史金币悬停

zhangrenyuan/feature-20250714163943-金币前端二期
lihui 3 weeks ago
parent
commit
aac55ce917
  1. 153
      src/views/permissions/permission.vue
  2. 87
      src/views/usergold/clientCountBalance.vue

153
src/views/permissions/permission.vue

@ -1,10 +1,7 @@
<script setup>
import { ref, onMounted, reactive, computed } from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios'
import moment from 'moment'
import { UserFilled, InfoFilled } from '@element-plus/icons-vue'
import {onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus'
import {InfoFilled, UserFilled} from '@element-plus/icons-vue'
import _ from 'lodash'
import request from '@/util/http'
@ -333,7 +330,7 @@ const editStatus = async function (row) {
console.log('请求成功2', result)
ElMessage.success(
permissionEditObj.value.adminStatus == 1 ? '启用成功' : '禁用成功'
permissionEditObj.value.adminStatus == 1 ? '启用成功' : '禁用成功'
)
permissionEditObj.value = {}
get()
@ -343,6 +340,48 @@ const editStatus = async function (row) {
}
}
//
const resetConfirmVisible = ref(false)
//
const currentRow = ref(null)
//
const resetPassword = function (row) {
//
currentRow.value = row
resetConfirmVisible.value = true
}
//
const confirmResetPassword = async function () {
const params = {
account: currentRow.value.account,
}
console.log(params)
//
try {
const result = await request({
url: '/admin/reset',
method: 'post',
data: params // params
})
if (result.code === 200) { // 使
ElMessage.success('重置密码成功')
resetConfirmVisible.value = false //
} else {
ElMessage.error(result.message || '重置密码失败')
}
} catch (error) {
ElMessage.error('重置密码失败')
console.error('请求错误:', error)
}
}
//
const cancelResetPassword = function () {
resetConfirmVisible.value = false
}
//
onMounted(async function () {
@ -367,18 +406,18 @@ const handleCurrentChange = function (val) {
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">OA号</el-text>
<el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable />
<el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable/>
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="admin.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item" />
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">职位名称</el-text>
<el-select v-model="admin.postiton" placeholder="请选择职位名称" style="width: 240px" clearable>
<el-option v-for="item in postiton" :key="item" :label="item" :value="item" />
<el-option v-for="item in postiton" :key="item" :label="item" :value="item"/>
</el-select>
</div>
@ -400,26 +439,35 @@ const handleCurrentChange = function (val) {
</div>
<div>
<el-table :data="tableData" style="width: 100% " >
<el-table :data="tableData" style="width: 100% ">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column prop="account" label="OA号" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="market" label="所属地区" />
<el-table-column prop="postiton" label="职位" />
<el-table-column prop="account" label="OA号"/>
<el-table-column prop="name" label="姓名"/>
<el-table-column prop="market" label="所属地区"/>
<el-table-column prop="postiton" label="职位"/>
<el-table-column prop="roleName" label="部门权限">
</el-table-column>
<el-table-column prop="remark" label="备注" />
<el-table-column prop="remark" label="备注"/>
<el-table-column prop="operation" label="操作" width="300px" align="center">
<template #default="scope">
<el-button
type="warning"
text
@click="resetPassword(scope.row)"
:disabled="scope.row.adminStatus === 0"
>
重置密码
</el-button>
<el-button type="warning" text @click="permissionEditInit(scope.row)"
:disabled="scope.row.adminStatus === 0">
:disabled="scope.row.adminStatus === 0">
修改权限
</el-button>
<el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
@ -440,10 +488,10 @@ const handleCurrentChange = function (val) {
<el-table-column prop="adminStatus" label="状态">
<template #default="scope">
<el-switch v-model="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
@change="editStatus(scope.row)" style="
@change="editStatus(scope.row)" style="
--el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949;
" active-text="启用" inactive-text="禁用" inline-prompt />
" active-text="启用" inactive-text="禁用" inline-prompt/>
</template>
</el-table-column>
</el-table>
@ -452,8 +500,9 @@ const handleCurrentChange = function (val) {
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
@ -465,43 +514,44 @@ const handleCurrentChange = function (val) {
<el-form ref="Ref" :model="addAdmin" label-width="auto" style="max-width: 600px; align-items: center">
<el-form-item prop="account" label="OA号:" required>
<el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px" />
<el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px"/>
</el-form-item>
<el-form-item prop="name" label="用户名:" required>
<el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px" />
<el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px"/>
</el-form-item>
<el-form-item prop="market" label="所属地区:" required>
<el-select v-model="addAdmin.market" placeholder="请选择所属地区" style="width: 220px"
@change="() => Ref.value.validateField('market')">
<el-option v-for="item in market" :key="item" :label="item" :value="item" />
@change="() => Ref.value.validateField('market')">
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
</el-form-item>
<el-form-item prop="permission" label="权限类别:" required>
<el-select v-model="addAdmin.permission" placeholder="请选择权限" style="width: 220px"
@change="() => Ref.value.validateField('permission')">
@change="() => Ref.value.validateField('permission')">
<el-option v-for="item in permissionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="postiton" label="职位:" required>
<el-input v-model="addAdmin.postiton" placeholder="请输入职称" style="width: 220px" />
<el-input v-model="addAdmin.postiton" placeholder="请输入职称" style="width: 220px"/>
</el-form-item>
<el-form-item prop="machineId" label="机器码:" required>
<div style="display: flex; align-items: center; flex-wrap: wrap;">
<el-input v-model="addAdmin.machineId" placeholder="请输入机器码" style="width: 220px; margin-right: 10px;" />
<el-input v-model="addAdmin.machineId" placeholder="请输入机器码"
style="width: 220px; margin-right: 10px;"/>
<el-button type="primary" @click="addMachineIdInput">添加</el-button>
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in addAdmin.machineIds" :key="index" style="margin-left: 10px;">
<el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
style="width: 180px; margin-right: 10px;" />
style="width: 180px; margin-right: 10px;"/>
</div>
</div>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input v-model="addAdmin.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
type="textarea" />
type="textarea"/>
</el-form-item>
</el-form>
@ -521,7 +571,7 @@ const handleCurrentChange = function (val) {
<template #label>
<div class="permissionVisible">
<el-icon>
<UserFilled />
<UserFilled/>
</el-icon>
员工精网号
</div>
@ -532,7 +582,7 @@ const handleCurrentChange = function (val) {
<template #label>
<div class="permissionVisible">
<el-icon>
<User />
<User/>
</el-icon>
员工姓名
</div>
@ -543,7 +593,7 @@ const handleCurrentChange = function (val) {
<template #label>
<div class="permissionVisible">
<el-icon>
<location />
<location/>
</el-icon>
所属地区
</div>
@ -554,7 +604,7 @@ const handleCurrentChange = function (val) {
<template #label>
<div class="permissionVisible">
<el-icon>
<OfficeBuilding />
<OfficeBuilding/>
</el-icon>
部门
</div>
@ -564,7 +614,9 @@ const handleCurrentChange = function (val) {
</el-descriptions>
<el-divider>
<el-icon><star-filled /></el-icon>
<el-icon>
<star-filled/>
</el-icon>
</el-divider>
<div>
<span class="permissionVisible" style="margin-right: 20px">权限设置:</span>
@ -587,13 +639,34 @@ const handleCurrentChange = function (val) {
</template>
</el-dialog>
<!-- 重置密码确认弹窗 -->
<el-dialog
v-model="resetConfirmVisible" width="500px" :close-on-click-modal="false" :before-close="cancelResetPassword"
>
<el-row>
<el-col :span="4" style="margin-top: 20px">
<el-icon class="dialog-icon" color="#10AEFF" size="50">
<InfoFilled/>
</el-icon>
</el-col>
<el-col :span="20">
<h3>提示</h3>
<p class="dialog-title">确认重置该账号密码</p>
<p class="dialog-desc">重置后密码为: 123456请通知用户及时修改</p>
</el-col>
</el-row>
<template #footer>
<div style="align-content: center ; gap: 30px">
<el-button @click="cancelResetPassword">取消</el-button>
<el-button type="primary" @click="confirmResetPassword">确定</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.permissionVisible {
font-size: 16px;

87
src/views/usergold/clientCountBalance.vue

@ -1,11 +1,11 @@
<script setup>
//
import { ref, onMounted, reactive, computed } from 'vue'
import {ref, onMounted, reactive, computed} from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import {ElMessage, ElMessageBox} from 'element-plus'
import axios from 'axios'
import moment from 'moment'
import { ta } from 'element-plus/es/locales.mjs'
import {ta} from 'element-plus/es/locales.mjs'
import API from '@/util/http'
//
@ -14,7 +14,7 @@ const adminData = ref({})
const dialogVisible = ref(false)
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result
// console.log('', result)
console.log('管理员用户信息', adminData.value)
@ -35,7 +35,7 @@ const getmarket = async () => {
console.log('获取地区数据成功', result)
// { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') {
market.value = result.data.map(item => ({ value: item, label: item }));
market.value = result.data.map(item => ({value: item, label: item}));
} else {
market.value = result.data;
}
@ -104,7 +104,7 @@ const get = async function (val) {
// POST
const requestData = { ...getObj.value, user: { ...user.value } };//
const requestData = {...getObj.value, user: {...user.value}};//
console.log('最终请求参数', JSON.stringify(requestData, null, 2)); //
//console.log('', requestData);
@ -112,7 +112,7 @@ const get = async function (val) {
const result = await API({
url: '/goldDetail/getGold',
method: 'post',
data: { ...getObj.value, user: { ...user.value } }
data: {...getObj.value, user: {...user.value}}
})
console.log('响应数据', result)
tableData.value = result.data.list
@ -124,7 +124,7 @@ const get = async function (val) {
url: '/goldDetail/goldTotal',
data: {
...getAllObj.value,
user: { ...user.value }
user: {...user.value}
}
})
// result.data.list
@ -230,14 +230,14 @@ const handleCurrentChange = function (val) {
}
const exportExcel = async function () {
const params = {
text:'',
deptid:'',
sort:1,
field:'',
page:getObj.pageNum,
size:getObj.pageSize
text: '',
deptid: '',
sort: 1,
field: '',
page: getObj.pageNum,
size: getObj.pageSize
}
const res = await API({ url: '/goldDetail/exportGold', data: params })
const res = await API({url: '/goldDetail/exportGold', data: params})
if (res.code === 200) {
ElMessage.success('导出成功')
}
@ -251,12 +251,12 @@ const exportExcel = async function () {
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input v-model="user.jwcode" style="width: 160px" placeholder="请输入精网号" clearable />
<el-input v-model="user.jwcode" style="width: 160px" placeholder="请输入精网号" clearable/>
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="user.market" placeholder="请选择所属地区" style="width: 180px" clearable>
<el-option v-for="item in market" :key="item.value" :label="item.label" :value="item.value" />
<el-option v-for="item in market" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</div>
<el-button type="primary" @click="search()">查询</el-button>
@ -278,25 +278,25 @@ const exportExcel = async function () {
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 626px; overflow-y: auto">
<el-table :data="tableData" @cellClick="cellClick" style="width: 100%" height="626px"
@sort-change="handleSortChange">
@sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" width="120" />
<el-table-column prop="jwcode" label="精网号" width="120" />
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="name" label="姓名" width="120"/>
<el-table-column prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120"/>
<el-table-column prop="allJb" label="金币总数" width="120" aligh="center">
<template #default="scope">
<span>{{
(scope.row.currentPermanentGold +
scope.row.currentFreeJune +
scope.row.currentFreeDecember +
scope.row.currentTaskGold) / 100
}}</span>
(scope.row.currentPermanentGold +
scope.row.currentFreeJune +
scope.row.currentFreeDecember +
scope.row.currentTaskGold) / 100
}}</span>
</template>
</el-table-column>
<el-table-column prop="currentPermanentGold" label="永久金币" sortable="custom" width="110">
@ -319,15 +319,27 @@ const exportExcel = async function () {
<span>{{ Math.abs(scope.row.currentTaskGold) / 100 }}</span>
</template>
</el-table-column>
<el-table-column prop="rcoin" label="历史金币" width="150">
<template #default="scope">
<!-- 计算四个字段的和并显示 -->
<span>{{
(scope.row.sumPermanentGold || 0) /100 +
(scope.row.sumFreeJune || 0) /100 +
(scope.row.sumFreeDecember || 0) /100 +
(scope.row.sumTaskGold || 0) / 100
}}</span>
<el-popover trigger="hover" placement="left" width="150">
<template #default>
<div>
<div>永久金币{{ (scope.row.sumPermanentGold || 0) / 100 }}</div>
<div>免费金币{{ (scope.row.sumFreeJune || 0) + (scope.row.sumFreeDecember || 0) / 100 }}</div>
<div>任务金币{{ (scope.row.sumTaskGold || 0) / 100 }}</div>
</div>
</template>
<template #reference>
<span>
{{
(scope.row.sumPermanentGold || 0) / 100 +
(scope.row.sumFreeJune || 0) / 100 +
(scope.row.sumFreeDecember || 0) / 100 +
(scope.row.sumTaskGold || 0) / 100
}}</span>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column prop="sumConsume" label="历史消费" width="150">
@ -341,8 +353,9 @@ const exportExcel = async function () {
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>

Loading…
Cancel
Save