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

简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://qingkechina.blog.51cto.com/5552198/1418856

   一般医院都会设置内科、外科、妇产科、儿科、眼科、口腔科、耳鼻喉科、皮肤科、麻醉科、传染科、美容科等,从而可以根据病人的不同情况进和分流,每当进入医院时就想起了门面模式,有点扯远了。当下战书时为了描述清楚具体症状,所以想先设置科室,从而使症状描述更准确。下面来实现科室选择。

1、创建科室数据库

CREATE TABLE DEPARTMENT(depId int PRIMARY KEY NOT NULL, depName VARCHAR(64)) ENGINE=InnoDB DEFAULT CHARSET=UTF8


2、插入科室记录

INSERT INTO DEPARTMENT VALUES(1, '内科')

INSERT INTO DEPARTMENT VALUES(2, '外科')

INSERT INTO DEPARTMENT VALUES(3, '妇产科')

INSERT INTO DEPARTMENT VALUES(4, '儿科')

INSERT INTO DEPARTMENT VALUES(5, '眼科')

INSERT INTO DEPARTMENT VALUES(6, '口腔科')

INSERT INTO DEPARTMENT VALUES(7, '耳鼻喉科')

INSERT INTO DEPARTMENT VALUES(8, '皮肤科')

INSERT INTO DEPARTMENT VALUES(9, '麻醉科')

INSERT INTO DEPARTMENT VALUES(10, '传染科')

INSERT INTO DEPARTMENT VALUES(11, '美容科')


3、新建DepartDAO类,通过Hibernate把DepartDAO对象与DEPARTMENT表对应起来,为了简单起见,这里不再列出DepartDAO类的具体代码,里面只是有depId和depName两个字段,以及这两个字段的get()&set()方法


4、创建DepartUtil类

package com.medical.server.util;


import java.util.List;

import org.hibernate.Criteria;

import org.hibernate.Session;

import org.hibernate.criterion.Restrictions;

import com.medical.frame.util.FrameDBUtil;

import com.medical.frame.util.FrameUtil;

import com.medical.server.dao.DepartDAO;


/**

 * 斗医系统服务端科室工具类

 * @author qingkechina 2014-03-28

 */

public class DepartUtil

{

    /**

     * 获取所有科室DAO对象集合

     */

    @SuppressWarnings("unchecked")

    public static List<DepartDAO> getDepartList()

    {

        Session session = FrameDBUtil.openSession();

        Criteria criteria = session.createCriteria(DepartDAO.class);

        List<?> depList = criteria.list();

        FrameDBUtil.closeSession();

        

        if (FrameUtil.isEmpty(depList))

        {

            return null;

        }

        return (List<DepartDAO>)depList;

    }

    

    /**

     * 通过科室ID查找科室DAO对象

     */

    public static DepartDAO getDepartById(int depId)

    {

        Session session = FrameDBUtil.openSession();

        Criteria criteria = session.createCriteria(DepartDAO.class);

        criteria.add(Restrictions.eq("depId", depId));

        List<?> depList = criteria.list();

        FrameDBUtil.closeSession();

        

        if (FrameUtil.isEmpty(depList))

        {

            return null;

        }

        

        DepartDAO depDao = (DepartDAO)depList.get(0);

        return depDao;

    }

}


6、定义获取科室数据配置信息

在war\WEB-INF\config\challenge下创建challenge-data.xml文件,里面填充如下内容:

<?xml version="1.0" encoding="UTF-8"?>

<business-config>

    <!--获取部门科室类别信息-->

    <business name="gainDepart" business-class="com.medical.server.data.DepartDataAction" />

</business-config>


7、创建DepartDataAction类

package com.medical.server.data;


import java.util.List;

import com.google.gson.Gson;

import com.medical.frame.FrameDefaultAction;

import com.medical.frame.FrameException;

import com.medical.server.dao.DepartDAO;

import com.medical.server.util.DepartUtil;


/**

 * 斗医系统获取科室信息处理类

 * @author qingkechina 2014-05-28

 */

public class DepartDataAction extends FrameDefaultAction

{

    /**

     * 全局Gson对象

     */

    private final static Gson gson = new Gson();

    

    @Override

    public String execute()

        throws FrameException

    {

        List<DepartDAO> departList = DepartUtil.getDepartList();

        return gson.toJson(departList);

    }

}


8、创建DepartDAO对象的数据表映射文件

在war\etc\mapping下创建depart.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="DepartDAO" table="DEPARTMENT">

        <id name="depId" column="depId" type="int" />

        <property name="depName" column="depName" />

    </class>

</hibernate-mapping>


9、修改challenge.js文件,在该文件加载后从服务端读取科室数据并渲染到HTML页面上

/**

 * 初始化科室类别数据

 */

 function initDepartData(){

    asyncRequest("gainDepart.data", null, function(result){

        var resultJson = eval(result);

        if(!resultJson){

            return;

        }


        $("#challenge_depart_id").empty();

   

        $.each(resultJson, function(i, item){

            var departItem = $("<div />").attr("class", "challenge_depart_item").attr("id", "challenge_depart_id_" + item.depId).text(item.depName);

            departItem.click(function(){

                if(CURRENT_SELECTED_ITEM != -1){

                    $("challenge_depart_id_" + CURRENT_SELECTED_ITEM).attr("class", "challenge_depart_item");

                }

                CURRENT_SELECTED_ITEM = item.depId;

                $("#challenge_depart_id_" + item.depId).attr("class", "challenge_depart_item_selected");

            });


            $("#challenge_depart_id").append(departItem);

        });

    });

}


10、渲染科室类别的页面样式

(1)修改challenge.html内容

<div class="challenge_text_desc">问题科室:</div>

<div class="challenge_text_desc">选择所属科室(必填):</div>

<div class="challenge_depart_wrapperid="challenge_depart_id">

     <textarea id="challenge_kind_id" placeholder="选择问题所属科室"></textarea>

</div>


(2)在challenge.css文件中增加如下CSS定义

.challenge_depart_wrapper{

    margin: 5px;

    line-height: 15px;

    background-color: #FFF;

    color: #222;

    overflow: hidden;

}


.challenge_depart_item, .challenge_depart_item_selected{

    float: left;

    min-width: 55px;

    width: auto;

    height: 22px;

    line-height: 22px;

    font-size: 13px;

    text-align: center;

    margin-right: 8px;

    background-color: #E1EAF2;

    border-radius: 6px;

    cursor: pointer;

}


.challenge_depart_item:hover, .challenge_depart_item_selected{

    color: #FFF;

    background-color: #225599;

}

在Eclipse中启动Tomcat后,在浏览器中输入http://localhost:8080/medical/challenge.act,查看此时的效果:

wKiom1OF7d2BnmiAAAD8eJagRvQ761.jpg


11、当用户没有登录时直接选择“下战书”菜单,此时会先让用户登录(这个功能是上篇博文实现),但用户的习惯是输入用户名和密码后直接回车,而不是用鼠标点击登录,所以这里还需要对“登录”按钮绑定回车事件

在login.js文件中增加绑定回车事件方法bindEvent4Login(),并在文档加载完后的方法中调用它。s

/**

 * 登录界面"确定"按钮绑定回车键盘事件

 */

function bindEvent4Login(){

    $(document).keydown(function(event){

        if(event.keycode == 13){

            systemUserLogin(false);

        }

    });

}


12、在IE9浏览器下进入“下战书”页面,发现内容并没有居中,这个是由于challenge.html中没有设置文档类型,解决办法在challenge.html最上面添加<!DOCTYPE HTML>的原因

13、在IE9浏览器下placeholder不生效,这里给出一个通用的解决方法。


【备注】:IE10已支持HTML5的placeholder属性


(1)在common.js中定义bindPlaceHolder()方法

/**

 * 为组件绑定placeholder属性,主要为了兼容IE

 */

function bindPlaceHolder(component){

    var isSupport = 'placeholder' in document.createElement('input');

    if(!isSupport){

        component.blur(function(){

            if(!component.val() || component.val() == component.attr("placeholder")){

                component.val(component.attr("placeholder"));

                component.css("color", "#999");

            }

        }).focus(function(){

            if(component.val() == component.attr("placeholder")){

                component.val("");

            }

            component.css("color", "");

        });


        // 使其失去焦点

        component.blur();

    }

}


(2)修改challenge.js文件,把initInputListener()重命名为initInputComponent(),修改内容如下:

/**

 * 初始化文本框

 */

function initInputComponent(){

    var textareaArray = new Array("challenge_title_id", "challenge_prescript_id", "challenge_challenger_id");

    $.each(textareaArray, function(i, item){

        var dynamicItem = $("#" + item);

        // 绑定PlaceHolder

        bindPlaceHolder(dynamicItem);


        // 设置textArea高度自适应

        dynamicItem.bind("input", function(event){

            this.style.height = this.scrollHeight - 2 + "px";

        });

    });

}



【备注】:待续.......

由于一篇完成一个功能点存在困难,所以会把一个功能点切为几个博文。同时由于工作和家庭原因,所以更改时间周期较长,请大家见谅







本文出自 “青客” 博客,请务必保留此出处http://qingkechina.blog.51cto.com/5552198/1418856

目录
相关文章
|
11天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
1天前
|
设计模式 开发框架 数据库
Python Web开发主要常用的框架
Python Web开发框架包括Django、Flask、Tornado和Pyramid。Django适用于复杂应用,提供ORM、模板引擎等全套功能;Flask轻量级,易于扩展,适合小型至中型项目;Tornado擅长处理高并发,支持异步和WebSockets;Pyramid灵活强大,可适配多种数据库和模板引擎,适用于各种规模项目。选择框架需依据项目需求和技术栈。
8 2
|
1天前
|
安全 测试技术 持续交付
在Python Web开发中,测试是一个至关重要的环节
【5月更文挑战第12天】在Python Web开发中,测试至关重要,包括单元测试(unittest模块)、集成测试、功能测试、系统测试、验收测试、性能测试、安全测试和端到端测试。常用的测试工具有unittest、pytest、selenium、requests和coverage。遵循“测试先行”和“持续集成”原则,确保代码质量与稳定性。
8 3
|
2天前
|
编解码 数据库 计算机视觉
LabVIEW开发基于Web数字图像处理
LabVIEW开发基于Web数字图像处理
|
5天前
|
前端开发 JavaScript Java
Java与Web开发的结合:JSP与Servlet
Java与Web开发的结合:JSP与Servlet
8 0
|
5天前
|
存储 程序员 API
python web开发示例详解
python web开发示例详解
13 0
|
5天前
|
XML 前端开发 JavaScript
CSR(客户端渲染)和AJAX在Web开发中各自扮演不同的角色
【5月更文挑战第8天】CSR(客户端渲染)与AJAX在Web开发中各司其职。CSR提供初始HTML框架,通过JavaScript在浏览器端获取并渲染数据,提升交互性和响应速度。AJAX则实现页面局部更新,如实时搜索,不刷新页面即可获取数据。CSR可能因DOM操作多而引发性能问题,但可优化解决;AJAX适合频繁交互场景,提高响应性。两者在不同需求下各有优势,需按项目选择适用技术。
13 4
|
5天前
|
前端开发 搜索推荐 安全
AJAX和CSR(客户端渲染)是Web开发中常用的两种技术
【5月更文挑战第8天】AJAX提升用户体验,减轻服务器压力,但对搜索引擎不友好且增加开发复杂度,易引发安全问题。CSR提供快速响应和交互性,改善用户体验,但首屏加载慢,搜索引擎支持不足,同样面临安全挑战。两者各有适用场景,需按项目需求选择。
10 0
|
6天前
|
前端开发 JavaScript 开发者
新一代前端框架:革命性的Web开发利器
传统的前端框架在满足日益复杂的Web开发需求上逐渐显露出局限性,而新一代前端框架的出现,以其革命性的设计和功能,重新定义了Web开发的标准。本文将介绍这些新一代前端框架的特点和优势,并探讨它们在实际项目中的应用。
|
8天前
|
安全 测试技术 PHP
掌握现代Web开发:PHP 8的新特性与最佳实践
【5月更文挑战第5天】 在当今快速发展的网络世界中,PHP作为一种流行的服务器端脚本语言,持续地演化着。最新的PHP 8版本引入了一系列令人兴奋的新特性和性能改进,为开发者提供了更加强大和灵活的工具。本文将深入探讨PHP 8中的新特性,包括联合类型、名称参数、匹配表达式等,并分享一些最佳实践,帮助开发者提高代码质量,优化性能,并确保安全性。通过这些实用技巧和示例,您将能够构建更高效、更安全的PHP应用程序。