Repository: zhiyuncloud/aixuexiao Branch: master Commit: 58cd5d35cca8 Files: 101 Total size: 150.8 KB Directory structure: gitextract__ax_k9m7/ ├── .classpath ├── .project ├── .settings/ │ ├── .jsdtscope │ ├── org.eclipse.core.resources.prefs │ ├── org.eclipse.jdt.core.prefs │ ├── org.eclipse.wst.common.component │ ├── org.eclipse.wst.common.project.facet.core.xml │ ├── org.eclipse.wst.jsdt.ui.superType.container │ └── org.eclipse.wst.jsdt.ui.superType.name ├── README.md ├── WebContent/ │ ├── META-INF/ │ │ └── MANIFEST.MF │ ├── WEB-INF/ │ │ ├── lib/ │ │ │ ├── aopalliance-1.0.jar │ │ │ ├── asm-3.3.1.jar │ │ │ ├── aspectjweaver.jar │ │ │ ├── c3p0-0.9.2-pre4.jar │ │ │ ├── cglib-2.2.2.jar │ │ │ ├── commons-logging-1.1.1.jar │ │ │ ├── dom4j-1.6.1.jar │ │ │ ├── javassist-3.17.1-GA.jar │ │ │ ├── jstl-1.2.jar │ │ │ ├── log4j-1.2.17.jar │ │ │ ├── mchange-commons-java-0.2.2.jar │ │ │ ├── mybatis-3.2.2.jar │ │ │ ├── mybatis-spring-1.2.0.jar │ │ │ ├── mysql-connector-java-5.1.19-bin.jar │ │ │ ├── slf4j-api-1.7.5.jar │ │ │ ├── slf4j-log4j12-1.7.5.jar │ │ │ ├── spring-aop-3.2.3.RELEASE.jar │ │ │ ├── spring-aspects-3.2.3.RELEASE.jar │ │ │ ├── spring-beans-3.2.3.RELEASE.jar │ │ │ ├── spring-context-3.2.3.RELEASE.jar │ │ │ ├── spring-core-3.2.3.RELEASE.jar │ │ │ ├── spring-expression-3.2.3.RELEASE.jar │ │ │ ├── spring-jdbc-3.2.3.RELEASE.jar │ │ │ ├── spring-orm-3.2.3.RELEASE.jar │ │ │ ├── spring-tx-3.2.3.RELEASE.jar │ │ │ ├── spring-web-3.2.3.RELEASE.jar │ │ │ ├── spring-webmvc-3.2.3.RELEASE.jar │ │ │ └── xstream-1.3.1.jar │ │ ├── springMVC-servlet.xml │ │ ├── views/ │ │ │ ├── addclasses.jsp │ │ │ ├── addclassesnews.jsp │ │ │ ├── addexam.jsp │ │ │ ├── addstudentmessage.jsp │ │ │ ├── addstudents.jsp │ │ │ ├── classes.jsp │ │ │ ├── common/ │ │ │ │ ├── css.jsp │ │ │ │ ├── js.jsp │ │ │ │ ├── navbar.jsp │ │ │ │ └── sidebar.jsp │ │ │ ├── examdetail.jsp │ │ │ ├── exams.jsp │ │ │ ├── login.jsp │ │ │ ├── messages.jsp │ │ │ ├── replys.jsp │ │ │ ├── students.jsp │ │ │ └── viewexam.jsp │ │ └── web.xml │ └── assets/ │ ├── css/ │ │ └── ace-fonts.css │ └── font/ │ └── FontAwesome.otf ├── app_aixuexiao.sql └── src/ ├── com/ │ └── aixuexiao/ │ ├── dao/ │ │ ├── BaseDao.java │ │ ├── ClassesDao.java │ │ ├── ClassesNewsDao.java │ │ ├── ExamDao.java │ │ ├── MessageDao.java │ │ ├── ReplyDao.java │ │ ├── StudentDao.java │ │ ├── StudentMessageDao.java │ │ └── sqlmap/ │ │ ├── ClassesMapper.xml │ │ ├── ClassesNewsMapper.xml │ │ ├── ExamMapper.xml │ │ ├── MessageMapper.xml │ │ ├── ReplyMapper.xml │ │ ├── StudentMapper.xml │ │ └── StudentMessageMapper.xml │ ├── model/ │ │ ├── Article.java │ │ ├── Classes.java │ │ ├── ClassesNews.java │ │ ├── Exam.java │ │ ├── ExamMark.java │ │ ├── Message.java │ │ ├── Reply.java │ │ ├── Student.java │ │ └── StudentMessage.java │ ├── service/ │ │ ├── ClassesService.java │ │ ├── ExamService.java │ │ ├── StudentService.java │ │ └── WeixinService.java │ ├── util/ │ │ ├── ExamUtil.java │ │ └── WeixinUtil.java │ └── web/ │ ├── controller/ │ │ ├── ClassesController.java │ │ ├── ExamController.java │ │ ├── LoginController.java │ │ ├── StudentController.java │ │ └── WeixinController.java │ └── interceptor/ │ └── ManagerInterceptor.java ├── db.properties ├── log4j.properties ├── spring.xml └── sqlMapConfig.xml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .classpath ================================================ ================================================ FILE: .project ================================================ aixuexiao org.eclipse.wst.jsdt.core.javascriptValidator org.eclipse.jdt.core.javabuilder org.eclipse.wst.common.project.facet.core.builder org.eclipse.wst.validation.validationbuilder org.eclipse.jem.workbench.JavaEMFNature org.eclipse.wst.common.modulecore.ModuleCoreNature org.eclipse.wst.common.project.facet.core.nature org.eclipse.jdt.core.javanature org.eclipse.wst.jsdt.core.jsNature ================================================ FILE: .settings/.jsdtscope ================================================ ================================================ FILE: .settings/org.eclipse.core.resources.prefs ================================================ eclipse.preferences.version=1 encoding//WebContent/WEB-INF/views/common/css.jsp=UTF-8 encoding//WebContent/WEB-INF/views/common/js.jsp=UTF-8 encoding//WebContent/WEB-INF/views/common/navbar.jsp=UTF-8 encoding//WebContent/WEB-INF/views/common/sidebar.jsp=UTF-8 ================================================ FILE: .settings/org.eclipse.jdt.core.prefs ================================================ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.6 ================================================ FILE: .settings/org.eclipse.wst.common.component ================================================ ================================================ FILE: .settings/org.eclipse.wst.common.project.facet.core.xml ================================================ ================================================ FILE: .settings/org.eclipse.wst.jsdt.ui.superType.container ================================================ org.eclipse.wst.jsdt.launching.baseBrowserLibrary ================================================ FILE: .settings/org.eclipse.wst.jsdt.ui.superType.name ================================================ Window ================================================ FILE: README.md ================================================ aixuexiao ========= 一个基于SAE Java平台的微信平台公众帐号应用例子。 详情访问:http://aixuexiao.sinaapp.com 微信公众帐号:爱学校(aixuexiao) 微信公众帐号功能为作为学生家长和学校老师之间的沟通桥梁。 学生家长可通过和微信公众帐号交互来获取学生在校的考试情况/班级动态/老师留言等信息。 当然需要学校老师在微信公众帐号后台添加学生留言/班级动态/考试信息等数据。 应用基于SAE Java平台开发,使用(Spring/SpringMVC/Mybatis)框架开发,有相同需求(在SAE Java平台搭建微信公众帐号后台)的同学可用拿去作为参考,当然也可用作为在SAE Java平台中使用框架的例子程序作为参考。 微信的验证和回复的入口程序在com.aixuexiao.web.controller.WeixinController.java中。 其中initWeixinURL(对应URL:/weixin GET)方法为验证方法。 replyMessage(对应URL:/weixin POST)方法则是回复方法。 直接下载本项目在SAE Java平台上搭建需要改动地方: 1.在你创建SAE应用的MySQL中执行应用根目录下的app_aixuexiao.sql文件(包括表结构和部分测试数据); 2.修改src下db.properties文件中的数据库信息ak、sk分别设置为你SAE应用中的ak和sk即可。 注:时间仓促且第一次使用SpringMVC,不优雅的代码敬请指出。 有任何问题可用联系我,看到第一时间回复 zhiyun.cloud@gmail.com @智云同学 ================================================ FILE: WebContent/META-INF/MANIFEST.MF ================================================ Manifest-Version: 1.0 Class-Path: ================================================ FILE: WebContent/WEB-INF/springMVC-servlet.xml ================================================ text/html;charset=UTF-8 ================================================ FILE: WebContent/WEB-INF/views/addclasses.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> Ӱ༶ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>
* 꼶Ϊ302 ${param.notice}
*
*
     
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/addclassesnews.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ༶̬ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>



${param.notice}
ʱ
${sta.index+1} ${cn.inserttime} ${cn.content}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/addexam.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ӿ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>

ѧ ѧ ע
${student.id } ${student.name }
     
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/addstudentmessage.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ΢ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>



${param.notice}
ʱ
${sta.index+1} ${message.inserttime} ${message.content}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/addstudents.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ѧ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>

     
${param.notice}

# ѧ ѧ ע
${sta.index+1} ${student.id} ${student.name} ${student.remark}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/classes.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ༶Ϣ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>
  ƣ    
ѧ
${classes.id} ${classes.name} ${classes.studentcount} ${classes.headteacher}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/common/css.jsp ================================================ ================================================ FILE: WebContent/WEB-INF/views/common/js.jsp ================================================ ================================================ FILE: WebContent/WEB-INF/views/common/navbar.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> ================================================ FILE: WebContent/WEB-INF/views/common/sidebar.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ================================================ FILE: WebContent/WEB-INF/views/examdetail.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>

ԿĿ ʱ ɼ Ծܷ ༶߷ ༶ͷ
${sta.index+1} ${em.exam.course} ${em.exam.examtime} ${em.mark} ${em.exam.fullmarks} ${em.exam.average} ${em.exam.topmark} ${em.exam.lowestmark} ${em.rank}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/exams.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> Ϣ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>
  Ŀ        ӿ
ԿĿ ԰༶ ߷ ͷ ʱ
${exam.id} ${exam.course} ${exam.classid} ${exam.fullmarks} ${exam.average} ${exam.topmark} ${exam.lowestmark} ${exam.examtime}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/login.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 爱学校

================================================ FILE: WebContent/WEB-INF/views/messages.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ΢ŽϢ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>
# MsgId MsgType FromUserName CreateTime Content
${st.index+1} ${message.msgId} ${message.msgType} ${message.fromUserName} ${message.createTime} ${message.content}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/replys.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ΢ŽϢ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>
# MsgType FromUserName CreateTime Content
${st.index+1} ${reply.msgType} ${reply.fromUserName} ${reply.createTime} ${reply.content}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/students.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> ѧϢ <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>
         
ѧ ѧ ע
${student.id} ${student.name} ${student.classid} ${student.remark}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/views/viewexam.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK"%> <%@include file="/WEB-INF/views/common/css.jsp" %> <%@ include file="/WEB-INF/views/common/navbar.jsp" %>
<%@ include file="/WEB-INF/views/common/sidebar.jsp" %>

ѧ ѧ ע
${em.studentid} ${em.studentname} ${em.rank} ${em.mark} ${em.remark}
<%@include file="/WEB-INF/views/common/js.jsp" %> ================================================ FILE: WebContent/WEB-INF/web.xml ================================================ aixuexiao index.jsp default /assets/* contextConfigLocation classpath:spring*.xml org.springframework.web.context.ContextLoaderListener springMVC org.springframework.web.servlet.DispatcherServlet 1 springMVC / ================================================ FILE: WebContent/assets/css/ace-fonts.css ================================================ /* included only when we don't want to use fonts from google server */ @font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 300; src: local('Open Sans Light'), local('OpenSans-Light'), url(../font/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff'); } @font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; src: local('Open Sans'), local('OpenSans'), url(../font/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); } ================================================ FILE: app_aixuexiao.sql ================================================ -- -- 表的结构 `class` -- CREATE TABLE IF NOT EXISTS `class` ( `id` smallint(5) unsigned NOT NULL COMMENT '班级编号,302表示三年级二班', `name` char(16) NOT NULL COMMENT '班级名称,三年级二班', `headteacher` char(8) NOT NULL COMMENT '班主任姓名', `studentcount` tinyint(4) NOT NULL COMMENT '学生数量', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- 转存表中的数据 `class` -- INSERT INTO `class` (`id`, `name`, `headteacher`, `studentcount`) VALUES (302, '三年级二班', '赖导', 7), (301, '三年级一班', '曾近荣', 7); -- -------------------------------------------------------- -- -- 表的结构 `class_news` -- CREATE TABLE IF NOT EXISTS `class_news` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '公告编号', `classid` int(10) unsigned NOT NULL COMMENT '考试班级', `content` varchar(128) NOT NULL, `inserttime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `index_class_news` (`classid`,`inserttime`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; -- -- 转存表中的数据 `class_news` -- INSERT INTO `class_news` (`id`, `classid`, `content`, `inserttime`) VALUES (1, 302, '大家好,三年级二班将于本周六举行家长会,届时请各位学生家长准时到达开会,谢谢!', '2013-08-21 10:42:04'), (2, 301, '各位学生家长注意了,最近有不少同学出现逃学的情况,还号称“逃学威龙”。', '2013-08-21 10:48:20'); -- -------------------------------------------------------- -- -- 表的结构 `exam` -- CREATE TABLE IF NOT EXISTS `exam` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '考试编号', `classid` int(10) unsigned NOT NULL COMMENT '考试班级', `course` char(8) NOT NULL COMMENT '科目', `examtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '考试时间', `fullmarks` decimal(4,1) NOT NULL COMMENT '满分', `average` decimal(4,1) DEFAULT NULL COMMENT '平均分', `topmark` decimal(4,1) DEFAULT NULL COMMENT '最高分', `lowestmark` decimal(4,1) DEFAULT NULL COMMENT '最低分', `remark` varchar(32) NOT NULL COMMENT '考试说明', PRIMARY KEY (`id`), KEY `index_exams` (`id`), KEY `index_classes` (`classid`,`course`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; -- -- 转存表中的数据 `exam` -- INSERT INTO `exam` (`id`, `classid`, `course`, `examtime`, `fullmarks`, `average`, `topmark`, `lowestmark`, `remark`) VALUES (1, 301, '英语', '2013-08-21 10:56:07', 100.0, 84.1, 100.0, 59.0, '精诚中学三年级二班下学期英语单元测验'), (2, 302, '数学', '2013-08-22 11:02:20', 100.0, 88.3, 100.0, 78.0, '数学单元测验'); -- -------------------------------------------------------- -- -- 表的结构 `exam_mark` -- CREATE TABLE IF NOT EXISTS `exam_mark` ( `classid` int(10) unsigned NOT NULL COMMENT '考试班级', `studentid` int(10) unsigned NOT NULL COMMENT '学生编号', `studentname` char(8) NOT NULL COMMENT '学生姓名', `examid` int(10) unsigned NOT NULL COMMENT '考试编号', `mark` decimal(4,1) NOT NULL COMMENT '分数', `examtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '考试时间', `rank` tinyint(4) DEFAULT NULL COMMENT '班级排名', `remark` varchar(32) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`classid`,`studentid`,`examid`), KEY `index_exam_mark` (`classid`,`studentid`,`studentname`,`examid`,`mark`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- 转存表中的数据 `exam_mark` -- INSERT INTO `exam_mark` (`classid`, `studentid`, `studentname`, `examid`, `mark`, `examtime`, `rank`, `remark`) VALUES (301, 3011, '周星星', 1, 59.0, '2013-08-21 10:56:07', 7, '逃课就是这个下场'), (301, 3013, '大飞', 1, 60.0, '2013-08-21 10:56:07', 6, '这次给你及格了'), (301, 3014, '黄小龟', 1, 84.0, '2013-08-21 10:56:07', 5, '好好学习天天向上'), (301, 3017, '林大岳', 1, 91.0, '2013-08-21 10:56:07', 4, '继续努力'), (301, 3012, '曹达华', 1, 97.0, '2013-08-21 10:56:07', 3, '不错,有进步'), (301, 3016, '汤朱迪', 1, 98.0, '2013-08-21 10:56:07', 2, '这次发挥有点小失常哟'), (301, 3015, '仙蒂', 1, 100.0, '2013-08-21 10:56:07', 1, '满分不错,值得表扬'), (302, 3027, '许博淳', 2, 78.0, '2013-08-22 11:02:20', 7, '要加油了'), (302, 3022, '柯景腾', 2, 80.0, '2013-08-22 11:02:20', 6, '上课认真听讲'), (302, 3024, '谢明和', 2, 87.0, '2013-08-22 11:02:20', 5, '好好学习天天向上'), (302, 3026, '胡家玮', 2, 88.0, '2013-08-22 11:02:20', 4, '继续努力'), (302, 3023, '曹国胜', 2, 90.0, '2013-08-22 11:02:20', 3, '有进步'), (302, 3025, '廖英宏', 2, 95.0, '2013-08-22 11:02:20', 2, '非常好'), (302, 3021, '沈佳宜', 2, 100.0, '2013-08-22 11:02:20', 1, '非常不错,好好保持'); -- -------------------------------------------------------- -- -- 表的结构 `message` -- CREATE TABLE IF NOT EXISTS `message` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `tousername` char(32) NOT NULL, `fromusername` char(32) NOT NULL, `msgtype` enum('TEXT','IMAGE','LOCATION','LINK','EVENT') NOT NULL, `createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `msgId` char(64) NOT NULL, `content` varchar(128) DEFAULT NULL, `picurl` varchar(128) DEFAULT NULL, `title` varchar(32) DEFAULT NULL, `description` varchar(128) DEFAULT NULL, `url` varchar(128) DEFAULT NULL, `locationx` char(10) DEFAULT NULL, `locationy` char(10) DEFAULT NULL, `scale` char(8) DEFAULT NULL, `label` varchar(32) DEFAULT NULL, `event` varchar(16) DEFAULT NULL, `eventkey` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_user` (`msgtype`,`tousername`,`fromusername`,`createtime`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- 表的结构 `reply` -- CREATE TABLE IF NOT EXISTS `reply` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `tousername` char(32) NOT NULL, `fromusername` char(32) NOT NULL, `msgtype` enum('TEXT','MUSIC','NEWS') NOT NULL, `createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `content` varchar(512) NOT NULL COMMENT '回复消息内容', `musicurl` varchar(128) DEFAULT NULL, `hqmusicurl` varchar(128) DEFAULT NULL, `articlecount` tinyint(4) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_user` (`msgtype`,`tousername`,`fromusername`,`createtime`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -- 表的结构 `reply_article` -- CREATE TABLE IF NOT EXISTS `reply_article` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `replyid` int(10) unsigned NOT NULL, `title` varchar(32) NOT NULL, `description` varchar(64) NOT NULL, `picurl` varchar(128) NOT NULL, `url` varchar(128) NOT NULL, PRIMARY KEY (`id`), KEY `index_replyid` (`replyid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; -- -- 表的结构 `student` -- CREATE TABLE IF NOT EXISTS `student` ( `id` int(10) unsigned NOT NULL COMMENT '学生学号,通常为班级编号加上序号,如3021', `classid` int(10) unsigned NOT NULL COMMENT '所属班级编号', `name` char(8) NOT NULL COMMENT '学生姓名', `remark` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_classes` (`classid`,`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- 转存表中的数据 `student` -- INSERT INTO `student` (`id`, `classid`, `name`, `remark`) VALUES (3021, 302, '沈佳宜', '佳宜(女主角)'), (3022, 302, '柯景腾', '柯腾(男主角)'), (3023, 302, '曹国胜', '老曹(柯腾的挚友)'), (3024, 302, '谢明和', '阿和(柯腾的挚友)'), (3025, 302, '廖英宏', '该边(柯腾的挚友)'), (3026, 302, '胡家玮', '弯弯(沈佳宜的好友)'), (3027, 302, '许博淳', '勃起(柯腾的挚友)'), (3011, 301, '周星星', '周星驰'), (3012, 301, '曹达华', '吴孟达'), (3013, 301, '大飞', '张耀扬'), (3014, 301, '黄小龟', '黄一山'), (3015, 301, '仙蒂', '朱茵'), (3016, 301, '汤朱迪', '梅艳芳'), (3017, 301, '林大岳', '黄秋生'); -- -------------------------------------------------------- -- -- 表的结构 `student_message` -- CREATE TABLE IF NOT EXISTS `student_message` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息编号', `studentid` int(10) unsigned NOT NULL COMMENT '学生编号', `inserttime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `content` varchar(128) NOT NULL, PRIMARY KEY (`id`), KEY `index_student_message` (`studentid`,`inserttime`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; -- -- 转存表中的数据 `student_message` -- INSERT INTO `student_message` (`id`, `studentid`, `inserttime`, `content`) VALUES (1, 3011, '2013-08-21 11:09:44', '不准逃课'), (2, 3021, '2013-08-22 10:56:15', '好好学习天天向上哈'); ================================================ FILE: src/com/aixuexiao/dao/BaseDao.java ================================================ package com.aixuexiao.dao; import javax.annotation.Resource; import org.mybatis.spring.SqlSessionTemplate; public class BaseDao { @Resource(name="readSqlSession") public SqlSessionTemplate readSqlSession; @Resource(name="writerSqlSession") public SqlSessionTemplate writerSqlSession; } ================================================ FILE: src/com/aixuexiao/dao/ClassesDao.java ================================================ package com.aixuexiao.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.aixuexiao.model.Classes; @Component("classesDao") public class ClassesDao extends BaseDao { public List findAllClasses() { return this.readSqlSession.selectList("com.aixuexiao.dao.ClassesDao.selectAllClasses"); } public List findClasses(int start,int size,Classes classes) { Map map = new HashMap(); map.put("start", start); map.put("size", size); map.put("classes", classes); return this.readSqlSession.selectList("com.aixuexiao.dao.ClassesDao.selectClasses",map); } public void addClasses(Classes classes){ writerSqlSession.insert("com.aixuexiao.dao.ClassesDao.addClasses", classes); } public Classes findClassesById(int id){ return readSqlSession.selectOne("com.aixuexiao.dao.ClassesDao.selectClassesById", id); } public void updateClassStudentCount(int classid){ writerSqlSession.update("com.aixuexiao.dao.ClassesDao.updateClassStudentCount", classid); } } ================================================ FILE: src/com/aixuexiao/dao/ClassesNewsDao.java ================================================ package com.aixuexiao.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.aixuexiao.model.Classes; import com.aixuexiao.model.ClassesNews; @Component("classesNewsDao") public class ClassesNewsDao extends BaseDao { public List findClassesNewsByClassId(int classid,int limit) { Map map = new HashMap(); map.put("classid", classid); map.put("limit", limit); return this.readSqlSession.selectList("com.aixuexiao.dao.ClassesNewsDao.selectClassesNewsByClassId",map); } public void addClassesNews(ClassesNews classesNews){ writerSqlSession.insert("com.aixuexiao.dao.ClassesNewsDao.addClassesNews", classesNews); } public void deleteClassesNewsById(int id){ writerSqlSession.delete("com.aixuexiao.dao.ClassesNewsDao.deleteClassesNewsById", id); } } ================================================ FILE: src/com/aixuexiao/dao/ExamDao.java ================================================ package com.aixuexiao.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.aixuexiao.model.Classes; import com.aixuexiao.model.Exam; import com.aixuexiao.model.ExamMark; @Component("examDao") public class ExamDao extends BaseDao { public List findExamMarkByStudentId(int studentid,int limit) { Map map = new HashMap(); map.put("studentid", studentid); map.put("limit", limit); return this.readSqlSession.selectList("com.aixuexiao.dao.ExamDao.selectExamMarkByStudentId",map); } public List findExam(int start,int size,Exam exam){ Map map = new HashMap(); map.put("start", start); map.put("size", size); map.put("exam", exam); return this.readSqlSession.selectList("com.aixuexiao.dao.ExamDao.selectExam",map); } public void addExam(Exam exam){ writerSqlSession.insert("com.aixuexiao.dao.ExamDao.addExam", exam); } public void addExamMark(ExamMark examMark){ writerSqlSession.insert("com.aixuexiao.dao.ExamDao.addExamMark", examMark); } public Exam findExamById(int id){ return this.readSqlSession.selectOne("com.aixuexiao.dao.ExamDao.selectExamById",id); } } ================================================ FILE: src/com/aixuexiao/dao/MessageDao.java ================================================ package com.aixuexiao.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.aixuexiao.model.Message; @Component("messageDao") public class MessageDao extends BaseDao { public int addMessage(Message message) { return this.writerSqlSession.insert("com.aixuexiao.dao.MessageDao.addMessage", message); } public List findMessage(int start,int size) { Map map = new HashMap(); map.put("start", start); map.put("size", size); return this.readSqlSession.selectList("com.aixuexiao.dao.MessageDao.selectMessage",map); } } ================================================ FILE: src/com/aixuexiao/dao/ReplyDao.java ================================================ package com.aixuexiao.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.aixuexiao.model.Article; import com.aixuexiao.model.Reply; @Component("replyDao") public class ReplyDao extends BaseDao { public void addReply(Reply reply) { this.writerSqlSession.insert("com.aixuexiao.dao.ReplyDao.addReply", reply); } public void addArticle(Article article){ this.writerSqlSession.insert("com.aixuexiao.dao.ReplyDao.addArticle", article); } public List findReply(int start,int size) { Map map = new HashMap(); map.put("start", start); map.put("size", size); return this.readSqlSession.selectList("com.aixuexiao.dao.ReplyDao.selectReply",map); } } ================================================ FILE: src/com/aixuexiao/dao/StudentDao.java ================================================ package com.aixuexiao.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.aixuexiao.model.Student; @Component("studentDao") public class StudentDao extends BaseDao { public Student findStudentById(int id) { return this.readSqlSession.selectOne("com.aixuexiao.dao.StudentDao.selectStudentById",id); } public List findStudent(int start,int size,Student student) { Map map = new HashMap(); map.put("start", start); map.put("size", size); map.put("student", student); return this.readSqlSession.selectList("com.aixuexiao.dao.StudentDao.selectStudent",map); } public List findStudentByClassesId(int classesid) { return this.readSqlSession.selectList("com.aixuexiao.dao.StudentDao.selectStudentByClassesId",classesid); } public int addStudent(Student student) { return this.writerSqlSession.insert("com.aixuexiao.dao.StudentDao.addStudent", student); } public int deleteStudentById(int studentid) { return this.writerSqlSession.delete("com.aixuexiao.dao.StudentDao.deleteStudentById", studentid); } public int updateStudent(Student student) { return this.writerSqlSession.update("com.aixuexiao.dao.StudentDao.updateStudent", student); } } ================================================ FILE: src/com/aixuexiao/dao/StudentMessageDao.java ================================================ package com.aixuexiao.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import com.aixuexiao.model.Message; import com.aixuexiao.model.StudentMessage; @Component("studentMessageDao") public class StudentMessageDao extends BaseDao { public List findStudentMessageByStudentId(int studentid,int limit) { Map map = new HashMap(); map.put("studentid", studentid); map.put("limit", limit); return this.readSqlSession.selectList("com.aixuexiao.dao.StudentMessageDao.selectStudentMessageByStudentId",map); } public int addStudentMessage(StudentMessage studentMessage) { return this.writerSqlSession.insert("com.aixuexiao.dao.StudentMessageDao.addStudentMessage", studentMessage); } public int deleteStudentMessageById(int id) { return this.writerSqlSession.delete("com.aixuexiao.dao.StudentMessageDao.deleteStudentMessageById", id); } } ================================================ FILE: src/com/aixuexiao/dao/sqlmap/ClassesMapper.xml ================================================ update class set studentcount = (select count(id) from student where classid = #{id}) where id = #{id} insert into class (id,name,headteacher,studentcount) values(#{id},#{name},#{headteacher},#{studentcount}) ================================================ FILE: src/com/aixuexiao/dao/sqlmap/ClassesNewsMapper.xml ================================================ insert into class_news (classid,content,inserttime ) values(#{classid},#{content},#{inserttime}) delete from class_news where id = #{id} ================================================ FILE: src/com/aixuexiao/dao/sqlmap/ExamMapper.xml ================================================ SELECT LAST_INSERT_ID() AS id insert into exam (classid,course,examtime,fullmarks,average,topmark,lowestmark,remark) values(#{classid},#{course},#{examtime},#{fullmarks},#{average},#{topmark},#{lowestmark},#{remark}) insert into exam_mark (examid,classid,studentid,studentname,examtime,mark,rank,remark) values(#{examid},#{classid},#{studentid},#{studentname},#{examtime},#{mark},#{rank},#{remark}) ================================================ FILE: src/com/aixuexiao/dao/sqlmap/MessageMapper.xml ================================================ insert into message (tousername,fromusername,msgtype,createtime,msgid,content,picurl,title,description,url,locationx,locationy,scale,label,event,eventkey) values(#{toUserName},#{fromUserName},#{msgType},#{createTime},#{msgId},#{content},#{picUrl},#{title},#{description},#{url},#{locationX},#{locationY},#{scale},#{label},#{event},#{eventKey}) ================================================ FILE: src/com/aixuexiao/dao/sqlmap/ReplyMapper.xml ================================================ SELECT LAST_INSERT_ID() AS id insert into reply(tousername,fromusername,msgtype,createtime,content,musicurl,hqmusicurl,articlecount) values (#{toUserName},#{fromUserName},#{msgType},#{createTime},#{content},#{musicUrl},#{hQMusicUrl},#{articleCount}) INSERT INTO reply_article (replyid,title,description,picurl,url ) VALUES(#{replyId},#{title},#{description},#{picUrl},#{url}) ================================================ FILE: src/com/aixuexiao/dao/sqlmap/StudentMapper.xml ================================================ update student set classid=#{classid},name=#{name},remark=#{remark} where id = #{id} insert into student (id,classid,name,remark ) values(#{id},#{classid},#{name},#{remark}) delete from student where id = #{id} ================================================ FILE: src/com/aixuexiao/dao/sqlmap/StudentMessageMapper.xml ================================================ insert into student_message (studentid,content,inserttime ) values(#{studentid},#{content},#{inserttime}) delete from student_message where id = #{id} ================================================ FILE: src/com/aixuexiao/model/Article.java ================================================ package com.aixuexiao.model; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamOmitField; /** * 图文消息 * @author lizy */ public class Article { @XStreamOmitField private int id;//数据库存储的id // 图文消息名称 @XStreamAlias("Title") private String title; // 图文消息描述 @XStreamAlias("Description") private String description; // 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致 @XStreamAlias("PicUrl") private String picUrl; // 点击图文消息跳转链接 @XStreamAlias("Url") private String url; @XStreamOmitField private int replyId; private Reply reply; public Article() {} public Article(String title, String description, String picUrl, String url) { this.title = title; this.description = description; this.picUrl = picUrl; this.url = url; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPicUrl() { return picUrl; } public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getReplyId() { return replyId; } public void setReplyId(int replyId) { this.replyId = replyId; } public Reply getReply() { return reply; } public void setReply(Reply reply) { this.reply = reply; } } ================================================ FILE: src/com/aixuexiao/model/Classes.java ================================================ package com.aixuexiao.model; import java.io.Serializable; /** * 班级实体 */ public class Classes implements Serializable { /** * 班级编号 */ private int id; /** * 班级名称 如: 三年级二班 */ private String name; /** * 班主任 */ private String headteacher; /** * 学生数量 */ private int studentcount; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getHeadteacher() { return headteacher; } public void setHeadteacher(String headteacher) { this.headteacher = headteacher; } public int getStudentcount() { return studentcount; } public void setStudentcount(int studentcount) { this.studentcount = studentcount; } } ================================================ FILE: src/com/aixuexiao/model/ClassesNews.java ================================================ package com.aixuexiao.model; import java.io.Serializable; import java.util.Date; /** * 班级动态 */ public class ClassesNews implements Serializable { /** * 公告编号 */ private int id; /** * 班级编号 */ private int classid; /** * 公告内容 */ private String content; /** * 发布时间 */ private Date inserttime; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getClassid() { return classid; } public void setClassid(int classid) { this.classid = classid; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getInserttime() { return inserttime; } public void setInserttime(Date inserttime) { this.inserttime = inserttime; } } ================================================ FILE: src/com/aixuexiao/model/Exam.java ================================================ package com.aixuexiao.model; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * 考试实体 */ public class Exam implements Serializable { /** * 考试编号 */ private int id; /** * 班级编号 */ private int classid; /** * 考试科目 */ private String course; /** * 考试时间 */ private Date examtime; /** * 考试满分 */ private BigDecimal fullmarks; /** * 平均分 */ private BigDecimal average; /** * 最高分 */ private BigDecimal topmark; /** * 最低分 */ private BigDecimal lowestmark; /** * 考试备注 */ private String remark; /** * 考试的成绩列表 */ private List examMarks; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getClassid() { return classid; } public void setClassid(int classid) { this.classid = classid; } public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } public Date getExamtime() { return examtime; } public void setExamtime(Date examtime) { this.examtime = examtime; } public BigDecimal getFullmarks() { return fullmarks; } public void setFullmarks(BigDecimal fullmarks) { this.fullmarks = fullmarks; } public BigDecimal getAverage() { return average; } public void setAverage(BigDecimal average) { this.average = average; } public BigDecimal getTopmark() { return topmark; } public void setTopmark(BigDecimal topmark) { this.topmark = topmark; } public BigDecimal getLowestmark() { return lowestmark; } public void setLowestmark(BigDecimal lowestmark) { this.lowestmark = lowestmark; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public List getExamMarks() { return examMarks; } public void setExamMarks(List examMarks) { this.examMarks = examMarks; } } ================================================ FILE: src/com/aixuexiao/model/ExamMark.java ================================================ package com.aixuexiao.model; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** * 考试分数 */ public class ExamMark implements Serializable,Comparable { /** * 考试编号 */ private int examid; /** * 班级编号 */ private int classid; /** * 学生编号 */ private int studentid; /** * 学生姓名 */ private String studentname; /** * 考试时间 */ private Date examtime; /** * 分数 */ private BigDecimal mark; /** * 排名 */ private int rank; /** * 考试备注 */ private String remark; /** * 所属考试实体 */ private Exam exam; public int getExamid() { return examid; } public void setExamid(int examid) { this.examid = examid; } public int getClassid() { return classid; } public void setClassid(int classid) { this.classid = classid; } public int getStudentid() { return studentid; } public void setStudentid(int studentid) { this.studentid = studentid; } public Date getExamtime() { return examtime; } public void setExamtime(Date examtime) { this.examtime = examtime; } public BigDecimal getMark() { return mark; } public void setMark(BigDecimal mark) { this.mark = mark; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Exam getExam() { return exam; } public void setExam(Exam exam) { this.exam = exam; } public String getStudentname() { return studentname; } public void setStudentname(String studentname) { this.studentname = studentname; } @Override public int compareTo(ExamMark em) { return this.mark.compareTo(em.mark); } @Override public String toString() { return "ExamMark [examid=" + examid + ", classid=" + classid + ", studentid=" + studentid + ", examtime=" + examtime + ", mark=" + mark + ", rank=" + rank + ", remark=" + remark + ", exam=" + exam + "]"; } } ================================================ FILE: src/com/aixuexiao/model/Message.java ================================================ package com.aixuexiao.model; import java.io.Serializable; import java.util.Date; import com.thoughtworks.xstream.annotations.XStreamOmitField; /** * 微信消息(服务端接收到的) * @author lizy */ public class Message implements Serializable{ public static final String TEXT = "text"; public static final String IMAGE = "image"; public static final String LOCATION = "location"; public static final String LINK = "link"; public static final String EVENT = "event"; @XStreamOmitField private int id;//数据库存储的id // 开发者微信号 private String toUserName; // 发送方帐号(一个OpenID) private String fromUserName; // 消息创建时间 private Date createTime; // 消息类型(text/image/location/link) private String msgType; // 消息id,64位整型 private String msgId; // 消息内容 (文本消息专有) private String content; //图片链接 (图片消息专有) private String picUrl; // 消息标题 (链接消息专有) private String title; // 消息描述 (链接消息专有) private String description; // 消息链接 (链接消息专有) private String url; //地理位置纬度 Location_X(地理位置专有) private String locationX; //地理位置经度 Location_Y(地理位置专有) private String locationY; // 地图缩放大小 (地理位置专有) private String scale; // 地理位置信息 (地理位置专有) private String label; //事件类型,subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件) (事件推送专有) private String event; //事件KEY值,与自定义菜单接口中KEY值对应(事件推送专有) private String eventKey; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getToUserName() { return toUserName; } public void setToUserName(String toUserName) { this.toUserName = toUserName; } public String getFromUserName() { return fromUserName; } public void setFromUserName(String fromUserName) { this.fromUserName = fromUserName; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getMsgType() { return msgType; } public void setMsgType(String msgType) { this.msgType = msgType; } public String getMsgId() { return msgId; } public void setMsgId(String msgId) { this.msgId = msgId; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getPicUrl() { return picUrl; } public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getLocationX() { return locationX; } public void setLocationX(String locationX) { this.locationX = locationX; } public String getLocationY() { return locationY; } public void setLocationY(String locationY) { this.locationY = locationY; } public String getScale() { return scale; } public void setScale(String scale) { this.scale = scale; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getEvent() { return event; } public void setEvent(String event) { this.event = event; } public String getEventKey() { return eventKey; } public void setEventKey(String eventKey) { this.eventKey = eventKey; } } ================================================ FILE: src/com/aixuexiao/model/Reply.java ================================================ package com.aixuexiao.model; import java.io.Serializable; import java.util.Date; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamOmitField; /** * 回复用户的消息 * @author lizy */ public class Reply implements Serializable { public static final String TEXT = "text"; public static final String MUSIC = "music"; public static final String NEWS = "news"; public static final String ERROR_CONTENT = "查询失败,请检查你的回复是否正确。\n查询最近考试情况请回复:学号_考试(如:3021_考试)\n 查询最近最近10次考试情况请回复:学号_考试历史(如:3021_考试历史)\n 查询老师留言情况请回复:学号_留言(如:3021_留言)\n查询老师留言记录(最近10次)情况请回复:学号_留言历史(如:3021_留言历史)\n\n 查询班级动态情况请回复:学号_动态(如:3021_动态)\n查询班级动态记录(最近10次)情况请回复:学号_动态历史(如:3021_动态历史)\n"; public static final String WELCOME_CONTENT = "欢迎订阅爱学校,你可以回复指定内容来了解学生考试情况,老师留言和班级动态。\n查询最近考试情况请回复:学号_考试(如:3021_考试)\n 查询最近最近10次考试情况请回复:学号_考试历史(如:3021_考试历史)\n 查询老师留言情况请回复:学号_留言(如:3021_留言)\n查询老师留言记录(最近10次)情况请回复:学号_留言历史(如:3021_留言历史)\n\n 查询班级动态情况请回复:学号_动态(如:3021_动态)\n查询班级动态记录(最近10次)情况请回复:学号_动态历史(如:3021_动态历史)\n"; @XStreamOmitField private int id;//数据库存储id // 开发者微信号 @XStreamAlias("ToUserName") private String toUserName; // 发送方帐号(一个OpenID) @XStreamAlias("FromUserName") private String fromUserName; // 消息创建时间 @XStreamAlias("CreateTime") private Date createTime; // 消息类型(text/music/news) @XStreamAlias("MsgType") private String msgType; //回复的消息内容,长度不超过2048字节 (文本消息专有) @XStreamAlias("Content") private String content; //音乐链接 (音乐消息专有) @XStreamAlias("MusicUrl") private String musicUrl; //高质量音乐链接,WIFI环境优先使用该链接播放音乐 (音乐消息专有) @XStreamAlias("HQMusicUrl") private String hQMusicUrl; //图文消息个数,限制为10条以内 (图文消息专有) @XStreamAlias("ArticleCount") private int articleCount; //多条图文消息信息,默认第一个item为大图 @XStreamAlias("Articles") private List
articles; public static void main(String[] args) { System.out.println("http://mmsns.qpic.cn/mmsns/UKMLIAeREF9IyZGhfvF8f0CAKDzEvXwCibLKUM4kmsfGnZvFM7EJlrg/0".length()); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getToUserName() { return toUserName; } public void setToUserName(String toUserName) { this.toUserName = toUserName; } public String getFromUserName() { return fromUserName; } public void setFromUserName(String fromUserName) { this.fromUserName = fromUserName; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getMsgType() { return msgType; } public void setMsgType(String msgType) { this.msgType = msgType; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getMusicUrl() { return musicUrl; } public void setMusicUrl(String musicUrl) { this.musicUrl = musicUrl; } public String gethQMusicUrl() { return hQMusicUrl; } public void sethQMusicUrl(String hQMusicUrl) { this.hQMusicUrl = hQMusicUrl; } public int getArticleCount() { return articleCount; } public void setArticleCount(int articleCount) { this.articleCount = articleCount; } public List
getArticles() { return articles; } public void setArticles(List
articles) { this.articles = articles; } } ================================================ FILE: src/com/aixuexiao/model/Student.java ================================================ package com.aixuexiao.model; import java.io.Serializable; /** * 学生实体 */ public class Student implements Serializable { /** * 学生编号 */ private int id; /** * 班级编号 */ private int classid; /** * 学生姓名 */ private String name; /** * 备注 */ private String remark; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getClassid() { return classid; } public void setClassid(int classid) { this.classid = classid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } } ================================================ FILE: src/com/aixuexiao/model/StudentMessage.java ================================================ package com.aixuexiao.model; import java.io.Serializable; import java.util.Date; /** * 给学生的留言 */ public class StudentMessage implements Serializable { /** * 留言编号 */ private int id; /** * 学生编号 */ private int studentid; /** * 公告内容 */ private String content; /** * 发布时间 */ private Date inserttime; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getStudentid() { return studentid; } public void setStudentid(int studentid) { this.studentid = studentid; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getInserttime() { return inserttime; } public void setInserttime(Date inserttime) { this.inserttime = inserttime; } } ================================================ FILE: src/com/aixuexiao/service/ClassesService.java ================================================ package com.aixuexiao.service; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.aixuexiao.dao.ClassesDao; import com.aixuexiao.dao.ClassesNewsDao; import com.aixuexiao.dao.StudentDao; import com.aixuexiao.model.Classes; import com.aixuexiao.model.ClassesNews; import com.aixuexiao.model.Student; @Service("classesService") public class ClassesService { @Resource(name="studentDao") private StudentDao studentDao; @Resource(name="classesDao") private ClassesDao classesDao; @Resource(name="classesNewsDao") private ClassesNewsDao classesNewsDao; /** * 将数据库中Classes数据分页查出 * @param start 其实数据条数 * @param size 展示数据每页的大小 */ public List listClasses(int start,int size,Classes classes){ return classesDao.findClasses(start, size,classes); } public void deleteClassesNewsById(int id){ classesNewsDao.deleteClassesNewsById(id); } /** * 添加班级动态到数据库 * @param classesNews */ public void addClassesNews(ClassesNews classesNews){ classesNewsDao.addClassesNews(classesNews); } /** * 获取指定班级的班级动态(钱1000个) * @param classid 班级id * @return */ public List findClassesNewsByClassId(int classid){ return classesNewsDao.findClassesNewsByClassId(classid, 1000); } /** * 添加班级到数据库中 * @param classes 班级对象 */ public void addClasses(Classes classes){ classesDao.addClasses(classes); } /** * 根据id查找对应的Classes对象 * @param id 班级编号 * @return */ public Classes findClassesById(int id){ return classesDao.findClassesById(id); } /** * 根据学生编号查找对应的学生 * @param studentid 学生编号 * @return 学生数据 */ public Student findStudentById(int studentid){ return studentDao.findStudentById(studentid); } /** * 根据班级id查找对应班级所有学生 * @param classesid 班级id * @return */ public List findStudentByClassesId(int classesid){ return studentDao.findStudentByClassesId(classesid); } /** * 添加学生信息至数据库中 * @param student 学生对象 */ public void addStudent(Student student){ studentDao.addStudent(student); } /** * 删除数据库中对应id的学生信息 * @param student 学生对象 */ public void deleteStudentById(int studentid){ studentDao.deleteStudentById(studentid); } /** * 自动更新指定班级的学生数量 * @param classid 班级id */ public void updateClassStudentCount(int classid){ classesDao.updateClassStudentCount(classid); } public void updateStudentBy(Student student) { studentDao.updateStudent(student); } } ================================================ FILE: src/com/aixuexiao/service/ExamService.java ================================================ package com.aixuexiao.service; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.aixuexiao.dao.ClassesDao; import com.aixuexiao.dao.ExamDao; import com.aixuexiao.dao.StudentDao; import com.aixuexiao.model.Classes; import com.aixuexiao.model.Exam; import com.aixuexiao.model.ExamMark; import com.aixuexiao.model.Student; @Service("examService") public class ExamService { @Resource(name="studentDao") private StudentDao studentDao; @Resource(name="classesDao") private ClassesDao classesDao; @Resource(name="examDao") private ExamDao examDao; /** * 保存考试信息 * @param exam */ public void addExam(Exam exam){ examDao.addExam(exam); for(ExamMark em:exam.getExamMarks()){ em.setExamid(exam.getId()); examDao.addExamMark(em); } } /** * 根据考试id查找数据库中考试信息 * @param id * @return */ public Exam findExamById(int id){ return examDao.findExamById(id); } /** * 将数据库中Student数据分页查出 * @param start 其实数据条数 * @param size 展示数据每页的大小 */ public List listExam(int start,int size,Exam exam){ return examDao.findExam(start,size,exam); } public List findStudentByClassesId(int classesid) { return studentDao.findStudentByClassesId(classesid); } /** * 根据学生编号查找对应的学生 * @param studentid 学生编号 * @return 学生数据 */ public Student findStudentById(int studentid){ return studentDao.findStudentById(studentid); } /** * 将数据库中Classes数据全部查出 */ public List findAllClasses(){ return classesDao.findAllClasses(); } } ================================================ FILE: src/com/aixuexiao/service/StudentService.java ================================================ package com.aixuexiao.service; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.aixuexiao.dao.ClassesDao; import com.aixuexiao.dao.ExamDao; import com.aixuexiao.dao.StudentDao; import com.aixuexiao.dao.StudentMessageDao; import com.aixuexiao.model.Classes; import com.aixuexiao.model.ExamMark; import com.aixuexiao.model.Student; import com.aixuexiao.model.StudentMessage; @Service("studentService") public class StudentService { @Resource(name="studentDao") private StudentDao studentDao; @Resource(name="classesDao") private ClassesDao classesDao; @Resource(name="studentMessageDao") private StudentMessageDao studentMessageDao; @Resource(name="examDao") private ExamDao examDao; /** * 根据学生编号查找对应的考试信息 * @param id 学生编号 * @param limit * @return */ public List findExamMarkByStudentId(int id ,int limit){ return examDao.findExamMarkByStudentId(id, limit); } /** * 将数据库中Student数据分页查出 * @param start 其实数据条数 * @param size 展示数据每页的大小 */ public List listStudent(int start,int size,Student student){ return studentDao.findStudent(start,size,student); } /** * 根据学生编号查找对应的学生 * @param studentid 学生编号 * @return 学生数据 */ public Student findStudentById(int studentid){ return studentDao.findStudentById(studentid); } /** * 添加老师给学生的微信留言到数据库 * @param studentMessage */ public void addStudentMessage(StudentMessage studentMessage){ studentMessageDao.addStudentMessage(studentMessage); } /** * 根据id删除老师给学生的微信留言 * @param id */ public void deleteStudentMessageById(int id){ studentMessageDao.deleteStudentMessageById(id); } /** * 将数据库中Classes数据全部查出 */ public List findAllClasses(){ return classesDao.findAllClasses(); } /** * 根据学生id查询对应学生的留言记录 * @param studentid 学生id * @param limit 展示数据每页的大小 */ public List listMessageByStudentId(int studentid,int limit){ return studentMessageDao.findStudentMessageByStudentId(studentid, limit); } } ================================================ FILE: src/com/aixuexiao/service/WeixinService.java ================================================ package com.aixuexiao.service; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.aixuexiao.dao.ClassesNewsDao; import com.aixuexiao.dao.ExamDao; import com.aixuexiao.dao.MessageDao; import com.aixuexiao.dao.ReplyDao; import com.aixuexiao.dao.StudentDao; import com.aixuexiao.dao.StudentMessageDao; import com.aixuexiao.model.Article; import com.aixuexiao.model.ClassesNews; import com.aixuexiao.model.Exam; import com.aixuexiao.model.ExamMark; import com.aixuexiao.model.Message; import com.aixuexiao.model.Reply; import com.aixuexiao.model.Student; import com.aixuexiao.model.StudentMessage; @Service("weixinService") public class WeixinService { @Resource(name="messageDao") private MessageDao messageDao; @Resource(name="replyDao") private ReplyDao replyDao; @Resource(name="examDao") private ExamDao examDao; @Resource(name="studentDao") private StudentDao studentDao; @Resource(name="studentMessageDao") private StudentMessageDao studentMessageDao; @Resource(name="classesNewsDao") private ClassesNewsDao classesNewsDao; /** * 查询学生最近一次考试情况 * @param studentid 学生编号 * @return 返回考试情况字符串 */ public String getSingleExamMarkStringByStudentId(int studentid){ StringBuilder sb = new StringBuilder(); Student student = studentDao.findStudentById(studentid); if(student == null){ sb.append("您好,未找到编号为").append(studentid).append("的学生!"); }else{ List list = examDao.findExamMarkByStudentId(studentid, 1); sb.append("您好,编号为").append(studentid).append("的学生(").append(student.getName()); if(list == null || list.size()<1 || list.get(0).getExam()==null){ sb.append(")无考试记录!"); }else{ ExamMark em = list.get(0); Exam e = em.getExam(); DateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); sb.append(")最近一次考试记录如下:\n").append("科目:").append(e.getCourse()) .append("\n分数:").append(em.getMark()) .append("\n班级排名:").append(em.getRank()) .append("\n考试时间:").append(sf.format(em.getExamtime())) .append("\n老师备注:").append(em.getRemark()) .append("\n试卷满分:").append(e.getFullmarks()) .append("\n班级均分:").append(e.getAverage()) .append("\n班级最高分:").append(e.getTopmark()) .append("\n班级最低分:").append(e.getLowestmark()) .append("\n考试说明:").append(e.getRemark()); } } return sb.toString(); } /** * 查询学生历次考试情况(最近10次) * @param studentid 学生编号 * @return 返回考试情况字符串 */ public String getExamMarkHistoryStringByStudentId(int studentid){ StringBuilder sb = new StringBuilder(); Student student = studentDao.findStudentById(studentid); if(student == null){ sb.append("您好,未找到编号为").append(studentid).append("的学生!"); }else{ sb.append("您好,编号为").append(studentid).append("的学生(").append(student.getName()); List list = examDao.findExamMarkByStudentId(studentid, 10); if(list == null || list.size()<1 || list.get(0).getExam()==null){ sb.append(")无考试记录!"); }else{ DateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Exam e = null; sb.append(")最近10次考试情况如下:"); for(ExamMark em : list){ e = em.getExam(); sb.append("\n考试时间:").append(sf.format(em.getExamtime())) .append("\n科目:").append(e.getCourse()) .append("\n分数:").append(em.getMark()) .append("\n班级排名:").append(em.getRank()) .append("\n老师备注:").append(em.getRemark()) .append("\n试卷满分:").append(e.getFullmarks()) .append("\n班级均分:").append(e.getAverage()) .append("\n班级最高分:").append(e.getTopmark()) .append("\n班级最低分:").append(e.getLowestmark()) .append("\n考试说明:").append(e.getRemark()) .append("\n------分割线-------"); } } } return sb.toString(); } /** * 根据学生编号查询学生最近的老师留言信息 * @param studentid 学生编号 * @return 以字符串形式返回老师留言信息 */ public String getSingleStudentMessageByStudentId(int studentid){ StringBuilder sb = new StringBuilder(); Student student = studentDao.findStudentById(studentid); if(student == null){ sb.append("您好,未找到编号为").append(studentid).append("的学生!"); }else{ sb.append("您好,编号为").append(studentid).append("的学生(").append(student.getName()); List list = studentMessageDao.findStudentMessageByStudentId(studentid, 1); if(list == null || list.size()<1 ){ sb.append(")无老师留言!"); }else{ sb.append(")最近老师留言如下:"); DateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); StudentMessage sm = list.get(0); sb.append("\n留言时间:").append(sf.format(sm.getInserttime())) .append("\n留言内容:").append(sm.getContent()); } } return sb.toString(); } /** * 根据学生编号查询学生的老师留言信息记录(最近10次) * @param studentid 学生编号 * @return 以字符串形式返回老师留言信息 */ public String getStudentMessageHistoryByStudentId(int studentid){ StringBuilder sb = new StringBuilder(); Student student = studentDao.findStudentById(studentid); if(student == null){ sb.append("您好,未找到编号为").append(studentid).append("的学生!"); }else{ sb.append("您好,编号为").append(studentid).append("的学生(").append(student.getName()); List list = studentMessageDao.findStudentMessageByStudentId(studentid, 10); if(list == null || list.size()<1 ){ sb.append(")无老师留言!"); }else{ sb.append(")最近(10次)老师留言如下:"); DateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); for(StudentMessage sm : list){ sb.append("\n留言时间:").append(sf.format(sm.getInserttime())) .append("\n留言内容:").append(sm.getContent()) .append("\n------分割线-------"); } } } return sb.toString(); } /** * 根据学生编号查询学生所在班级的班级动态 * @param studentid 学生编号 * @return 以字符串形式返回学生所在班级的班级动态 */ public String getSingleClassesNewsByStudentId(int studentid){ StringBuilder sb = new StringBuilder(); Student student = studentDao.findStudentById(studentid); if(student == null){ sb.append("您好,未找到编号为").append(studentid).append("的学生!"); }else{ sb.append("您好,编号为").append(studentid).append("的学生(").append(student.getName()); List list = classesNewsDao.findClassesNewsByClassId(student.getClassid(), 1); if(list == null || list.size()<1 ){ sb.append(")所在班级无班级动态!"); }else{ sb.append(")最近班级动态如下:"); DateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); ClassesNews cn = list.get(0); sb.append("\n动态时间:").append(sf.format(cn.getInserttime())) .append("\n动态内容:").append(cn.getContent()); } } return sb.toString(); } /** * 根据学生编号查询学生所在班级的班级动态 * @param studentid 学生编号 * @return 以字符串形式返回学生所在班级的班级动态 */ public String getClassesNewsHistoryByStudentId(int studentid){ StringBuilder sb = new StringBuilder(); Student student = studentDao.findStudentById(studentid); if(student == null){ sb.append("您好,未找到编号为").append(studentid).append("的学生!"); }else{ sb.append("您好,编号为").append(studentid).append("的学生(").append(student.getName()); List list = classesNewsDao.findClassesNewsByClassId(student.getClassid(), 10); if(list == null || list.size()<1 ){ sb.append(")所在班级无班级动态!"); }else{ sb.append(")最近班级动态如下:"); DateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); for(ClassesNews cn:list){ sb.append("\n动态时间:").append(sf.format(cn.getInserttime())) .append("\n动态内容:").append(cn.getContent()) .append("\n------分割线-------"); } } } return sb.toString(); } /** * 新增Message对象到数据库中 */ public void addMessage(Message message) { messageDao.addMessage(message); } /** * 将数据库中Message数据分页查出 * @param start 其实数据条数 * @param size 展示数据每页的大小 */ public List listMessage(int start,int size){ return messageDao.findMessage(start,size); } /** * 将数据库中Message数据分页查出 * @param start 其实数据条数 * @param size 展示数据每页的大小 */ public List listReply(int start,int size){ return replyDao.findReply(start,size); } /** * 保存回复消息至数据库中,如果为news类型消息将article一并保存 */ public void addReply(Reply reply){ replyDao.addReply(reply); if(Reply.NEWS.equals(reply.getMsgType())&&null != reply.getArticles()){ List
articles = reply.getArticles(); for(Article a: articles){ a.setReplyId(reply.getId()); replyDao.addArticle(a); } } } } ================================================ FILE: src/com/aixuexiao/util/ExamUtil.java ================================================ package com.aixuexiao.util; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.aixuexiao.model.Exam; import com.aixuexiao.model.ExamMark; /** * 考试相关工具类 */ public class ExamUtil { /** * 为考试成绩排序 并计算平均分/最高分/最低发 * @param exam 考试对象 * @return */ public static Exam sortExamMark(Exam exam){ List ems = exam.getExamMarks(); Collections.sort(ems);//对分数进行排序 BigDecimal topmark = null,lowestmark = null,total = new BigDecimal(0); int rank = ems.size(); for(int i = 0;i"); } else { writer.write(text); } } }; } }); /** * 将回复消息对象转换成xml字符串 * @param reply 回复消息对象 * @return 返回符合微信接口的xml字符串 */ public static String replyToXml(Reply reply){ String type = reply.getMsgType(); if(Reply.TEXT.equals(type)){ xstream.omitField(Reply.class, "articles"); xstream.omitField(Reply.class, "articleCount"); xstream.omitField(Reply.class, "musicUrl"); xstream.omitField(Reply.class, "hQMusicUrl"); }else if(Reply.MUSIC.equals(type)){ xstream.omitField(Reply.class, "articles"); xstream.omitField(Reply.class, "articleCount"); xstream.omitField(Reply.class, "content"); }else if(Reply.NEWS.equals(type)){ xstream.omitField(Reply.class, "content"); xstream.omitField(Reply.class, "musicUrl"); xstream.omitField(Reply.class, "hQMusicUrl"); } xstream.autodetectAnnotations(true); xstream.alias("xml", reply.getClass()); xstream.alias("item", new Article().getClass()); return xstream.toXML(reply); } /** * 存储数据的Map转换为对应的Message对象 * @param map 存储数据的map * @return 返回对应Message对象 */ public static Message mapToMessage(Map map){ if(map == null) return null; String msgType = map.get("MsgType"); Message message = new Message(); message.setToUserName(map.get("ToUserName")); message.setFromUserName(map.get("FromUserName")); message.setCreateTime(new Date(Long.parseLong(map.get("CreateTime")))); message.setMsgType(msgType); message.setMsgId(map.get("MsgId")); if(msgType.equals(Message.TEXT)){ message.setContent(map.get("Content")); }else if(msgType.equals(Message.IMAGE)){ message.setPicUrl(map.get("PicUrl")); }else if(msgType.equals(Message.LINK)){ message.setTitle(map.get("Title")); message.setDescription(map.get("Description")); message.setUrl(map.get("Url")); }else if(msgType.equals(Message.LOCATION)){ message.setLocationX(map.get("Location_X")); message.setLocationY(map.get("Location_Y")); message.setScale(map.get("Scale")); message.setLabel(map.get("Label")); }else if(msgType.equals(Message.EVENT)){ message.setEvent(map.get("Event")); message.setEventKey(map.get("EventKey")); } return message; } /** * 解析request中的xml 并将数据存储到一个Map中返回 * @param request */ public static Map parseXml(HttpServletRequest request){ Map map = new HashMap(); try { InputStream inputStream = request.getInputStream(); SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); Element root = document.getRootElement(); List elementList = root.elements(); for (Element e : elementList) //遍历xml将数据写入map map.put(e.getName(), e.getText()); inputStream.close(); inputStream = null; } catch (Exception e) { e.printStackTrace(); } return map; } /** * sha1加密算法 * @param key需要加密的字符串 * @return 加密后的结果 */ public static String sha1(String key) { try { MessageDigest md = MessageDigest.getInstance("SHA1"); md.update(key.getBytes()); String pwd = new BigInteger(1, md.digest()).toString(16); return pwd; } catch (Exception e) { e.printStackTrace(); return key; } } } ================================================ FILE: src/com/aixuexiao/web/controller/ClassesController.java ================================================ package com.aixuexiao.web.controller; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.aixuexiao.model.Classes; import com.aixuexiao.model.ClassesNews; import com.aixuexiao.model.Student; import com.aixuexiao.service.ClassesService; /** * 包含班级列表菜单内的所有操作 */ @Controller public class ClassesController { public static int pagesize = 10; @Resource(name="classesService") private ClassesService classesService; @RequestMapping(value="/manager/classes",method=RequestMethod.GET) public ModelAndView listStudent(String pagenum,Classes classes){ ModelAndView mv=new ModelAndView(); mv.setViewName("classes"); mv.addObject("sidebar","classes"); int num = 1; if(null!=pagenum){ num = Integer.parseInt(pagenum); } List list = classesService.listClasses((num-1)*pagesize, pagesize,classes); mv.addObject("classesList", list); mv.addObject("length", list.size()); mv.addObject("pagenum", num); mv.addObject("classes", classes); return mv; } @RequestMapping(value="/manager/addclassespage",method=RequestMethod.GET) public ModelAndView addClassesPage(){ ModelAndView mv=new ModelAndView(); mv.setViewName("addclasses"); mv.addObject("sidebar","classes"); return mv; } @RequestMapping(value="/manager/addclasses",method=RequestMethod.POST) public ModelAndView addClasses(Classes classes){ ModelAndView mv=new ModelAndView(); Classes cls = classesService.findClassesById(classes.getId()); if(null==cls){ mv.setViewName("redirect:/manager/classes"); classes.setStudentcount(0); classesService.addClasses(classes); }else{ mv.setViewName("redirect:/manager/addclassespage"); mv.addObject("name", classes.getName()); mv.addObject("headteacher", classes.getHeadteacher()); mv.addObject("notice","已存在编号为"+classes.getId()+"的班级"); } return mv; } @RequestMapping(value="/manager/managerstudentpage",method=RequestMethod.GET) public ModelAndView studentPage(int classesid){ ModelAndView mv=new ModelAndView(); Classes cls = classesService.findClassesById(classesid); List stlist = classesService.findStudentByClassesId(classesid); mv.setViewName("addstudents"); mv.addObject("sidebar","classes"); mv.addObject("cls",cls); mv.addObject("stlist",stlist); mv.addObject("length", stlist.size()); return mv; } @RequestMapping(value="/manager/classesnewspage",method=RequestMethod.GET) public ModelAndView classesnewsPage(int classesid){ ModelAndView mv=new ModelAndView(); Classes cls = classesService.findClassesById(classesid); List cnlist= classesService.findClassesNewsByClassId(classesid); mv.setViewName("addclassesnews"); mv.addObject("sidebar","classes"); mv.addObject("cls",cls); mv.addObject("cnlist",cnlist); return mv; } @RequestMapping(value="/manager/addclassesnews",method=RequestMethod.POST) public ModelAndView addClassesNews(ClassesNews classesNews){ ModelAndView mv=new ModelAndView(); classesNews.setInserttime(new Date()); classesService.addClassesNews(classesNews); mv.addObject("notice","添加班级动态成功"); mv.addObject("classesid",classesNews.getClassid()); mv.setViewName("redirect:/manager/classesnewspage"); return mv; } @RequestMapping(value="/manager/deleteclassesnews",method=RequestMethod.GET) public ModelAndView deleteClassesNews(int classesid,int id){ ModelAndView mv=new ModelAndView(); mv.setViewName("redirect:/manager/classesnewspage"); mv.addObject("classesid",classesid); classesService.deleteClassesNewsById(id); mv.addObject("notice","删除动态成功"); return mv; } @RequestMapping(value="/manager/addstudent",method=RequestMethod.POST) public ModelAndView addStudent(Student student){ ModelAndView mv=new ModelAndView(); Student stu = classesService.findStudentById(student.getId()); if(stu==null){ classesService.addStudent(student); classesService.updateClassStudentCount(student.getClassid()); mv.addObject("notice","添加学生成功"); }else{ mv.addObject("notice","已经存在编号为"+student.getId()+"的学生("+stu.getName()+")!"); } mv.addObject("classesid",student.getClassid()); mv.setViewName("redirect:/manager/managerstudentpage"); return mv; } @RequestMapping(value="/manager/deletestudent",method=RequestMethod.GET) public ModelAndView deleteStudent(int studentid,int classid){ ModelAndView mv=new ModelAndView(); classesService.deleteStudentById(studentid); classesService.updateClassStudentCount(classid); mv.addObject("classesid",classid); mv.addObject("notice","删除学生信息成功"); mv.setViewName("redirect:/manager/managerstudentpage"); return mv; } @RequestMapping(value="/manager/updatestudent",method=RequestMethod.POST) public ModelAndView updateStudent(Student student){ ModelAndView mv=new ModelAndView(); classesService.updateStudentBy(student); mv.addObject("classesid",student.getClassid()); mv.addObject("notice","编辑学生信息成功"); mv.setViewName("redirect:/manager/managerstudentpage"); return mv; } } ================================================ FILE: src/com/aixuexiao/web/controller/ExamController.java ================================================ package com.aixuexiao.web.controller; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.aixuexiao.model.Classes; import com.aixuexiao.model.Exam; import com.aixuexiao.model.Student; import com.aixuexiao.service.ExamService; import com.aixuexiao.util.ExamUtil; /** * 包含考试列表菜单内的所有操作 */ @Controller public class ExamController { public static final int pagesize = 10; @Resource(name="examService") private ExamService examService; @RequestMapping(value="/manager/exams",method=RequestMethod.GET) public ModelAndView listStudent(String pagenum,Exam exam){ ModelAndView mv=new ModelAndView(); mv.setViewName("exams"); mv.addObject("sidebar","exams"); int num = 1; if(null!=pagenum){ num = Integer.parseInt(pagenum); } List list = examService.listExam((num-1)*pagesize, pagesize,exam); List clslist = examService.findAllClasses(); mv.addObject("examList", list); mv.addObject("clsList", clslist); mv.addObject("length", list.size()); mv.addObject("pagenum", num); mv.addObject("exam", exam); return mv; } @RequestMapping(value="/manager/addexam",method=RequestMethod.POST) public ModelAndView addExam(Exam exam){ ModelAndView mv=new ModelAndView(); mv.setViewName("addexam"); mv.addObject("sidebar","exams"); List stlist = examService.findStudentByClassesId(exam.getClassid()); mv.addObject("exam",exam); mv.addObject("stlist",stlist); return mv; } @RequestMapping(value="/manager/viewexam",method=RequestMethod.GET) public ModelAndView viewExam(int id){ ModelAndView mv=new ModelAndView(); mv.setViewName("viewexam"); mv.addObject("sidebar","exams"); Exam exam = examService.findExamById(id); mv.addObject("exam",exam); return mv; } @RequestMapping(value="/manager/addexammark",method=RequestMethod.POST) public ModelAndView addExamMark(Exam exam){ ModelAndView mv=new ModelAndView(); mv.addObject("sidebar","exams"); mv.setViewName("redirect:/manager/exams"); exam.setExamtime(new Date()); exam = ExamUtil.sortExamMark(exam);//为分数排序 examService.addExam(exam); return mv; } } ================================================ FILE: src/com/aixuexiao/web/controller/LoginController.java ================================================ package com.aixuexiao.web.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller() public class LoginController { private static final String USERNAME = "zhiyun"; private static final String PASSWORD = "123456"; @RequestMapping("/") public String index(){ return "login"; } @RequestMapping(value="/login",method=RequestMethod.POST) public ModelAndView login(String username,String password,HttpServletRequest request){ ModelAndView mv=new ModelAndView(""); if( USERNAME.equals(username)&& PASSWORD.equals(password)){ request.getSession().setAttribute("user", username); mv.setViewName("redirect:/manager/students"); }else{ mv.setViewName("forward:/"); mv.addObject("username",username); mv.addObject("message", "username or password error "); } return mv; } @RequestMapping(value="/loginout",method=RequestMethod.POST) public ModelAndView loginOut(HttpServletRequest request){ ModelAndView mv=new ModelAndView(); mv.setViewName("/"); request.getSession().removeAttribute("user"); return mv; } } ================================================ FILE: src/com/aixuexiao/web/controller/StudentController.java ================================================ package com.aixuexiao.web.controller; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.aixuexiao.model.Classes; import com.aixuexiao.model.ExamMark; import com.aixuexiao.model.Student; import com.aixuexiao.model.StudentMessage; import com.aixuexiao.service.StudentService; /** * 包含学生列表菜单内的所有操作 */ @Controller public class StudentController { public static final int pagesize = 8; @Resource(name="studentService") private StudentService studentService; @RequestMapping(value="/manager/students",method=RequestMethod.GET) public ModelAndView listStudent(String pagenum,Student student){ ModelAndView mv=new ModelAndView(); mv.setViewName("students"); mv.addObject("sidebar","students"); int num = 1; if(null!=pagenum){ num = Integer.parseInt(pagenum); } List list = studentService.listStudent((num-1)*pagesize, pagesize,student); List clslist = studentService.findAllClasses(); mv.addObject("studentList", list); mv.addObject("clsList", clslist); mv.addObject("length", list.size()); mv.addObject("pagenum", num); mv.addObject("student", student); return mv; } @RequestMapping(value="/manager/leavemessage",method=RequestMethod.GET) public ModelAndView leavemessage(int studentid){ ModelAndView mv=new ModelAndView(); Student student = studentService.findStudentById(studentid); if(null == student){ mv.setViewName("redirect:/manager/students"); }else{ mv.setViewName("addstudentmessage"); mv.addObject("sidebar","students"); mv.addObject("student",student); List list = studentService.listMessageByStudentId(studentid, 100); mv.addObject("studentMessageList", list); } return mv; } @RequestMapping(value="/manager/examdetail",method=RequestMethod.GET) public ModelAndView examdetail(int studentid){ ModelAndView mv=new ModelAndView(); Student student = studentService.findStudentById(studentid); if(null == student){ mv.setViewName("redirect:/manager/students"); }else{ mv.setViewName("examdetail"); mv.addObject("sidebar","students"); mv.addObject("student",student); List list = studentService.findExamMarkByStudentId(studentid, 100); mv.addObject("emlist", list); } return mv; } @RequestMapping(value="/manager/addmessage",method=RequestMethod.POST) public ModelAndView addmessage(StudentMessage studentMessage){ ModelAndView mv=new ModelAndView(); mv.setViewName("redirect:/manager/leavemessage"); mv.addObject("studentid",studentMessage.getStudentid()); studentMessage.setInserttime(new Date()); studentService.addStudentMessage(studentMessage); mv.addObject("notice","留言成功"); return mv; } @RequestMapping(value="/manager/deletemessage",method=RequestMethod.GET) public ModelAndView deletemessage(int studentid,int messageid){ ModelAndView mv=new ModelAndView(); mv.setViewName("redirect:/manager/leavemessage"); mv.addObject("studentid",studentid); studentService.deleteStudentMessageById(messageid); mv.addObject("notice","删除成功"); return mv; } } ================================================ FILE: src/com/aixuexiao/web/controller/WeixinController.java ================================================ package com.aixuexiao.web.controller; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.aixuexiao.model.ExamMark; import com.aixuexiao.model.Message; import com.aixuexiao.model.Reply; import com.aixuexiao.service.WeixinService; import com.aixuexiao.util.WeixinUtil; @Controller() public class WeixinController { private static final String TOKEN = "aixuexiao"; public static int pagesize = 10; @Resource(name="weixinService") private WeixinService weixinService; @RequestMapping(value="/test",method=RequestMethod.GET,produces="text/html;charset=UTF-8") @ResponseBody public String test(HttpServletRequest request){ return weixinService.getStudentMessageHistoryByStudentId(30202); } //接收微信公众号接收的消息,处理后再做相应的回复 @RequestMapping(value="/weixin",method=RequestMethod.POST,produces="text/html;charset=UTF-8") @ResponseBody public String replyMessage(HttpServletRequest request){ //仅处理微信服务端发的请求 if (checkWeixinReques(request)) { Map requestMap = WeixinUtil.parseXml(request); Message message = WeixinUtil.mapToMessage(requestMap); weixinService.addMessage(message);//保存接受消息到数据库 String replyContent = Reply.WELCOME_CONTENT; String type = message.getMsgType(); if (type.equals(Message.TEXT)) {//仅处理文本回复内容 String content = message.getContent();//消息内容 String [] cs = content.split("_");//消息内容都以下划线_分隔 if(cs.length == 2){ int studentid ;//学生编号 String process = cs[1];//操作 try { studentid = Integer.parseInt(cs[0]); if("考试".equals(process)){ replyContent = weixinService.getSingleExamMarkStringByStudentId(studentid); }else if("考试历史".equals(process)){ replyContent = weixinService.getExamMarkHistoryStringByStudentId(studentid); }else if("留言".equals(process)){ replyContent = weixinService.getSingleStudentMessageByStudentId(studentid); }else if("留言历史".equals(process)){ replyContent = weixinService.getStudentMessageHistoryByStudentId(studentid); }else if("动态".equals(process)){ replyContent = weixinService.getSingleClassesNewsByStudentId(studentid); }else if("动态历史".equals(process)){ replyContent = weixinService.getClassesNewsHistoryByStudentId(studentid); } } catch (NumberFormatException e) { replyContent = Reply.ERROR_CONTENT; } } } //拼装回复消息 Reply reply = new Reply(); reply.setToUserName(message.getFromUserName()); reply.setFromUserName(message.getToUserName()); reply.setCreateTime(new Date()); reply.setMsgType(Reply.TEXT); reply.setContent(replyContent); weixinService.addReply(reply);//保存回复消息到数据库 //将回复消息序列化为xml形式 String back = WeixinUtil.replyToXml(reply); System.out.println(back); return back; }else{ return "error"; } } //微信公众平台验证url是否有效使用的接口 @RequestMapping(value="/weixin",method=RequestMethod.GET,produces="text/html;charset=UTF-8") @ResponseBody public String initWeixinURL(HttpServletRequest request){ String echostr = request.getParameter("echostr"); if (checkWeixinReques(request) && echostr != null) { return echostr; }else{ return "error"; } } /** * 根据token计算signature验证是否为weixin服务端发送的消息 */ private static boolean checkWeixinReques(HttpServletRequest request){ String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); if (signature != null && timestamp != null && nonce != null ) { String[] strSet = new String[] { TOKEN, timestamp, nonce }; java.util.Arrays.sort(strSet); String key = ""; for (String string : strSet) { key = key + string; } String pwd = WeixinUtil.sha1(key); return pwd.equals(signature); }else { return false; } } /** * 收到消息列表页面 */ @RequestMapping(value="/manager/messages",method=RequestMethod.GET) public ModelAndView listMessage(String pagenum){ ModelAndView mv=new ModelAndView(); mv.addObject("sidebar","messages"); mv.setViewName("messages"); int num = 1; if(null!=pagenum){ num = Integer.parseInt(pagenum); } List list = weixinService.listMessage((num-1)*pagesize, pagesize); mv.addObject("messageList", list); mv.addObject("pagenum", num); mv.addObject("length", list.size()); return mv; } /** * 回复消息列表页面 */ @RequestMapping(value="/manager/replys",method=RequestMethod.GET) public ModelAndView listReply(String pagenum){ ModelAndView mv=new ModelAndView(); mv.addObject("sidebar","replys"); mv.setViewName("replys"); int num = 1; if(null!=pagenum){ num = Integer.parseInt(pagenum); } List list = weixinService.listReply((num-1)*pagesize, pagesize); mv.addObject("replyList", list); mv.addObject("pagenum", num); mv.addObject("length", list.size()); return mv; } } ================================================ FILE: src/com/aixuexiao/web/interceptor/ManagerInterceptor.java ================================================ package com.aixuexiao.web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 用于过滤未登陆用户访问管理内容的拦截器 * @author lizy */ public class ManagerInterceptor implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) throws Exception { } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mav) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception { request.setCharacterEncoding("UTF-8"); if(request.getSession().getAttribute("user")!=null){ return true; }else{ response.sendRedirect(request.getContextPath()+"/"); //System.out.println("request.getSession().getAttribute(\"user\")"+request.getSession().getAttribute("user")); return false; } } } ================================================ FILE: src/db.properties ================================================ db.read.database=app_aixuexiao db.read.host=r.rdc.sae.sina.com.cn db.read.port=3307 db.read.userName=ak db.read.password=sk db.write.database=app_aixuexiao db.write.host=w.rdc.sae.sina.com.cn db.write.port=3307 db.write.userName=ak db.write.password=sk ================================================ FILE: src/log4j.properties ================================================ log4j.rootLogger=INFO,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %5p %c\:(%F\:%L) %n - %m%n ================================================ FILE: src/spring.xml ================================================  classpath:db.properties ================================================ FILE: src/sqlMapConfig.xml ================================================