Ver Fonte

客户管理

qzyReal há 3 anos atrás
pai
commit
315ef1261a

+ 114 - 69
sp-admin/sa-view/tb-business/tb-business-add.html

@@ -27,28 +27,45 @@
                     <div class="c-title" v-if="id == 0">数据添加</div>
 					<div class="c-title" v-else>数据修改</div>
 					<el-form v-if="m">
-						<sa-item type="num" name="主键" v-model="m.id" br></sa-item>
-						<sa-item type="text" name="客户id" v-model="m.customerId" br></sa-item>
-						<sa-item type="text" name="客户名称" v-model="m.customerName" br></sa-item>
-						<sa-item type="text" name="编号" v-model="m.no" br></sa-item>
-						<sa-item type="text" name="车牌号" v-model="m.cardNo" br></sa-item>
-						<sa-item type="text" name="车规格" v-model="m.cardSize" br></sa-item>
-						<sa-item type="text" name="载重" v-model="m.netWeight" br></sa-item>
-						<sa-item type="text" name="商品" v-model="m.goodsName" br></sa-item>
-						<sa-item type="text" name="商品编号" v-model="m.goodsCode" br></sa-item>
-						<sa-item type="text" name="司机名称" v-model="m.driverName" br></sa-item>
-						<sa-item type="text" name="司机id" v-model="m.driverId" br></sa-item>
-						<sa-item type="text" name="司机联系号码" v-model="m.driverPhone" br></sa-item>
-						<sa-item type="text" name="司机身份证" v-model="m.driverIdCard" br></sa-item>
-						<sa-item type="img" name="支付凭证" v-model="m.payTicket" br></sa-item>
-						<sa-item type="text" name="预计进边境日期" v-model="m.expectInDay" br></sa-item>
-						<sa-item type="text" name="实际进边境日期" v-model="m.realInDay" br></sa-item>
-						<sa-item type="text" name="实际进境时间" v-model="m.realInTime" br></sa-item>
-						<sa-item type="text" name="支付时间" v-model="m.payTime" br></sa-item>
-						<sa-item type="enum" name="支付方式" v-model="m.payType" :jv="{1: '线下支付', 3: '第三方支付'}" jtype="3" br></sa-item>
-						<sa-item type="text" name="离境时间" v-model="m.outDayTime" br></sa-item>
-						<sa-item type="text" name="停车费用" v-model="m.partMoney" br></sa-item>
-						<sa-item type="text" name="停车时常" v-model="m.partTime" br></sa-item>
+						<el-row>
+							<el-col span=12>	
+							<div class="c-item">
+								<label class="c-label">客户名称:</label> 
+								<el-autocomplete
+								  v-model="m.customerName"
+								  @select="handleSelectCustomer"
+								  value-key='name'
+								  :fetch-suggestions="queryCustomerAsync">
+								  </el-autocomplete>
+							</div>
+							<div class="c-item">
+								<label class="c-label">车牌号:</label> 
+								<el-autocomplete
+								  v-model="m.cardNo"
+								  @select="handleSelectCar"
+								  value-key='cardNo'
+								  :fetch-suggestions="queryCarAsync">
+								  </el-autocomplete>
+							</div>
+								<sa-item type="text" name="车规格" v-model="m.cardSize" br></sa-item>
+								<sa-item type="num" name="载重(kg)" v-model="m.netWeight" br></sa-item>
+								<sa-item type="text" name="运输货品" v-model="m.goodsName" br></sa-item>
+							</el-col>
+							<el-col span=12>
+								<div class="c-item">
+									<label class="c-label">司机身份证:</label> 
+									<el-autocomplete
+									  v-model="m.driverIdCard"
+									  @select="handleSelectDriver"
+									  value-key='idCard'
+									  :fetch-suggestions="queryDriverAsync">
+									  </el-autocomplete>
+								</div>
+								<sa-item type="text" name="司机名称" v-model="m.driverName" br></sa-item>
+								<sa-item type="text" name="司机联系号码" v-model="m.driverPhone" br></sa-item>
+								<sa-item type="date" name="预计入境日期" v-model="m.expectInDay" br></sa-item>
+							</el-col>
+						</el-row>
 						<sa-item name="" class="s-ok" br>
 							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
 						</sa-item>
@@ -70,66 +87,93 @@
 				el: '.vue-box',
 				data: {
 					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
-					m: null,		// 实体对象 
+					m: {
+						id: '',		// 主键 
+						customerId: '',		// 客户id 
+						customerName: '',		// 客户名称 
+						no: '',		// 编号 
+						cardNo: '',		// 车牌号 
+						cardSize: '',		// 车规格 
+						netWeight: '',		// 载重(kg) 
+						goodsName: '',		// 商品 
+						goodsCode: '',		// 商品编号 
+						driverName: '',		// 司机名称 
+						driverId: '',		// 司机id 
+						driverPhone: '',		// 司机联系号码 
+						driverIdCard: '',		// 司机身份证 
+						payTicket: '',		// 支付凭证 
+						expectInDay: '',		// 预计进边境日期 
+						realInDay: '',		// 实际进边境日期 
+						realInTime: '',		// 实际进境时间 
+						payStatus: '',		// 支付状态(1=未支付,2=已支付) 
+						payTime: '',		// 支付时间 
+						payType: '',		// 支付方式(1=线下支付,2现金支付,3=第三方支付) 
+						outDayTime: '',		// 离境时间 
+						partMoney: '',		// 停车费用 
+						partTime: '',		// 停车时常(分) 
+						},		// 实体对象 
+					customerList:[],
+					cardList:[],
+					driverList:[]
 				},
 				methods: {
-					// 创建一个 默认Model 
-					createModel: function() {
-						return {
-							id: '',		// 主键 
-							customerId: '',		// 客户id 
-							customerName: '',		// 客户名称 
-							no: '',		// 编号 
-							cardNo: '',		// 车牌号 
-							cardSize: '',		// 车规格 
-							netWeight: '',		// 载重(kg) 
-							goodsName: '',		// 商品 
-							goodsCode: '',		// 商品编号 
-							driverName: '',		// 司机名称 
-							driverId: '',		// 司机id 
-							driverPhone: '',		// 司机联系号码 
-							driverIdCard: '',		// 司机身份证 
-							payTicket: '',		// 支付凭证 
-							expectInDay: '',		// 预计进边境日期 
-							realInDay: '',		// 实际进边境日期 
-							realInTime: '',		// 实际进境时间 
-							payStatus: '',		// 支付状态(1=未支付,2=已支付) 
-							payTime: '',		// 支付时间 
-							payType: '',		// 支付方式(1=线下支付,2现金支付,3=第三方支付) 
-							outDayTime: '',		// 离境时间 
-							partMoney: '',		// 停车费用 
-							partTime: '',		// 停车时常(分) 
-						}
+					getCardList(){
+						sa.ajax('/TbCar/getList', {pageNo:1,pageSize:100}, function(resp) {
+							this.cardList=resp.data;
+						}.bind(this));
+					},
+					queryCarAsync(queryStr,cb){
+						let list=this.cardList;
+						let filterList=	list.filter(obj=>obj.cardNo.indexOf(queryStr)!==-1);
+						cb(filterList)
+					},
+					handleSelectCar(item){
+						this.m.cardSize=item.cardSize;
+						this.m.goodsName=item.lastGoodsName
+					},
+					getDriverList(){
+						sa.ajax('/TbDriver/getList', {pageNo:1,pageSize:100}, function(resp) {
+							this.driverList=resp.data;
+						}.bind(this));
+					},
+					queryDriverAsync(queryStr,cb){
+						let list=this.driverList;
+						let filterList=	list.filter(obj=>obj.idCard.indexOf(queryStr)!==-1);
+						cb(filterList)
+					},
+					handleSelectDriver(item){
+						this.m.driverId=item.id;
+						this.m.driverName=item.name;
+						this.m.driverIdCard=item.idCard;
+						this.m.driverPhone=item.phone
+					},
+					getCustomerList(){
+						sa.ajax('/TbCostomer/getList', {pageNo:1,pageSize:100}, function(resp) {
+							this.customerList=resp.data;
+						}.bind(this));
+					},
+					queryCustomerAsync(queryString, cb){
+						let list=this.customerList;
+						let filterList=	list.filter(obj=>obj.name.indexOf(queryString)!==-1);
+						cb(filterList)
+					},
+					handleSelectCustomer(item){
+						this.m.customerName=item.name;
+						this.m.customerId=item.id;
 					},
 					// 提交数据 
 					ok: function(){
 						// 表单校验 
 						let m = this.m;
-						sa.checkNull(m.id, '请输入 [主键]');
-						sa.checkNull(m.customerId, '请输入 [客户id]');
 						sa.checkNull(m.customerName, '请输入 [客户名称]');
-						sa.checkNull(m.no, '请输入 [编号]');
 						sa.checkNull(m.cardNo, '请输入 [车牌号]');
 						sa.checkNull(m.cardSize, '请输入 [车规格]');
 						sa.checkNull(m.netWeight, '请输入 [载重]');
 						sa.checkNull(m.goodsName, '请输入 [商品]');
-						sa.checkNull(m.goodsCode, '请输入 [商品编号]');
 						sa.checkNull(m.driverName, '请输入 [司机名称]');
-						sa.checkNull(m.driverId, '请输入 [司机id]');
 						sa.checkNull(m.driverPhone, '请输入 [司机联系号码]');
 						sa.checkNull(m.driverIdCard, '请输入 [司机身份证]');
-						sa.checkNull(m.payTicket, '请输入 [支付凭证]');
 						sa.checkNull(m.expectInDay, '请输入 [预计进边境日期]');
-						sa.checkNull(m.realInDay, '请输入 [实际进边境日期]');
-						sa.checkNull(m.realInTime, '请输入 [实际进境时间]');
-						// sa.checkNull(m.payStatus, '请输入 [支付状态]');
-						sa.checkNull(m.payTime, '请输入 [支付时间]');
-						sa.checkNull(m.payType, '请输入 [支付方式]');
-						sa.checkNull(m.outDayTime, '请输入 [离境时间]');
-						sa.checkNull(m.partMoney, '请输入 [停车费用]');
-						sa.checkNull(m.partTime, '请输入 [停车时常]');
-				
-						// 开始增加或修改
 						if(this.id <= 0) {	// 添加
 							sa.ajax('/TbBusiness/add', m, function(res){
 								sa.alert('增加成功', this.clean); 
@@ -152,9 +196,7 @@
 				},
 				mounted: function(){
 					// 初始化数据 
-					if(this.id <= 0) {	
-						this.m = this.createModel();
-					} else {	
+					if(this.id > 0) {		
 						sa.ajax('/TbBusiness/getById?id=' + this.id, function(res) {
 							this.m = res.data;
 							if(res.data == null) {
@@ -162,6 +204,9 @@
 							}
 						}.bind(this))
 					}
+					this.getCustomerList();
+					this.getCardList();
+					this.getDriverList();
 				}
 			})
 			

+ 3 - 15
sp-admin/sa-view/tb-car/tb-car-add.html

@@ -26,13 +26,8 @@
                     <div class="c-title" v-if="id == 0">数据添加</div>
 					<div class="c-title" v-else>数据修改</div>
 					<el-form v-if="m">
-						<sa-item type="text" name="名称" v-model="m.cardNo" br></sa-item>
+						<sa-item type="text" name="车牌号" v-model="m.cardNo" br></sa-item>
 						<sa-item type="text" name="规格" v-model="m.cardSize" br></sa-item>
-						<sa-item type="text" name="最后一次运输商品" v-model="m.lastGoodsName" br></sa-item>
-						<sa-item type="text" name="最后一次运输商品编号" v-model="m.lastGoodsCode" br></sa-item>
-						<sa-item type="text" name="最后一次载重" v-model="m.lastNetWeight" br></sa-item>
-						<sa-item type="text" name="最后一次入境时间" v-model="m.lastInTime" br></sa-item>
-						<sa-item type="text" name="最后一次出境时间" v-model="m.lastOutTime" br></sa-item>
 						<sa-item type="enum" name="当前状态" v-model="m.status" :jv="{1: '境外', 2: '境内'}" jtype="3" br></sa-item>
 						<sa-item name="" class="s-ok" br>
 							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
@@ -69,7 +64,7 @@
 							lastNetWeight: '',		// 最后一次载重 
 							lastInTime: '',		// 最后一次入境时间 
 							lastOutTime: '',		// 最后一次出境时间 
-							status: '',		// 当前状态(1=境外,2=境内) 
+							status: '1',		// 当前状态(1=境外,2=境内) 
 						}
 					},
 					// 提交数据 
@@ -77,15 +72,8 @@
 						// 表单校验 
 						let m = this.m;
 						// sa.checkNull(m.id, '请输入 [主键]');
-						sa.checkNull(m.cardNo, '请输入 [名称]');
+						sa.checkNull(m.cardNo, '请输入 [车牌号]');
 						sa.checkNull(m.cardSize, '请输入 [规格]');
-						sa.checkNull(m.lastGoodsName, '请输入 [最后一次运输商品]');
-						sa.checkNull(m.lastGoodsCode, '请输入 [最后一次运输商品编号]');
-						sa.checkNull(m.lastNetWeight, '请输入 [最后一次载重]');
-						sa.checkNull(m.lastInTime, '请输入 [最后一次入境时间]');
-						sa.checkNull(m.lastOutTime, '请输入 [最后一次出境时间]');
-						sa.checkNull(m.status, '请输入 [当前状态]');
-				
 						// 开始增加或修改
 						if(this.id <= 0) {	// 添加
 							sa.ajax('/TbCar/add', m, function(res){

+ 9 - 35
sp-admin/sa-view/tb-car/tb-car-list.html

@@ -20,50 +20,24 @@
 				<!-- ------------- 检索参数 ------------- -->
 				<div class="c-title">检索参数</div>
 				<el-form ref="form" :model='p' @submit.native.prevent>
-					<sa-item type="num" name="主键" v-model="p.id"></sa-item>
-					<sa-item type="text" name="名称" v-model="p.cardNo"></sa-item>
+					<sa-item type="text" name="车牌号" v-model="p.cardNo"></sa-item>
 					<sa-item type="text" name="规格" v-model="p.cardSize"></sa-item>
-					<sa-item type="text" name="最后一次运输商品" v-model="p.lastGoodsName"></sa-item>
-					<sa-item type="text" name="最后一次运输商品编号" v-model="p.lastGoodsCode"></sa-item>
-					<sa-item type="text" name="最后一次载重" v-model="p.lastNetWeight"></sa-item>
-					<sa-item type="text" name="最后一次入境时间" v-model="p.lastInTime"></sa-item>
-					<sa-item type="text" name="最后一次出境时间" v-model="p.lastOutTime"></sa-item>
-					<sa-item type="enum" name="当前状态" v-model="p.status" 
-						:jv="{1: '境外', 2: '境内'}" jtype="2" def="不限"></sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
-					<br />
-					<sa-item name="综合排序">
-						<el-radio-group v-model="p.sortType" class="s-radio-text">
-							<el-radio :label="0">默认</el-radio>
-							<el-radio :label="1">主键</el-radio>
-							<el-radio :label="2">名称</el-radio>
-							<el-radio :label="3">规格</el-radio>
-							<el-radio :label="4">最后一次运输商品</el-radio>
-							<el-radio :label="5">最后一次运输商品编号</el-radio>
-							<el-radio :label="6">最后一次载重</el-radio>
-							<el-radio :label="7">最后一次入境时间</el-radio>
-							<el-radio :label="8">最后一次出境时间</el-radio>
-							<el-radio :label="9">当前状态</el-radio>
-						</el-radio-group>
-					</sa-item>
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,export,reset"></sa-item>
+				<sa-item type="fast-btn" show="add,delete,reset"></sa-item>
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList" >
 					<sa-td type="selection"></sa-td>
-					<sa-td name="主键" prop="id" type="num"></sa-td>
-					<sa-td name="名称" prop="cardNo" ></sa-td>
+					<sa-td name="车牌号" prop="cardNo" ></sa-td>
 					<sa-td name="规格" prop="cardSize" ></sa-td>
-					<sa-td name="最后一次运输商品" prop="lastGoodsName" ></sa-td>
-					<sa-td name="最后一次运输商品编号" prop="lastGoodsCode" ></sa-td>
-					<sa-td name="最后一次载重" prop="lastNetWeight" ></sa-td>
-					<sa-td name="最后一次入境时间" prop="lastInTime" ></sa-td>
-					<sa-td name="最后一次出境时间" prop="lastOutTime" ></sa-td>
+					<sa-td name="上次运输商品" prop="lastGoodsName" ></sa-td>
+					<sa-td name="上次载重" prop="lastNetWeight" ></sa-td>
+					<sa-td name="上次入境时间" prop="lastInTime" ></sa-td>
+					<sa-td name="上次出境时间" prop="lastOutTime" ></sa-td>
 					<sa-td name="当前状态" prop="status" type="enum" :jv="{1: '境外', 2: '境内'}"></sa-td>
 					<el-table-column label="操作" fixed="right"  width="240px">
 						<template slot-scope="s">
-							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
 							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
 							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
 						</template>
@@ -121,11 +95,11 @@
 					},
 					// 修改
 					update: function(data) {
-						sa.showIframe('修改数据', 'tb-car-add.html?id=' + data.id, '1000px', '90%');
+						sa.showIframe('修改数据', 'tb-car-add.html?id=' + data.id, '500px', '60%');
 					},
 					// 新增
 					add: function(data) {
-						sa.showIframe('新增数据', 'tb-car-add.html?id=-1', '1000px', '90%');
+						sa.showIframe('新增数据', 'tb-car-add.html?id=-1', '500px', '60%');
 					},
 					// 删除
 					del: function(data) {

+ 105 - 0
sp-admin/sa-view/tb-costomer/customer-admin-add.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html>
+	<head>
+	    <title>添加管理员</title>
+	    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<!-- 参数栏 -->
+			<div class="c-panel">
+				<el-form>
+					<!-- 防止密码框被填充 -->
+					<div style="height: 0px; overflow: hidden;">
+						<el-input></el-input>
+						<el-input type="password"></el-input>
+					</div>
+					<!-- 表单 -->
+					<sa-item type="text" name="用户名" v-model="m.name" br></sa-item>
+					<sa-item type="password" name="密码" v-model="m.password" br></sa-item>
+					<sa-item type="password" name="再输一次" v-model="m.againPassword" br></sa-item>
+					<sa-item name="角色" br>
+						<el-select v-model="m.roleIds" multiple>
+							<el-option label="请选择" :value="0" disabled></el-option>
+							<el-option v-for="role in roleList" :key="role.id" :label="role.name" :value="role.id"></el-option>
+						</el-select>
+					</sa-item>
+					<sa-item name="" br>
+						<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+					</sa-item>
+				</el-form>
+			</div>
+		</div>
+	
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					sa: sa, 	// 超级对象
+					m: {
+						id: 0,
+						customerId:sa.p('customerId',''),
+						name: '',
+						avatar: '',
+						password: '',
+						againPassword:'',
+						roleIds: []
+					},
+					roleList: []
+				},
+				methods: {
+					// 修改
+					ok: function(){
+						console.log(this.m)
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.name, '请输入用户名');
+						sa.checkNull(m.password, '请输入密码');
+						if(m.password!==m.againPassword){
+							sa.error('两次输入密码不一致');
+							return ;
+						}
+						if(m.roleIds.length==0){
+							sa.error('请选择角色');
+							return ;
+						}
+						m.roleId=m.roleIds.join(',')
+						// 添加
+						sa.ajax('/admin/addCustomerAdmin', m, function(res){
+							sa.alert('增加成功', this.clean); 
+						
+						}.bind(this));
+						
+					},
+					clean(){
+						parent.app.f5();		// 刷新父页面列表
+						sa.closeCurrIframe();	// 关闭本页 
+					}
+				},
+				mounted: function(){
+					console.log(this.m);
+					// 加载角色 
+					sa.ajax('/role/getCustomerRoleList',{customerId:this.m.customerId}, function(res){
+						this.roleList = res.data;	// 数据  
+					}.bind(this), {msg: null});
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 284 - 0
sp-admin/sa-view/tb-costomer/customer-admin-list.html

@@ -0,0 +1,284 @@
+<!DOCTYPE html>
+<html>
+	<head>
+	    <title>管理员列表</title>
+	    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		<style type="text/css">
+			.el-radio{margin-right: 10px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<h4 class="c-title">检索参数</h4>
+				<el-form>
+					<sa-item type="text" name="登录名" v-model="p.name"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<br>
+					<sa-item name="综合排序" class="s-radio-text">
+						<el-radio-group v-model="p.sort_type">
+							<el-radio :label="0">最近添加</el-radio>
+							<el-radio :label="2">最近登录</el-radio>
+							<el-radio :label="3">登录次数</el-radio>
+						</el-radio-group>
+					</sa-item>
+				</el-form>
+				<!-- ------------- 快捷按钮 ------------- -->
+				<sa-item type="fast-btn" show="add,delete,reset"></sa-item>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList">
+					<sa-td type="selection"></sa-td>
+					<sa-td type="text" name="登录名" prop="name" min-width="120px"></sa-td>
+					<sa-td type="datetime" name="创建时间" prop="createTime" width="150px"></sa-td>
+					<sa-td type="datetime" name="最后登录" prop="loginTime" width="150px"></sa-td>
+					<sa-td type="text" name="登录次数" prop="loginCount" not="0" width="100px"></sa-td>
+					<sa-td type="switch" name="账号状态" prop="status" :jv="{1: '正常', 2: '禁用[#ff4949]'}" @change="s => updateStatus(s.row)" width="120px"></sa-td>
+					<el-table-column label="操作" fixed="right" width="450px">
+						<template slot-scope="s">
+							<span @click="getInfo(s.row)">
+								<el-button type="success" class="c-btn" icon="el-icon-view">查看</el-button>
+							</span>
+							<span @click="updateName(s.row)">
+								<el-button type="primary" class="c-btn" icon="el-icon-edit">改名称</el-button>
+							</span>
+							<span @click="updateAvatar(s.row)">
+								<el-button type="primary" class="c-btn" icon="el-icon-edit">改头像</el-button>
+							</span>
+							<span @click="updatePassword(s.row)">
+								<el-button type="primary" class="c-btn" icon="el-icon-edit">改密码</el-button>
+							</span>
+							<span @click="roleFn(s.row)">
+								<el-button type="primary" class="c-btn" icon="el-icon-edit">角色</el-button>
+							</span>
+							<span @click="del(s.row)">
+								<el-button type="danger" class="c-btn" icon="el-icon-delete">删除</el-button>
+							</span>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- 分页 -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
+			</div>
+			<el-dialog
+			  :title="roleDialog.title"
+			  :visible.sync="roleDialog.visible"
+			  width="60%">
+			  <div >
+			  	 <el-checkbox   @change="handleCheckAllChange">全选</el-checkbox>
+			  	  <div style="margin: 15px 0;"></div>
+			  	  <el-checkbox-group v-model="roleDialog.form.roleId">
+			  	    <el-checkbox v-for="role in roleList" :label="role.id+''" :key="role.id">{{role.name}}</el-checkbox>
+			  	  </el-checkbox-group>
+			  </div>
+			  <span slot="footer" class="dialog-footer">
+			    <el-button @click="roleDialog.visible = false">取 消</el-button>
+			    <el-button type="primary" @click="confirmSetRole">确 定</el-button>
+			  </span>
+			</el-dialog>
+		</div>
+        <script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue')
+				},
+				el: '.vue-box',
+				data: {
+					roleDialog:{
+						visible:false,
+						title:'',
+						form:{
+							id:'',
+							roleId:[],
+						}
+					},
+					sa: sa, 	// 超级对象
+					p: {		// 查询参数
+						name: '',
+						customerId:sa.p('customerId',''),
+						sort_type: 0,
+						pageNo: 1,
+						pageSize: 10,
+					},
+					dataCount: 0,
+					dataList: [],	// 数据集合
+					roleList: [],	// 角色集合 
+				},
+				methods: {
+					roleFn(data){
+						Object.assign(this.roleDialog,{
+							visible:true,
+							title:'设置['+data.name+']角色属性',
+							form:{
+								id:data.id,
+								roleId:data.roleId.split(',')
+							}
+						})
+					},
+					handleCheckAllChange(){
+						let roleId=this.roleDialog.form.roleId;
+						let allIds=this.roleList.map(obj=>obj.id+'');
+						this.roleDialog.form.roleId=roleId.length!=allIds.length?allIds:[];
+					},
+					confirmSetRole(){
+						let roleId=this.roleDialog.form.roleId;
+						if(roleId.length == 0) {
+							return sa.msg('请选择一个角色')
+						}
+						let o={
+							id:this.roleDialog.form.id,
+							roleId:this.roleDialog.form.roleId.join(',')
+						}
+						sa.ajax('/admin/setRole',o,function(resp){
+							this.f5();
+							this.roleDialog.visible=false;
+						}.bind(this))
+					},
+					// 刷新
+					f5: function(isPage){
+						sa.ajax('/admin/getCustomerAdminList', this.p, function(res){
+							this.dataList = res.data;	// 数据
+							this.dataCount = res.dataCount;
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 新增
+					add: function() {
+						sa.showIframe('新增用户', 'customer-admin-add.html?customerId=' + this.p.customerId, '450px', '60%');
+					},
+					// 查看详情
+					getInfo: function(data) {
+						//sa.showIframe('账号详情', 'admin-info.html?id=' + data.id, '700px', '80%');
+						sa.$page.openAdminInfo(data.id, data.name);
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.getInfo(selection[0]);
+					},
+					// 修改名称 
+					updateName: function(data) {
+						layer.prompt({title: '修改账号名称'}, function(pass, index){
+							layer.close(index);
+							sa.ajax('/admin/update', {id: data.id, name: pass}, function(res){
+								data.name = pass;
+								layer.msg('修改成功');
+							})
+						});
+					},
+					// 修改头像 
+					updateAvatar: function(data) {
+						sa.uploadImage(function(src) {
+							var p = {id: data.id, avatar: src};
+							sa.ajax('/admin/updateAvatar', p, function(res) {
+								sa.msg('上传成功');
+								data.avatar = src;  
+							}.bind(this));
+						})
+					},
+					// 修改密码
+					updatePassword: function(data) {
+						layer.prompt({title: '修改密码'}, function(pass, index){
+							layer.close(index);
+							if(pass.length < 4) {
+								return layer.msg('新密码长度请不要低于4位');
+							}
+							sa.ajax('/admin/updatePassword', {id: data.id, password: pass}, function(res){
+								layer.msg('修改成功');
+							})
+						});
+					},
+					// 修改角色 
+					updateRoleId: function(data, roleId, roleName) {
+						if(data.id == sa.$sys.getCurrUser().id) {
+							return sa.alert('不能自己修改自己的角色');  
+						}
+						if(data.roleId == roleId) {
+							return sa.alert('该用户已经是' + roleName + '了');	
+						}
+						var str = '将此账号修改为 [' + roleName + '], 请确认?';
+						layer.confirm(str, {title: '请确认'}, function() {
+							sa.ajax('/admin/updateRole', {id: data.id, roleId: roleId}, function(res) {
+								sa.msg('修改成功');
+								data.roleId = roleId;
+								data.roleName = roleName;
+							}.bind(this));
+						}.bind(this));
+					},
+					// 修改用户的状态
+					updateStatus: function(data) {
+						if(data.id == sa.$sys.getCurrUser().id) {
+							data.status = 3 - data.status;  
+							return sa.alert('不能自己封禁自己');  
+						}
+						var is_ok = false;	// 记录是否成功 
+						var ajax = sa.ajax('/admin/updateStatus', {adminId: data.id, status: data.status}, function(res) {
+							sa.msg('修改成功');
+							is_ok = true;
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(is_ok == false) {
+								data.status = 3 - data.status; 
+							}
+						})
+					},
+					// 删除 
+					del: function (data) {
+						sa.confirm('是否删除,此操作不可撤销', function(){
+							sa.ajax('/admin/delete', {id: data.id},function(res){
+								sa.arrayDelete(app.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							})
+						});
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if(selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/admin/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					getRoleList(){
+						// 加载角色
+						sa.ajax('/role/getCustomerRoleList',{customerId:this.p.customerId}, function(res){
+							this.roleList = res.data;	// 数据  
+						}.bind(this), {msg: null});
+					}
+				},
+				created: function(){
+					this.f5();
+					sa.onInputEnter();	// 监听回车执行查询 
+					this.getRoleList();
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 3 - 9
sp-admin/sa-view/tb-goods/tb-goods-add.html

@@ -26,11 +26,9 @@
                     <div class="c-title" v-if="id == 0">数据添加</div>
 					<div class="c-title" v-else>数据修改</div>
 					<el-form v-if="m">
-						<sa-item type="text" name="主键" v-model="m.id" br></sa-item>
-						<sa-item type="text" name="编号" v-model="m.code" br></sa-item>
 						<sa-item type="text" name="名称" v-model="m.name" br></sa-item>
+						<sa-item type="text" name="编号" v-model="m.code" br></sa-item>
 						<sa-item type="enum" name="状态" v-model="m.status" :jv="{1: '禁用', 2: '启用'}" jtype="3" br></sa-item>
-						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
 						<sa-item name="" class="s-ok" br>
 							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
 						</sa-item>
@@ -61,7 +59,7 @@
 							id: '',		// 主键 
 							code: '',		// 编号 
 							name: '',		// 名称 
-							status: '',		// 状态(1=禁用,2=启用) 
+							status: '2',		// 状态(1=禁用,2=启用) 
 							createTime: '',		// 创建时间 
 						}
 					},
@@ -69,12 +67,8 @@
 					ok: function(){
 						// 表单校验 
 						let m = this.m;
-						sa.checkNull(m.id, '请输入 [主键]');
-						sa.checkNull(m.code, '请输入 [编号]');
 						sa.checkNull(m.name, '请输入 [名称]');
-						sa.checkNull(m.status, '请输入 [状态]');
-						sa.checkNull(m.createTime, '请输入 [创建时间]');
-				
+						sa.checkNull(m.code, '请输入 [编号]');
 						// 开始增加或修改
 						if(this.id <= 0) {	// 添加
 							sa.ajax('/TbGoods/add', m, function(res){

+ 2 - 18
sp-admin/sa-view/tb-goods/tb-goods-list.html

@@ -20,38 +20,22 @@
 				<!-- ------------- 检索参数 ------------- -->
 				<div class="c-title">检索参数</div>
 				<el-form ref="form" :model='p' @submit.native.prevent>
-					<sa-item type="text" name="主键" v-model="p.id"></sa-item>
 					<sa-item type="text" name="编号" v-model="p.code"></sa-item>
 					<sa-item type="text" name="名称" v-model="p.name"></sa-item>
-					<sa-item type="enum" name="状态" v-model="p.status" 
-						:jv="{1: '禁用', 2: '启用'}" jtype="2" def="不限"></sa-item>
-					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 					<br />
-					<sa-item name="综合排序">
-						<el-radio-group v-model="p.sortType" class="s-radio-text">
-							<el-radio :label="0">默认</el-radio>
-							<el-radio :label="1">主键</el-radio>
-							<el-radio :label="2">编号</el-radio>
-							<el-radio :label="3">名称</el-radio>
-							<el-radio :label="4">状态</el-radio>
-							<el-radio :label="5">创建时间</el-radio>
-						</el-radio-group>
-					</sa-item>
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,export,reset"></sa-item>
+				<sa-item type="fast-btn" show="add,delete,reset"></sa-item>
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList" >
 					<sa-td type="selection"></sa-td>
-					<sa-td name="主键" prop="id" ></sa-td>
 					<sa-td name="编号" prop="code" ></sa-td>
 					<sa-td name="名称" prop="name" ></sa-td>
-					<sa-td name="状态" prop="status" type="switch" :jv="{1: '禁用', 2: '启用'}" @change="s => updateStatus(s.row)"></sa-td>
+					<sa-td name="状态" prop="status" type="switch" :jv="{1: '否[#ff0000]', 2: '是[#005500]'}" @change="s => updateStatus(s.row)"></sa-td>
 					<sa-td name="创建时间" prop="createTime" ></sa-td>
 					<el-table-column label="操作" fixed="right"  width="240px">
 						<template slot-scope="s">
-							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
 							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
 							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
 						</template>