977 lines
33 KiB
Vue
977 lines
33 KiB
Vue
<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: #a4485a;"
|
||
>真删除</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:#7a664e;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:#7a664e;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:#7a664e;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:#7a664e;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>
|