【斗医】【17】Web应用开发20天

细心的读者可能已发现“Web应用开发50天”改为了“Web应用开发20天”,之所以这样调整是因为当时想前20篇只讲解Web基础知识,中间10篇讲解我一直想要封装的Web框架,后20篇将该应用转换为Android应用。但由于最近女儿出生,业余时间都被她占用了,为了尽快把Web基础讲述完就把这部分独立出来了。

本文主要讲解数据表的Hibernate配置,Come on...

1、由于系统首页内容会涉及到几张数据表,这里列出涉及的几张表

2、写出数据表创建脚本,并在MySQL中执行这些脚本

/*创建数据库*/
CREATE DATABASE MEDICAL
GO

/*创建级别表*/
CREATE TABLE leveltable(levelId int PRIMARY KEY NOT NULL, levelName VARCHAR(20), scoreLimit int)
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

/*插入级别数据*/
INSERT INTO leveltable VALUES(1, ‘医士‘, 100)
GO
INSERT INTO leveltable VALUES(2, ‘医生‘, 300)
GO
INSERT INTO leveltable VALUES(3, ‘主治医生‘, 1000)
GO
INSERT INTO leveltable VALUES(4, ‘副主任‘, 2000)
GO
INSERT INTO leveltable VALUES(5, ‘主任‘, 4000)
GO

/*创建用户表*/
CREATE TABLE usertable(userId VARCHAR(20) PRIMARY KEY NOT NULL, userAuth VARCHAR(64), userSign VARCHAR(128),iconPath VARCHAR(128), score int)
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

/*创建用户收藏表*/
CREATE TABLE favoritetable(favoriteId int PRIMARY KEY NOT NULL, userId VARCHAR(20), topicId VARCHAR(64), favoriteTime DATETIME)
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

/*创建用户关注表*/
CREATE TABLE followtable(followId int PRIMARY KEY NOT NULL, userId VARCHAR(20), followKind int, beFollowId VARCHAR(64), followTime DATETIME)
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

/*创建用户话题表*/
CREATE TABLE topictable(topicId VARCHAR(64) PRIMARY KEY NOT NULL, topicTitle VARCHAR(128), userId VARCHAR(20), depId int, prescript TEXT, challengers VARCHAR(512), browseNum int, topicTime DATETIME)
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

/*创建科室表*/
CREATE TABLE departmenttable(depId int PRIMARY KEY NOT NULL, depName VARCHAR(64))
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

/*创建科室记录表*/
INSERT INTO departmenttable VALUES(1, ‘内科‘)
GO
INSERT INTO departmenttable VALUES(2, ‘外科‘)
GO
INSERT INTO departmenttable VALUES(3, ‘妇产科‘)
GO
INSERT INTO departmenttable VALUES(4, ‘儿科‘)
GO
INSERT INTO departmenttable VALUES(5, ‘眼科‘)
GO
INSERT INTO departmenttable VALUES(6, ‘口腔科‘)
GO
INSERT INTO departmenttable VALUES(7, ‘耳鼻喉科‘)
GO
INSERT INTO departmenttable VALUES(8, ‘皮肤科‘)
GO
INSERT INTO departmenttable VALUES(9, ‘麻醉科‘)
GO
INSERT INTO departmenttable VALUES(10, ‘传染科‘)
GO
INSERT INTO departmenttable VALUES(11, ‘美容科‘)
GO

/*创建话题评论表*/
CREATE TABLE commentment(commentId VARCHAR(64) PRIMARY KEY NOT NULL, topicId VARCHAR(64), commentInfo TEXT, commentUser VARCHAR(20), commentTime DATETIME)
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

/*创建消息表*/
CREATE TABLE messagetable(messageId int PRIMARY KEY NOT NULL, userId VARCHAR(20), fromUserId VARCHAR(20), messageInfo VARCHAR(1024), messageTime DATETIME)
ENGINE=InnoDB DEFAULT CHARSET=UTF8
GO

3、在D:\medical\src\com\medical\server\dao下编写与数据表对应的DAO类

(1)用户表对应的DAO类

package com.medical.server.dao;

public class UserDAO
{
    /**
     * 用户ID
     */
    private String userId = null;
    
    /**
     * 用户鉴权字符串
     */
    private String userAuth = null;
    
    /**
     * 用户自我描述
     */
    private String userSign = null;
    
    /**
     * 用户头像路径
     */
    private String iconPath = null;
    
    /**
     * 用户级别对应的分数
     */
    private int score = 0;
    
    // 省略相应的get&set方法
    
}

(2)级别表对应的DAO类

package com.medical.server.dao;

public class LevelDAO
{
    /**
     * 级别ID
     */
    private int levelId = 0;
    
    /**
     * 级别名称
     */
    private String levelName = null;
    
    /**
     * 级别对应分数的极限值
     */
    private int scoreLimit = 0;
    
    // 省略get&set方法
}

(3)用户收藏表对应的DAO类

package com.medical.server.dao;

public class FavoriteDAO
{
    /**
     * 收藏ID
     */
    private int favoriteId = 0;
    
    /**
     * 收藏的用户ID
     */
    private String userId = null;
    
    /**
     * 收藏的话题ID
     */
    private String topicId = null;
    
    /**
     * 收藏话题的时间
     */
    private String favoriteTime = null;

    // 省略相应的get&set方法
}

(4)用户关注表对应的DAO类

package com.medical.server.dao;

public class FollowDAO
{
    /**
     * 关注ID
     */
    private int followId = 0;
    
    /**
     * 关注的用户ID
     */
    private String userId = null;
    
    /**
     * 关注类别:0为关注人,1为关注话题
     */
    private int followKind = 0;
    /**
     * 被关注的人或话题
     */
    private String beFollowId = null;
    
    /**
     * 关注时间
     */
    private String followTime = null;
    
    // 省略get&set方法
}

(5)用户话题表对应的DAO类,把ChallengeDAO类修改为TopicDAO

package com.medical.server.dao;

public class TopicDAO
{
    /**
     * 话题ID
     */
    private String topicId = null;
    
    /**
     * 话题名称
     */
    private String topicTitle = null;
    
    /**
     * 话题发表者
     */
    private String userId = null;
    
    /**
     * 话题所属科室
     */
    private int depId = 0;
    
    /**
     * 话题内容
     */
    private String prescript = null;

    /**
     * 被挑战人
     */
    private String challengers = null;
    
    /**
     * 话题浏览次数
     */
    private int browseNum = 0;
    
    /**
     * 话题发布时间
     */
    private String topicTime = null;
    
    // 省略get&set方法
}

(6)话题科室表对应的DAO类,把DepartDAO类重命名为DepartmentDAO

(7)话题评论表对应的DAO类

package com.medical.server.dao;

public class CommentDAO
{
    /**
     * 评论ID
     */
    private int commentId = 0;
    
    /**
     * 被评论的话题ID
     */
    private String topicId = null;
    
    /**
     * 被评论的话题内容
     */
    private String commentInfo = null;
    
    /**
     * 话题评论人
     */
    private String commentUser = null;
    
    /**
     * 话题评论时间
     */
    private String commentTime = null;
    
    // 省略get&set方法
}

(8)用户消息对应的DAO类

package com.medical.server.dao;

public class MessageDAO
{
    /**
     * 消息ID
     */
    private int messageId = 0;
    
    /**
     * 用户ID
     */
    private String userId = null;
    
    /**
     * 消息来源人
     */
    private String fromUserId = null;
    
    /**
     * 消息内容
     */
    private String messageInfo = null;
    
    /**
     * 消息时间
     */
    private String messageTime = null;
    
    // 省略get&set方法
}

4、在D:\medical\war\etc\mapping下定义与数据表对应的Hibernate配置文件

(1)用户表对应的Hibernate配置文件,修改user.hbm.xml文件内容

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="UserDAO" table="usertable">
        <id name="userId" column="userId" type="string" />
        <property name="userAuth" column="userAuth" />
        <property name="userSign" column="userSign" />
        <property name="iconPath" column="iconPath" />
        <property name="score" column="score" />
    </class>
</hibernate-mapping>

(2)级别对应的Hibernate配置文件:level.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="LevelDAO" table="leveltable">
        <id name="levelId" column="levelId" type="int">
            <generator class="increment"></generator>
        </id>
        <property name="levelName" column="levelName" />
        <property name="scoreLimit" column="scoreLimit" />
    </class>
</hibernate-mapping>

(3)用户收藏表对应的Hibernate配置文件:favorite.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="FavoriteDAO" table="favoritetable">
        <id name="favoriteId" column="favoriteId" type="int">
            <generator class="increment"></generator>
        </id>
        <property name="userId" column="userId" />
        <property name="topicId" column="topicId" />
        <property name="favoriteTime" column="favoriteTime" />
    </class>
</hibernate-mapping>

(4)用户关注表对应的Hibernate配置文件:follow.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="FollowDAO" table="followtable">
        <id name="followId" column="followId" type="int">
            <generator class="increment"></generator>
        </id>
        <property name="userId" column="userId" />
        <property name="followKind" column="followKind" />
        <property name="beFollowId" column="beFollowId" />
        <property name="followTime" column="followTime" />
    </class>
</hibernate-mapping>

(5)重命名话题表对应的Hibernate配置文件challenge.hbm.xml为topic.hbm.xml,同时修改里面内容

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="TopicDAO" table="topictable">
        <id name="topicId" column="topicId" type="string">
            <generator class="uuid.hex"></generator>
        </id>
        <property name="topicTitle" column="topicTitle" />
        <property name="userId" column="userId" />
        <property name="depId" column="depId" />
        <property name="prescript" column="prescript" />
        <property name="challengers" column="challengers" />
        <property name="browseNum" column="browseNum" />
        <property name="topicTime" column="topicTime" />
    </class>
</hibernate-mapping>

(6)重命名话题科室表对应的Hibernate配置文件depart.hbm.xml为department.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="DepartmentDAO" table="departmenttable">
        <id name="depId" column="depId" type="int">
            <generator class="increment"></generator>
        </id>
        <property name="depName" column="depName" />
    </class>
</hibernate-mapping>

(7)话题评论表对应的Hibernate配置文件:comment.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="CommentDAO" table="commentment">
        <id name="commentId" column="commentId" type="string">
            <generator class="uuid.hex"></generator>
        </id>
        <property name="topicId" column="topicId" />
        <property name="commentInfo" column="commentInfo" />
        <property name="commentUser" column="commentUser" />
        <property name="commentTime" column="commentTime" />
    </class>
</hibernate-mapping>

(8)话题消息表对应的Hibernate配置文件:message.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping package="com.medical.server.dao">
    <class name="MessageDAO" table="messagetable">
        <id name="messageId" column="messageId" type="int">
            <generator class="increment"></generator>
        </id>
        <property name="userId" column="userId" />
        <property name="fromUserId" column="fromUserId" />
        <property name="messageInfo" column="messageInfo" />
        <property name="messageTime" column="messageTime" />
    </class>
</hibernate-mapping>

5、在UserUtil增加updateUserScore()方法,用于更新用户级别分数

/**
 * 更新用户积分
 */
public static void updateUserScore(String userName)
{
    UserDAO userDao  = getUserByName(userName);
    if(userDao != null)
    {
        userDao.setScore(userDao.getScore() + 5);
    }
    
    Session session = FrameDBUtil.openSession();
    Transaction transaction = session.beginTransaction();
    session.update(userDao);
    transaction.commit();
    FrameDBUtil.closeSession();
}

6、修改TopicUtil的insertChallenge()方法,增加话题发布时间

/**
 * 把挑战书记录入库
 */
public static void insertChallenge(String userId, String title, int depId, String prescript, String challengers)
{
    TopicDAO topicDao = new TopicDAO();
    topicDao.setChallengers(challengers);
    topicDao.setDepId(depId);
    topicDao.setPrescript(prescript);
    topicDao.setTopicTitle(title);
    topicDao.setUserId(userId);
    topicDao.setTopicTime(FrameUtil.getCurrentDate());
    
    Session session = FrameDBUtil.openSession();
    Transaction transaction = session.beginTransaction();
    session.save(topicDao);
    transaction.commit();
    FrameDBUtil.closeSession();
}


【备注】:在FrameUtil中增加了getCurrentDate()方法,读者可以在附件中查看



7、修改PublishChallengeAction逻辑,在发表挑战时对用户增加积分

// 获取挑战药方内容、挑战人
String prescript = getParameter("prescript");
String challengers = getParameter("challengers");
// 写入数据库
TopicUtil.insertChallenge(loginUser.getUserId(), title, depId, prescript, challengers);
UserUtil.updateUserScore(loginUser.getUserId())
时间: 2024-11-08 20:10:01

【斗医】【17】Web应用开发20天的相关文章

【斗医】【19】Web应用开发20天

本文把挑战书的具体内容显示在独立页面上,这里涉及如下四个步骤: 1.增加触发入口 2.增加业务配置 3.服务端获取数据后封装为Json对象返回 4.通过对DOM元素操作绘制页面 在讲解这四个步骤之前先修改一个Bug: [问题描述]: (1)用户首次点击"下战书"菜单,进入登录界面提示用户需要登录 (2)用户登录成功之后就进入下战书页面 (3)此时再次点击"下战书"菜单,界面又进入到登录页面 期望:下次再点击"下战书"菜单,此时的会话已存在,所以不

【斗医】【20】Web应用开发20天

作为本系列的一个结束,我的脑子是混乱的,尽管在前面博文中也谈到,但真正在这个Web应用结束时,好多好多的想法涌过来...... 以前只是单纯地想做成一个产品,把自己的精力全部注入进入,像看着自己的女儿一样关注着它的成长:移动终端以锐不可挡的气势压迫过来,想把此Web就算转化为Android应用,像网络银行替代传统银行一样不可阻挡:想把自己原来接触的一个Web原型封装起来,完成自07年以来始终有一个心结,像答应她的许诺一样遵循着内心的跳动:想写写自己关于Web和PaaS上的安全认识,像年少时独自对

【斗医】【18】Web应用开发20天

本文通过获取首页内容来讲解Web页面拖拽获取当前页数据,功能类似在google查看图片,这里面涉及如下五个步骤: (1)页面首次加载时读取第一页数据 (2)触发滚动条拖拽动作 (3)Ajax异步读取下一页数据 (4)服务端把数据封装为Json返回 (5)把页面数据通过DOM元素绘制在页面上 接下来就按这五个步骤依次进行 1.页面首次加载时会加载main.js文件.在此文件中增加CURRENT_ITEM_INDEX变量,用于标识当前话题的索引值:增加方法getPageContent(),用于页面加

Web前端开发推荐阅读书籍、学习课程下载

转自http://www.xuanfengge.com/fe-books.html 前言 学校里没有前端的课程,那如何学习JavaScript,又如何使自己成为一个合格的前端工程师呢? 除了在项目中学习和跟着有经验的同事学习,读书也是必不可少的.书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高. 而如果深一脚浅一脚的学习,写出代码的质量会参差不齐.初学者的首要任务是成为靠谱的熟练开发者,能够稳定的输出有一定质量的代码. 前端技术发展速度特别快,总是涌现出很多新的东西,需要不断的学习

【斗医】【16】Web应用开发50天

在本文完成下挑战书的功能,其中里面也涉及到富文本编辑器的使用 1.生成challenge数据表 在D:\medical\war\etc\db.txt文本中增加数据表challenge脚本,然后通过navicat工具把数据表在mysql中生成 /*创建挑战书记录表*/CREATE TABLE CHALLENGE(challengeId int PRIMARY KEY NOT NULL, userId VARCHAR(20), title VARCHAR(128), depId int, presc

推荐20个非常有帮助的web前端开发教程

1. CSS Vocabulary 一个伟大的指向和点击的小应用程序,让你加高速度掌握 CSS 语法的各个不同部分,学习各个属性的正确的名称. 2. Liquidapsive 一个简单的信息化布局.通过选择框的方式,能够让你在响应式,自适应.流动和静态布局中选择,所以你能够看到四大布局类型之间的差别. 3. Superhero.js 最好的文章,视频和演示文稿,以帮助前端开发者保持较大的 JavaScript 代码库的集合. 包含有一些普遍原则型的东西.对測试工具,性能.安全性和很多其它的资源.

推荐20个很有帮助的web前端开发教程

1. CSS Vocabulary 一个伟大的指向和点击的小应用程序,让你加快速度掌握 CSS 语法的各个不同部分,学习各个属性的正确的名称. 2. Liquidapsive 一个简单的信息化布局,通过选择框的方式,可以让你在响应式,自适应,流动和静态布局中选择,所以你可以看到四大布局类型之间的区别. 3. Superhero.js 最好的文章,视频和演示文稿,以帮助前端开发人员保持较大的 JavaScript 代码库的集合.包括有一些普遍原则型的东西,对测试工具,性能,安全性和更多的资源. 4

推荐20个很有帮助的 Web 前端开发教程

在平常的搜索中,我碰到过很多有趣的信息,应用程序和文档,我把它们整理在下面这个列表.这是收藏的遇到的有用内容的一个伟大的方式,可以在你需要的时候方便查阅.相信你会在这个列表中发现对你很有用的资料. 您可能感兴趣的相关文章 Web 前端开发人员和设计师必读文章集锦 十个拥有丰富 UI 组件的 JavaScript 框架 十款精心挑选的在线 CSS3 代码生成工具 开发者必备的八个最佳云端集成开发环境 2012年度最佳 Web 前端开发工具和框架 1. CSS Vocabulary 一个伟大的指向和

【斗医】【15】Web应用开发50天 之 易用性问题

在介绍HTML富文本使用之前,先解决几个易用性的问题 1.在chrome浏览器中textarea高度自适应存在问题:当输入任何一个字符时textarea高度都会增加 解决办法: (1)在challenge.js中定义autoAdaptHeight()方法,内容如下: /** * textarea高度自适应 */ function autoAdaptHeight(component){ var paddingTop = parseInt($(component).css("padding-top&