6 Commits

Author SHA1 Message Date
lihui 9185ffb4c1 Merge remote-tracking branch 'origin/lihui/feature-20250623144029-金币前端lihui' into lihui/feature-20250623144029-金币前端lihui 1 week ago
lihui 8667797b75 refactor(workspace): 工作台 日环比改为 两位小数 3 months ago
lihui 3cb3f86efb fix:合并冲突 3 months ago
lihui 69c3999c9c Merge remote-tracking branch 'origin/milestone-20250711-金币前端二期' into milestone-20250711-金币前端二期 3 months ago
lihui b89ee8d69d zry 代码 3 months ago
lihui 3c9414d11a refactor(views): 优化多个组件的显示和功能 3 months ago
  1. 84
      src/components/PasswordSuccess.vue
  2. 321
      src/components/changePassword.vue
  3. 4
      src/router/index.js
  4. 30
      src/views/home.vue
  5. 486
      src/views/refund/addCoinRefund.vue

84
src/components/PasswordSuccess.vue

@ -0,0 +1,84 @@
<template>
<div class="success-popup">
<div class="popup-content">
<div class="icon">
<el-icon :size="48" color="#67c23a">
<SuccessFilled />
</el-icon>
</div>
<div class="title">修改密码成功</div>
<div class="desc">系统将在 {{ countdown }} 秒后自动跳转至登录页</div>
<el-button type="primary" @click="immediateJump">立即跳转</el-button>
</div>
</div>
</template>
<script setup>
import {ref, onMounted} from 'vue';
import {ElIcon, ElButton} from 'element-plus';
import {SuccessFilled} from '@element-plus/icons-vue';
import {useRouter} from 'vue-router';
const countdown = ref(3);
const router = useRouter();
//
const startCountdown = () => {
const timer = setInterval(() => {
countdown.value--;
if (countdown.value === 0) {
clearInterval(timer);
//
// 使 window.location.href
// window.location.href = '/login';
router.replace ('/login');
// router.push('/login');
}
}, 1000);
};
const immediateJump = () => {
// window.location.href = '/login';
//
router.replace ('/login');
};
onMounted(() => {
startCountdown();
});
</script>
<style scoped>
.success-popup {
position: fixed;
top: 0;
left: 0;
background-color: rgba(255, 255, 255, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
width: 100%;
height: 100%;
}
.popup-content {
background: #fff;
padding: 30px;
border-radius: 8px;
text-align: center;
}
.icon {
margin-bottom: 16px;
}
.title {
font-size: 18px;
font-weight: bold;
margin-bottom: 8px;
}
.desc {
margin-bottom: 24px;
color: #999;
}
</style>

321
src/components/changePassword.vue

@ -0,0 +1,321 @@
<template>
<div class="form-container">
<el-form
ref="passwdFormRef"
:model="passwd"
:rules="rules"
label-width="100px"
class="password-form"
>
<h3 class="form-title">修改密码</h3>
<!-- 原密码 -->
<el-form-item prop="oldPassword" label="原密码">
<el-input
v-model.trim="passwd.oldPassword"
type="password"
placeholder="请输入原密码"
show-password
/>
</el-form-item>
<!-- 新密码 -->
<el-form-item prop="newPassword" label="新密码">
<el-input
v-model.trim="passwd.newPassword"
type="password"
placeholder="请输入新密码"
show-password
/>
</el-form-item>
<!-- 重复密码 -->
<el-form-item prop="againPassword" label="重复密码">
<el-input
v-model.trim="passwd.againPassword"
type="password"
placeholder="请再次输入新密码"
show-password
/>
</el-form-item>
<!-- 密码规则提示 -->
<div class="rule-tips">
<div :class="isLengthValid ? 'tip pass' : 'tip neutral'">
<el-icon>
<component :is="isLengthValid ? SuccessFilled : SuccessFilled"/>
</el-icon>
密码由8-16位数字字母或符号组成
</div>
<div :class="isComplexValid ? 'tip pass' : 'tip neutral'">
<el-icon>
<component :is="isComplexValid ? SuccessFilled : SuccessFilled"/>
</el-icon>
至少含2种以上字符
</div>
<div v-if="errorMsg" class="tip fail">
<el-icon>
<CircleCloseFilled/>
</el-icon>
{{ errorMsg }}
</div>
</div>
<!-- 按钮 -->
<div class="button-group">
<el-button
type="primary"
@click="onSubmit"
style="width: 300px"
:loading="loading"
:disabled="!isLengthValid || !isComplexValid"
>
{{ loading ? '修改中...' : '确定' }}
</el-button>
</div>
</el-form>
</div>
</template>
<script setup>
import {ref, reactive, computed, watch, onMounted} from 'vue'
import {CircleCloseFilled, SuccessFilled} from '@element-plus/icons-vue'
import {ElMessage} from "element-plus";
import API from '@/util/http'
import PasswordSuccess from './PasswordSuccess.vue';
import router from "@/router/index.js";
//
const emit = defineEmits(['confirm'])
const passwdFormRef = ref(null)
const passwd = reactive({
account: '',
oldPassword: '',
newPassword: '',
againPassword: ''
})
const errorMsg = ref('')
//account
const getAccount= async function() {
try {
const adminData = ref({})
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
console.log('管理员用户信息', adminData.value)
passwd.account = adminData.value.account
} catch (error) {
console.log('请求失败', error)
}
}
//
const isLengthValid = computed(() => passwd.newPassword.length >= 8 && passwd.newPassword.length <= 16)
const isComplexValid = computed(() => {
const rules = [/\d/, /[a-z]/, /[A-Z]/, /[^a-zA-Z0-9]/]
return rules.filter((r) => r.test(passwd.newPassword)).length >= 2
})
watch(() => passwd.newPassword, (val) => {
if (val && val === passwd.oldPassword) {
errorMsg.value = '新密码不能与旧密码一致'
} else {
errorMsg.value = ''
}
})
//
const loading = ref(false)
//
const rules = reactive({
oldPassword: [{required: true, message: '请输入原密码', trigger: 'blur'}],
newPassword: [
{required: true, message: '新密码不能为空', trigger: 'blur'},
{
validator: (rule, value, callback) => {
if (value === passwd.oldPassword) {
callback(new Error('新密码不能与旧密码一致'))
} else if (value.length < 8 || value.length > 16) {
callback(new Error('长度应在 8 到 16 个字符'))
} else {
const types = [/\d/, /[a-z]/, /[A-Z]/, /[^a-zA-Z0-9]/]
const matchCount = types.filter((r) => r.test(value)).length
if (matchCount < 2) {
callback(new Error('密码至少包含两种类型(数字、字母或符号)'))
} else {
callback()
}
}
},
trigger: 'blur'
}
],
againPassword: [
{required: true, message: '请再次输入新密码', trigger: 'blur'},
{
validator: (rule, value, callback) => {
if (value !== passwd.newPassword) {
callback(new Error('两次输入密码不一致'))
} else {
callback()
}
},
trigger: 'blur'
}
]
})
//
const changePassword = async function () {
try {
const params = {
account: passwd.account,
oldPassword: passwd.oldPassword,
newPassword: passwd.newPassword,
againPassword: passwd.againPassword
}
const result = await API({url: '/admin/password', data: params})
console.log('@@@@@@@@@@@修改密码结果:', result)
if(result.status === 200){
//
ElMessage.success('修改密码成功')
//
resetFields()
router.replace ('/PasswordSuccess');
}else if(result === 400){
//todo
}
} catch (error) {
console.log('re:', result)
console.error('修改密码失败', error)
ElMessage.error('操作失败')
// finally
throw error
}
}
//
// const changePassword = async function () {
// try {
// // API
// const result = {
// status: 200,
// data: {success: true, message: ''}
// };
// console.log(':', result);
// //
// if (result.status === 200 ) {
// //
// ElMessage.success(result.data.message || '');
// //
// resetFields();
// router.replace ('/PasswordSuccess');
// return result;
// } else {
// // API
// const errorMsg = result.data.message || '';
// ElMessage.error(errorMsg);
// throw new Error(errorMsg);
// }
// } catch (error) {
// // API
// console.error(':', error);
// ElMessage.error(error.message || '');
// throw error;
// }
// };
//
const resetFields = () => {
passwdFormRef.value.resetFields()
errorMsg.value = ''
}
//
const onSubmit = () => {
//
if (loading.value) return
passwdFormRef.value.validate(async (valid) => {
if (valid) {
loading.value = true //
try {
await changePassword() //
emit('confirm')
} finally {
loading.value = false //
}
} else {
console.log('表单校验失败')
}
})
}
onMounted(() => {
getAccount()
})
</script>
<style scoped>
.form-container {
justify-content: center;
align-items: center;
}
.password-form {
border-radius: 8px;
}
.form-title {
text-align: left;
margin-bottom: 24px;
font-size: 20px;
font-weight: bold;
}
.button-group {
display: flex;
justify-content: center;
margin-top: 24px;
}
.rule-tips {
margin-left: 100px;
margin-bottom: 12px;
}
.tip {
font-size: 14px;
margin: 4px 0;
display: flex;
align-items: center;
}
.pass {
color: #67c23a;
}
.neutral {
color: #999;
}
.fail {
color: #f56c6c;
}
.rule-tips .el-icon {
margin-right: 6px;
}
</style>

4
src/router/index.js

@ -70,7 +70,11 @@ const router = createRouter({
// 没有权限
{ path: '/noPermission', name: "noPermission", component: () => import("../views/noPermissionPage.vue") }
]
},
// 跳转页面
{ path: '/PasswordSuccess', name: "PasswordSuccess.vue", component: () => import("../components/PasswordSuccess.vue") },
]

30
src/views/home.vue

@ -6,6 +6,7 @@ import {ElMessage} from 'element-plus'
import API from '@/util/http'
import dmmn from '../assets/link.png'
import moment from 'moment'
import ChangePassword from '@/components/changePassword.vue'
@ -83,7 +84,7 @@ const getTagType = (state) => {
return 'info';
case 1:
return 'primary';
case 2:
case 2:
return'success';
case 3:
return 'danger';
@ -98,7 +99,7 @@ const getTagText = (state) => {
return '待执行';
case 1:
return '执行中';
case 2:
case 2:
return'执行完成';
case 3:
return '执行出错';
@ -140,13 +141,17 @@ const changeDataByArea = (item) => {
//
const exportListVisible = ref(false)
//
const showPasswordDialog = ref(false)
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
//
const openChangePassword = () => {
showPasswordDialog.value = true
}
</script>
<template>
@ -260,7 +265,9 @@ const openExportList = () => {
<span style="margin-left: 10px">{{ adminData.name }}</span>
</template>
<el-menu-item @click="message()">查看个人信息</el-menu-item>
<el-menu-item @click="openChangePassword">修改密码</el-menu-item>
<el-menu-item @click="logout">退出登录</el-menu-item>
<el-menu-item index="1-3" @click="openExportList">查看下载列表</el-menu-item>
</el-sub-menu>
@ -299,7 +306,7 @@ const openExportList = () => {
<!-- 导出列表弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="fileName" label="文件名"/>
<el-table-column prop="state" label="状态">
<template #default="scope">
<el-tag :type="getTagType(scope.row.state)"
@ -316,7 +323,7 @@ const openExportList = () => {
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>
@ -329,6 +336,15 @@ const openExportList = () => {
</template>
</el-dialog>
<!-- 自定义密码修改弹窗组件 -->
<el-dialog
v-model="showPasswordDialog"
:center="true"
width="470px"
>
<ChangePassword @confirm="showPasswordDialog = false"/>
</el-dialog>
</div>
</template>
@ -338,10 +354,12 @@ const openExportList = () => {
font-size: 16px;
font-weight: bold;
}
.item {
margin-top: 20px;
margin-right: 40px;
}
.admin {
margin-left: auto;
}

486
src/views/refund/addCoinRefund.vue

@ -1,11 +1,11 @@
<script setup>
import { onMounted, reactive } from 'vue'
import { ref, computed, watch } from 'vue'
import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import {onMounted, reactive} from 'vue'
import {ref, computed, watch} from 'vue'
import {ElMessage} from 'element-plus'
import {Plus} from '@element-plus/icons-vue'
import axios from 'axios'
import { ElMessageBox } from 'element-plus'
import {ElMessageBox} from 'element-plus'
import API from '@/util/http'
import moment from 'moment'
// import _ from 'lodash'
@ -15,12 +15,11 @@ const addRe = ref({
})
//
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result
addRefund.value.adminId = adminData.value.id
console.log('请求成功', result)
@ -32,7 +31,7 @@ const getAdminData = async function () {
//
const trimJwCode = () => {
if (addRefund.value.jwcode) {
addRefund.value.jwcode = addRefund.value.jwcode.replace(/\s/g, '');
addRefund.value.jwcode = addRefund.value.jwcode.replace(/\s/g, '');
}
}
// 退
@ -40,11 +39,11 @@ const addRefund = ref({
jwcode: '',
goodsName: '',
refundType: '',
refundModel: 0,
refundModel: 0,
permanentGold: '',
freeGold: '',
taskGold: '',
sumGold: 0,
freeGold: '',
taskGold: '',
sumGold: 0,
remark: '',
adminId: null
})
@ -85,8 +84,9 @@ const add = async function () {
}
// POST
const result = await API({ url: '/refund/add',
data: processedRefund
const result = await API({
url: '/refund/add',
data: processedRefund
})
if (result.code === 0) {
ElMessage.error(result.msg)
@ -119,13 +119,13 @@ const addBefore = () => {
}
ElMessageBox.confirm('确认添加?')
.then(() => {
add()
console.log('添加成功')
})
.catch(() => {
console.log('取消添加')
})
.then(() => {
add()
console.log('添加成功')
})
.catch(() => {
console.log('取消添加')
})
} else {
//
ElMessage({
@ -139,7 +139,8 @@ const addBefore = () => {
//
//
const Ref = ref(null)
const startChange = (val) => {}
const startChange = (val) => {
}
const validateJwCode = (rule, value, callback) => {
if (!value) {
callback(new Error('精网号不能为空'));
@ -152,16 +153,16 @@ const validateJwCode = (rule, value, callback) => {
callback();
};
const rules = reactive({
jwcode: [{ required: true, validator:validateJwCode, trigger: 'blur' }],
refundType: [{ required: true, message: '请选择退款类型', trigger: 'blur' }],
goodsName: [{ required: true, message: '请选择退款商品', trigger: 'blur' }],
taskGold: [{ required: true, message: '请输入任务金币', trigger: 'blur' }],
freeGold: [{ required: true, message: '请输入免费金币', trigger: 'blur' }],
jwcode: [{required: true, validator: validateJwCode, trigger: 'blur'}],
refundType: [{required: true, message: '请选择退款类型', trigger: 'blur'}],
goodsName: [{required: true, message: '请选择退款商品', trigger: 'blur'}],
taskGold: [{required: true, message: '请输入任务金币', trigger: 'blur'}],
freeGold: [{required: true, message: '请输入免费金币', trigger: 'blur'}],
permanentGold: [
{ required: true, message: '请输入永久金币', trigger: 'blur' }
{required: true, message: '请输入永久金币', trigger: 'blur'}
],
sumGold: [
{ required: true, message: '请选择付款方式', trigger: 'blur' },
{required: true, message: '请选择付款方式', trigger: 'blur'},
{
validator: (rule, value) => {
if (value === 0) {
@ -231,15 +232,13 @@ const getUser = async function (jwcode) {
} catch (error) {
console.log("请求失败", error);
ElMessage.error("精网号错误");
}
}
// 退退
const refundType = ref([{ value: '商品退款', label: '商品退款' }]);
const refundType = ref([{value: '商品退款', label: '商品退款'}]);
// 退
// const getRefundTypes = async function () {
@ -264,13 +263,11 @@ const refundType = ref([{ value: '商品退款', label: '商品退款' }]);
// }
//
const goodsName = ref([])
const getGoods = async function (jwcode) {
trimJwCode();
//
if (!addRefund.value.jwcode) {
goodsName.value = []; //
@ -288,9 +285,9 @@ const getGoods = async function (jwcode) {
//
if (Array.isArray(result.data)) {
// { value, label }
goodsName.value = result.data.map(item => ({
goodsName.value = result.data.map(item => ({
value: item.goodsName, // 使 value
label: item.goodsName,
label: item.goodsName,
key: item.goodsName,
//
permanentGold: Math.abs(Number(item.permanentGold) || 0) / 100,
@ -316,7 +313,7 @@ const selectedGoodsGold = ref({
})
// 退退退退
const handleRefundModelChange = () =>{
const handleRefundModelChange = () => {
if (addRe.value.typeR === '0') {
// 退
addRefund.value.permanentGold = selectedGoodsGold.value.permanentGold;
@ -329,12 +326,12 @@ const handleSelectionChange = (selectedOption) => {
if (selectedOption) {
//
addRefund.value.goodsName = selectedOption.value;
//
addRefund.value.permanentGold = selectedOption.permanentGold || 0;
addRefund.value.freeGold = selectedOption.freeGold || 0;
addRefund.value.taskGold = selectedOption.taskGold || 0;
//
selectedGoodsGold.value.permanentGold = Number(selectedOption.permanentGold) || 0;
selectedGoodsGold.value.freeGold = Number(selectedOption.freeGold) || 0;
@ -348,7 +345,7 @@ const handleSelectionChange = (selectedOption) => {
const handleGoldInput = (type, value) => {
// 1.
let filtered = value.replace(/[^\d.]/g, '');
// 2.
const dotCount = (filtered.match(/\./g) || []).length;
if (dotCount > 1) {
@ -356,7 +353,7 @@ const handleGoldInput = (type, value) => {
const parts = filtered.split('.');
filtered = parts[0] + '.' + parts.slice(1).join('');
}
// 3.
if (filtered.includes('.')) {
const [integer, decimal] = filtered.split('.');
@ -364,30 +361,30 @@ const handleGoldInput = (type, value) => {
filtered = `${integer}.${decimal.slice(0, 2)}`;
}
}
// 4. 0
if (filtered.startsWith('.')) {
filtered = '0' + filtered;
}
// 5.
addRefund.value[type] = filtered;
// 6.
const maxValue = selectedGoodsGold.value[type];
const inputValue = Number(filtered || 0);
if (isNaN(inputValue)) {
return;
}
if (inputValue > maxValue) {
//
const correctedValue = maxValue.toFixed(2);
addRefund.value[type] = correctedValue;
ElMessage.warning('所填金额大于该类金币余额');
}
if (inputValue < 0) {
// 0
addRefund.value[type] = '0';
@ -405,7 +402,7 @@ const calculatedRechargeGoods = computed(() => {
const permanentGold = addRefund.value.permanentGold === '' ? 0 : +addRefund.value.permanentGold;
const freeGold = addRefund.value.freeGold === '' ? 0 : +addRefund.value.freeGold;
const taskGold = addRefund.value.taskGold === '' ? 0 : +addRefund.value.taskGold;
return Number((permanentGold + freeGold + taskGold).toFixed(2));
return Number((permanentGold + freeGold + taskGold).toFixed(2));
})
watch(calculatedRechargeGoods, (newVal) => {
@ -423,213 +420,214 @@ onMounted(async function () {
</script>
<template>
<div >
<el-form
:model="addRefund"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
class="form-style"
>
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addRefund.jwcode"
style="width: 220px"
@change="getGoods(addRefund.jwcode)"
/>
<el-button
type="primary"
@click="getUser(addRefund.jwcode)"
style="margin-left: 20px"
>查询</el-button
>
</el-form-item>
<el-form-item prop="refundType" label="退款类型">
<el-select
v-model="addRefund.refundType"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item prop="goodsName" label="商品名">
<el-select
v-model="addRefund.goodsName"
placeholder="请选择"
style="width: 300px"
@change="handleSelectionChange"
>
<el-option
v-for="item in goodsName"
:key="item.key"
:label="item.label"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item prop="refundModel" label="退款方式:">
<el-radio-group v-model="addRe.typeR" @change="handleRefundModelChange">
<el-radio value="0">全部退款</el-radio>
<el-radio value="1">部分退款</el-radio>
</el-radio-group>
</el-form-item>
<div style="display: flex; align-items: center">
<el-form-item prop="permanentGold" label="永久金币" style="float: left">
<div>
<el-form
:model="addRefund"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
class="form-style"
>
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addRefund.permanentGold"
style="width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handlePermanentGoldInput($event)"
type="number"
v-model="addRefund.jwcode"
style="width: 220px"
@change="getGoods(addRefund.jwcode)"
/>
<el-button
type="primary"
@click="getUser(addRefund.jwcode)"
style="margin-left: 20px"
>查询
</el-button
>
</el-input>
<p></p>
</el-form-item>
<el-form-item
prop="freeGold"
label="免费金币"
style="margin-left: -20px; float: left"
>
<el-form-item prop="refundType" label="退款类型">
<el-select
v-model="addRefund.refundType"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item prop="goodsName" label="商品名">
<el-select
v-model="addRefund.goodsName"
placeholder="请选择"
style="width: 300px"
@change="handleSelectionChange"
>
<el-option
v-for="item in goodsName"
:key="item.key"
:label="item.label"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item prop="refundModel" label="退款方式:">
<el-radio-group v-model="addRe.typeR" @change="handleRefundModelChange">
<el-radio value="0">全部退款</el-radio>
<el-radio value="1">部分退款</el-radio>
</el-radio-group>
</el-form-item>
<div style="display: flex; align-items: center">
<el-form-item prop="permanentGold" label="永久金币" style="float: left">
<el-input
v-model="addRefund.permanentGold"
style="width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handlePermanentGoldInput($event)"
type="number"
>
</el-input>
<p></p>
</el-form-item>
<el-form-item
prop="freeGold"
label="免费金币"
style="margin-left: -20px; float: left"
>
<el-input
v-model="addRefund.freeGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleFreeGoldInput($event)"
type="number"
/>
<p></p>
</el-form-item>
<el-form-item prop="taskGold" label="任务金币" style="margin-left: -20px">
<el-input
v-model="addRefund.taskGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleTaskGoldInput($event)"
type="number"
/>
<p></p>
</el-form-item>
</div>
<el-form-item prop="sumGold" label="退款金币总数">
<el-input disabled v-model="addRefund.sumGold" style="width: 100px">
</el-input>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addRefund.freeGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleFreeGoldInput($event)"
type="number"
v-model="addRefund.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
<p></p>
</el-form-item>
<el-form-item prop="taskGold" label="任务金币" style="margin-left: -20px">
<el-form-item prop="adminName" label="提交人">
<el-input
v-model="addRefund.taskGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleTaskGoldInput($event)"
type="number"
style="width: 300px"
:value="adminData.adminName"
disabled
placeholder="提交人姓名"
/>
<p></p>
</el-form-item>
</div>
<el-form-item prop="sumGold" label="退款金币总数">
<el-input disabled v-model="addRefund.sumGold" style="width: 100px">
</el-input>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addRefund.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
<el-form-item prop="adminName" label="提交人">
<el-input
style="width: 300px"
:value="adminData.adminName"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
<el-button type="success" @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 1000px"
label-position="left"
>
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<!-- 第一行姓名 + 历史金币 -->
<el-row style="margin-top: 20px">
<el-col :span="9">
<el-form-item label="姓名:">
<p>{{ user.name }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="历史金币总数">
<p v-if="!isNaN(Number(user.historySumGold))">
{{ Number(user.historySumGold) }}
</p>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行精网号 + 当前金币独立行 -->
<el-row>
<el-col :span="9">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<el-button type="success" @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交</el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 1000px"
label-position="left"
>
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<!-- 第一行姓名 + 历史金币 -->
<el-row style="margin-top: 20px">
<el-col :span="9">
<el-form-item label="姓名:">
<p>{{ user.name }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="历史金币总数">
<p v-if="!isNaN(Number(user.historySumGold))">
{{ Number(user.historySumGold) }}
</p>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行精网号 + 当前金币独立行 -->
<el-row>
<el-col :span="9">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<span
style="color: #2fa1ff; margin-right: 5px"
v-if="user.nowSumGold !== undefined"
style="color: #2fa1ff; margin-right: 5px"
v-if="user.nowSumGold !== undefined"
>{{ user.nowSumGold }}</span>
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span
style="color: #b1b1b1; margin-left: 0px"
v-if="user.nowPermanentGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span
style="color: #b1b1b1; margin-left: 0px"
v-if="user.nowPermanentGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行首次充值日期 + 充值次数 -->
<el-row style="margin-top:-23px">
<el-col :span="9">
<el-form-item label="首次充值日期">
<p v-if="user.firstRecharge">
{{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }}
</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="充值次数">
<p style="color: #2fa1ff">{{ user.rechargeNum }}</p>
</el-form-item>
</el-col>
</el-row>
<!-- 第四行消费次数 + 所属门店 -->
<el-row>
<el-col :span="9">
<el-form-item label="消费次数">
<p style="color: #2fa1ff">{{ user.consumeNum }}</p>
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="所属门店">
<p>{{ user.market }}</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行首次充值日期 + 充值次数 -->
<el-row style="margin-top:-23px">
<el-col :span="9">
<el-form-item label="首次充值日期">
<p v-if="user.firstRecharge">
{{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }}
</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="充值次数">
<p style="color: #2fa1ff">{{ user.rechargeNum }}</p>
</el-form-item>
</el-col>
</el-row>
<!-- 第四行消费次数 + 所属门店 -->
<el-row>
<el-col :span="9">
<el-form-item label="消费次数">
<p style="color: #2fa1ff">{{ user.consumeNum }}</p>
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="所属门店">
<p>{{ user.market }}</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</template>

Loading…
Cancel
Save