浏览代码

监控,下发数据

qzyReal 2 年之前
父节点
当前提交
db0658d3b9

+ 3 - 3
login.html

@@ -60,7 +60,7 @@
 					</div>
 					<div class="login-center clearfix remember-box">
 						<label><input type="checkbox" id="remember"> 记住我</label>
-						<span class="remark-text">测试:sa/123456</span>
+						<!-- <span class="remark-text">测试:sa/123456</span> -->
 					</div>
 					<div class="login-button">登录</div>
 				</div>
@@ -80,8 +80,8 @@
 
 			// 所有参考属性
 			var page_title = '智慧防疫 后台 - 登录';		// 页面标题
-			var key = 'sa';							// 默认的账号
-			var password = '123456';				// 默认的password
+			var key = '';							// 默认的账号
+			var password = '';				// 默认的password
 			var logo = 'sa-frame/admin-logo.png';	// logo地址,为空字符串则不显示
 
 			// 点击登录按钮

+ 2 - 1
sa-frame/com/sa-item.vue

@@ -58,7 +58,7 @@
 	</div>
 	<!-- img -->
 	<div class="c-item" :class="{br: br}" v-else-if="type == 'img'">
-		<label class="c-label">{{name}}:</label> 
+		<label class="c-label"><span v-if="need" style="color: red;">*</span>{{name}}:</label> 
 		<img :src="value" class="info-img" @click="sa.showImage(value, '400px', '400px')" v-if="!sa.isNull(value)">
 		<el-link type="primary" @click="sa.uploadImage(src => {$emit('input', src); sa.ok2('上传成功');})">上传</el-link>
 	</div>
@@ -217,6 +217,7 @@
 			@size-change="changePage()">
 		</el-pagination>
 	</div>
+	
 </template>
 
 <script>

+ 126 - 82
sa-frame/menu-list-sp.js

@@ -21,10 +21,10 @@ window.menuList.unshift({
 		name: '基础数据管理',
 		icon: 'el-icon-unlock',
 		parent: true,
-
 		childList: [{
 				id: 'tb-dept-list',
 				name: '组织管理',
+				icon: 'el-icon-s-operation',
 				url: 'sa-view/tb-dept/tb-dept-list.html',
 				childList: [{
 						id: 'tb-dept-add',
@@ -48,6 +48,7 @@ window.menuList.unshift({
 			{
 				id: 'admin-list',
 				name: '用户管理',
+				icon: 'el-icon-user',
 				url: 'sa-view-sp/sp-admin/admin-list.html',
 				info: '所有管理员账号',
 				childList: [{
@@ -72,6 +73,7 @@ window.menuList.unshift({
 			{
 				id: 'role-list',
 				name: '角色管理',
+				icon: 'el-icon-s-custom',
 				url: 'sa-view-sp/sp-role/role-list.html',
 				info: '管理系统各种角色',
 				childList: [{
@@ -102,18 +104,21 @@ window.menuList.unshift({
 			{
 				id: 'menu-list',
 				name: '菜单列表',
+				icon: 'el-icon-s-operation',
 				url: 'sa-view-sp/sp-role/menu-list.html',
 				info: '所有菜单项预览'
 			},
 			{
 				id: 'apilog-list',
 				name: '日志管理',
+				icon: 'el-icon-date',
 				url: 'sa-view-sp/sp-apilog/api-log-list.html',
 				info: '记录本系统所有的api请求'
 			},
 			{
 				id: 'sys-dict-list',
 				name: '字典管理',
+				icon: 'el-icon-document',
 				url: 'sa-view/sys-dict/sys-dict-list.html',
 				childList: [{
 						id: 'sys-dict-add',
@@ -144,6 +149,7 @@ window.menuList.unshift({
 		info: '对本系统的各种监控',
 		childList: [{
 				id: 'redis-console',
+				icon: 'el-icon-tickets',
 				name: 'Redis控制台',
 				url: 'sa-view-sp/sp-console/redis-console.html',
 				info: 'redis常用工具'
@@ -152,14 +158,11 @@ window.menuList.unshift({
 			{
 				id: 'sql-console',
 				name: 'SQL 监控台',
+				icon: 'el-icon-set-up',
 				url: 'sa-view-sp/sp-console/sql-console.html',
 				info: 'sql控制台'
 			},
-			{
-				id: 'form-generator',
-				name: '在线表单构建',
-				url: 'https://mrhj.gitee.io/form-generator/#/'
-			},
+
 		]
 	}, {
 		id: 'sp-cfg',
@@ -167,26 +170,27 @@ window.menuList.unshift({
 		parent: true,
 		icon: 'el-icon-setting',
 		info: '有防疫的一些配置',
-		childList: [
-			{
-				id: 'sp-cfg-server',
-				name: '参数设置',
-				url: 'sa-view-sp/sp-cfg/server-cfg.html'
-			},
-		]
+		childList: [{
+			id: 'sp-cfg-server',
+			name: '参数设置',
+			icon: 'el-icon-s-grid',
+			url: 'sa-view-sp/sp-cfg/server-cfg.html'
+		}, ]
 	}, {
 		id: 'filing-system',
 		name: '备案管理子系统',
 		parent: true,
-		icon: 'el-icon-document-add',
+		icon: 'el-icon-suitcase',
 		childList: [{
 				id: 'tb-filing',
 				name: '备案管理',
 				parent: true,
+				icon: 'el-icon-date',
 				url: 'sa-view/tb-car-black/tb-car-black-list.html',
 				childList: [{
 						id: 'tb-car-filing-list',
 						name: '车辆备案',
+						icon: 'el-icon-receiving',
 						url: 'sa-view/tb-car-filing/tb-car-filing-list.html',
 						childList: [{
 								id: 'tb-car-filing-judge',
@@ -215,6 +219,7 @@ window.menuList.unshift({
 					{
 						id: 'tb-person-filing-list',
 						name: '人员备案',
+						icon: 'el-icon-s-custom',
 						url: 'sa-view/tb-person-filing/tb-person-filing-list.html',
 						childList: [{
 								id: 'tb-person-filing-judge',
@@ -246,10 +251,12 @@ window.menuList.unshift({
 				id: 'tb-black',
 				name: '黑名单管理',
 				parent: true,
+				icon: 'el-icon-cpu',
 				url: 'sa-view/tb-car-black/tb-car-black-list.html',
 				childList: [{
 						id: 'tb-car-black-list',
 						name: '车辆黑名单',
+						icon: 'el-icon-receiving',
 						url: 'sa-view/tb-car-black/tb-car-black-list.html',
 						childList: [{
 								id: 'tb-car-black-add',
@@ -273,6 +280,7 @@ window.menuList.unshift({
 					{
 						id: 'tb-person-black-list',
 						name: '人员黑名单',
+						icon: 'el-icon-user-solid',
 						url: 'sa-view/tb-person-black/tb-person-black-list.html',
 						childList: [{
 								id: 'tb-person-black-add',
@@ -305,6 +313,7 @@ window.menuList.unshift({
 		childList: [{
 				id: 'tb-person-visit-record-list',
 				name: '出入记录',
+				icon: 'el-icon-s-unfold',
 				url: 'sa-view/tb-person-visit-record/tb-person-visit-record-list.html',
 				childList: [{
 						id: 'tb-person-visit-record-export',
@@ -326,11 +335,13 @@ window.menuList.unshift({
 			{
 				id: 'tb-person-visit-temperature-list',
 				name: '出入体温检测',
+				icon: 'el-icon-set-up',
 				url: 'sa-view/tb-person-visit-record/tb-person-visit-temperature-list.html'
 			},
 			{
 				id: 'tb-person-visit-record-add',
 				name: '手工补录',
+				icon: 'el-icon-thumb',
 				url: 'sa-view/tb-person-visit-record/tb-person-visit-record-add.html'
 			},
 		]
@@ -342,6 +353,7 @@ window.menuList.unshift({
 		childList: [{
 			id: 'tb-car-visit-record-list',
 			name: '车辆出入记录',
+			icon: 'el-icon-s-unfold',
 			url: 'sa-view/tb-car-visit-record/tb-car-visit-record-list.html',
 			childList: [{
 					id: 'tb-car-visit-record-export',
@@ -377,6 +389,7 @@ window.menuList.unshift({
 				id: 'tb-venues-list',
 				name: '场所管理',
 				url: 'sa-view/tb-venues/tb-venues-list.html',
+				icon: 'el-icon-s-operation',
 				childList: [{
 						id: 'tb-venues-add',
 						name: '添加',
@@ -399,13 +412,19 @@ window.menuList.unshift({
 			{
 				id: 'tb-terminal',
 				name: '人脸设备管理',
-				icon: 'el-icon-folder-opened',
+				icon: 'el-icon-user-solid',
 				parent: true,
 				childList: [{
 						id: 'tb-terminal-list',
 						name: '人脸设备',
+						icon: 'el-icon-s-custom',
 						url: 'sa-view/tb-terminal/tb-terminal-list.html',
 						childList: [{
+								id: 'tb-terminal-down',
+								name: '下发数据',
+								isShow: false,
+							},
+							{
 								id: 'tb-terminal-clear',
 								name: '清除数据',
 								isShow: false,
@@ -451,6 +470,7 @@ window.menuList.unshift({
 					}, {
 						id: 'tb-command-log-list',
 						name: '命令日志',
+						icon: 'el-icon-document-copy',
 						url: 'sa-view/tb-command-log/tb-command-log-list.html',
 						childList: [{
 							id: 'tb-command-log-del',
@@ -466,10 +486,11 @@ window.menuList.unshift({
 				id: 'tb-gate-terminal',
 				name: '车辆道闸',
 				parent: true,
-				icon: 'el-icon-folder-opened',
+				icon: 'el-icon-s-platform',
 				childList: [{
 						id: 'tb-gate-terminal-list',
 						name: '道闸设备',
+						icon: 'el-icon-takeaway-box',
 						url: 'sa-view/tb-gate-terminal/tb-gate-terminal-list.html',
 						childList: [{
 								id: 'tb-gate-terminal-open',
@@ -500,6 +521,7 @@ window.menuList.unshift({
 					{
 						id: 'tb-gate-command-log-list',
 						name: '命令日志',
+						icon: 'el-icon-document-copy',
 						url: 'sa-view/tb-gate-command-log/tb-gate-command-log-list.html',
 						childList: [{
 							id: 'tb-gate-command-log-del',
@@ -520,86 +542,108 @@ window.menuList.unshift({
 		icon: 'el-icon-user',
 		parent: true,
 		childList: [{
-			id: 'tb-manager-list',
-			name: '防疫人员',
-			url: 'sa-view/tb-manager/tb-manager-list.html',
-			childList: [{
-					id: 'tb-manager-add',
-					name: '新增',
-					isShow: false,
+				id: 'tb-manager-list',
+				name: '防疫人员',
+				icon: 'el-icon-user',
+				url: 'sa-view/tb-manager/tb-manager-list.html',
+				childList: [{
+						id: 'tb-manager-add',
+						name: '新增',
+						isShow: false,
 
-				},
-				{
-					id: 'tb-manager-edit',
-					name: '修改',
-					isShow: false,
+					},
+					{
+						id: 'tb-manager-edit',
+						name: '修改',
+						isShow: false,
 
-				},
-				{
-					id: 'tb-manager-del',
-					name: '删除',
-					isShow: false,
+					},
+					{
+						id: 'tb-manager-del',
+						name: '删除',
+						isShow: false,
 
-				},
-			]
-		}, 
-		{
-		   id: 'health-code-record-list',
-		   name: '健康码管理',
-		   url: 'sa-view/tb-person-visit-record/health-code-record-list.html',
-		   childList: [
-		      {
-		         id: 'health-code-record-solve',
-		         name: '处置',
-		         isShow: false,
-		      },
-			  {
-			     id: 'health-code-record-del',
-			     name: '删除',
-			     isShow: false,
-			  },
-		   ]
-		},
+					},
+				]
+			},
+			{
+				id: 'tb-tactics',
+				name: '防疫策略管理',
+				icon: 'el-icon-menu',
+				url: 'sa-view/tb-tactics/tb-tactics-list.html',
+				childList: [{
+						id: 'tb-tactics-setting',
+						name: '设置',
+						isShow: false,
+					},
+
+				]
+			},
+			{
+				id: 'health-code-record-list',
+				name: '健康码管理',
+				icon: 'el-icon-menu',
+				url: 'sa-view/tb-person-visit-record/health-code-record-list.html',
+				childList: [{
+						id: 'health-code-record-solve',
+						name: '处置',
+						isShow: false,
+					},
+					{
+						id: 'health-code-record-del',
+						name: '删除',
+						isShow: false,
+					},
+				]
+			},
 		]
-	},{
+	}, {
 		id: 'alarm-monitor-system',
 		name: '预警监控子系统',
 		icon: 'el-icon-user',
 		parent: true,
 		childList: [{
-			id: 'tb-alarm-person-list',
-			name: '预警通知对象',
-			url: 'sa-view/tb-alarm-person/tb-alarm-person-list.html',
-			childList: [{
-					id: 'tb-alarm-person-add',
-					name: '新增',
-					isShow: false,
-				},
-				{
-					id: 'tb-alarm-person-edit',
-					name: '修改',
-					isShow: false,
+				id: 'tb-alarm-person-list',
+				name: '预警通知对象',
+				icon: 'el-icon-user',
+				url: 'sa-view/tb-alarm-person/tb-alarm-person-list.html',
+				childList: [{
+						id: 'tb-alarm-person-add',
+						name: '新增',
+						isShow: false,
+					},
+					{
+						id: 'tb-alarm-person-edit',
+						name: '修改',
+						isShow: false,
+
+					},
+					{
+						id: 'tb-alarm-person-del',
+						name: '删除',
+						isShow: false,
+					},
+				]
+			},
 
-				},
-				{
-					id: 'tb-alarm-person-del',
-					name: '删除',
-					isShow: false,
-				},
-			]
-		}, 
-		
 		]
 	}, {
 		id: 'health-monitor-system',
 		name: '监控管理系统',
-		icon: 'el-icon-folder-opened',
+		icon: 'el-icon-video-camera-solid',
 		parent: true,
-		childList:[
-		{
-			id: 'tb-monitor',
-			name: '实时监控系统',
-			url: 'sa-view/monitor/tb-monitor.html'
-		}]
+		childList: [{
+				id: 'tb-monitor',
+				name: '实时监控系统',
+				icon: 'el-icon-video-camera',
+				url: 'sa-view/monitor/tb-monitor.html'
+			},
+			{
+				id: 'tb-terminal-monitor',
+				name: '设备监控系统',
+				icon: 'el-icon-s-platform',
+				url: 'sa-view/monitor/tb-terminal-monitor.html'
+			},
+		]
 	},
 );

+ 41 - 39
sa-frame/sa-code.js

@@ -16,74 +16,80 @@
 sa.ajax('/AccAdmin/getLoginInfo', function(res) {
 	console.log(res)
 	// 验证权限 
-	if(!(res.data.admin && res.data.perList.indexOf('in-system') > -1)) {
+	if (!(res.data.admin && res.data.perList.indexOf('in-system') > -1)) {
 		sa.$sys.setCurrUser(res.data.admin);
-		return sa.alert('当前账号暂无进入后台权限');
-	}	
-	
+		//return sa.alert('当前账号暂无进入后台权限');
+	}
 	// 配置 
 	sa_admin.title = "智慧防疫后台";
-	sa_admin.logo = 'sa-frame/admin-logo.png';    // 设置logo图标地址 
-	sa_admin.icon = "sa-frame/admin-logo.png";    // 设置logo图标地址 
-	
-	
+	sa_admin.logo = 'sa-frame/admin-logo.png'; // 设置logo图标地址 
+	sa_admin.icon = "sa-frame/admin-logo.png"; // 设置logo图标地址 
+
+
 	// 当前用户信息 
 	sa_admin.user = {
 		username: res.data.admin.name,
 		avatar: res.data.admin.avatar || 'sa-frame/admin-logo.png' // 使用logo作为头像 
 		// avatar: res.data.admin.avatar // 此写法为账号头像 
-	};		
+	};
 	sa.$sys.setCurrUser(res.data.admin);
-	
-	
+
+
 	// 所有菜单
 	// var myMenuList = window.menuList;    // window.menuList 在 menu-list.js 中定义 
-	sa_admin.initMenu(res.data.perList);    // 初始化菜单   
-	sa.setAuth(res.data.perList);		// 当前用户权限码集合  
-	
+	sa_admin.initMenu(res.data.perList); // 初始化菜单   
+	sa.setAuth(res.data.perList); // 当前用户权限码集合  
+
 	// 配置信息 
 	sa.$sys.setAppCfg(res.appCfg);
-	
+
 	// 初始化模板(必须调用) 
-	sa_admin.init();	
-	
-}.bind(this), {msg: '正在加载登录信息', login_url: 'login.html'});
+	sa_admin.init();
+
+}.bind(this), {
+	msg: '正在加载登录信息',
+	login_url: 'login.html'
+});
 
 
 
 
 // ================================= 示例:设置登录后的头像处,下拉可以出现的选项  =================================
-sa_admin.dropList = [		// 头像点击处可操作的选项
+sa_admin.dropList = [ // 头像点击处可操作的选项
 	{
 		name: '我的资料',
 		click: function() {
 			sa.showIframe('我的资料', 'sa-view-sp/sp-admin/admin-info.html', '700px', '600px');
 		}
 	},
-    {
-        name: '修改名称',
-        click: function () {
-			layer.prompt({title: '请输入新名称'}, function(pass, index){
+	{
+		name: '修改名称',
+		click: function() {
+			layer.prompt({
+				title: '请输入新名称'
+			}, function(pass, index) {
 				layer.close(index);
-				sa.ajax('/admin/updateInfo', {name: pass}, function(res){
+				sa.ajax('/admin/updateInfo', {
+					name: pass
+				}, function(res) {
 					sa_admin.user.username = pass;
 					sa.ok2('修改成功');
 				});
 			});
-        }
+		}
 	},
-    {
-        name: '修改密码',
-        click: function () {
+	{
+		name: '修改密码',
+		click: function() {
 			sa.showIframe('修改密码', 'sa-view-sp/sp-admin/update-password.html', '550px', '350px');
-        }
+		}
 	},
-    {
-        name: '切换账号',
-        click: function () {
+	{
+		name: '切换账号',
+		click: function() {
 			// sa.showIframe('切换账号', 'login.html', '70%', '80%');
 			sa.$page.openLogin('login.html');
-        }
+		}
 	},
 	{
 		name: '退出登录',
@@ -91,7 +97,7 @@ sa_admin.dropList = [		// 头像点击处可操作的选项
 			layer.confirm('退出登录?', function() {
 				sa.ajax('/AccAdmin/doExit', function(res) {
 					layer.alert('注销成功', function() {
-						location.href="login.html";
+						location.href = "login.html";
 					})
 				})
 			});
@@ -141,8 +147,4 @@ sa_admin.closeRunAs = function() {
 
 // 注意:
 // 根据`iframe`的子父通信原则,在子页面中调用父页面的方法,需要加上parent前缀,例如:
-// parent.sa_admin.msg('啦啦啦');		// 调用父页面的弹窗方法 
-
-
-
-
+// parent.sa_admin.msg('啦啦啦');		// 调用父页面的弹窗方法

+ 4 - 11
sa-view-sp/sp-admin/admin-add.html

@@ -32,10 +32,10 @@
 					<span style="display: inline;">即登录账号</span>
 					<div class="c-item">
 						<label class="c-label"><span style="color: red;">*</span>所属组织:</label>
-						<el-select v-model="deptIds" multiple :disabled="currentUser.deptId!=='9999999'">
+						<el-select v-model="m.deptId">
 							<el-option label="请选择" v-for="(item,index) in deptList" :key="item.id" :label="item.name"
-								:value="item.id"></el-option>
-
+								:value="item.id">
+								</el-option>
 						</el-select>
 					</div>
 					<sa-item type="password" name="密码" v-model="m.password" br need></sa-item>
@@ -79,13 +79,7 @@
 							pageNo: 1,
 							pageSize: 100
 						}, function(resp) {
-							let list = resp.data;
-							let deptId = this.currentUser.deptId;
-							if (deptId != '9999999') {
-								//this.m.deptId = deptId;
-								this.deptIds = deptId.split(',');
-							}
-							this.deptList = list;
+							this.deptList = resp.data;
 						}.bind(this))
 					},
 
@@ -93,7 +87,6 @@
 					ok: function() {
 						// 表单校验 
 						let m = this.m;
-						m.deptId = this.deptIds.join(",");
 						sa.checkNull(m.nickname, '请输入姓名');
 						let phone = m.phone;
 						if (!sa.isPhone(phone)) {

+ 7 - 8
sa-view-sp/sp-admin/admin-list.html

@@ -61,10 +61,10 @@
 							<span v-else>{{s.row.name}}</span>
 						</template>
 					</sa-td>
-					<sa-td type="text" name="所属组织" prop="deptName" not='系统管理'></sa-td>
-					<sa-td type="text" name="所属角色" prop="roleName"></sa-td>
+					<sa-td type="text" name="所属组织" prop="deptName" not='-'></sa-td>
+					<sa-td type="text" name="所属角色" prop="roleName" not='-'></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="datetime" name="最后登录" prop="loginTime" width="150px" not='-'></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>
@@ -78,7 +78,7 @@
 									修改资料 <i class="el-icon-arrow-down el-icon--right"></i>
 								</el-button>
 								<el-dropdown-menu slot="dropdown">
-									<span @click="updateDept(s.row)" v-if="s.row.deptId!=9999999">
+									<span @click="updateDept(s.row)">
 										<el-dropdown-item>修改组织</el-dropdown-item>
 									</span>
 									<span @click="updateName(s.row)">
@@ -119,7 +119,7 @@
 			<el-dialog title="修改组织" :modal="false" :visible.sync="modal.visible" width="400px">
 				<div class="c-item">
 					<label class="c-label"><span style="color: red;">*</span>组织:</label>
-					<el-select v-model="modal.deptId" multiple>
+					<el-select v-model="modal.form.deptId">
 						<el-option label="请选择" v-for="(item,index) in deptList" :key="item.id" :label="item.name"
 							:value="item.id"></el-option>
 					</el-select>
@@ -150,7 +150,6 @@
 					deptList:[],
 					modal: {
 						visible:false,
-						deptId:[],
 						form: {
 							id: '',
 							deptId: ''
@@ -164,15 +163,15 @@
 					updateDept(data) {
 						Object.assign(this.modal,{
 							visible:true,
-							deptId:data.deptId.split(',').map(id=>parseInt(id)),
 							form:{
 								id:data.id,
+								deptId:data.deptId
 							}
 						})
 					},
 					sureFn(){
 						let data=this.modal.form;
-						let deptId=this.modal.deptId.join(',')
+						let deptId=data.deptId;
 						if(!deptId){
 							sa.error('请选择组织');
 							return;

+ 17 - 3
sa-view-sp/sp-cfg/server-cfg.html

@@ -94,15 +94,27 @@
 				<el-tabs class="s-tab" v-model="activeTab">
 					<!-- ---------------------------------- 系统参数 ---------------------------------- -->
 					<el-tab-pane label="参数设置" name="tab1">
-						<sa-item type="enum" name="备案审核" v-model="m.fillingJudge" :jv="{1: '人工审核', 2: '自动审核'}" jtype="1"
+						<sa-item type="enum" name="设备端备案" v-model="m.termianlFilling" :jv="{1: '允许', 0: '禁止'}" jtype="1"
 							br>
 						</sa-item>
+						<sa-item type="enum" name="行程卡限制" v-model="m.tourLimit" :jv="{1: '开启', 0: '关闭'}" jtype="1"
+							>
+						</sa-item><span>开启:近期去过中高风险区不予开闸;关闭:不限制</span>
+						<br />
+						<div class="c-item">
+							<label class="c-label">
+								核酸检测(小时内):</label>
+							<el-input-number step-strictly :step="24" class="item-num" v-model="m.acidLimit" :min="0" :max="72" size="mini">
+							</el-input-number>
+							<span style="margin-left: 10px;">0表示不限制</span>
+						</div>
+						<br/>
 						<div class="c-item">
 							<label class="c-label">
 								体温阈值(℃):</label>
 							<el-input-number class="item-num" v-model="m.minTemperature" :min="1" size="mini">
 							</el-input-number>
-							<span style="margin-left: 10px;">大于此阈值会触发报警</span>
+							<span style="margin-left: 10px;">大于此阈值不予开闸</span>
 						</div>
 						<sa-item type="enum" name="是否发送预警通知" v-model="m.sendAlarm" :jv="{1: '发送', 0: '不发送'}" jtype="1"
 							br>
@@ -126,8 +138,10 @@
 			// 创建一个默认的配置对象
 			function create_m() {
 				return {
-					fillingJudge: 1, // 预留信息 
+					termianlFilling:1,
 					minTemperature: 37.0,
+					tourLimit:1,
+					acidLimit:24,
 					sendAlarm: 1, // 新用户默认头像 
 				}
 			}

二进制
sa-view/monitor/error.png


+ 70 - 0
sa-view/monitor/tb-terminal-monitor.html

@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<el-button type="primary" icon="el-icon-refresh" @click="f5()">刷新</el-button>
+				</el-form>
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" style="margin-top: 5px;">
+					<sa-td name="序号" type="index"></sa-td>
+					<sa-td name="名称" prop="name" width="200"></sa-td>
+					<sa-td name="IP" prop="ip"></sa-td>
+					<sa-td name="类型" prop="type"></sa-td>
+					<sa-td name="方向" prop="direction" type="enum" :jv="{1: '入口', 2: '出口'}"></sa-td>
+					<sa-td name="状态" prop="state"></sa-td>
+					<sa-td name="最近一次通讯" prop="lastOnlineTime" width="160"></sa-td>
+					
+				</el-table>
+				
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						pageNo: 1, // 当前页 
+						pageSize: 10, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					f5: function() {
+						sa.ajax('/monitor/terminal', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight(); // 刷新表格高度 
+						}.bind(this));
+					},
+
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 4 - 0
sa-view/tb-dept/tb-dept-add.html

@@ -30,6 +30,8 @@
 						<sa-item type="text" name="负责人" v-model="m.chargePerson" br need></sa-item>
 						<sa-item type="text" name="联系号码" v-model="m.contact" br need></sa-item>
 						<sa-item type="enum" name="放行条件" v-model="m.passType" :jv="{1: '人车均备案', 2: '满足其一'}" jtype="3" br></sa-item>
+						<sa-item type="enum" name="管理组织" v-model="m.adminType" :jv="{0: '临时', 1: '普通组织', 2: '管理组织'}" jtype="3" br></sa-item>
+						<sa-item type="enum" name="备案审核" v-model="m.needJudge" :jv="{0: '系统审核', 1: '人工审核'}" jtype="3" br></sa-item>
 						<sa-item type="text" name="部门描述" v-model="m.deptDesc" br ></sa-item>
 						<sa-item type="textarea" name="备注" v-model="m.remark" br></sa-item>
 						<sa-item name="" class="s-ok" br>
@@ -65,6 +67,8 @@
 							desc: '',		// 描述 
 							chargePerson: '',		// 负责人 
 							passType:1,
+							adminType:0,
+							needJudge:1,
 							contact: '',		// 联系号码 
 							createTime: '',		// 创建时间 
 							createBy: '',		// 创建人 

+ 3 - 3
sa-view/tb-dept/tb-dept-list.html

@@ -35,15 +35,15 @@
 				<el-table class="data-table" ref="data-table" :data="dataList" >
 					<sa-td name="序号" type="index"></sa-td>
 					<sa-td name="名称" prop="name" ></sa-td>
-					<sa-td name="人数" prop="peopleNum" type="num" not='0'></sa-td>
+					<sa-td name="类型" prop="adminType" type="enum" :jv="{0: '临时', 1: '普通组织', 2: '管理组织'}"></sa-td>
+					<sa-td name="通行条件" prop="passType" type="enum" :jv="{1: '人车均备案', 2: '满足其一'}"></sa-td>
+					<sa-td name="备案审核" prop="needJudge" type="enum" :jv="{0: '自动审核', 1: '人工审核'}"></sa-td>
 					<sa-td name="部门描述" prop="deptDesc" ></sa-td>
 					<sa-td name="负责人" prop="chargePerson" ></sa-td>
 					<sa-td name="联系号码" prop="contact" ></sa-td>
 					<sa-td name="创建时间" prop="createTime" ></sa-td>
-					<sa-td name="备注" prop="remark" type="textarea"></sa-td>
 					<el-table-column label="操作" fixed="right"  width="240px">
 						<template slot-scope="s">
-							<el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看</el-button>
 							<el-button v-if="sa.isAuth('tb-dept-edit')" class="c-btn" type="primary" icon="el-icon-edit" @click="update(s.row)">修改</el-button>
 							<el-button v-if="sa.isAuth('tb-dept-del')" class="c-btn" type="danger" icon="el-icon-delete" @click="del(s.row)">删除</el-button>
 						</template>

+ 1 - 0
sa-view/tb-gate-terminal/tb-gate-terminal-list.html

@@ -34,6 +34,7 @@
 					<sa-td name="所在道闸" prop="venuesName" ></sa-td>
 					<sa-td name="方向" prop="direction" type="enum" :jv="{1: '入场', 2: '离场'}"></sa-td>
 					<sa-td name="IP地址" prop="ip" ></sa-td>
+					<sa-td name="状态" prop="state"></sa-td>
 					<el-table-column label="通讯">
 						<template slot-scope="s">
 							<el-button class="c-btn" @click="checkFn(s.row)">检测

+ 4 - 3
sa-view/tb-manager/tb-manager-list.html

@@ -24,12 +24,13 @@
 					<sa-item type="text" name="姓名" v-model="p.name"></sa-item>
 					<sa-item type="text" name="联系号码" v-model="p.phone"></sa-item>
 					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button type="primary" icon="el-icon-plus" @click="add" v-if="sa.isAuth('tb-manager-add')">
+						新增</el-button>
+					<el-button type="info" icon="el-icon-refresh" @click="f5">重置</el-button>
 					<br />
 				</el-form>
 				<!-- ------------- 快捷按钮 ------------- -->
-				<el-button type="primary" icon="el-icon-plus" @click="add" v-if="sa.isAuth('tb-manager-add')">
-					新增</el-button>
-				<el-button type="info" icon="el-icon-refresh" @click="f5">重置</el-button>
+				
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList">
 					<sa-td name="序号" type="index"></sa-td>

+ 1 - 0
sa-view/tb-person-filing/tb-person-filing-add.html

@@ -105,6 +105,7 @@
 							sa.error('请输入正确的身份证');
 							return false;
 						}
+							sa.checkNull(m.photo, '请上传 [人脸]');
 						m = sa.removeNull(m);
 						// 开始增加或修改
 						if (this.id <= 0) { // 添加

+ 1 - 1
sa-view/tb-person-visit-record/health-code-record-list.html

@@ -83,7 +83,7 @@
             <sa-td name="处置方法" prop="way"></sa-td>
             <el-table-column label="操作"  width="240px">
                 <template slot-scope="s">
-                    <el-button v-if="!s.row.isSolve" class="c-btn" type="primary"
+                    <el-button v-if="!s.row.isSolve&&s.row.healthStatus!='绿码'" class="c-btn" type="primary"
                                 @click="solveFn1(s.row.id)">处置
                     </el-button>
                     <el-button class="c-btn" type="success" icon="el-icon-view" @click="get(s.row)">查看

+ 1 - 1
sa-view/tb-person-visit-record/tb-person-visit-record-add.html

@@ -47,7 +47,7 @@
 									<sa-item type="text" name="联系号码" v-model="m.phone" br need></sa-item>
 									<div class="c-item">
 										<label class="c-label"><span style="color: red;">*</span>健康码:</label>
-										<el-select v-model="m.healthStatus" :disabled="currentUser.deptId!=='9999999'">
+										<el-select v-model="m.healthStatus">
 											<el-option label="请选择" v-for="(item,index) in healthList" :key="index"
 												:label="item" :value="item"></el-option>
 

+ 1 - 1
sa-view/tb-person-visit-record/tb-person-visit-record-list.html

@@ -62,7 +62,7 @@
 					<sa-td name="序号" type="index"></sa-td>
 					<sa-td name="组织" prop="deptName" width="120"></sa-td>
 					<sa-td name="姓名" prop="name"></sa-td>
-					<sa-td name="联系号码" prop="phone"></sa-td>
+					<sa-td name="联系号码" prop="phone" width="120"></sa-td>
 					<sa-td name="图片" prop="picture" type="img"></sa-td>
 					<sa-td name="场所/通道" prop="channel"></sa-td>
 					<sa-td name="出/入" prop="direction" type="enum" :jv="{1: '入场', 2: '离场'}"></sa-td>

+ 141 - 0
sa-view/tb-tactics/tb-tactics-list.html

@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>场所管理-列表</title>
+		<meta charset="utf-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css & js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+	</head>
+	<body>
+		<div class="vue-box" style="display: none;" :style="'display: block;'">
+			<div class="c-panel">
+				<!-- ------------- 检索参数 ------------- -->
+				<div class="c-title">检索参数</div>
+				<el-form ref="form" :model='p' @submit.native.prevent>
+					<sa-item type="text" name="场所名称" v-model="p.name"></sa-item>
+					<el-button type="primary" icon="el-icon-search" @click="p.pageNo = 1; f5()">查询</el-button>
+					<el-button type="info" icon="el-icon-refresh" @click="p.name='',f5()">重置</el-button>
+				</el-form>
+				<!-- ------------- 快捷按钮 ------------- -->
+
+				<!-- ------------- 数据列表 ------------- -->
+				<el-table class="data-table" ref="data-table" :data="dataList" row-key="id" border
+					@expand-change="sa.f5TableHeight()">
+					<sa-td name="序号" type="index"></sa-td>
+					<sa-td name="名称" prop="name"></sa-td>
+					<el-table-column label="类型" prop="type">
+						<template slot-scope="s">
+							<span v-if="s.row.type==1">人行道</span>
+							<span v-else-if="s.row.type==2">车行道</span>
+							<span v-else-if="s.row.type==3">场所</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="状态" prop="status">
+						<template slot-scope="s">
+							<span v-if="s.row.status==1">可通行</span>
+							<span v-else>关闭</span>
+						</template>
+					</el-table-column>
+					<sa-td name="更新时间" prop="updateTime"></sa-td>
+					<el-table-column label="操作" fixed="right" width="220px" v-if="sa.isAuth('tb-tactics-setting')">
+						<template slot-scope="s">
+							<el-button class="c-btn" type="danger" v-if="s.row.status==1"
+								icon="el-icon-edit" @click="shutdown(s.row)">关闭</el-button>
+							<el-button  class="c-btn" type="success" v-else
+								icon="el-icon-edit" @click="openFn(s.row)">开启</el-button>
+						
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- ------------- 分页 ------------- -->
+				<sa-item type="page" :curr.sync="p.pageNo" :size.sync="p.pageSize" :total="dataCount" @change="f5()"
+					:sizes="[1000]"></sa-item>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue'),
+					"sa-td": httpVueLoader('../../sa-frame/com/sa-td.vue'),
+				},
+				el: '.vue-box',
+				data: {
+					p: { // 查询参数  
+						id: '', //  
+						deptId: '', // 部门ID 
+						deptName: '', // 部门 
+						pId: '', // 父ID 
+						name: '', // 名称 
+						createTime: '', // 创建时间 
+						createBy: '', // 创建人 
+						updateTime: '', // 更新时间 
+						updateBy: '', // 更新人 
+						pageNo: 1, // 当前页 
+						pageSize: 10, // 页大小 
+						sortType: 0 // 排序方式 
+					},
+					dataCount: 0,
+					dataList: [], // 数据集合 
+				},
+				methods: {
+					shutdown(data){
+						sa.confirm('是否要关闭【'+data.name+'】通行功能', function() {
+							sa.ajax('/tactics/setting', {
+								id: data.id,status:0
+							}, function(res) {
+								this.f5();
+							}.bind(this))
+						}.bind(this));
+					},
+					openFn(data){
+						sa.confirm('是否要开启【'+data.name+'】通行功能', function() {
+							sa.ajax('/tactics/setting', {
+								id: data.id,status:1
+							}, function(res) {
+								this.f5();
+							}.bind(this))
+						}.bind(this));
+					},
+					// 刷新
+					f5: function() {
+						sa.ajax('/TbVenues/getTree', sa.removeNull(this.p), function(res) {
+							this.dataList = res.data; // 数据
+							this.dataCount = res.dataCount; // 数据总数 
+							sa.f5TableHeight(); // 刷新表格高度 
+						}.bind(this));
+					},
+					// 批量删除
+					deleteByIds: function() {
+						// 获取选中元素的id列表 
+						let selection = this.$refs['data-table'].selection;
+						let ids = sa.getArrayField(selection, 'id');
+						if (selection.length == 0) {
+							return sa.msg('请至少选择一条数据')
+						}
+						// 提交删除 
+						sa.confirm('是否批量删除选中数据?此操作不可撤销', function() {
+							sa.ajax('/TbVenues/deleteByIds', {
+								ids: ids.join(',')
+							}, function(res) {
+								this.f5();
+							}.bind(this))
+						}.bind(this));
+					},
+				},
+				created: function() {
+					this.f5();
+					sa.onInputEnter();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 126 - 0
sa-view/tb-tactics/tb-venues-add.html

@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>场所管理-添加/修改</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<style type="text/css">
+			.c-panel .el-form .c-label{width: 7em !important;}
+			.c-panel .el-form .el-input, .c-panel .el-form .el-textarea__inner{width: 250px;}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+                    <div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<sa-item type="text" name="场所名称" v-model="m.name" br need></sa-item>
+						<sa-item name="" class="s-ok" br>
+							<el-button type="primary" icon="el-icon-plus" @click="ok()">保存</el-button>
+						</sa-item>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+        <script>
+			
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					deptList:[],
+					currentUser: sa.$sys.getCurrUser(),
+					id: sa.p('id', 0),		// 获取超链接中的id参数(0=添加,非0=修改) 
+					m: null,		// 实体对象 
+				},
+				methods: {
+					getDeptList() {
+						sa.ajax('/TbDept/getList', {
+							pageNo: 1,
+							pageSize: 100
+						}, function(resp) {
+							let list = resp.data;
+							// let deptId = this.currentUser.deptId;
+							// if (deptId != '9999999') {
+							// 	this.m.deptId = deptId;
+							// }
+							this.deptList = list;
+						}.bind(this))
+					},
+					// 创建一个 默认Model 
+					createModel: function() {
+						return {
+							id: '',		//  
+							pId: sa.p('pId', '-1'),		// 父ID 
+							name: '',		// 名称 
+							type:3,
+							createTime: '',		// 创建时间 
+							createBy: '',		// 创建人 
+							updateTime: '',		// 更新时间 
+							updateBy: '',		// 更新人 
+						}
+					},
+					// 提交数据 
+					ok: function(){
+						// 表单校验 
+						let m = this.m;
+						sa.checkNull(m.name, '请输入 [名称]');
+						// 开始增加或修改
+						if(this.id <= 0) {	// 添加
+							sa.ajax('/TbVenues/add', m, function(res){
+								sa.alert('增加成功', this.clean); 
+							}.bind(this));
+						} else {	// 修改
+							sa.ajax('/TbVenues/update', m, function(res){
+								sa.alert('修改成功', this.clean);
+							}.bind(this));
+						}
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if(this.id == 0) {
+							this.m = this.createModel();
+						} else {
+							parent.app.f5();		// 刷新父页面列表
+							sa.closeCurrIframe();	// 关闭本页 
+						}
+					}
+				},
+				mounted: function(){
+					this.getDeptList();
+					// 初始化数据 
+					if(this.id <= 0) {	
+						this.m = this.createModel();
+					} else {	
+						sa.ajax('/TbVenues/getById?id=' + this.id, function(res) {
+							this.m = res.data;
+							if(res.data == null) {
+								sa.alert('未能查找到 id=' + this.id + " 详细数据");
+							}
+						}.bind(this))
+					}
+				}
+			})
+			
+		</script>
+	</body>
+</html>

+ 11 - 1
sa-view/tb-terminal/tb-terminal-list.html

@@ -43,7 +43,7 @@
 					<sa-td name="人员数" prop="personNum"></sa-td>
 					<sa-td name="通道名称" prop="channelName"></sa-td>
 					<sa-td name="创建时间" prop="createTime" width="160"></sa-td>
-					<el-table-column label="操作" fixed="right" width="360px">
+					<el-table-column label="操作" fixed="right" width="420px">
 						<template slot-scope="s">
 							<el-button v-if="sa.isAuth('tb-terminal-edit')" class="c-btn" type="primary"
 								 @click="update(s.row)">修改
@@ -57,6 +57,9 @@
 							<el-button v-if="sa.isAuth('tb-terminal-sync-time')" class="c-btn" type="primary"
 								 @click="sync(s.row)">时钟同步
 							</el-button>
+							<el-button v-if="sa.isAuth('tb-terminal-down')" class="c-btn" type="primary"
+								 @click="down(s.row)">下发数据
+							</el-button>
 							<el-button v-if="sa.isAuth('tb-terminal-clear')" class="c-btn" type="danger"
 								 @click="clear(s.row)">清除
 							</el-button>
@@ -98,6 +101,13 @@
 							sa.ok('命令已下发');
 						}.bind(this))
 					},
+					down(data){
+						sa.confirm('是否确定下发数据?', function() {
+							sa.ajax('/TbTerminal/down?id=' + data.id, function(res) {
+								sa.ok('命令已下发');
+							}.bind(this))
+						}.bind(this));
+					},
 					open(data) {
 						sa.confirm('是否确定远程开门?', function() {
 							sa.ajax('/TbTerminal/open?id=' + data.id, function(res) {

+ 3 - 3
static/sa.js

@@ -8,17 +8,17 @@ var sa = {
 (function(){
 	// 公司开发环境
 	var cfg_dev = {
-		api_url: 'http://127.0.0.1:8099',	// 所有ajax请求接口父地址
+		api_url: 'http://192.168.3.27:8099/pro',	// 所有ajax请求接口父地址
 		web_url: 'http://www.baidu.com'		// 此项目前台地址 (此配置项非必须)
 	}
 	// 服务器测试环境
 	var cfg_test = {
-		api_url: 'http://demo-jj.dev33.cn/spdj-server',
+		api_url: 'http://face.aseanbusiness.cn/pro',
 		web_url: 'http://www.baidu.com'
 	}
 	// 正式生产环境
 	var cfg_prod = {
-		api_url: 'http://www.baidu.com',
+		api_url: 'http://10.3.2.193:9898/pro',
 		web_url: 'http://www.baidu.com'
 	}
 	sa.cfg = cfg_dev; // 最终环境 , 上线前请选择正确的环境