qzyReal 3 år sedan
förälder
incheckning
ecbe3ec4e5
49 ändrade filer med 2089 tillägg och 1518 borttagningar
  1. 32 40
      sp-admin/sa-frame/menu-list.js
  2. 0 1
      sp-admin/sa-view-sp/sp-admin/admin-info.html
  3. 64 25
      sp-admin/sa-view-sp/sp-admin/admin-list.html
  4. 32 11
      sp-admin/sa-view-sp/sp-role/menu-setup.html
  5. 1 4
      sp-admin/sa-view-sp/sp-role/role-add.html
  6. 4 60
      sp-admin/sa-view/tb-business/tb-business-list.html
  7. 27 29
      sp-admin/sa-view/tb-costomer/tb-costomer-add.html
  8. 9 28
      sp-admin/sa-view/tb-costomer/tb-costomer-list.html
  9. 27 0
      sp-server/src/main/java/com/pj/constants/RoleEnum.java
  10. 1 1
      sp-server/src/main/java/com/pj/constants/UserTypeEnum.java
  11. 4 2
      sp-server/src/main/java/com/pj/current/satoken/StpInterfaceImpl.java
  12. 928 837
      sp-server/src/main/java/com/pj/current/satoken/StpUserUtil.java
  13. 12 6
      sp-server/src/main/java/com/pj/project/tb_business/TbBusiness.java
  14. 4 4
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessController.java
  15. 0 28
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessMapper.java
  16. 6 91
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessMapper.xml
  17. 59 32
      sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java
  18. 13 7
      sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItem.java
  19. 6 5
      sp-server/src/main/java/com/pj/project/tb_car/TbCar.java
  20. 10 2
      sp-server/src/main/java/com/pj/project/tb_car/TbCarService.java
  21. 10 5
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomer.java
  22. 4 3
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerController.java
  23. 5 5
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerMapper.xml
  24. 101 32
      sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerService.java
  25. 93 0
      sp-server/src/main/java/com/pj/project/tb_district/TbDistrict.java
  26. 49 0
      sp-server/src/main/java/com/pj/project/tb_district/TbDistrictController.java
  27. 55 0
      sp-server/src/main/java/com/pj/project/tb_district/TbDistrictMapper.java
  28. 80 0
      sp-server/src/main/java/com/pj/project/tb_district/TbDistrictMapper.xml
  29. 95 0
      sp-server/src/main/java/com/pj/project/tb_district/TbDistrictService.java
  30. 4 3
      sp-server/src/main/java/com/pj/project/tb_driver/TbDriver.java
  31. 1 14
      sp-server/src/main/java/com/pj/project/tb_driver/TbDriverController.java
  32. 10 2
      sp-server/src/main/java/com/pj/project/tb_driver/TbDriverService.java
  33. 4 2
      sp-server/src/main/java/com/pj/project/tb_goods/TbGoods.java
  34. 3 4
      sp-server/src/main/java/com/pj/project/tb_goods/TbGoodsMapper.xml
  35. 15 14
      sp-server/src/main/java/com/pj/project4sp/admin/SpAdmin.java
  36. 187 136
      sp-server/src/main/java/com/pj/project4sp/admin/SpAdminController.java
  37. 5 0
      sp-server/src/main/java/com/pj/project4sp/admin/SpAdminMapper.java
  38. 13 4
      sp-server/src/main/java/com/pj/project4sp/admin/SpAdminMapper.xml
  39. 3 1
      sp-server/src/main/java/com/pj/project4sp/admin4login/SpAccAdminService.java
  40. 9 5
      sp-server/src/main/java/com/pj/project4sp/role/SpRole.java
  41. 22 19
      sp-server/src/main/java/com/pj/project4sp/role/SpRoleController.java
  42. 3 0
      sp-server/src/main/java/com/pj/project4sp/role/SpRoleMapper.java
  43. 13 4
      sp-server/src/main/java/com/pj/project4sp/role/SpRoleMapper.xml
  44. 1 1
      sp-server/src/main/java/com/pj/project4sp/role/SpRoleUtil.java
  45. 22 7
      sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionController.java
  46. 7 3
      sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionMapper.java
  47. 24 5
      sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionMapper.xml
  48. 12 9
      sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionService.java
  49. 0 27
      sp-server/src/main/java/com/pj/project4sp/test/TestController.java

+ 32 - 40
sp-admin/sa-frame/menu-list.js

@@ -17,73 +17,65 @@
 // 定义菜单列表 
 var menuList =	[
 	{
-		id: 'tb-business',
-		name: '入境登记',
+		id: 'tb-costomer',
+		name: '客户管理',
 		icon: 'el-icon-folder-opened',
-		info: '入境登记表数据的维护',
+		info: '客户管理表数据的维护',
 		childList: [
-			{id: 'tb-business-list', name: '入境登记-列表', url: 'sa-view/tb-business/tb-business-list.html'},
-			{id: 'tb-business-add', name: '入境登记-添加', url: 'sa-view/tb-business/tb-business-add.html'},
+			{id: 'tb-costomer-list', name: '客户管理-列表', url: 'sa-view/tb-costomer/tb-costomer-list.html'},
+			{id: 'tb-costomer-add', name: '客户管理-添加', url: 'sa-view/tb-costomer/tb-costomer-add.html'},
 		]
 	},
 	{
-		id: 'tb-business-item',
-		name: '业务作业项',
+		id: 'tb-goods',
+		name: '商品管理',
 		icon: 'el-icon-folder-opened',
-		info: '业务作业项表数据的维护',
+		info: '商品管理表数据的维护',
 		childList: [
-			{id: 'tb-business-item-list', name: '业务作业项-列表', url: 'sa-view/tb-business-item/tb-business-item-list.html'},
-			{id: 'tb-business-item-add', name: '业务作业项-添加', url: 'sa-view/tb-business-item/tb-business-item-add.html'},
+			{id: 'tb-goods-list', name: '商品管理-列表', url: 'sa-view/tb-goods/tb-goods-list.html'},
+			{id: 'tb-goods-add', name: '商品管理-添加', url: 'sa-view/tb-goods/tb-goods-add.html'},
 		]
 	},
 	{
-		id: 'tb-car',
-		name: '车辆管理',
+		id: 'tb-business',
+		name: '业务登记',
 		icon: 'el-icon-folder-opened',
-		info: '表数据的维护',
+		info: '业务登记表数据的维护',
 		childList: [
-			{id: 'tb-car-list', name: '车辆-列表', url: 'sa-view/tb-car/tb-car-list.html'},
-			{id: 'tb-car-add', name: '车辆-添加', url: 'sa-view/tb-car/tb-car-add.html'},
+			{id: 'tb-business-list', name: '业务登记', url: 'sa-view/tb-business/tb-business-list.html'},
+			{id: 'tb-business-add', name: '业务查询', url: 'sa-view/tb-business/tb-business-add.html'},
 		]
 	},
 	{
-		id: 'tb-costomer',
-		name: '客户管理',
-		icon: 'el-icon-folder-opened',
-		info: '客户管理表数据的维护',
-		childList: [
-			{id: 'tb-costomer-list', name: '客户管理-列表', url: 'sa-view/tb-costomer/tb-costomer-list.html'},
-			{id: 'tb-costomer-add', name: '客户管理-添加', url: 'sa-view/tb-costomer/tb-costomer-add.html'},
-		]
-	},
-	{
-		id: 'tb-driver',
-		name: '司机',
+		id: 'tb-item',
+		name: '业务配置项管理',
 		icon: 'el-icon-folder-opened',
-		info: '司机表数据的维护',
+		info: '业务配置项表数据的维护',
 		childList: [
-			{id: 'tb-driver-list', name: '司机-列表', url: 'sa-view/tb-driver/tb-driver-list.html'},
-			{id: 'tb-driver-add', name: '司机-添加', url: 'sa-view/tb-driver/tb-driver-add.html'},
+			{id: 'tb-item-list', name: '业务配置项-列表', url: 'sa-view/tb-item/tb-item-list.html'},
+			{id: 'tb-item-add', name: '业务配置项-添加', url: 'sa-view/tb-item/tb-item-add.html'},
 		]
 	},
 	{
-		id: 'tb-item',
-		name: '作业配置项',
+		id: 'tb-car',
+		name: '车辆管理',
 		icon: 'el-icon-folder-opened',
-		info: '作业配置项表数据的维护',
+		info: '表数据的维护',
 		childList: [
-			{id: 'tb-item-list', name: '作业配置项-列表', url: 'sa-view/tb-item/tb-item-list.html'},
-			{id: 'tb-item-add', name: '作业配置项-添加', url: 'sa-view/tb-item/tb-item-add.html'},
+			{id: 'tb-car-list', name: '车辆-列表', url: 'sa-view/tb-car/tb-car-list.html'},
+			{id: 'tb-car-add', name: '车辆-添加', url: 'sa-view/tb-car/tb-car-add.html'},
 		]
 	},
 	{
-		id: 'tb-goods',
-		name: '商品管理',
+		id: 'tb-driver',
+		name: '司机管理',
 		icon: 'el-icon-folder-opened',
-		info: '商品管理表数据的维护',
+		info: '司机表数据的维护',
 		childList: [
-			{id: 'tb-goods-list', name: '商品管理-列表', url: 'sa-view/tb-goods/tb-goods-list.html'},
-			{id: 'tb-goods-add', name: '商品管理-添加', url: 'sa-view/tb-goods/tb-goods-add.html'},
+			{id: 'tb-driver-list', name: '司机-列表', url: 'sa-view/tb-driver/tb-driver-list.html'},
+			{id: 'tb-driver-add', name: '司机-添加', url: 'sa-view/tb-driver/tb-driver-add.html'},
 		]
 	},
+	
+	
 ]

+ 0 - 1
sp-admin/sa-view-sp/sp-admin/admin-info.html

@@ -34,7 +34,6 @@
 						<sa-info name="编号" br>{{m.id}}</sa-info>
 						<sa-info name="名称" br>{{m.name}}</sa-info>
 						<sa-info name="手机" br>{{m.phone || '无'}}</sa-info>
-						<sa-info name="角色" br>{{m.roleName}}</sa-info>
 						<sa-info name="创建账号" br>
 							<span v-if="m.createByAid == -1">无</span>
 							<a v-else :href=" 'admin-info.html?id=' +  m.createByAid">{{m.createByAid}}</a>

+ 64 - 25
sp-admin/sa-view-sp/sp-admin/admin-list.html

@@ -24,14 +24,7 @@
 				<!-- ------------- 检索参数 ------------- -->
 				<h4 class="c-title">检索参数</h4>
 				<el-form>
-					<sa-item type="num" name="账号id" v-model="p.id"></sa-item>
 					<sa-item type="text" name="名称" v-model="p.name"></sa-item>
-					<sa-item name="角色">
-						<el-select v-model="p.roleId">
-							<el-option label="全部" value=""></el-option>
-							<el-option v-for="role in roleList" :key="role.id" :label="role.name" :value="role.id"></el-option>
-						</el-select>
-					</sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 					<br>
 					<sa-item name="综合排序" class="s-radio-text">
@@ -47,7 +40,6 @@
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList">
 					<sa-td type="selection"></sa-td>
-					<sa-td type="num" name="记录id" prop="id" min-width="70px"></sa-td>
 					<sa-td type="user-avatar" name="昵称" prop="name,avatar" min-width="120px"></sa-td>
 					<sa-td type="text" name="手机" prop="phone"></sa-td>
 					<sa-td name="创建人" >
@@ -56,8 +48,7 @@
 							<el-link v-else @click="sa.$page.openAdminInfo(s.row.createByAid, s.row.name)">{{s.row.createByAid}}</el-link>
 						</template>
 					</sa-td>
-					<sa-td type="text" name="所属角色" prop="roleName"></sa-td>
-					<sa-td type="datetime" name="所属角色" prop="createTime" width="150px"></sa-td>
+					<sa-td type="datetime" name="创建时间" prop="createTime" width="150px"></sa-td>
 					<sa-td type="datetime" name="最后登录" prop="loginTime" width="150px"></sa-td>
 					<sa-td type="text" name="登录次数" prop="loginCount" not="0" width="100px"></sa-td>
 					<sa-td type="switch" name="账号状态" prop="status" :jv="{1: '正常', 2: '禁用[#ff4949]'}" @change="s => updateStatus(s.row)" width="120px"></sa-td>
@@ -75,16 +66,9 @@
 							<span @click="updatePassword(s.row)">
 								<el-button type="primary" class="c-btn" icon="el-icon-edit">改密码</el-button>
 							</span>
-							<el-dropdown trigger="click" style="font-size: 0.85em;">
-								<el-button type="primary" class="c-btn">
-									修改角色为 <i class="el-icon-arrow-down el-icon--right"></i>
-								</el-button>
-								<el-dropdown-menu slot="dropdown">
-									<span v-for="role in roleList" :key="role.id" @click="updateRoleId(s.row, role.id, role.name)">
-										<el-dropdown-item :style=" s.row.roleId == role.id ? {color: 'blue'} : null ">{{role.name}}</el-dropdown-item>
-									</span>
-								</el-dropdown-menu>
-							</el-dropdown>
+							<span @click="roleFn(s.row)">
+								<el-button type="primary" class="c-btn" icon="el-icon-edit">角色</el-button>
+							</span>
 							<span @click="del(s.row)">
 								<el-button type="danger" class="c-btn" icon="el-icon-delete">删除</el-button>
 							</span>
@@ -94,7 +78,22 @@
 				<!-- 分页 -->
 				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"></sa-item>
 			</div>
-			
+			<el-dialog
+			  :title="roleDialog.title"
+			  :visible.sync="roleDialog.visible"
+			  width="30%">
+			  <div >
+			  	 <el-checkbox   @change="handleCheckAllChange">全选</el-checkbox>
+			  	  <div style="margin: 15px 0;"></div>
+			  	  <el-checkbox-group v-model="roleDialog.form.roleId">
+			  	    <el-checkbox v-for="role in roleList" :label="role.id+''" :key="role.id">{{role.name}}</el-checkbox>
+			  	  </el-checkbox-group>
+			  </div>
+			  <span slot="footer" class="dialog-footer">
+			    <el-button @click="roleDialog.visible = false">取 消</el-button>
+			    <el-button type="primary" @click="confirmSetRole">确 定</el-button>
+			  </span>
+			</el-dialog>
 		</div>
         <script>
 			var app = new Vue({
@@ -104,6 +103,14 @@
 				},
 				el: '.vue-box',
 				data: {
+					roleDialog:{
+						visible:false,
+						title:'',
+						form:{
+							id:'',
+							roleId:[],
+						}
+					},
 					sa: sa, 	// 超级对象
 					p: {		// 查询参数
 						id: '',
@@ -118,6 +125,35 @@
 					roleList: [],	// 角色集合 
 				},
 				methods: {
+					roleFn(data){
+						Object.assign(this.roleDialog,{
+							visible:true,
+							title:'设置['+data.name+']角色属性',
+							form:{
+								id:data.id,
+								roleId:data.roleId.split(',')
+							}
+						})
+					},
+					handleCheckAllChange(){
+						let roleId=this.roleDialog.form.roleId;
+						let allIds=this.roleList.map(obj=>obj.id+'');
+						this.roleDialog.form.roleId=roleId.length!=allIds.length?allIds:[];
+					},
+					confirmSetRole(){
+						let roleId=this.roleDialog.form.roleId;
+						if(roleId.length == 0) {
+							return sa.msg('请选择一个角色')
+						}
+						let o={
+							id:this.roleDialog.form.id,
+							roleId:this.roleDialog.form.roleId.join(',')
+						}
+						sa.ajax('/admin/setRole',o,function(resp){
+							this.f5();
+							this.roleDialog.visible=false;
+						}.bind(this))
+					},
 					// 刷新
 					f5: function(isPage){
 						sa.ajax('/admin/getList', this.p, function(res){
@@ -237,14 +273,17 @@
 							}.bind(this))
 						}.bind(this));
 					},
+					getRoleList(){
+						// 加载角色
+						sa.ajax('/role/getList', function(res){
+							this.roleList = res.data;	// 数据  
+						}.bind(this), {msg: null});
+					}
 				},
 				created: function(){
 					this.f5();
 					sa.onInputEnter();	// 监听回车执行查询 
-					// 加载角色 
-					sa.ajax('/role/getList', function(res){
-						this.roleList = res.data;	// 数据  
-					}.bind(this), {msg: null});
+					this.getRoleList();
 				}
 			})
 			

+ 32 - 11
sp-admin/sa-view-sp/sp-role/menu-setup.html

@@ -148,20 +148,41 @@
 						} else {
 							this.$refs['tree'].setCheckedNodes([]);
 						}
+					},
+					filterMenu(menu_list, menuCode){
+						return menu_list.filter(item => {
+						    return menuCode.indexOf(item.id) > -1
+						}).map(item => {
+						    item = Object.assign({}, item)
+						    if (item.children) {
+						        item.children = filterMenu(item.children, menuCode)
+						    }
+						    return item
+						})
+					},
+					getCurrPer(){
+						sa.ajax('/SpRolePermission/getPcodeByCurrRid',function(resp){
+							let cuList=resp.data;
+							let menu_list=	this.filterMenu(menuList,cuList);
+							this.handler(menu_list);
+						}.bind(this))
+					},
+					handler(menu_list){
+						// 全部
+						menu_list = sa_admin_code_util.arrayToTree(menu_list);	// 一维转tree 
+						menu_list = sa_admin_code_util.refMenuList(menu_list);	// 属性处理 
+						this.dataList = menu_list;	// 数据  
+						this.ywList = sa_admin_code_util.treeToArray(this.dataList);
+							
+						// 拉取此 roleId 的
+						sa.ajax('/SpRolePermission/getPcodeByRid?roleId=' + roleId, function(res) {
+							this.selectList = res.data;		// 选中的列表 
+							this.haveList = [].concat(this.selectList);
+						}.bind(this))
 					}
 				},
 				created: function(){
-					// 全部
-					menuList = sa_admin_code_util.arrayToTree(menuList);	// 一维转tree 
-					menuList = sa_admin_code_util.refMenuList(menuList);	// 属性处理 
-					this.dataList = menuList;	// 数据  
-					this.ywList = sa_admin_code_util.treeToArray(this.dataList);
-						
-					// 拉取此 roleId 的
-					sa.ajax('/SpRolePermission/getPcodeByRid?roleId=' + roleId, function(res) {
-						this.selectList = res.data;		// 选中的列表 
-						this.haveList = [].concat(this.selectList);
-					}.bind(this))
+						this.getCurrPer();
 				}
 			})
 		</script>

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

@@ -26,7 +26,6 @@
 					<div class="c-title">数据添加</div>
 					<el-form v-if="m">
 						<!-- no字段: m.id - id -->
-						<sa-item type="text" name="角色id" 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.info" br></sa-item>
 						<sa-item name="" class="s-ok" br>
@@ -75,9 +74,7 @@
 						sa.ajax('/role/add', this.m, function(res){
 							sa.alert('增加成功', function() {
 								if(parent.app) {
-									res.data.is_update = false;
-									parent.app.dataList.push(res.data);
-									parent.sa.f5TableHeight();		// 刷新表格高度 
+									parent.sa.f5();		// 刷新表格高度 
 									sa.closeCurrIframe();	// 关闭本页 
 								} else {
 									app.m = this.createModel();

+ 4 - 60
sp-admin/sa-view/tb-business/tb-business-list.html

@@ -20,88 +20,32 @@
 				<!-- ------------- 检索参数 ------------- -->
 				<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.customerId"></sa-item>
 					<sa-item type="text" name="客户名称" v-model="p.customerName"></sa-item>
-					<sa-item type="text" name="编号" v-model="p.no"></sa-item>
 					<sa-item type="text" name="车牌号" v-model="p.cardNo"></sa-item>
-					<sa-item type="text" name="车规格" v-model="p.cardSize"></sa-item>
-					<sa-item type="text" name="载重" v-model="p.netWeight"></sa-item>
-					<sa-item type="text" name="商品" v-model="p.goodsName"></sa-item>
-					<sa-item type="text" name="商品编号" v-model="p.goodsCode"></sa-item>
 					<sa-item type="text" name="司机名称" v-model="p.driverName"></sa-item>
-					<sa-item type="text" name="司机id" v-model="p.driverId"></sa-item>
-					<sa-item type="text" name="司机联系号码" v-model="p.driverPhone"></sa-item>
 					<sa-item type="text" name="司机身份证" v-model="p.driverIdCard"></sa-item>
-					<sa-item type="text" name="预计进边境日期" v-model="p.expectInDay"></sa-item>
-					<sa-item type="text" name="实际进边境日期" v-model="p.realInDay"></sa-item>
-					<sa-item type="text" name="实际进境时间" v-model="p.realInTime"></sa-item>
-					<sa-item type="enum" name="支付状态" v-model="p.payStatus" 
-						:jv="{1: '未支付', 2: '已支付'}" jtype="2" def="不限"></sa-item>
-					<sa-item type="text" name="支付时间" v-model="p.payTime"></sa-item>
-					<sa-item type="enum" name="支付方式" v-model="p.payType" 
-						:jv="{1: '线下支付', 3: '第三方支付'}" jtype="2" def="不限"></sa-item>
-					<sa-item type="text" name="离境时间" v-model="p.outDayTime"></sa-item>
-					<sa-item type="text" name="停车费用" v-model="p.partMoney"></sa-item>
-					<sa-item type="text" name="停车时常" v-model="p.partTime"></sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 					<br />
-					<sa-item name="综合排序">
-						<el-radio-group v-model="p.sortType" class="s-radio-text">
-							<el-radio :label="0">默认</el-radio>
-							<el-radio :label="1">主键</el-radio>
-							<el-radio :label="2">客户id</el-radio>
-							<el-radio :label="3">客户名称</el-radio>
-							<el-radio :label="4">编号</el-radio>
-							<el-radio :label="5">车牌号</el-radio>
-							<el-radio :label="6">车规格</el-radio>
-							<el-radio :label="7">载重</el-radio>
-							<el-radio :label="8">商品</el-radio>
-							<el-radio :label="9">商品编号</el-radio>
-							<el-radio :label="10">司机名称</el-radio>
-							<el-radio :label="11">司机id</el-radio>
-							<el-radio :label="12">司机联系号码</el-radio>
-							<el-radio :label="13">司机身份证</el-radio>
-							<el-radio :label="14">预计进边境日期</el-radio>
-							<el-radio :label="15">实际进边境日期</el-radio>
-							<el-radio :label="16">实际进境时间</el-radio>
-							<el-radio :label="17">支付状态</el-radio>
-							<el-radio :label="18">支付时间</el-radio>
-							<el-radio :label="19">支付方式</el-radio>
-							<el-radio :label="20">离境时间</el-radio>
-							<el-radio :label="21">停车费用</el-radio>
-							<el-radio :label="22">停车时常</el-radio>
-						</el-radio-group>
-					</sa-item>
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,export,reset"></sa-item>
+				<sa-item type="fast-btn" show="add,get,delete,reset"></sa-item>
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList" >
 					<sa-td type="selection"></sa-td>
-					<sa-td name="主键" prop="id" type="num"></sa-td>
-					<sa-td name="客户id" prop="customerId" ></sa-td>
 					<sa-td name="客户名称" prop="customerName" ></sa-td>
-					<sa-td name="编号" prop="no" ></sa-td>
 					<sa-td name="车牌号" prop="cardNo" ></sa-td>
 					<sa-td name="车规格" prop="cardSize" ></sa-td>
 					<sa-td name="载重" prop="netWeight" ></sa-td>
 					<sa-td name="商品" prop="goodsName" ></sa-td>
-					<sa-td name="商品编号" prop="goodsCode" ></sa-td>
 					<sa-td name="司机名称" prop="driverName" ></sa-td>
-					<sa-td name="司机id" prop="driverId" ></sa-td>
-					<sa-td name="司机联系号码" prop="driverPhone" ></sa-td>
+					<sa-td name="司机联系" prop="driverPhone" ></sa-td>
 					<sa-td name="司机身份证" prop="driverIdCard" ></sa-td>
 					<sa-td name="支付凭证" prop="payTicket" type="img"></sa-td>
-					<sa-td name="预计进边境日期" prop="expectInDay" ></sa-td>
-					<sa-td name="实际进边境日期" prop="realInDay" ></sa-td>
-					<sa-td name="实际进境时间" prop="realInTime" ></sa-td>
-					<sa-td name="支付状态" prop="payStatus" type="enum" :jv="{1: '未支付', 2: '已支付'}"></sa-td>
+					<sa-td  name="支付状态" prop="payStatus" type="enum" :jv="{1: '未支付[#ff0000]', 2: '已支付[#005500]'}"></sa-td>
 					<sa-td name="支付时间" prop="payTime" ></sa-td>
-					<sa-td name="支付方式" prop="payType" type="enum" :jv="{1: '线下支付', 3: '第三方支付'}"></sa-td>
 					<sa-td name="离境时间" prop="outDayTime" ></sa-td>
 					<sa-td name="停车费用" prop="partMoney" ></sa-td>
-					<sa-td name="停车时常" prop="partTime" ></sa-td>
+					<sa-td width="120" name="停车时长(分)" prop="partTime" ></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>

+ 27 - 29
sp-admin/sa-view/tb-costomer/tb-costomer-add.html

@@ -27,18 +27,18 @@
                     <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.phone" br></sa-item>
-						<sa-item type="text" name="负责人" v-model="m.dutyPeople" br></sa-item>
-						<sa-item type="text" name="地址id" v-model="m.addressIds" br></sa-item>
-						<sa-item type="text" name="地址" v-model="m.addressStr" br></sa-item>
-						<sa-item type="img" name="营业执照" v-model="m.businessLicence" 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.creareTime" br></sa-item>
-						<sa-item type="enum" name="审核状态" v-model="m.judgeStatus" :jv="{1: '未审核'}" jtype="3" br></sa-item>
-						<sa-item type="text" name="审核时间" v-model="m.judgeTime" br></sa-item>
-						<sa-item type="text" name="审核意见" v-model="m.judgeContent" br></sa-item>
+						<el-row>
+							<sa-item type="text" name="客户名称" v-model="m.name" br></sa-item>
+							<sa-item type="text" name="联系号码" v-model="m.phone" br></sa-item>
+							<sa-item type="text" name="负责人" v-model="m.dutyPeople" br></sa-item>
+							<sa-item type="enum" name="结账方式" v-model="m.payType" :jv="{2: '月结', 1: '现结'}" jtype="1" br></sa-item>
+							<div class="c-item br">
+								<label class="c-label"><label style="color: red">*</label>地区:</label>
+								<el-cascader size="mini" placeholder="请选择" v-model="m.address_arry"
+									:options="options" :props={value:'id',label:'district'}></el-cascader>
+							</div>
+							<sa-item type="img" name="营业执照" v-model="m.businessLicence" br></sa-item>
+						</el-row>
 						<sa-item name="" class="s-ok" br>
 							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
 						</sa-item>
@@ -61,42 +61,38 @@
 				data: {
 					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
 					m: null,		// 实体对象 
+					options: [],
 				},
 				methods: {
+					getAddress() {
+						sa.ajax('/TbDistrict/getTreeData', function(resp) {
+							this.options = resp.data;
+						}.bind(this));
+					},
 					// 创建一个 默认Model 
 					createModel: function() {
 						return {
-							id: '',		// 主键 
 							name: '',		// 名称 
 							phone: '',		// 联系号码 
 							dutyPeople: '',		// 负责人 
 							addressIds: '',		// 地址id 
 							addressStr: '',		// 地址 
 							businessLicence: '',		// 营业执照 
-							status: '',		// 状态(0=否,1=是) 
-							creareTime: '',		// 创建时间 
-							judgeStatus: '',		// 审核状态(1=未审核,2审核通过,3审核不通过) 
-							judgeTime: '',		// 审核时间 
-							judgeContent: '',		// 审核意见 
+							address_arry:[],
+							payType:2,
+							status: '1',		// 状态(0=否,1=是) 
+							judgeStatus: '2',		// 审核状态(1=未审核,2审核通过,3审核不通过) 
 						}
 					},
 					// 提交数据 
 					ok: function(){
 						// 表单校验 
 						let m = this.m;
-						sa.checkNull(m.id, '请输入 [主键]');
-						sa.checkNull(m.name, '请输入 [名称]');
+						sa.checkNull(m.name, '请输入 [客户名称]');
 						sa.checkNull(m.phone, '请输入 [联系号码]');
 						sa.checkNull(m.dutyPeople, '请输入 [负责人]');
-						sa.checkNull(m.addressIds, '请输入 [地址id]');
-						sa.checkNull(m.addressStr, '请输入 [地址]');
-						sa.checkNull(m.businessLicence, '请输入 [营业执照]');
-						sa.checkNull(m.status, '请输入 [状态]');
-						sa.checkNull(m.creareTime, '请输入 [创建时间]');
-						sa.checkNull(m.judgeStatus, '请输入 [审核状态]');
-						sa.checkNull(m.judgeTime, '请输入 [审核时间]');
-						sa.checkNull(m.judgeContent, '请输入 [审核意见]');
-				
+						this.m.addressIds = this.m.address_arry.join(',');
+						sa.checkNull(m.addressIds, '请选择 [地址信息]');
 						// 开始增加或修改
 						if(this.id <= 0) {	// 添加
 							sa.ajax('/TbCostomer/add', m, function(res){
@@ -125,11 +121,13 @@
 					} else {	
 						sa.ajax('/TbCostomer/getById?id=' + this.id, function(res) {
 							this.m = res.data;
+							this.m.address_arry=res.data?res.data.addressIds.split(",").map(id=>parseInt(id)):[];
 							if(res.data == null) {
 								sa.alert('未能查找到 id=' + this.id + " 详细数据");
 							}
 						}.bind(this))
 					}
+					this.getAddress();
 				}
 			})
 			

+ 9 - 28
sp-admin/sa-view/tb-costomer/tb-costomer-list.html

@@ -20,59 +20,37 @@
 				<!-- ------------- 检索参数 ------------- -->
 				<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.phone"></sa-item>
 					<sa-item type="text" name="负责人" v-model="p.dutyPeople"></sa-item>
-					<sa-item type="text" name="地址id" v-model="p.addressIds"></sa-item>
-					<sa-item type="text" name="地址" v-model="p.addressStr"></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.creareTime"></sa-item>
-					<sa-item type="enum" name="审核状态" v-model="p.judgeStatus" 
-						:jv="{1: '未审核'}" jtype="2" def="不限"></sa-item>
-					<sa-item type="text" name="审核时间" v-model="p.judgeTime"></sa-item>
-					<sa-item type="text" name="审核意见" v-model="p.judgeContent"></sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
 					<br />
 					<sa-item name="综合排序">
 						<el-radio-group v-model="p.sortType" class="s-radio-text">
 							<el-radio :label="0">默认</el-radio>
-							<el-radio :label="1">主键</el-radio>
 							<el-radio :label="2">名称</el-radio>
-							<el-radio :label="3">联系号码</el-radio>
-							<el-radio :label="4">负责人</el-radio>
-							<el-radio :label="5">地址id</el-radio>
-							<el-radio :label="6">地址</el-radio>
-							<el-radio :label="7">状态</el-radio>
 							<el-radio :label="8">创建时间</el-radio>
-							<el-radio :label="9">审核状态</el-radio>
-							<el-radio :label="10">审核时间</el-radio>
-							<el-radio :label="11">审核意见</el-radio>
 						</el-radio-group>
 					</sa-item>
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
-				<sa-item type="fast-btn" show="add,get,delete,export,reset"></sa-item>
+				<sa-item type="fast-btn" show="add,get,delete,reset"></sa-item>
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList" >
 					<sa-td type="selection"></sa-td>
-					<sa-td name="主键" prop="id" type="num"></sa-td>
 					<sa-td name="名称" prop="name" ></sa-td>
 					<sa-td name="联系号码" prop="phone" ></sa-td>
 					<sa-td name="负责人" prop="dutyPeople" ></sa-td>
-					<sa-td name="地址id" prop="addressIds" ></sa-td>
+					<sa-td name="结算类型" prop="payType" type="enum" :jv="{1: '现结', 2: '月结'}"></sa-td>
 					<sa-td name="地址" prop="addressStr" ></sa-td>
 					<sa-td name="营业执照" prop="businessLicence" type="img"></sa-td>
-					<sa-td name="状态" prop="status" type="switch" :jv="{0: '否', 1: '是'}" @change="s => updateStatus(s.row)"></sa-td>
+					<sa-td name="是否启用" prop="status" type="switch" :jv="{0: '否[#ff0000]', 1: '是[#005500]'}" @change="s => updateStatus(s.row)"></sa-td>
 					<sa-td name="创建时间" prop="creareTime" ></sa-td>
-					<sa-td name="审核状态" prop="judgeStatus" type="enum" :jv="{1: '未审核'}"></sa-td>
-					<sa-td name="审核时间" prop="judgeTime" ></sa-td>
-					<sa-td name="审核意见" prop="judgeContent" ></sa-td>
-					<el-table-column label="操作" fixed="right"  width="240px">
+					<el-table-column label="操作" fixed="right"  width="280px">
 						<template slot-scope="s">
 							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
 							<el-button class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
+							<el-button class="c-btn" type="primary" icon="el-icon-user-solid" @click="userFn(s.row)">用户</el-button>
 							<el-button class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
 						</template>
 					</el-table-column>
@@ -109,6 +87,9 @@
 					dataList: [], // 数据集合 
 				},
 				methods: {
+					userFn(data){
+							sa.showIframe('企业用户', 'customer-admin-list.html?customerId=' + data.id, '1050px', '90%');
+					},
 					// 刷新
 					f5: function() {
 						sa.ajax('/TbCostomer/getList', sa.removeNull(this.p), function(res) {
@@ -135,7 +116,7 @@
 					},
 					// 新增
 					add: function(data) {
-						sa.showIframe('新增数据', 'tb-costomer-add.html?id=-1', '1000px', '90%');
+						sa.showIframe('新增数据', 'tb-costomer-add.html?id=-1', '550px', '80%');
 					},
 					// 删除
 					del: function(data) {

+ 27 - 0
sp-server/src/main/java/com/pj/constants/RoleEnum.java

@@ -0,0 +1,27 @@
+package com.pj.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Getter
+@AllArgsConstructor
+public enum RoleEnum {
+    INPUT_ROLE("input","业务录入",Arrays.asList("tb-business","tb-business-list","tb-business-add")),
+    CONFIRM_ROLE("confirm","业务确认",Arrays.asList("tb-business","tb-business-list","tb-business-confirm")),
+    PAY_ROLE("pay","业务支付",Arrays.asList("tb-business","tb-business-list","tb-business-pay")),
+    ADMIN_ROLE("admin","管理员", Collections.emptyList()),
+    SUPER_ROLE("super","超级管理员", Collections.emptyList());
+    private String type;
+    private String name;
+    private List<String>perCode;
+
+    public static List<RoleEnum>getCustomerInitRoleList(){
+        return Arrays.asList(INPUT_ROLE,CONFIRM_ROLE, PAY_ROLE);
+    }
+}

+ 1 - 1
sp-server/src/main/java/com/pj/current/config/UserTypeEnum.java → sp-server/src/main/java/com/pj/constants/UserTypeEnum.java

@@ -1,4 +1,4 @@
-package com.pj.current.config;
+package com.pj.constants;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 4 - 2
sp-server/src/main/java/com/pj/current/satoken/StpInterfaceImpl.java

@@ -2,6 +2,7 @@ package com.pj.current.satoken;
 
 import java.util.List;
 
+import com.pj.project4sp.admin.SpAdmin;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -30,8 +31,9 @@ public class StpInterfaceImpl implements StpInterface {
 	@Override
 	public List<String> getPermissionList(Object loginId, String loginType) {
 		if(loginType.equals(StpUtil.TYPE)) {
-			long roleId = spAdminMapper.getById(Long.valueOf(loginId.toString())).getRoleId();
-			return spRolePermissionService.getPcodeByRid(roleId);								
+		SpAdmin spAdmin= spAdminMapper.getById(Long.valueOf( loginId.toString()));
+		String roleIds=spAdmin.getRoleId();
+		return 	spRolePermissionService.getPcodeByRid(roleIds);
 		}
 		return null;
 	}

+ 928 - 837
sp-server/src/main/java/com/pj/current/satoken/StpUserUtil.java

@@ -2,6 +2,9 @@ package com.pj.current.satoken;
 
 import java.util.List;
 
+import cn.hutool.json.JSONUtil;
+import com.pj.project4sp.admin.SpAdmin;
+import com.pj.utils.cache.RedisUtil;
 import org.springframework.stereotype.Component;
 
 import cn.dev33.satoken.SaManager;
@@ -13,844 +16,932 @@ import cn.dev33.satoken.stp.StpLogic;
 import cn.dev33.satoken.stp.StpUtil;
 
 /**
- * Sa-Token 权限认证工具类 (User版本) 
- * @author kong 
+ * Sa-Token 权限认证工具类 (User版本)
+ *
+ * @author kong
  */
 @Component
 public class StpUserUtil {
-	
-	/**
-	 * 账号类型标识 
-	 */
-	public static final String TYPE = "user";
-	
-	/**
-	 * 底层的 StpLogic 对象  
-	 */
-	public static StpLogic stpLogic = new StpLogic(TYPE); 
-
-	/**
-	 * 获取当前 StpLogic 的账号类型
-	 * @return See Note 
-	 */
-	public static String getLoginType(){
-		return stpLogic.getLoginType();
-	}
-
-	/**
-	 * 重置 StpLogic 对象
-	 * @param stpLogic / 
-	 */
-	public static void setStpLogic(StpLogic stpLogic) {
-		StpUtil.stpLogic = stpLogic;
-		// 防止自定义 stpLogic 被覆盖 
-		SaManager.putStpLogic(stpLogic);
-	}
-	
-	
-	// =================== 获取token 相关 ===================
-
-	/**
-	 * 返回token名称 
-	 * @return 此StpLogic的token名称
-	 */
-	public static String getTokenName() {
- 		return stpLogic.getTokenName();
- 	}
-
- 	/**
- 	 * 在当前会话写入当前TokenValue 
- 	 * @param tokenValue token值 
- 	 * @param cookieTimeout Cookie存活时间(秒)
- 	 */
-	public static void setTokenValue(String tokenValue, int cookieTimeout){
-		stpLogic.setTokenValue(tokenValue, cookieTimeout);
-	}
- 	
-	/**
-	 * 获取当前TokenValue
-	 * @return 当前tokenValue
-	 */
-	public static String getTokenValue() {
-		return stpLogic.getTokenValue();
-	}
-
-	/**
-	 * 获取当前会话的Token信息 
-	 * @return token信息 
-	 */
-	public static SaTokenInfo getTokenInfo() {
-		return stpLogic.getTokenInfo();
-	}
-
-	
-	// =================== 登录相关操作 ===================
-
-	// --- 登录 
-	
-	/**
-	 * 会话登录 
-	 * @param id 账号id,建议的类型:(long | int | String)
-	 */
-	public static void login(Object id) {
-		stpLogic.login(id);
-	}
-
-	/**
-	 * 会话登录,并指定登录设备 
-	 * @param id 账号id,建议的类型:(long | int | String)
-	 * @param device 设备标识 
-	 */
-	public static void login(Object id, String device) {
-		stpLogic.login(id, device);
-	}
-
-	/**
-	 * 会话登录,并指定是否 [记住我] 
-	 * @param id 账号id,建议的类型:(long | int | String)
-	 * @param isLastingCookie 是否为持久Cookie 
-	 */
-	public static void login(Object id, boolean isLastingCookie) {
-		stpLogic.login(id, isLastingCookie);
-	}
-
-	/**
-	 * 会话登录,并指定所有登录参数Model 
-	 * @param id 登录id,建议的类型:(long | int | String)
-	 * @param loginModel 此次登录的参数Model 
-	 */
-	public static void login(Object id, SaLoginModel loginModel) {
-		stpLogic.login(id, loginModel);
-	}
-
-	// --- 注销 
-	
-	/** 
-	 * 会话注销 
-	 */
-	public static void logout() {
-		stpLogic.logout();
-	}
-
-	/**
-	 * 会话注销,根据账号id 
-	 * @param loginId 账号id 
-	 */
-	public static void logout(Object loginId) {
-		stpLogic.logout(loginId);
-	}
-
-	/**
-	 * 会话注销,根据账号id 和 设备标识 
-	 * 
-	 * @param loginId 账号id 
-	 * @param device 设备标识 (填null代表所有注销设备) 
-	 */
-	public static void logout(Object loginId, String device) {
-		stpLogic.logout(loginId, device);
-	}
-	
-	/**
-	 * 会话注销,根据指定 Token 
-	 * 
-	 * @param tokenValue 指定token
-	 */
-	public static void logoutByTokenValue(String tokenValue) {
-		stpLogic.logoutByTokenValue(tokenValue);
-	}
-	
-	/**
-	 * 踢人下线,根据账号id 
-	 * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5 </p>
-	 * 
-	 * @param loginId 账号id 
-	 */
-	public static void kickout(Object loginId) {
-		stpLogic.kickout(loginId);
-	}
-	
-	/**
-	 * 踢人下线,根据账号id 和 设备标识 
-	 * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5 </p>
-	 * 
-	 * @param loginId 账号id 
-	 * @param device 设备标识 (填null代表踢出所有设备) 
-	 */
-	public static void kickout(Object loginId, String device) {
-		stpLogic.kickout(loginId, device);
-	}
-
-	/**
-	 * 踢人下线,根据指定 Token 
-	 * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5 </p>
-	 * 
-	 * @param tokenValue 指定token
-	 */
-	public static void kickoutByTokenValue(String tokenValue) {
-		stpLogic.kickoutByTokenValue(tokenValue);
-	}
-	
-	/**
-	 * 顶人下线,根据账号id 和 设备标识 
-	 * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-4 </p>
-	 * 
-	 * @param loginId 账号id 
-	 * @param device 设备标识 (填null代表顶替所有设备) 
-	 */
-	public static void replaced(Object loginId, String device) {
-		stpLogic.replaced(loginId, device);
-	}
-	
-	
-	// 查询相关
-
-	/** 
- 	 * 当前会话是否已经登录 
- 	 * @return 是否已登录 
- 	 */
-	public static boolean isLogin() {
-		return stpLogic.isLogin();
-	}
-
-	/** 
- 	 * 检验当前会话是否已经登录,如未登录,则抛出异常 
- 	 */
- 	public static void checkLogin() {
- 		stpLogic.checkLogin();
- 	}
-
- 	/** 
- 	 * 获取当前会话账号id, 如果未登录,则抛出异常 
- 	 * @return 账号id
- 	 */
-	public static Object getLoginId() {
-		return stpLogic.getLoginId();
-	}
-
-	/** 
-	 * 获取当前会话账号id, 如果未登录,则返回默认值 
-	 * @param <T> 返回类型 
-	 * @param defaultValue 默认值
-	 * @return 登录id 
-	 */
-	public static <T> T getLoginId(T defaultValue) {
-		return stpLogic.getLoginId(defaultValue);
-	}
-
-	/** 
-	 * 获取当前会话账号id, 如果未登录,则返回null 
-	 * @return 账号id 
-	 */
-	public static Object getLoginIdDefaultNull() {
-		return stpLogic.getLoginIdDefaultNull();
- 	}
-
-	/** 
-	 * 获取当前会话账号id, 并转换为String类型
-	 * @return 账号id 
-	 */
-	public static String getLoginIdAsString() {
-		return stpLogic.getLoginIdAsString();
-	}
-
-	/** 
-	 * 获取当前会话账号id, 并转换为int类型
-	 * @return 账号id 
-	 */
-	public static int getLoginIdAsInt() {
-		return stpLogic.getLoginIdAsInt();
-	}
-
-	/**
-	 * 获取当前会话账号id, 并转换为long类型 
-	 * @return 账号id 
-	 */
-	public static long getLoginIdAsLong() {
-		return stpLogic.getLoginIdAsLong();
-	}
-
-	/** 
- 	 * 获取指定Token对应的账号id,如果未登录,则返回 null 
- 	 * @param tokenValue token
- 	 * @return 账号id
- 	 */
- 	public static Object getLoginIdByToken(String tokenValue) {
- 		return stpLogic.getLoginIdByToken(tokenValue);
- 	}
-	
- 	
-	// =================== User-Session 相关 ===================
-
- 	/** 
-	 * 获取指定账号id的Session, 如果Session尚未创建,isCreate=是否新建并返回
-	 * @param loginId 账号id
-	 * @param isCreate 是否新建
-	 * @return Session对象
-	 */
-	public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
-		return stpLogic.getSessionByLoginId(loginId, isCreate);
-	}
-
-	/** 
-	 * 获取指定key的Session, 如果Session尚未创建,则返回null
-	 * @param sessionId SessionId
-	 * @return Session对象 
-	 */
-	public static SaSession getSessionBySessionId(String sessionId) {
-		return stpLogic.getSessionBySessionId(sessionId);
-	}
-
-	/** 
-	 * 获取指定账号id的Session,如果Session尚未创建,则新建并返回 
-	 * @param loginId 账号id 
-	 * @return Session对象 
-	 */
-	public static SaSession getSessionByLoginId(Object loginId) {
-		return stpLogic.getSessionByLoginId(loginId);
-	}
-
-	/** 
-	 * 获取当前会话的Session, 如果Session尚未创建,isCreate=是否新建并返回 
-	 * @param isCreate 是否新建 
-	 * @return Session对象 
-	 */
-	public static SaSession getSession(boolean isCreate) {
-		return stpLogic.getSession(isCreate);
-	}
-
-	/** 
-	 * 获取当前会话的Session,如果Session尚未创建,则新建并返回 
-	 * @return Session对象 
-	 */
-	public static SaSession getSession() {
-		return stpLogic.getSession();
-	}
-
-	
-	// =================== Token-Session 相关 ===================  
-	
-	/** 
-	 * 获取指定Token-Session,如果Session尚未创建,则新建并返回 
-	 * @param tokenValue Token值
-	 * @return Session对象  
-	 */
-	public static SaSession getTokenSessionByToken(String tokenValue) {
-		return stpLogic.getTokenSessionByToken(tokenValue);
-	}
-	
-	/** 
-	 * 获取当前Token-Session,如果Session尚未创建,则新建并返回
-	 * @return Session对象 
-	 */
-	public static SaSession getTokenSession() {
-		return stpLogic.getTokenSession();
-	}
-
-
-	// =================== [临时过期] 验证相关 ===================  
-
-	/**
- 	 * 检查当前token 是否已经[临时过期],如果已经过期则抛出异常  
- 	 */
- 	public static void checkActivityTimeout() {
- 		stpLogic.checkActivityTimeout();
- 	}
-
- 	/**
- 	 * 续签当前token:(将 [最后操作时间] 更新为当前时间戳) 
- 	 * <h1>请注意: 即时token已经 [临时过期] 也可续签成功,
- 	 * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可 </h1>
- 	 */
- 	public static void updateLastActivityToNow() {
- 		stpLogic.updateLastActivityToNow();
- 	}
- 	
-
-	// =================== 过期时间相关 ===================  
-
- 	/**
- 	 * 获取当前登录者的 token 剩余有效时间 (单位: 秒)
- 	 * @return token剩余有效时间
- 	 */
- 	public static long getTokenTimeout() {
- 		return stpLogic.getTokenTimeout();
- 	}
- 	
- 	/**
- 	 * 获取当前登录者的 User-Session 剩余有效时间 (单位: 秒)
- 	 * @return token剩余有效时间
- 	 */
- 	public static long getSessionTimeout() {
- 		return stpLogic.getSessionTimeout();
- 	}
-
- 	/**
- 	 * 获取当前 Token-Session 剩余有效时间 (单位: 秒) 
- 	 * @return token剩余有效时间
- 	 */
- 	public static long getTokenSessionTimeout() {
- 		return stpLogic.getTokenSessionTimeout();
- 	}
- 	
- 	/**
- 	 * 获取当前 token [临时过期] 剩余有效时间 (单位: 秒)
- 	 * @return token [临时过期] 剩余有效时间
- 	 */
- 	public static long getTokenActivityTimeout() {
- 		return stpLogic.getTokenActivityTimeout();
- 	}
- 	
-
- 	
-	// =================== 角色验证操作 ===================  
-
-	/**
-	 * 获取:当前账号的角色集合 
-	 * @return /
-	 */
-	public static List<String> getRoleList() {
-		return stpLogic.getRoleList();
-	}
-
-	/**
-	 * 获取:指定账号的角色集合 
-	 * @param loginId 指定账号id 
-	 * @return /
-	 */
-	public static List<String> getRoleList(Object loginId) {
-		return stpLogic.getRoleList(loginId);
-	}
-
- 	/** 
- 	 * 判断:当前账号是否拥有指定角色, 返回true或false 
- 	 * @param role 角色标识
- 	 * @return 是否含有指定角色标识
- 	 */
- 	public static boolean hasRole(String role) {
- 		return stpLogic.hasRole(role);
- 	}
-
- 	/** 
- 	 * 判断:指定账号是否含有指定角色标识, 返回true或false 
- 	 * @param loginId 账号id
- 	 * @param role 角色标识
- 	 * @return 是否含有指定角色标识
- 	 */
- 	public static boolean hasRole(Object loginId, String role) {
- 		return stpLogic.hasRole(loginId, role);
- 	}
- 	
- 	/** 
- 	 * 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] 
- 	 * @param roleArray 角色标识数组
- 	 * @return true或false
- 	 */
- 	public static boolean hasRoleAnd(String... roleArray){
- 		return stpLogic.hasRoleAnd(roleArray);
- 	}
-
- 	/** 
- 	 * 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] 
- 	 * @param roleArray 角色标识数组
- 	 * @return true或false
- 	 */
- 	public static boolean hasRoleOr(String... roleArray){
- 		return stpLogic.hasRoleOr(roleArray);
- 	}
- 	
- 	/** 
- 	 * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException 
- 	 * @param role 角色标识
- 	 */
- 	public static void checkRole(String role) {
- 		stpLogic.checkRole(role);
- 	}
-
- 	/** 
- 	 * 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] 
- 	 * @param roleArray 角色标识数组
- 	 */
- 	public static void checkRoleAnd(String... roleArray){
- 		stpLogic.checkRoleAnd(roleArray);
- 	}
-
- 	/** 
- 	 * 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] 
- 	 * @param roleArray 角色标识数组
- 	 */
- 	public static void checkRoleOr(String... roleArray){
- 		stpLogic.checkRoleOr(roleArray);
- 	}
-
-	
-	// =================== 权限验证操作 ===================
-
-	/**
-	 * 获取:当前账号的权限码集合 
-	 * @return / 
-	 */
-	public static List<String> getPermissionList() {
-		return stpLogic.getPermissionList();
-	}
-
-	/**
-	 * 获取:指定账号的权限码集合 
-	 * @param loginId 指定账号id
-	 * @return / 
-	 */
-	public static List<String> getPermissionList(Object loginId) {
-		return stpLogic.getPermissionList(loginId);
-	}
-
- 	/** 
- 	 * 判断:当前账号是否含有指定权限, 返回true或false 
- 	 * @param permission 权限码
- 	 * @return 是否含有指定权限
- 	 */
-	public static boolean hasPermission(String permission) {
-		return stpLogic.hasPermission(permission);
-	}
-
- 	/** 
- 	 * 判断:指定账号id是否含有指定权限, 返回true或false 
- 	 * @param loginId 账号id
- 	 * @param permission 权限码
- 	 * @return 是否含有指定权限
- 	 */
-	public static boolean hasPermission(Object loginId, String permission) {
-		return stpLogic.hasPermission(loginId, permission);
-	}
-
- 	/** 
- 	 * 判断:当前账号是否含有指定权限, [指定多个,必须全部具有] 
- 	 * @param permissionArray 权限码数组
- 	 * @return true 或 false 
- 	 */
- 	public static boolean hasPermissionAnd(String... permissionArray){
- 		return stpLogic.hasPermissionAnd(permissionArray);
- 	}
-
- 	/** 
- 	 * 判断:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] 
- 	 * @param permissionArray 权限码数组
- 	 * @return true 或 false 
- 	 */
- 	public static boolean hasPermissionOr(String... permissionArray){
- 		return stpLogic.hasPermissionOr(permissionArray);
- 	}
- 	
- 	/** 
- 	 * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException 
- 	 * @param permission 权限码
- 	 */
-	public static void checkPermission(String permission) {
-		stpLogic.checkPermission(permission);
-	}
-
- 	/** 
- 	 * 校验:当前账号是否含有指定权限 [指定多个,必须全部验证通过] 
- 	 * @param permissionArray 权限码数组
- 	 */
-	public static void checkPermissionAnd(String... permissionArray) {
-		stpLogic.checkPermissionAnd(permissionArray);
-	}
-
- 	/** 
- 	 * 校验:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] 
- 	 * @param permissionArray 权限码数组
- 	 */
-	public static void checkPermissionOr(String... permissionArray) {
-		stpLogic.checkPermissionOr(permissionArray);
-	}
-
-
-	// =================== id 反查token 相关操作 ===================  
-	
-	/** 
-	 * 获取指定账号id的tokenValue 
-	 * <p> 在配置为允许并发登录时,此方法只会返回队列的最后一个token,
-	 * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId 
-	 * @param loginId 账号id
-	 * @return token值 
-	 */
-	public static String getTokenValueByLoginId(Object loginId) {
-		return stpLogic.getTokenValueByLoginId(loginId);
-	}
-
-	/** 
-	 * 获取指定账号id指定设备端的tokenValue 
-	 * <p> 在配置为允许并发登录时,此方法只会返回队列的最后一个token,
-	 * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId 
-	 * @param loginId 账号id
-	 * @param device 设备标识 
-	 * @return token值 
-	 */
-	public static String getTokenValueByLoginId(Object loginId, String device) {
-		return stpLogic.getTokenValueByLoginId(loginId, device);
-	}
-	
-	/** 
-	 * 获取指定账号id的tokenValue集合 
-	 * @param loginId 账号id 
-	 * @return 此loginId的所有相关token 
- 	 */
-	public static List<String> getTokenValueListByLoginId(Object loginId) {
-		return stpLogic.getTokenValueListByLoginId(loginId);
-	}
-
-	/** 
-	 * 获取指定账号id指定设备端的tokenValue 集合 
-	 * @param loginId 账号id 
-	 * @param device 设备标识 
-	 * @return 此loginId的所有相关token 
- 	 */
-	public static List<String> getTokenValueListByLoginId(Object loginId, String device) {
-		return stpLogic.getTokenValueListByLoginId(loginId, device);
-	}
-	
-	/**
-	 * 返回当前会话的登录设备 
-	 * @return 当前令牌的登录设备 
-	 */
-	public static String getLoginDevice() {
-		return stpLogic.getLoginDevice(); 
-	}
-
-	
-	// =================== 会话管理 ===================  
-
-	/**
-	 * 根据条件查询Token 
-	 * @param keyword 关键字 
-	 * @param start 开始处索引 (-1代表查询所有) 
-	 * @param size 获取数量 
-	 * @return token集合 
-	 */
-	public static List<String> searchTokenValue(String keyword, int start, int size) {
-		return stpLogic.searchTokenValue(keyword, start, size);
-	}
-	
-	/**
-	 * 根据条件查询SessionId 
-	 * @param keyword 关键字 
-	 * @param start 开始处索引 (-1代表查询所有) 
-	 * @param size 获取数量 
-	 * @return sessionId集合 
-	 */
-	public static List<String> searchSessionId(String keyword, int start, int size) {
-		return stpLogic.searchSessionId(keyword, start, size);
-	}
-
-	/**
-	 * 根据条件查询Token专属Session的Id 
-	 * @param keyword 关键字 
-	 * @param start 开始处索引 (-1代表查询所有) 
-	 * @param size 获取数量 
-	 * @return sessionId集合 
-	 */
-	public static List<String> searchTokenSessionId(String keyword, int start, int size) {
-		return stpLogic.searchTokenSessionId(keyword, start, size);
-	}
-
-	
-	// ------------------- 账号封禁 -------------------  
-
-	/**
-	 * 封禁指定账号
-	 * <p> 此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常 
-	 * @param loginId 指定账号id 
-	 * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
-	 */
-	public static void disable(Object loginId, long disableTime) {
-		stpLogic.disable(loginId, disableTime);
-	}
-	
-	/**
-	 * 指定账号是否已被封禁 (true=已被封禁, false=未被封禁) 
-	 * @param loginId 账号id
-	 * @return see note
-	 */
-	public static boolean isDisable(Object loginId) {
-		return stpLogic.isDisable(loginId);
-	}
-	
-	/**
-	 * 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
-	 * @param loginId 账号id
-	 * @return see note 
-	 */
-	public static long getDisableTime(Object loginId) {
-		return stpLogic.getDisableTime(loginId);
-	}
-
-	/**
-	 * 解封指定账号
-	 * @param loginId 账号id 
-	 */
-	public static void untieDisable(Object loginId) {
-		stpLogic.untieDisable(loginId);
-	}
-	
-	
-	// =================== 身份切换 ===================  
-
-	/**
-	 * 临时切换身份为指定账号id 
-	 * @param loginId 指定loginId 
-	 */
-	public static void switchTo(Object loginId) {
-		stpLogic.switchTo(loginId);
-	}
-	
-	/**
-	 * 结束临时切换身份
-	 */
-	public static void endSwitch() {
-		stpLogic.endSwitch();
-	}
-
-	/**
-	 * 当前是否正处于[身份临时切换]中 
-	 * @return 是否正处于[身份临时切换]中 
-	 */
-	public static boolean isSwitch() {
-		return stpLogic.isSwitch();
-	}
-
-	/**
-	 * 在一个代码段里方法内,临时切换身份为指定账号id
-	 * @param loginId 指定账号id 
-	 * @param function 要执行的方法 
-	 */
-	public static void switchTo(Object loginId, SaFunction function) {
-		stpLogic.switchTo(loginId, function);
-	}
-	
-
-	// ------------------- 二级认证 -------------------  
-	
-	/**
-	 * 在当前会话 开启二级认证 
-	 * @param safeTime 维持时间 (单位: 秒) 
-	 */
-	public static void openSafe(long safeTime) {
-		stpLogic.openSafe(safeTime);
-	}
-
-	/**
-	 * 当前会话 是否处于二级认证时间内 
-	 * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 
-	 */
-	public static boolean isSafe() {
-		return stpLogic.isSafe();
-	}
-
-	/**
-	 * 检查当前会话是否已通过二级认证,如未通过则抛出异常 
-	 */
-	public static void checkSafe() {
-		stpLogic.checkSafe();
-	}
-	
-	/**
-	 * 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
-	 * @return 剩余有效时间
-	 */
-	public static long getSafeTime() {
-		return stpLogic.getSafeTime();
-	}
-
-	/**
-	 * 在当前会话 结束二级认证 
-	 */
-	public static void closeSafe() {
-		stpLogic.closeSafe();
-	}
-
-
-	// =================== 历史API,兼容旧版本 ===================  
-
-	/**
-	 * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.getLoginType() ,使用方式保持不变 </h1>
-	 * 
-	 * 获取当前StpLogin的loginKey 
-	 * @return 当前StpLogin的loginKey
-	 */
-	@Deprecated
-	public static String getLoginKey(){
-		return stpLogic.getLoginType();
-	}
-
-	/**
-	 * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
-	 * 
-	 * 在当前会话上登录id 
-	 * @param loginId 登录id,建议的类型:(long | int | String)
-	 */
-	@Deprecated
-	public static void setLoginId(Object loginId) {
-		stpLogic.login(loginId);
-	}
-
-	/**
-	 * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
-	 * 
-	 * 在当前会话上登录id, 并指定登录设备 
-	 * @param loginId 登录id,建议的类型:(long | int | String)
-	 * @param device 设备标识 
-	 */
-	@Deprecated
-	public static void setLoginId(Object loginId, String device) {
-		stpLogic.login(loginId, device);
-	}
-
-	/**
-	 * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
-	 * 
-	 * 在当前会话上登录id, 并指定登录设备 
-	 * @param loginId 登录id,建议的类型:(long | int | String)
-	 * @param isLastingCookie 是否为持久Cookie 
-	 */
-	@Deprecated
-	public static void setLoginId(Object loginId, boolean isLastingCookie) {
-		stpLogic.login(loginId, isLastingCookie);
-	}
-	
-	/**
-	 * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
-	 * 
-	 * 在当前会话上登录id, 并指定所有登录参数Model 
-	 * @param loginId 登录id,建议的类型:(long | int | String)
-	 * @param loginModel 此次登录的参数Model 
-	 */
-	@Deprecated
-	public static void setLoginId(Object loginId, SaLoginModel loginModel) {
-		stpLogic.login(loginId, loginModel);
-	}
-	
-	/**
-	 * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变 </h1>
-	 * 
-	 * 会话注销,根据账号id (踢人下线)
-	 * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
-	 * @param loginId 账号id 
-	 */
-	@Deprecated
-	public static void logoutByLoginId(Object loginId) {
-		stpLogic.kickout(loginId);
-	}
-	
-	/**
-	 * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变 </h1>
-	 * 
-	 * 会话注销,根据账号id and 设备标识 (踢人下线)
-	 * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2 </p>
-	 * @param loginId 账号id 
-	 * @param device 设备标识 (填null代表所有注销设备) 
-	 */
-	@Deprecated
-	public static void logoutByLoginId(Object loginId, String device) {
-		stpLogic.kickout(loginId, device);
-	}
-	
+
+    /**
+     * 账号类型标识
+     */
+    public static final String TYPE = "user";
+
+    /**
+     * 底层的 StpLogic 对象
+     */
+    public static StpLogic stpLogic = new StpLogic(TYPE);
+
+    /**
+     * 获取当前 StpLogic 的账号类型
+     *
+     * @return See Note
+     */
+    public static String getLoginType() {
+        return stpLogic.getLoginType();
+    }
+
+    public static void saveAdmin(Long loginId, SpAdmin spAdmin) {
+        String key = "admin:" + loginId;
+        RedisUtil.set(key, JSONUtil.toJsonStr(spAdmin));
+    }
+
+    public static SpAdmin getAdmin() {
+        String key = "admin:" + StpUtil.getLoginIdAsLong();
+        String adminJson = RedisUtil.get(key);
+        return JSONUtil.toBean(adminJson, SpAdmin.class);
+    }
+
+    public static String getCustomerId(){
+        return getAdmin().getCustomerId();
+    }
+
+    /**
+     * 重置 StpLogic 对象
+     *
+     * @param stpLogic /
+     */
+    public static void setStpLogic(StpLogic stpLogic) {
+        StpUtil.stpLogic = stpLogic;
+        // 防止自定义 stpLogic 被覆盖
+        SaManager.putStpLogic(stpLogic);
+    }
+
+
+    // =================== 获取token 相关 ===================
+
+    /**
+     * 返回token名称
+     *
+     * @return 此StpLogic的token名称
+     */
+    public static String getTokenName() {
+        return stpLogic.getTokenName();
+    }
+
+    /**
+     * 在当前会话写入当前TokenValue
+     *
+     * @param tokenValue    token值
+     * @param cookieTimeout Cookie存活时间(秒)
+     */
+    public static void setTokenValue(String tokenValue, int cookieTimeout) {
+        stpLogic.setTokenValue(tokenValue, cookieTimeout);
+    }
+
+    /**
+     * 获取当前TokenValue
+     *
+     * @return 当前tokenValue
+     */
+    public static String getTokenValue() {
+        return stpLogic.getTokenValue();
+    }
+
+    /**
+     * 获取当前会话的Token信息
+     *
+     * @return token信息
+     */
+    public static SaTokenInfo getTokenInfo() {
+        return stpLogic.getTokenInfo();
+    }
+
+
+    // =================== 登录相关操作 ===================
+
+    // --- 登录
+
+    /**
+     * 会话登录
+     *
+     * @param id 账号id,建议的类型:(long | int | String)
+     */
+    public static void login(Object id) {
+        stpLogic.login(id);
+    }
+
+    /**
+     * 会话登录,并指定登录设备
+     *
+     * @param id     账号id,建议的类型:(long | int | String)
+     * @param device 设备标识
+     */
+    public static void login(Object id, String device) {
+        stpLogic.login(id, device);
+    }
+
+    /**
+     * 会话登录,并指定是否 [记住我]
+     *
+     * @param id              账号id,建议的类型:(long | int | String)
+     * @param isLastingCookie 是否为持久Cookie
+     */
+    public static void login(Object id, boolean isLastingCookie) {
+        stpLogic.login(id, isLastingCookie);
+    }
+
+    /**
+     * 会话登录,并指定所有登录参数Model
+     *
+     * @param id         登录id,建议的类型:(long | int | String)
+     * @param loginModel 此次登录的参数Model
+     */
+    public static void login(Object id, SaLoginModel loginModel) {
+        stpLogic.login(id, loginModel);
+    }
+
+    // --- 注销
+
+    /**
+     * 会话注销
+     */
+    public static void logout() {
+        stpLogic.logout();
+    }
+
+    /**
+     * 会话注销,根据账号id
+     *
+     * @param loginId 账号id
+     */
+    public static void logout(Object loginId) {
+        stpLogic.logout(loginId);
+    }
+
+    /**
+     * 会话注销,根据账号id 和 设备标识
+     *
+     * @param loginId 账号id
+     * @param device  设备标识 (填null代表所有注销设备)
+     */
+    public static void logout(Object loginId, String device) {
+        stpLogic.logout(loginId, device);
+    }
+
+    /**
+     * 会话注销,根据指定 Token
+     *
+     * @param tokenValue 指定token
+     */
+    public static void logoutByTokenValue(String tokenValue) {
+        stpLogic.logoutByTokenValue(tokenValue);
+    }
+
+    /**
+     * 踢人下线,根据账号id
+     * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5 </p>
+     *
+     * @param loginId 账号id
+     */
+    public static void kickout(Object loginId) {
+        stpLogic.kickout(loginId);
+    }
+
+    /**
+     * 踢人下线,根据账号id 和 设备标识
+     * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5 </p>
+     *
+     * @param loginId 账号id
+     * @param device  设备标识 (填null代表踢出所有设备)
+     */
+    public static void kickout(Object loginId, String device) {
+        stpLogic.kickout(loginId, device);
+    }
+
+    /**
+     * 踢人下线,根据指定 Token
+     * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5 </p>
+     *
+     * @param tokenValue 指定token
+     */
+    public static void kickoutByTokenValue(String tokenValue) {
+        stpLogic.kickoutByTokenValue(tokenValue);
+    }
+
+    /**
+     * 顶人下线,根据账号id 和 设备标识
+     * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-4 </p>
+     *
+     * @param loginId 账号id
+     * @param device  设备标识 (填null代表顶替所有设备)
+     */
+    public static void replaced(Object loginId, String device) {
+        stpLogic.replaced(loginId, device);
+    }
+
+
+    // 查询相关
+
+    /**
+     * 当前会话是否已经登录
+     *
+     * @return 是否已登录
+     */
+    public static boolean isLogin() {
+        return stpLogic.isLogin();
+    }
+
+    /**
+     * 检验当前会话是否已经登录,如未登录,则抛出异常
+     */
+    public static void checkLogin() {
+        stpLogic.checkLogin();
+    }
+
+    /**
+     * 获取当前会话账号id, 如果未登录,则抛出异常
+     *
+     * @return 账号id
+     */
+    public static Object getLoginId() {
+        return stpLogic.getLoginId();
+    }
+
+    /**
+     * 获取当前会话账号id, 如果未登录,则返回默认值
+     *
+     * @param <T>          返回类型
+     * @param defaultValue 默认值
+     * @return 登录id
+     */
+    public static <T> T getLoginId(T defaultValue) {
+        return stpLogic.getLoginId(defaultValue);
+    }
+
+    /**
+     * 获取当前会话账号id, 如果未登录,则返回null
+     *
+     * @return 账号id
+     */
+    public static Object getLoginIdDefaultNull() {
+        return stpLogic.getLoginIdDefaultNull();
+    }
+
+    /**
+     * 获取当前会话账号id, 并转换为String类型
+     *
+     * @return 账号id
+     */
+    public static String getLoginIdAsString() {
+        return stpLogic.getLoginIdAsString();
+    }
+
+    /**
+     * 获取当前会话账号id, 并转换为int类型
+     *
+     * @return 账号id
+     */
+    public static int getLoginIdAsInt() {
+        return stpLogic.getLoginIdAsInt();
+    }
+
+    /**
+     * 获取当前会话账号id, 并转换为long类型
+     *
+     * @return 账号id
+     */
+    public static long getLoginIdAsLong() {
+        return stpLogic.getLoginIdAsLong();
+    }
+
+    /**
+     * 获取指定Token对应的账号id,如果未登录,则返回 null
+     *
+     * @param tokenValue token
+     * @return 账号id
+     */
+    public static Object getLoginIdByToken(String tokenValue) {
+        return stpLogic.getLoginIdByToken(tokenValue);
+    }
+
+
+    // =================== User-Session 相关 ===================
+
+    /**
+     * 获取指定账号id的Session, 如果Session尚未创建,isCreate=是否新建并返回
+     *
+     * @param loginId  账号id
+     * @param isCreate 是否新建
+     * @return Session对象
+     */
+    public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
+        return stpLogic.getSessionByLoginId(loginId, isCreate);
+    }
+
+    /**
+     * 获取指定key的Session, 如果Session尚未创建,则返回null
+     *
+     * @param sessionId SessionId
+     * @return Session对象
+     */
+    public static SaSession getSessionBySessionId(String sessionId) {
+        return stpLogic.getSessionBySessionId(sessionId);
+    }
+
+    /**
+     * 获取指定账号id的Session,如果Session尚未创建,则新建并返回
+     *
+     * @param loginId 账号id
+     * @return Session对象
+     */
+    public static SaSession getSessionByLoginId(Object loginId) {
+        return stpLogic.getSessionByLoginId(loginId);
+    }
+
+    /**
+     * 获取当前会话的Session, 如果Session尚未创建,isCreate=是否新建并返回
+     *
+     * @param isCreate 是否新建
+     * @return Session对象
+     */
+    public static SaSession getSession(boolean isCreate) {
+        return stpLogic.getSession(isCreate);
+    }
+
+    /**
+     * 获取当前会话的Session,如果Session尚未创建,则新建并返回
+     *
+     * @return Session对象
+     */
+    public static SaSession getSession() {
+        return stpLogic.getSession();
+    }
+
+
+    // =================== Token-Session 相关 ===================
+
+    /**
+     * 获取指定Token-Session,如果Session尚未创建,则新建并返回
+     *
+     * @param tokenValue Token值
+     * @return Session对象
+     */
+    public static SaSession getTokenSessionByToken(String tokenValue) {
+        return stpLogic.getTokenSessionByToken(tokenValue);
+    }
+
+    /**
+     * 获取当前Token-Session,如果Session尚未创建,则新建并返回
+     *
+     * @return Session对象
+     */
+    public static SaSession getTokenSession() {
+        return stpLogic.getTokenSession();
+    }
+
+
+    // =================== [临时过期] 验证相关 ===================
+
+    /**
+     * 检查当前token 是否已经[临时过期],如果已经过期则抛出异常
+     */
+    public static void checkActivityTimeout() {
+        stpLogic.checkActivityTimeout();
+    }
+
+    /**
+     * 续签当前token:(将 [最后操作时间] 更新为当前时间戳)
+     * <h1>请注意: 即时token已经 [临时过期] 也可续签成功,
+     * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可 </h1>
+     */
+    public static void updateLastActivityToNow() {
+        stpLogic.updateLastActivityToNow();
+    }
+
+
+    // =================== 过期时间相关 ===================
+
+    /**
+     * 获取当前登录者的 token 剩余有效时间 (单位: 秒)
+     *
+     * @return token剩余有效时间
+     */
+    public static long getTokenTimeout() {
+        return stpLogic.getTokenTimeout();
+    }
+
+    /**
+     * 获取当前登录者的 User-Session 剩余有效时间 (单位: 秒)
+     *
+     * @return token剩余有效时间
+     */
+    public static long getSessionTimeout() {
+        return stpLogic.getSessionTimeout();
+    }
+
+    /**
+     * 获取当前 Token-Session 剩余有效时间 (单位: 秒)
+     *
+     * @return token剩余有效时间
+     */
+    public static long getTokenSessionTimeout() {
+        return stpLogic.getTokenSessionTimeout();
+    }
+
+    /**
+     * 获取当前 token [临时过期] 剩余有效时间 (单位: 秒)
+     *
+     * @return token [临时过期] 剩余有效时间
+     */
+    public static long getTokenActivityTimeout() {
+        return stpLogic.getTokenActivityTimeout();
+    }
+
+
+    // =================== 角色验证操作 ===================
+
+    /**
+     * 获取:当前账号的角色集合
+     *
+     * @return /
+     */
+    public static List<String> getRoleList() {
+        return stpLogic.getRoleList();
+    }
+
+    /**
+     * 获取:指定账号的角色集合
+     *
+     * @param loginId 指定账号id
+     * @return /
+     */
+    public static List<String> getRoleList(Object loginId) {
+        return stpLogic.getRoleList(loginId);
+    }
+
+    /**
+     * 判断:当前账号是否拥有指定角色, 返回true或false
+     *
+     * @param role 角色标识
+     * @return 是否含有指定角色标识
+     */
+    public static boolean hasRole(String role) {
+        return stpLogic.hasRole(role);
+    }
+
+    /**
+     * 判断:指定账号是否含有指定角色标识, 返回true或false
+     *
+     * @param loginId 账号id
+     * @param role    角色标识
+     * @return 是否含有指定角色标识
+     */
+    public static boolean hasRole(Object loginId, String role) {
+        return stpLogic.hasRole(loginId, role);
+    }
+
+    /**
+     * 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
+     *
+     * @param roleArray 角色标识数组
+     * @return true或false
+     */
+    public static boolean hasRoleAnd(String... roleArray) {
+        return stpLogic.hasRoleAnd(roleArray);
+    }
+
+    /**
+     * 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
+     *
+     * @param roleArray 角色标识数组
+     * @return true或false
+     */
+    public static boolean hasRoleOr(String... roleArray) {
+        return stpLogic.hasRoleOr(roleArray);
+    }
+
+    /**
+     * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
+     *
+     * @param role 角色标识
+     */
+    public static void checkRole(String role) {
+        stpLogic.checkRole(role);
+    }
+
+    /**
+     * 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
+     *
+     * @param roleArray 角色标识数组
+     */
+    public static void checkRoleAnd(String... roleArray) {
+        stpLogic.checkRoleAnd(roleArray);
+    }
+
+    /**
+     * 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
+     *
+     * @param roleArray 角色标识数组
+     */
+    public static void checkRoleOr(String... roleArray) {
+        stpLogic.checkRoleOr(roleArray);
+    }
+
+
+    // =================== 权限验证操作 ===================
+
+    /**
+     * 获取:当前账号的权限码集合
+     *
+     * @return /
+     */
+    public static List<String> getPermissionList() {
+        return stpLogic.getPermissionList();
+    }
+
+    /**
+     * 获取:指定账号的权限码集合
+     *
+     * @param loginId 指定账号id
+     * @return /
+     */
+    public static List<String> getPermissionList(Object loginId) {
+        return stpLogic.getPermissionList(loginId);
+    }
+
+    /**
+     * 判断:当前账号是否含有指定权限, 返回true或false
+     *
+     * @param permission 权限码
+     * @return 是否含有指定权限
+     */
+    public static boolean hasPermission(String permission) {
+        return stpLogic.hasPermission(permission);
+    }
+
+    /**
+     * 判断:指定账号id是否含有指定权限, 返回true或false
+     *
+     * @param loginId    账号id
+     * @param permission 权限码
+     * @return 是否含有指定权限
+     */
+    public static boolean hasPermission(Object loginId, String permission) {
+        return stpLogic.hasPermission(loginId, permission);
+    }
+
+    /**
+     * 判断:当前账号是否含有指定权限, [指定多个,必须全部具有]
+     *
+     * @param permissionArray 权限码数组
+     * @return true 或 false
+     */
+    public static boolean hasPermissionAnd(String... permissionArray) {
+        return stpLogic.hasPermissionAnd(permissionArray);
+    }
+
+    /**
+     * 判断:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
+     *
+     * @param permissionArray 权限码数组
+     * @return true 或 false
+     */
+    public static boolean hasPermissionOr(String... permissionArray) {
+        return stpLogic.hasPermissionOr(permissionArray);
+    }
+
+    /**
+     * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
+     *
+     * @param permission 权限码
+     */
+    public static void checkPermission(String permission) {
+        stpLogic.checkPermission(permission);
+    }
+
+    /**
+     * 校验:当前账号是否含有指定权限 [指定多个,必须全部验证通过]
+     *
+     * @param permissionArray 权限码数组
+     */
+    public static void checkPermissionAnd(String... permissionArray) {
+        stpLogic.checkPermissionAnd(permissionArray);
+    }
+
+    /**
+     * 校验:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
+     *
+     * @param permissionArray 权限码数组
+     */
+    public static void checkPermissionOr(String... permissionArray) {
+        stpLogic.checkPermissionOr(permissionArray);
+    }
+
+
+    // =================== id 反查token 相关操作 ===================
+
+    /**
+     * 获取指定账号id的tokenValue
+     * <p> 在配置为允许并发登录时,此方法只会返回队列的最后一个token,
+     * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
+     *
+     * @param loginId 账号id
+     * @return token值
+     */
+    public static String getTokenValueByLoginId(Object loginId) {
+        return stpLogic.getTokenValueByLoginId(loginId);
+    }
+
+    /**
+     * 获取指定账号id指定设备端的tokenValue
+     * <p> 在配置为允许并发登录时,此方法只会返回队列的最后一个token,
+     * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
+     *
+     * @param loginId 账号id
+     * @param device  设备标识
+     * @return token值
+     */
+    public static String getTokenValueByLoginId(Object loginId, String device) {
+        return stpLogic.getTokenValueByLoginId(loginId, device);
+    }
+
+    /**
+     * 获取指定账号id的tokenValue集合
+     *
+     * @param loginId 账号id
+     * @return 此loginId的所有相关token
+     */
+    public static List<String> getTokenValueListByLoginId(Object loginId) {
+        return stpLogic.getTokenValueListByLoginId(loginId);
+    }
+
+    /**
+     * 获取指定账号id指定设备端的tokenValue 集合
+     *
+     * @param loginId 账号id
+     * @param device  设备标识
+     * @return 此loginId的所有相关token
+     */
+    public static List<String> getTokenValueListByLoginId(Object loginId, String device) {
+        return stpLogic.getTokenValueListByLoginId(loginId, device);
+    }
+
+    /**
+     * 返回当前会话的登录设备
+     *
+     * @return 当前令牌的登录设备
+     */
+    public static String getLoginDevice() {
+        return stpLogic.getLoginDevice();
+    }
+
+
+    // =================== 会话管理 ===================
+
+    /**
+     * 根据条件查询Token
+     *
+     * @param keyword 关键字
+     * @param start   开始处索引 (-1代表查询所有)
+     * @param size    获取数量
+     * @return token集合
+     */
+    public static List<String> searchTokenValue(String keyword, int start, int size) {
+        return stpLogic.searchTokenValue(keyword, start, size);
+    }
+
+    /**
+     * 根据条件查询SessionId
+     *
+     * @param keyword 关键字
+     * @param start   开始处索引 (-1代表查询所有)
+     * @param size    获取数量
+     * @return sessionId集合
+     */
+    public static List<String> searchSessionId(String keyword, int start, int size) {
+        return stpLogic.searchSessionId(keyword, start, size);
+    }
+
+    /**
+     * 根据条件查询Token专属Session的Id
+     *
+     * @param keyword 关键字
+     * @param start   开始处索引 (-1代表查询所有)
+     * @param size    获取数量
+     * @return sessionId集合
+     */
+    public static List<String> searchTokenSessionId(String keyword, int start, int size) {
+        return stpLogic.searchTokenSessionId(keyword, start, size);
+    }
+
+
+    // ------------------- 账号封禁 -------------------
+
+    /**
+     * 封禁指定账号
+     * <p> 此方法不会直接将此账号id踢下线,而是在对方再次登录时抛出`DisableLoginException`异常
+     *
+     * @param loginId     指定账号id
+     * @param disableTime 封禁时间, 单位: 秒 (-1=永久封禁)
+     */
+    public static void disable(Object loginId, long disableTime) {
+        stpLogic.disable(loginId, disableTime);
+    }
+
+    /**
+     * 指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
+     *
+     * @param loginId 账号id
+     * @return see note
+     */
+    public static boolean isDisable(Object loginId) {
+        return stpLogic.isDisable(loginId);
+    }
+
+    /**
+     * 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
+     *
+     * @param loginId 账号id
+     * @return see note
+     */
+    public static long getDisableTime(Object loginId) {
+        return stpLogic.getDisableTime(loginId);
+    }
+
+    /**
+     * 解封指定账号
+     *
+     * @param loginId 账号id
+     */
+    public static void untieDisable(Object loginId) {
+        stpLogic.untieDisable(loginId);
+    }
+
+
+    // =================== 身份切换 ===================
+
+    /**
+     * 临时切换身份为指定账号id
+     *
+     * @param loginId 指定loginId
+     */
+    public static void switchTo(Object loginId) {
+        stpLogic.switchTo(loginId);
+    }
+
+    /**
+     * 结束临时切换身份
+     */
+    public static void endSwitch() {
+        stpLogic.endSwitch();
+    }
+
+    /**
+     * 当前是否正处于[身份临时切换]中
+     *
+     * @return 是否正处于[身份临时切换]中
+     */
+    public static boolean isSwitch() {
+        return stpLogic.isSwitch();
+    }
+
+    /**
+     * 在一个代码段里方法内,临时切换身份为指定账号id
+     *
+     * @param loginId  指定账号id
+     * @param function 要执行的方法
+     */
+    public static void switchTo(Object loginId, SaFunction function) {
+        stpLogic.switchTo(loginId, function);
+    }
+
+
+    // ------------------- 二级认证 -------------------
+
+    /**
+     * 在当前会话 开启二级认证
+     *
+     * @param safeTime 维持时间 (单位: 秒)
+     */
+    public static void openSafe(long safeTime) {
+        stpLogic.openSafe(safeTime);
+    }
+
+    /**
+     * 当前会话 是否处于二级认证时间内
+     *
+     * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
+     */
+    public static boolean isSafe() {
+        return stpLogic.isSafe();
+    }
+
+    /**
+     * 检查当前会话是否已通过二级认证,如未通过则抛出异常
+     */
+    public static void checkSafe() {
+        stpLogic.checkSafe();
+    }
+
+    /**
+     * 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
+     *
+     * @return 剩余有效时间
+     */
+    public static long getSafeTime() {
+        return stpLogic.getSafeTime();
+    }
+
+    /**
+     * 在当前会话 结束二级认证
+     */
+    public static void closeSafe() {
+        stpLogic.closeSafe();
+    }
+
+
+    // =================== 历史API,兼容旧版本 ===================
+
+    /**
+     * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.getLoginType() ,使用方式保持不变 </h1>
+     * <p>
+     * 获取当前StpLogin的loginKey
+     *
+     * @return 当前StpLogin的loginKey
+     */
+    @Deprecated
+    public static String getLoginKey() {
+        return stpLogic.getLoginType();
+    }
+
+    /**
+     * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
+     * <p>
+     * 在当前会话上登录id
+     *
+     * @param loginId 登录id,建议的类型:(long | int | String)
+     */
+    @Deprecated
+    public static void setLoginId(Object loginId) {
+        stpLogic.login(loginId);
+    }
+
+    /**
+     * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
+     * <p>
+     * 在当前会话上登录id, 并指定登录设备
+     *
+     * @param loginId 登录id,建议的类型:(long | int | String)
+     * @param device  设备标识
+     */
+    @Deprecated
+    public static void setLoginId(Object loginId, String device) {
+        stpLogic.login(loginId, device);
+    }
+
+    /**
+     * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
+     * <p>
+     * 在当前会话上登录id, 并指定登录设备
+     *
+     * @param loginId         登录id,建议的类型:(long | int | String)
+     * @param isLastingCookie 是否为持久Cookie
+     */
+    @Deprecated
+    public static void setLoginId(Object loginId, boolean isLastingCookie) {
+        stpLogic.login(loginId, isLastingCookie);
+    }
+
+    /**
+     * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
+     * <p>
+     * 在当前会话上登录id, 并指定所有登录参数Model
+     *
+     * @param loginId    登录id,建议的类型:(long | int | String)
+     * @param loginModel 此次登录的参数Model
+     */
+    @Deprecated
+    public static void setLoginId(Object loginId, SaLoginModel loginModel) {
+        stpLogic.login(loginId, loginModel);
+    }
+
+    /**
+     * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变 </h1>
+     * <p>
+     * 会话注销,根据账号id (踢人下线)
+     * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2
+     *
+     * @param loginId 账号id
+     */
+    @Deprecated
+    public static void logoutByLoginId(Object loginId) {
+        stpLogic.kickout(loginId);
+    }
+
+    /**
+     * <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变 </h1>
+     * <p>
+     * 会话注销,根据账号id and 设备标识 (踢人下线)
+     * <p> 当对方再次访问系统时,会抛出NotLoginException异常,场景值=-2 </p>
+     *
+     * @param loginId 账号id
+     * @param device  设备标识 (填null代表所有注销设备)
+     */
+    @Deprecated
+    public static void logoutByLoginId(Object loginId, String device) {
+        stpLogic.kickout(loginId, device);
+    }
+
 }

+ 12 - 6
sp-server/src/main/java/com/pj/project/tb_business/TbBusiness.java

@@ -1,6 +1,9 @@
 package com.pj.project.tb_business;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.EqualsAndHashCode;
@@ -37,13 +40,12 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 	/**
 	 * 主键 
 	 */
-	@TableId(type = IdType.AUTO)
-	private Long id;	
+	private String id;
 
 	/**
 	 * 客户id 
 	 */
-	private Long customerId;	
+	private String customerId;
 
 	/**
 	 * 客户名称 
@@ -138,17 +140,21 @@ public class TbBusiness extends Model<TbBusiness> implements Serializable {
 	/**
 	 * 离境时间 
 	 */
-	private String outDayTime;	
+	private String outDayTime;
+
 
 	/**
 	 * 停车费用 
 	 */
-	private Double partMoney;	
+	private BigDecimal partMoney;
 
 	/**
 	 * 停车时常(分) 
 	 */
-	private Integer partTime;	
+	private Integer partTime;
+	private BigDecimal totalMoney;
+	private Date createTime;
+	private String businessType;
 
 
 

+ 4 - 4
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessController.java

@@ -40,8 +40,8 @@ public class TbBusinessController {
 	@RequestMapping("delete")
 	@SaCheckPermission(TbBusiness.PERMISSION_CODE)
 	public AjaxJson delete(Long id){
-		int line = tbBusinessService.delete(id);
-		return AjaxJson.getByLine(line);
+		tbBusinessService.removeById(id);
+		return AjaxJson.getSuccess();
 	}
 	
 	/** 删 - 根据id列表 */  
@@ -57,8 +57,8 @@ public class TbBusinessController {
 	@RequestMapping("update")
 	@SaCheckPermission(TbBusiness.PERMISSION_CODE)
 	public AjaxJson update(TbBusiness t){
-		int line = tbBusinessService.update(t);
-		return AjaxJson.getByLine(line);
+		tbBusinessService.updateById(t);
+		return AjaxJson.getSuccess();
 	}
 
 	/** 查 - 根据id */  

+ 0 - 28
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessMapper.java

@@ -18,34 +18,6 @@ import org.springframework.stereotype.Repository;
 public interface TbBusinessMapper extends BaseMapper <TbBusiness> {
 
 	/**
-	 * 增  
-	 * @param t 实体对象 
-	 * @return 受影响行数 
-	 */
-	int add(TbBusiness t);
-
-	/**
-	 * 删  
-	 * @param id 要删除的数据id  
-	 * @return 受影响行数 
-	 */
-	int delete(Long id);	 
-
-	/** 
-	 * 改  
-	 * @param t 实体对象 
-	 * @return 受影响行数 
-	 */
-	int update(TbBusiness t);
-
-	/** 
-	 * 查 - 根据id  
-	 * @param id 要查询的数据id 
-	 * @return 实体对象 
-	 */
-	TbBusiness getById(Long id);	 
-
-	/**
 	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
 	 * @param so 参数集合 
 	 * @return 数据列表 

+ 6 - 91
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessMapper.xml

@@ -2,108 +2,23 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.pj.project.tb_business.TbBusinessMapper">
 
-	<!-- 增 [G] -->
-	<insert id="add">
-		insert into 
-		tb_business (id, customer_id, customer_name, no, card_no, card_size, net_weight, goods_name, goods_code, driver_name, driver_id, driver_phone, driver_id_card, pay_ticket, expect_in_day, real_in_day, real_in_time, pay_status, pay_time, pay_type, out_day_time, part_money, part_time) 
-		values (#{id}, #{customerId}, #{customerName}, #{no}, #{cardNo}, #{cardSize}, #{netWeight}, #{goodsName}, #{goodsCode}, #{driverName}, #{driverId}, #{driverPhone}, #{driverIdCard}, #{payTicket}, #{expectInDay}, #{realInDay}, #{realInTime}, #{payStatus}, #{payTime}, #{payType}, #{outDayTime}, #{partMoney}, #{partTime}) 
-	</insert>
-
-	<!-- 删 -->
-	<delete id="delete">
-		delete from tb_business 
-		where id = #{id}
-	</delete>
-
-	<!-- 改 [G] -->
-	<update id="update">
-		update tb_business set
-		id = #{id}, 
-		customer_id = #{customerId}, 
-		customer_name = #{customerName}, 
-		no = #{no}, 
-		card_no = #{cardNo}, 
-		card_size = #{cardSize}, 
-		net_weight = #{netWeight}, 
-		goods_name = #{goodsName}, 
-		goods_code = #{goodsCode}, 
-		driver_name = #{driverName}, 
-		driver_id = #{driverId}, 
-		driver_phone = #{driverPhone}, 
-		driver_id_card = #{driverIdCard}, 
-		pay_ticket = #{payTicket}, 
-		expect_in_day = #{expectInDay}, 
-		real_in_day = #{realInDay}, 
-		real_in_time = #{realInTime}, 
-		pay_status = #{payStatus}, 
-		pay_time = #{payTime}, 
-		pay_type = #{payType}, 
-		out_day_time = #{outDayTime}, 
-		part_money = #{partMoney}, 
-		part_time = #{partTime}
-		where id = #{id}
-	</update>
-
-
-	<!-- ================================== 查询相关 ================================== -->
-
-	
-	<!-- 通用映射:手动模式 -->
-	<resultMap id="model" type="com.pj.project.tb_business.TbBusiness">
-		<result property="id" column="id" />
-		<result property="customerId" column="customer_id" />
-		<result property="customerName" column="customer_name" />
-		<result property="no" column="no" />
-		<result property="cardNo" column="card_no" />
-		<result property="cardSize" column="card_size" />
-		<result property="netWeight" column="net_weight" />
-		<result property="goodsName" column="goods_name" />
-		<result property="goodsCode" column="goods_code" />
-		<result property="driverName" column="driver_name" />
-		<result property="driverId" column="driver_id" />
-		<result property="driverPhone" column="driver_phone" />
-		<result property="driverIdCard" column="driver_id_card" />
-		<result property="payTicket" column="pay_ticket" />
-		<result property="expectInDay" column="expect_in_day" />
-		<result property="realInDay" column="real_in_day" />
-		<result property="realInTime" column="real_in_time" />
-		<result property="payStatus" column="pay_status" />
-		<result property="payTime" column="pay_time" />
-		<result property="payType" column="pay_type" />
-		<result property="outDayTime" column="out_day_time" />
-		<result property="partMoney" column="part_money" />
-		<result property="partTime" column="part_time" />
-	</resultMap>
-	
-	<!-- 公共查询sql片段 -->
-	<sql id="select_sql">
-		select id, customer_id, customer_name, no, card_no, card_size, net_weight, goods_name, goods_code, driver_name, driver_id, driver_phone, driver_id_card, pay_ticket, expect_in_day, real_in_day, real_in_time, pay_status, pay_time, pay_type, out_day_time, part_money, part_time 
-		from tb_business 
-	</sql>
-	
-	<!-- 查 - 根据id -->
-	<select id="getById" resultMap="model">
-		<include refid="select_sql"></include>
-		where id = #{id}
-	</select>
-	
 	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
-	<select id="getList" resultMap="model">
-		<include refid="select_sql"></include>
+	<select id="getList" resultType="com.pj.project.tb_business.TbBusiness">
+		select * from tb_business
 		<where>
 			<if test=' this.has("id") '> and id = #{id} </if>
 			<if test=' this.has("customerId") '> and customer_id = #{customerId} </if>
-			<if test=' this.has("customerName") '> and customer_name = #{customerName} </if>
+			<if test=' this.has("customerName") '> and customer_name like concat('%', #{customerName} ,'%')</if>
 			<if test=' this.has("no") '> and no = #{no} </if>
-			<if test=' this.has("cardNo") '> and card_no = #{cardNo} </if>
+			<if test=' this.has("cardNo") '> and card_no  like concat('%', #{cardNo} ,'%')</if>
 			<if test=' this.has("cardSize") '> and card_size = #{cardSize} </if>
 			<if test=' this.has("netWeight") '> and net_weight = #{netWeight} </if>
 			<if test=' this.has("goodsName") '> and goods_name = #{goodsName} </if>
 			<if test=' this.has("goodsCode") '> and goods_code = #{goodsCode} </if>
-			<if test=' this.has("driverName") '> and driver_name = #{driverName} </if>
+			<if test=' this.has("driverName") '> and driver_name  like concat('%', #{driverName} ,'%')</if>
 			<if test=' this.has("driverId") '> and driver_id = #{driverId} </if>
 			<if test=' this.has("driverPhone") '> and driver_phone = #{driverPhone} </if>
-			<if test=' this.has("driverIdCard") '> and driver_id_card = #{driverIdCard} </if>
+			<if test=' this.has("driverIdCard") '> and driver_id_card  like concat('%', #{driverIdCard} ,'%')</if>
 			<if test=' this.has("expectInDay") '> and expect_in_day = #{expectInDay} </if>
 			<if test=' this.has("realInDay") '> and real_in_day = #{realInDay} </if>
 			<if test=' this.has("realInTime") '> and real_in_time = #{realInTime} </if>

+ 59 - 32
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java

@@ -1,48 +1,75 @@
 package com.pj.project.tb_business;
 
+import java.util.Date;
 import java.util.List;
 
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.project.tb_car.TbCar;
+import com.pj.project.tb_car.TbCarService;
+import com.pj.project.tb_driver.TbDriver;
+import com.pj.project.tb_driver.TbDriverService;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.pj.utils.sg.*;
 
+import javax.annotation.Resource;
+
 /**
  * Service: tb_business -- 入境登记
- * @author qzy 
+ *
+ * @author qzy
  */
 @Service
-public class TbBusinessService {
-
-	/** 底层 Mapper 对象 */
-	@Autowired
-	TbBusinessMapper tbBusinessMapper;
-
-	/** 增 */
-	int add(TbBusiness t){
-		return tbBusinessMapper.add(t);
-	}
-
-	/** 删 */
-	int delete(Long id){
-		return tbBusinessMapper.delete(id);
-	}
-
-	/** 改 */
-	int update(TbBusiness t){
-		return tbBusinessMapper.update(t);
-	}
-
-	/** 查 */
-	TbBusiness getById(Long id){
-		return tbBusinessMapper.getById(id);
-	}
-
-	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
-	List<TbBusiness> getList(SoMap so) {
-		return tbBusinessMapper.getList(so);	
-	}
-	
+public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness> implements IService<TbBusiness> {
+
+    /**
+     * 底层 Mapper 对象
+     */
+    @Autowired
+    TbBusinessMapper tbBusinessMapper;
+    @Resource
+    private TbCarService tbCarService;
+    @Resource
+    private TbDriverService tbDriverService;
+
+    /**
+     * 增
+     */
+    void add(TbBusiness t) {
+        createCar(t.getCardNo(), t.getCardSize(), t.getGoodsName());
+        createDriver(t.getDriverIdCard(),t.getDriverName(),t.getDriverPhone());
+        save(t);
+    }
+
+    private void createDriver(String idCardNo,String name,String phone) {
+        TbDriver tbDriver=tbDriverService.findByIdCardNo(idCardNo);
+        if (tbDriver==null){
+            tbDriver=new TbDriver();
+            tbDriver.setCreateTime(new Date()).setIdCard(idCardNo).setName(name).setPhone(phone);
+            tbDriverService.save(tbDriver);
+        }
+
+    }
+
+    private void createCar(String cardNo, String carSize, String goodsName) {
+        TbCar tbCar = tbCarService.findByCardNo(cardNo);
+        if (tbCar == null) {
+            TbCar car = new TbCar();
+            car.setCardNo(cardNo).setCardSize(carSize).setLastGoodsName(goodsName);
+            tbCarService.save(car);
+        }
+    }
+
+
+    /**
+     * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+     */
+    List<TbBusiness> getList(SoMap so) {
+        return tbBusinessMapper.getList(so);
+    }
+
 
 }

+ 13 - 7
sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItem.java

@@ -1,6 +1,9 @@
 package com.pj.project.tb_business_item;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.EqualsAndHashCode;
@@ -37,8 +40,7 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	/**
 	 * 主键 
 	 */
-	@TableId(type = IdType.AUTO)
-	private String id;	
+	private String id;
 
 	/**
 	 * 等级表id 
@@ -53,7 +55,7 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	/**
 	 * 项目金额(元) 
 	 */
-	private Double itemPrice;	
+	private BigDecimal itemPrice;
 
 	/**
 	 * 项目名称 
@@ -63,18 +65,22 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	/**
 	 * 状态(1=未完成,2=已完成) 
 	 */
-	private String status;	
+	private int status;
 
 	/**
 	 * 操作时间 
 	 */
-	private String operateTime;	
+	private Date operateTime;
 
 	/**
 	 * 操作人员 
 	 */
-	private String operaror;	
-
+	private String operaror;
+	/**
+	 * 数量
+	 */
+	private Integer num;
+	private String unit;
 
 
 

+ 6 - 5
sp-server/src/main/java/com/pj/project/tb_car/TbCar.java

@@ -1,6 +1,8 @@
 package com.pj.project.tb_car;
 
 import java.io.Serializable;
+import java.util.Date;
+
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.EqualsAndHashCode;
@@ -37,8 +39,7 @@ public class TbCar extends Model<TbCar> implements Serializable {
 	/**
 	 * 主键 
 	 */
-	@TableId(type = IdType.AUTO)
-	private Long id;	
+	private String id;
 
 	/**
 	 * 名称 
@@ -68,17 +69,17 @@ public class TbCar extends Model<TbCar> implements Serializable {
 	/**
 	 * 最后一次入境时间 
 	 */
-	private String lastInTime;	
+	private Date lastInTime;
 
 	/**
 	 * 最后一次出境时间 
 	 */
-	private String lastOutTime;	
+	private Date lastOutTime;
 
 	/**
 	 * 当前状态(1=境外,2=境内) 
 	 */
-	private String status;	
+	private int status;
 
 
 

+ 10 - 2
sp-server/src/main/java/com/pj/project/tb_car/TbCarService.java

@@ -2,6 +2,9 @@ package com.pj.project.tb_car;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -13,7 +16,7 @@ import com.pj.utils.sg.*;
  * @author qzy 
  */
 @Service
-public class TbCarService {
+public class TbCarService extends ServiceImpl<TbCarMapper,TbCar>implements IService<TbCar> {
 
 	/** 底层 Mapper 对象 */
 	@Autowired
@@ -43,6 +46,11 @@ public class TbCarService {
 	List<TbCar> getList(SoMap so) {
 		return tbCarMapper.getList(so);	
 	}
-	
 
+
+	public TbCar findByCardNo(String cardNo) {
+		QueryWrapper<TbCar>ew=new QueryWrapper<>();
+		ew.eq("card_no",cardNo);
+		return getOne(ew);
+	}
 }

+ 10 - 5
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomer.java

@@ -1,6 +1,8 @@
 package com.pj.project.tb_costomer;
 
 import java.io.Serializable;
+import java.util.Date;
+
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.EqualsAndHashCode;
@@ -37,8 +39,7 @@ public class TbCostomer extends Model<TbCostomer> implements Serializable {
 	/**
 	 * 主键 
 	 */
-	@TableId(type = IdType.AUTO)
-	private String id;	
+	private String id;
 
 	/**
 	 * 名称 
@@ -78,7 +79,7 @@ public class TbCostomer extends Model<TbCostomer> implements Serializable {
 	/**
 	 * 创建时间 
 	 */
-	private String creareTime;	
+	private Date creareTime=null;
 
 	/**
 	 * 审核状态(1=未审核,2审核通过,3审核不通过) 
@@ -88,12 +89,16 @@ public class TbCostomer extends Model<TbCostomer> implements Serializable {
 	/**
 	 * 审核时间 
 	 */
-	private String judgeTime;	
+	private Date judgeTime=null;
 
 	/**
 	 * 审核意见 
 	 */
-	private String judgeContent;	
+	private String judgeContent;
+	/**
+	 * 结账方式(1=现结,2=月结)[j]
+	 */
+	private int payType;
 
 
 

+ 4 - 3
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerController.java

@@ -80,9 +80,10 @@ public class TbCostomerController {
 	/** 改 - 状态(0=否,1=是) */  
 	@RequestMapping("updateStatus")
 	@SaCheckPermission(TbCostomer.PERMISSION_CODE)
-	public AjaxJson updateStatus(String id, String value){
-		int line = SP.publicMapper.updateColumnById(TbCostomer.TABLE_NAME, "status", value, id);
-		return AjaxJson.getByLine(line);
+	public AjaxJson updateStatus(String id, int value){
+		tbCostomerService.updateStatus(id,value);
+
+		return AjaxJson.getByLine(1);
 	}
 	
 	

+ 5 - 5
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerMapper.xml

@@ -55,8 +55,8 @@
 	
 	<!-- 公共查询sql片段 -->
 	<sql id="select_sql">
-		select id, name, phone, duty_people, address_ids, address_str, business_licence, status, creare_time, judge_status, judge_time, judge_content 
-		from tb_costomer 
+		select 	*
+		from tb_costomer
 	</sql>
 	
 	<!-- 查 - 根据id -->
@@ -70,9 +70,9 @@
 		<include refid="select_sql"></include>
 		<where>
 			<if test=' this.has("id") '> and id = #{id} </if>
-			<if test=' this.has("name") '> and name = #{name} </if>
-			<if test=' this.has("phone") '> and phone = #{phone} </if>
-			<if test=' this.has("dutyPeople") '> and duty_people = #{dutyPeople} </if>
+			<if test=' this.has("name") '> and name like concat('%',#{name},'%')  </if>
+			<if test=' this.has("phone") '> and phone like concat('%',#{phone},'%')  </if>
+			<if test=' this.has("dutyPeople") '> and duty_people  like concat('%',#{dutyPeople},'%') </if>
 			<if test=' this.has("addressIds") '> and address_ids = #{addressIds} </if>
 			<if test=' this.has("addressStr") '> and address_str = #{addressStr} </if>
 			<if test=' this.has("status") '> and status = #{status} </if>

+ 101 - 32
sp-server/src/main/java/com/pj/project/tb_costomer/TbCostomerService.java

@@ -1,48 +1,117 @@
 package com.pj.project.tb_costomer;
 
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.stream.Collectors;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.constants.RoleEnum;
+import com.pj.project.tb_district.TbDistrict;
+import com.pj.project.tb_district.TbDistrictService;
+import com.pj.project4sp.SP;
+import com.pj.project4sp.admin.SpAdminMapper;
+import com.pj.project4sp.role.SpRole;
+import com.pj.project4sp.role.SpRoleMapper;
+import com.pj.project4sp.role4permission.SpRolePermissionMapper;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.pj.utils.sg.*;
 
+import javax.annotation.Resource;
+
 /**
  * Service: tb_costomer -- 客户管理
- * @author qzy 
+ *
+ * @author qzy
  */
 @Service
-public class TbCostomerService {
-
-	/** 底层 Mapper 对象 */
-	@Autowired
-	TbCostomerMapper tbCostomerMapper;
-
-	/** 增 */
-	int add(TbCostomer t){
-		return tbCostomerMapper.add(t);
-	}
-
-	/** 删 */
-	int delete(String id){
-		return tbCostomerMapper.delete(id);
-	}
-
-	/** 改 */
-	int update(TbCostomer t){
-		return tbCostomerMapper.update(t);
-	}
-
-	/** 查 */
-	TbCostomer getById(String id){
-		return tbCostomerMapper.getById(id);
-	}
-
-	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
-	List<TbCostomer> getList(SoMap so) {
-		return tbCostomerMapper.getList(so);	
-	}
-	
+public class TbCostomerService extends ServiceImpl<TbCostomerMapper, TbCostomer> implements IService<TbCostomer> {
+
+    /**
+     * 底层 Mapper 对象
+     */
+    @Autowired
+    TbCostomerMapper tbCostomerMapper;
+    @Resource
+    private SpRoleMapper spRoleMapper;
+    @Resource
+    private SpRolePermissionMapper spRolePermissionMapper;
+    @Resource
+    private TbDistrictService tbDistrictService;
+    @Resource
+    private SpAdminMapper spAdminMapper;
+
+    /**
+     * 增
+     */
+    int add(TbCostomer t) {
+        t.setCreareTime(new Date()).setJudgeContent("平台创建,直接通过").setJudgeTime(new Date());
+        List<TbDistrict> districts = tbDistrictService.listByIds(StrUtil.splitTrim(t.getAddressIds(), ","));
+        String address = districts.stream().map(TbDistrict::getDistrict).collect(Collectors.joining(""));
+        t.setAddressStr(address);
+        this.save(t);
+        List<RoleEnum> roleEnums = RoleEnum.getCustomerInitRoleList();
+        roleEnums.forEach(roleEnum -> {
+            SpRole spRole = new SpRole();
+            spRole.setCustomerId(t.getId()).setInfo(roleEnum.getName())
+                    .setName(roleEnum.getName()).setType(roleEnum.getType());
+            spRoleMapper.add(spRole);
+            long roleId = SP.publicMapper.getPrimarykey();
+            spRolePermissionMapper.saveRolePer(roleId, roleEnum.getPerCode());
+        });
+        return 1;
+    }
+
+    /**
+     * 删
+     */
+    int delete(String id) {
+        SoMap soMap = SoMap.getRequestSoMap();
+        soMap.put("customerId", id);
+        List<SpRole> roles = spRoleMapper.getList(soMap);
+        spRoleMapper.removeByCustomerId(id);
+        spRolePermissionMapper.removeByRoleIds(roles.stream().map(SpRole::getId).collect(Collectors.toList()));
+        spAdminMapper.removeByCustomerId(id);
+        return tbCostomerMapper.delete(id);
+    }
+
+    /**
+     * 改
+     */
+    int update(TbCostomer t) {
+        List<TbDistrict> districts = tbDistrictService.listByIds(StrUtil.splitTrim(t.getAddressIds(), ","));
+        String address = districts.stream().map(TbDistrict::getDistrict).collect(Collectors.joining(""));
+        t.setAddressStr(address);
+        this.updateById(t);
+        return 1;
+    }
+
+    /**
+     * 查
+     */
+    TbCostomer getById(String id) {
+        return tbCostomerMapper.getById(id);
+    }
+
+    /**
+     * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+     */
+    List<TbCostomer> getList(SoMap so) {
+        return tbCostomerMapper.getList(so);
+    }
+
 
+    public int updateStatus(String id, int value) {
+        int line = SP.publicMapper.updateColumnById(TbCostomer.TABLE_NAME, "status", value, id);
+        int status=value==1?1:2;
+        spAdminMapper.updateCustomerAdmin(id,status);
+        return line;
+    }
 }

+ 93 - 0
sp-server/src/main/java/com/pj/project/tb_district/TbDistrict.java

@@ -0,0 +1,93 @@
+package com.pj.project.tb_district;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Model: tb_district -- 全国地区表
+ * @author qzyReal 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbDistrict.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbDistrict extends Model<TbDistrict> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_district";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-district";	
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 * 主键 
+	 */
+	private Long id;
+
+	/**
+	 * 父及地区关系 
+	 */
+	private Long pid;
+
+	/**
+	 * 地区名称 
+	 */
+	private String district;
+
+	/**
+	 * 子属级别关系 
+	 */
+	private String level;
+
+	@TableField(exist = false)
+	private List<TbDistrict> children;
+
+
+	@TableField(exist = false)
+	private Long AreaId;
+	@TableField(exist = false)
+	private String AreaName;
+	@TableField(exist = false)
+	private Long ParentId;
+	@TableField(exist = false)
+	private String Layer;
+
+
+	public Long getAreaId() {
+		return this.id;
+	}
+
+	public String getAreaName() {
+		return this.district;
+	}
+
+	public Long getParentId() {
+		return this.pid;
+	}
+
+	public String getLayer() {
+		return this.Layer;
+	}
+
+
+	
+
+
+}

+ 49 - 0
sp-server/src/main/java/com/pj/project/tb_district/TbDistrictController.java

@@ -0,0 +1,49 @@
+package com.pj.project.tb_district;
+
+
+import com.pj.utils.sg.AjaxJson;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * Controller: tb_district -- 全国地区表
+ *
+ * @author qzyReal
+ */
+@RestController
+@RequestMapping("/TbDistrict/")
+public class TbDistrictController {
+
+    /**
+     * 底层 Service 对象
+     */
+    @Autowired
+    TbDistrictService tbDistrictService;
+
+
+    /**
+     * 查 - 根据id
+     */
+    @RequestMapping("getById")
+    public AjaxJson getById(Integer id) {
+        TbDistrict t = tbDistrictService.getById(id);
+        return AjaxJson.getSuccessData(t);
+    }
+
+    @RequestMapping(value = "getTreeData")
+    public AjaxJson getTreeData() {
+        List<TbDistrict> list = tbDistrictService.getTreeData();
+        return AjaxJson.getSuccessData(list);
+    }
+
+    // ------------------------- 前端接口 -------------------------
+
+
+
+
+
+}

+ 55 - 0
sp-server/src/main/java/com/pj/project/tb_district/TbDistrictMapper.java

@@ -0,0 +1,55 @@
+package com.pj.project.tb_district;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pj.utils.so.SoMap;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * Mapper: tb_district -- 全国地区表
+ * @author qzyReal 
+ */
+
+@Mapper
+@Repository
+public interface TbDistrictMapper extends BaseMapper <TbDistrict> {
+
+	/**
+	 * 增  
+	 * @param t 实体对象 
+	 * @return 受影响行数 
+	 */
+	int add(TbDistrict t);
+
+	/**
+	 * 删  
+	 * @param id 要删除的数据id  
+	 * @return 受影响行数 
+	 */
+	int delete(Integer id);	 
+
+	/** 
+	 * 改  
+	 * @param t 实体对象 
+	 * @return 受影响行数 
+	 */
+	int update(TbDistrict t);
+
+	/** 
+	 * 查 - 根据id  
+	 * @param id 要查询的数据id 
+	 * @return 实体对象 
+	 */
+	TbDistrict getById(Integer id);
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * @param so 参数集合 
+	 * @return 数据列表 
+	 */
+	List<TbDistrict> getList(SoMap so);
+
+
+}

+ 80 - 0
sp-server/src/main/java/com/pj/project/tb_district/TbDistrictMapper.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pj.project.tb_district.TbDistrictMapper">
+
+	<!-- 增 [G] -->
+	<insert id="add">
+		insert into 
+		tb_district (id, pid, district, level) 
+		values (#{id}, #{pid}, #{district}, #{level}) 
+	</insert>
+
+	<!-- 删 -->
+	<delete id="delete">
+		delete from tb_district 
+		where id = #{id}
+	</delete>
+
+	<!-- 改 [G] -->
+	<update id="update">
+		update tb_district set
+		id = #{id}, 
+		pid = #{pid}, 
+		district = #{district}, 
+		level = #{level}
+		where id = #{id}
+	</update>
+
+
+	<!-- ================================== 查询相关 ================================== -->
+	<!-- select id, pid, district, level from tb_district  -->
+	
+	<!-- 通用映射:手动模式 -->
+	<resultMap id="model" type="com.pj.project.tb_district.TbDistrict">
+		<result property="id" column="id" />
+		<result property="pid" column="pid" />
+		<result property="district" column="district" />
+		<result property="level" column="level" />
+	</resultMap>
+	
+	<!-- 公共查询sql片段 -->
+	<sql id="select_sql">
+		select * 
+		from tb_district 
+	</sql>
+	
+	<!-- 查 - 根据id -->
+	<select id="getById" resultMap="model">
+		<include refid="select_sql"></include>
+		where id = #{id}
+	</select>
+	
+	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
+	<select id="getList" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.isNotNull("id") '> and id = #{id} </if>
+			<if test=' this.isNotNull("pid") '> and pid = #{pid} </if>
+			<if test=' this.isNotNull("district") '> and district = #{district} </if>
+			<if test=' this.isNotNull("level") '> and level = #{level} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> pid desc </when>
+			<when test='sortType == 3'> district desc </when>
+			<when test='sortType == 4'> level desc </when>
+			<otherwise> id desc </otherwise>
+		</choose>
+	</select>
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+</mapper>

+ 95 - 0
sp-server/src/main/java/com/pj/project/tb_district/TbDistrictService.java

@@ -0,0 +1,95 @@
+package com.pj.project.tb_district;
+
+import cn.hutool.cache.CacheUtil;
+import cn.hutool.cache.impl.TimedCache;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Service: tb_district -- 全国地区表
+ *
+ * @author qzyReal
+ */
+@Service
+public class TbDistrictService extends ServiceImpl<TbDistrictMapper, TbDistrict> implements IService<TbDistrict> {
+
+    /**
+     * 底层 Mapper 对象
+     */
+    @Autowired
+    TbDistrictMapper tbDistrictMapper;
+
+    /**
+     * 增
+     */
+    int add(TbDistrict t) {
+        return tbDistrictMapper.add(t);
+    }
+
+    /**
+     * 删
+     */
+    int delete(Integer id) {
+        return tbDistrictMapper.delete(id);
+    }
+
+    /**
+     * 改
+     */
+    int update(TbDistrict t) {
+        return tbDistrictMapper.update(t);
+    }
+
+    /**
+     * 查
+     */
+    TbDistrict getById(Integer id) {
+        return tbDistrictMapper.getById(id);
+    }
+
+    /**
+     * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+     */
+    List<TbDistrict> getList(SoMap so) {
+        return tbDistrictMapper.getList(so);
+    }
+
+
+    public List<TbDistrict> GetListProvince() {
+        QueryWrapper<TbDistrict> ew = new QueryWrapper<>();
+        ew.eq("pid", 1);
+        return this.list(ew);
+    }
+
+    public List<TbDistrict> GetListCity(Long areaId) {
+        QueryWrapper<TbDistrict> ew = new QueryWrapper<>();
+        ew.eq("pid", areaId);
+        return this.list(ew);
+    }
+
+    TimedCache<String, List<TbDistrict>> timedCache = CacheUtil.newTimedCache(999999999);
+
+    public List<TbDistrict> getTreeData() {
+        List<TbDistrict> cacheList = timedCache.get("address");
+        if (cacheList != null && cacheList.size() > 0) {
+            return cacheList;
+        }
+        List<TbDistrict> list = this.GetListProvince();
+        list.forEach(tbDistrict -> {
+            List<TbDistrict> cityList = this.GetListCity(tbDistrict.getId());
+            tbDistrict.setChildren(cityList);
+            cityList.forEach(city -> {
+                List<TbDistrict> areaList = this.GetListCity(city.getId());
+                city.setChildren(areaList);
+            });
+        });
+        timedCache.put("address", list);
+        return list;
+    }
+}

+ 4 - 3
sp-server/src/main/java/com/pj/project/tb_driver/TbDriver.java

@@ -1,6 +1,8 @@
 package com.pj.project.tb_driver;
 
 import java.io.Serializable;
+import java.util.Date;
+
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.EqualsAndHashCode;
@@ -37,8 +39,7 @@ public class TbDriver extends Model<TbDriver> implements Serializable {
 	/**
 	 * 主键 
 	 */
-	@TableId(type = IdType.AUTO)
-	private Long id;	
+	private String id;
 
 	/**
 	 * 名称 
@@ -58,7 +59,7 @@ public class TbDriver extends Model<TbDriver> implements Serializable {
 	/**
 	 * 创建时间 
 	 */
-	private String createTime;	
+	private Date createTime;
 
 
 

+ 1 - 14
sp-server/src/main/java/com/pj/project/tb_driver/TbDriverController.java

@@ -82,20 +82,7 @@ public class TbDriverController {
 	// ------------------------- 前端接口 -------------------------
 	
 	
-	/** 改 - 不传不改 [G] */
-	@RequestMapping("updateByNotNull")
-	public AjaxJson updateByNotNull(Long id){
-		AjaxError.throwBy(true, "如需正常调用此接口,请删除此行代码");
-		// 鉴别身份,是否为数据创建者 
-		long userId = SP.publicMapper.getColumnByIdToLong(TbDriver.TABLE_NAME, "user_id", id);
-		AjaxError.throwBy(userId != StpUserUtil.getLoginIdAsLong(), "此数据您无权限修改");
-		// 开始修改 (请只保留需要修改的字段)
-		SoMap so = SoMap.getRequestSoMap();
-		so.clearNotIn("id", "name", "phone", "idCard", "createTime").clearNull().humpToLineCase();	
-		int line = SP.publicMapper.updateBySoMapById(TbDriver.TABLE_NAME, so, id);
-		return AjaxJson.getByLine(line);
-	}
-	
+
 	
 	
 	

+ 10 - 2
sp-server/src/main/java/com/pj/project/tb_driver/TbDriverService.java

@@ -2,6 +2,9 @@ package com.pj.project.tb_driver;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -13,7 +16,7 @@ import com.pj.utils.sg.*;
  * @author qzy 
  */
 @Service
-public class TbDriverService {
+public class TbDriverService extends ServiceImpl<TbDriverMapper,TbDriver>implements IService<TbDriver> {
 
 	/** 底层 Mapper 对象 */
 	@Autowired
@@ -43,6 +46,11 @@ public class TbDriverService {
 	List<TbDriver> getList(SoMap so) {
 		return tbDriverMapper.getList(so);	
 	}
-	
 
+
+	public TbDriver findByIdCardNo(String idCardNo) {
+		QueryWrapper<TbDriver>ew=new QueryWrapper<>();
+		ew.eq("id_card",idCardNo);
+		return getOne(ew);
+	}
 }

+ 4 - 2
sp-server/src/main/java/com/pj/project/tb_goods/TbGoods.java

@@ -1,6 +1,8 @@
 package com.pj.project.tb_goods;
 
 import java.io.Serializable;
+import java.util.Date;
+
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.EqualsAndHashCode;
@@ -53,12 +55,12 @@ public class TbGoods extends Model<TbGoods> implements Serializable {
 	/**
 	 * 状态(1=禁用,2=启用) 
 	 */
-	private String status;	
+	private int status;
 
 	/**
 	 * 创建时间 
 	 */
-	private String createTime;	
+	private Date createTime;
 
 
 

+ 3 - 4
sp-server/src/main/java/com/pj/project/tb_goods/TbGoodsMapper.xml

@@ -6,7 +6,7 @@
 	<insert id="add">
 		insert into 
 		tb_goods (id, code, name, status, create_time) 
-		values (#{id}, #{code}, #{name}, #{status}, #{createTime}) 
+		values (#{id}, #{code}, #{name}, #{status}, now())
 	</insert>
 
 	<!-- 删 -->
@@ -56,10 +56,9 @@
 		<include refid="select_sql"></include>
 		<where>
 			<if test=' this.has("id") '> and id = #{id} </if>
-			<if test=' this.has("code") '> and code = #{code} </if>
-			<if test=' this.has("name") '> and name = #{name} </if>
+			<if test=' this.has("code") '> and code like concat('%', #{code},'%') </if>
+			<if test=' this.has("name") '> and name  like concat('%', #{name},'%')</if>
 			<if test=' this.has("status") '> and status = #{status} </if>
-			<if test=' this.has("createTime") '> and create_time = #{createTime} </if>
 		</where>
 		order by
 		<choose>

+ 15 - 14
sp-server/src/main/java/com/pj/project4sp/admin/SpAdmin.java

@@ -18,43 +18,44 @@ public class SpAdmin implements Serializable  {
 
 
 	/** id,--主键、自增 */
-	public Long id;	
+	private Long id;
+	private String customerId;
 	
 	/** admin名称 */
-	public String name;	
+	private String name;
 	
 	/** 头像地址 */
-	public String avatar;	
+	private String avatar;
 	
 	/** 密码 */
-	public String password;	
+	private String password;
 	
 	/** 明文密码 */
-	public String pw;	
+	private String pw;
 	
 	/** 手机号 */
-	public String phone;	
+	private String phone;
 	
 	/** 所属角色id */
-	public Integer roleId;	
-	
+	private String roleId;
+
 	/** 账号状态(1=正常, 2=禁用) */
-	public Integer status;	
+	private Integer status;
 	
 	/** 创建自哪个管理员 */
-	public Long createByAid;	
+	private Long createByAid;
 	
 	/** 创建时间 */
-	public Date createTime;	
+	private Date createTime;
 	
 	/** 上次登陆时间 */
-	public Date loginTime;	
+	private Date loginTime;
 	
 	/** 上次登陆IP */
-	public String loginIp;	
+	private String loginIp;
 	
 	/** 登陆次数 */
-	public Integer loginCount;	
+	private Integer loginCount;
 	
 	
 	// -------- 额外字段 

+ 187 - 136
sp-server/src/main/java/com/pj/project4sp/admin/SpAdminController.java

@@ -2,6 +2,8 @@ package com.pj.project4sp.admin;
 
 import java.util.List;
 
+import com.pj.current.satoken.StpUserUtil;
+import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -14,150 +16,199 @@ import com.pj.utils.so.SoMap;
 
 import cn.dev33.satoken.stp.StpUtil;
 
+import javax.annotation.Resource;
+
 /**
  * Controller -- 系统管理员表
+ *
  * @author kong
  */
 @RestController
 @RequestMapping("/admin/")
 public class SpAdminController {
 
-	@Autowired
-	SpAdminMapper spAdminMapper;
-	
-	@Autowired
-	SpAdminService spAdminService;
-	
-	@Autowired
-	SpAdminPasswordService spAdminPasswordService;
-
-	/** 增  */
-	@RequestMapping("add")
-	AjaxJson add(SpAdmin admin){
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);
-		long id = spAdminService.add(admin);
-		return AjaxJson.getSuccessData(id);
-	}
-
-	/** 删 */
-	@RequestMapping("delete")
-	AjaxJson delete(long id){
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);	
-		// 不能自己删除自己
-		if(StpUtil.getLoginIdAsLong() == id) {
-			return AjaxJson.getError("不能自己删除自己");
-		}
-		int line = spAdminMapper.delete(id);
-		return AjaxJson.getByLine(line);
-	}
-
-	/** 删 - 根据id列表 */
-	@RequestMapping("deleteByIds")
-	AjaxJson deleteByIds(){
-		// 鉴权
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);	
-		// 不能自己删除自己
-		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
-		if(ids.contains(StpUtil.getLoginIdAsLong())) {
-			return AjaxJson.getError("不能自己删除自己");
-		}
-		// 开始删除 
-		int line = SP.publicMapper.deleteByIds("sp_admin", ids);
-		return AjaxJson.getByLine(line);
-	}
-	
-	/** 改  -  name */
-	@RequestMapping("update")
-	AjaxJson update(SpAdmin obj){
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);	
-		SpAdminUtil.checkName(obj.getId(), obj.getName());
-		int line = spAdminMapper.update(obj);
-		return AjaxJson.getByLine(line);
-	}
-
-	/** 查  */
-	@RequestMapping("getById")
-	AjaxJson getById(long id){
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);
-		Object data = spAdminMapper.getById(id);
-		return AjaxJson.getSuccessData(data);
-	}
-
-	/** 查 - 集合 */
-	@RequestMapping("getList")
-	AjaxJson getList(){
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);	
-		SoMap so = SoMap.getRequestSoMap();
-		List<SpAdmin> list = spAdminMapper.getList(so.startPage());
-		return AjaxJson.getPageData(so.getDataCount(), list);
-	}
-
-	/** 改密码 */
-	@RequestMapping("updatePassword")
-	AjaxJson updatePassword(long id, String password){
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);	
-		int line = spAdminPasswordService.updatePassword(id, password);
-		return AjaxJson.getByLine(line);
-	}
-	
-	/** 改头像  */
-	@RequestMapping("updateAvatar")
-	AjaxJson updateAvatar(long id, String avatar){
-		StpUtil.checkPermission(AuthConst.ADMIN_LIST);	
-		int line = SP.publicMapper.updateColumnById("sp_admin", "avatar", avatar, id);
-		return AjaxJson.getByLine(line);
-	}
-	
-	/** 改状态  */
-	@RequestMapping("updateStatus")
-	public AjaxJson updateStatus(long adminId, int status) {
-		StpUtil.checkPermission(AuthConst.R1);
-
-		// 验证对方是否为超管(保护超管不受摧残) 
-		if(StpUtil.hasPermission(adminId, AuthConst.R1)){
-			return AjaxJson.getError("抱歉,对方角色为系统超级管理员,您暂无权限操作");
-		}
-		
-		// 修改状态 
-		SP.publicMapper.updateColumnById("sp_admin", "status", status, adminId);
-		// 如果是禁用,就停掉其秘钥有效果性,使其账号的登录状态立即无效 
-		if(status == 2) {
-			StpUtil.logout(adminId);
-		}
-		return AjaxJson.getSuccess();
-	}
-	
-	/** 改角色  */
-	@RequestMapping("updateRole")
-	AjaxJson updateRole(long id, String roleId){
-		StpUtil.checkPermission(AuthConst.R1);
-		int line = SP.publicMapper.updateColumnById("sp_admin", "role_id", roleId, id);
-		return AjaxJson.getByLine(line);
-	}
-	
-	/** 返回当前admin信息  */
-	@RequestMapping("getByCurr")
-	AjaxJson getByCurr() {
-		SpAdmin admin = SpAdminUtil.getCurrAdmin();
-		return AjaxJson.getSuccessData(admin);
-	}
-	
-	/** 当前admin修改信息 */
-	@RequestMapping("updateInfo")
-	AjaxJson updateInfo(SpAdmin obj){
-		obj.setId(StpUtil.getLoginIdAsLong());
-		SpAdminUtil.checkName(obj.getId(), obj.getName());
-		int line = spAdminMapper.update(obj);
-		return AjaxJson.getByLine(line);
-	}
-	
-	
-	
-	
-	
-	
-	
-	
+    @Resource
+    SpAdminMapper spAdminMapper;
+
+    @Autowired
+    SpAdminService spAdminService;
+
+    @Autowired
+    SpAdminPasswordService spAdminPasswordService;
+
+    /**
+     * 增
+     */
+    @RequestMapping("add")
+    AjaxJson add(SpAdmin admin) {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        admin.setCustomerId(StpUserUtil.getCustomerId());
+        long id = spAdminService.add(admin);
+        return AjaxJson.getSuccessData(id);
+    }
+
+    /**
+     * 删
+     */
+    @RequestMapping("delete")
+    AjaxJson delete(long id) {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        // 不能自己删除自己
+        if (StpUtil.getLoginIdAsLong() == id) {
+            return AjaxJson.getError("不能自己删除自己");
+        }
+        int line = spAdminMapper.delete(id);
+        return AjaxJson.getByLine(line);
+    }
+
+    /**
+     * 删 - 根据id列表
+     */
+    @RequestMapping("deleteByIds")
+    AjaxJson deleteByIds() {
+        // 鉴权
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        // 不能自己删除自己
+        List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class);
+        if (ids.contains(StpUtil.getLoginIdAsLong())) {
+            return AjaxJson.getError("不能自己删除自己");
+        }
+        // 开始删除
+        int line = SP.publicMapper.deleteByIds("sp_admin", ids);
+        return AjaxJson.getByLine(line);
+    }
+
+    /**
+     * 改  -  name
+     */
+    @RequestMapping("update")
+    AjaxJson update(SpAdmin obj) {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        SpAdminUtil.checkName(obj.getId(), obj.getName());
+        int line = spAdminMapper.update(obj);
+        return AjaxJson.getByLine(line);
+    }
+
+    /**
+     * 查
+     */
+    @RequestMapping("getById")
+    AjaxJson getById(long id) {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        Object data = spAdminMapper.getById(id);
+        return AjaxJson.getSuccessData(data);
+    }
+
+    /**
+     * 查 - 集合
+     */
+    @RequestMapping("getList")
+    AjaxJson getList() {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        SoMap so = SoMap.getRequestSoMap();
+        so.put("customerId", StpUserUtil.getCustomerId());
+        List<SpAdmin> list = spAdminMapper.getList(so.startPage());
+        return AjaxJson.getPageData(so.getDataCount(), list);
+    }
+    /**
+     * 查 - 集合
+     */
+    @RequestMapping("getCustomerAdminList")
+    AjaxJson getCustomerAdminList() {
+        SoMap so = SoMap.getRequestSoMap();
+        List<SpAdmin> list = spAdminMapper.getList(so.startPage());
+        return AjaxJson.getPageData(so.getDataCount(), list);
+    }
+    @RequestMapping("addCustomerAdmin")
+    AjaxJson addCustomerAdmin(SpAdmin spAdmin){
+      SpAdmin db=  spAdminMapper.getByName(spAdmin.getName());
+      if(db!=null){
+          return AjaxJson.getError("登录名已被占用");
+      }
+        spAdminService.add(spAdmin);
+        return AjaxJson.getSuccess();
+    }
+
+    @RequestMapping("setRole")
+    public AjaxJson setRole() {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        SoMap so = SoMap.getRequestSoMap();
+        Long id = so.getLong("id");
+        String roleId = so.getString("roleId");
+        spAdminMapper.setRole(id,roleId);
+        return AjaxJson.getSuccess();
+    }
+
+    /**
+     * 改密码
+     */
+    @RequestMapping("updatePassword")
+    AjaxJson updatePassword(long id, String password) {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        int line = spAdminPasswordService.updatePassword(id, password);
+        return AjaxJson.getByLine(line);
+    }
+
+    /**
+     * 改头像
+     */
+    @RequestMapping("updateAvatar")
+    AjaxJson updateAvatar(long id, String avatar) {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+        int line = SP.publicMapper.updateColumnById("sp_admin", "avatar", avatar, id);
+        return AjaxJson.getByLine(line);
+    }
+
+    /**
+     * 改状态
+     */
+    @RequestMapping("updateStatus")
+    public AjaxJson updateStatus(long adminId, int status) {
+        StpUtil.checkPermission(AuthConst.ADMIN_LIST);
+
+        // 验证对方是否为超管(保护超管不受摧残)
+        if (StpUtil.hasPermission(adminId, AuthConst.R1)) {
+            return AjaxJson.getError("抱歉,对方角色为系统超级管理员,您暂无权限操作");
+        }
+
+        // 修改状态
+        SP.publicMapper.updateColumnById("sp_admin", "status", status, adminId);
+        // 如果是禁用,就停掉其秘钥有效果性,使其账号的登录状态立即无效
+        if (status == 2) {
+            StpUtil.logout(adminId);
+        }
+        return AjaxJson.getSuccess();
+    }
+
+    /**
+     * 改角色
+     */
+    @RequestMapping("updateRole")
+    AjaxJson updateRole(long id, String roleId) {
+        StpUtil.checkPermission(AuthConst.R1);
+        int line = SP.publicMapper.updateColumnById("sp_admin", "role_id", roleId, id);
+        return AjaxJson.getByLine(line);
+    }
+
+    /**
+     * 返回当前admin信息
+     */
+    @RequestMapping("getByCurr")
+    AjaxJson getByCurr() {
+        SpAdmin admin = SpAdminUtil.getCurrAdmin();
+        return AjaxJson.getSuccessData(admin);
+    }
+
+    /**
+     * 当前admin修改信息
+     */
+    @RequestMapping("updateInfo")
+    AjaxJson updateInfo(SpAdmin obj) {
+        obj.setId(StpUtil.getLoginIdAsLong());
+        SpAdminUtil.checkName(obj.getId(), obj.getName());
+        int line = spAdminMapper.update(obj);
+        return AjaxJson.getByLine(line);
+    }
 
 
 }

+ 5 - 0
sp-server/src/main/java/com/pj/project4sp/admin/SpAdminMapper.java

@@ -5,6 +5,7 @@ import java.util.List;
 import org.apache.ibatis.annotations.Mapper;
 
 import com.pj.utils.so.SoMap;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * Mapper: 系统管理员表
@@ -64,5 +65,9 @@ public interface SpAdminMapper {
 	SpAdmin getByPhone(String phone);
 
 
+	void setRole(@Param("id") Long id,@Param("roleId") String roleId);
 
+	void removeByCustomerId(@Param("customerId") String customerId);
+
+	void updateCustomerAdmin(@Param("customerId")String customerId, @Param("status")int status);
 }

+ 13 - 4
sp-server/src/main/java/com/pj/project4sp/admin/SpAdminMapper.xml

@@ -6,9 +6,15 @@
 	<!-- 增 -->
 	<insert id="add">
 		insert into
-		sp_admin(name, avatar, phone, role_id, create_by_aid, create_time)
-		values (#{name}, #{avatar}, #{phone}, #{roleId}, #{createByAid}, now())
+		sp_admin(name, customer_id,avatar, phone, role_id, create_by_aid, create_time)
+		values (#{name},#{customerId}, #{avatar}, #{phone}, #{roleId}, #{createByAid}, now())
 	</insert>
+	<update id="setRole">
+		update sp_admin set role_id=#{roleId} where id=#{id}
+	</update>
+	<update id="updateCustomerAdmin">
+		update sp_admin set status=#{status} where customer_id=#{customerId}
+	</update>
 
 
 	<!-- 删 -->
@@ -23,7 +29,10 @@
 		name = #{name} 
 		where id = #{id} 
 	</delete>
-	
+	<delete id="removeByCustomerId">
+		delete  from sp_admin where customer_id=#{customerId}
+	</delete>
+
 	<!-- 自己改自己 -->
 	<!-- <delete id="updateBy">
 		update sp_admin set 
@@ -81,7 +90,7 @@
 	<!-- 查询 -->
 	<select id="getList" resultMap="model">
 		<include refid="select_sql"></include>
-		where 1=1
+		where customer_id=#{customerId}
 		<if test=' this.has("id")  '>and id = #{id} </if>
 		<if test=' this.has("name")  '>and name like concat('%', #{name}, '%')  </if>
 		<if test=' this.has("roleId")  '>and role_id = #{roleId} </if>

+ 3 - 1
sp-server/src/main/java/com/pj/project4sp/admin4login/SpAccAdminService.java

@@ -3,6 +3,7 @@ package com.pj.project4sp.admin4login;
 
 import java.util.Date;
 
+import com.pj.current.satoken.StpUserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -90,7 +91,8 @@ public class SpAccAdminService {
 
         // =========== 至此, 已登录成功 ============ 
         successLogin(admin);
-        StpUtil.login(admin.getId()); 		
+        StpUtil.login(admin.getId());
+		StpUserUtil.saveAdmin(admin.getId(),admin);
         
         // 组织返回参数  
 		SoMap map = new SoMap();

+ 9 - 5
sp-server/src/main/java/com/pj/project4sp/role/SpRole.java

@@ -4,31 +4,35 @@ import java.io.Serializable;
 import java.util.Date;
 
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * Model: 系统角色表
  * @author kong
  */
 @Data
+@Accessors(chain = true)
 public class SpRole implements Serializable  {
 
 	private static final long serialVersionUID = 1L;
 
 	// ---------- 表中字段 ----------
 	/** 角色id,--主键、自增 */
-	public Long id;	
+	private Long id;
+	private String customerId;
+	private String type;
 	
 	/** 角色名称, 唯一约束 */
-	public String name;	
+	private String name;
 	
 	/** 角色详细描述 */
-	public String info;	
+	private String info;
 	
 	/** 是否锁定(1=是,2=否), 锁定之后不可随意删除, 防止用户误操作 */
-	public Integer isLock;	
+	private Integer isLock;
 	
 	/** 创建时间 */
-	public Date createTime;	
+	private Date createTime;
 
 
 

+ 22 - 19
sp-server/src/main/java/com/pj/project4sp/role/SpRoleController.java

@@ -2,8 +2,10 @@ package com.pj.project4sp.role;
 
 import java.util.List;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
+import com.pj.current.satoken.StpUserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,42 +28,33 @@ import cn.dev33.satoken.stp.StpUtil;
 public class SpRoleController {
 
 	/** 底层Mapper依赖 */
-	@Autowired
+	@Resource
 	SpRoleMapper spRoleMapper;
 
 	/** 增 */
 	@RequestMapping("add")
 	@Transactional(rollbackFor = Exception.class)
 	AjaxJson add(SpRole s, HttpServletRequest request){
-		StpUtil.checkPermission(AuthConst.ROLE_LIST);
-		// 检验
-		if(spRoleMapper.getById(s.getId()) != null) {
-			return AjaxJson.getError("此id已存在,请更换");
-		}
-		SpRoleUtil.checkRoleThrow(s);
-		int line = spRoleMapper.add(s);
-		AjaxError.throwByLine(line, "添加失败");
-		// 返回这个对象 
-		long id = s.getId();
-		if(id == 0) {
-			id = SP.publicMapper.getPrimarykey();
-		}
-		return AjaxJson.getSuccessData(spRoleMapper.getById(id));
+		StpUtil.checkPermission(AuthConst.AUTH);
+		s.setCustomerId(StpUserUtil.getCustomerId());
+		spRoleMapper.add(s);
+		return AjaxJson.getSuccess();
 	}
 
 	/** 删 */
 	@RequestMapping("delete")
 	AjaxJson delete(long id, HttpServletRequest request){
-		StpUtil.checkPermission(AuthConst.R1);	
+		StpUtil.checkPermission(AuthConst.AUTH);
 		StpUtil.checkPermission(AuthConst.ROLE_LIST);	
 		int line = spRoleMapper.delete(id);
 		return AjaxJson.getByLine(line);
 	}
 
+
 	/** 改 */ 
 	@RequestMapping("update")
 	AjaxJson update(SpRole s){
-		StpUtil.checkPermission(AuthConst.R1);	
+		StpUtil.checkPermission(AuthConst.AUTH);
 		StpUtil.checkPermission(AuthConst.ROLE_LIST);	
 		SpRoleUtil.checkRoleThrow(s);
 		int line = spRoleMapper.update(s);
@@ -71,7 +64,7 @@ public class SpRoleController {
 	/** 查 */ 
 	@RequestMapping("getById")
 	AjaxJson getById(long id){
-		StpUtil.checkPermission(AuthConst.R99);	
+		StpUtil.checkPermission(AuthConst.AUTH);
 		SpRole s = spRoleMapper.getById(id);
 		return AjaxJson.getSuccessData(s);
 	}
@@ -79,11 +72,21 @@ public class SpRoleController {
 	/** 查 - 集合  */
 	@RequestMapping("getList")
 	AjaxJson getList(){
-		StpUtil.checkPermission(AuthConst.R99);	
+		StpUtil.checkPermission(AuthConst.AUTH);
 		SoMap so = SoMap.getRequestSoMap();
+		so.put("customerId", StpUserUtil.getCustomerId());
 		List<SpRole> list = spRoleMapper.getList(so);
 		return AjaxJson.getSuccessData(list);
 	}
+	/** 查 - 集合  */
+	@RequestMapping("getCustomerRoleList")
+	AjaxJson getCustomerRoleList(){
+		SoMap so = SoMap.getRequestSoMap();
+		List<SpRole> list = spRoleMapper.getList(so);
+		return AjaxJson.getSuccessData(list);
+	}
+
+
 
 
 	

+ 3 - 0
sp-server/src/main/java/com/pj/project4sp/role/SpRoleMapper.java

@@ -57,4 +57,7 @@ public interface SpRoleMapper {
 	 */
 	SpRole getByRoleName(String name);
 
+    List<SpRole> getByIds(List<Long> ids);
+
+	void removeByCustomerId(String customerId);
 }

+ 13 - 4
sp-server/src/main/java/com/pj/project4sp/role/SpRoleMapper.xml

@@ -6,8 +6,8 @@
 	<!-- 增 -->
 	<insert id="add" >
 		insert into 
-		sp_role(id, name, info, is_lock, create_time) 
-		values (#{id}, #{name}, #{info}, 2, now())
+		sp_role( name,customer_id, `type`,info, is_lock, create_time)
+		values ( #{name},#{customerId},#{type}, #{info}, 2, now())
 	</insert>
 
 
@@ -16,6 +16,9 @@
 		delete from sp_role 
 		where id = #{id}
 	</delete>
+	<delete id="removeByCustomerId">
+		delete  from sp_role where customer_id=#{customerId}
+	</delete>
 
 
 	<!-- 改 -->
@@ -31,6 +34,7 @@
 	<resultMap id="model" type="com.pj.project4sp.role.SpRole">
 		<result property="id" column="id" />
 		<result property="name" column="name" />
+		<result property="customerId" column="customer_id" />
 		<result property="info" column="info" />
 		<result property="isLock" column="is_lock" />
 		<result property="createTime" column="create_time" />
@@ -45,7 +49,7 @@
 
 	<!-- 查询 -->
 	<select id="getList" resultMap="model" >
-		select * from sp_role where 1=1 
+		select * from sp_role where customer_id=#{customerId}
 		<if test=' this.has("name")  '>
 			and name like concat('%', #{name}, '%')
 		</if>
@@ -56,7 +60,12 @@
 		select * from sp_role 
 		where name = #{name}
 	</select>
+	<select id="getByIds" resultType="com.pj.project4sp.role.SpRole">
+		select * from sp_role where id in
+		<foreach collection="list" separator="," open="(" close=")" item="id">
+			#{id}
+		</foreach>
+	</select>
 
 
-	
 </mapper>

+ 1 - 1
sp-server/src/main/java/com/pj/project4sp/role/SpRoleUtil.java

@@ -26,7 +26,7 @@ public class SpRoleUtil {
 	/**
 	 * 获取当前会话的roleId 
 	 */
-	public static long getCurrRoleId() {
+	public static String getCurrRoleId() {
 		return SpAdminUtil.getCurrAdmin().getRoleId();
 	}
 	

+ 22 - 7
sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionController.java

@@ -1,7 +1,13 @@
 package com.pj.project4sp.role4permission;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
+import cn.hutool.core.util.StrUtil;
+import com.pj.constants.RoleEnum;
+import com.pj.current.satoken.StpUserUtil;
+import com.pj.project4sp.role.SpRole;
+import com.pj.project4sp.role.SpRoleMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -13,6 +19,8 @@ import com.pj.utils.sg.AjaxJson;
 
 import cn.dev33.satoken.stp.StpUtil;
 
+import javax.annotation.Resource;
+
 /**
  * Controller: 角色与权限的中间表 
  * @author kong
@@ -26,6 +34,8 @@ public class SpRolePermissionController {
 	/** 底层Service */
 	@Autowired
 	SpRolePermissionService spRolePermissionService;
+	@Resource
+	private SpRoleMapper spRoleMapper;
 	
 	
 	
@@ -35,13 +45,13 @@ public class SpRolePermissionController {
 	 * @return
 	 */
 	@RequestMapping("getPcodeByRid")
-    public AjaxJson getPcodeByRid(@RequestParam(defaultValue="0") long roleId){
+    public AjaxJson getPcodeByRid(@RequestParam String roleId){
 		// 鉴权  
-		StpUtil.checkPermission(AuthConst.R1);	
+		StpUtil.checkPermission(AuthConst.AUTH);
 		StpUtil.checkPermission(AuthConst.ROLE_LIST);	
 		// 防止拉出全部 	
-		if(roleId == 0){
-			return AjaxJson.getError("roleId不能为null或0");		
+		if(StrUtil.isEmpty(roleId)){
+			return AjaxJson.getError("roleId不能为null");
 		}
 		return AjaxJson.getSuccessData(spRolePermissionService.getPcodeByRid2(roleId));
 	}
@@ -50,7 +60,13 @@ public class SpRolePermissionController {
 	/** 拉取菜单id列表  根据当前用户roleId  */
 	@RequestMapping("getPcodeByCurrRid")
 	public AjaxJson getPcodeByCurrRid(){
-		long roleId = SpRoleUtil.getCurrRoleId();
+		String roleId = SpRoleUtil.getCurrRoleId();
+		List<SpRole>roles= spRoleMapper.getByIds(StrUtil.splitTrim(roleId,",").stream().map(Long::valueOf).collect(Collectors.toList()));
+		long count=roles.stream().filter(spRole -> StrUtil.equals(spRole.getType(), RoleEnum.ADMIN_ROLE.getType())).count();
+		if (count>0){
+			List<String>list= spRolePermissionService.getAdminPcode();
+			return AjaxJson.getSuccessData(list);
+		}
 		List<Object> list = spRolePermissionService.getPcodeByRid2(roleId);
 		return AjaxJson.getSuccessData(list);
 	}
@@ -64,8 +80,7 @@ public class SpRolePermissionController {
 	 */
 	@RequestMapping("updatePcodeByRid")
 	public AjaxJson updatePcodeByRid(long roleId, String[] code){
-		StpUtil.checkPermission(AuthConst.R1);	
-		StpUtil.checkPermission(AuthConst.ROLE_LIST);	
+		StpUtil.checkPermission(AuthConst.AUTH);
 		return AjaxJson.getSuccessData(spRolePermissionService.updateRoleMenu(roleId, code));
 	}
 	

+ 7 - 3
sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionMapper.java

@@ -35,8 +35,12 @@ public interface SpRolePermissionMapper {
 	 * @param roleId
 	 * @return
 	 */
-	List<String> getPcodeByRoleId(long roleId);
-	
-	
+	List<String> getPcodeByRoleId(List<String> roleId);
+
+
+    List<String> getAdminPcode();
+
+	void saveRolePer(@Param("roleId") long roleId,@Param("list") List<String> list);
 
+	void removeByRoleIds(List<Long> roleIds);
 }

+ 24 - 5
sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionMapper.xml

@@ -9,17 +9,36 @@
 		sp_role_permission(role_id, permission_code, create_time) 
 		values (#{roleId}, #{pcode}, now())
 	</insert>
-	
-	<!-- 删除指定角色的所有权限 -->
+    <insert id="saveRolePer">
+		insert into sp_role_permission(role_id,permission_code,create_time) values
+		<foreach collection="list" item="perCode" separator=",">
+			(#{roleId},#{perCode},now())
+		</foreach>
+	</insert>
+
+    <!-- 删除指定角色的所有权限 -->
 	<delete id="deleteByRoleId">
 		delete from sp_role_permission
 		where role_id = #{roleId} 
 	</delete>
+    <delete id="removeByRoleIds">
+        delete  from  sp_role_permission
+        where role_id in
+        <foreach collection="list" separator="," item="roleId" open="(" close=")">
+            #{roleId}
+        </foreach>
+    </delete>
 
-	<!-- 指定roleId的所有权限码   -->
-	<select id="getPcodeByRoleId" resultType="String">
+    <!-- 指定roleId的所有权限码   -->
+	<select id="getPcodeByRoleId" resultType="java.lang.String">
 		select permission_code from sp_role_permission
-		where role_id = #{roleId}
+		where role_id in
+		<foreach collection="list" item="roleId" open="(" close=")" separator=",">
+			#{roleId}
+		</foreach>
+	</select>
+	<select id="getAdminPcode" resultType="java.lang.String">
+		select permission_code from tb_permission
 	</select>
 
 

+ 12 - 9
sp-server/src/main/java/com/pj/project4sp/role4permission/SpRolePermissionService.java

@@ -3,6 +3,7 @@ package com.pj.project4sp.role4permission;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import cn.hutool.core.util.StrUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
@@ -25,17 +26,17 @@ public class SpRolePermissionService {
 	/**
 	 * 获取指定角色的所有权限码 【增加缓存】
 	 */
-    @Cacheable(value="api_pcode_list", key="#roleId")	
-    public List<String> getPcodeByRid(long roleId){
-    	return spRolePermissionMapper.getPcodeByRoleId(roleId);
+    @Cacheable(value="api_pcode_list", key="#roleIds")
+    public List<String> getPcodeByRid(String roleIds){
+    	return spRolePermissionMapper.getPcodeByRoleId(StrUtil.splitTrim(roleIds,","));
     }
 
 	/**
 	 * 获取指定角色的所有权限码 (Object类型)  【增加缓存】
 	 */
-    @Cacheable(value="api_pcode_list2", key="#roleId")	
-    public List<Object> getPcodeByRid2(long roleId){
-		List<String> codeList = spRolePermissionMapper.getPcodeByRoleId(roleId);					
+    @Cacheable(value="api_pcode_list2", key="#roleIds")
+    public List<Object> getPcodeByRid2(String roleIds){
+		List<String> codeList = spRolePermissionMapper.getPcodeByRoleId(StrUtil.splitTrim(roleIds,","));
 		return codeList.stream().map(String::valueOf).collect(Collectors.toList());				
     }
 
@@ -62,7 +63,9 @@ public class SpRolePermissionService {
     	// 返回
         return pcodeArray.length;
     }
-	
-	
-	
+
+
+	public List<String> getAdminPcode() {
+		return spRolePermissionMapper.getAdminPcode();
+	}
 }

+ 0 - 27
sp-server/src/main/java/com/pj/project4sp/test/TestController.java

@@ -1,27 +0,0 @@
-package com.pj.project4sp.test;
-
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.pj.utils.sg.AjaxJson;
-
-/**
- * 测试controller 
- * @author kong 
- */
-@RestController
-public class TestController {
-
-	
-	/**
-	 * 测试请求,如果能正常访问此路由,则证明项目已经部署成功 
-	 * @return
-	 */
-	@RequestMapping("/test")
-	public AjaxJson test() {
-		System.out.println("------------------ 成功进入请求 ------------------");
-		return AjaxJson.getSuccess("请求成功");
-	}
-
-	
-}