2 İşlemeler d98ba64e30 ... b0509c8fdc

Yazar SHA1 Mesaj Tarih
  apple b0509c8fdc Merge branch 'master' of http://47.107.29.61:3000/Yezb/ss_new_ui_skin_and_page 2 gün önce
  apple b2308eb343 feat:修改首页左侧栏图标,前端写死、修复人员查看页回显异常 2 gün önce

+ 630 - 0
home.jsp

@@ -0,0 +1,630 @@
+<%@ page import="ss.WebC" %>
+<%@ page import="ss.serv.ServC" %>
+<%@ page language="java" pageEncoding="UTF-8" isELIgnored="false" %>
+<%@ taglib uri="/ssTag" prefix="ss"%>
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+	<script>window.loginStatus="${empty sessionScope['ssUser']?'0':'1'}"</script>
+	<ss:skin file='main.css'/>
+	<script type="text/javascript" src="/ss/jquery/jquery.js"></script>
+	<script type="text/javascript" src="/ss/artdialog/artDialogUtil.js"></script>
+	<script type="text/javascript" src="/ss/js/base.js"></script>
+	<script> if(!window.wd) var wd={}; if(!wd.display) wd.display={}; wd.display.wdDialogId="1"; if(!wd.app) wd.app={};  wd.app.name='pms';</script>
+	<script type="text/javascript" src="/ss/js/masklayer.js"></script>
+	<script type="text/javascript" src="/ss/js/wdDialogInit.js"></script>
+	<script type="text/javascript" src="/ss/js/common.js"></script>
+	<script type="text/javascript" src="/ss/js/display.js"></script>
+	<script type="text/javascript" src="/ss/js/edit.js"></script>
+	<script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.js"></script>
+	<script type="text/javascript" src="/ss/nicescroll/jquery.nicescroll.iframehelper.min.js"></script>
+	<link rel="stylesheet" type="text/css" href="/ss/window/theme/dhtmlxwindows.css">
+	<link rel="stylesheet" type="text/css" href="/ss/window/theme/dhx_blue/dhtmlxwindows_dhx_blue.css">
+	<script type="text/javascript" src="/ss/window/dhtmlxcommon.js"></script>
+	<script type="text/javascript" src="/ss/window/dhtmlxwindows.js"></script>
+	<script type="text/javascript" src="/ss/window/dhtmlxcontainer.js"></script>
+
+		<%
+		if(pageContext.getSession().getAttribute("ssUser")==null){
+	/* 再改,去掉 loginExp.ss.jsp(写死错误信息),改用 relogin.ss.jsp。Lin
+			request.getRequestDispatcher(WebC.PPATH_loginExp).forward(request,response);
+	*/
+			request.setAttribute(ServC.REQ_msg, WebC.LOGIN_expMsg);
+			request.getRequestDispatcher(WebC.PPATH_relogin).forward(request,response);
+
+			return;
+		}
+	%>
+
+	<title>${sessionScope.projectUrlDesc}</title>
+
+	<link rel="stylesheet" type="text/css" href="/ss/window/theme/dhtmlxwindows.css">
+	<script type="text/javascript" src="/ss/window/dhtmlxcommon.js"></script>
+<%-- 去掉,上面已经有了。Lin(新UI)
+	<script type="text/javascript" src="/ss/window/dhtmlxwindows.js"></script>
+--%>
+	<script type="text/javascript" src="/ss/window/dhtmlxcontainer.js"></script>
+	<script type="text/javascript" src="/ss/js/wdDialogInit.js"></script>
+	<ss:skin file='dlg.css'/>
+	<script type="text/javascript" src="/js/load.js"></script> <%-- ="/newUI/ss/js/base.js"。Lin(新UI) --%>
+
+  </head>
+
+  <body>
+
+  <!-- menu标签输出start -->
+<%--   <ss:menu/>--%>
+  <!-- menu标签输出end -->
+
+    <div id="app" >
+		<div class="self-block layout-container" :sys-mode="sysMode" v-show="isLockScreen==false">
+        <div class="header">
+			<global-header :menu-data="menuData[8]" :icon-items="iconItems"></global-header>
+        </div>
+        <div class="content-area">
+		  <global-menu :menu-items="menuData[1]"></global-menu>
+          
+          <div class="main-content">
+            <iframe
+              :src="currentPage"
+              frameborder="0"
+              
+			  ifrType="appWin"
+			  name="win2"
+			  class="appIframe"
+			  oriSrc="/initDesktop?"
+            ></iframe>
+          </div>
+        </div>
+      	</div>
+		<div class="login-container lockscreen-container" style="background-image: url(/skin/easy/images/login-bg.png)" <%-- (/newUI/skin/easy/images/login-bg.png)。Lin(新UI) --%>
+				 v-show="isLockScreen == true" @click.self="toggleRight">
+			<div class="left" @click.self="toggleRight"></div>
+			<div  class="right" :class="{ 'right--visible': isRightVisible }"
+		@click="resetTimer"
+		@mousemove="resetTimer">
+			<div class="content-area">
+				<div class="login-box">
+					<ss-login-icon class="login-icon-change-user" onclick="wd.display.exit({homepage:1})"></ss-login-icon>
+					<div class="box-header">
+						<img :src="defaultPersonalPhoto" style="margin-bottom: 15px;" />
+						<p>您好,${sessionScope['ssUser'].xm} 欢迎回来</p>
+					</div>
+					<div>
+						
+					</div>
+					<div class="box-container">
+						<form class="box-form">
+							
+							<div class="form-item">
+								<div class="icon">
+									<ss-login-icon class="login-icon-password"  />
+								</div>
+								<ss-login-input type="password" v-model="formData.password"
+									placeholder="请输入您的密码" />
+							</div>
+
+							
+							<div class="form-bar">
+								<span><ss-login-button class="login-icon-yaoyiyao" text="摇一摇登录" type="button"
+										@click="handleClick" /></span>
+								<span><ss-login-button class="login-icon-loginin" text="登录" type="button"
+										@click="unlockSessionByPassword" /></span>
+							</div>
+						</form>
+						<!-- 错误提示 -->
+						<div v-if="errInfo.status" class="err-tip">
+							<div class="time">
+								<div v-for="i in errInfo.allTime" :key="i"
+									:class="{ fill: errInfo.allTime - i < errInfo.time }"></div>
+							</div>
+							<div class="tip">{{ errInfo.tip }}</div>
+						</div>
+					</div>
+					<div class="box-footer">
+						<div class="left"></div>
+						
+					</div>
+				</div>
+			</div>
+			<div class="footer">
+				<div>服务单位:广州非繁科技有限公司</div>
+			</div>
+			
+		</div>
+	</div>
+     
+    </div>
+	<script type="text/javascript" src="/js/lockScreen.js"></script> <%-- ="/newUI/ss/js/lockScreen.js"。Lin(新UI) --%>
+<%-- 去掉。Lin(新UI)
+		 用新UI的 lockScreen.js(注意大小写)
+		 先不去掉
+--%>
+	<script type="text/javascript" src="/ss/js/lockscreen.js"></script>
+
+	<ss:skin file='lock.css'/>
+			<script>
+				var body = $(window.top.document.body);
+				// $(top.document.head).append('');
+				var funcStr = " if($('#mm').attr('type') == 'password') {$('#mm').attr('type','text')} else {$('#mm').attr('type','password')}";
+				var defaultPersonalPhoto=wd.common.loadSkinFile('image/default-personalPhoto.png');
+
+				<ss:equal val='${empty sessionScope["ssUser"]["yszwj"]}' val2='false'>
+<%-- 改。Lin
+					defaultPersonalPhoto="/service?wdService=getData&path=${sessionScope['env.ry']['yszwj']}"; --%>
+					<%--defaultPersonalPhoto="/service?wdService=dlByHttp&path=${sessionScope['wd.yyh']['yszwj']}";--%>
+				defaultPersonalPhoto="/service?ssServ=dlByHttp&type=img&path=${sessionScope['ssOrigUser']['yszwj']}";
+				</ss:equal>
+
+				body.append('<div class="lock-controll-screen" style="display:none;">'+
+						'<div id="lock-screen" class="lock-screen login-js-lock-screen" style="background-color: rgb(0, 0, 0);">'+
+						'<div class="lock-controll-panel login-translucentDiv" style="position:relative;">'+
+						'<div class="login-sca" ></div>'+
+						'<div class="login-black icon-replace" title="切换登录" style="width: 22px;height: 22px;margin-right: 5px;margin-top: 5px;cursor:pointer;position:absolute;top:0;right:0;" onclick="wd.display.exit({homepage:1})"></div>'+
+						'<div class="welcomeWords" style="padding: 4px 24px;border-radius: 20px;text-align: center;"><div class="personalPhoto" style="margin-left: 98px;margin-bottom: 15px;"><img src="'+defaultPersonalPhoto+'" /></div><p class="login-unlockHello">您好,&nbsp;<input id="zh" name="zh" type="hidden" value="${sessionScope['ssUser'].xm}"></input>${sessionScope['ssUser'].xm}&nbsp;欢迎回来</p><p>&nbsp;</p></div>'+
+						'<p class="lock-controll-input clearfix" ><input  id="mm" name="mm" style="background:none !important;" class="login-header_password_sp login-input login-unlockInput" type="password" /><span class="ksmm icon-eye" onclick="'+funcStr+'"></span><button style="background-size:unset;" id="unlockByPassword" class="lock-controll-button icon-enter content-invertButton"></button><button id="unlockByApp" class="lock-controll-button content-invertButton invertIcon-mobile"></button><span class="icon-countdownButton" style="position: absolute;top: 0px;width: 45px;border-radius: 3px;right: -94px;line-height: 30px;text-align: center;"></span></p>'+
+						'<p class="lock-controll-hint"><span style="text-align: center;display: block;font-size: 14px;margin-top: 10px;color: #f00;" id="lock-msg"></span></p>'+
+						'<p class="lock-controll-button-container" style="display: flex;align-items: center;justify-content: space-between;"><button id="unlockByVoice" style="display:none" class="lock-controll-button login-jslock-button login-unlockByVoice">按住说话</button></p>'+
+						'</div>'+
+						'</div>'+
+						'<div class="home-clock desktop-time">12:12</div>'+
+						'</div>');
+				
+				body.append('<div id="background-desktop" class="background-desktop" style="display:none;"></div>');
+				body.append('<ul class="home-tool desktop-time clearfix" style="display:none">' +
+						'<li id="pl-list"><div class="pl-list-container"><div class="pl-list"></div><div id="pl-page" class="pl-page"></div></div><a href="#" class="icon-forum listIcon"></a></li>' +
+						'<li id="dz-count"><div class="dz-count" id="dz-count"><div id="dz-count-text" class="login-dz-count-text"></div></div><a href="#" class="icon-like listIcon"></a></li>' +
+						'<li id="pic-info"><div class="pic-info login-pic-info"><table><tr><th>作者</th><td id="pic-zz-text"></td></tr><tr><th>发布时间</th><td id="pic-fbsj-text"></td></tr><tr><th>名称</th><td id="pic-mc-text"></td></tr></table></div><a href="#" class="icon-info listIcon"></a></li>' +
+						'</ul>');
+
+				/** 锁屏监听处理开始 **/
+				var lockScreenData = {
+					url1: '<ss:serv name='wd.lockSession' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					url2: '<ss:serv name='wd.checkIsUnlockedByApp' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					url3: '<ss:serv name='unlockByPwd' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					url4: '<ss:serv name='loadDeskImg' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					url5: '<ss:serv name='pl_cxajax' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					url6: 'wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='pl_cx' parm='{"wdConfirmationCaptchaService":"0"}' dest='pl_cx'/>",title:"pl_cx",width:650,height:555});',
+					url7: '<ss:serv name='nr_dz' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					url8: '<ss:serv name='wrLockStat' parm='{"wdConfirmationCaptchaService":"0"}'/>'
+				};
+				// 将锁屏需要的东西放进sessionStorage里
+				sessionStorage.setItem("lockScreenData",JSON.stringify(lockScreenData));
+				// 获取sessionStorage里用户设置的锁屏时间
+				var time = sessionStorage.getItem("lockTime");
+				//var time = 2;
+				console.log("用户设置的锁屏时间",time)
+				if(!time){
+					time = 15;
+				}
+				// 实例化锁屏方法,time分钟后锁屏
+				// var lock = new LockScreen($(top.document).find('.lock-controll-screen'),$(top.document).find('#home-background'),$(top.document).find('.home-tool'),time,lockScreenData);
+				
+				// 键盘按下重新设置锁屏
+				// $(document).keydown(function(event){
+				// 	// time分钟后重新锁屏
+				// 	lock.setupAutoLock(time);
+				// });
+				// 鼠标移动重新设置锁屏
+				// document.onmousemove = function() {
+				// 	// time分钟后重新锁屏
+				// 	lock.setupAutoLock(time);
+				// }
+				/** 锁屏监听处理结束 **/
+
+				function lockScreenFun(){
+					console.log("锁屏点击了2");
+					wd.display.beaconLogin("loginOut");
+					$(top.document).find('#background-desktop').css('display','block');
+					$.ajax({
+						type: 'POST',
+						url: '<ss:serv name='wrLockStat' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+						data: {},
+						async: false,
+						success: function (data) {
+							console.log("成功锁屏");
+							lock.lockSession(time);
+						},
+					});
+				}
+				wd.topWindow.lockScreen=function(){
+					$('#lock').trigger("click");
+				}
+
+				var passwordeye = $('.login-eyeIcon');
+				var showPwd = $(".login-unlockInput");
+				passwordeye.on('click', function() {
+					console.log(1111111111111);
+					if(showPwd.prop('type') == 'text') {
+						showPwd.prop('type', 'password');
+					} else {
+						showPwd.prop('type', 'text');
+					};
+				});
+
+				var kscs =parseInt('<%=base.SsC.LOGIN_maxNum %>');
+				var cwcs = 0;
+				var cs="";
+				for(let i = 1;i<=kscs;i++){
+					if(i>cwcs){
+						cs += '<span class="login-sc login-used login-unused" style="display:none;width: 8px;height: 8px;border-radius: 50%;float: left;margin-right: 5px;" time="'+i+'"></span>';
+					}else{
+						cs += '<span class="login-sc login-used login-used" style="display:none;width: 8px;height: 8px;border-radius: 50%;float: left;margin-right: 5px;" time="'+i+'"></span>';
+					}
+				}
+
+				$(".login-sca").append(cs);
+
+				console.log("出去了");
+
+				
+
+				function goToIndex() {
+						delCookie("userId");
+						var sbbs = $("input[name='sbbs']").val();
+						var ysbbs = $("input[name='ysbbs']").val();
+						window.location.href = "/index?homepage=1&sbbs=" + sbbs+"&ysbbs=" + ysbbs;
+				}
+				function getCookie(name){
+					var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
+					if(arr=document.cookie.match(reg))
+						return unescape(arr[2]);
+					else
+						return null;
+				}
+				function delCookie(name){
+					var exp = new Date();
+					exp.setTime(exp.getTime() - 1);
+					var cval=getCookie(name);
+					if(cval!=null)
+						document.cookie= name + "="+cval+";expires="+exp.toGMTString();
+				}
+			</script>
+			
+    <script type="module">
+	
+      import { eventBus, EVEN_VAR } from "/js/vue/EventBus.js"; <%-- "/newUI/ss/js/EventBus.js"。Lin(新UI) --%>
+      SS.ready(function() {
+        if (!window.sharedEventBus) {
+          window.sharedEventBus = eventBus;
+        }
+        
+        const sysMode = {
+          read: {
+            key: "read",
+            icon: "setting",
+          },
+          edit: {
+            key: "edit",
+            icon: "check",
+          },
+        };
+		const currentMode = Vue.ref(sysMode.read.key);
+        const toggoleSysMode = function (key) {
+            let newKey = sysMode.edit.key;
+            if (currentMode.value === sysMode.edit.key) {
+                newKey = sysMode.read.key;
+				// SYBJCTRL.saveedit(SESSION_STATE); //保存编辑模式
+            }else{
+				wd.topWindow.gxhymWindow.userEdit('gr');
+				// wd.topWindow.gxhymWindow.userEdit("gf"); //打开编辑模式
+			}
+            // 设置系统模式
+            currentMode.value = newKey;
+            eventBus.publish(EVEN_VAR.systemEditModelChange, newKey);
+        }
+        // 调用组件中的初始化方法
+        window.SS.dom.initializeFormApp({
+          el: "#app",
+          data() {
+            return {
+				lockTime: sessionStorage.getItem("lockTime") || 15,
+				isLockScreen: ${!empty sessionScope.isLockScreen},
+				isRightVisible: false,
+				hideTimer: null,
+				defaultPersonalPhoto: "",
+				errInfo: {
+					status: false,
+					time: 5,
+					allTime: 5,
+					tip: "",
+				},
+				formData: {
+					password: "",
+
+				},
+              sysMode: sysMode.read.key,
+              currentPage: "/initDesktop?",
+              menuData: {
+				"8": //系统菜单(左上角LOGO下拉出来的菜单)
+				[],
+				"1"://侧方菜单(主菜单)
+				[{
+					desc: "首页",
+					icon: "nav-icon-home",
+					pid:"00001",
+					type:"2",
+					url:'/initDesktop?'
+				}]
+              },
+			  iconItems: [
+			 	{ name: 'question', size: '22px', class: 'header-help', action: () => wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='querySYSHelp' parm='{"wdConfirmationCaptchaService":"0","ishelp":"true","dialogid":"1"}' dest='cmsPlay'/>",title:"使用指南",width:900,height:800,minHeight:1,maxHeight:800}) },
+				{ name: 'check', size: '22px',class: 'header-save', condition: () => currentMode.value === sysMode.edit.key, action: () => toggoleSysMode()},
+				{ name: 'setting-fill', size: '22px', class: 'header-setting',condition: () => currentMode.value !== sysMode.edit.key, action: () => toggoleSysMode() },
+				{ name: 'list-fill', size: '22px', class: 'header-menu', action: () => console.log('list-fill clicked') },
+				{ name: 'topic-fill', size: '22px', class: 'header-skin', action: () => wd.display.showComponent({show:["wdDialog"],url:"<ss:serv name='gxhpf_cx' parm='{"wdConfirmationCaptchaService":"0"}' dest='ty_hf'/>",title:"换肤",width:799,height:757}) },
+				{ name: 'lock-fill', size: '22px', class: 'header-lock', action: () => this.lockScreenFun() },
+				{ name: 'quit', class: 'big', size: '36px', class: 'header-logout', action: () => wd.display.exit() },
+			  ],
+            };
+          },
+          methods: {
+			setupAutoLock() {
+              if(this.autoLockTimer) {
+                clearTimeout(this.autoLockTimer);
+              }
+              this.autoLockTimer = setTimeout(() => {
+				console.log('自动锁屏');
+                this.lockScreenFun();
+              }, this.lockTime * 60 * 1000);
+            },
+            // 编辑模式变化
+            sysEditModelChange(mode) {
+              this.sysMode = mode;
+            },
+            currentPageChange(page) {
+              this.currentPage = "./" + page;
+            }, 
+			showErrorMsg(msg,sydlcs,zcs){
+				console.log(msg,sydlcs,zcs);
+				var kscs = zcs;
+				var cs = '';
+				// for (let i = 1; i <= kscs; i++) {
+				// 	if (i <= (zcs - sydlcs)) {
+				// 		cs = '<span class="login-sc login-used login-used" style="width: 8px;height: 8px;display:block;border-radius: 50%;float: left;margin-right: 5px;" time="' + i + '"></span>';
+				// 	} else {
+				// 		cs = '<span class="login-sc login-used login-unused" style="width: 8px;height: 8px;display: block;border-radius: 50%;float: left;margin-right: 5px;" time="' + i + '"></span>';
+				// 	}
+				// 	console.log(cs);
+					
+				// }
+				this.errInfo.time = sydlcs;
+				this.errInfo.allTime = zcs;
+				this.errInfo.tip = msg;
+				this.errInfo.status = true;
+
+				if (sydlcs == zcs) {
+					this.errInfo.status = false;
+				}
+
+				if (0 >= sydlcs) {
+					this.errInfo.status = true;
+					this.errInfo.time = 0;
+					this.errInfo.allTime = 5;
+					this.errInfo.tip = msg;
+					return false;
+				} else {
+					this.errInfo.status = true;
+					this.errInfo.tip = msg;
+				}
+			},
+			lockScreenFun(){
+				console.log("锁屏点击了1");
+				this.isLockScreen = true;
+				$("#app").css("position", "relative");
+				wd.display.beaconLogin("loginOut");
+				$.ajax({
+					type: 'POST',
+					url: '<ss:serv name='wrLockStat' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					data: {},
+					async: false,
+					success: function (data) {
+						console.log("成功锁屏");
+						// lock.lockSession(time);
+					},
+				});
+			},
+			unlockSessionByPassword(){
+				console.log("解锁");
+				$("#app").css("position", "");
+				var mm=this.formData.password;
+				if(!mm){
+					this.errInfo.status = true;
+					this.errInfo.tip = "请输入密码";
+					this.errInfo.time = 5;
+					return;
+				}
+				var that = this;
+				$.ajax({
+					url: '<ss:serv name='unlockByPwd' parm='{"wdConfirmationCaptchaService":"0"}'/>',
+					dataType: 'json',
+					type: 'POST',
+					data: {
+						mm: mm,
+					},
+					success: function(data) {
+						// context.target.find('#lock-msg').html(data.msg);
+						if (data.code == -1) {
+							that.showErrorMsg(data.msg, data.sydlcs, data.zcs);
+						}
+						if (data.code == 0) {
+							that.isLockScreen = false;
+							that.formData.password = "";
+							that.errInfo.status = false;
+							that.errInfo.time = 5;
+							that.errInfo.allTime = 5;
+						}
+					},
+				});
+			},
+			changeUser(){
+				console.log('Button clicked!', event);
+			},
+			toggleRight() {
+				this.isRightVisible = !this.isRightVisible;
+				
+				// 清除之前的定时器
+				if (this.hideTimer) {
+					clearTimeout(this.hideTimer);
+				}
+				
+				// 设置新的定时器
+				if (this.isRightVisible) {
+					this.hideTimer = setTimeout(() => {
+					this.isRightVisible = false;
+					}, 10000);
+				}
+			},
+			// 当用户在右侧区域操作时,重置定时器
+			resetTimer() {
+				if (this.hideTimer) {
+					clearTimeout(this.hideTimer);
+				}
+				this.hideTimer = setTimeout(() => {
+					this.isRightVisible = false;
+				}, 10000);
+			}
+          },
+          mounted() {
+			// console.log(window.SS)
+			console.log(window.top.SS)
+
+  			window.top.SS.lockScreenService.init(this);
+            eventBus.subscribe(EVEN_VAR.systemEditModelChange,this.sysEditModelChange);
+            eventBus.subscribe(EVEN_VAR.currentPage, this.currentPageChange);
+			// 监听锁屏
+			// 设置键盘和鼠标事件监听
+			document.addEventListener('keydown', () => {
+              this.setupAutoLock();
+            });
+            
+            document.addEventListener('mousemove', () => {
+              this.setupAutoLock();
+            });
+			this.setupAutoLock();
+
+			<ss:equal val='${empty sessionScope.isLockScreen}' val2='false'>
+				this.lockScreenFun();
+			</ss:equal>
+			this.defaultPersonalPhoto = wd.common.loadSkinFile('image/default-personalPhoto.png');
+			// 如果用户有自定义头像,则使用自定义头像
+			<ss:equal val='${empty sessionScope["ssUser"]["yszwj"]}' val2='false'>
+				<%-- 改。Lin
+				defaultPersonalPhoto="/service?wdService=getData&path=${sessionScope['env.ry']['yszwj']}"; --%>
+				<%--this.defaultPersonalPhoto="/service?wdService=dlByHttp&path=${sessionScope['wd.yyh']['yszwj']}";--%>
+			  this.defaultPersonalPhoto="/service?ssServ=dlByHttp&type=img&path=${sessionScope['ssOrigUser']['yszwj']}";
+			</ss:equal>
+
+			const that = this;
+
+			$.ajax({
+				type: 'POST',
+				
+				url: '<ss:serv name='wrMenuList'/>',
+				async: false,
+				dataType: 'json',
+				success: function (data) {
+					// alert('菜单数据:'+JSON.stringify(data));
+					that.menuData = data;
+
+
+
+					<%-- 测试新UI临时写死 start --%>
+
+					// that.menuData["1"].unshift({
+					// 	desc: "单位",
+					// 	icon: "nav-icon-home",
+					// 	pid:"00001",
+					// 	type:"2",
+					// 	url:'<ss:serv name='dw_cx' dest='objList_bk' parm='{}'/>'
+					// });
+
+					// that.menuData["1"].unshift({
+					// 	desc: "在用单位-部门",
+					// 	icon: "nav-icon-home",
+					// 	pid:"00001",
+					// 	type:"2",
+					// 	url:'<ss:serv name='bm_cx' dest='1objList' parm='{dwid:"101122",ssObjId:"101122",ssObjName:"dw",dataType:"change",ParentViewObject:"dw"}'/>'
+					// });
+
+					// that.menuData["1"].unshift({
+					// 	desc: "人员",
+					// 	icon: "nav-icon-person",
+					// 	pid:"00001",
+					// 	type:"2",
+					// 	url:'<ss:serv name='ry_cx' dest='1ryList' parm='{}'/>'
+					// });
+					<%-- 测试新UI临时写死 end --%>
+
+					that.menuData["1"].unshift({
+						desc: "首页",
+						icon: "icon-shouye",  // v3.0 改为使用新图标库 by xu 20251215
+						pid:"00001",
+						type:"2",
+						url:'/initDesktop?'
+					});
+
+					// v3.0 设置菜单图标 - 使用业务图标库 by xu 20251215
+					that.menuData["1"].forEach(item => {
+						// 一级菜单(文件夹类型)- 有同名二级菜单的用同样图标
+						if(item.id === "1021775") item.icon = "icon-obj-ry";     // 人员
+						if(item.id === "1021812") item.icon = "icon-obj-xy";     // 学员
+						if(item.id === "1021809") item.icon = "icon-biz-grxf";   // 个人消费
+						if(item.id === "1021783") item.icon = "icon-biz-men";    // 门
+						if(item.id === "1021806") item.icon = "icon-caipin";     // 菜品
+						if(item.id === "1021786") item.icon = "icon-biz-rc";     // 日程
+						if(item.id === "1021789") item.icon = "icon-biz-xc";     // 巡查
+						if(item.id === "1021793") item.icon = "icon-biz-kq";     // 考勤
+						if(item.id === "1021795") item.icon = "icon-biz-wp";     // 物品
+						if(item.id === "1021804") item.icon = "icon-biz-cl";     // 车辆
+						// 评价(1021780)、场地(1021800) 暂无图标,使用默认文件夹图标
+
+						// 二级菜单使用对象图标
+						if(item.id === "ry_search") item.icon = "icon-obj-ry";   // 人员
+						if(item.id === "gw_search") item.icon = "icon-obj-gw";   // 岗位
+						if(item.id === "qz_search") item.icon = "icon-obj-qz";   // 群组
+						if(item.id === "dw_search") item.icon = "icon-obj-dw";   // 单位
+						if(item.id === "xy_search") item.icon = "icon-obj-xy";   // 学员
+						if(item.id === "grcz_search") item.icon = "icon-obj-grcz"; // 个人充值
+						if(item.id === "xfj_search") item.icon = "icon-obj-xfj";   // 消费机
+						if(item.id === "jcjl_search") item.icon = "icon-obj-jcjl"; // 进出记录
+						if(item.id === "mjd_search") item.icon = "icon-obj-mjd";   // 门禁点
+						if(item.id === "mtcp_search") item.icon = "icon-mingricaipin"; // 明天菜品
+						if(item.id === "cp_search") item.icon = "icon-caipin";     // 菜品
+						if(item.id === "rc_search") item.icon = "icon-biz-rc";     // 日程
+						if(item.id === "rcjh_search") item.icon = "icon-obj-rcjh"; // 日程计划
+						if(item.id === "xcdjl_search") item.icon = "icon-obj-xcjl"; // 巡查记录
+						if(item.id === "xcd_search") item.icon = "icon-obj-xcd";   // 巡查点
+						if(item.id === "kqjl_search") item.icon = "icon-obj-kqjl"; // 考勤记录
+						if(item.id === "wp_search") item.icon = "icon-biz-wp";     // 物品
+						if(item.id === "cl_search") item.icon = "icon-biz-cl";     // 车辆
+						if(item.id === "cd_search") item.icon = "icon-biz-cd";     // 场地
+					});
+				},
+			});
+
+			// 初始化菜单模式为收起(设置CSS变量)
+			const layoutContainer = document.querySelector('.layout-container');
+			if (layoutContainer) {
+				layoutContainer.style.setProperty('--left-side-width', '60px');
+			}
+          },
+          unmounted() {
+			// 清理定时器和事件监听
+            if(this.autoLockTimer) {
+              clearTimeout(this.autoLockTimer);
+            }
+            document.removeEventListener('keydown', this.setupAutoLock);
+            document.removeEventListener('mousemove', this.setupAutoLock);
+            eventBus.clear(
+              EVEN_VAR.systemEditModelChange,
+              this.sysEditModelChange
+            );
+          },
+        });
+    });
+    </script>
+  </body>
+</html>

+ 6 - 6
js/vue/ss-components.js

@@ -2488,9 +2488,9 @@ import { EVEN_VAR } from "./EventBus.js";
   // v1.0 用法: <ss-icon name="setting" size="20px" />
   const SsIcon = {
     name: "SsIcon",
+    // v3.0 禁用 class 透传,手动处理 by xu 20251215
+    inheritAttrs: false,
     props: {
-      // v3.0: class 属性(图标类 + 组类)
-      class: { type: String },
       // v1.0: 以下为旧属性
       name: { type: String },
       size: { type: [Number, String], default: 16 },
@@ -2505,10 +2505,10 @@ import { EVEN_VAR } from "./EventBus.js";
       },
     },
     emits: ["update:modelValue", "input", "blur", "change"],
-    setup(props, { emit }) {
-      // v3.0 分支:有 class 属性时直接渲染 by xu 20251212
-      if (props.class) {
-        return () => h("i", { class: props.class });
+    setup(props, { emit, attrs }) {
+      // v3.0 分支:有 class 属性时直接渲染(从 attrs 获取) by xu 20251215
+      if (attrs.class) {
+        return () => h("i", { class: attrs.class + ' icon-container' });
       }
 
       // v1.0 分支:原有逻辑

+ 14 - 11
js/vue/ss-index-components.js

@@ -197,7 +197,8 @@ export const GlobalMenu = {
                 name: item.desc,
                 component: item.url,
                 js: item.js,
-                class: item.type == 1 ? 'nav-icon-folder-close' : item.icon || 'header-home',
+                // v3.0 优先使用 item.icon,没有才用默认图标 by xu 20251215
+                class: item.icon || (item.type == 1 ? 'icon-folder-close' : 'icon-shouye'),
                 itemType: item.type,
                 children: []
             }));
@@ -247,8 +248,8 @@ export const GlobalMenu = {
                 console.log('Menu items updated:', menuItemsNew.value);
             }
         });
+        // v3.0 使用 ss-icon 组件替代 SsNavIcon by xu 20251215
         const SsIcon = Vue.resolveComponent('ss-icon');
-        const SsNavIcon = Vue.resolveComponent('ss-nav-icon');
         // 移动状态控制逻辑到组件内
         const leftSideTypeDict = {
             min: { key: "min", icon: "arrow-double-right" },
@@ -353,7 +354,8 @@ export const GlobalMenu = {
                         }
                     }, [
                         Vue.h('div', { class: 'menu-item-content' }, [
-                            Vue.h(SsNavIcon, { class: menuItemsNew.value[0]?.class || 'nav-icon-home' }),
+                            // v3.0 使用 ss-icon + 双 class (图标类 + menu-icon 组类) by xu 20251215
+                            Vue.h(SsIcon, { class: (menuItemsNew.value[0]?.class || 'icon-shouye') + ' menu-icon' }),
                             Vue.h('div', { class: 'menu-item-label' }, menuItemsNew.value[0]?.name || '首页')
                         ])
                     ]) : null
@@ -387,11 +389,11 @@ export const GlobalMenu = {
                             }
                         }, [
                             Vue.h('div', { class: 'menu-item-content' }, [
-                                Vue.h(SsNavIcon, {
-                                    // 如果是文件夹类型(type == 1),根据展开状态设置不同的class
-                                    class: icon.itemType == 1 ?
-                                        (expandedMenus.value.has(icon.name) ? 'nav-icon-folder-open' : 'nav-icon-folder-close')
-                                        : (icon.class || '')
+                                // v3.0 收起时显示自定义图标,展开时统一显示 folder-open by xu 20251215
+                                Vue.h(SsIcon, {
+                                    class: (expandedMenus.value.has(icon.name)
+                                        ? 'icon-folder-open'
+                                        : (icon.class || 'icon-folder-close')) + ' menu-icon'
                                 }),
                                 Vue.h('div', { class: 'menu-item-label' }, icon.name || ''),
                                 // 有子菜单时显示小圆点(在一级菜单右上角)
@@ -411,8 +413,9 @@ export const GlobalMenu = {
                                     }
                                 }, [
                                     Vue.h('div', { class: 'menu-item-content' }, [
-                                        Vue.h(SsNavIcon, {
-                                            class: child.class || ''
+                                        // v3.0 使用 ss-icon + 双 class by xu 20251215
+                                        Vue.h(SsIcon, {
+                                            class: (child.class || '') + ' menu-icon'
                                         }),
                                         Vue.h('div', { class: 'menu-item-label' }, child.name)
                                     ])
@@ -428,7 +431,7 @@ export const GlobalMenu = {
                         class: 'menu-mode-btn',
                         onClick: toggleMenuMode
                     }, [
-                        Vue.h('div', { class: 'mode-label' }, currentMenuMode.value.label)
+                        Vue.h(SsIcon, { class: 'icon-qiehuan menu-icon' })
                     ])
                 ])
             ])

+ 4 - 0
page/env/objInp.jsp

@@ -26,6 +26,10 @@
 		.table-container>tr>th{
 			width:130px !important;
 		}
+		/* 把content-box的高度限制 从公共css 抽到具体有需要的页面 by xu 20251215 */
+		.form-container .content-box {
+			height: calc(100% - 80px) !important;
+		}
 	</style>
 
 </head>

+ 26 - 9
skin/easy/css/base.css

@@ -11,7 +11,6 @@
   background-size: cover;
   cursor: pointer;
   position: relative;
-  margin-left: 15px;
   float: left;
 }
 .id-photo::before {
@@ -64,8 +63,22 @@
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
 }
-.menu-icon:hover {
-  color: #333;
+/* hover 不改变图标颜色 by xu 20251215 */
+
+/* v3.0 菜单图标类 - 文件夹和首页 by xu 20251215 */
+/* 文件夹图标 - 使用旧图标库 iconfont(新库暂无文件夹图标) */
+.icon-folder-open::before {
+  content: "\e60c";
+  font-family: "iconfont" !important;
+}
+.icon-folder-close::before {
+  content: "\e60b";
+  font-family: "iconfont" !important;
+}
+/* 首页图标 - 使用基础图标库 icon-base */
+.icon-shouye::before {
+  content: "\e619" !important;
+  font-family: "icon-base" !important;
 }
 
 /* 通用icon */
@@ -682,7 +695,7 @@ body,
 #app {
   width: 100%;
   height: 100%;
-  /* min-width: 1024px; */
+  overflow: hidden;
 }
 
 i{
@@ -2308,7 +2321,7 @@ input::placeholder ,textarea::placeholder{
 }
 
 .form-container .content-box {
-  height: calc(100% - 80px);
+  height: 100%;
   overflow-y: auto;
   padding: 25px 24px;
   box-sizing: border-box;
@@ -2339,7 +2352,7 @@ input::placeholder ,textarea::placeholder{
 .form-container td { 
   /* width: 360px; //不写死 td 的宽度 Xu(20251208)*/ 
   height: 60px;
-  padding: 0;
+  padding: 0 15px;
   box-sizing: border-box;
   border: 1px solid #e2e4ec;
   position: relative;
@@ -2504,8 +2517,8 @@ input::placeholder ,textarea::placeholder{
   line-height: 20px; /* 设置行高 */
 }
 .input-container>.input>textarea {
-  padding-left: 15px; /* 左右padding保持 */
-  padding-right: 15px;
+  /* padding-left: 15px; 
+  padding-right: 15px; */
   font-family: inherit; /* 继承字体 */
   /* 上下padding由JS动态设置,不在这里固定 */
 }
@@ -2574,11 +2587,15 @@ input::placeholder ,textarea::placeholder{
   background: unset;
   width: 100%;
   height: 100%;
-  padding: 0 15px;
+  padding: 0 15px 0 0;
   font-size: inherit;
   color: #000;
   /* pointer-events: none; */
 }
+.search-bar-contaienr .select-container .input>input{
+  padding: 0 15px
+}
+.select-container .input>input
 .select-container .input>input::placeholder{
   color: #999;
 }

+ 11 - 4
skin/easy/css/icon-base/iconfont.css

@@ -1,19 +1,26 @@
-/* 基础功能图标库 - Project id 5081296 by xu 20251212 */
 @font-face {
-  font-family: "icon-base";
+  font-family: "icon-biz";
   src: url('../../fonts/icon-base/iconfont.woff2') format('woff2'),
        url('../../fonts/icon-base/iconfont.woff') format('woff'),
        url('../../fonts/icon-base/iconfont.ttf') format('truetype');
 }
 
-.icon-base {
-  font-family: "icon-base" !important;
+.iconfont {
+  font-family: "iconfont" !important;
   font-size: 16px;
   font-style: normal;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-qiehuan:before {
+  content: "\e640";
+}
+
+.icon-baocunbingtijiao:before {
+  content: "\e63f";
+}
+
 .icon-jingyin:before {
   content: "\e630";
 }

+ 3 - 3
skin/easy/css/icon-biz/iconfont.css

@@ -1,4 +1,3 @@
-/* 业务功能图标库 - Project id 5081293 by xu 20251212 */
 @font-face {
   font-family: "icon-biz";
   src: url('../../fonts/icon-biz/iconfont.woff2') format('woff2'),
@@ -6,8 +5,9 @@
        url('../../fonts/icon-biz/iconfont.ttf') format('truetype');
 }
 
-.icon-biz {
-  font-family: "icon-biz" !important;
+
+.iconfont {
+  font-family: "iconfont" !important;
   font-size: 16px;
   font-style: normal;
   -webkit-font-smoothing: antialiased;

BIN
skin/easy/fonts/icon-base/iconfont.ttf


BIN
skin/easy/fonts/icon-base/iconfont.woff


BIN
skin/easy/fonts/icon-base/iconfont.woff2


BIN
skin/easy/fonts/icon-biz/iconfont.ttf


BIN
skin/easy/fonts/icon-biz/iconfont.woff


BIN
skin/easy/fonts/icon-biz/iconfont.woff2