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

我们接下来做投诉信息的保存工作

我们先来想一下,我们的整个投诉的流程是:

1、保存投诉信息

2、提示用户投诉成功

3、刷新父窗口

4、关闭当前窗口

我们来画一下时序图(对象与对象之间的消息在时间顺序上的交互):

我们现在要做的是第9步之后的步骤

我们回顾一下我们的投诉信息填写界面:

<%@ 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(){
    		//1、获取部门
    		var dept=$("#toCompDept option:selected").val();
    		if(dept!=""){
    			//2.根据部门查询列表
    			$.ajax({
    				url:"${basePath}sys/home_getUserJson2.action",
    				data:{"dept":dept},
    				type:"post",
    				dataType:"json",//返回数据类型
    				success:function(data){
    					//3.将列表设置到被投诉人下拉框中
    					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();
    		}
    	}
    </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="comp.toCompDept" list="#{'':'请选择','部门A':'部门A','部门B':'部门B' }" onchange="doSelectDept()"/></td>
        </tr>
        <tr>
            <td class="tdBg">被投诉人姓名:</td>
            <td>
            	<select id="toCompName" name="comp.toCompName">
            	</select>
            </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="#{'false':'非匿名投诉','true':'匿名投诉' }" value="true"/></td>
        </tr>

    </table>
	<s:hidden name="comp.compCompany" value="%{#session.SYS_USER.dept}"/>
	<s:hidden name="comp.compName" value="%{#session.SYS_USER.name}"/>
	<s:hidden name="comp.compMoblie" value="%{#session.SYS_USER.moblie}"/>
    <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>

我们给“保存”announce添加一个onclick事件:

<input type="button" class="btnB2" value="保存" onclick="doSubmit()"/>

然后在<script></script>中完成onclick的doSubmit()方法:

//提交表单
function doSubmit(){
    //1.提交表单并保存
    $.ajax({
    	url:"${basePath}sys/home_complainAdd.action",
    	data:$("#form").serialize(),
    	type:"post",
    	async:false,
    	success:function (msg){
    		if("success" == msg){
    		//2.提示用户投诉成功
    		alert("投诉成功!");
    		//3.刷新父窗口
    		window.opener.parent.location.reload(true);
    		//4.关闭当前窗口
    		window.close();
    		}else{
    			alert("投诉失败!");
    		}
    	},
    	error:function(){alert("投诉失败!");}
    });
}

由于我们是使用ajax保存我们的而投诉信息的,我们需要从页面上获取我们的标题属性内容、部门属性内容、投诉人属性内容、文本属性等,获取比较麻烦,我们使用$("#form").serialize()来获取整个页面的所有标签值。

(解释一下$("#form").serialize():

serialize() 方法通过序列化表单值,创建 URL 编码文本字符串。

可以选择一个或多个表单元素(比如 input 及/或 文本框),或者 form 元素本身。

序列化的值可在生成 AJAX 请求时用于 URL 查询字符串中。

)

我们接下来在HomeAction添加complainAdd方法来完成投诉信息的添加:

//注入complainService
@Resource
private ComplainService complainService;
//投诉信息的包装对象
private Complain comp;

public Complain getComp() {
	return comp;
}

public void setComp(Complain comp) {
	this.comp = comp;
}
//保存投诉信息
public void complainAdd(){
	try {
		if (comp != null) {
			//设置默认投诉状态为待受理
			comp.setState(Complain.COMPLAIN_STATE_UNDONE);
			comp.setCompTime(new Timestamp(new Date().getTime()));
			complainService.save(comp);

			//输出投诉结果
			HttpServletResponse response = ServletActionContext
					.getResponse();
			response.setContentType("text/html");
			ServletOutputStream outputStream = response.getOutputStream();
			outputStream.write("success".getBytes("utf-8"));
			outputStream.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

我们来测一下我们的投诉信息保存是否能成功:

首先输入各种我们的投诉信息,然后点击保存:

首先会看到弹出一个对话框:

然后点击“确定”之后,我们的投诉信息编辑页面就会关闭,我们到“纳税服务”模块下的“投诉受理管理”功能下查看,发现我们的投诉信息已经成功保存:

点击“受理”,我们可以看到我们的投诉信息详细内容:

最后将之前我们一直嚷嚷的查询条件回显解决:

首先在我们的ComplainAction中添加下面属性:

private String strTitle;
private String strState;

public String getStrTitle() {
	return strTitle;
}

public void setStrTitle(String strTitle) {
	this.strTitle = strTitle;
}

public String getStrState() {
	return strState;
}

public void setStrState(String strState) {
	this.strState = strState;
}

在dealUI中防止这两个条件被覆盖:

public String dealUI(){
	//加载状态集合
	ActionContext.getContext().getContextMap().put("complainStateMap", Complain.COMPLAIN_STATE_MAP);
	if(complain!=null){
		strTitle=complain.getCompTitle();
		strState=complain.getState();
		complain=complainService.findObjectById(complain.getCompId());
	}
	return "dealUI";
}

然后在dealUI.jsp中加入隐藏值:

<s:hidden name="complain.compId"/>
<s:hidden name="strTitle"/>
<s:hidden name="strState"/>
<s:hidden name="startTime"/>
<s:hidden name="endTime"/>
<s:hidden name="pageNo"/>

然后在complain-struts.xml配置文件的Action重定向跳转中添加这些参数:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="complain-action" namespace="/tax" extends="base-default">
		<action name="complain_*" class="cn.edu.hpu.tax.complain.action.ComplainAction" method="{1}">
			<result name="{1}">/WEB-INF/jsp/tax/complain/{1}.jsp</result>
			<result name="list" type="redirectAction">
				<param name="actionName">complain_listUI</param>
				<param name="complain.compTitle">${strTitle}</param>
				<param name="complain.state">${strState}</param>
				<param name="startTime">${startTime}</param>
				<param name="endTime">${endTime}</param>
				<param name="pageNo">${pageNo}</param>
				<param name="encode">true</param><!-- 需要编码 -->
			</result>
		</action>
	</package>
</struts>

我们的回显功能就完成了。同样保留了我们分页的当前页面(分页的其他功能我们已经在BaseAction中完成了,而且我们的ComplainAction、也已经继承了BaseAction)。

测试,我们搜索“问题”:

一共有7条测试数据,然后我们翻到第二页,对第二页第一条进行受理

跳转至受理页面后,我们随便填写一下回复,然后点击保存

之后我们重新跳转回界面,发现我们的查询条件以及当前页数都在

至此我们的分页以及查询条件状态回显的工作完成。

转载请注明出处:http://blog.csdn.net/acmman/article/details/50144467

时间: 2024-10-03 21:41:38

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

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

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

【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们将介绍如何实现自定义客户端的限流功能,来进一步完善网关的基础功能. .netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论. 一.功能描述 限流就是为了保证网关在高并发或瞬时并发时,在服务能承受范围内,牺牲部分请求为代价,保证系统的整体可用性而做的安全策略,避免单个服务

【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析

[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上实现客户端自定义限流功能,基本完成了关于网关的一些自定义扩展需求,后面几篇将介绍基于IdentityServer4(后面简称Ids4)的认证相关知识,在具体介绍ids4实现我们统一认证的相关功能前,我们首先需要分析下Ids4源码,便于我们彻底掌握认证的原理以及后续的扩展需求. .netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论. 一.Ids4文档及源码 文档地址 http:/

【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权

原文 [.NET Core项目实战-统一认证平台]第十章 授权篇-客户端授权 [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了如何使用Dapper持久化IdentityServer4(以下简称ids4)的信息,并实现了sqlserver和mysql两种方式存储,本篇将介绍如何使用ids4进行客户端授权. .netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论. 一.如何添加客户端授权? 在了解如何进行客户端授权时,我们需要了解详细的授权流程

【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4客户端授权的原理及如何实现自定义的客户端授权,并配合网关实现了统一的授权异常返回值和权限配置等相关功能,本篇将介绍密码授权模式,从使用场景.源码剖析到具体实现详细讲解密码授权模式的相关应用. .netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论. 一.使用场景? 由于密码授权模式需要用户在业务系统输入账号密码,为了安全起见,对于使用密码模式的业务系统,我们认为是绝对可靠的,不存在

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

原文:[.NET Core项目实战-统一认证平台]第十二章 授权篇-深入理解JWT生成及验证流程 [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的,如何验证access_token的有效性,最后我们使用.net webapi来实现一个外部接口(本来想用JAVA来实现的,

【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证,然后根据不同的客户端使用不同的认证方式来集成到统一认证平台. .netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论. 一.自定授权源码剖析 当我们需要使用开源项目的某些功能时,最好了解实现的原理,才能正确和熟练使用功能,避免出现各种未知bug问

【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能

原文:[.NET Core项目实战-统一认证平台]第十五章 网关篇-使用二级缓存提升性能 [.NET Core项目实战-统一认证平台]开篇及目录索引 一.背景 首先说声抱歉,可能是因为假期综合症(其实就是因为懒哈)的原因,已经很长时间没更新博客了,现在也调整的差不多了,准备还是以每周1-2篇的进度来更新博客,并完成本项目所有功能. 言归正传,本重构项目是在我根据实际需求重构,由于还未完全写完,所以也没进行压测,在2月份时,张善友老师给我留言说经过压测发现我重构的Ocelot网关功能性能较差,其中

【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务

原文:[.NET Core项目实战-统一认证平台]第十六章 网关篇-Ocelot集成RPC服务 [.NET Core项目实战-统一认证平台]开篇及目录索引 一.什么是RPC RPC是"远程调用(Remote Procedure Call)"的一个名称的缩写,并不是任何规范化的协议,也不是大众都认知的协议标准,我们更多时候使用时都是创建的自定义化(例如Socket,Netty)的消息方式进行调用,相比http协议,我们省掉了不少http中无用的消息内容.因此很多系统内部调用仍然采用自定义