manghe/app/admin/view/User/index.html
2025-04-13 21:57:55 +08:00

733 lines
30 KiB
HTML
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{include file="Public:header2"/}
<body>
<div class="layui-fluid">
<div class="layui-card">
<!-- 搜索表单 -->
<div class="layui-form layui-card-header layuiadmin-card-header-auto" id="searchForm">
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" name="user_id" placeholder="请输入UID" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" name="pid" placeholder="请输入推荐人UID" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" name="mobile" placeholder="请输入手机号" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" name="nickname" placeholder="请输入昵称" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" id="last_login_ip" name="last_login_ip" class="layui-input"
placeholder="ip查询">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" id="addtime" name="addtime" class="layui-input" placeholder="登录时间">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layuiadmin-btn-useradmin" data-type="search">
<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
</button>
</div>
</div>
</div>
<!-- 数据表格 -->
<div class="layui-card-body">
<table id="LAY-user-table" lay-filter="LAY-user-table"></table>
</div>
</div>
</div>
<!-- 用户信息模板 -->
<script type="text/html" id="userInfoTpl">
<div class="user-card">
<img src="{{d.headimg}}" alt="{{d.nickname}}" class="user-avatar">
<div class="user-info">
<p class="user-detail">{{d.nickname}}</p>
<p class="user-id">UID{{d.uid}}</p>
<p class="user-id">真实Id{{d.id}}</p>
<p class="user-detail">{{d.mobile}}</p>
</div>
</div>
</script>
<!-- 添加推荐人信息模板 -->
<script type="text/html" id="pidInfoTpl">
{{# if(d.pid_info) { }}
<div class="user-card">
<img src="{{d.pid_info.headimg}}" alt="" class="user-avatar">
<div class="user-info">
<p class="user-id">UID{{d.pid_info.uid}}</p>
<p class="user-detail">{{d.pid_info.nickname}}</p>
<p class="user-id">真实Id{{d.pid_info.id}}</p>
</div>
</div>
{{# } else { }}
-
{{# } }}
</script>
<!-- 操作按钮模板 -->
<script type="text/html" id="operationTpl">
<div class="btn-group">
<a class="layui-btn layui-btn-default layui-btn-xs" lay-event="give">赠送优惠券</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail">查看下级</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="ipDetail">查看ip登录列表</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="viewBox">查看盒柜</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="viewOrder">查看订单</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="bindMobile">绑定手机号</a>
{{# if(d.ip_adcode == 1){ }}
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="ipConvert">ip转换</a>
{{# } }}
<div>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="clearMobile">清空手机号</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="clearWechat">重置微信登录</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="clearUid">清空UID</a><br />
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="resetSign">重置签到数据</a>
</div>
</div>
</script>
<!-- 余额模板 -->
<script type="text/html" id="moneyTpl">
<span class="value-display">{{d.money}}</span>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="rechargeMoney">充值</a><br />
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="moneyDetail">流水明细</a>
</script>
<!--货币2按钮模板-->
<script type="text/html" id="integralTpl">
<span class="value-display">{{d.integral}}</span>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="rechargeIntegral">充值</a><br />
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="integralDetail">流水明细</a>
</script>
<!--货币3按钮模板-->
<script type="text/html" id="scoreTpl">
<span class="value-display">{{d.money2}}</span>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="rechargeScore">充值</a><br />
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="scoreDetail">流水明细</a>
</script>
<!-- 修改状态模板 -->
<script type="text/html" id="statusTpl">
<div class="status-group">
<div class="status-text">
账号状态
{{# if(d.status == 1) { }}
正常
{{# if(d.istest == 1) { }}
/推广账号
{{# } else if(d.istest == 2) { }}
/测试账号
{{# } }}
{{# } else { }}
封号
{{# } }}
</div>
<div class="status-actions">
{{# if(d.status == 1) { }}
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="ban">封号</a>
{{# if(d.istest == 0) { }}
<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="setPromotion">推广</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="setTest">测试</a>
{{# } }}
{{# if(d.istest == 1) { }}
<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="cancelPromotion">取消推广</a>
{{# } }}
{{# if(d.istest == 2) { }}
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="cancelTest">取消测试</a>
{{# } }}
{{# } else { }}
<a class="layui-btn layui-btn-success layui-btn-xs" lay-event="unban">解封</a>
{{# } }}
</div>
</div>
</script>
<!-- 修改合并列模板 -->
<script type="text/html" id="combinedTpl">
<div class="user-extra-info">
<div>总消费{{Number(d.user_all_total).toFixed(2)}}</div>
<div>总出货价值{{Number(d.user_goodslist_money3).toFixed(2)}}</div>
<div>盒柜价值{{(Number(d.user_hegui)).toFixed(2)}}</div>
<div>微信消费{{Number(d.user_weixin_total).toFixed(2)}}</div>
<div>{$app_setting.balance_name}消费{{Number(d.user_use_money).toFixed(2)}}</div>
<div>{$app_setting.currency1_name}消费{{Number(d.user_use_integral).toFixed(2)}}</div>
<div>回收货币{{Number(d.user_goodslist_money).toFixed(2)}}</div>
<div>发货价值{{Number(d.user_goodslist_money2).toFixed(2)}}</div>
</div>
</script>
<!-- 添加新的用户附加信息模板 -->
<script type="text/html" id="userExtraInfoTpl">
<div class="user-extra-info">
<div>注册时间{{d.addtime ? timestampToDatetime(d.addtime) : '-'}}</div>
<div>活跃时间{{d.last_login_time ? timestampToDatetime(d.last_login_time) : '空'}}</div>
<div>IP{{d.last_login_ip || '-'}}</div>
<div>IP地址{{d.ip_province || '-'}}</div>
<div>IP邮编{{d.ip_adcode || '-'}}</div>
</div>
</script>
{include file="Public:footer"/}
<script>
var table;
var form;
var laydate;
// 时间戳转日期时间格式 - 移到全局作用域
function timestampToDatetime(timestamp) {
var date = new Date(timestamp * 1000);
var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + date.getDate()).slice(-2);
var hours = ('0' + date.getHours()).slice(-2);
var minutes = ('0' + date.getMinutes()).slice(-2);
var seconds = ('0' + date.getSeconds()).slice(-2);
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
}
layui.use(['table', 'form', 'laydate'], function () {
table = layui.table;
form = layui.form;
laydate = layui.laydate;
// 日期时间范围
laydate.render({
elem: '#addtime'
, type: 'datetime'
, range: true
});
console.log('full-' + Math.floor($('#searchForm').height() + 80));
// 表格实例
table.render({
elem: '#LAY-user-table'
, url: '{:url("/admin/user_list")}'
, cellMinWidth: 80 // 设置最小列宽
, lineStyle: 'height: 80px;' // 设置行高
, height: 'full-' + Math.floor($('#searchForm').height() + 100)
, cols: [[
{ field: 'userInfo', title: '用户信息', templet: '#userInfoTpl', width: 200 }
, { field: 'pid_info', title: '推荐人', templet: '#pidInfoTpl', width: 200 }
, { field: 'money', title: '{$app_setting.balance_name}', templet: '#moneyTpl', width: 150 }
, { field: 'integral', title: '{$app_setting.currency1_name}', templet: '#integralTpl', width: 120 }
, { field: 'score', title: '{$app_setting.currency2_name}', templet: '#scoreTpl', width: 120 }
, { field: 'combined', title: '货币信息', templet: '#combinedTpl', width: 200 }
, { field: 'status', title: '用户状态', templet: '#statusTpl', width: 200 }
, { field: 'extraInfo', title: '用户信息', templet: '#userExtraInfoTpl', width: 220 }
, { title: '操作', toolbar: '#operationTpl', width: 300, fixed: 'right' }
]]
, page: true
, limit: 20
, text: {
none: '暂无相关数据'
}
});
// 监听工具条事件
table.on('tool(LAY-user-table)', function (obj) {
var data = obj.data;
switch (obj.event) {
case 'give':
layer.open({
type: 2
, title: '赠送优惠券'
, content: '/admin/user_give_add/user_id/' + data.id
, area: ['600px', '400px']
});
break;
case 'bindMobile':
bindMobile(data.id, data.nickname);
break;
case 'ban':
userStatusChange(data.id, 2, data.nickname, '封号');
break;
case 'unban':
userStatusChange(data.id, 1, data.nickname, '解封');
break;
case 'setPromotion':
testAccountChange(data.id, 1, data.nickname, '设为推广账号');
break;
case 'setTest':
testAccountChange(data.id, 2, data.nickname, '设为测试账号');
break;
case 'cancelPromotion':
testAccountChange(data.id, 0, data.nickname, '取消推广账号');
break;
case 'cancelTest':
testAccountChange(data.id, 0, data.nickname, '取消测试账号');
break;
case 'detail':
layer.open({
type: 2
, title: '下级用户'
, content: '/admin/user_team?id=' + data.id
, area: ['80%', '80%']
});
break;
case 'ipDetail':
layer.open({
type: 2
, title: 'IP登录记录'
, content: '/admin/ip_list?id=' + data.id
, area: ['80%', '80%']
});
break;
case 'ipConvert':
ipConvert(data.id, 2, data.nickname);
break;
case 'clearMobile':
clearMobile(data.id, data.nickname);
break;
case 'clearWechat':
clearWechat(data.id, data.nickname);
break;
case 'clearUid':
clearUid(data.id, data.nickname);
break;
case 'rechargeMoney':
recharge(data.id, data.nickname, 1, '{$app_setting.balance_name}');
break;
case 'rechargeIntegral':
recharge(data.id, data.nickname, 2, '{$app_setting.currency1_name}');
break;
case 'rechargeScore':
recharge(data.id, data.nickname, 3, '{$app_setting.currency2_name}');
break;
case 'viewBox':
layer.open({
type: 2,
title: data.nickname + ' 的盒柜',
content: '/admin/user_box?id=' + data.id + '&nickname=' + encodeURIComponent(data.nickname),
area: ['95%', '90%'],
maxmin: true
});
break;
case 'viewOrder':
layer.open({
type: 2,
title: data.nickname + ' 的订单列表',
content: '/admin/user_order?id=' + data.id + '&nickname=' + encodeURIComponent(data.nickname),
area: ['95%', '90%'],
maxmin: true
});
break;
case 'moneyDetail':
layer.open({
type: 2,
title: data.nickname + ' 的余额流水明细',
content: '/admin/user_money_detail?user_id=' + data.id + '&nickname=' + encodeURIComponent(data.nickname),
area: ['95%', '90%'],
maxmin: true
});
break;
case 'integralDetail':
layer.open({
type: 2,
title: data.nickname + ' 的{$app_setting.currency1_name}流水明细',
content: '/admin/user_integral_detail?user_id=' + data.id + '&nickname=' + encodeURIComponent(data.nickname),
area: ['95%', '90%'],
maxmin: true
});
break;
case 'scoreDetail':
layer.open({
type: 2,
title: data.nickname + ' 的{$app_setting.currency2_name}流水明细',
content: '/admin/user_score_detail?user_id=' + data.id + '&nickname=' + encodeURIComponent(data.nickname),
area: ['95%', '90%'],
maxmin: true
});
break;
case 'resetSign':
resetUserSign(data.id, data.nickname);
break;
}
});
// 搜索
var active = {
search: function () {
var user_id = $('input[name="user_id"]').val()
, mobile = $('input[name="mobile"]').val()
, nickname = $('input[name="nickname"]').val()
, last_login_ip = $('input[name="last_login_ip"]').val()
, addtime = $('input[name="addtime"]').val();
var pid = $('input[name="pid"]').val();
table.reload('LAY-user-table', {
where: {
user_id: user_id
, mobile: mobile
, nickname: nickname
, last_login_ip: last_login_ip
, addtime: addtime
, pid: pid
}
, page: {
curr: 1
}
});
}
};
$('.layui-btn').on('click', function () {
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
// 用户状态变更
function userStatusChange(id, type, username, typeName) {
layer.confirm('确认要执行' + username + '的' + typeName + '操作吗?', function (index) {
$.post('{:url("/admin/userdel")}', {
id: id,
type: type
}, function (res) {
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
table.reload('LAY-user-table');
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
}
// 充值功能
function recharge(id, username, type, typeName) {
layer.open({
type: 2
, title: username + ' 充值' + typeName
, content: '/admin/chongzhi?id=' + id + '&type=' + type
, area: ['40%', '40%']
});
}
// 测试/推广账号状态变更
function testAccountChange(id, type, username, typeName) {
layer.confirm('确认要执行' + username + '的' + typeName + '操作吗?', function (index) {
$.post('{:url("/admin/usertest")}', {
id: id,
type: type
}, function (res) {
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
table.reload('LAY-user-table');
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
}
// IP转换
function ipConvert(id, type, username) {
layer.confirm('确认要执行' + username + '的IP转换操作吗?', function (index) {
$.post('{:url("/admin/ipzh")}', {
id: id,
type: type
}, function (res) {
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
table.reload('LAY-user-table');
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
}
// 清空手机号
function clearMobile(id, username) {
layer.confirm('确认要执行' + username + '的清空手机号操作吗?清空后通过手机号将搜索不到用户!同时用户需要重新绑定手机号才能抽奖!', {
icon: 2,
title: '清除手机号'
}, function (index) {
$.post('{:url("/admin/usermobileclear")}', {
id: id
}, function (res) {
if (res.status === 1) {
layer.msg(res.msg + ';请手动刷新页面!', { icon: 1 });
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
}
// 清除微信
function clearWechat(id, username) {
layer.confirm('确认要执行' + username + '的清空微信关联数据操作吗?清空后通过微信号将关联不到此账号!微信设为新账号需要同时清除手机号操作!!!', {
icon: 2,
title: '清除微信号'
}, function (index) {
$.post('{:url("/admin/userwxclear")}', {
id: id
}, function (res) {
if (res.status === 1) {
layer.msg(res.msg + ';请手动刷新页面!', { icon: 1 });
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
}
// 清空UID
function clearUid(id, username) {
layer.confirm('确认要清空' + username + '的UID吗清空后系统会按配置自动生成新的UID', {
icon: 2,
title: '清空UID'
}, function (index) {
$.post('{:url("/admin/userUidClear")}', {
id: id
}, function (res) {
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
table.reload('LAY-user-table');
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
}
// 重置用户签到数据
function resetUserSign(id, username) {
layer.confirm('确认要重置' + username + '的签到数据吗?重置后将把签到日期设置为上一天!', {
icon: 2,
title: '重置签到数据'
}, function (index) {
$.post('{:url("/admin/resetUserSign")}', {
id: id
}, function (res) {
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
table.reload('LAY-user-table');
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
}
// 绑定手机号
function bindMobile(id, username) {
layer.open({
type: 1,
title: '为 ' + username + ' 绑定手机号',
content: '<div style="padding: 20px;"><div class="layui-form-item">' +
'<label class="layui-form-label">手机号</label>' +
'<div class="layui-input-block">' +
'<input type="text" id="bind_mobile" placeholder="请输入手机号" autocomplete="off" class="layui-input">' +
'</div></div></div>',
area: ['400px', '200px'],
btn: ['确定', '取消'],
yes: function(index) {
var mobile = $('#bind_mobile').val();
if(!mobile || !/^1\d{10}$/.test(mobile)) {
layer.msg('请输入正确的手机号码', {icon: 2});
return;
}
$.post('{:url("/admin/bindUserMobile")}', {
id: id,
mobile: mobile
}, function(res) {
if(res.status === 1) {
layer.msg(res.msg, {icon: 1});
table.reload('LAY-user-table');
layer.close(index);
} else {
layer.msg(res.msg, {icon: 2});
}
});
}
});
}
});
</script>
<style>
/* 用户信息卡片样式 */
.user-card {
display: flex;
align-items: center;
padding: 8px;
}
.user-avatar {
width: 50px;
height: 50px;
border-radius: 50%;
object-fit: cover;
}
.user-info {
margin-left: 12px;
}
.user-id {
color: #e91e63;
font-size: 12px;
margin-bottom: 4px;
}
.user-detail {
color: rgba(102, 102, 102, 0.73);
font-size: 12px;
margin-bottom: 2px;
}
/* 操作按钮组样式 */
.btn-group {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 8px 0;
}
/* 搜索表单样式 */
.search-form {
display: flex;
flex-wrap: wrap;
gap: 12px;
padding: 16px;
}
.search-item {
min-width: 150px;
}
/* 表格样式优化 */
.layui-table {
margin-top: 16px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.layui-table thead th {
background-color: #f8f8f8;
font-weight: bold;
}
/* 充值按钮样式 */
.layui-table .layui-btn-xs {
margin-top: 5px;
/* 给充值按钮添加上边距 */
height: 22px;
line-height: 22px;
padding: 0 5px;
}
/* 数值显示样式 */
.value-display {
margin-bottom: 5px;
/* 数值和按钮之间的间距 */
display: block;
}
.layui-table-cell {
height: 150px !important;
line-height: 28px;
padding: 0 15px;
position: relative;
box-sizing: border-box
}
.status-group {
display: flex;
flex-direction: column;
gap: 8px;
}
.status-text {
color: #333;
font-size: 13px;
}
.status-actions {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.status-actions .layui-btn-xs {
height: 22px;
line-height: 22px;
padding: 0 8px;
}
.combined-values {
overflow: auto;
height: 100%;
}
.combined-values div {
margin: 0;
padding: 0px 0;
}
.layui-table td {
padding: 10px 15px;
/* 调整单元格内边距 */
height: 150px !important;
}
.layui-table thead th {
height: 30px !important;
}
.layui-table thead th div {
height: 30px !important;
}
.layui-table-col-special {
height: 30px !important;
}
/* 添加用户附加信息样式 */
.user-extra-info {
font-size: 12px;
color: rgba(0, 0, 0, 0.65);
line-height: 1.8;
overflow: auto;
}
.user-extra-info div {
margin-bottom: 3px;
}
</style>
</body>
</html>