【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数据的优势,而且效果与之前是一样的。

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

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

转载请注明出处:

时间: 2024-12-31 14:02:02

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

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

我们接下来做投诉信息的保存工作 我们先来想一下,我们的整个投诉的流程是: 1.保存投诉信息 2.提示用户投诉成功 3.刷新父窗口 4.关闭当前窗口 我们来画一下时序图(对象与对象之间的消息在时间顺序上的交互): 我们现在要做的是第9步之后的步骤 我们回顾一下我们的投诉信息填写界面: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% pageContext.set

【SSH项目实战】国税协同平台-5.头像上传功能

之前我们完成了用户管理的增删改查功能,来回顾一下我们获取用户列表时的过程: 记得用户添加的时候没有上传头像,下面我们来完成添加用户时,头像上传的功能. 我们上传头像有以下步骤: 1.获取头像(file,contentType,filename) 2.保存头像 2.1.保存头像到指定的文件目录中 2.2.设置用户头像路径 下面是详细实现: 在用户管理的添加.编辑页面中,可以上传用户的头像:页面中对头像字段引用type=file的文本域. <input type="file" nam

【SSH项目实战】国税协同平台-1.项目介绍

项目介绍 1.1项目背景 国税协同办公平台包括了行政管理.后勤服务.在线学习.纳税服务.我的空间等几个子系统:我们本次主要的开发功能是纳税服务子系统的部分模块和基于纳税服务子系统信息的个人工作台首页.纳税服务子系统是办税PC前端或移动端的后台管理系统,主要包括的功能有系统角色管理.用户管理.信息发布管理.投诉受理.纳税咨询.易告知.服务预约.服务调查等模块. 系统的主界面: 我们要做的模块界面: 1.2项目前期 项目前期:一般是由客户经理从客户那边了解到有关该项目的招标信息,然后开发公司再组织竞

【SSH项目实战】国税协同平台-14.系统、子系统首页&amp;amp;登录功能1

我们做完了用户与角色的分配,在设置用户在相应的角色下的操作之前,我们先完成用户的登录功能. 首先,我们先加载我们的系统的首页和子首页.很简单,就是转发到一个jsp页面而已,我们先写一个HomeAction来设置跳转功能: package cn.edu.hpu.tax.core.action; import com.opensymphony.xwork2.ActionSupport; public class HomeAction extends ActionSupport{ //跳转到首页 pu

【SSH项目实战】国税协同平台-3.资源文件分类&amp;amp;log4j&amp;amp;抽取BaseAction

上次我们搭建了SSH框架的环境,然后做了单元测试,下面我们继续来完善我们工厂的准备工作. 3.1资源文件分类 (1)将配置文件归类到新建config文件夹: (2)源代码目录按照功能模块进行划分:cn.edu.hpu.子系统.功能模块.* (3)Jsp放置到WEB-INF目录下: (4)其它: 新建一个test源文件架(Source Folder),我们把上次所有测试的代码全部移入test文件夹下,然后专门为配置文件创建一个conf源文件夹,将配置文件移入,然后src中先建立一个包准备放新写的代

【SSH项目实战】国税协同平台-34.quartz&amp;amp;CronTrigger

我们上次使用quartz任务调度框架创建了一个在后台按照时间间隔不停运行的任务,我们使用的是simpleTrigger简单触发器,为了实现我们的月末自动回复的功能,我们要设置触发器能够在某个精确时间去自动执行任务,那么使用simpleTrigger简单触发器就远远不够了,我们需要使用CronTrigger任务触发器来实现这个功能. 我们的CronTrigger设置步骤如下: 任务触发器(CronTrigger) ① 设置任务详细 ② 设置执行时机(cronExpression) cronExpr

【SSH项目实战】国税协同平台-15.系统、子系统首页&amp;amp;登录功能2

接上一篇:http://blog.csdn.net/acmman/article/details/49614841 我们的子系统界面已经加载出来: 我们找到左边菜单页,给它加链接: <dl class=""> <dt><a class="yh" href="${ctx }tax/role_listUI.action" target="mainFrame"><b></b>

【SSH项目实战】国税协同平台-11.角色权限管理1

我们要完成角色管理这一块,首先我们看一下这一块的需求: I.界面描述 II.功能说明 角色管理:可以根据角色名称查询系统用户:在页面中点击"新增"可以添加用户.点击删除可以批量删除选中的用户.在角色列表中显示角色名称.权限.状态.操作:其中操作列中包括编辑.删除两个功能:点击"编辑"则编辑角色信息,删除则删除该角色. 编辑角色:编辑页面包括角色名称.权限列表(可复选多个权限).状态(有效.无效). 角色与权限的关系: 系统中可以存在多个角色,每个角色可以自由的组合系

【SSH项目实战】国税协同平台-4.用户管理需求分析&amp;amp;CRUD方法1

上次我们完成了日志模块的配置和基础增删改查类,下面我们根据用户的需求来正式开发项目的业务模块. 下面我们主要来开发系统用户管理的模块 我们有用户的功能说明书,打开功能说明书来看看这个模块需要什么功能: 功能说明 用户管理:可以根据用户名查询系统用户:在页面中点击"新增"可以添加用户.点击删除可以批量删除选中的用户."导出"则导出所有的用户列表到excel文件中并弹出下载提示框给用户下载:"导入"将需要用户将本地的用户列表按照一定格式将excel中