22 11 2021
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>会员列表</title>
	<meta name="renderer" content="webkit">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link href="/statics/layuiAdmin/layui/css/layui.css" rel="stylesheet">
	<link href="/statics/layuiAdmin/adminui/dist/css/admin.css" rel="stylesheet">
	<link href="/statics/layuiAdmin/style/style.css" rel="stylesheet">
</head>
<body>
	<div class="layui-fluid">
		<div class="layui-card">
			<div class="layui-card-body">
				<div style="padding-bottom: 10px;">
					<button class="layui-btn layui-btn-normal btn-top" data-type="add">添加会员</button>
					<button class="layui-btn layui-btn-info btn-top" data-type="batchDel">批量删除</button>
					<button class="layui-btn layui-btn-info btn-top" data-type="export">导出会员</button>
					<div class="layui-form search_ctr">
						<div class="layui-form-item">
							<div class="layui-input-inline w150">
								<select name="k2">
									<option value="">会员标签</option>
																	</select>
							</div>
							<div class="layui-input-inline w150">
								<select name="k3">
									<option value="">会员等级</option>
																		<option value="1">钻石会员</option>
																		<option value="2">黄金会员</option>
																		<option value="3">白银会员</option>
																	</select>
							</div>
							<div class="layui-inline">
								<div class="layui-input-inline">
									<input type="text" name="keys" placeholder="输入用户名/手机/昵称查询" class="layui-input">
								</div>
								<button class="layui-btn layui-btn-normal" lay-submit lay-filter="LAY-search">查询</button>
							</div>
						</div>
					</div>
				</div>

				<table id="LAY-table" lay-filter="LAY-table"></table>
				<script type="text/html" id="work">
					{{#  if(d.is_work == 1){ }}
					<span class="layui-badge-dot layui-bg-blue"></span>正常
					{{#  } else { }}
					<span class="layui-badge-dot layui-bg-gray"></span>锁定
					{{#  } }}
				</script>
				<script type="text/html" id="fenxiao">
					{{#  if(d.is_fx == 1){ }}
					是
					{{#  } else { }}
					否
					{{#  } }}
				</script>
				<script type="text/html" id="tableBar">
					<a class="link-text" lay-event="edit">编辑</a>
					<div class="link-line"></div>
					<a class="link-text" lay-event="del">删除</a>
				</script>
			</div>
		</div>
	</div>
</body>
</html>
<script src="/statics/sheetjs/xlsx.core.min.js"></script>
<script src="/statics/layuiAdmin/layui/layui.js"></script>
<script>
	layui.config({
		base: '/statics/layuiAdmin/' // 静态资源所在路径
	}).use(['index', 'layer', 'table', 'form'], function(){
		let $ = layui.$;
		let layer = layui.layer;
		let table = layui.table;
		let form = layui.form;

		//初始化列表
		table.render({
			elem: '#LAY-table'
			,url: "/admin/User/getList.html"
			,cols: [[
				{type: 'checkbox', fixed: 'left'}
				,{field: 'id', width: 80, title: 'ID', sort: true}
				,{field: 'uid', width: 150, title: '用户名'}
				,{field: 'nickname', minWidth:120, title: '昵称'}
				,{field: 'balance', width: 110, title: '余额'}
				,{field: 'commission', width: 110, title: '佣金'}
				,{field: 'integral', width: 110, title: '积分'}
				,{field: 'growth', width: 110, title: '成长值'}
				,{field: 'level_id', width: 110, title: '等级'}
				,{field: 'is_fx', width: 90, title: '分销商', templet: '#fenxiao', align:'center'}
				,{field: 'is_work', width: 90, title: '状态', templet: '#work', align:'center', sort: true}
				,{field: 'add_date', width: 180, title: '时间'}
				,{title: '操作', width: 106, align:'center', fixed: 'right', toolbar: '#tableBar'}
			]]
			,page: true
			,limit: 20
			,height: 'full-100'
			,text: {none: '暂无相关数据'}
		});

		//监听搜索
		form.on('submit(LAY-search)', function(data){
			let field = data.field;
			//执行重载
			table.reload('LAY-table', {
				url: "/admin/User/getList.html"
				,where: field
				,page: {
					curr: 1 //重新从第 1 页开始
				}
			});
		});

		//表格内操作按钮
		table.on('tool(LAY-table)', function(obj){
			let data = obj.data;
			if(obj.event === 'del'){
				layer.confirm('真的删除行么', function(index){
					$.ajax({
						type:"post",
						url:"/admin/User/delete.html",
						data: {
							m_id:data.id
						},
						dataType:"json",
						beforeSend: function () {
							layer.load(1);
						},
						success:function(res){
							layer.closeAll();
							if(res.code == 0){
								if(res.msg == 'success') {
									obj.del();
									layer.msg('删除成功');
								} else {
									layer.msg(res.msg);
								}
							}
							else {
								layer.msg(res.msg);
							}
						}
					});

				});
			} else if(obj.event === 'edit'){
				layer.open({
					type: 2
					,title: '编辑会员'
					,content: "/admin/User/edit.html?id=" + data.id
					,maxmin: true
					,area: ['750px', '90%']
					,btn: ['确定', '取消']
					,yes: function(index, layero){
						let iframeWindow = window['layui-layer-iframe'+ index];
						let submitID = 'LAY-submit';
						let submit = layero.find('iframe').contents().find('#'+ submitID);

						//监听提交
						iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
							let field = data.field; //获取提交的字段
							let m_work = field.hasOwnProperty('m_work') ? field.m_work : 0;
							let m_fx = field.hasOwnProperty('m_fx') ? field.m_fx : 0;
							//标签
							let m_label = [];
							$.each(field, function(key, val) {
								if(key.indexOf("label") != -1){
									m_label.push(val);
								}
							});
							m_label = m_label.toString();

							//提交 Ajax 成功后,静态更新表格中的数据
							$.ajax({
								type:"post",
								url:"/admin/User/save.html",
								data: {
									m_level: field.m_level,
									m_label: m_label,
									m_nickname: field.m_nickname,
									m_tel: field.m_tel,
									m_email: field.m_email,
									m_work: m_work,
									m_fx: m_fx,
									m_uid: field.m_uid,
									m_pwd: field.m_pwd,
									m_id:field.m_id
								},
								dataType:"json",
								beforeSend: function () {
									layer.load(1);
								},
								success:function(res){
									layer.close(layer.index);
									if(res.code == 0){
										layer.closeAll();
										table.reload('LAY-table',{where: {time:new Date()}}); //数据刷新
									}
									else {
										layer.msg(res.msg);
									}
								}
							});

						});

						submit.trigger('click');
					}
				});
			}
		});

		//头部操作按钮
		$('.btn-top').on('click', function(){
			let type = $(this).data('type');
			active[type] ? active[type].call(this) : '';
		});

		let active = {
			batchDel: function(){
				let checkStatus = table.checkStatus('LAY-table');
				let checkData = checkStatus.data //得到选中的数据
				let ids = "0";
				if(checkData.length === 0){
					return layer.msg('请选择数据');
				}
				$.each(checkData,function(key,value){
					ids = ids + "," + checkData[key]['id'];
				});
				layer.confirm('确定删除吗?', function(index) {
					$.ajax({
						type:"post",
						url:"/admin/User/delete.html",
						data: {
							m_id:ids
						},
						dataType:"json",
						beforeSend: function () {
							layer.load(1);
						},
						success:function(res){
							layer.closeAll();
							if(res.code == 0){
								let msg = res.msg == 'success' ? '删除成功' : res.msg;
								layer.msg(msg, {
									time: 2000
								}, function(){
									table.reload('LAY-table',{where: {time:new Date()}}); //数据刷新
								});
							}
							else {
								layer.msg(res.msg);
							}
						}
					});
				});
			}
			,add: function(){
				layer.open({
					type: 2
					,title: '添加会员'
					,content: "/admin/User/create.html"
					,maxmin: true
					,area: ['500px', '350px']
					,btn: ['确定', '取消']
					,yes: function(index, layero){
						let iframeWindow = window['layui-layer-iframe'+ index];
						let submitID = 'LAY-submit';
						let submit = layero.find('iframe').contents().find('#'+ submitID);

						//监听提交
						iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
							let field = data.field; //获取提交的字段

							//提交 Ajax 成功后,静态更新表格中的数据
							$.ajax({
								type:"post",
								url:"/admin/User/save.html",
								data: {
									m_uid:field.m_uid,
									m_pwd:field.m_pwd,
									m_level:field.m_level
								},
								dataType:"json",
								beforeSend: function () {
									layer.load(1);
								},
								success:function(res){
									layer.close(layer.index);
									if(res.code == 0){
										layer.closeAll();
										table.reload('LAY-table',{where: {time:new Date()}}); //数据刷新
									}
									else {
										layer.msg(res.msg);
									}
								}
							});
						});
						submit.trigger('click');
					}
				});
			}
			,export: function(){
				let checkStatus = table.checkStatus('LAY-table')
				let checkData = checkStatus.data //得到选中的数据
				let str = "确定导出选中数据吗?";
				let ids = "0";
				$.each(checkData,function(key,value){
					ids = ids + "," + checkData[key]['id'];
				});
				if(checkData.length === 0){
					str = "未选择数据将导出当前所有,确定导出吗?";
				}
				layer.confirm(str, function(index) {
					layer.closeAll();
					// 要打印的数据格式 对象中的key将会作为表头渲染
					let count = 0; //数据总数
					let limit = 3000; //每次请求数量
					//获取总数
					$.ajax({
						type:"post",
						url:"/admin/User/exportData.html",
						data: {
							m_id:ids
						},
						dataType:"json",
						beforeSend: function () {
							layer.load(1);
						},
						success:function(res){
							layer.closeAll();
							if(res.code == 0) {
								count = res.count;
								if(count == 0) {
									layer.msg('暂无数据可导出');
									return;
								}
								let request_times = Math.ceil(count/limit); //计算分几次请求
								let funcs = []; //Promise.all要用到的参数, 存放每次请求的Promise对象
								let complete_count = 0; //成功请求次数
								let export_percentage = 0; //设置当前进度百分比为0
								for (let i = 1; i <= request_times; i++) {
									// 循环请求次数,构造请求的Promise对象并插入funcs数组
									let func = new Promise(function(resolve, reject){
										//定义Promise并处理请求逻辑
										let data = [];
										$.ajax({
											type:"post",
											url:"/admin/User/exportData.html?page=" + i,
											data: {
												m_id:ids,
												limit:limit
											},
											dataType:"json",
											success:function(res){
												layer.closeAll();
												if(res.code == 0) {
													data = res.data;
													complete_count++; //成功请求次数+1
													export_percentage = 100*complete_count/request_times; //设置当前进度百分比
													layer.msg('导出中,已完成' + Math.ceil(export_percentage) + '%');
													resolve(data);
												} else {
													layer.msg(res.msg);
													reject();
												}
											}
										});
									});
									funcs.push(func);
								}

								Promise.all(funcs).then(function(values) {
									//使用Promise.all调用funcs里面的函数,并合并数据,最后给js-xlsx生成Excel
									let print_data = [];
									//将数据合并
									for (let i = 0; i < values.length; i++) {
										for (let j = 0; j < values[i].length; j++) {
											print_data.push(values[i][j]);
										}
									}
									// 创建一个新sheet
									const new_sheet = XLSX.utils.json_to_sheet(print_data)
									// 新建book
									const new_book = XLSX.utils.book_new()
									// 将 sheet 添加到 book 中
									XLSX.utils.book_append_sheet(new_book, new_sheet, 'Sheet1')
									// 导出excel文件
									let time = new Date();
									let month = time.getMonth()+1;
									let timeStr = time.getFullYear() + '-' + month + '-'+time.getDate();
									XLSX.writeFile(new_book, '会员列表('+timeStr+').xlsx')
								});

							} else {
								layer.msg(res.msg);
							}
						}
					});
				});
			}
		};

	});
</script>


延伸阅读