【SSH项目实战】国税协同平台-31.我要投诉功能1

简介:
我们之前完成了投诉回复和保存功能,这次我们将要完成历史受理信息的显示

以及数据回显功能,当然还有用户编写投诉信息的入口,我们这次继续。

可以注意到,在deilUI.jsp上我们之前的投诉人信息显示,不管是匿名还是不匿名,投诉人的姓名、手机号码都是显示出来的:
<tr>
    <td class="tdBg">投诉人姓名:</td>
    <td><s:property value="complain.compName"/></td>
</tr>
<tr>
     <td class="tdBg">投诉人手机:</td>
     <td>
     <s:property value="complain.compMobile"/>
     </td>
</tr>
我们要做到匿名的用户名称不显示,手机第4-7位不显示(变为*号),所以,我们要在deilUI.jsp上修改这一块,先去判断用户是否匿名状态, 不匿名就直接显示用户手机号码,如果匿名了,在手机号码位数合理的情况下,隐藏第5-8位:
<tr>
    <td class="tdBg">投诉人姓名:</td>
    <td><s:if test="!complain.isNm"><s:property value="complain.compName"/></s:if></td>
</tr>
<tr>
    <td class="tdBg">投诉人手机:</td>
    <td>
    <s:if test="!complain.isNm">
    <s:property value="complain.compMobile"/>
    </s:if><s:elseif test="%{complain.compMobile.length() > 10}">
    <s:property value="%{complain.compMobile.substring(0,3) + '****' + complain.compMobile.substring(7,11)}"/>
    </s:elseif>
    </td>
</tr>

这样在投诉人匿名的时候就不会显示投诉人的姓名和完整的手机号码了。

接下来我们来添加历史回复信息显示的功能。这是我们什么都没有加时的jsp界面上的静态数据:
<tr>
    <td colspan="2">
    	<fieldset style="border: solid 1px #c0c0c0;margin-top:5px;">
    	<legend style="color:green;font-weight:bold;">回复 </legend>
			<div style="width:100%; text-align:center;color:#ccc;maring-top:5px;">
			回复部门:xxx  
			回复人:xxx  
			回复时间:xxx
			</div>
			<div style="width:100%;maring-top:10px;font-size:13px;padding-left:5px;">
			xxx
			</div>
		</fieldset>
    </td>
</tr>

因为我们每次进入恢复投诉界面的时候,已经进行了“懒加载”,我们的历史回复信息也是会加载进来的,这个时候我们只要使用struts去遍历它就可以了。修改后的这一块的代码为:
<tr>
    <td colspan="2">
      <s:iterator value="complain.complainReplies" status="st">
    	<fieldset style="border: solid 1px #c0c0c0;margin-top:5px;">
    	<legend style="color:green;font-weight:bold;">回复<s:property value="#st.count"/> </legend>
			<div style="width:100%; text-align:center;color:#ccc;maring-top:5px;">
			回复部门:<s:property value="replyDept"/>  
			回复人:<s:property value="replyer"/>  
			回复时间:<s:date name="replyTime" format="yyyy-MM-dd HH:mm"/>
			</div>
			<div style="width:100%;maring-top:10px;font-size:13px;padding-left:5px;">
			<s:property value="replyContent"/>
			</div>
		</fieldset>
	  </s:iterator>
    </td>
</tr>

测试,我们点击之前我们回复过的投诉信息,然后在历史回复栏中显示:


这样我们就完成了历史受理信息的显示。

我们接下来完成投诉入口、分页与数据回显的功能
先来搞定投诉入口,我们的普通用户上网需要投诉,就直接在“工作主页”中去投诉即可:

我们的投诉信息保存不能写在Complain的Action中,因为普通用户可能没有操作权限,所以我们要将这个方法写在公共的Action中,即系统主界面的Action------HomeAction:
package cn.edu.hpu.tax.core.action;

import com.opensymphony.xwork2.ActionSupport;

public class HomeAction extends ActionSupport{

	//跳转到首页
	public String execute(){
		
		return "home";
	}
	
}

我们在HomeAction中添加跳转至投诉信息填写页面的方法:
package cn.edu.hpu.tax.core.action;

import com.opensymphony.xwork2.ActionSupport;

public class HomeAction extends ActionSupport{

	//跳转到首页
	public String execute(){
		
		return "home";
	}
	
	//跳转到投诉信息编辑页面
	public String complainAddUI(){
		return "complainAddUI";
	}
}

然后在主页“我要投诉”地方加上超链接:
<div class="lc_grzxbt">
        <h1>我的投诉</h1>
        <div style="float:right;padding-top:3px;">
        <s:a action="home_complainAddUI"namespace="/sys" target="_blank">
        我要投诉</s:a>  
        </div>
</div>

然后拿到美工给我们的投诉信息编辑页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    pageContext.setAttribute("basePath", request.getContextPath()+"/") ;
%>
<html>
<head>
    <%@include file="/common/header.jsp"%>
    <title>我要投诉</title>
    <script type="text/javascript" charset="utf-8" src="${basePath }js/ueditor/ueditor.config.js"></script>
    <script type="text/javascript" charset="utf-8" src="${basePath }js/ueditor/ueditor.all.min.js"> </script>
    <script type="text/javascript" charset="utf-8" src="${basePath }js/ueditor/lang/zh-cn/zh-cn.js"></script>


    <script>
   		window.UEDITOR_HOME_URL = "${basePath }js/ueditor/";
    	var ue = UE.getEditor('editor');
    	
    	//根据部门查询该部门下的用户列表
    	function doSelectDept(){
    	
	}
    </script>
    
</head>
<body>
<form id="form" name="form" action="" method="post" enctype="multipart/form-data">
    <div class="vp_d_1">
        <div style="width:1%;float:left;">    </div>
        <div class="vp_d_1_1">
            <div class="content_info">
    <div class="c_crumbs"><div><b></b><strong>工作主页</strong> - 我要投诉</div></div>
    <div class="tableH2">我要投诉</div>
    <table id="baseInfo" width="100%" align="center" class="list" border="0" cellpadding="0" cellspacing="0"  >
        <tr>
            <td class="tdBg" width="250px">投诉标题:</td>
            <td><s:textfield name="comp.compTitle"/></td>
        </tr>
        <tr>
            <td class="tdBg">被投诉人部门:</td>
            <td><s:select id="toCompDept" name="user.dept" list="#{'':'请选择','部门A':'部门A','部门B':'部门B' }" onchange="doSelectDept()"/></td>
        </tr>
        <tr>
            <td class="tdBg">被投诉人姓名:</td>
            <td>
            	 
            </td>
        </tr>
        <tr>
            <td class="tdBg">投诉内容:</td>
            <td><s:textarea id="editor" name="comp.compContent" cssStyle="width:90%;height:160px;" /></td>
        </tr>
        <tr>
            <td class="tdBg">是否匿名投诉:</td>
            <td><s:radio name="comp.isNm" list="#{'0':'非匿名投诉','1':'匿名投诉' }" value="0"/></td>
        </tr>
       
    </table>


    <div class="tc mt20">
        <input type="button" class="btnB2" value="保存" />
            
        <input type="button"  onclick="javascript:window.close()" class="btnB2" value="关闭" />
    </div>
    </div></div>
    <div style="width:1%;float:left;">    </div>
    </div>
</form>
</body>
</html>

点击“我要投诉”之后的效果:


可以看到,我们有个最重要的功能,就是投诉部门选择之后就会有各个部门的人显示在“投诉人”这个框框中。
显然,要完成这个功能,我们就需要写一个js方法,利用ajax根据部门名称去查询该部门下的所有人员姓名,然后显示在“投诉人”这个框框中。

我们在doSelectDept()方法中去完成这个功能:
//根据部门查询该部门下的用户列表
function doSelectDept(){
	//1、获取部门
	var dept = $("#toCompDept option:selected").val();
	if(dept != ""){
		//2、根据部门查询列表
		$.ajax({
			url:"${basePath}sys/home_getUserJson.action",
			data:{"dept":dept},
			type:"post",
			dataType:"json",//返回数据类型
			success: function(data){
				//2.1、将用户列表设置到被投诉人下拉框中
				if(data != null && data != "" && data != undefined){
					if("success" == data.msg){
						var toCompName = $("#toCompName");
						toCompName.empty();
						//使用each标签将userList的数据遍历出来
						$.each(data.userList, function(index, user){
							toCompName.append("<option value='" + user.name + "'>" + user.name + "</option>");
						});
					} else {alert("获取被投诉人列表失败!");}
				} else {
					alert("获取被投诉人列表失败!");
				}
			},
			error:function(){alert("获取被投诉人列表失败!");}
		});
	} else {
		//清空被投诉人列表下拉框
		$("#toCompName").empty();
	}
}

然后我们在“投诉人”这个框中去显示我们获取的该部门的人员列表:
<tr>
    <td class="tdBg">被投诉人姓名:</td>
    <td>
    	<select id="toCompName" name="comp.toCompName">
    	</select>
    </td>
</tr>

然后我们在homeAction中去完成我们ajax方法中的getUserJson方法:
public void getUserJson(){
	try {
		//1.获取部门
		String dept = ServletActionContext.getRequest()
				.getParameter("dept");
		if (StringUtils.isNotBlank(dept)) {
			//2.根据部门查询用户列表
			QueryHelper queryHelper = new QueryHelper(User.class, "u");
			queryHelper.addCondition("u.dept = ?", dept);
			List<User> userList = userService.findObjects(queryHelper);
			//创建Json对象
			JSONObject jso = new JSONObject();
			jso.put("msg", "success");
			jso.accumulate("userList", userList);


			//3.输出用户列表以json格式字符串形式输出
			HttpServletResponse response = ServletActionContext
					.getResponse();
			response.setContentType("text/json");
			ServletOutputStream outputStream = response.getOutputStream();
			outputStream.write(jso.toString().getBytes("utf-8"));
			outputStream.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	
}

其中创建json对象我们要引入下列jar包:
commons-beanutils-1.8.0.jar
ezmorph-1.0.6.jar
json-lib-2.3-jdk12.jar


测试:



但是刚刚我们的getUserJson()方法是在没有使用框架的情况下去写的,我们现在使用SSH框架了,可以更简洁的写这个方法,所以我们修改getUserJson()方法:
public String getUserJson2(){
	try {
		//1.获取部门
		String dept = ServletActionContext.getRequest()
				.getParameter("dept");
		if (StringUtils.isNotBlank(dept)) {
			//2.根据部门查询用户列表
			QueryHelper queryHelper = new QueryHelper(User.class, "u");
			queryHelper.addCondition("u.dept = ?", dept);
			return_map=new HashMap<String,Object>();
			return_map.put("msg", "success");
			return_map.put("userList", userService.findObjects(queryHelper));
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return SUCCESS;
}

上面的return_map是Map对象,包装要返回的数据类型,要作为HomeAction的全局变量,并添加get和set方法:
private Map<String,Object> return_map;

public Map<String, Object> getReturn_map() {
	return return_map;
}

public void setReturn_map(Map<String, Object> returnMap) {
	return_map = returnMap;
}

然后home-struts.xml配置文件中加以下配置:
<package name="sysHomeJson-action" namespace="/sys" extends="json-default">
	<action name="home_getUserJson2" class="cn.edu.hpu.tax.core.action.HomeAction" method="getUserJson2">
		<result type="json">
			<param name="root">return_map</param>
		</result>
	</action>
</package>

最后别忘记引入 struts2-json-plugin-2.3.20.jar的jar包(用来包装json)

可以看到,在getUserJson2()方法中并没有拼接json串,我们只是利用struts的返回数据包装机制,来使用“<result type="json"></result>”配置使其将Action中返回的数据(值栈中的return_map)包装成json数据。

这种写法充分利用了struts框架返回json数据的优势,而且效果与之前是一样的。

测试之后,结果和之前一样:


下一次我们来完成数值回显和分页以及保存投诉功能。

转载请注明出处:

相关文章
|
5月前
|
分布式计算 Hadoop 网络安全
杨校老师课堂之集群内SSH免密登录功能配置
杨校老师课堂之集群内SSH免密登录功能配置
40 0
|
6月前
|
分布式计算 Hadoop Shell
使用shell脚本实现自动SSH互信功能
使用shell脚本实现自动SSH互信功能
86 1
|
Ubuntu 关系型数据库 网络安全
基于docker搭建gitea私服仓库,并开启https访问、ssh访问和邮箱验证通知功能
基于docker搭建gitea私服仓库,并开启https访问、ssh访问和邮箱验证通知功能
1511 1
基于docker搭建gitea私服仓库,并开启https访问、ssh访问和邮箱验证通知功能
|
应用服务中间件 Linux Shell
06_Linux基础-NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本
NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本
252 0
06_Linux基础-NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本
|
Java 网络安全
SSH开发项目:实现一组功能的步骤
本文主要讲实现一组功能的步骤
152 0
|
2天前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
5月前
|
安全 Linux Shell
Linux中SSH命令介绍
Linux中SSH命令介绍
127 2
|
3月前
|
安全 Linux 网络安全
在Linux中,如何配置SSH以确保远程连接的安全?
在Linux中,如何配置SSH以确保远程连接的安全?
|
3月前
|
安全 Linux Shell
SSH 命令完整实用指南 | Linux SSH 服务
【8月更文挑战第20天】
383 0