Pārlūkot izejas kodu

添加新建表增删查网页,修改请求后端路径,修改网页引用JS库

loovi 1 gadu atpakaļ
vecāks
revīzija
267acd1dfe
57 mainītis faili ar 6074 papildinājumiem un 43 dzēšanām
  1. 1 1
      login.html
  2. 197 1
      sa-frame/menu-list-sp.js
  3. 3 3
      sa-frame/sa-code.js
  4. 2 2
      sa-view-sp/sp-admin/admin-add.html
  5. 2 2
      sa-view-sp/sp-admin/admin-info.html
  6. 9 9
      sa-view-sp/sp-admin/admin-list.html
  7. 1 1
      sa-view-sp/sp-admin/update-password.html
  8. 1 1
      sa-view-sp/sp-apilog/api-log-list-delete.html
  9. 4 4
      sa-view-sp/sp-apilog/api-log-list.html
  10. 2 2
      sa-view-sp/sp-cfg/app-cfg.html
  11. 2 2
      sa-view-sp/sp-cfg/server-cfg.html
  12. 7 7
      sa-view-sp/sp-console/redis-console.html
  13. 1 1
      sa-view-sp/sp-console/redis-key-add.html
  14. 2 2
      sa-view-sp/sp-console/sql-console.html
  15. 1 1
      sa-view-sp/sp-role/menu-list.html
  16. 2 2
      sa-view-sp/sp-role/menu-setup.html
  17. 1 1
      sa-view-sp/sp-role/role-add.html
  18. 1 1
      sa-view-sp/sp-role/role-list.html
  19. 188 0
      sa-view/tb-driver/tb-driver-add.html
  20. 89 0
      sa-view/tb-driver/tb-driver-info.html
  21. 200 0
      sa-view/tb-driver/tb-driver-list.html
  22. 191 0
      sa-view/tb-enterprise/tb-enterprise-add.html
  23. 91 0
      sa-view/tb-enterprise/tb-enterprise-info.html
  24. 232 0
      sa-view/tb-enterprise/tb-enterprise-list.html
  25. 135 0
      sa-view/tb-goods-type/tb-goods-type-add.html
  26. 73 0
      sa-view/tb-goods-type/tb-goods-type-info.html
  27. 177 0
      sa-view/tb-goods-type/tb-goods-type-list.html
  28. 112 0
      sa-view/tb-goods-units/tb-goods-units-add.html
  29. 64 0
      sa-view/tb-goods-units/tb-goods-units-info.html
  30. 136 0
      sa-view/tb-goods-units/tb-goods-units-list.html
  31. 140 0
      sa-view/tb-goods/tb-goods-add.html
  32. 74 0
      sa-view/tb-goods/tb-goods-info.html
  33. 181 0
      sa-view/tb-goods/tb-goods-list.html
  34. 154 0
      sa-view/tb-group/tb-group-add.html
  35. 78 0
      sa-view/tb-group/tb-group-info.html
  36. 195 0
      sa-view/tb-group/tb-group-list.html
  37. 172 0
      sa-view/tb-logistics/tb-logistics-add.html
  38. 84 0
      sa-view/tb-logistics/tb-logistics-info.html
  39. 332 0
      sa-view/tb-logistics/tb-logistics-list.html
  40. 172 0
      sa-view/tb-orders/tb-orders-add.html
  41. 84 0
      sa-view/tb-orders/tb-orders-info.html
  42. 230 0
      sa-view/tb-orders/tb-orders-list.html
  43. 206 0
      sa-view/tb-people/tb-people-add.html
  44. 98 0
      sa-view/tb-people/tb-people-info.html
  45. 250 0
      sa-view/tb-people/tb-people-list.html
  46. 170 0
      sa-view/tb-purchaser/tb-purchaser-add.html
  47. 86 0
      sa-view/tb-purchaser/tb-purchaser-info.html
  48. 211 0
      sa-view/tb-purchaser/tb-purchaser-list.html
  49. 160 0
      sa-view/tb-shop/tb-shop-add.html
  50. 79 0
      sa-view/tb-shop/tb-shop-info.html
  51. 196 0
      sa-view/tb-shop/tb-shop-list.html
  52. 140 0
      sa-view/tb-trade-area/tb-trade-area-add.html
  53. 72 0
      sa-view/tb-trade-area/tb-trade-area-info.html
  54. 157 0
      sa-view/tb-trade-area/tb-trade-area-list.html
  55. 164 0
      sa-view/tb-vehicle/tb-vehicle-add.html
  56. 80 0
      sa-view/tb-vehicle/tb-vehicle-info.html
  57. 182 0
      sa-view/tb-vehicle/tb-vehicle-list.html

+ 1 - 1
login.html

@@ -87,7 +87,7 @@
 					return layer.msg('请输入账号密码');
 				}
 				// 3、请求后台
-				sa.ajax('/AccAdmin/doLogin', p, function(res){
+				sa.ajax('/sp-admin/AccAdmin/doLogin', p, function(res){
 					// 写入token
 					if(res.data.tokenInfo) {
 						localStorage.tokenName = res.data.tokenInfo.tokenName; 

+ 197 - 1
sa-frame/menu-list-sp.js

@@ -105,4 +105,200 @@ window.menuList.unshift({
 			url: 'sa-view-sp/sp-cfg/server-cfg.html'
 		},
 	]
-}, );
+},{
+		id: 'tb-driver',
+		name: '司机',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '司机表数据的维护',
+		childList: [
+			{id: 'tb-driver-list', name: '司机-列表', url: 'sa-view/tb-driver/tb-driver-list.html',
+			childList:[
+			{id:'tb-driver-add',name:'司机添加',isShow:true},
+			{id:'tb-driver-edit',name:'司机更新',isShow:true},
+			{id:'tb-driver-del',name:'司机删除',isShow:true},
+			]
+			},
+		]
+},{
+		id: 'tb-vehicle',
+		name: '车辆',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '车辆表数据的维护',
+		childList: [
+			{id: 'tb-vehicle-list', name: '车辆-列表', url: 'sa-view/tb-vehicle/tb-vehicle-list.html',
+			childList:[
+			{id:'tb-vehicle-add',name:'车辆添加',isShow:true},
+			{id:'tb-vehicle-edit',name:'车辆更新',isShow:true},
+			{id:'tb-vehicle-del',name:'车辆删除',isShow:true},
+			]
+			},
+		]
+},{
+		id: 'tb-trade-area',
+		name: '贸易区域',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '贸易区域表数据的维护',
+		childList: [
+			{id: 'tb-trade-area-list', name: '贸易区域-列表', url: 'sa-view/tb-trade-area/tb-trade-area-list.html',
+			childList:[
+			{id:'tb-trade-area-add',name:'贸易区域添加',isShow:false},
+			{id:'tb-trade-area-edit',name:'贸易区域更新',isShow:false},
+			{id:'tb-trade-area-del',name:'贸易区域删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-enterprise',
+		name: '商家',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '商家表数据的维护',
+		childList: [
+			{id: 'tb-enterprise-list', name: '商家-列表', url: 'sa-view/tb-enterprise/tb-enterprise-list.html',
+			childList:[
+			{id:'tb-enterprise-add',name:'商家添加',isShow:false},
+			{id:'tb-enterprise-edit',name:'商家更新',isShow:false},
+			{id:'tb-enterprise-del',name:'商家删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-shop',
+		name: '铺位',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '铺位表数据的维护',
+		childList: [
+			{id: 'tb-shop-list', name: '铺位-列表', url: 'sa-view/tb-shop/tb-shop-list.html',
+			childList:[
+			{id:'tb-shop-add',name:'铺位添加',isShow:false},
+			{id:'tb-shop-edit',name:'铺位更新',isShow:false},
+			{id:'tb-shop-del',name:'铺位删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-purchaser',
+		name: '收购商',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '收购商表数据的维护',
+		childList: [
+			{id: 'tb-purchaser-list', name: '收购商-列表', url: 'sa-view/tb-purchaser/tb-purchaser-list.html',
+			childList:[
+			{id:'tb-purchaser-add',name:'收购商添加',isShow:false},
+			{id:'tb-purchaser-edit',name:'收购商更新',isShow:false},
+			{id:'tb-purchaser-del',name:'收购商删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-people',
+		name: '边民',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '边民表数据的维护',
+		childList: [
+			{id: 'tb-people-list', name: '边民-列表', url: 'sa-view/tb-people/tb-people-list.html',
+			childList:[
+			{id:'tb-people-add',name:'边民添加',isShow:false},
+			{id:'tb-people-edit',name:'边民更新',isShow:false},
+			{id:'tb-people-del',name:'边民删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-group',
+		name: '互助组',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '互助组表数据的维护',
+		childList: [
+			{id: 'tb-group-list', name: '互助组-列表', url: 'sa-view/tb-group/tb-group-list.html',
+			childList:[
+			{id:'tb-group-add',name:'互助组添加',isShow:false},
+			{id:'tb-group-edit',name:'互助组更新',isShow:false},
+			{id:'tb-group-del',name:'互助组删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-logistics',
+		name: '物流表',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '物流表表数据的维护',
+		childList: [
+			{id: 'tb-logistics-list', name: '物流表-列表', url: 'sa-view/tb-logistics/tb-logistics-list.html',
+			childList:[
+			{id:'tb-logistics-add',name:'物流表添加',isShow:false},
+			{id:'tb-logistics-edit',name:'物流表更新',isShow:false},
+			{id:'tb-logistics-del',name:'物流表删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-orders',
+		name: '订单表',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '订单表表数据的维护',
+		childList: [
+			{id: 'tb-orders-list', name: '订单表-列表', url: 'sa-view/tb-orders/tb-orders-list.html',
+			childList:[
+			{id:'tb-orders-add',name:'订单表添加',isShow:false},
+			{id:'tb-orders-edit',name:'订单表更新',isShow:false},
+			{id:'tb-orders-del',name:'订单表删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-goods-type',
+		name: '商品分类',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '商品分类表数据的维护',
+		childList: [
+			{id: 'tb-goods-type-list', name: '商品分类-列表', url: 'sa-view/tb-goods-type/tb-goods-type-list.html',
+			childList:[
+			{id:'tb-goods-type-add',name:'商品分类添加',isShow:false},
+			{id:'tb-goods-type-edit',name:'商品分类更新',isShow:false},
+			{id:'tb-goods-type-del',name:'商品分类删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-goods',
+		name: '商品',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '商品表数据的维护',
+		childList: [
+			{id: 'tb-goods-list', name: '商品-列表', url: 'sa-view/tb-goods/tb-goods-list.html',
+			childList:[
+			{id:'tb-goods-add',name:'商品添加',isShow:false},
+			{id:'tb-goods-edit',name:'商品更新',isShow:false},
+			{id:'tb-goods-del',name:'商品删除',isShow:false},
+			]
+			},
+		]
+},{
+		id: 'tb-goods-units',
+		name: '商品单位',
+		icon: 'el-icon-folder-opened',
+	    parent:true,
+		info: '商品单位表数据的维护',
+		childList: [
+			{id: 'tb-goods-units-list', name: '商品单位-列表', url: 'sa-view/tb-goods-units/tb-goods-units-list.html',
+			childList:[
+			{id:'tb-goods-units-add',name:'商品单位添加',isShow:false},
+			{id:'tb-goods-units-edit',name:'商品单位更新',isShow:false},
+			{id:'tb-goods-units-del',name:'商品单位删除',isShow:false},
+			]
+			},
+		]
+}
+ );

+ 3 - 3
sa-frame/sa-code.js

@@ -13,7 +13,7 @@
 
 
 // ================================= 用户信息 和 菜单 =================================
-sa.ajax('/AccAdmin/fristOpenAdmin', function(res) {
+sa.ajax('/sp-admin/AccAdmin/fristOpenAdmin', function(res) {
 
 	// 验证权限 
 	// if(!(res.data.admin && res.data.per_list.indexOf('99') > -1)) {
@@ -64,7 +64,7 @@ sa_admin.dropList = [		// 头像点击处可操作的选项
         click: function () {
 			layer.prompt({title: '请输入新名称'}, function(pass, index){
 				layer.close(index);
-				sa.ajax('/admin/updateInfo', {name: pass}, function(res){
+				sa.ajax('/sp-admin/admin/updateInfo', {name: pass}, function(res){
 					sa_admin.user.username = pass;
 					sa.ok2('修改成功');
 				});
@@ -88,7 +88,7 @@ sa_admin.dropList = [		// 头像点击处可操作的选项
 		name: '退出登录',
 		click: function() {
 			layer.confirm('退出登录?', function() {
-				sa.ajax('/AccAdmin/doExit', function(res) {
+				sa.ajax('/sp-admin/AccAdmin/doExit', function(res) {
 					layer.alert('注销成功', function() {
 						location.href="login.html";
 					})

+ 2 - 2
sa-view-sp/sp-admin/admin-add.html

@@ -77,7 +77,7 @@
 						sa.checkNull(m.roleId, '请选择角色');
 						
 						// 添加
-						sa.ajax('/admin/add', m, function(res){
+						sa.ajax('/sp-admin/admin/add', m, function(res){
 							sa.alert('添加成功, 账号id为:' + res.data, function(){
 								this.m = crateModel();
 								// location.reload();
@@ -87,7 +87,7 @@
 				},
 				mounted: function(){
 					// 加载角色 
-					sa.ajax('/role/getList', function(res){
+					sa.ajax('/sp-admin/role/getList', function(res){
 						this.roleList = res.data;	// 数据  
 					}.bind(this), {msg: null});
 				}

+ 2 - 2
sa-view-sp/sp-admin/admin-info.html

@@ -72,11 +72,11 @@
 				},
 				created: function() {
 					if(this.id == 0 || this.id == sa.$sys.getCurrUser().id) {
-						sa.ajax('/admin/getByCurr', function(res) {
+						sa.ajax('/sp-admin/admin/getByCurr', function(res) {
 							this.m = res.data;
 						}.bind(this));
 					} else {
-						sa.ajax('/admin/getById?id=' + this.id, function(res) {
+						sa.ajax('/sp-admin/admin/getById?id=' + this.id, function(res) {
 							this.m = res.data;
 						}.bind(this));
 					}

+ 9 - 9
sa-view-sp/sp-admin/admin-list.html

@@ -121,7 +121,7 @@
 				methods: {
 					// 刷新
 					f5: function(isPage){
-						sa.ajax('/admin/getList', this.p, function(res){
+						sa.ajax('/sp-admin/admin/getList', this.p, function(res){
 							this.dataList = res.data;	// 数据
 							this.dataCount = res.dataCount;
 							sa.f5TableHeight();		// 刷新表格高度 
@@ -148,7 +148,7 @@
 					updateName: function(data) {
 						layer.prompt({title: '修改账号名称'}, function(pass, index){
 							layer.close(index);
-							sa.ajax('/admin/update', {id: data.id, name: pass}, function(res){
+							sa.ajax('/sp-admin/admin/update', {id: data.id, name: pass}, function(res){
 								data.name = pass;
 								layer.msg('修改成功');
 							})
@@ -158,7 +158,7 @@
 					updateAvatar: function(data) {
 						sa.uploadImage(function(src) {
 							var p = {id: data.id, avatar: src};
-							sa.ajax('/admin/updateAvatar', p, function(res) {
+							sa.ajax('/sp-admin/admin/updateAvatar', p, function(res) {
 								sa.msg('上传成功');
 								data.avatar = src;  
 							}.bind(this));
@@ -171,7 +171,7 @@
 							if(pass.length < 4) {
 								return layer.msg('新密码长度请不要低于4位');
 							}
-							sa.ajax('/admin/updatePassword', {id: data.id, password: pass}, function(res){
+							sa.ajax('/sp-admin/admin/updatePassword', {id: data.id, password: pass}, function(res){
 								layer.msg('修改成功');
 							})
 						});
@@ -186,7 +186,7 @@
 						}
 						var str = '将此账号修改为 [' + roleName + '], 请确认?';
 						layer.confirm(str, {title: '请确认'}, function() {
-							sa.ajax('/admin/updateRole', {id: data.id, roleId: roleId}, function(res) {
+							sa.ajax('/sp-admin/admin/updateRole', {id: data.id, roleId: roleId}, function(res) {
 								sa.msg('修改成功');
 								data.roleId = roleId;
 								data.roleName = roleName;
@@ -200,7 +200,7 @@
 							return sa.alert('不能自己封禁自己');  
 						}
 						var is_ok = false;	// 记录是否成功 
-						var ajax = sa.ajax('/admin/updateStatus', {adminId: data.id, status: data.status}, function(res) {
+						var ajax = sa.ajax('/sp-admin/admin/updateStatus', {adminId: data.id, status: data.status}, function(res) {
 							sa.msg('修改成功');
 							is_ok = true;
 						}.bind(this));
@@ -214,7 +214,7 @@
 					// 删除 
 					del: function (data) {
 						sa.confirm('是否删除,此操作不可撤销', function(){
-							sa.ajax('/admin/delete', {id: data.id},function(res){
+							sa.ajax('/sp-admin/admin/delete', {id: data.id},function(res){
 								sa.arrayDelete(app.dataList, data);
 								sa.ok('删除成功');
 								sa.f5TableHeight();		// 刷新表格高度 
@@ -231,7 +231,7 @@
 						}
 						// 提交删除 
 						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
-							sa.ajax('/admin/deleteByIds', {ids: ids.join(',')}, function(res) {
+							sa.ajax('/sp-admin/admin/deleteByIds', {ids: ids.join(',')}, function(res) {
 								sa.arrayDelete(this.dataList, selection);
 								sa.ok('删除成功');
 								sa.f5TableHeight();		// 刷新表格高度 
@@ -243,7 +243,7 @@
 					this.f5();
 					sa.onInputEnter();	// 监听回车执行查询 
 					// 加载角色 
-					sa.ajax('/role/getList', function(res){
+					sa.ajax('/sp-admin/role/getList', function(res){
 						this.roleList = res.data;	// 数据  
 					}.bind(this), {msg: null});
 				}

+ 1 - 1
sa-view-sp/sp-admin/update-password.html

@@ -64,7 +64,7 @@
 						sa.check(m.newPwd != m.newPwd2, '新密码两次输入不一致');
 						sa.check(m.newPwd.length < 4, '新密码请不要低于六位数');
 						// 开始修改 
-						sa.ajax('/AdminPassword/update', this.m, function(res) {
+						sa.ajax('/sp-admin/AdminPassword/update', this.m, function(res) {
 							if(parent != window) {
 								sa.closeCurrIframe();
 								parent.sa.ok2('修改成功');

+ 1 - 1
sa-view-sp/sp-apilog/api-log-list-delete.html

@@ -69,7 +69,7 @@
 							return sa.error('请选择一个时间范围')
 						}
 						// 开始删除
-						sa.ajax('/SgApilog/deleteByStartEnd', this.m, function(res){
+						sa.ajax('/sp-admin/SgApilog/deleteByStartEnd', this.m, function(res){
 							sa.alert('操作成功, 共删除 ' + res.data + ' 条请求记录', function() {
 								if(parent.app) {
 									parent.app.f5();

+ 4 - 4
sa-view-sp/sp-apilog/api-log-list.html

@@ -202,7 +202,7 @@
 				methods: {
 					// 刷新
 					f5: function() {
-						sa.ajax('/SgApilog/getList', sa.removeNull(this.p), function(res) {
+						sa.ajax('/sp-admin/SgApilog/getList', sa.removeNull(this.p), function(res) {
 							this.dataList = res.data; // 数据
 							this.dataCount = res.dataCount; // 数据总数 
 							sa.f5TableHeight();		// 刷新表格高度 
@@ -220,7 +220,7 @@
 						if(this.isNewestSta) {
 							fn()
 						} else {
-							sa.ajax('/SgApilog/staBy', sa.removeNull(this.p), function(res) {
+							sa.ajax('/sp-admin/SgApilog/staBy', sa.removeNull(this.p), function(res) {
 								this.staData = res.data;
 								this.isNewestSta = true;
 								fn();
@@ -274,7 +274,7 @@
 					// 删除  
 					del: function(data) {
 						sa.confirm('是否删除,此操作不可撤销', function() {
-							sa.ajax('/SgApilog/delete?id=' + data.id, function(res) {
+							sa.ajax('/sp-admin/SgApilog/delete?id=' + data.id, function(res) {
 								sa.arrayDelete(this.dataList, data);
 								sa.ok('删除成功');
 								sa.f5TableHeight();		// 刷新表格高度 
@@ -291,7 +291,7 @@
 						}
 						// 提交删除 
 						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
-							sa.ajax('/SgApilog/deleteByIds', {ids: ids.join(',')}, function(res) {
+							sa.ajax('/sp-admin/SgApilog/deleteByIds', {ids: ids.join(',')}, function(res) {
 								sa.arrayDelete(this.dataList, selection);
 								sa.ok('删除成功');
 								sa.f5TableHeight();		// 刷新表格高度 

+ 2 - 2
sa-view-sp/sp-cfg/app-cfg.html

@@ -113,13 +113,13 @@
 					},
 					// 刷新
 					f5: function(){
-						sa.ajax('/SpCfg/getCfg', {cfgName: 'app_cfg'}, function(res){
+						sa.ajax('/sp-admin/SpCfg/getCfg', {cfgName: 'app_cfg'}, function(res){
 							this.init(res.data);
 						}.bind(this));
 					},
 					// 提交 
 					ok: function(){
-						sa.ajax('/SpCfg/updateCfg', {cfgName: 'app_cfg', cfgValue: JSON.stringify(this.m)}, function(res){
+						sa.ajax('/sp-admin/SpCfg/updateCfg', {cfgName: 'app_cfg', cfgValue: JSON.stringify(this.m)}, function(res){
 							sa.ok2('保存成功');
 						}.bind(this));
 					},

+ 2 - 2
sa-view-sp/sp-cfg/server-cfg.html

@@ -103,7 +103,7 @@
 					},
 					// 刷新
 					f5: function() {
-						sa.ajax('/SpCfg/getCfg', {
+						sa.ajax('/sp-admin/SpCfg/getCfg', {
 							cfgName: 'server_cfg'
 						}, function(res) {
 							this.init(res.data);
@@ -111,7 +111,7 @@
 					},
 					// 提交 
 					ok: function() {
-						sa.ajax('/SpCfg/updateCfg', {
+						sa.ajax('/sp-admin/SpCfg/updateCfg', {
 							cfgName: 'server_cfg',
 							cfgValue: JSON.stringify(this.m)
 						}, function(res) {

+ 7 - 7
sa-view-sp/sp-console/redis-console.html

@@ -183,7 +183,7 @@
 						if(this.isLike && k != '') {
 							k = '*' + k + '*';
 						}
-						sa.ajax('/RedisConsole/getKeys', {k: k}, function(res) {
+						sa.ajax('/sp-admin/RedisConsole/getKeys', {k: k}, function(res) {
 							var dataList = [];
 							for (var i = 0; i < res.data.length; i++) {
 								dataList.push({
@@ -208,7 +208,7 @@
 					// 刷新预览 
 					f5_pre: function(is_f5_keys) {
 						// 基本预览信息
-						sa.ajax('/RedisConsole/getPreInfo', this.p, function(res) {
+						sa.ajax('/sp-admin/RedisConsole/getPreInfo', this.p, function(res) {
 							res.data.uptime_in_seconds_str = getDuration(parseInt(res.data.uptime_in_seconds) * 1000);
 							this.preData = res.data;
 							// 如果指定不查询keys列表 
@@ -227,7 +227,7 @@
 					},
 					// 加载详情
 					get: function(data) {
-						sa.ajax('/RedisConsole/getByKey?key=' + data.key, function(res) {
+						sa.ajax('/sp-admin/RedisConsole/getByKey?key=' + data.key, function(res) {
 							data.value = res.data.value;
 							data.ttl = res.data.ttl;
 							data.is_show = true;
@@ -237,7 +237,7 @@
 					// 删除
 					del: function(data) {
 						sa.confirm('是否删除,此操作不可撤销', function() {
-							sa.ajax('/RedisConsole/del?key=' + data.key, function(res) {
+							sa.ajax('/sp-admin/RedisConsole/del?key=' + data.key, function(res) {
 								sa.arrayDelete(app.dataListShow, data);
 								sa.ok('删除成功');
 								sa.f5TableHeight();		// 刷新表格高度 
@@ -254,7 +254,7 @@
 							area: ['600px', '400px'],	// 弹窗尺寸
 						}, function(pass, index, elem){
 							layer.close(index); //如果设定了yes回调,需进行手工关闭
-							sa.ajax('/RedisConsole/updateValue', {key: data.key, value: pass}, function(res){
+							sa.ajax('/sp-admin/RedisConsole/updateValue', {key: data.key, value: pass}, function(res){
 								data.value = pass;
 								layer.msg('修改成功');
 								sa.f5TableHeight();	// 刷新表格高度
@@ -267,7 +267,7 @@
 							if(isNaN(pass)) {
 								return sa.error('请输入一个数值');
 							}
-							sa.ajax('/RedisConsole/updateTtl', {key: data.key, ttl: pass}, function(res){
+							sa.ajax('/sp-admin/RedisConsole/updateTtl', {key: data.key, ttl: pass}, function(res){
 								data.ttl = pass;
 								sa.ok('修改成功');
 							})
@@ -289,7 +289,7 @@
 						}
 						// 删除 
 						sa.confirm('是否删除选中记录,此操作不可撤销', function() {
-							sa.ajax('/RedisConsole/deleteByKeys', {key: keys}, function(res) {
+							sa.ajax('/sp-admin/RedisConsole/deleteByKeys', {key: keys}, function(res) {
 								sa.arrayDelete(this.dataListShow, selection);
 								sa.ok2('删除成功');
 								sa.f5TableHeight();		// 刷新表格高度 

+ 1 - 1
sa-view-sp/sp-console/redis-key-add.html

@@ -87,7 +87,7 @@
 						}
 						// 添加
 						m.ttl = parseInt(m.ttl);
-						sa.ajax('/RedisConsole/set', m, function(res){
+						sa.ajax('/sp-admin/RedisConsole/set', m, function(res){
 							sa.closeCurrIframe();
 							parent.app.dataListShow.unshift(m);
 							parent.sa.msg('添加成功');

+ 2 - 2
sa-view-sp/sp-console/sql-console.html

@@ -12,8 +12,8 @@
 		<script type="text/javascript">
 			setTimeout(function() {
 				// 跳转到sql监控页
-				console.log(sa.cfg.api_url + '/druid/sql.html');
-				location.href = sa.cfg.api_url + '/druid/sql.html';
+				console.log(sa.cfg.api_url + '/sp-admin/druid/sql.html');
+				location.href = sa.cfg.api_url + '/sp-admin/druid/sql.html';
 			}, 100)
 		</script>
 	</body>

+ 1 - 1
sa-view-sp/sp-role/menu-list.html

@@ -51,7 +51,7 @@
 				},
 				created: function(){
 					// 全部
-					sa.ajax2('/SysMenu/getList', function(res){
+					sa.ajax2('/sp-admin/SysMenu/getList', function(res){
 						menuList = sa_admin_code_util.arrayToTree(menuList);	// 一维转tree 
 						menuList = sa_admin_code_util.refMenuList(menuList);	// 属性处理 
 						this.dataList = menuList;	// 数据  

+ 2 - 2
sa-view-sp/sp-role/menu-setup.html

@@ -114,7 +114,7 @@
 						keys.forEach(function(ts){
 							str += 'code=' + ts + '&';
 						})
-						var url = '/SpRolePermission/updatePcodeByRid?roleId=' + roleId;
+						var url = '/sp-admin/SpRolePermission/updatePcodeByRid?roleId=' + roleId;
 						sa.ajax(url, str,function (res) {
 							sa.alert('设置成功', function(){
 								sa.closeCurrIframe();
@@ -157,7 +157,7 @@
 					this.ywList = sa_admin_code_util.treeToArray(this.dataList);
 						
 					// 拉取此 roleId 的
-					sa.ajax('/SpRolePermission/getPcodeByRid?roleId=' + roleId, function(res) {
+					sa.ajax('/sp-admin/SpRolePermission/getPcodeByRid?roleId=' + roleId, function(res) {
 						this.selectList = res.data;		// 选中的列表 
 						this.haveList = [].concat(this.selectList);
 					}.bind(this))

+ 1 - 1
sa-view-sp/sp-role/role-add.html

@@ -72,7 +72,7 @@
 						sa.checkNull(m.info, '请输入责任描述');
 						
 						// 开始增加
-						sa.ajax('/role/add', this.m, function(res){
+						sa.ajax('/sp-admin/role/add', this.m, function(res){
 							sa.alert('增加成功', function() {
 								if(parent.app) {
 									res.data.is_update = false;

+ 1 - 1
sa-view-sp/sp-role/role-list.html

@@ -82,7 +82,7 @@
 				methods: {
 					// 刷新
 					f5: function(){
-						sa.ajax('/role/getList', this.p, function(res) {
+						sa.ajax('/sp-admin/role/getList', this.p, function(res) {
 							this.dataList = sa.listAU(res.data);
 							sa.f5TableHeight();		// 刷新表格高度 
 						}.bind(this));

+ 188 - 0
sa-view/tb-driver/tb-driver-add.html

@@ -0,0 +1,188 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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="姓名" v-model="m.name" br></sa-item>
+						<sa-item type="num" name="年龄" v-model="m.age" br></sa-item>
+						<sa-item type="enum" name="性别性别" v-model="m.sex" :jv="{1: '男', 2: '女'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="手机号" v-model="m.phone" br></sa-item>
+						<sa-item type="text" name="联系地址" v-model="m.address" br></sa-item>
+						<!-- <sa-item type="text" name="银行卡号" v-model="m.bankCode" br></sa-item> -->
+						<!-- <sa-item type="text" name="银行名称" v-model="m.bankName" br></sa-item> -->
+						<sa-item type="text" name="身份证号" v-model="m.idCard" br></sa-item>
+			<!-- 			<sa-item type="img-list" name="身份证照片" v-model="m.idCardImg" br></sa-item>
+						<sa-item type="text" name="驾驶证号" v-model="m.drivingLicenseId" br></sa-item>
+						<sa-item type="img-list" name="驾驶证照片" v-model="m.drivingLicenseImg" br></sa-item>
+						<sa-item type="text" name="车辆行驶证号" v-model="m.vehicleDrivingId" br></sa-item>
+						<sa-item type="img-list" name="车辆行驶证照片" v-model="m.vehicleDrivingImg" br></sa-item>
+						<sa-item type="img-list" name="车辆前脸照" v-model="m.vehicleImg" br></sa-item> -->
+						<!-- <sa-item type="text" name="注册时间" v-model="m.registerTime" br></sa-item> -->
+				<!-- 		<sa-item type="text" name="是否被锁定" v-model="m.isLock" br></sa-item>
+						<sa-item type="text" name="创建者id" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建者名称" v-model="m.createName" br></sa-item> -->
+						<!-- date-create字段: m.createTime - 创建时间
+						<!-- <sa-item type="text" name="更新者id" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新者名称" v-model="m.updateName" br></sa-item> -->
+						<!-- date-update字段: m.updateTime - 更新时间 -->
+						<!-- <sa-item type="enum" name="审核状态" v-model="m.auditStatus" :jv="{0: '待审核,1'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="审核人" v-model="m.auditBy" br></sa-item>
+						<sa-item type="text" name="审核时间" v-model="m.auditTime" br></sa-item>
+						<sa-item type="text" name="审核不通过原因" v-model="m.nopassReason" br></sa-item> --> -->
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							// id: '',		// 主键 
+							name: '',		// 姓名 
+							age: '',		// 年龄 
+							sex: '',		// 性别性别(1=男,2=女) 
+							phone: '',		// 手机号 
+							address: '',		// 联系地址 
+							// bankCode: '',		// 银行卡号 
+							// bankName: '',		// 银行名称 
+							idCard: '',		// 身份证号 
+							// idCardImg: '',		// 身份证照片 
+							// drivingLicenseId: '',		// 驾驶证号 
+							// drivingLicenseImg: '',		// 驾驶证照片 
+							// vehicleDrivingId: '',		// 车辆行驶证号 
+							// vehicleDrivingImg: '',		// 车辆行驶证照片 
+							// vehicleImg: '',		// 车辆前脸照 
+							// registerTime: '',		// 注册时间 
+							// isLock: '',		// 是否被锁定 
+							// createBy: '',		// 创建者id 
+							// createName: '',		// 创建者名称 
+							// createTime: '',		// 创建时间 
+							// updateBy: '',		// 更新者id 
+							// updateName: '',		// 更新者名称 
+							// updateTime: '',		// 更新时间 
+							// deleteStatus: '',		// 删除状态 
+							// auditStatus: '',		// 审核状态(0=待审核,1=已通过,2=不通过) 
+							// auditBy: '',		// 审核人 
+							// auditTime: '',		// 审核时间 
+							// nopassReason: '',		// 审核不通过原因 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [姓名]');
+						sa.checkNull(m.age, '请输入 [年龄]');
+						sa.checkNull(m.sex, '请输入 [性别性别]');
+						sa.checkNull(m.phone, '请输入 [手机号]');
+						sa.checkNull(m.address, '请输入 [联系地址]');
+						// sa.checkNull(m.bankCode, '请输入 [银行卡号]');
+						// sa.checkNull(m.bankName, '请输入 [银行名称]');
+						// sa.checkNull(m.idCard, '请输入 [身份证号]');
+						// sa.checkNull(m.idCardImg, '请输入 [身份证照片]');
+						// sa.checkNull(m.drivingLicenseId, '请输入 [驾驶证号]');
+						// sa.checkNull(m.drivingLicenseImg, '请输入 [驾驶证照片]');
+						// sa.checkNull(m.vehicleDrivingId, '请输入 [车辆行驶证号]');
+						// sa.checkNull(m.vehicleDrivingImg, '请输入 [车辆行驶证照片]');
+						// sa.checkNull(m.vehicleImg, '请输入 [车辆前脸照]');
+						// sa.checkNull(m.registerTime, '请输入 [注册时间]');
+						// sa.checkNull(m.isLock, '请输入 [是否被锁定]');
+						// sa.checkNull(m.createBy, '请输入 [创建者id]');
+						// sa.checkNull(m.createName, '请输入 [创建者名称]');
+						// // sa.checkNull(m.createTime, '请输入 [创建时间]');
+						// sa.checkNull(m.updateBy, '请输入 [更新者id]');
+						// sa.checkNull(m.updateName, '请输入 [更新者名称]');
+						// // sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						// // sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+						// sa.checkNull(m.auditStatus, '请输入 [审核状态]');
+						// sa.checkNull(m.auditBy, '请输入 [审核人]');
+						// sa.checkNull(m.auditTime, '请输入 [审核时间]');
+						// sa.checkNull(m.nopassReason, '请输入 [审核不通过原因]');
+				
+						// 开始增加或修改
+						this.m.createTime = undefined;		// 不提交属性:创建时间
+						this.m.updateTime = undefined;		// 不提交属性:更新时间
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/transport-server/TbDriver/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/transport-server/TbDriver/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/transport-server/TbDriver/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 89 - 0
sa-view/tb-driver/tb-driver-info.html

@@ -0,0 +1,89 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.c-item .image-box-2{height: 90px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="姓名" br>{{m.name}}</sa-info>
+						<sa-info type="num" name="年龄" :value="m.age" br></sa-info>
+						<sa-info type="enum" name="性别性别" :value="m.sex" :jv="{1: '男', 2: '女'}" br></sa-info>
+						<sa-info name="手机号" br>{{m.phone}}</sa-info>
+						<sa-info name="联系地址" br>{{m.address}}</sa-info>
+						<sa-info name="银行卡号" br>{{m.bankCode}}</sa-info>
+						<sa-info name="银行名称" br>{{m.bankName}}</sa-info>
+						<sa-info name="身份证号" br>{{m.idCard}}</sa-info>
+						<sa-info type="img-list" name="身份证照片" :value="m.idCardImg" br></sa-info>
+						<sa-info name="驾驶证号" br>{{m.drivingLicenseId}}</sa-info>
+						<sa-info type="img-list" name="驾驶证照片" :value="m.drivingLicenseImg" br></sa-info>
+						<sa-info name="车辆行驶证号" br>{{m.vehicleDrivingId}}</sa-info>
+						<sa-info type="img-list" name="车辆行驶证照片" :value="m.vehicleDrivingImg" br></sa-info>
+						<sa-info type="img-list" name="车辆前脸照" :value="m.vehicleImg" br></sa-info>
+						<sa-info name="注册时间" br>{{m.registerTime}}</sa-info>
+						<sa-info name="是否被锁定" br>{{m.isLock}}</sa-info>
+						<sa-info name="创建者id" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建者名称" br>{{m.createName}}</sa-info>
+						<sa-info type="datetime" name="创建时间" :value="m.createTime" br></sa-info>
+						<sa-info name="更新者id" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新者名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="datetime" name="更新时间" :value="m.updateTime" br></sa-info>
+						<sa-info type="enum" name="审核状态" :value="m.auditStatus" :jv="{0: '待审核,1'}" br></sa-info>
+						<sa-info name="审核人" br>{{m.auditBy}}</sa-info>
+						<sa-info name="审核时间" br>{{m.auditTime}}</sa-info>
+						<sa-info name="审核不通过原因" br>{{m.nopassReason}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/TbDriver/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 200 - 0
sa-view/tb-driver/tb-driver-list.html

@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>司机-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.name"></sa-item>
+					<sa-item type="num" name="年龄" v-model="p.age"></sa-item>
+					<sa-item type="enum" name="性别性别" v-model="p.sex" 
+						:jv="{1: '男', 2: '女'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="手机号" v-model="p.phone"></sa-item>
+					<sa-item type="text" name="联系地址" v-model="p.address"></sa-item>
+					<sa-item type="text" name="银行卡号" v-model="p.bankCode"></sa-item>
+					<sa-item type="text" name="银行名称" v-model="p.bankName"></sa-item>
+					<sa-item type="text" name="身份证号" v-model="p.idCard"></sa-item>
+					<sa-item type="text" name="驾驶证号" v-model="p.drivingLicenseId"></sa-item>
+					<sa-item type="text" name="车辆行驶证号" v-model="p.vehicleDrivingId"></sa-item>
+					<sa-item type="text" name="注册时间" v-model="p.registerTime"></sa-item>
+					<sa-item type="text" name="是否被锁定" v-model="p.isLock"></sa-item>
+					<sa-item type="text" name="创建者id" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建者名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新者id" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新者名称" v-model="p.updateName"></sa-item>
+					<!-- 未识别类型:删除状态: p.deleteStatus 请检查配置 -->
+					<sa-item type="enum" name="审核状态" v-model="p.auditStatus" 
+						:jv="{0: '待审核,1'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="审核人" v-model="p.auditBy"></sa-item>
+					<sa-item type="text" name="审核时间" v-model="p.auditTime"></sa-item>
+					<sa-item type="text" name="审核不通过原因" v-model="p.nopassReason"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-driver-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="name" ></sa-td>
+					<sa-td name="年龄" prop="age" type="num"></sa-td>
+					<sa-td name="性别性别" prop="sex" type="enum" :jv="{1: '男', 2: '女'}"></sa-td>
+					<sa-td name="手机号" prop="phone" ></sa-td>
+					<sa-td name="联系地址" prop="address" ></sa-td>
+					<sa-td name="银行卡号" prop="bankCode" ></sa-td>
+					<sa-td name="银行名称" prop="bankName" ></sa-td>
+					<sa-td name="身份证号" prop="idCard" ></sa-td>
+					<sa-td name="身份证照片" prop="idCardImg" type="img-list"></sa-td>
+					<sa-td name="驾驶证号" prop="drivingLicenseId" ></sa-td>
+					<sa-td name="驾驶证照片" prop="drivingLicenseImg" type="img-list"></sa-td>
+					<sa-td name="车辆行驶证号" prop="vehicleDrivingId" ></sa-td>
+					<sa-td name="车辆行驶证照片" prop="vehicleDrivingImg" type="img-list"></sa-td>
+					<sa-td name="车辆前脸照" prop="vehicleImg" type="img-list"></sa-td>
+					<sa-td name="注册时间" prop="registerTime" ></sa-td>
+					<sa-td name="是否被锁定" prop="isLock" ></sa-td>
+					<sa-td name="创建者id" prop="createBy" ></sa-td>
+					<sa-td name="创建者名称" prop="createName" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" type="datetime"></sa-td>
+					<sa-td name="更新者id" prop="updateBy" ></sa-td>
+					<sa-td name="更新者名称" prop="updateName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" type="datetime"></sa-td>
+					<sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核,1'}"></sa-td>
+					<sa-td name="审核人" prop="auditBy" ></sa-td>
+					<sa-td name="审核时间" prop="auditTime" ></sa-td>
+					<sa-td name="审核不通过原因" prop="nopassReason" ></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 v-if="sa.isAuth('tb-driver-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-driver-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 姓名 
+						age: '',		// 年龄 
+						sex: '',		// 性别性别(1=男,2=女) 
+						phone: '',		// 手机号 
+						address: '',		// 联系地址 
+						bankCode: '',		// 银行卡号 
+						bankName: '',		// 银行名称 
+						idCard: '',		// 身份证号 
+						drivingLicenseId: '',		// 驾驶证号 
+						vehicleDrivingId: '',		// 车辆行驶证号 
+						registerTime: '',		// 注册时间 
+						isLock: '',		// 是否被锁定 
+						createBy: '',		// 创建者id 
+						createName: '',		// 创建者名称 
+						updateBy: '',		// 更新者id 
+						updateName: '',		// 更新者名称 
+						auditStatus: '',		// 审核状态(0=待审核,1=已通过,2=不通过) 
+						auditBy: '',		// 审核人 
+						auditTime: '',		// 审核时间 
+						nopassReason: '',		// 审核不通过原因 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbDriver/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-driver-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-driver-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-driver-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbDriver/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/transport-server/TbDriver/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 191 - 0
sa-view/tb-enterprise/tb-enterprise-add.html

@@ -0,0 +1,191 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.name" br></sa-item>
+						<sa-item type="text" name="国别" v-model="m.nationality" br></sa-item>
+						<sa-item type="enum" name="商户分类" v-model="m.type" :jv="{自营商铺: '自营商铺', 劳务商铺: '劳务商铺'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="法人" v-model="m.legalPerson" br></sa-item>
+						<sa-item type="text" name="身份证号" v-model="m.idCard" br></sa-item>
+						<sa-item type="text" name="手机号码" v-model="m.contact" br></sa-item>
+						<sa-item type="img-list" name="营业执照" v-model="m.businessLicense" br></sa-item>
+						<sa-item type="text" name="所在铺位ID" v-model="m.shopId" br></sa-item>
+						<sa-item type="enum" name="所在铺位名称" v-model="m.shopName" :jv="{1: '100-2'}" jtype="4" br></sa-item>
+						<sa-item type="enum" name="银行编号" v-model="m.bankNo" :jv="{CMB: '招商银行'}" jtype="4" br></sa-item>
+						<sa-item type="text" name="" v-model="m.bankName" br></sa-item>
+						<sa-item type="text" name="银行账号" v-model="m.bankAccount" br></sa-item>
+						<sa-item type="text" name="税号" v-model="m.dutyParagraph" br></sa-item>
+						<sa-item type="text" name="" v-model="m.addressIds" br></sa-item>
+						<sa-item type="text" name="" v-model="m.address" br></sa-item>
+						<sa-item type="text" name="" v-model="m.agreement" br></sa-item>
+						<sa-item type="text" name="" v-model="m.judgeStatus" br></sa-item>
+						<sa-item type="text" name="" v-model="m.judgeContent" br></sa-item>
+						<sa-item type="text" name="" v-model="m.judgeTime" br></sa-item>
+						<sa-item type="text" name="" v-model="m.registerTime" br></sa-item>
+						<sa-item type="text" name="" v-model="m.personId" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人编号" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建人名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人编号" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新人名称" v-model="m.updateName" br></sa-item>
+						<sa-item type="enum" name="删除状态" v-model="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		//  
+							name: '',		// 名称 
+							nationality: '',		// 国别 
+							type: '',		// 商户分类(自营商铺=自营商铺,劳务商铺=劳务商铺) 
+							legalPerson: '',		// 法人 
+							idCard: '',		// 身份证号 
+							contact: '',		// 手机号码 
+							businessLicense: '',		// 营业执照 
+							shopId: '',		// 所在铺位ID 
+							shopName: '',		// 所在铺位名称(1=100-2) 
+							bankNo: '',		// 银行编号(CMB= 招商银行) 
+							bankName: '',		//  
+							bankAccount: '',		// 银行账号 
+							dutyParagraph: '',		// 税号 
+							addressIds: '',		//  
+							address: '',		//  
+							agreement: '',		//  
+							judgeStatus: '',		//  
+							judgeContent: '',		//  
+							judgeTime: '',		//  
+							registerTime: '',		//  
+							personId: '',		//  
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人编号 
+							createName: '',		// 创建人名称 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人编号 
+							updateName: '',		// 更新人名称 
+							deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.id, '请输入 []');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.nationality, '请输入 [国别]');
+						sa.checkNull(m.type, '请输入 [商户分类]');
+						sa.checkNull(m.legalPerson, '请输入 [法人]');
+						sa.checkNull(m.idCard, '请输入 [身份证号]');
+						sa.checkNull(m.contact, '请输入 [手机号码]');
+						sa.checkNull(m.businessLicense, '请输入 [营业执照]');
+						sa.checkNull(m.shopId, '请输入 [所在铺位ID]');
+						sa.checkNull(m.shopName, '请输入 [所在铺位名称]');
+						sa.checkNull(m.bankNo, '请输入 [银行编号]');
+						sa.checkNull(m.bankName, '请输入 []');
+						sa.checkNull(m.bankAccount, '请输入 [银行账号]');
+						sa.checkNull(m.dutyParagraph, '请输入 [税号]');
+						sa.checkNull(m.addressIds, '请输入 []');
+						sa.checkNull(m.address, '请输入 []');
+						sa.checkNull(m.agreement, '请输入 []');
+						sa.checkNull(m.judgeStatus, '请输入 []');
+						sa.checkNull(m.judgeContent, '请输入 []');
+						sa.checkNull(m.judgeTime, '请输入 []');
+						sa.checkNull(m.registerTime, '请输入 []');
+						sa.checkNull(m.personId, '请输入 []');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人编号]');
+						sa.checkNull(m.createName, '请输入 [创建人名称]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人编号]');
+						sa.checkNull(m.updateName, '请输入 [更新人名称]');
+						sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbEnterprise/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbEnterprise/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbEnterprise/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 91 - 0
sa-view/tb-enterprise/tb-enterprise-info.html

@@ -0,0 +1,91 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.c-item .image-box-2{height: 90px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info name="" br>{{m.id}}</sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info name="国别" br>{{m.nationality}}</sa-info>
+						<sa-info type="enum" name="商户分类" :value="m.type" :jv="{自营商铺: '自营商铺', 劳务商铺: '劳务商铺'}" br></sa-info>
+						<sa-info name="法人" br>{{m.legalPerson}}</sa-info>
+						<sa-info name="身份证号" br>{{m.idCard}}</sa-info>
+						<sa-info name="手机号码" br>{{m.contact}}</sa-info>
+						<sa-info type="img-list" name="营业执照" :value="m.businessLicense" br></sa-info>
+						<sa-info name="所在铺位ID" br>{{m.shopId}}</sa-info>
+						<sa-info type="enum" name="所在铺位名称" :value="m.shopName" :jv="{1: '100-2'}" br></sa-info>
+						<sa-info type="enum" name="银行编号" :value="m.bankNo" :jv="{CMB: '招商银行'}" br></sa-info>
+						<sa-info name="" br>{{m.bankName}}</sa-info>
+						<sa-info name="银行账号" br>{{m.bankAccount}}</sa-info>
+						<sa-info name="税号" br>{{m.dutyParagraph}}</sa-info>
+						<sa-info name="" br>{{m.addressIds}}</sa-info>
+						<sa-info name="" br>{{m.address}}</sa-info>
+						<sa-info name="" br>{{m.agreement}}</sa-info>
+						<sa-info name="" br>{{m.judgeStatus}}</sa-info>
+						<sa-info name="" br>{{m.judgeContent}}</sa-info>
+						<sa-info name="" br>{{m.judgeTime}}</sa-info>
+						<sa-info name="" br>{{m.registerTime}}</sa-info>
+						<sa-info name="" br>{{m.personId}}</sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人编号" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建人名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人编号" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新人名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="enum" name="删除状态" :value="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbEnterprise/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 232 - 0
sa-view/tb-enterprise/tb-enterprise-list.html

@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>商家-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.name"></sa-item>
+					<sa-item type="text" name="国别" v-model="p.nationality"></sa-item>
+					<sa-item type="enum" name="商户分类" v-model="p.type" 
+						:jv="{自营商铺: '自营商铺', 劳务商铺: '劳务商铺'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="法人" v-model="p.legalPerson"></sa-item>
+					<sa-item type="text" name="身份证号" v-model="p.idCard"></sa-item>
+					<sa-item type="text" name="手机号码" v-model="p.contact"></sa-item>
+					<sa-item type="text" name="所在铺位ID" v-model="p.shopId"></sa-item>
+					<sa-item type="enum" name="所在铺位名称" v-model="p.shopName" 
+						:jv="{1: '100-2'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="enum" name="银行编号" v-model="p.bankNo" 
+						:jv="{CMB: '招商银行'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="" v-model="p.bankName"></sa-item>
+					<sa-item type="text" name="银行账号" v-model="p.bankAccount"></sa-item>
+					<sa-item type="text" name="税号" v-model="p.dutyParagraph"></sa-item>
+					<sa-item type="text" name="" v-model="p.addressIds"></sa-item>
+					<sa-item type="text" name="" v-model="p.address"></sa-item>
+					<sa-item type="text" name="" v-model="p.agreement"></sa-item>
+					<sa-item type="text" name="" v-model="p.judgeStatus"></sa-item>
+					<sa-item type="text" name="" v-model="p.judgeContent"></sa-item>
+					<sa-item type="text" name="" v-model="p.judgeTime"></sa-item>
+					<sa-item type="text" name="" v-model="p.registerTime"></sa-item>
+					<sa-item type="text" name="" v-model="p.personId"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人编号" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建人名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人编号" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新人名称" v-model="p.updateName"></sa-item>
+					<sa-item type="enum" name="删除状态" v-model="p.deleteStatus" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-enterprise-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="name" ></sa-td>
+					<sa-td name="国别" prop="nationality" ></sa-td>
+					<sa-td name="商户分类" prop="type" type="enum" :jv="{自营商铺: '自营商铺', 劳务商铺: '劳务商铺'}"></sa-td>
+					<sa-td name="法人" prop="legalPerson" ></sa-td>
+					<sa-td name="身份证号" prop="idCard" ></sa-td>
+					<sa-td name="手机号码" prop="contact" ></sa-td>
+					<sa-td name="营业执照" prop="businessLicense" type="img-list"></sa-td>
+					<sa-td name="所在铺位ID" prop="shopId" ></sa-td>
+					<sa-td name="所在铺位名称" prop="shopName" type="enum" :jv="{1: '100-2'}"></sa-td>
+					<sa-td name="银行编号" prop="bankNo" type="enum" :jv="{CMB: '招商银行'}"></sa-td>
+					<sa-td name="" prop="bankName" ></sa-td>
+					<sa-td name="银行账号" prop="bankAccount" ></sa-td>
+					<sa-td name="税号" prop="dutyParagraph" ></sa-td>
+					<sa-td name="" prop="addressIds" ></sa-td>
+					<sa-td name="" prop="address" ></sa-td>
+					<sa-td name="" prop="agreement" ></sa-td>
+					<sa-td name="" prop="judgeStatus" ></sa-td>
+					<sa-td name="" prop="judgeContent" ></sa-td>
+					<sa-td name="" prop="judgeTime" ></sa-td>
+					<sa-td name="" prop="registerTime" ></sa-td>
+					<sa-td name="" prop="personId" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人编号" prop="createBy" ></sa-td>
+					<sa-td name="创建人名称" prop="createName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人编号" prop="updateBy" ></sa-td>
+					<sa-td name="更新人名称" prop="updateName" ></sa-td>
+					<sa-td name="删除状态" prop="deleteStatus" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateDeleteStatus(s.row)"></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 v-if="sa.isAuth('tb-enterprise-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-enterprise-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		//  
+						name: '',		// 名称 
+						nationality: '',		// 国别 
+						type: '',		// 商户分类(自营商铺=自营商铺,劳务商铺=劳务商铺) 
+						legalPerson: '',		// 法人 
+						idCard: '',		// 身份证号 
+						contact: '',		// 手机号码 
+						shopId: '',		// 所在铺位ID 
+						shopName: '',		// 所在铺位名称(1=100-2) 
+						bankNo: '',		// 银行编号(CMB= 招商银行) 
+						bankName: '',		//  
+						bankAccount: '',		// 银行账号 
+						dutyParagraph: '',		// 税号 
+						addressIds: '',		//  
+						address: '',		//  
+						agreement: '',		//  
+						judgeStatus: '',		//  
+						judgeContent: '',		//  
+						judgeTime: '',		//  
+						registerTime: '',		//  
+						personId: '',		//  
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人编号 
+						createName: '',		// 创建人名称 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人编号 
+						updateName: '',		// 更新人名称 
+						deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbEnterprise/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-enterprise-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-enterprise-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-enterprise-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbEnterprise/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbEnterprise/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 删除状态(0=禁用,1=启用)
+					updateDeleteStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.deleteStatus;
+						var ajax = sa.ajax('/level-one-server/TbEnterprise/updateDeleteStatus', {id: data.id, value: data.deleteStatus}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 135 - 0
sa-view/tb-goods-type/tb-goods-type-add.html

@@ -0,0 +1,135 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.name" br></sa-item>
+						<sa-item type="text" name="排序" v-model="m.sort" br></sa-item>
+						<sa-item type="text" name="编号" v-model="m.no" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人编号" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建人名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人编号" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新人名称" v-model="m.updateName" br></sa-item>
+						<sa-item type="enum" name="删除状态" v-model="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							name: '',		// 名称 
+							sort: '',		// 排序 
+							no: '',		// 编号 
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人编号 
+							createName: '',		// 创建人名称 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人编号 
+							updateName: '',		// 更新人名称 
+							deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.sort, '请输入 [排序]');
+						sa.checkNull(m.no, '请输入 [编号]');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人编号]');
+						sa.checkNull(m.createName, '请输入 [创建人名称]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人编号]');
+						sa.checkNull(m.updateName, '请输入 [更新人名称]');
+						sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbGoodsType/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbGoodsType/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbGoodsType/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 73 - 0
sa-view/tb-goods-type/tb-goods-type-info.html

@@ -0,0 +1,73 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info name="排序" br>{{m.sort}}</sa-info>
+						<sa-info name="编号" br>{{m.no}}</sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人编号" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建人名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人编号" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新人名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="enum" name="删除状态" :value="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbGoodsType/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 177 - 0
sa-view/tb-goods-type/tb-goods-type-list.html

@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>商品分类-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.name"></sa-item>
+					<sa-item type="text" name="排序" v-model="p.sort"></sa-item>
+					<sa-item type="text" name="编号" v-model="p.no"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人编号" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建人名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人编号" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新人名称" v-model="p.updateName"></sa-item>
+					<sa-item type="enum" name="删除状态" v-model="p.deleteStatus" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-goods-type-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="name" ></sa-td>
+					<sa-td name="排序" prop="sort" ></sa-td>
+					<sa-td name="编号" prop="no" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人编号" prop="createBy" ></sa-td>
+					<sa-td name="创建人名称" prop="createName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人编号" prop="updateBy" ></sa-td>
+					<sa-td name="更新人名称" prop="updateName" ></sa-td>
+					<sa-td name="删除状态" prop="deleteStatus" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateDeleteStatus(s.row)"></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 v-if="sa.isAuth('tb-goods-type-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-goods-type-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 名称 
+						sort: '',		// 排序 
+						no: '',		// 编号 
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人编号 
+						createName: '',		// 创建人名称 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人编号 
+						updateName: '',		// 更新人名称 
+						deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbGoodsType/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-goods-type-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-goods-type-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-goods-type-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbGoodsType/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/TbGoodsType/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 删除状态(0=禁用,1=启用)
+					updateDeleteStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.deleteStatus;
+						var ajax = sa.ajax('/level-one-server/TbGoodsType/updateDeleteStatus', {id: data.id, value: data.deleteStatus}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 112 - 0
sa-view/tb-goods-units/tb-goods-units-add.html

@@ -0,0 +1,112 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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="商品单位编号" v-model="m.unitsNo" br></sa-item>
+						<sa-item type="text" name="管理商品的单位,比如吨、kg、个、柜;主要字段,名称,编号" v-model="m.units" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 商品主键 
+							unitsNo: '',		// 商品单位编号 
+							units: '',		// 管理商品的单位,比如吨、kg、个、柜;主要字段,名称,编号 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.id, '请输入 [商品主键]');
+						sa.checkNull(m.unitsNo, '请输入 [商品单位编号]');
+						sa.checkNull(m.units, '请输入 [管理商品的单位,比如吨、kg、个、柜;主要字段,名称,编号]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbGoodsUnits/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbGoodsUnits/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbGoodsUnits/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 64 - 0
sa-view/tb-goods-units/tb-goods-units-info.html

@@ -0,0 +1,64 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="商品主键" :value="m.id" br></sa-info>
+						<sa-info name="商品单位编号" br>{{m.unitsNo}}</sa-info>
+						<sa-info name="管理商品的单位,比如吨、kg、个、柜;主要字段,名称,编号" br>{{m.units}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbGoodsUnits/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 136 - 0
sa-view/tb-goods-units/tb-goods-units-list.html

@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>商品单位-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.unitsNo"></sa-item>
+					<sa-item type="text" name="管理商品的单位,比如吨、kg、个、柜;主要字段,名称,编号" v-model="p.units"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-goods-units-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="unitsNo" ></sa-td>
+					<sa-td name="管理商品的单位,比如吨、kg、个、柜;主要字段,名称,编号" prop="units" ></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 v-if="sa.isAuth('tb-goods-units-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-goods-units-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 商品主键 
+						unitsNo: '',		// 商品单位编号 
+						units: '',		// 管理商品的单位,比如吨、kg、个、柜;主要字段,名称,编号 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbGoodsUnits/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-goods-units-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-goods-units-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-goods-units-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbGoodsUnits/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbGoodsUnits/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 140 - 0
sa-view/tb-goods/tb-goods-add.html

@@ -0,0 +1,140 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.name" br></sa-item>
+						<sa-item type="img" name="主图" v-model="m.avatar" br></sa-item>
+						<sa-item type="text" name="分类ID字符串(可多选)" v-model="m.typeIds" br></sa-item>
+						<sa-item type="text" name="分类名称" v-model="m.typeNames" br></sa-item>
+						<sa-item type="text" name="编号" v-model="m.code" br></sa-item>
+						<sa-item type="text" name="备注" v-model="m.remark" br></sa-item>
+						<sa-item type="text" name="原产地" v-model="m.source" br></sa-item>
+						<sa-item type="enum" name="状态" v-model="m.status" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="" v-model="m.unit" br></sa-item>
+						<sa-item type="text" name="" v-model="m.singlePrice" br></sa-item>
+						<sa-item type="text" name="" v-model="m.taxNo" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							name: '',		// 名称 
+							avatar: '',		// 主图 
+							typeIds: '',		// 分类ID 字符串(可多选) 
+							typeNames: '',		// 分类名称 
+							code: '',		// 编号 
+							remark: '',		// 备注 
+							source: '',		// 原产地 
+							status: '',		// 状态(0=禁用,1=启用) 
+							createTime: '',		// 创建时间 
+							unit: '',		//  
+							singlePrice: '',		//  
+							taxNo: '',		//  
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.avatar, '请输入 [主图]');
+						sa.checkNull(m.typeIds, '请输入 [分类ID字符串(可多选)]');
+						sa.checkNull(m.typeNames, '请输入 [分类名称]');
+						sa.checkNull(m.code, '请输入 [编号]');
+						sa.checkNull(m.remark, '请输入 [备注]');
+						sa.checkNull(m.source, '请输入 [原产地]');
+						sa.checkNull(m.status, '请输入 [状态]');
+						// sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.unit, '请输入 []');
+						sa.checkNull(m.singlePrice, '请输入 []');
+						sa.checkNull(m.taxNo, '请输入 []');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbGoods/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbGoods/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbGoods/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 74 - 0
sa-view/tb-goods/tb-goods-info.html

@@ -0,0 +1,74 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info type="img" name="主图" :value="m.avatar" br></sa-info>
+						<sa-info name="分类ID字符串(可多选)" br>{{m.typeIds}}</sa-info>
+						<sa-info name="分类名称" br>{{m.typeNames}}</sa-info>
+						<sa-info name="编号" br>{{m.code}}</sa-info>
+						<sa-info name="备注" br>{{m.remark}}</sa-info>
+						<sa-info name="原产地" br>{{m.source}}</sa-info>
+						<sa-info type="enum" name="状态" :value="m.status" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="" br>{{m.unit}}</sa-info>
+						<sa-info name="" br>{{m.singlePrice}}</sa-info>
+						<sa-info name="" br>{{m.taxNo}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbGoods/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 181 - 0
sa-view/tb-goods/tb-goods-list.html

@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>商品-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.name"></sa-item>
+					<sa-item type="text" name="分类ID字符串(可多选)" v-model="p.typeIds"></sa-item>
+					<sa-item type="text" name="分类名称" v-model="p.typeNames"></sa-item>
+					<sa-item type="text" name="编号" v-model="p.code"></sa-item>
+					<sa-item type="text" name="备注" v-model="p.remark"></sa-item>
+					<sa-item type="text" name="原产地" v-model="p.source"></sa-item>
+					<sa-item type="enum" name="状态" v-model="p.status" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="" v-model="p.unit"></sa-item>
+					<sa-item type="text" name="" v-model="p.singlePrice"></sa-item>
+					<sa-item type="text" name="" v-model="p.taxNo"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-goods-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="name" ></sa-td>
+					<sa-td name="主图" prop="avatar" type="img"></sa-td>
+					<sa-td name="分类ID字符串(可多选)" prop="typeIds" ></sa-td>
+					<sa-td name="分类名称" prop="typeNames" ></sa-td>
+					<sa-td name="编号" prop="code" ></sa-td>
+					<sa-td name="备注" prop="remark" ></sa-td>
+					<sa-td name="原产地" prop="source" ></sa-td>
+					<sa-td name="状态" prop="status" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateStatus(s.row)"></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="" prop="unit" ></sa-td>
+					<sa-td name="" prop="singlePrice" ></sa-td>
+					<sa-td name="" prop="taxNo" ></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 v-if="sa.isAuth('tb-goods-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-goods-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 名称 
+						typeIds: '',		// 分类ID 字符串(可多选) 
+						typeNames: '',		// 分类名称 
+						code: '',		// 编号 
+						remark: '',		// 备注 
+						source: '',		// 原产地 
+						status: '',		// 状态(0=禁用,1=启用) 
+						createTime: '',		// 创建时间 
+						unit: '',		//  
+						singlePrice: '',		//  
+						taxNo: '',		//  
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbGoods/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-goods-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-goods-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-goods-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbGoods/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbGoods/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 状态(0=禁用,1=启用)
+					updateStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.status;
+						var ajax = sa.ajax('/level-one-server/TbGoods/updateStatus', {id: data.id, value: data.status}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 154 - 0
sa-view/tb-group/tb-group-add.html

@@ -0,0 +1,154 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.addressIds" br></sa-item>
+						<sa-item type="text" name="" v-model="m.address" br></sa-item>
+						<sa-item type="text" name="" v-model="m.detailAddress" br></sa-item>
+						<sa-item type="text" name="名称" v-model="m.name" br></sa-item>
+						<sa-item type="text" name="组长ID" v-model="m.leaderId" br></sa-item>
+						<sa-item type="text" name="组长名" v-model="m.leaderName" br></sa-item>
+						<sa-item type="text" name="组长电话" v-model="m.leaderPhone" br></sa-item>
+						<sa-item type="text" name="" v-model="m.code" br></sa-item>
+						<sa-item type="text" name="当天该组剩余额度" v-model="m.leftPrice" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人编号" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建人名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人编号" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新人名称" v-model="m.updateName" br></sa-item>
+						<sa-item type="enum" name="删除状态" v-model="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		//  
+							addressIds: '',		//  
+							address: '',		//  
+							detailAddress: '',		//  
+							name: '',		// 名称 
+							leaderId: '',		// 组长ID 
+							leaderName: '',		// 组长名 
+							leaderPhone: '',		// 组长电话 
+							code: '',		//  
+							leftPrice: '',		// 当天该组剩余额度 
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人编号 
+							createName: '',		// 创建人名称 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人编号 
+							updateName: '',		// 更新人名称 
+							deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.id, '请输入 []');
+						sa.checkNull(m.addressIds, '请输入 []');
+						sa.checkNull(m.address, '请输入 []');
+						sa.checkNull(m.detailAddress, '请输入 []');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.leaderId, '请输入 [组长ID]');
+						sa.checkNull(m.leaderName, '请输入 [组长名]');
+						sa.checkNull(m.leaderPhone, '请输入 [组长电话]');
+						sa.checkNull(m.code, '请输入 []');
+						sa.checkNull(m.leftPrice, '请输入 [当天该组剩余额度]');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人编号]');
+						sa.checkNull(m.createName, '请输入 [创建人名称]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人编号]');
+						sa.checkNull(m.updateName, '请输入 [更新人名称]');
+						sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbGroup/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbGroup/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbGroup/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 78 - 0
sa-view/tb-group/tb-group-info.html

@@ -0,0 +1,78 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info name="" br>{{m.id}}</sa-info>
+						<sa-info name="" br>{{m.addressIds}}</sa-info>
+						<sa-info name="" br>{{m.address}}</sa-info>
+						<sa-info name="" br>{{m.detailAddress}}</sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info name="组长ID" br>{{m.leaderId}}</sa-info>
+						<sa-info name="组长名" br>{{m.leaderName}}</sa-info>
+						<sa-info name="组长电话" br>{{m.leaderPhone}}</sa-info>
+						<sa-info name="" br>{{m.code}}</sa-info>
+						<sa-info name="当天该组剩余额度" br>{{m.leftPrice}}</sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人编号" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建人名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人编号" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新人名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="enum" name="删除状态" :value="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbGroup/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 195 - 0
sa-view/tb-group/tb-group-list.html

@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>互助组-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.addressIds"></sa-item>
+					<sa-item type="text" name="" v-model="p.address"></sa-item>
+					<sa-item type="text" name="" v-model="p.detailAddress"></sa-item>
+					<sa-item type="text" name="名称" v-model="p.name"></sa-item>
+					<sa-item type="text" name="组长ID" v-model="p.leaderId"></sa-item>
+					<sa-item type="text" name="组长名" v-model="p.leaderName"></sa-item>
+					<sa-item type="text" name="组长电话" v-model="p.leaderPhone"></sa-item>
+					<sa-item type="text" name="" v-model="p.code"></sa-item>
+					<sa-item type="text" name="当天该组剩余额度" v-model="p.leftPrice"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人编号" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建人名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人编号" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新人名称" v-model="p.updateName"></sa-item>
+					<sa-item type="enum" name="删除状态" v-model="p.deleteStatus" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-group-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="addressIds" ></sa-td>
+					<sa-td name="" prop="address" ></sa-td>
+					<sa-td name="" prop="detailAddress" ></sa-td>
+					<sa-td name="名称" prop="name" ></sa-td>
+					<sa-td name="组长ID" prop="leaderId" ></sa-td>
+					<sa-td name="组长名" prop="leaderName" ></sa-td>
+					<sa-td name="组长电话" prop="leaderPhone" ></sa-td>
+					<sa-td name="" prop="code" ></sa-td>
+					<sa-td name="当天该组剩余额度" prop="leftPrice" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人编号" prop="createBy" ></sa-td>
+					<sa-td name="创建人名称" prop="createName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人编号" prop="updateBy" ></sa-td>
+					<sa-td name="更新人名称" prop="updateName" ></sa-td>
+					<sa-td name="删除状态" prop="deleteStatus" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateDeleteStatus(s.row)"></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 v-if="sa.isAuth('tb-group-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-group-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		//  
+						addressIds: '',		//  
+						address: '',		//  
+						detailAddress: '',		//  
+						name: '',		// 名称 
+						leaderId: '',		// 组长ID 
+						leaderName: '',		// 组长名 
+						leaderPhone: '',		// 组长电话 
+						code: '',		//  
+						leftPrice: '',		// 当天该组剩余额度 
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人编号 
+						createName: '',		// 创建人名称 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人编号 
+						updateName: '',		// 更新人名称 
+						deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbGroup/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-group-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-group-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-group-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbGroup/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbGroup/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 删除状态(0=禁用,1=启用)
+					updateDeleteStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.deleteStatus;
+						var ajax = sa.ajax('/level-one-server/TbGroup/updateDeleteStatus', {id: data.id, value: data.deleteStatus}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 172 - 0
sa-view/tb-logistics/tb-logistics-add.html

@@ -0,0 +1,172 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.ordersId" br></sa-item>
+						<sa-item type="text" name="申报订单号" v-model="m.declarationNumber" br></sa-item>
+						<sa-item type="enum" name="订单待确认" v-model="m.prepare" :jv="{0: '待确认', 1: '订单已确认', 2: '订单确认失败'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="订单确认时间" v-model="m.prepareTime" br></sa-item>
+						<sa-item type="enum" name="待装货" v-model="m.loading" :jv="{0: '待装货', 1: '已装货'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="已装货时间" v-model="m.loadingTime" br></sa-item>
+						<sa-item type="enum" name="发货" v-model="m.delivery" :jv="{0: '未发', 1: '已发'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="发货时间" v-model="m.deliveryTime" br></sa-item>
+						<sa-item type="enum" name="已出海关" v-model="m.clearedCustom" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="出海关时间" v-model="m.clearedCustomTime" br></sa-item>
+						<sa-item type="enum" name="接货人确定接货" v-model="m.makeCargo" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="接货完成时间" v-model="m.makeCargoTime" br></sa-item>
+						<sa-item type="enum" name="收购商确认" v-model="m.confirmReceipt" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="收货方确认时间" v-model="m.confirmReceiptTime" br></sa-item>
+						<sa-item type="enum" name="订单状态已完成" v-model="m.orderFinish" :jv="{0: '进行中', 1: '已完成'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人编号" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建人名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人编号" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新人名称" v-model="m.updateName" br></sa-item>
+						<sa-item type="enum" name="删除状态" v-model="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 物流表主键 
+							ordersId: '',		// 订单表ID 
+							declarationNumber: '',		// (预留字段) 申报订单号 
+							prepare: '',		// 订单待确认(0=待确认,1=订单已确认,2=订单确认失败) 
+							prepareTime: '',		// 订单确认时间 
+							loading: '',		// 待装货(0=待装货,1=已装货) 
+							loadingTime: '',		// 已装货时间 
+							delivery: '',		// 发货(0=未发,1=已发) 
+							deliveryTime: '',		// 发货时间 
+							clearedCustom: '',		// 已出海关(0=禁用,1=启用) 
+							clearedCustomTime: '',		// 出海关时间 
+							makeCargo: '',		// 接货人确定接货(0=禁用,1=启用) 
+							makeCargoTime: '',		// 接货完成时间 
+							confirmReceipt: '',		// 收购商确认(0=禁用,1=启用) 
+							confirmReceiptTime: '',		// 收货方确认时间(相当于订单完成时间) 
+							orderFinish: '',		// 订单状态已完成(0=进行中,1=已完成) 
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人编号 
+							createName: '',		// 创建人名称 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人编号 
+							updateName: '',		// 更新人名称 
+							deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.id, '请输入 [物流表主键]');
+						sa.checkNull(m.ordersId, '请输入 [订单表ID]');
+						sa.checkNull(m.declarationNumber, '请输入 [申报订单号]');
+						sa.checkNull(m.prepare, '请输入 [订单待确认]');
+						sa.checkNull(m.prepareTime, '请输入 [订单确认时间]');
+						sa.checkNull(m.loading, '请输入 [待装货]');
+						sa.checkNull(m.loadingTime, '请输入 [已装货时间]');
+						sa.checkNull(m.delivery, '请输入 [发货]');
+						sa.checkNull(m.deliveryTime, '请输入 [发货时间]');
+						sa.checkNull(m.clearedCustom, '请输入 [已出海关]');
+						sa.checkNull(m.clearedCustomTime, '请输入 [出海关时间]');
+						sa.checkNull(m.makeCargo, '请输入 [接货人确定接货]');
+						sa.checkNull(m.makeCargoTime, '请输入 [接货完成时间]');
+						sa.checkNull(m.confirmReceipt, '请输入 [收购商确认]');
+						sa.checkNull(m.confirmReceiptTime, '请输入 [收货方确认时间]');
+						sa.checkNull(m.orderFinish, '请输入 [订单状态已完成]');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人编号]');
+						sa.checkNull(m.createName, '请输入 [创建人名称]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人编号]');
+						sa.checkNull(m.updateName, '请输入 [更新人名称]');
+						sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbLogistics/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbLogistics/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbLogistics/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 84 - 0
sa-view/tb-logistics/tb-logistics-info.html

@@ -0,0 +1,84 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="物流表主键" :value="m.id" br></sa-info>
+						<sa-info name="订单表ID" br>{{m.ordersId}}</sa-info>
+						<sa-info name="申报订单号" br>{{m.declarationNumber}}</sa-info>
+						<sa-info type="enum" name="订单待确认" :value="m.prepare" :jv="{0: '待确认', 1: '订单已确认', 2: '订单确认失败'}" br></sa-info>
+						<sa-info name="订单确认时间" br>{{m.prepareTime}}</sa-info>
+						<sa-info type="enum" name="待装货" :value="m.loading" :jv="{0: '待装货', 1: '已装货'}" br></sa-info>
+						<sa-info name="已装货时间" br>{{m.loadingTime}}</sa-info>
+						<sa-info type="enum" name="发货" :value="m.delivery" :jv="{0: '未发', 1: '已发'}" br></sa-info>
+						<sa-info name="发货时间" br>{{m.deliveryTime}}</sa-info>
+						<sa-info type="enum" name="已出海关" :value="m.clearedCustom" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+						<sa-info name="出海关时间" br>{{m.clearedCustomTime}}</sa-info>
+						<sa-info type="enum" name="接货人确定接货" :value="m.makeCargo" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+						<sa-info name="接货完成时间" br>{{m.makeCargoTime}}</sa-info>
+						<sa-info type="enum" name="收购商确认" :value="m.confirmReceipt" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+						<sa-info name="收货方确认时间" br>{{m.confirmReceiptTime}}</sa-info>
+						<sa-info type="enum" name="订单状态已完成" :value="m.orderFinish" :jv="{0: '进行中', 1: '已完成'}" br></sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人编号" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建人名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人编号" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新人名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="enum" name="删除状态" :value="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbLogistics/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 332 - 0
sa-view/tb-logistics/tb-logistics-list.html

@@ -0,0 +1,332 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>物流表-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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="订单表ID" v-model="p.ordersId"></sa-item>
+					<sa-item type="text" name="申报订单号" v-model="p.declarationNumber"></sa-item>
+					<sa-item type="enum" name="订单待确认" v-model="p.prepare" 
+						:jv="{0: '待确认', 1: '订单已确认', 2: '订单确认失败'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="订单确认时间" v-model="p.prepareTime"></sa-item>
+					<sa-item type="enum" name="待装货" v-model="p.loading" 
+						:jv="{0: '待装货', 1: '已装货'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="已装货时间" v-model="p.loadingTime"></sa-item>
+					<sa-item type="enum" name="发货" v-model="p.delivery" 
+						:jv="{0: '未发', 1: '已发'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="发货时间" v-model="p.deliveryTime"></sa-item>
+					<sa-item type="enum" name="已出海关" v-model="p.clearedCustom" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="出海关时间" v-model="p.clearedCustomTime"></sa-item>
+					<sa-item type="enum" name="接货人确定接货" v-model="p.makeCargo" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="接货完成时间" v-model="p.makeCargoTime"></sa-item>
+					<sa-item type="enum" name="收购商确认" v-model="p.confirmReceipt" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="收货方确认时间" v-model="p.confirmReceiptTime"></sa-item>
+					<sa-item type="enum" name="订单状态已完成" v-model="p.orderFinish" 
+						:jv="{0: '进行中', 1: '已完成'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人编号" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建人名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人编号" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新人名称" v-model="p.updateName"></sa-item>
+					<sa-item type="enum" name="删除状态" v-model="p.deleteStatus" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-logistics-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="订单表ID" prop="ordersId" ></sa-td>
+					<sa-td name="申报订单号" prop="declarationNumber" ></sa-td>
+					<sa-td name="订单待确认" prop="prepare" type="switch" :jv="{0: '待确认', 1: '订单已确认', 2: '订单确认失败'}" @change="s => updatePrepare(s.row)"></sa-td>
+					<sa-td name="订单确认时间" prop="prepareTime" ></sa-td>
+					<sa-td name="待装货" prop="loading" type="switch" :jv="{0: '待装货', 1: '已装货'}" @change="s => updateLoading(s.row)"></sa-td>
+					<sa-td name="已装货时间" prop="loadingTime" ></sa-td>
+					<sa-td name="发货" prop="delivery" type="switch" :jv="{0: '未发', 1: '已发'}" @change="s => updateDelivery(s.row)"></sa-td>
+					<sa-td name="发货时间" prop="deliveryTime" ></sa-td>
+					<sa-td name="已出海关" prop="clearedCustom" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateClearedCustom(s.row)"></sa-td>
+					<sa-td name="出海关时间" prop="clearedCustomTime" ></sa-td>
+					<sa-td name="接货人确定接货" prop="makeCargo" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateMakeCargo(s.row)"></sa-td>
+					<sa-td name="接货完成时间" prop="makeCargoTime" ></sa-td>
+					<sa-td name="收购商确认" prop="confirmReceipt" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateConfirmReceipt(s.row)"></sa-td>
+					<sa-td name="收货方确认时间" prop="confirmReceiptTime" ></sa-td>
+					<sa-td name="订单状态已完成" prop="orderFinish" type="switch" :jv="{0: '进行中', 1: '已完成'}" @change="s => updateOrderFinish(s.row)"></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人编号" prop="createBy" ></sa-td>
+					<sa-td name="创建人名称" prop="createName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人编号" prop="updateBy" ></sa-td>
+					<sa-td name="更新人名称" prop="updateName" ></sa-td>
+					<sa-td name="删除状态" prop="deleteStatus" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateDeleteStatus(s.row)"></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 v-if="sa.isAuth('tb-logistics-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-logistics-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 物流表主键 
+						ordersId: '',		// 订单表ID 
+						declarationNumber: '',		// (预留字段) 申报订单号 
+						prepare: '',		// 订单待确认(0=待确认,1=订单已确认,2=订单确认失败) 
+						prepareTime: '',		// 订单确认时间 
+						loading: '',		// 待装货(0=待装货,1=已装货) 
+						loadingTime: '',		// 已装货时间 
+						delivery: '',		// 发货(0=未发,1=已发) 
+						deliveryTime: '',		// 发货时间 
+						clearedCustom: '',		// 已出海关(0=禁用,1=启用) 
+						clearedCustomTime: '',		// 出海关时间 
+						makeCargo: '',		// 接货人确定接货(0=禁用,1=启用) 
+						makeCargoTime: '',		// 接货完成时间 
+						confirmReceipt: '',		// 收购商确认(0=禁用,1=启用) 
+						confirmReceiptTime: '',		// 收货方确认时间(相当于订单完成时间) 
+						orderFinish: '',		// 订单状态已完成(0=进行中,1=已完成) 
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人编号 
+						createName: '',		// 创建人名称 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人编号 
+						updateName: '',		// 更新人名称 
+						deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbLogistics/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-logistics-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-logistics-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-logistics-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbLogistics/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbLogistics/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 订单待确认(0=待确认,1=订单已确认,2=订单确认失败)
+					updatePrepare: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.prepare;
+						var ajax = sa.ajax('/level-one-server/TbLogistics/updatePrepare', {id: data.id, value: data.prepare}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 待装货(0=待装货,1=已装货)
+					updateLoading: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.loading;
+						var ajax = sa.ajax('/TbLogistics/updateLoading', {id: data.id, value: data.loading}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 发货(0=未发,1=已发)
+					updateDelivery: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.delivery;
+						var ajax = sa.ajax('/TbLogistics/updateDelivery', {id: data.id, value: data.delivery}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 已出海关(0=禁用,1=启用)
+					updateClearedCustom: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.clearedCustom;
+						var ajax = sa.ajax('/TbLogistics/updateClearedCustom', {id: data.id, value: data.clearedCustom}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 接货人确定接货(0=禁用,1=启用)
+					updateMakeCargo: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.makeCargo;
+						var ajax = sa.ajax('/TbLogistics/updateMakeCargo', {id: data.id, value: data.makeCargo}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 收购商确认(0=禁用,1=启用)
+					updateConfirmReceipt: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.confirmReceipt;
+						var ajax = sa.ajax('/TbLogistics/updateConfirmReceipt', {id: data.id, value: data.confirmReceipt}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 订单状态已完成(0=进行中,1=已完成)
+					updateOrderFinish: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.orderFinish;
+						var ajax = sa.ajax('/TbLogistics/updateOrderFinish', {id: data.id, value: data.orderFinish}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 删除状态(0=禁用,1=启用)
+					updateDeleteStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.deleteStatus;
+						var ajax = sa.ajax('/TbLogistics/updateDeleteStatus', {id: data.id, value: data.deleteStatus}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 172 - 0
sa-view/tb-orders/tb-orders-add.html

@@ -0,0 +1,172 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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="订单编号" v-model="m.orderNo" br></sa-item>
+						<sa-item type="text" name="商品id" v-model="m.goodsId" br></sa-item>
+						<sa-item type="text" name="商品名称" v-model="m.goodsName" br></sa-item>
+						<sa-item type="text" name="商品来源" v-model="m.goodsFrom" br></sa-item>
+						<sa-item type="text" name="发货商电话" v-model="m.shipperPhone" br></sa-item>
+						<sa-item type="text" name="发货商名称" v-model="m.shipperName" br></sa-item>
+						<sa-item type="text" name="司机ID" v-model="m.driverId" br></sa-item>
+						<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="text" name="车型ID" v-model="m.carId" br></sa-item>
+						<sa-item type="text" name="车型名称" v-model="m.carType" br></sa-item>
+						<sa-item type="text" name="收货人名称" v-model="m.consigneeName" br></sa-item>
+						<sa-item type="text" name="收货人电话号码" v-model="m.consigneePhone" br></sa-item>
+						<sa-item type="text" name="申报订单号" v-model="m.declarationNumber" br></sa-item>
+						<sa-item type="enum" name="订单状态已完成" v-model="m.orderFinish" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人编号" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建人名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人编号" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新人名称" v-model="m.updateName" br></sa-item>
+						<sa-item type="enum" name="删除状态" v-model="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 货运订单管理表主键 
+							orderNo: '',		// 订单编号 
+							goodsId: '',		// 商品id 
+							goodsName: '',		// 商品名称 
+							goodsFrom: '',		// 商品来源(国家) 
+							shipperPhone: '',		// 发货商电话 
+							shipperName: '',		// 发货商名称 
+							driverId: '',		// 司机ID 
+							driverName: '',		// 司机名称 
+							driverPhone: '',		// 司机电话 
+							carId: '',		// 车型ID 
+							carType: '',		// 车型名称 
+							consigneeName: '',		// 收货人名称 
+							consigneePhone: '',		// 收货人电话号码 
+							declarationNumber: '',		// (预留字段) 申报订单号 
+							orderFinish: '',		// 订单状态已完成 (0=禁用,1=启用) 
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人编号 
+							createName: '',		// 创建人名称 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人编号 
+							updateName: '',		// 更新人名称 
+							deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.id, '请输入 [货运订单管理表主键]');
+						sa.checkNull(m.orderNo, '请输入 [订单编号]');
+						sa.checkNull(m.goodsId, '请输入 [商品id]');
+						sa.checkNull(m.goodsName, '请输入 [商品名称]');
+						sa.checkNull(m.goodsFrom, '请输入 [商品来源]');
+						sa.checkNull(m.shipperPhone, '请输入 [发货商电话]');
+						sa.checkNull(m.shipperName, '请输入 [发货商名称]');
+						sa.checkNull(m.driverId, '请输入 [司机ID]');
+						sa.checkNull(m.driverName, '请输入 [司机名称]');
+						sa.checkNull(m.driverPhone, '请输入 [司机电话]');
+						sa.checkNull(m.carId, '请输入 [车型ID]');
+						sa.checkNull(m.carType, '请输入 [车型名称]');
+						sa.checkNull(m.consigneeName, '请输入 [收货人名称]');
+						sa.checkNull(m.consigneePhone, '请输入 [收货人电话号码]');
+						sa.checkNull(m.declarationNumber, '请输入 [申报订单号]');
+						sa.checkNull(m.orderFinish, '请输入 [订单状态已完成]');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人编号]');
+						sa.checkNull(m.createName, '请输入 [创建人名称]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人编号]');
+						sa.checkNull(m.updateName, '请输入 [更新人名称]');
+						sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbOrders/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbOrders/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbOrders/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 84 - 0
sa-view/tb-orders/tb-orders-info.html

@@ -0,0 +1,84 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="货运订单管理表主键" :value="m.id" br></sa-info>
+						<sa-info name="订单编号" br>{{m.orderNo}}</sa-info>
+						<sa-info name="商品id" br>{{m.goodsId}}</sa-info>
+						<sa-info name="商品名称" br>{{m.goodsName}}</sa-info>
+						<sa-info name="商品来源" br>{{m.goodsFrom}}</sa-info>
+						<sa-info name="发货商电话" br>{{m.shipperPhone}}</sa-info>
+						<sa-info name="发货商名称" br>{{m.shipperName}}</sa-info>
+						<sa-info name="司机ID" br>{{m.driverId}}</sa-info>
+						<sa-info name="司机名称" br>{{m.driverName}}</sa-info>
+						<sa-info name="司机电话" br>{{m.driverPhone}}</sa-info>
+						<sa-info name="车型ID" br>{{m.carId}}</sa-info>
+						<sa-info name="车型名称" br>{{m.carType}}</sa-info>
+						<sa-info name="收货人名称" br>{{m.consigneeName}}</sa-info>
+						<sa-info name="收货人电话号码" br>{{m.consigneePhone}}</sa-info>
+						<sa-info name="申报订单号" br>{{m.declarationNumber}}</sa-info>
+						<sa-info type="enum" name="订单状态已完成" :value="m.orderFinish" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人编号" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建人名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人编号" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新人名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="enum" name="删除状态" :value="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbOrders/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 230 - 0
sa-view/tb-orders/tb-orders-list.html

@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>订单表-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.orderNo"></sa-item>
+					<sa-item type="text" name="商品id" v-model="p.goodsId"></sa-item>
+					<sa-item type="text" name="商品名称" v-model="p.goodsName"></sa-item>
+					<sa-item type="text" name="商品来源" v-model="p.goodsFrom"></sa-item>
+					<sa-item type="text" name="发货商电话" v-model="p.shipperPhone"></sa-item>
+					<sa-item type="text" name="发货商名称" v-model="p.shipperName"></sa-item>
+					<sa-item type="text" name="司机ID" v-model="p.driverId"></sa-item>
+					<sa-item type="text" name="司机名称" v-model="p.driverName"></sa-item>
+					<sa-item type="text" name="司机电话" v-model="p.driverPhone"></sa-item>
+					<sa-item type="text" name="车型ID" v-model="p.carId"></sa-item>
+					<sa-item type="text" name="车型名称" v-model="p.carType"></sa-item>
+					<sa-item type="text" name="收货人名称" v-model="p.consigneeName"></sa-item>
+					<sa-item type="text" name="收货人电话号码" v-model="p.consigneePhone"></sa-item>
+					<sa-item type="text" name="申报订单号" v-model="p.declarationNumber"></sa-item>
+					<sa-item type="enum" name="订单状态已完成" v-model="p.orderFinish" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人编号" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建人名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人编号" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新人名称" v-model="p.updateName"></sa-item>
+					<sa-item type="enum" name="删除状态" v-model="p.deleteStatus" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-orders-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="orderNo" ></sa-td>
+					<sa-td name="商品id" prop="goodsId" ></sa-td>
+					<sa-td name="商品名称" prop="goodsName" ></sa-td>
+					<sa-td name="商品来源" prop="goodsFrom" ></sa-td>
+					<sa-td name="发货商电话" prop="shipperPhone" ></sa-td>
+					<sa-td name="发货商名称" prop="shipperName" ></sa-td>
+					<sa-td name="司机ID" prop="driverId" ></sa-td>
+					<sa-td name="司机名称" prop="driverName" ></sa-td>
+					<sa-td name="司机电话" prop="driverPhone" ></sa-td>
+					<sa-td name="车型ID" prop="carId" ></sa-td>
+					<sa-td name="车型名称" prop="carType" ></sa-td>
+					<sa-td name="收货人名称" prop="consigneeName" ></sa-td>
+					<sa-td name="收货人电话号码" prop="consigneePhone" ></sa-td>
+					<sa-td name="申报订单号" prop="declarationNumber" ></sa-td>
+					<sa-td name="订单状态已完成" prop="orderFinish" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateOrderFinish(s.row)"></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人编号" prop="createBy" ></sa-td>
+					<sa-td name="创建人名称" prop="createName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人编号" prop="updateBy" ></sa-td>
+					<sa-td name="更新人名称" prop="updateName" ></sa-td>
+					<sa-td name="删除状态" prop="deleteStatus" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateDeleteStatus(s.row)"></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 v-if="sa.isAuth('tb-orders-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-orders-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 货运订单管理表主键 
+						orderNo: '',		// 订单编号 
+						goodsId: '',		// 商品id 
+						goodsName: '',		// 商品名称 
+						goodsFrom: '',		// 商品来源(国家) 
+						shipperPhone: '',		// 发货商电话 
+						shipperName: '',		// 发货商名称 
+						driverId: '',		// 司机ID 
+						driverName: '',		// 司机名称 
+						driverPhone: '',		// 司机电话 
+						carId: '',		// 车型ID 
+						carType: '',		// 车型名称 
+						consigneeName: '',		// 收货人名称 
+						consigneePhone: '',		// 收货人电话号码 
+						declarationNumber: '',		// (预留字段) 申报订单号 
+						orderFinish: '',		// 订单状态已完成 (0=禁用,1=启用) 
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人编号 
+						createName: '',		// 创建人名称 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人编号 
+						updateName: '',		// 更新人名称 
+						deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbOrders/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-orders-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-orders-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-orders-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbOrders/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbOrders/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 订单状态已完成 (0=禁用,1=启用)
+					updateOrderFinish: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.orderFinish;
+						var ajax = sa.ajax('/level-one-server/TbOrders/updateOrderFinish', {id: data.id, value: data.orderFinish}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+					// 改 - 删除状态(0=禁用,1=启用)
+					updateDeleteStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.deleteStatus;
+						var ajax = sa.ajax('/level-one-server/TbOrders/updateDeleteStatus', {id: data.id, value: data.deleteStatus}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 206 - 0
sa-view/tb-people/tb-people-add.html

@@ -0,0 +1,206 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.name" br></sa-item>
+						<sa-item type="text" name="边民号" v-model="m.code" br></sa-item>
+						<sa-item type="enum" name="性别" v-model="m.sex" :jv="{1: '男', 2: '女'}" jtype="3" br></sa-item>
+						<sa-item type="num" name="年龄" v-model="m.age" br></sa-item>
+						<sa-item type="text" name="身份证" v-model="m.idCard" br></sa-item>
+						<sa-item type="img-list" name="身份证复印件" v-model="m.idCardImg" br></sa-item>
+						<sa-item type="text" name="手机号码" v-model="m.phone" br></sa-item>
+						<sa-item type="text" name="银行编号" v-model="m.bankNo" br></sa-item>
+						<sa-item type="text" name="银行卡号" v-model="m.bankCode" br></sa-item>
+						<sa-item type="text" name="银行名称" v-model="m.bankName" br></sa-item>
+						<sa-item type="enum" name="所属互助组" v-model="m.groupId" :jv="{1: '测试组'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="互助组名称" v-model="m.groupName" br></sa-item>
+						<sa-item type="enum" name="是否可用" v-model="m.status" :jv="{0: '否', 1: '是'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="经度" v-model="m.lng" br></sa-item>
+						<sa-item type="text" name="纬度" v-model="m.lat" br></sa-item>
+						<sa-item type="text" name="最后一次下单定位" v-model="m.lastLocation" br></sa-item>
+						<sa-item type="text" name="联系地址" v-model="m.address" br></sa-item>
+						<sa-item type="text" name="地址ID" v-model="m.addressIds" br></sa-item>
+						<sa-item type="text" name="详细地址" v-model="m.detailAddress" br></sa-item>
+						<sa-item type="text" name="是否锁定" v-model="m.isLock" br></sa-item>
+						<sa-item type="text" name="当天剩余额度" v-model="m.leftPrice" br></sa-item>
+						<sa-item type="text" name="" v-model="m.judgeStatus" br></sa-item>
+						<sa-item type="text" name="" v-model="m.judgeContent" br></sa-item>
+						<sa-item type="text" name="" v-model="m.registerTime" br></sa-item>
+						<sa-item type="text" name="" v-model="m.judgeTime" br></sa-item>
+						<sa-item type="text" name="" v-model="m.personId" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人编号" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建人名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人编号" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新人名称" v-model="m.updateName" br></sa-item>
+						<sa-item type="enum" name="删除状态" v-model="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							name: '',		// 姓名 
+							code: '',		// 边民号 
+							sex: '',		// 性别(1=男,2=女) 
+							age: '',		// 年龄 
+							idCard: '',		// 身份证 
+							idCardImg: '',		// 身份证复印件 
+							phone: '',		// 手机号码 
+							bankNo: '',		// 银行编号 
+							bankCode: '',		// 银行卡号 
+							bankName: '',		// 银行名称 
+							groupId: '',		// 所属互助组(1=测试组) 
+							groupName: '',		// 互助组名称 
+							status: '',		// 是否可用(0=否,1=是) 
+							role: '',		// 角色(1=普通边民,2=兼组长) 
+							lng: '',		// 经度 
+							lat: '',		// 纬度 
+							lastLocation: '',		// 最后一次下单定位 
+							address: '',		// 联系地址 
+							addressIds: '',		// 地址ID 
+							detailAddress: '',		// 详细地址 
+							isLock: '',		// 是否锁定 
+							leftPrice: '',		// 当天剩余额度 
+							judgeStatus: '',		//  
+							judgeContent: '',		//  
+							registerTime: '',		//  
+							judgeTime: '',		//  
+							personId: '',		//  
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人编号 
+							createName: '',		// 创建人名称 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人编号 
+							updateName: '',		// 更新人名称 
+							deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [姓名]');
+						sa.checkNull(m.code, '请输入 [边民号]');
+						sa.checkNull(m.sex, '请输入 [性别]');
+						sa.checkNull(m.age, '请输入 [年龄]');
+						sa.checkNull(m.idCard, '请输入 [身份证]');
+						sa.checkNull(m.idCardImg, '请输入 [身份证复印件]');
+						sa.checkNull(m.phone, '请输入 [手机号码]');
+						sa.checkNull(m.bankNo, '请输入 [银行编号]');
+						sa.checkNull(m.bankCode, '请输入 [银行卡号]');
+						sa.checkNull(m.bankName, '请输入 [银行名称]');
+						sa.checkNull(m.groupId, '请输入 [所属互助组]');
+						sa.checkNull(m.groupName, '请输入 [互助组名称]');
+						sa.checkNull(m.status, '请输入 [是否可用]');
+						// sa.checkNull(m.role, '请输入 [角色]');
+						sa.checkNull(m.lng, '请输入 [经度]');
+						sa.checkNull(m.lat, '请输入 [纬度]');
+						sa.checkNull(m.lastLocation, '请输入 [最后一次下单定位]');
+						sa.checkNull(m.address, '请输入 [联系地址]');
+						sa.checkNull(m.addressIds, '请输入 [地址ID]');
+						sa.checkNull(m.detailAddress, '请输入 [详细地址]');
+						sa.checkNull(m.isLock, '请输入 [是否锁定]');
+						sa.checkNull(m.leftPrice, '请输入 [当天剩余额度]');
+						sa.checkNull(m.judgeStatus, '请输入 []');
+						sa.checkNull(m.judgeContent, '请输入 []');
+						sa.checkNull(m.registerTime, '请输入 []');
+						sa.checkNull(m.judgeTime, '请输入 []');
+						sa.checkNull(m.personId, '请输入 []');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人编号]');
+						sa.checkNull(m.createName, '请输入 [创建人名称]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人编号]');
+						sa.checkNull(m.updateName, '请输入 [更新人名称]');
+						sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbPeople/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbPeople/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbPeople/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 98 - 0
sa-view/tb-people/tb-people-info.html

@@ -0,0 +1,98 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.c-item .image-box-2{height: 90px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="姓名" br>{{m.name}}</sa-info>
+						<sa-info name="边民号" br>{{m.code}}</sa-info>
+						<sa-info type="enum" name="性别" :value="m.sex" :jv="{1: '男', 2: '女'}" br></sa-info>
+						<sa-info type="num" name="年龄" :value="m.age" br></sa-info>
+						<sa-info name="身份证" br>{{m.idCard}}</sa-info>
+						<sa-info type="img-list" name="身份证复印件" :value="m.idCardImg" br></sa-info>
+						<sa-info name="手机号码" br>{{m.phone}}</sa-info>
+						<sa-info name="银行编号" br>{{m.bankNo}}</sa-info>
+						<sa-info name="银行卡号" br>{{m.bankCode}}</sa-info>
+						<sa-info name="银行名称" br>{{m.bankName}}</sa-info>
+						<sa-info type="enum" name="所属互助组" :value="m.groupId" :jv="{1: '测试组'}" br></sa-info>
+						<sa-info name="互助组名称" br>{{m.groupName}}</sa-info>
+						<sa-info type="enum" name="是否可用" :value="m.status" :jv="{0: '否', 1: '是'}" br></sa-info>
+						<sa-info type="num" name="角色" :value="m.role" br></sa-info>
+						<sa-info name="经度" br>{{m.lng}}</sa-info>
+						<sa-info name="纬度" br>{{m.lat}}</sa-info>
+						<sa-info name="最后一次下单定位" br>{{m.lastLocation}}</sa-info>
+						<sa-info name="联系地址" br>{{m.address}}</sa-info>
+						<sa-info name="地址ID" br>{{m.addressIds}}</sa-info>
+						<sa-info name="详细地址" br>{{m.detailAddress}}</sa-info>
+						<sa-info name="是否锁定" br>{{m.isLock}}</sa-info>
+						<sa-info name="当天剩余额度" br>{{m.leftPrice}}</sa-info>
+						<sa-info name="" br>{{m.judgeStatus}}</sa-info>
+						<sa-info name="" br>{{m.judgeContent}}</sa-info>
+						<sa-info name="" br>{{m.registerTime}}</sa-info>
+						<sa-info name="" br>{{m.judgeTime}}</sa-info>
+						<sa-info name="" br>{{m.personId}}</sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人编号" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建人名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人编号" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新人名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="enum" name="删除状态" :value="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbPeople/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 250 - 0
sa-view/tb-people/tb-people-list.html

@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>边民-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.name"></sa-item>
+					<sa-item type="text" name="边民号" v-model="p.code"></sa-item>
+					<sa-item type="enum" name="性别" v-model="p.sex" 
+						:jv="{1: '男', 2: '女'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="num" name="年龄" v-model="p.age"></sa-item>
+					<sa-item type="text" name="身份证" v-model="p.idCard"></sa-item>
+					<sa-item type="text" name="手机号码" v-model="p.phone"></sa-item>
+					<sa-item type="text" name="银行编号" v-model="p.bankNo"></sa-item>
+					<sa-item type="text" name="银行卡号" v-model="p.bankCode"></sa-item>
+					<sa-item type="text" name="银行名称" v-model="p.bankName"></sa-item>
+					<sa-item type="enum" name="所属互助组" v-model="p.groupId" 
+						:jv="{1: '测试组'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="互助组名称" v-model="p.groupName"></sa-item>
+					<sa-item type="enum" name="是否可用" v-model="p.status" 
+						:jv="{0: '否', 1: '是'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="num" name="角色" v-model="p.role"></sa-item>
+					<sa-item type="text" name="经度" v-model="p.lng"></sa-item>
+					<sa-item type="text" name="纬度" v-model="p.lat"></sa-item>
+					<sa-item type="text" name="最后一次下单定位" v-model="p.lastLocation"></sa-item>
+					<sa-item type="text" name="联系地址" v-model="p.address"></sa-item>
+					<sa-item type="text" name="地址ID" v-model="p.addressIds"></sa-item>
+					<sa-item type="text" name="详细地址" v-model="p.detailAddress"></sa-item>
+					<sa-item type="text" name="是否锁定" v-model="p.isLock"></sa-item>
+					<sa-item type="text" name="当天剩余额度" v-model="p.leftPrice"></sa-item>
+					<sa-item type="text" name="" v-model="p.judgeStatus"></sa-item>
+					<sa-item type="text" name="" v-model="p.judgeContent"></sa-item>
+					<sa-item type="text" name="" v-model="p.registerTime"></sa-item>
+					<sa-item type="text" name="" v-model="p.judgeTime"></sa-item>
+					<sa-item type="text" name="" v-model="p.personId"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人编号" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建人名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人编号" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新人名称" v-model="p.updateName"></sa-item>
+					<sa-item type="enum" name="删除状态" v-model="p.deleteStatus" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-people-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="name" ></sa-td>
+					<sa-td name="边民号" prop="code" ></sa-td>
+					<sa-td name="性别" prop="sex" type="enum" :jv="{1: '男', 2: '女'}"></sa-td>
+					<sa-td name="年龄" prop="age" type="num"></sa-td>
+					<sa-td name="身份证" prop="idCard" ></sa-td>
+					<sa-td name="身份证复印件" prop="idCardImg" type="img-list"></sa-td>
+					<sa-td name="手机号码" prop="phone" ></sa-td>
+					<sa-td name="银行编号" prop="bankNo" ></sa-td>
+					<sa-td name="银行卡号" prop="bankCode" ></sa-td>
+					<sa-td name="银行名称" prop="bankName" ></sa-td>
+					<sa-td name="所属互助组" prop="groupId" type="enum" :jv="{1: '测试组'}"></sa-td>
+					<sa-td name="互助组名称" prop="groupName" ></sa-td>
+					<sa-td name="是否可用" prop="status" type="enum" :jv="{0: '否', 1: '是'}"></sa-td>
+					<sa-td name="角色" prop="role" type="num"></sa-td>
+					<sa-td name="经度" prop="lng" ></sa-td>
+					<sa-td name="纬度" prop="lat" ></sa-td>
+					<sa-td name="最后一次下单定位" prop="lastLocation" ></sa-td>
+					<sa-td name="联系地址" prop="address" ></sa-td>
+					<sa-td name="地址ID" prop="addressIds" ></sa-td>
+					<sa-td name="详细地址" prop="detailAddress" ></sa-td>
+					<sa-td name="是否锁定" prop="isLock" ></sa-td>
+					<sa-td name="当天剩余额度" prop="leftPrice" ></sa-td>
+					<sa-td name="" prop="judgeStatus" ></sa-td>
+					<sa-td name="" prop="judgeContent" ></sa-td>
+					<sa-td name="" prop="registerTime" ></sa-td>
+					<sa-td name="" prop="judgeTime" ></sa-td>
+					<sa-td name="" prop="personId" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人编号" prop="createBy" ></sa-td>
+					<sa-td name="创建人名称" prop="createName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人编号" prop="updateBy" ></sa-td>
+					<sa-td name="更新人名称" prop="updateName" ></sa-td>
+					<sa-td name="删除状态" prop="deleteStatus" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateDeleteStatus(s.row)"></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 v-if="sa.isAuth('tb-people-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-people-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 姓名 
+						code: '',		// 边民号 
+						sex: '',		// 性别(1=男,2=女) 
+						age: '',		// 年龄 
+						idCard: '',		// 身份证 
+						phone: '',		// 手机号码 
+						bankNo: '',		// 银行编号 
+						bankCode: '',		// 银行卡号 
+						bankName: '',		// 银行名称 
+						groupId: '',		// 所属互助组(1=测试组) 
+						groupName: '',		// 互助组名称 
+						status: '',		// 是否可用(0=否,1=是) 
+						role: '',		// 角色(1=普通边民,2=兼组长) 
+						lng: '',		// 经度 
+						lat: '',		// 纬度 
+						lastLocation: '',		// 最后一次下单定位 
+						address: '',		// 联系地址 
+						addressIds: '',		// 地址ID 
+						detailAddress: '',		// 详细地址 
+						isLock: '',		// 是否锁定 
+						leftPrice: '',		// 当天剩余额度 
+						judgeStatus: '',		//  
+						judgeContent: '',		//  
+						registerTime: '',		//  
+						judgeTime: '',		//  
+						personId: '',		//  
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人编号 
+						createName: '',		// 创建人名称 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人编号 
+						updateName: '',		// 更新人名称 
+						deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbPeople/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-people-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-people-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-people-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbPeople/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbPeople/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 删除状态(0=禁用,1=启用)
+					updateDeleteStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.deleteStatus;
+						var ajax = sa.ajax('/level-one-server/TbPeople/updateDeleteStatus', {id: data.id, value: data.deleteStatus}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 170 - 0
sa-view/tb-purchaser/tb-purchaser-add.html

@@ -0,0 +1,170 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.name" br></sa-item>
+						<sa-item type="text" name="法人" v-model="m.legalPerson" br></sa-item>
+						<sa-item type="text" name="身份证号" v-model="m.idCard" br></sa-item>
+						<sa-item type="text" name="手机号码" v-model="m.contact" br></sa-item>
+						<sa-item type="img-list" name="营业执照" v-model="m.businessLicense" br></sa-item>
+						<sa-item type="text" name="银行编号" v-model="m.bankNo" br></sa-item>
+						<sa-item type="text" name="银行名称" v-model="m.bankName" br></sa-item>
+						<sa-item type="text" name="银行账号" v-model="m.bankAccount" br></sa-item>
+						<sa-item type="text" name="税号" v-model="m.dutyParagraph" br></sa-item>
+						<sa-item type="text" name="地址编号" v-model="m.addressIds" br></sa-item>
+						<sa-item type="text" name="地址" v-model="m.address" br></sa-item>
+						<sa-item type="enum" name="审核状态" v-model="m.judgeStatus" :jv="{0: '未通过', 1: '已通过'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="审核意见" v-model="m.judgeContent" br></sa-item>
+						<sa-item type="text" name="创建时间" v-model="m.createTime" br></sa-item>
+						<sa-item type="text" name="创建人编号" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建人名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新时间" v-model="m.updateTime" br></sa-item>
+						<sa-item type="text" name="更新人编号" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新人名称" v-model="m.updateName" br></sa-item>
+						<sa-item type="enum" name="删除状态" v-model="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" jtype="3" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							name: '',		// 名称 
+							legalPerson: '',		// 法人 
+							idCard: '',		// 身份证号 
+							contact: '',		// 手机号码 
+							businessLicense: '',		// 营业执照 
+							bankNo: '',		// 银行编号 
+							bankName: '',		// 银行名称 
+							bankAccount: '',		// 银行账号 
+							dutyParagraph: '',		// 税号 
+							addressIds: '',		// 地址编号 
+							address: '',		// 地址 
+							judgeStatus: '',		// 审核状态(0=未通过,1=已通过) 
+							judgeContent: '',		// 审核意见 
+							judgeTime: '',		// 上次审核时间 
+							registerTime: '',		// 注册时间 
+							personId: '',		// 人脸编号 
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人编号 
+							createName: '',		// 创建人名称 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人编号 
+							updateName: '',		// 更新人名称 
+							deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.legalPerson, '请输入 [法人]');
+						sa.checkNull(m.idCard, '请输入 [身份证号]');
+						sa.checkNull(m.contact, '请输入 [手机号码]');
+						sa.checkNull(m.businessLicense, '请输入 [营业执照]');
+						sa.checkNull(m.bankNo, '请输入 [银行编号]');
+						sa.checkNull(m.bankName, '请输入 [银行名称]');
+						sa.checkNull(m.bankAccount, '请输入 [银行账号]');
+						sa.checkNull(m.dutyParagraph, '请输入 [税号]');
+						sa.checkNull(m.addressIds, '请输入 [地址编号]');
+						sa.checkNull(m.address, '请输入 [地址]');
+						sa.checkNull(m.judgeStatus, '请输入 [审核状态]');
+						sa.checkNull(m.judgeContent, '请输入 [审核意见]');
+						// sa.checkNull(m.judgeTime, '请输入 [上次审核时间]');
+						// sa.checkNull(m.registerTime, '请输入 [注册时间]');
+						// sa.checkNull(m.personId, '请输入 [人脸编号]');
+						sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建人编号]');
+						sa.checkNull(m.createName, '请输入 [创建人名称]');
+						sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新人编号]');
+						sa.checkNull(m.updateName, '请输入 [更新人名称]');
+						sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-two-server/TbPurchaser/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-two-server/TbPurchaser/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-two-server/TbPurchaser/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 86 - 0
sa-view/tb-purchaser/tb-purchaser-info.html

@@ -0,0 +1,86 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+			.c-item .image-box-2{height: 90px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info name="法人" br>{{m.legalPerson}}</sa-info>
+						<sa-info name="身份证号" br>{{m.idCard}}</sa-info>
+						<sa-info name="手机号码" br>{{m.contact}}</sa-info>
+						<sa-info type="img-list" name="营业执照" :value="m.businessLicense" br></sa-info>
+						<sa-info name="银行编号" br>{{m.bankNo}}</sa-info>
+						<sa-info name="银行名称" br>{{m.bankName}}</sa-info>
+						<sa-info name="银行账号" br>{{m.bankAccount}}</sa-info>
+						<sa-info name="税号" br>{{m.dutyParagraph}}</sa-info>
+						<sa-info name="地址编号" br>{{m.addressIds}}</sa-info>
+						<sa-info name="地址" br>{{m.address}}</sa-info>
+						<sa-info type="enum" name="审核状态" :value="m.judgeStatus" :jv="{0: '未通过', 1: '已通过'}" br></sa-info>
+						<sa-info name="审核意见" br>{{m.judgeContent}}</sa-info>
+						<sa-info type="datetime" name="上次审核时间" :value="m.judgeTime" br></sa-info>
+						<sa-info type="datetime" name="注册时间" :value="m.registerTime" br></sa-info>
+						<sa-info type="num" name="人脸编号" :value="m.personId" br></sa-info>
+						<sa-info name="创建时间" br>{{m.createTime}}</sa-info>
+						<sa-info name="创建人编号" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建人名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新时间" br>{{m.updateTime}}</sa-info>
+						<sa-info name="更新人编号" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新人名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="enum" name="删除状态" :value="m.deleteStatus" :jv="{0: '禁用', 1: '启用'}" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-two-server/TbPurchaser/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 211 - 0
sa-view/tb-purchaser/tb-purchaser-list.html

@@ -0,0 +1,211 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>收购商-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.name"></sa-item>
+					<sa-item type="text" name="法人" v-model="p.legalPerson"></sa-item>
+					<sa-item type="text" name="身份证号" v-model="p.idCard"></sa-item>
+					<sa-item type="text" name="手机号码" v-model="p.contact"></sa-item>
+					<sa-item type="text" name="银行编号" v-model="p.bankNo"></sa-item>
+					<sa-item type="text" name="银行名称" v-model="p.bankName"></sa-item>
+					<sa-item type="text" name="银行账号" v-model="p.bankAccount"></sa-item>
+					<sa-item type="text" name="税号" v-model="p.dutyParagraph"></sa-item>
+					<sa-item type="text" name="地址编号" v-model="p.addressIds"></sa-item>
+					<sa-item type="text" name="地址" v-model="p.address"></sa-item>
+					<sa-item type="enum" name="审核状态" v-model="p.judgeStatus" 
+						:jv="{0: '未通过', 1: '已通过'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="审核意见" v-model="p.judgeContent"></sa-item>
+					<sa-item type="num" name="人脸编号" v-model="p.personId"></sa-item>
+					<sa-item type="text" name="创建时间" v-model="p.createTime"></sa-item>
+					<sa-item type="text" name="创建人编号" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建人名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新时间" v-model="p.updateTime"></sa-item>
+					<sa-item type="text" name="更新人编号" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新人名称" v-model="p.updateName"></sa-item>
+					<sa-item type="enum" name="删除状态" v-model="p.deleteStatus" 
+						:jv="{0: '禁用', 1: '启用'}" jtype="2" def="不限"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-purchaser-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="name" ></sa-td>
+					<sa-td name="法人" prop="legalPerson" ></sa-td>
+					<sa-td name="身份证号" prop="idCard" ></sa-td>
+					<sa-td name="手机号码" prop="contact" ></sa-td>
+					<sa-td name="营业执照" prop="businessLicense" type="img-list"></sa-td>
+					<sa-td name="银行编号" prop="bankNo" ></sa-td>
+					<sa-td name="银行名称" prop="bankName" ></sa-td>
+					<sa-td name="银行账号" prop="bankAccount" ></sa-td>
+					<sa-td name="税号" prop="dutyParagraph" ></sa-td>
+					<sa-td name="地址编号" prop="addressIds" ></sa-td>
+					<sa-td name="地址" prop="address" ></sa-td>
+					<sa-td name="审核状态" prop="judgeStatus" type="enum" :jv="{0: '未通过', 1: '已通过'}"></sa-td>
+					<sa-td name="审核意见" prop="judgeContent" ></sa-td>
+					<sa-td name="上次审核时间" prop="judgeTime" type="datetime"></sa-td>
+					<sa-td name="注册时间" prop="registerTime" type="datetime"></sa-td>
+					<sa-td name="人脸编号" prop="personId" type="num"></sa-td>
+					<sa-td name="创建时间" prop="createTime" ></sa-td>
+					<sa-td name="创建人编号" prop="createBy" ></sa-td>
+					<sa-td name="创建人名称" prop="createName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" ></sa-td>
+					<sa-td name="更新人编号" prop="updateBy" ></sa-td>
+					<sa-td name="更新人名称" prop="updateName" ></sa-td>
+					<sa-td name="删除状态" prop="deleteStatus" type="switch" :jv="{0: '禁用', 1: '启用'}" @change="s => updateDeleteStatus(s.row)"></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 v-if="sa.isAuth('tb-purchaser-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-purchaser-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 名称 
+						legalPerson: '',		// 法人 
+						idCard: '',		// 身份证号 
+						contact: '',		// 手机号码 
+						bankNo: '',		// 银行编号 
+						bankName: '',		// 银行名称 
+						bankAccount: '',		// 银行账号 
+						dutyParagraph: '',		// 税号 
+						addressIds: '',		// 地址编号 
+						address: '',		// 地址 
+						judgeStatus: '',		// 审核状态(0=未通过,1=已通过) 
+						judgeContent: '',		// 审核意见 
+						personId: '',		// 人脸编号 
+						createTime: '',		// 创建时间 
+						createBy: '',		// 创建人编号 
+						createName: '',		// 创建人名称 
+						updateTime: '',		// 更新时间 
+						updateBy: '',		// 更新人编号 
+						updateName: '',		// 更新人名称 
+						deleteStatus: '',		// 删除状态(0=禁用,1=启用) 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-two-server/TbPurchaser/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-purchaser-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-purchaser-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-purchaser-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-two-server/TbPurchaser/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-two-server/TbPurchaser/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 删除状态(0=禁用,1=启用)
+					updateDeleteStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.deleteStatus;
+						var ajax = sa.ajax('/level-two-server/TbPurchaser/updateDeleteStatus', {id: data.id, value: data.deleteStatus}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 160 - 0
sa-view/tb-shop/tb-shop-add.html

@@ -0,0 +1,160 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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.enterpriseId" br></sa-item>
+						<sa-item type="text" name="创建者id" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建者名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新者名称" v-model="m.updateName" br></sa-item>
+						<!-- date-create字段: m.createTime - 创建时间 -->
+						<sa-item type="text" name="更新者id" v-model="m.updateBy" br></sa-item>
+						<!-- date-update字段: m.updateTime - 更新时间 -->
+						<sa-item type="text" name="" v-model="m.tradeAreaId" br></sa-item>
+						<sa-item type="text" name="" v-model="m.tradeAreaName" br></sa-item>
+						<sa-item type="text" name="" v-model="m.address" br></sa-item>
+						<sa-item type="text" name="" v-model="m.addressIds" br></sa-item>
+						<sa-item type="text" name="名称" v-model="m.name" br></sa-item>
+						<sa-item type="text" name="编号" v-model="m.no" br></sa-item>
+						<sa-item type="enum" name="区域" v-model="m.area" :jv="{A区: 'A区', B区: 'B区', C区: 'C区'}" jtype="3" br></sa-item>
+						<sa-item type="enum" name="是否可用" v-model="m.status" :jv="{0: '否', 1: '是'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="" v-model="m.remark" br></sa-item>
+						<sa-item type="text" name="" v-model="m.enterpriseName" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							enterpriseId: '',		//  
+							createBy: '',		// 创建者id 
+							createName: '',		// 创建者名称 
+							updateName: '',		// 更新者名称 
+							// createTime: '',		// 创建时间 
+							updateBy: '',		// 更新者id 
+							// updateTime: '',		// 更新时间 
+							tradeAreaId: '',		//  
+							tradeAreaName: '',		//  
+							address: '',		//  
+							addressIds: '',		//  
+							name: '',		// 名称 
+							no: '',		// 编号 
+							area: '',		// 区域(A区=A区,B区=B区,C区=C区) 
+							status: '',		// 是否可用(0=否,1=是) 
+							remark: '',		//  
+							enterpriseName: '',		//  
+							// deleteStatus: '',		// 删除状态 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.enterpriseId, '请输入 []');
+						sa.checkNull(m.createBy, '请输入 [创建者id]');
+						sa.checkNull(m.createName, '请输入 [创建者名称]');
+						sa.checkNull(m.updateName, '请输入 [更新者名称]');
+						// sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新者id]');
+						// sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						sa.checkNull(m.tradeAreaId, '请输入 []');
+						sa.checkNull(m.tradeAreaName, '请输入 []');
+						sa.checkNull(m.address, '请输入 []');
+						sa.checkNull(m.addressIds, '请输入 []');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.no, '请输入 [编号]');
+						sa.checkNull(m.area, '请输入 [区域]');
+						sa.checkNull(m.status, '请输入 [是否可用]');
+						sa.checkNull(m.remark, '请输入 []');
+						sa.checkNull(m.enterpriseName, '请输入 []');
+						// sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						this.m.createTime = undefined;		// 不提交属性:创建时间
+						this.m.updateTime = undefined;		// 不提交属性:更新时间
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbShop/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbShop/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbShop/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 79 - 0
sa-view/tb-shop/tb-shop-info.html

@@ -0,0 +1,79 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="" br>{{m.enterpriseId}}</sa-info>
+						<sa-info name="创建者id" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建者名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新者名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="datetime" name="创建时间" :value="m.createTime" br></sa-info>
+						<sa-info name="更新者id" br>{{m.updateBy}}</sa-info>
+						<sa-info type="datetime" name="更新时间" :value="m.updateTime" br></sa-info>
+						<sa-info name="" br>{{m.tradeAreaId}}</sa-info>
+						<sa-info name="" br>{{m.tradeAreaName}}</sa-info>
+						<sa-info name="" br>{{m.address}}</sa-info>
+						<sa-info name="" br>{{m.addressIds}}</sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info name="编号" br>{{m.no}}</sa-info>
+						<sa-info type="enum" name="区域" :value="m.area" :jv="{A区: 'A区', B区: 'B区', C区: 'C区'}" br></sa-info>
+						<sa-info type="enum" name="是否可用" :value="m.status" :jv="{0: '否', 1: '是'}" br></sa-info>
+						<sa-info name="" br>{{m.remark}}</sa-info>
+						<sa-info name="" br>{{m.enterpriseName}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbShop/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 196 - 0
sa-view/tb-shop/tb-shop-list.html

@@ -0,0 +1,196 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>铺位-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.enterpriseId"></sa-item>
+					<sa-item type="text" name="创建者id" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建者名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新者名称" v-model="p.updateName"></sa-item>
+					<sa-item type="text" name="更新者id" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="" v-model="p.tradeAreaId"></sa-item>
+					<sa-item type="text" name="" v-model="p.tradeAreaName"></sa-item>
+					<sa-item type="text" name="" v-model="p.address"></sa-item>
+					<sa-item type="text" name="" v-model="p.addressIds"></sa-item>
+					<sa-item type="text" name="名称" v-model="p.name"></sa-item>
+					<sa-item type="text" name="编号" v-model="p.no"></sa-item>
+					<sa-item type="enum" name="区域" v-model="p.area" 
+						:jv="{A区: 'A区', B区: 'B区', C区: 'C区'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="enum" name="是否可用" v-model="p.status" 
+						:jv="{0: '否', 1: '是'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="" v-model="p.remark"></sa-item>
+					<sa-item type="text" name="" v-model="p.enterpriseName"></sa-item>
+					<!-- 未识别类型:删除状态: p.deleteStatus 请检查配置 -->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-shop-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="enterpriseId" ></sa-td>
+					<sa-td name="创建者id" prop="createBy" ></sa-td>
+					<sa-td name="创建者名称" prop="createName" ></sa-td>
+					<sa-td name="更新者名称" prop="updateName" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" type="datetime"></sa-td>
+					<sa-td name="更新者id" prop="updateBy" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" type="datetime"></sa-td>
+					<sa-td name="" prop="tradeAreaId" ></sa-td>
+					<sa-td name="" prop="tradeAreaName" ></sa-td>
+					<sa-td name="" prop="address" ></sa-td>
+					<sa-td name="" prop="addressIds" ></sa-td>
+					<sa-td name="名称" prop="name" ></sa-td>
+					<sa-td name="编号" prop="no" ></sa-td>
+					<sa-td name="区域" prop="area" type="enum" :jv="{A区: 'A区', B区: 'B区', C区: 'C区'}"></sa-td>
+					<sa-td name="是否可用" prop="status" type="switch" :jv="{0: '否', 1: '是'}" @change="s => updateStatus(s.row)"></sa-td>
+					<sa-td name="" prop="remark" ></sa-td>
+					<sa-td name="" prop="enterpriseName" ></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 v-if="sa.isAuth('tb-shop-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-shop-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						enterpriseId: '',		//  
+						createBy: '',		// 创建者id 
+						createName: '',		// 创建者名称 
+						updateName: '',		// 更新者名称 
+						updateBy: '',		// 更新者id 
+						tradeAreaId: '',		//  
+						tradeAreaName: '',		//  
+						address: '',		//  
+						addressIds: '',		//  
+						name: '',		// 名称 
+						no: '',		// 编号 
+						area: '',		// 区域(A区=A区,B区=B区,C区=C区) 
+						status: '',		// 是否可用(0=否,1=是) 
+						remark: '',		//  
+						enterpriseName: '',		//  
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbShop/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-shop-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-shop-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-shop-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbShop/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbShop/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 改 - 是否可用(0=否,1=是)
+					updateStatus: function(data) {
+						// 声明变量记录是否成功 
+						var isOk = false;	
+						var oldValue = data.status;
+						var ajax = sa.ajax('/level-one-server/TbShop/updateStatus', {id: data.id, value: data.status}, function(res) {
+							isOk = true;
+							sa.msg('修改成功');
+						}.bind(this));
+						// 如果未能修改成功, 则回滚 
+						$.when(ajax).done(function() {
+							if(isOk == false) {
+								data.status = oldValue; 
+							}
+						})
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 140 - 0
sa-view/tb-trade-area/tb-trade-area-add.html

@@ -0,0 +1,140 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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="名称" v-model="m.name" br></sa-item>
+						<sa-item type="text" name="" v-model="m.addressIds" br></sa-item>
+						<sa-item type="text" name="地址详情" v-model="m.detailAddress" br></sa-item>
+						<sa-item type="text" name="地址" v-model="m.address" br></sa-item>
+						<!-- date-create字段: m.createTime - 创建时间 -->
+						<sa-item type="text" name="创建者id" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建者名称" v-model="m.createName" br></sa-item>
+						<sa-item type="text" name="更新者id" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新者名称" v-model="m.updateName" br></sa-item>
+						<!-- date-update字段: m.updateTime - 更新时间 -->
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							name: '',		// 名称 
+							addressIds: '',		//  
+							detailAddress: '',		// 地址详情 
+							address: '',		// 地址 
+							// createTime: '',		// 创建时间 
+							createBy: '',		// 创建者id 
+							createName: '',		// 创建者名称 
+							updateBy: '',		// 更新者id 
+							updateName: '',		// 更新者名称 
+							// updateTime: '',		// 更新时间 
+							// deleteStatus: '',		// 删除状态 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.addressIds, '请输入 []');
+						sa.checkNull(m.detailAddress, '请输入 [地址详情]');
+						sa.checkNull(m.address, '请输入 [地址]');
+						// sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.createBy, '请输入 [创建者id]');
+						sa.checkNull(m.createName, '请输入 [创建者名称]');
+						sa.checkNull(m.updateBy, '请输入 [更新者id]');
+						sa.checkNull(m.updateName, '请输入 [更新者名称]');
+						// sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						// sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+				
+						// 开始增加或修改
+						this.m.createTime = undefined;		// 不提交属性:创建时间
+						this.m.updateTime = undefined;		// 不提交属性:更新时间
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/level-one-server/TbTradeArea/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/level-one-server/TbTradeArea/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/level-one-server/TbTradeArea/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 72 - 0
sa-view/tb-trade-area/tb-trade-area-info.html

@@ -0,0 +1,72 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="名称" br>{{m.name}}</sa-info>
+						<sa-info name="" br>{{m.addressIds}}</sa-info>
+						<sa-info name="地址详情" br>{{m.detailAddress}}</sa-info>
+						<sa-info name="地址" br>{{m.address}}</sa-info>
+						<sa-info type="datetime" name="创建时间" :value="m.createTime" br></sa-info>
+						<sa-info name="创建者id" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建者名称" br>{{m.createName}}</sa-info>
+						<sa-info name="更新者id" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新者名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="datetime" name="更新时间" :value="m.updateTime" br></sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/level-one-server/TbTradeArea/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 157 - 0
sa-view/tb-trade-area/tb-trade-area-list.html

@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>贸易区域-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.name"></sa-item>
+					<sa-item type="text" name="" v-model="p.addressIds"></sa-item>
+					<sa-item type="text" name="地址详情" v-model="p.detailAddress"></sa-item>
+					<sa-item type="text" name="地址" v-model="p.address"></sa-item>
+					<sa-item type="text" name="创建者id" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建者名称" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新者id" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新者名称" v-model="p.updateName"></sa-item>
+					<!-- 未识别类型:删除状态: p.deleteStatus 请检查配置 -->
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-trade-area-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="name" ></sa-td>
+					<sa-td name="" prop="addressIds" ></sa-td>
+					<sa-td name="地址详情" prop="detailAddress" ></sa-td>
+					<sa-td name="地址" prop="address" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" type="datetime"></sa-td>
+					<sa-td name="创建者id" prop="createBy" ></sa-td>
+					<sa-td name="创建者名称" prop="createName" ></sa-td>
+					<sa-td name="更新者id" prop="updateBy" ></sa-td>
+					<sa-td name="更新者名称" prop="updateName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" type="datetime"></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 v-if="sa.isAuth('tb-trade-area-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-trade-area-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						name: '',		// 名称 
+						addressIds: '',		//  
+						detailAddress: '',		// 地址详情 
+						address: '',		// 地址 
+						createBy: '',		// 创建者id 
+						createName: '',		// 创建者名称 
+						updateBy: '',		// 更新者id 
+						updateName: '',		// 更新者名称 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/level-one-server/TbTradeArea/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-trade-area-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-trade-area-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-trade-area-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/level-one-server/TbTradeArea/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/level-one-server/TbTradeArea/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 164 - 0
sa-view/tb-vehicle/tb-vehicle-add.html

@@ -0,0 +1,164 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<script src="../../static/kj/upload-util.js"></script>
+		
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <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="车牌" v-model="m.vehiclePlate" br></sa-item>
+						<sa-item type="text" name="所有人" v-model="m.owner" br></sa-item>
+						<sa-item type="text" name="车辆类型" v-model="m.vehicleType" br></sa-item>
+						<sa-item type="text" name="类型父id" v-model="m.parentId" br></sa-item>
+						<sa-item type="text" name="车辆尺寸" v-model="m.vehicleSize" br></sa-item>
+						<sa-item type="text" name="车辆品牌型号" v-model="m.vehicleModel" br></sa-item>
+						<sa-item type="text" name="核定载质量" v-model="m.vehicleLoad" br></sa-item>
+						<sa-item type="text" name="车辆自重" v-model="m.vehicleWeight" br></sa-item>
+						<sa-item type="text" name="创建者id" v-model="m.createBy" br></sa-item>
+						<sa-item type="text" name="创建者姓名" v-model="m.createName" br></sa-item>
+						<!-- date-create字段: m.createTime - 创建时间 -->
+						<sa-item type="text" name="更新者id" v-model="m.updateBy" br></sa-item>
+						<sa-item type="text" name="更新者名称" v-model="m.updateName" br></sa-item>
+						<!-- date-update字段: m.updateTime - 更新时间 -->
+						<sa-item type="enum" name="审核状态" v-model="m.auditStatus" :jv="{0: '待审核,1'}" jtype="3" br></sa-item>
+						<sa-item type="text" name="审核人" v-model="m.auditBy" br></sa-item>
+						<sa-item type="text" name="审核不通过原因" v-model="m.nopassReason" br></sa-item>
+						<sa-item type="text" name="审核时间" v-model="m.auditTime" br></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		// 主键 
+							vehiclePlate: '',		// 车牌 
+							owner: '',		// 所有人 
+							vehicleType: '',		// 车辆类型 
+							parentId: '',		// 类型父id 
+							vehicleSize: '',		// 车辆尺寸 
+							vehicleModel: '',		// 车辆品牌型号 
+							vehicleLoad: '',		// 核定载质量 
+							vehicleWeight: '',		// 车辆自重 
+							createBy: '',		// 创建者id 
+							createName: '',		// 创建者姓名 
+							// createTime: '',		// 创建时间 
+							updateBy: '',		// 更新者id 
+							updateName: '',		// 更新者名称 
+							// updateTime: '',		// 更新时间 
+							// deleteStatus: '',		// 删除状态 
+							auditStatus: '',		// 审核状态(0=待审核,1=已通过,2=不通过) 
+							auditBy: '',		// 审核人 
+							nopassReason: '',		// 审核不通过原因 
+							auditTime: '',		// 审核时间 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.vehiclePlate, '请输入 [车牌]');
+						sa.checkNull(m.owner, '请输入 [所有人]');
+						sa.checkNull(m.vehicleType, '请输入 [车辆类型]');
+						sa.checkNull(m.parentId, '请输入 [类型父id]');
+						sa.checkNull(m.vehicleSize, '请输入 [车辆尺寸]');
+						sa.checkNull(m.vehicleModel, '请输入 [车辆品牌型号]');
+						sa.checkNull(m.vehicleLoad, '请输入 [核定载质量]');
+						sa.checkNull(m.vehicleWeight, '请输入 [车辆自重]');
+						sa.checkNull(m.createBy, '请输入 [创建者id]');
+						sa.checkNull(m.createName, '请输入 [创建者姓名]');
+						// sa.checkNull(m.createTime, '请输入 [创建时间]');
+						sa.checkNull(m.updateBy, '请输入 [更新者id]');
+						sa.checkNull(m.updateName, '请输入 [更新者名称]');
+						// sa.checkNull(m.updateTime, '请输入 [更新时间]');
+						// sa.checkNull(m.deleteStatus, '请输入 [删除状态]');
+						sa.checkNull(m.auditStatus, '请输入 [审核状态]');
+						sa.checkNull(m.auditBy, '请输入 [审核人]');
+						sa.checkNull(m.nopassReason, '请输入 [审核不通过原因]');
+						sa.checkNull(m.auditTime, '请输入 [审核时间]');
+				
+						// 开始增加或修改
+						this.m.createTime = undefined;		// 不提交属性:创建时间
+						this.m.updateTime = undefined;		// 不提交属性:更新时间
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/transport-server/TbVehicle/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/transport-server/TbVehicle/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/transport-server/TbVehicle/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 80 - 0
sa-view/tb-vehicle/tb-vehicle-info.html

@@ -0,0 +1,80 @@
+<!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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+			<link rel="stylesheet" href="../../static/sa.css"> 
+			<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+			<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+			<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+			<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+			<script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
+			<script src="../../static/sa.js"></script>
+			<script src="../../static/kj/upload-util.js"></script>
+			
+		<style type="text/css">
+			.c-panel .c-label{width: 8em;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box sbot" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<el-form v-if="m">
+						<sa-info type="num" name="主键" :value="m.id" br></sa-info>
+						<sa-info name="车牌" br>{{m.vehiclePlate}}</sa-info>
+						<sa-info name="所有人" br>{{m.owner}}</sa-info>
+						<sa-info name="车辆类型" br>{{m.vehicleType}}</sa-info>
+						<sa-info name="类型父id" br>{{m.parentId}}</sa-info>
+						<sa-info name="车辆尺寸" br>{{m.vehicleSize}}</sa-info>
+						<sa-info name="车辆品牌型号" br>{{m.vehicleModel}}</sa-info>
+						<sa-info name="核定载质量" br>{{m.vehicleLoad}}</sa-info>
+						<sa-info name="车辆自重" br>{{m.vehicleWeight}}</sa-info>
+						<sa-info name="创建者id" br>{{m.createBy}}</sa-info>
+						<sa-info name="创建者姓名" br>{{m.createName}}</sa-info>
+						<sa-info type="datetime" name="创建时间" :value="m.createTime" br></sa-info>
+						<sa-info name="更新者id" br>{{m.updateBy}}</sa-info>
+						<sa-info name="更新者名称" br>{{m.updateName}}</sa-info>
+						<sa-info type="datetime" name="更新时间" :value="m.updateTime" br></sa-info>
+						<sa-info type="enum" name="审核状态" :value="m.auditStatus" :jv="{0: '待审核,1'}" br></sa-info>
+						<sa-info name="审核人" br>{{m.auditBy}}</sa-info>
+						<sa-info name="审核不通过原因" br>{{m.nopassReason}}</sa-info>
+						<sa-info name="审核时间" br>{{m.auditTime}}</sa-info>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="success" @click="sa.closeCurrIframe()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-info": httpVueLoader('../../sa-frame/com/sa-info.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0),	// 获取数据ID 
+					m: null
+				},
+				methods: {
+				},
+				mounted: function() {
+					sa.ajax('/transport-server/TbVehicle/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+						if(res.data == null) {
+							sa.alert('未能查找到 id=' + this.id + " 详细数据");
+						}
+					}.bind(this))
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 182 - 0
sa-view/tb-vehicle/tb-vehicle-list.html

@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>车辆-列表</title>
+		<meta 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="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css"> 
+		<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
+		<script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
+		<script src="https://unpkg.com/http-vue-loader@1.4.2/src/httpVueLoader.js"></script>
+		<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
+		<script src="https://www.layuicdn.com/layer-v3.1.1/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">
+				<!-- ------------- 检索参数 ------------- -->
+				<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.vehiclePlate"></sa-item>
+					<sa-item type="text" name="所有人" v-model="p.owner"></sa-item>
+					<sa-item type="text" name="车辆类型" v-model="p.vehicleType"></sa-item>
+					<sa-item type="text" name="类型父id" v-model="p.parentId"></sa-item>
+					<sa-item type="text" name="车辆尺寸" v-model="p.vehicleSize"></sa-item>
+					<sa-item type="text" name="车辆品牌型号" v-model="p.vehicleModel"></sa-item>
+					<sa-item type="text" name="核定载质量" v-model="p.vehicleLoad"></sa-item>
+					<sa-item type="text" name="车辆自重" v-model="p.vehicleWeight"></sa-item>
+					<sa-item type="text" name="创建者id" v-model="p.createBy"></sa-item>
+					<sa-item type="text" name="创建者姓名" v-model="p.createName"></sa-item>
+					<sa-item type="text" name="更新者id" v-model="p.updateBy"></sa-item>
+					<sa-item type="text" name="更新者名称" v-model="p.updateName"></sa-item>
+					<!-- 未识别类型:删除状态: p.deleteStatus 请检查配置 -->
+					<sa-item type="enum" name="审核状态" v-model="p.auditStatus" 
+						:jv="{0: '待审核,1'}" jtype="2" def="不限"></sa-item>
+					<sa-item type="text" name="审核人" v-model="p.auditBy"></sa-item>
+					<sa-item type="text" name="审核不通过原因" v-model="p.nopassReason"></sa-item>
+					<sa-item type="text" name="审核时间" v-model="p.auditTime"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+				</el-form>
+				<div class="fast-btn">
+					<el-button v-if="sa.isAuth('tb-vehicle-add')" size="mini" type="primary" @click="add()">新增</el-button>
+					<el-button size="mini" type="success" @click="getBySelect()">查看</el-button>
+					<el-button size="mini" type="info" @click="sa.f5()">重置</el-button>
+				</div>
+				<!-- ------------- 数据列表 ------------- -->
+				<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="vehiclePlate" ></sa-td>
+					<sa-td name="所有人" prop="owner" ></sa-td>
+					<sa-td name="车辆类型" prop="vehicleType" ></sa-td>
+					<sa-td name="类型父id" prop="parentId" ></sa-td>
+					<sa-td name="车辆尺寸" prop="vehicleSize" ></sa-td>
+					<sa-td name="车辆品牌型号" prop="vehicleModel" ></sa-td>
+					<sa-td name="核定载质量" prop="vehicleLoad" ></sa-td>
+					<sa-td name="车辆自重" prop="vehicleWeight" ></sa-td>
+					<sa-td name="创建者id" prop="createBy" ></sa-td>
+					<sa-td name="创建者姓名" prop="createName" ></sa-td>
+					<sa-td name="创建时间" prop="createTime" type="datetime"></sa-td>
+					<sa-td name="更新者id" prop="updateBy" ></sa-td>
+					<sa-td name="更新者名称" prop="updateName" ></sa-td>
+					<sa-td name="更新时间" prop="updateTime" type="datetime"></sa-td>
+					<sa-td name="审核状态" prop="auditStatus" type="enum" :jv="{0: '待审核,1'}"></sa-td>
+					<sa-td name="审核人" prop="auditBy" ></sa-td>
+					<sa-td name="审核不通过原因" prop="nopassReason" ></sa-td>
+					<sa-td name="审核时间" prop="auditTime" ></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 v-if="sa.isAuth('tb-vehicle-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button v-if="sa.isAuth('tb-vehicle-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
+						</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>
+		</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: {
+					p: { // 查询参数  
+						id: '',		// 主键 
+						vehiclePlate: '',		// 车牌 
+						owner: '',		// 所有人 
+						vehicleType: '',		// 车辆类型 
+						parentId: '',		// 类型父id 
+						vehicleSize: '',		// 车辆尺寸 
+						vehicleModel: '',		// 车辆品牌型号 
+						vehicleLoad: '',		// 核定载质量 
+						vehicleWeight: '',		// 车辆自重 
+						createBy: '',		// 创建者id 
+						createName: '',		// 创建者姓名 
+						updateBy: '',		// 更新者id 
+						updateName: '',		// 更新者名称 
+						auditStatus: '',		// 审核状态(0=待审核,1=已通过,2=不通过) 
+						auditBy: '',		// 审核人 
+						nopassReason: '',		// 审核不通过原因 
+						auditTime: '',		// 审核时间 
+						pageNo: 1,		// 当前页 
+						pageSize: 10,	// 页大小 
+						sortType: 0		// 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					// 刷新
+					f5: function() {
+						sa.ajax('/transport-server/TbVehicle/getList', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight();		// 刷新表格高度 
+						}.bind(this));
+					},
+					// 查看
+					get: function(data) {
+						sa.showIframe('数据详情', 'tb-vehicle-info.html?id=' + data.id, '1050px', '90%');
+					},
+					// 查看 - 根据选中的
+					getBySelect: function(data) {
+						var selection = this.$refs['data-table'].selection;
+						if(selection.length == 0) {
+							return sa.msg('请选择一条数据')
+						}
+						this.get(selection[0]);
+					},
+					// 修改
+					update: function(data) {
+						sa.showIframe('修改数据', 'tb-vehicle-add.html?id=' + data.id, '1000px', '90%');
+					},
+					// 新增
+					add: function(data) {
+						sa.showIframe('新增数据', 'tb-vehicle-add.html?id=-1', '1000px', '90%');
+					},
+					// 删除
+					del: function(data) {
+						sa.confirm('是否删除,此操作不可撤销', function() {
+							sa.ajax('/transport-server/TbVehicle/delete?id=' + data.id, function(res) {
+								sa.arrayDelete(this.dataList, data);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+					// 批量删除
+					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('/transport-server/TbVehicle/deleteByIds', {ids: ids.join(',')}, function(res) {
+								sa.arrayDelete(this.dataList, selection);
+								sa.ok('删除成功');
+								sa.f5TableHeight();		// 刷新表格高度 
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>