first commit

This commit is contained in:
2026-09-21 19:21:35 +08:00
commit 6c944c4ffd
2733 changed files with 296956 additions and 0 deletions
+976
View File
@@ -0,0 +1,976 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="用户ID" prop="userName">
<el-input
v-model="queryParams.userId"
placeholder="请输入用户ID"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="用户昵称" prop="nickName">
<el-input
v-model="queryParams.nickName"
placeholder="请输入用户昵称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="用户类型" prop="userType">
<el-select v-model="queryParams.userType" placeholder="请选择用户类型" clearable>
<el-option
v-for="dict in dict.type.user_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="手机号码" prop="phoneNumber">
<el-input
v-model="queryParams.phoneNumber"
placeholder="请输入手机号码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="用户状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择用户状态" clearable>
<el-option
v-for="dict in dict.type.user_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="邀请码" prop="invitationCode">
<el-input
v-model="queryParams.invitationCode"
placeholder="请输入邀请码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="上级ID" prop="parentId">
<el-input
v-model="queryParams.parentId"
placeholder="请输入上级ID"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
icon="el-icon-circle-plus-outline"
type="success"
size="mini"
@click="openBusinessDialog"
>生成招商账号</el-button>
</el-col>
<el-col :span="1.5">
<el-button
icon="el-icon-circle-plus-outline"
type="primary"
size="mini"
@click="addRobot = true"
>生成机器人</el-button>
</el-col>
<el-col :span="1.5">
<el-button
icon="el-icon-circle-plus-outline"
type="danger"
size="mini"
@click="openCardDialog"
>生成卡商账号</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="ID" align="center" prop="userId" />
<el-table-column label="用户昵称" align="center" prop="nickName" />
<el-table-column label="头像" align="center" prop="avatar">
<template slot-scope="scope">
<image-preview :src="scope.row.avatar" :width="50" :height="50" />
</template>
</el-table-column>
<el-table-column label="手机号码" align="center" prop="phoneNumber" />
<el-table-column label="上级" align="center" prop="parentId" />
<el-table-column label="邀请码" align="center" prop="invitationCode" />
<el-table-column label="用户类型" align="center" prop="userType">
<template slot-scope="scope">
<span v-for="dict in dict.type.user_type" v-if="dict.value === scope.row.userType" :key="dict.value">{{ dict.label }}</span>
</template>
</el-table-column>
<el-table-column label="账户金额" align="center" prop="accountAmount" />
<el-table-column label="账户积分" align="center" prop="accountCredits" />
<el-table-column label="帐号状态" align="center" prop="status" class="kg">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
:active-value="'1'"
:inactive-value="'0'"
active-color="#D9534F"
inactive-color="#5CB85C"
active-text="正常"
inactive-text="停用"
@change="updateUserStatus(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="提货状态" align="center" prop="deliveryStatus" class="kg">
<template slot-scope="scope">
<el-switch
v-model="scope.row.deliveryStatus"
:active-value="'1'"
:inactive-value="'0'"
active-color="#D9534F"
inactive-color="#5CB85C"
active-text="启用"
inactive-text="禁用"
@change="updateUserStatus(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="赠送状态" align="center" prop="giftStatus" class="kg">
<template slot-scope="scope">
<el-switch
v-model="scope.row.giftStatus"
:active-value="'1'"
:inactive-value="'0'"
active-color="#D9534F"
inactive-color="#5CB85C"
active-text="启用"
inactive-text="禁用"
@change="updateUserStatus(scope.row)"
></el-switch>
</template>
</el-table-column>
<!-- 推广等级已按要求隐藏(列表与详情都不再展示);最后登录时间移入详情 -->
<el-table-column label="VIP 等级" align="center" prop="vipLevel">
<template slot-scope="scope">VIP{{ scope.row.vipLevel }}</template>
</el-table-column>
<el-table-column label="总充值" align="center" prop="totalPrice" />
<el-table-column label="总提取" align="center" prop="totalDelivery" />
<el-table-column label="最后登录IP" align="center" prop="loginIp" />
<!-- <el-table-column label="备注" align="center" prop="remark" /> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleCount(scope.row)">统计</el-button>
<el-button size="mini" type="text" @click="handlePsack(scope.row)">背包</el-button>
<el-dropdown size="mini">
<el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
@click.native="handleUpdate(scope.row)"
>修改</el-dropdown-item>
<el-dropdown-item
@click.native="handleView(scope.row)"
>详情</el-dropdown-item>
<el-dropdown-item
@click.native="handleResetBalance(scope.row)"
>重置余额积分</el-dropdown-item>
<el-dropdown-item
@click.native="handleDelete(scope.row)"
>删除</el-dropdown-item>
<el-dropdown-item
@click.native="handleForceDelete(scope.row)" style="color: #F56C6C;"
>真删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!-- 生成招商账号 -->
<el-dialog title="新增招商用户" :visible.sync="addNewUser" width="600px">
<el-form label-width="90px">
<el-form-item label="请选择数量:" style="margin-bottom: 12px;">
<el-input-number size="mini" v-model="newNumber" :min="1" :max="10" @change="onBusinessNumberChange"></el-input-number>
<span style="font-size:12px;color:#909399;margin-left:10px;">
<i class="el-icon-info"></i> 可生成 1-10 个账号
</span>
</el-form-item>
<el-form-item
v-for="(item, index) in businessPhones"
:key="index"
:label="'手机号' + (index + 1)"
style="margin-bottom: 10px;"
>
<el-input
v-model="item.value"
maxlength="11"
clearable
placeholder="留空则自动生成随机手机号"
/>
</el-form-item>
<div style="font-size:12px;color:#909399;padding-left:90px;">
<i class="el-icon-info"></i> 手机号选填:填写后作为登录账号,留空则系统随机生成
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="addNewUser = false">取 消</el-button>
<el-button type="primary" @click="generateAccount">确 定</el-button>
</div>
</el-dialog>
<!-- 生成机器人 -->
<el-dialog title="生成机器人" :visible.sync="addRobot" width="600px">
<el-form>
<el-form-item label="请选择数量:" style="margin-bottom: 2px;">
<el-input-number size="mini" v-model="newNumber" :min="1" :max="10" label="描述文字"></el-input-number>
</el-form-item>
<div style="font-size:14px;color:#797979;">
<i class="el-icon-info"></i> 要生成的账号数量
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="addRobot = false">取 消</el-button>
<el-button type="primary" @click="generateRobot">确 定</el-button>
</div>
</el-dialog>
<!-- 生成卡商账号 -->
<el-dialog title="生成卡商账号" :visible.sync="addCardMerchant" width="600px">
<el-form label-width="90px">
<el-form-item label="请选择数量:" style="margin-bottom: 12px;">
<el-input-number size="mini" v-model="newNumber" :min="1" :max="10" @change="onCardNumberChange"></el-input-number>
<span style="font-size:12px;color:#909399;margin-left:10px;">
<i class="el-icon-info"></i> 可生成 1-10 个卡商账号
</span>
</el-form-item>
<el-form-item
v-for="(item, index) in cardPhones"
:key="index"
:label="'手机号' + (index + 1)"
style="margin-bottom: 10px;"
>
<el-input
v-model="item.value"
maxlength="11"
clearable
placeholder="留空则自动生成随机手机号"
/>
</el-form-item>
<div style="font-size:12px;color:#909399;padding-left:90px;">
<i class="el-icon-info"></i> 手机号选填:填写后作为登录账号,留空则系统随机生成
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="addCardMerchant = false">取 消</el-button>
<el-button type="primary" @click="handleGenerateCardMerchant">确 定</el-button>
</div>
</el-dialog>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改注册用户对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户昵称" />
</el-form-item>
<el-form-item label="用户类型" prop="userType">
<el-select v-model="form.userType" placeholder="请选择用户类型" disabled>
<el-option
v-for="dict in dict.type.user_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入用户邮箱" />
</el-form-item>
<el-form-item label="手机号码" prop="phoneNumber">
<el-input v-model="form.phoneNumber" placeholder="请输入手机号码" />
</el-form-item>
<el-form-item label="邀请码" prop="invitationCode">
<el-input v-model="form.invitationCode" placeholder="请输入邀请码" />
</el-form-item>
<el-form-item label="头像地址" prop="avatar">
<image-upload v-model="form.avatar" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form.password" placeholder="请输入密码" />
</el-form-item>
<el-form-item label="安全密码" prop="safePasswordPlain">
<el-input v-model="form.safePasswordPlain" placeholder="6位数字,留空则不修改" maxlength="6" />
</el-form-item>
<el-form-item label="账户金额" prop="accountAmount">
<el-input v-model="form.accountAmount" placeholder="请输入账户金额" />
</el-form-item>
<el-form-item label="账户积分" prop="accountCredits">
<el-input v-model="form.accountCredits" placeholder="请输入账户积分" />
</el-form-item>
<el-form-item label="上级ID" prop="parentId">
<el-input v-model="form.parentId" placeholder="请输入上级ID" />
</el-form-item>
<el-form-item label="steam交易链接" prop="transactionLink">
<el-input v-model="form.transactionLink" placeholder="请输入steam交易链接" />
</el-form-item>
<el-form-item label="实名认证状态" prop="isRealCheck">
<el-radio-group v-model="form.isRealCheck">
<el-radio :label="'1'">已实名</el-radio>
<el-radio :label="'0'">未实名</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="邀请新人充值比例" prop="commissionRate">
<el-input v-model="form.commissionRate" placeholder="请输入邀请新人充值比例(如 2 表示 2%)" />
</el-form-item>
<el-form-item v-if="form.userType === '04' || form.userType === '01'" label="新游戏消费返点比例" prop="newGameCommissionRate">
<el-input v-model="form.newGameCommissionRate" placeholder="新游戏消费返点比例(如 1 表示 1%)" />
</el-form-item>
<el-form-item v-if="form.userType === '04' || form.userType === '01'" label="经典玩法返点比例" prop="classicGameCommissionRate">
<el-input v-model="form.classicGameCommissionRate" placeholder="经典玩法返点比例(如 3.5 表示 3.5%)" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
<!-- 用户详情 -->
<el-dialog title="用户详情" :visible.sync="openView" width="800px" append-to-body>
<el-form ref="form" :model="form" label-width="120px" size="mini">
<el-row>
<el-col :span="12">
<el-form-item label="用户ID:">{{ form.userId }}</el-form-item>
<el-form-item label="账号:">{{ form.userName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户昵称:">{{ form.nickName }}</el-form-item>
<el-form-item label="密码:">{{ form.remark }}</el-form-item>
<el-form-item label="安全密码:">{{ form.safePasswordPlain }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电话号码:">{{ form.phoneNumber }}</el-form-item>
<el-form-item label="用户邮箱:">{{ form.email }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户类型:" prop="userType">
<span v-if="form.userType === '00'">系统用户</span>
<span v-if="form.userType === '01'">主播</span>
<span v-if="form.userType === '02'">普通用户</span>
</el-form-item>
<el-form-item label="用户状态:">
<span v-if="form.status === '0'">正常</span>
<span v-if="form.status === '1'">停用</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="余额:">{{ form.accountAmount }}</el-form-item>
<el-form-item label="积分:">{{ form.accountCredits }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邀请码:">{{ form.invitationCode }}</el-form-item>
<el-form-item label="上级:">{{ form.parentId }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="steam交易链接:">{{ form.transactionLink }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="真实姓名:">{{ form.realName }}</el-form-item>
<el-form-item label="身份证号:">{{ form.idNum }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否实名:">
<span v-if="form.isRealCheck === '0'">未实名</span>
<span v-if="form.isRealCheck === '1'">已实名</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最后登录ip:">{{ form.loginIp }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最后登录时间:">{{ form.loginDate }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建自:">{{ form.createBy }}</el-form-item>
<el-form-item label="注册时间:">{{ form.createTime }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="更新自:">{{ form.updateBy }}</el-form-item>
<el-form-item label="更新时间:">{{ form.updateTime }}</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="openView = false">关 闭</el-button>
</div>
</el-dialog>
<!-- 统计 -->
<el-dialog title="用户利润统计" :visible.sync="countVisible" width="600px">
<el-row style="display: flex; justify-content: center;">
<div id="main"></div>
</el-row>
</el-dialog>
</div>
</template>
<script>
import {
listUser,
getUser,
delUser,
updateUser,
generateAccount,
generateRobot,
generateCardMerchant,
getUserProfitStatistics,
resetUserBalance,
forceDeleteUser
} from "@/api/skins/ttuser/api";
import * as echarts from "echarts";
export default {
name: 'TtUser',
dicts: ["user_type", "user_status"],
data() {
return {
countVisible: false,
openView: false,
newNumber: 1,
addNewUser: false,
addRobot: false,
addCardMerchant: false,
// 招商账号-自定义手机号输入列表(每项 { value },留空则后端随机生成)
businessPhones: [{ value: "" }],
// 卡商账号-自定义手机号输入列表
cardPhones: [{ value: "" }],
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 注册用户表格数据
userList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
nickName: null,
phoneNumber: null,
status: null,
certifyId: null,
userId: null,
userName: null,
userType: null
},
// 表单参数
form: {},
// 表单校验
rules: {
userName: [
{ required: true, message: "用户账号不能为空", trigger: "blur" }
],
nickName: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" }
],
userType: [
{ required: true, message: "用户类型不能为空", trigger: "change" }
],
accountAmount: [
{ required: true, message: "账户金额不能为空", trigger: "blur" }
],
accountCredits: [
{ required: true, message: "账户积分不能为空", trigger: "blur" }
],
invitationCode: [
{ required: true, message: "邀请码不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "帐号状态不能为空", trigger: "change" }
],
isRealCheck: [
{
required: true,
message: "实名认证状态不能为空",
trigger: "change"
}
],
delFlag: [
{ required: true, message: "删除标志不能为空", trigger: "change" }
],
safePasswordPlain: [
{
validator: (rule, value, callback) => {
if (!value || /^\d{6}$/.test(value)) return callback();
callback(new Error("安全密码必须为6位数字"));
},
trigger: "blur"
}
]
}
};
},
created() {
this.getList();
},
methods: {
initEcharts(res) {
var chartDom = document.getElementById("main");
var myChart = echarts.init(chartDom);
var option;
option = {
xAxis: {
type: "category",
data: []
},
legend: {
data: ["日出货总金额", "日开启次数", "日利润"]
},
tooltip: {
trigger: "axis"
},
yAxis: {
type: "value"
},
series: [
{
data: [res.totalRecharge],
type: "bar",
name: "总充值",
label: {
show: true,
position: "top",
formatter: "总充值:" + "{c}"
}
},
{
data: [res.totalDelivery],
type: "bar",
name: "总提货",
label: {
show: true,
position: "top",
formatter: "提货:" + "{c}"
}
},
{
data: [res.totalProfit],
type: "bar",
name: "总利润",
label: {
show: true,
position: "top",
formatter: "总利润:" + "{c}"
}
}
]
};
option && myChart.setOption(option);
},
handleCount(res) {
this.countVisible = true;
getUserProfitStatistics(res.userId).then(res => {
this.initEcharts(res.data);
});
},
handlePsack(res) {
this.$router.push({
path: "/user/userPack",
query: {
id: res.userId,
status: 0
}
});
},
handleView(res) {
this.form = [];
this.openView = true;
getUser(res.userId).then(response => {
this.form = response.data;
});
},
/* 打开生成招商账号弹窗 */
openBusinessDialog() {
this.newNumber = 1;
this.businessPhones = this.buildPhoneInputs(this.newNumber, []);
this.addNewUser = true;
},
/* 打开生成卡商账号弹窗 */
openCardDialog() {
this.newNumber = 1;
this.cardPhones = this.buildPhoneInputs(this.newNumber, []);
this.addCardMerchant = true;
},
/* 根据数量构建手机号输入框数组,保留已填写的值 */
buildPhoneInputs(count, existing) {
const list = [];
for (let i = 0; i < count; i++) {
list.push({ value: existing[i] ? existing[i].value : "" });
}
return list;
},
/* 招商账号数量变化时,重建手机号输入框 */
onBusinessNumberChange(val) {
this.businessPhones = this.buildPhoneInputs(val, this.businessPhones);
},
/* 卡商账号数量变化时,重建手机号输入框 */
onCardNumberChange(val) {
this.cardPhones = this.buildPhoneInputs(val, this.cardPhones);
},
/* 校验并提取自定义手机号:合法返回数组(留空占位为""),非法返回 null */
extractCustomPhones(phones) {
const result = [];
const seen = new Set();
const reg = /^1[3-9]\d{9}$/;
for (let i = 0; i < phones.length; i++) {
const v = (phones[i].value || "").trim();
if (v) {
if (!reg.test(v)) {
this.$modal.msgError(`第 ${i + 1} 个手机号格式不正确,请输入 11 位有效手机号`);
return null;
}
if (seen.has(v)) {
this.$modal.msgError(`第 ${i + 1} 个手机号重复:${v}`);
return null;
}
seen.add(v);
}
result.push(v);
}
return result;
},
/* 生成招商账号 */
generateAccount() {
const customPhoneNumbers = this.extractCustomPhones(this.businessPhones);
if (customPhoneNumbers === null) return;
generateAccount({ num: this.newNumber, customPhoneNumbers }).then(res => {
this.getList();
this.addNewUser = false;
const blob = new Blob([res], {
type: "text/plain;charset=utf-8"
});
const objectURL = URL.createObjectURL(blob);
const aTag = document.createElement("a");
aTag.href = objectURL;
aTag.download = `账号数据_${new Date().getTime()}.txt`;
aTag.click();
URL.revokeObjectURL(objectURL);
});
},
/* 生成机器人 */
generateRobot() {
generateRobot(this.newNumber).then(res => {
this.getList();
(this.newNumber = null), (this.addRobot = false);
const blob = new Blob([res], {
type: "text/plain;charset=utf-8"
});
const objectURL = URL.createObjectURL(blob);
const aTag = document.createElement("a");
aTag.href = objectURL;
aTag.download = `账号数据_${new Date().getTime()}.txt`;
aTag.click();
URL.revokeObjectURL(objectURL);
});
},
/* 生成卡商账号 */
handleGenerateCardMerchant() {
const customPhoneNumbers = this.extractCustomPhones(this.cardPhones);
if (customPhoneNumbers === null) return;
generateCardMerchant({ num: this.newNumber, customPhoneNumbers }).then(res => {
this.getList();
this.addCardMerchant = false;
const blob = new Blob([res], {
type: "text/plain;charset=utf-8"
});
const objectURL = URL.createObjectURL(blob);
const aTag = document.createElement("a");
aTag.href = objectURL;
aTag.download = `卡商账号_${new Date().getTime()}.txt`;
aTag.click();
URL.revokeObjectURL(objectURL);
});
},
/** 查询注册用户列表 */
getList() {
this.loading = true;
listUser(this.queryParams).then(response => {
this.userList = response.rows;
this.total = response.total;
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
userId: null,
userName: null,
nickName: null,
userType: null,
email: null,
phoneNumber: null,
avatar: null,
password: null,
safePasswordPlain: null,
accountAmount: null,
accountCredits: null,
invitationCode: null,
parentId: null,
status: null,
steamId: null,
transactionLink: null,
realName: null,
idNum: null,
certifyId: null,
isRealCheck: null,
loginIp: null,
loginDate: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
delFlag: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.userId);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 修改用户状态操作 */
updateUserStatus(row) {
// row.avatar = "";
this.loading = true;
updateUser(row).then(res => {
this.$notify({
title: "成功",
message: "修改成功",
type: "success"
});
this.getList();
this.loading = false;
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const userId = row.userId || this.ids;
getUser(userId).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改注册用户";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.userId != null) {
updateUser(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const userIds = row.userId || this.ids;
this.$modal
.confirm('是否确认删除注册用户编号为"' + userIds + '"的数据项?')
.then(function() {
return delUser(userIds);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"admin/user/export",
{
...this.queryParams
},
`user_${new Date().getTime()}.xlsx`
);
},
handleResetBalance(row) {
this.$modal.confirm(`确认将用户【${row.nickName}】的余额和积分重置为 0 吗?`).then(() => {
resetUserBalance(row.userId).then(response => {
if (response.code !== 200) {
this.$modal.msgError(response.msg);
return;
}
this.$modal.msgSuccess("余额和积分已重置为 0");
this.getList();
});
}).catch(() => {});
},
handleForceDelete(row) {
this.$modal.confirm(
`⚠️ 确认彻底删除用户【${row.nickName}】?此操作不可恢复,数据将从数据库永久删除!`
).then(() => {
forceDeleteUser(row.userId).then(response => {
if (response.code !== 200) {
this.$modal.msgError(response.msg);
return;
}
this.$modal.msgSuccess("用户已彻底删除");
this.getList();
});
}).catch(() => {});
}
}
};
</script>
<style lang="scss" scoped>
::v-deep .el-switch {
border-radius: 0px !important;
height: 24px !important;
}
::v-deep .el-switch__core {
width: 70px !important;
height: 24px;
border-radius: 3px;
border: none;
}
::v-deep .el-switch__core::after {
width: 50%;
height: 24px;
border-radius: 0px;
top: 0px !important;
right: 0px !important;
left: 0px;
border: 1px solid #ccc;
border-radius: 3px;
}
::v-deep .el-switch.is-checked .el-switch__core::after {
margin-left: -35px;
box-sizing: border-box;
top: 0px !important;
right: 0px !important;
border: 1px solid #ccc;
border-radius: 3px;
text-align: center;
}
/*关闭时文字位置设置*/
::v-deep .el-switch__label--right {
text-align: center;
position: absolute;
width: 40%;
z-index: 1;
right: 6px;
margin-left: 0px;
color: rgba(255, 255, 255, 1);
span {
font-size: 13px;
box-sizing: border-box;
color: #fff;
}
}
/* 激活时另一个文字消失 */
::v-deep .el-switch__label.is-active {
text-align: center;
display: none;
}
/*开启时文字位置设置*/
::v-deep .el-switch__label--left {
text-align: center;
position: absolute;
width: 40%;
z-index: 1;
left: 5px;
margin-right: 0px;
color: rgba(255, 255, 255, 1);
span {
font-size: 13px;
box-sizing: border-box;
color: #fff;
}
}
#main {
width: 500px;
height: 400px;
}
</style>