公告:

公告是一个非常典型的示例,使用到ZhiqimDK基础模板(微内核、数据库映射、模板引擎、WEB容器和前端UI),下面分步骤介绍如何使用Zhiqim Studio、MySQL和ZhiqimManager组件编写一个公告工程。

公告功能描述

1、公告列表(/announcement.htm),分页显示公告列表,显示公告类型,公告标题,发布人,发布时间,已读/未读。

2、增加公告(/announcementAdd.htm),填写公告信息,前后端表单验证和数据库访问,同时使用WebSocket推送给操作员。

3、公告内容(/annContent.htm),显示公告详细内容,操作员查看后公告列表该公告变为已读。

4、公告回收站(/annRecylebin.htm),分页显示被回收公告。可对回收公告进行还原、删除操作。

5、操作员阅读公告列表(/read.htm),显示阅读该公告的操作员信息,提供模糊查询操作员功能。

一、组件下载
打开蚕云--下载--蚕云资源下载页面,在页面中选中zhiqim_manager下载该组件。
二、组件添加
  • 创建一个ZhiqimAnnouncement公告工程。
  • 将zhiqim_manager.jar包放入工程的lib文件夹内。
  • 选中zhiqim_manager.jar包,右键单击,选择Build Path,接着选中Add to Build Path单击。
三、组件配置
在目录下打开conf中context.xml文件添加配置。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ZHIQIM-CONTEXT PUBLIC "-//ZHIQIM //DTD Zhiqim-Context Configuration 1.4.0//EN" "http://zhiqim.zhiqim.com/dtd/zhiqim_context_1_3_0.dtd"> </zhiqim-context> <!-- 组件配置 --> <component name="管理台组件" path="/org/zhiqim/manager/resource/" /> </zhiqim-context>
四、添加公告视图(通过/document/留言本数据库字典.dbo设计)
一、创建公告表和公告操作员关联表,建立两张表的视图(视图连接的表可以为多个,用逗号隔开,如果需要和操作员表连接可以建立一张临时操作员表,避免生成DBO类):


二、添加视图连接:连接有三种方式(EQUAL表示内连接,LEFT表示左外连接,RIGHT表示右外连接)
三、添加视图字段(选中视图,右键添加字段):


四、配置和生成DBO(如图在dbo源码包中生成DBO类):
五、添加公告功能菜单
一、选中系统根菜单右键添加下级菜单办公,在办公下添加下级菜单公告填写好URL,生成菜单脚本:


六、组件效果展示
一、输入127.0.0.1网址并登录,运行后即可展示组件效果(见下图)
七、编写Action(以添加公告/announcementAdd.htm设计为例写一个Action,带有WebSocket功能)
一、Action配置(/resource/conf/context.xml):
<action name="增加公告" interceptor="chkZmrLogin" path="announcementAdd.htm" template="/ztmpl/zhiqimManager/template.htm" include="/zview/announcementAdd.zml" redirect="/announcement.htm" class="org.zhiqim.announcement.action.AnnouncementAddAction"/>
二、编写Action类(org.zhiqim.announcement.action.AnnouncementAddAction):
public class AnnouncementAddAction extends GetPostAction { protected void validate(HttpRequest request) { request.addValidate(new IsLen("announcementTitle", "标题不能为空且不超过64个字符", 1, 64)); request.addValidate(new IsLen("announcementType", "类型不能为空", 1, 16)); request.addValidate(new IsLen("announcementContent", "内容不能为空且不超过1024个字符", 1, 1024)); } protected void doGet(HttpRequest request) throws Exception { } protected void doPost(HttpRequest request) throws Exception { String title = request.getParameter("announcementTitle"); String type = request.getParameter("announcementType"); String content = request.getParameter("announcementContent"); String name = request.getSessionName(); String time = DateTimes.getDateTimeString(); Announcement announcement = new Announcement(); announcement.setAnnouncementId(Ids.longId()); announcement.setAnnouncementTitle(title); announcement.setAnnouncementType(type); announcement.setAnnouncementContent(content); announcement.setAnnouncementName(name); announcement.setAnnouncementTime(time); Global.get(ZTable.class).insert(announcement); //对所有连上来的WebSocket进行消息推送 HttpSessionManager manage = request.getContext().getSessionManager(); PageResult pageResult = manage.getSessionUserPage(1, manage.sizeUser()); for(HttpSessionUser temp : pageResult.list()) { List list = temp.getWebsocketConnection("announcement"); for(HttpWebsocketConnection con : list) { con.send("announcement_new"); } } } }
三、编写zml文件(resource/zview/announcementAdd.zml):
<table class="z-table z-bordered z-bg-white z-pd10 z-px14"> <tr class="z-h40"> <td colspan="2" class="z-bg-gray z-bold">增加公告</td> </tr> <tr class="z-h40"> <td width="40%"><span>公告标题:<span class="z-color-999">(公告标题不能为空,[1,64]范围)</span></span></td> <td width="60%"><input name="announcementTitle" class="z-h30 z-w300"><span class="z-text-red"> *</span></td> </tr> <tr class="z-h40"> <td width="40%">公告类型:<span class="z-color-999">(请选择)</span></td> <td width="60%"> <select name="announcementType" class="z-h30 z-w300" > <option >行政公告</option> <option >假日公告</option> <option >会议公告</option> <option >其他</option> </select> <span class="z-text-red"> *</span> </td> </tr> <tr class="z-h400"> <td colspan="2"> <span>公告内容:<span class="z-color-999">(公告内容不能为空且不超过1024个字符)<span class="z-text-red">*</span></span></span> <textarea name="announcementContent" class="z-w100p z-h300 z-mg-t20"></textarea> </td> </tr> <tr class="z-h80"> <td colspan="2"> <a href="/announcement.htm" style="margin-right:600px;">返回上一页</a> <button class="z-button z-large z-blue z-w150">提交</button> </td> </tr> </table>
四、编写context.zml文件(WebSocket示例):
<#--左边区域自定义块--> <#function zhiqim_manager_topnav_left_defined()> ${zhiqim_announcement_onload()} </#function> <#--公告加载--> <#function zhiqim_announcement_onload()> <script> Z.onload(function() { //1.首次登录如果有公告的,要求立即提醒 <#if sessionUser.getValue("announcement_close") != "true" && AnnouncementDao.hasNotReadAnn(request)> top.Z.alert("有未读的公告,请进入阅读,谢谢!", doClose); </#if> //2.建立WS,新公告时提醒 var ws = new WebSocket("ws://"+location.hostname+":"+location.port+"/service/ws", "announcement"); ws.onopen = function(){console.log("ws.onopen");}; ws.onclose = function(e){console.log("ws.onclose");}; ws.onerror = function(e){console.log("ws.onerror");}; ws.onmessage = function(e){console.log("ws.onmessage:"+e.data);if (e.data == "announcement_new"){top.Z.alert("有新的公告发布,请在方便的时候进入阅读,谢谢!",doClose);}}; }); function doClose() { var ajax = new Z.Ajax(); ajax.setClassName("sessionUser"); ajax.setMethodName("setValue"); ajax.addParam("announcement_close") ajax.addParam("true"); ajax.setSuccess(function(){Z.L.href("/announcement.htm", window.mainFrame);}); ajax.execute(); } </script> </#function>
八、公告调试

配置调试信息

  • 在Zhiqim Studio菜单下按钮表中点击爬虫图标右边的下拉钮找开Degug Configurations,或菜单中找开/Run/Degug Configurations。
  • 在Degug Configurations对话框中,从左侧Java Applition中右键New,得到一个新的Application,修改名称ZhiqimAnnouncement,选择Project为ZhiqimAnnouncement,选择Main class中点击Search找到Zhiqim。保存或运行,下次即可直接选择创建好的ZhiqimAnnouncement运行进入调试状态。
  • 未修改类结构(属性或方法名)时,只修改方法内代码,调试状态无需重启,极大方便定位问题

单步调试IndexAction

  • 在AnnouncementAddAction类的doPost方法中增加断点。
  • 在Degug模式下运行ZhiqimAnnouncement。
  • 通过F5/F6/F7/F8进行步骤跟踪,通过Variables视图查看对象值,通过Debug视图查看线程。
<-- debug配置 -->


<-- debug状态 -->

九、公告发布(导出执行程序和工程源码打包)
  • 选中工程[ZhiqimAnnouncement],右键找到[Export]。
  • 如下图一所示,找到[Zhiqim]下的[知启蒙工程]。
  • 如下图二所示,根据导出向导,配置发布路径,发布名称、源码JAR包名称、和导出源码工程名称等。
  • 点击[Finish],导出向导根据配置运行,生成执行程序、源码打包等(注意控制台打印日志)
  • 选择保存或运行了导出向导,会在[document/export]目录下自动生成或覆盖[project.exp.xml]导出配置文件,下次导出则无需再编写导出配置项。


十、公告运行(Windows和Linux)

配置[/conf/zhiqim.xml]文件

  • [boot.port]的端口必须空闲,默认50080,您可以修改该值。
  • [boot.home]的JDK根目录,如果配置了请保证JDK安装正确。如果根据环境变量[JAVA_HOME]来配置请删除[boot.home]配置项。

Windows运行

  • 点击zhiqim.exe即启动工程,弹出一个Windows的控制台并显示日志。
  • 点击控制台关闭按钮或按下Ctrl+C键关闭工程。

Linux运行

  • 如果zhiqim.xml文件在Linux下文件是乱码,请尝试在Windows下记事本重新另存为UTF-8或ANSI(GBK),再上传到Linux,或在Linux下使用VIM的:set fileencoding=utz-8/GBK修改成Linux设置的编码)
  • 在Linux环境下,首次给zhiqim.lix文件增加执行权限(chmod +x zhiqim.lix)。
  • 在控制台下执行./zhiqim.lix即运行,输出日志到nohup.out。
  • 执行./zhiqim.lix -c关闭工程。
<-- Windows下运行 -->


<-- Linux下运行 -->