Browse Source

Merge branch 'refs/heads/lihui/feature-20250711103624-金币二期' into milestone-20250711-金币前端二期

# Conflicts:
#	src/views/usergold/clientCountBalance.vue
zhangrenyuan/feature-20250714163943-金币前端二期
lihui 3 weeks ago
parent
commit
5bd849ee09
  1. 135
      src/views/permissions/permission.vue
  2. 65
      src/views/usergold/clientCountBalance.vue
  3. 2
      src/views/workspace/index.vue

135
src/views/permissions/permission.vue

@ -1,10 +1,7 @@
<script setup> <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 _ from 'lodash'
import request from '@/util/http' import request from '@/util/http'
@ -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 () { onMounted(async function () {
@ -367,18 +406,18 @@ const handleCurrentChange = function (val) {
<div class="head-card"> <div class="head-card">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">OA号</el-text> <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>
<div class="head-card-element" style="margin-left: 50px"> <div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="admin.market" placeholder="请选择所属地区" style="width: 240px" clearable> <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> </el-select>
</div> </div>
<div class="head-card-element" style="margin-left: 50px"> <div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">职位名称</el-text> <el-text class="mx-1" size="large">职位名称</el-text>
<el-select v-model="admin.postiton" placeholder="请选择职位名称" style="width: 240px" clearable> <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> </el-select>
</div> </div>
@ -400,7 +439,7 @@ const handleCurrentChange = function (val) {
</div> </div>
<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"> <el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope"> <template #default="scope">
<span>{{ <span>{{
@ -409,15 +448,24 @@ const handleCurrentChange = function (val) {
</template> </template>
</el-table-column> </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 prop="roleName" label="部门权限">
</el-table-column> </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"> <el-table-column prop="operation" label="操作" width="300px" align="center">
<template #default="scope"> <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)" <el-button type="warning" text @click="permissionEditInit(scope.row)"
:disabled="scope.row.adminStatus === 0"> :disabled="scope.row.adminStatus === 0">
修改权限 修改权限
@ -443,7 +491,7 @@ const handleCurrentChange = function (val) {
@change="editStatus(scope.row)" style=" @change="editStatus(scope.row)" style="
--el-switch-on-color: #13ce66; --el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949; --el-switch-off-color: #ff4949;
" active-text="启用" inactive-text="禁用" inline-prompt />
" active-text="启用" inactive-text="禁用" inline-prompt/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -452,7 +500,8 @@ const handleCurrentChange = function (val) {
<!-- 分页 --> <!-- 分页 -->
<div class="pagination" style="margin-top: 20px"> <div class="pagination" style="margin-top: 20px">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]" <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"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination> @current-change="handleCurrentChange"></el-pagination>
</div> </div>
</el-card> </el-card>
@ -465,17 +514,17 @@ const handleCurrentChange = function (val) {
<el-form ref="Ref" :model="addAdmin" label-width="auto" style="max-width: 600px; align-items: center"> <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-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>
<el-form-item prop="name" label="用户名:" required> <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>
<el-form-item prop="market" label="所属地区:" required> <el-form-item prop="market" label="所属地区:" required>
<el-select v-model="addAdmin.market" placeholder="请选择所属地区" style="width: 220px" <el-select v-model="addAdmin.market" placeholder="请选择所属地区" style="width: 220px"
@change="() => Ref.value.validateField('market')"> @change="() => Ref.value.validateField('market')">
<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> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="permission" label="权限类别:" required> <el-form-item prop="permission" label="权限类别:" required>
@ -486,22 +535,23 @@ const handleCurrentChange = function (val) {
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="postiton" label="职位:" required> <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>
<el-form-item prop="machineId" label="机器码:" required> <el-form-item prop="machineId" label="机器码:" required>
<div style="display: flex; align-items: center; flex-wrap: wrap;"> <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> <el-button type="primary" @click="addMachineIdInput">添加</el-button>
<!-- 动态添加的机器码输入框 --> <!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in addAdmin.machineIds" :key="index" style="margin-left: 10px;"> <div v-for="(item, index) in addAdmin.machineIds" :key="index" style="margin-left: 10px;">
<el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码" <el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
style="width: 180px; margin-right: 10px;" />
style="width: 180px; margin-right: 10px;"/>
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item prop="remark" label="备注"> <el-form-item prop="remark" label="备注">
<el-input v-model="addAdmin.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit <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-item>
</el-form> </el-form>
@ -521,7 +571,7 @@ const handleCurrentChange = function (val) {
<template #label> <template #label>
<div class="permissionVisible"> <div class="permissionVisible">
<el-icon> <el-icon>
<UserFilled />
<UserFilled/>
</el-icon> </el-icon>
员工OA号 员工OA号
</div> </div>
@ -532,7 +582,7 @@ const handleCurrentChange = function (val) {
<template #label> <template #label>
<div class="permissionVisible"> <div class="permissionVisible">
<el-icon> <el-icon>
<User />
<User/>
</el-icon> </el-icon>
员工姓名 员工姓名
</div> </div>
@ -543,7 +593,7 @@ const handleCurrentChange = function (val) {
<template #label> <template #label>
<div class="permissionVisible"> <div class="permissionVisible">
<el-icon> <el-icon>
<location />
<location/>
</el-icon> </el-icon>
所属地区 所属地区
</div> </div>
@ -554,7 +604,7 @@ const handleCurrentChange = function (val) {
<template #label> <template #label>
<div class="permissionVisible"> <div class="permissionVisible">
<el-icon> <el-icon>
<OfficeBuilding />
<OfficeBuilding/>
</el-icon> </el-icon>
部门 部门
</div> </div>
@ -564,7 +614,9 @@ const handleCurrentChange = function (val) {
</el-descriptions> </el-descriptions>
<el-divider> <el-divider>
<el-icon><star-filled /></el-icon>
<el-icon>
<star-filled/>
</el-icon>
</el-divider> </el-divider>
<div> <div>
<span class="permissionVisible" style="margin-right: 20px">权限设置:</span> <span class="permissionVisible" style="margin-right: 20px">权限设置:</span>
@ -587,13 +639,34 @@ const handleCurrentChange = function (val) {
</template> </template>
</el-dialog> </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> </template>
<style scoped> <style scoped>
.permissionVisible { .permissionVisible {
font-size: 16px; font-size: 16px;

65
src/views/usergold/clientCountBalance.vue

@ -1,11 +1,11 @@
<script setup> <script setup>
// //
import { ref, onMounted, reactive, computed } from 'vue'
import {ref, onMounted, reactive, computed} from 'vue'
import ElementPlus from 'element-plus' import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import {ElMessage, ElMessageBox} from 'element-plus'
import axios from 'axios' import axios from 'axios'
import moment from 'moment' 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' import API from '@/util/http'
// //
@ -14,7 +14,7 @@ const adminData = ref({})
const dialogVisible = ref(false) const dialogVisible = ref(false)
const getAdminData = async function () { const getAdminData = async function () {
try { try {
const result = await API({ url: '/admin/userinfo', data: {} })
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result adminData.value = result
// console.log('', result) // console.log('', result)
console.log('管理员用户信息', adminData.value) console.log('管理员用户信息', adminData.value)
@ -35,7 +35,7 @@ const getmarket = async () => {
console.log('获取地区数据成功', result) console.log('获取地区数据成功', result)
// { value, label } // { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') { 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 { } else {
market.value = result.data; market.value = result.data;
} }
@ -104,7 +104,7 @@ const get = async function (val) {
// POST // POST
const requestData = { ...getObj.value, user: { ...user.value } };//
const requestData = {...getObj.value, user: {...user.value}};//
console.log('最终请求参数', JSON.stringify(requestData, null, 2)); // console.log('最终请求参数', JSON.stringify(requestData, null, 2)); //
//console.log('', requestData); //console.log('', requestData);
@ -112,7 +112,7 @@ const get = async function (val) {
const result = await API({ const result = await API({
url: '/goldDetail/getGold', url: '/goldDetail/getGold',
method: 'post', method: 'post',
data: { ...getObj.value, user: { ...user.value } }
data: {...getObj.value, user: {...user.value}}
}) })
console.log('响应数据', result) console.log('响应数据', result)
tableData.value = result.data.list tableData.value = result.data.list
@ -124,7 +124,7 @@ const get = async function (val) {
url: '/goldDetail/goldTotal', url: '/goldDetail/goldTotal',
data: { data: {
...getAllObj.value, ...getAllObj.value,
user: { ...user.value }
user: {...user.value}
} }
}) })
// result.data.list // result.data.list
@ -230,14 +230,14 @@ const handleCurrentChange = function (val) {
} }
const exportExcel = async function () { const exportExcel = async function () {
const params = { 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) { if (res.code === 200) {
ElMessage.success('导出成功') ElMessage.success('导出成功')
} }
@ -251,12 +251,12 @@ const exportExcel = async function () {
<div class="head-card"> <div class="head-card">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text> <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>
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="user.market" placeholder="请选择所属地区" style="width: 180px" clearable> <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> </el-select>
</div> </div>
<el-button type="primary" @click="search()">查询</el-button> <el-button type="primary" @click="search()">查询</el-button>
@ -286,9 +286,9 @@ const exportExcel = async function () {
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="姓名" width="150" />
<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"> <el-table-column prop="allJb" label="金币总数" width="120" aligh="center">
<template #default="scope"> <template #default="scope">
<span>{{ <span>{{
@ -319,16 +319,28 @@ const exportExcel = async function () {
<span>{{ Math.abs(scope.row.currentTaskGold) / 100 }}</span> <span>{{ Math.abs(scope.row.currentTaskGold) / 100 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="rcoin" label="历史金币" width="150"> <el-table-column prop="rcoin" label="历史金币" width="150">
<template #default="scope"> <template #default="scope">
<!-- 计算四个字段的和并显示 -->
<span>{{
(scope.row.sumPermanentGold || 0) /100 +
(scope.row.sumFreeJune || 0) /100 +
(scope.row.sumFreeDecember || 0) /100 +
<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 (scope.row.sumTaskGold || 0) / 100
}}</span> }}</span>
</template> </template>
</el-popover>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="sumConsume" label="历史消费" width="150"> <el-table-column prop="sumConsume" label="历史消费" width="150">
<template #default="scope"> <template #default="scope">
@ -341,7 +353,8 @@ const exportExcel = async function () {
<!-- 分页 --> <!-- 分页 -->
<div class="pagination" style="margin-top: 20px"> <div class="pagination" style="margin-top: 20px">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]" <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"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination> @current-change="handleCurrentChange"></el-pagination>
</div> </div>
</el-card> </el-card>

2
src/views/workspace/index.vue

@ -104,7 +104,7 @@
</el-icon> </el-icon>
</template> </template>
</el-col> </el-col>
<el-col class="center-card">日环比:{{ sumDaily }}%&nbsp;&nbsp;&nbsp;&nbsp;
<el-col class="center-card">日环比:{{ sumDaily.toFixed(2) }}%&nbsp;&nbsp;&nbsp;&nbsp;
<template v-if="sumDaily > 0"> <template v-if="sumDaily > 0">
<el-icon style="color:red"> <el-icon style="color:red">
<ArrowUpBold/> <ArrowUpBold/>

Loading…
Cancel
Save