需求分析

我们现在来到了纳税服务系统的信息发布管理模块,首先我们跟着原型图来进行需求分析把:

一些普通的CRUD,值得一做的就是状态之间的切换了。停用和发布切换。

值得注意的是:在信息内容中,它可以带格式地复制内容,然后上传到我们的服务器中。

流程图:

编写JavaBean与配置文件

javaBean

package zhongfucheng.info.entity;

import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map; public class Info implements java.io.Serializable { private String infoId;
private String type;
private String source;
private String title;
private String content;
private String memo;
private String creator;
private Timestamp createTime;
private String state; public static String INFO_STATE_PUBLIC = "1";//发布
public static String INFO_STATE_STOP = "0";//停用 public static String INFO_TYPE_TZGG = "tzgg";
public static String INFO_TYPE_ZCSD = "zcsd";
public static String INFO_TYPE_NSZD = "nszd"; public static Map<String, String> INFO_TYPE_MAP = new HashMap<String, String>();
static {
INFO_TYPE_MAP.put(INFO_TYPE_TZGG, "通知公告");
INFO_TYPE_MAP.put(INFO_TYPE_ZCSD, "政策速递");
INFO_TYPE_MAP.put(INFO_TYPE_NSZD, "纳税指导");
} public Info() {
} public Info(String title) {
this.title = title;
} public Info(String type, String source, String title, String content, String memo, String creator, Timestamp createTime, String state) {
this.type = type;
this.source = source;
this.title = title;
this.content = content;
this.memo = memo;
this.creator = creator;
this.createTime = createTime;
this.state = state;
} public String getInfoId() {
return this.infoId;
} public void setInfoId(String infoId) {
this.infoId = infoId;
} public String getType() {
return this.type;
} public void setType(String type) {
this.type = type;
} public String getSource() {
return this.source;
} public void setSource(String source) {
this.source = source;
} public String getTitle() {
return this.title;
} public void setTitle(String title) {
this.title = title;
} public String getContent() {
return this.content;
} public void setContent(String content) {
this.content = content;
} public String getMemo() {
return this.memo;
} public void setMemo(String memo) {
this.memo = memo;
} public String getCreator() {
return this.creator;
} public void setCreator(String creator) {
this.creator = creator;
} public Timestamp getCreateTime() {
return this.createTime;
} public void setCreateTime(Timestamp createTime) {
this.createTime = createTime;
} public String getState() {
return this.state;
} public void setState(String state) {
this.state = state;
} }

配置文件



package zhongfucheng.info.entity;

import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map; public class Info implements java.io.Serializable { private String infoId;
private String type;
private String source;
private String title;
private String content;
private String memo;
private String creator;
private Timestamp createTime;
private String state; public static String INFO_STATE_PUBLIC = "1";//发布
public static String INFO_STATE_STOP = "0";//停用 public static String INFO_TYPE_TZGG = "tzgg";
public static String INFO_TYPE_ZCSD = "zcsd";
public static String INFO_TYPE_NSZD = "nszd"; public static Map<String, String> INFO_TYPE_MAP = new HashMap<String, String>();
static {
INFO_TYPE_MAP.put(INFO_TYPE_TZGG, "通知公告");
INFO_TYPE_MAP.put(INFO_TYPE_ZCSD, "政策速递");
INFO_TYPE_MAP.put(INFO_TYPE_NSZD, "纳税指导");
} public Info() {
} public Info(String title) {
this.title = title;
} public Info(String type, String source, String title, String content, String memo, String creator, Timestamp createTime, String state) {
this.type = type;
this.source = source;
this.title = title;
this.content = content;
this.memo = memo;
this.creator = creator;
this.createTime = createTime;
this.state = state;
} public String getInfoId() {
return this.infoId;
} public void setInfoId(String infoId) {
this.infoId = infoId;
} public String getType() {
return this.type;
} public void setType(String type) {
this.type = type;
} public String getSource() {
return this.source;
} public void setSource(String source) {
this.source = source;
} public String getTitle() {
return this.title;
} public void setTitle(String title) {
this.title = title;
} public String getContent() {
return this.content;
} public void setContent(String content) {
this.content = content;
} public String getMemo() {
return this.memo;
} public void setMemo(String memo) {
this.memo = memo;
} public String getCreator() {
return this.creator;
} public void setCreator(String creator) {
this.creator = creator;
} public Timestamp getCreateTime() {
return this.createTime;
} public void setCreateTime(Timestamp createTime) {
this.createTime = createTime;
} public String getState() {
return this.state;
} public void setState(String state) {
this.state = state;
} }

常规增删改查


这现在对我们来说没有什么难度了,改之前写过的User模块就行了。

编写dao、编写service、编写action、编写配置文件

将配置文件加载到总配置文件中。

导入前端的JSP页面

弄完之后,简单的增删改查我们已经实现了。。

接下来就是处理一些不是常用增删改查的东西了。

创建人与创建时间

我们在添加的时候怎么写呢???在需求上,不是让我们填的,而是写死的。


<tr>
<td class="tdBg" width="200px">创建人:</td>
<td> </td>
<td class="tdBg" width="200px">创建时间:</td>
<td> </td>
</tr>

创建人我们在Session中找到对应的用户,给出对应的值。显示出来后,在提交的时候还要通过隐藏域把数据带过去


<tr>
<td class="tdBg" width="200px">创建人:</td>
<td>
<s:property value="#session.SYS_USER.name"/>
<s:hidden value="#session.SYS_USER.name" name="info.creator"/>
</td>
<td class="tdBg" width="200px">创建时间:</td>
<td>
<s:date name="info.createTime" format="yyyy-MM-dd HH:MM"/>
<s:hidden name="info.createTime"/>
</td>
</tr>

创建时间,我们可以直接在InfoAction中,new出Info对象,给出对应的值。在JSP页面就可以回显出来了。

当然了,我们也要通过隐藏域把数据带过去。


public String addUI() { ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP);
info = new Info();
info.setCreateTime(new Timestamp(new Date().getTime()));
return "addUI";
}

!


富文本框编辑器

我们想要在那个大文本框中,把复制的内容是带有格式的,图片也可以复制过去。普通的textarea是搞不掂的,我们需要借助别的组件。。我们用的是Ueditor组件

使用步骤:

  • 导入ueditor/jsp/lib目录中的“commons-codec-1.9.jar”、“json.jar”、“ueditor-1.1.1.jar”这几个jar包到项目的web-inf/lib目录中。
  • 配置 ueditor 中图片上传前缀和路径;打开“ueditor/jsp/config.json”

"imageUrlPrefix": "http://localhost:8080", /* 图片访问路径前缀 */
"imagePathFormat": "/upload/ueditor/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
  • 在需要用到ueditor的Jsp页面用配置信息:

<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>
//配置ueditor的根路径
var UEDITOR_HOME_URL = "${basePath}js/ueditor/";
var ue = UE.getEditor('editor');
</script>
  • 最后在我们的文本框中给出我们写的id就行了,也就是var ue = UE.getEditor('editor');中的editor

<td colspan="3"><s:textarea id="editor" name="info.content" cssStyle="width:90%;height:160px;" /></td>

富文本框的配置我们大多数可以在这里修改:

效果:


很奇怪的是,如果单单访问info模块的话,使用是完全没有问题的。但是在总系统进入到info模块时,富文本框就点击不了:输入会显示输入个数,但是显示不了内容。编辑的时候同样看不到内容。

于是在网上搜了一下:把以下的代码加入到要用到富文本框的JSP页面下就解决掉问题了:


<script>
setTimeout(function(){uParse('div',
{
'highlightJsUrl':'/ueditor/third-party/SyntaxHighlighter/shCore.js',
'highlightCssUrl':'/ueditor/third-party/SyntaxHighlighter/shCoreDefault.css'})
},300);
</script>

参考博文:http://blog.csdn.net/eightwhells/article/details/13314069


异步信息交互

最后地,我们剩下停用与发布这个功能还没完成…

其实就是一个异步信息交互的实现,当用户点击超链接为停用的时候,就到后台把数据更新,把Info的state变成为0,然后将超链接改成发布。

绑定事件

使用opertor前缀+id定位到我们的span节点中。这肯定是独一无二的。

位于iterator内,直接写state判断就行了。


<span id="operator_<s:property value='infoId'/>">
<s:if test="state==1">
<a href="javascript:doPublic('<s:property value='infoId'/>',0)">停用</a>
</s:if>
<s:else>
<a href="javascript:doPublic('<s:property value='infoId'/>',1)">发布</a>
</s:else>
</span>

ajax进行交互

注意在拼接字符串的时候,不要有空格………

error:如果出错了,可以提示用户。


function doPublic (infoId,state){
$.ajax(
{
url: "${basePath}info/info_doPublic.action",
data: { "info.infoId": infoId,"info.state": state},
type: "post",
success: function (backData) { if ("更新成功" == backData) { if (state == 0) {//如果用户点击的是停用 //将超链接改成发布
$("#operator_"+infoId).html("<a href='javascript:doPublic(\""+infoId+"\",1)'>发布</a>"); //将显示状态改成是停用
$("#show_" + infoId).html("停用"); }else{//用户点击的是发布 //将超链接改成停用
$("#operator_"+infoId).html("<a href='javascript:doPublic(\""+infoId +"\",0)'>停用</a>"); //将显示状态改成是发布
$("#show_" + infoId).html("发布");
} }else {
alert("更新失败,稍后重试");
}
},
//如果失败了,就提示给用户,不要让用户继续操作了
error:function () {
alert("更新失败,稍后重试");
} }
);
}
</script>

Action处理

得到用户的id,查询出Info对象的信息,再设置Info对象的属性。


public void doPublic() {
try { if (info != null) {
//得到用户带过来的id查询出该对象
Info objectById = infoServiceImpl.findObjectById(info.getInfoId());
//设置它的状态
objectById.setState(info.getState()); //调用service更新数据库
infoServiceImpl.update(objectById); //返回数据给浏览器
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html charset=utf-8");
response.getOutputStream().write("更新成功".getBytes("UTF-8")); }
} catch (IOException e) {
e.printStackTrace();
} }

纳税服务系统【信息发布管理、Ueditor、异步信息交互】的更多相关文章

  1. 纳税服务系统【异常处理、抽取BaseAction】

    前言 本博文主要讲解在项目中异常是怎么处理的.一般我们都不会直接把后台异常信息返回给用户,用户是看不懂的.让用户看见一大串的错误代码,这是不合理的.因此我们需要对报错进行处理. 我们在开发的时候是使用 ...

  2. 纳税服务系统【自动受理,Quartz任务调度】

    需求 回到我们的需求: 自动投诉受理:在每个月月底最后一天对本月之前的投诉进行自动处理:将投诉信息的状态改为 已失效.在后台管理中不能对该类型投诉进行回复. 这个需求需求我们要怎么弄呢????要在每个 ...

  3. 纳税服务系统【统计图Fusionchart】

    需求 我们在投诉模块中还有一个功能没有实现: 统计:根据年度将相应年度的每个月的投诉数进行统计,并以图表的形式展示在页面中:在页面中可以选择查看当前年度及其前4年的投诉数.在页面中可以选择不同的年度, ...

  4. 纳税服务系统【抽取BaseService、条件查询】

    抽取BaseService 到目前为止,我们已经写了三个模块的开发了.我们已经抽取过了BaseAction.BaseDao,我们这次来看看我们的Service接口. UserService /** * ...

  5. 纳税服务系统【用户模块之使用POI导入excel、导出excel】

    前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...

  6. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现)

    “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现) 一.前三篇的内容是否对您有帮助呢?如果有的话,请您继续关注这篇吧,这篇主要是实现”用户管理“的 ...

  7. “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)

    “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构.登录窗口.以及主界面) 一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增 ...

  8. “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)

    一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增删改查的地步.测试好之后再来看这篇文章,我的主框架相对来说简答一点,重点还是实现系统的功能,以及对Jquery-Eas ...

  9. 完成一个MVC+Nhibernate+Jquery-EasyUI信息发布系统

    一.最近学习了Jquery-EasyUI框架,结合之前用过的MVC3+Nhibernate做一个信息发布系统,对工作一年半的自己做一个总结吧!(也正好 供初学者学习!) 二.先上截图(系统简介),让大 ...

随机推荐

  1. Objective-C写出Json文件(可作配置文件)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #008f00 } span. ...

  2. sql语句回忆录1-多表连接子查询

    --多表连接查询,在多张表中查询符合条件的记录--注意:给表起简短的别名select * from emp e--给字段起别名:字段名 别名,当别名为数字(包括数字开头)或者有空格时需要用双引号括起来 ...

  3. 【javascript】您好, 您要的ECMAScript6速记套餐到了

    [前言]本文“严重参考” 自阮一峰老师写的文档,在此我郑重感谢他沉默无声的帮助 总结一下ES6为 javascript中的 对象/数组/函数 这JS三巨头所提供的更简洁优雅的书写方式,以及扩展的API ...

  4. 【Ubuntu 16】 wifi连接 并解决无桌面图标问题

    笔记本上装了win10和ubuntu16双系统,ubuntu16有半年多没使用了,今天一登录成功后,没有桌面啦,一个干净的壁纸映入眼帘,真操蛋. 上网搜索后总结:应该是应用软件中心出了问题,可是,没法 ...

  5. 博文Contents<1--到450—>

    积分=排名>2017-05-15这一天还真是厉害了.让我等了5个月时间... ====================-------------- 前言:博客中的随笔文章.并非都是笔者的原创文章 ...

  6. 重拾java中的 i++ 和 ++i

    java中的 i++ 和 ++i 首先记着要点: 1.i++是先取值再运算. 2.++i是先运算后取值. 举个栗子: int y,x=3;y=(++x)+(++x); 则y=? 分析:先运算后取值,先 ...

  7. ThinkPHP系统变量,常量,序列化,反序列化,缓存

    变量的输出: 在模板中输出一个变量有两种形式:{$list.name} {$list[‘name’]} 在模板中可以使用系统变量,以$Think.开头 系统变量:(举例选几个) 获得服务器的IP地址: ...

  8. 数据库-MYSQL安装配置和删除

    * 课程回顾: * 完成注册和登陆的功能. * 准备的工作 * 技术.开源jar包 * 开发的功能使用MVC模式 * C:控制层(接收请求和从客户端发送过来的参数) * 接收参数(request对象) ...

  9. 以太坊系列之十六: 使用golang与智能合约进行交互

    以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...

  10. union-find算法Java实现

    package practice; /*在一个全是点的图中,循环选择两点连通,之后判断两点是否在同一通路*/ public class Testmain { public static void ma ...