其他分享
首页 > 其他分享> > 邮局订报子系统设计

邮局订报子系统设计

作者:互联网

邮局订报管理子系统设计

1 课题内容和要求

1.1课题描述

设计邮局订报管理子系统,模拟客户在邮局订购报纸的管理系统,包括查询报纸、订阅报纸、开票、付钱结算、订购后的查询、统计等的处理情况,并需要一定的管理情况;

1.2 课题要求

1、可随时查询出可订购报纸的详细情况,如报纸编号(PNO)、报纸名称(PNA)、报纸单价(PPR)、报纸版面规格(PSI)、报纸出版单位(PDW)等,这样便于客户选订;

2、客户查询报纸情况后即可订购所需报纸,可订购多种报纸,每种报纸可订若干份,交清所需金额后,就算订购处理完成;

3、为便于邮局投递报纸,客户需写明如下信息:客户姓名(CNA)、客户电话(CTE)、客户地址(CAD)及邮政编码(CPO),邮局将即时为每一客户编制唯一代码(CNO);

4、邮局对每种报纸订购人数不限,每个客户可多次订购报纸,所订报纸亦可重复;

具体要完成的任务是:

A.请认真作系统需求分析,设计出反映本系统的E-R图(需求分析,概念设计);

B. 写出相应设计的E-R图的关系模式,根据设计所需也可以增加辅助关系模式,并找出各关系模式的关键词(逻辑模式);

C. 在已设计的关系模式基础上开发设计功能子系统,要求子系统能完成相应的要求(物理设计、设施与试运行);

D.子系统设计完成后请书写课程设计报告,设计报告要围绕数据应用系统开发的步骤来写,力求清晰流畅;

2 需求分析

2.1 功能需求分析

(1)在用户信息管理部分,要求:

a.可以查询用户信息。

b.可以对读者信息进行修改操作。

(2 )在可订购报纸信息管理部分,要求:

a.可以浏览可订购报纸信息:

b.可以对可订购报纸信息进行维护,包括添加及修改,删除的操作。

(3)在订购信息管理部分,要求:。

a.可以查询订阅报纸的信息。

b.可以对订购信息进行维护操作,包括添加及修改,删除的操作。

(4)在管理者信息管理部分,要求:

a.显示当前数据库中管理者情况。

b.对管理者信息维护操作

2.2 数据需求分析

邮局订报系统需要完成功能主要有:

  1. 客户基本信息的输入,包括用户名,客户姓名,客户电话,客户地址及邮政编码

  2. 客户基本信息的查询、修改,包括客户姓名,客户电话,客户地址及邮政编码

  3. 可订购报纸的基本信息的输入,包括报纸编号,报纸名称,报纸单价,报纸版面规格,报纸出版单位。

  4. 可订购报纸的基本信息的查询,修改,包括报纸编号,报纸名称,报纸单价,报纸版面规格,报纸出版单位。

  5. 客户输入订单信息,包括客户代码,报纸编码,订购分数,开始订购时间,订购截止时间。

  6. 客户的订单信息查询,包括客户代码,报纸编码,订购分数,开始订购时间,订购截止时间。

3 系统设计

3.1 功能模块设计

图2.1.2.1 报纸信息实体E-R图

图2.1.3.1 订单信息实体E-R图

图2.1.4.1 客户信息实体图

2.1.5 总的信息实体E-R图:

3.3 数据库逻辑设计

newspaper_info(**PNO**,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR);

consumer(**CNO**,CNA,CTE,CAD,CPO);

subscri_record(**CNO,PNO**,STA_SUB,END_SUB,NUM);

3.4 数据库物理设计

表2.2.1 newspaper_info 报纸信息

表中列名 数据类型 可否为空 说明
PNO varchar not null(主键) 报纸编号
PNA vachar not null 报纸名称
PDATE varchar not null 刊期
PUB_DATE varchar not null 出版日期
PPR int not null 订阅单价
PSI varchar not null 报纸版面规格
PDW varchar not null 报纸出版单位
PYR int not null 全年价

表2.2.2 consumer 客户信息

表中列名 数据类型 可否为空 说明
CNO varchar not null(主键) 唯一代码
CNA varchar not null 客户姓名
CTE varchar not null 客户电话
CAD varchar not null 客户地址
CPO varchar not null 邮政编码

表2.2.3 subscri_record 订购记录信息

表中列名 数据类型 可否为空 说明
CNO varchar not null(外主键) 唯一代码
PNO varchar not null(外主键) 报纸编码
NUM int not null 订购份数
STA_SUB datetime not null 开始订购时间
END_SUB datetime not nul 结束订购时间

3.5 数据库表间联系

4系统实现

系统主界面是这样的:

4.1 查询数据模块实现

总体实现两个功能

1.查询某个表,并把某个表打印出来

2.查询某个表的某个列并打印出来

4.2 增加数据模块实现

4.3 删除模块的实现

3.1.2 报纸信息表的建立

create table newspaper_info(

​   PNO varchar(20) primary key not null,

​   PNA varchar(20) not null,

​   PDATE varchar(20) not null,

​   PUB_DATE varchar(20) not null,

​   PPR float not null,

​   PSI varchar(20) not null,

​   PDW varchar(20) not null,

​   PYR float not null

)

3.1.3 客户信息表的建立

create table consumer(

​   CNO varchar(20) primary key not null,

​   CNA varchar(20) not null,

​   CTE varchar(20) not null,

​   CAD varchar(20) not null,

​   CPO varchar(20) not null

)

3.1.4 订单表的建立

create table subscri_record (

​   CNO varchar(20) ,

​   PNO varchar(20) ,

​   

​   STA_SUB datetime not null,

​   END_SUB datetime not null,

​   NUM int NOT NULL,

​   

​   foreign key(PNO) references newspaper_info(PNO),

​        foreign key(CNO) references consumer(CNO),

​   primary key(CNO,PNO)

)

3.2 数据初始化

3.2.1 将已有报纸加入表newspaper_info

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0001','人民日报','日报','每日',0.8,'A1','《人民日报》社',288.0)

 

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0002','人民政协报','一周六报','周一至周六',1.05,'A1','《人民政协》社',280.0)

 

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0003','中国日报','一周六报','周一至周六',1.5,'A2','《中国日报》社',462.0)

 

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0004','文摘报','一周三报','周二周四周六',0.66,'A2','《文摘报》社',99.0)

 

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0005','中国能源报','周报','周一',6.0,'A3','《中国能源报》社',288.0)

 

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0006','中国教育报','日报','每日',0.8,'A1','《中国教育报》社',288.0)

 

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0007','北京日报','日报','每日',0.6,'A1','《北京日报》社',216.0)

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0008','光明日报','日报','每日',0.8,'A1','《光明日报》社',288.0)

insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)

   values('0009','音乐周报','周报','周三',1.0,'A3','《音乐周报》社',49.8)

3.2.2 将客户加入到consumer表中

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A001','徐春','13027155962','浠水','4320802')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A002','程文哲','13027451962','天门','4140802')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A003','侯小伟','142027155962','安陆','4320142')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A004','白炎','13027151472','金华','5327802')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A005','夏俊','13021478962','武穴','43204752')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A006','珍珍','13145255962','浠水','4320802')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A007','郑翩','130012452962','洪湖','4324202')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A008','何其','13012785962','荆州','4317502')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A009','王晶晶','13054682962','河北','1420802')

insert into consumer(CNO,CNA,CTE,CAD,CPO)

   values('A0010','钱建','1142575962','汉川','4314002')

3.2.3 将已存在的订单加入到subscri_record表中

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A001','0001','2013-01-01','2013-06-01',3)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A001','0003','2013-01-01','2013-12-01',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A002','0001','2013-01-01','2013-12-01',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A003','0003','2013-1-1','2013-12-1',2)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A004','0003','2013-1-1','2013-6-1',3)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A004','0006','2013-1-1','2013-12-1',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A005','0002','2013-1-1','2013-6-1',2)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A005','0005','2013-1-1','2013-12-1',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A006','0004','2013-1-1','2013-12-1',3)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A006','0006','2013-1-1','2013-12-1',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A007','0001','2013-1-1','2013-12-1',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A008','0008','2013-1-1','2013-12-1',2)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A008','0009','2013-1-1','2013-12-1',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A009','0007','2013-1-1','2013-12-1',2)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A009','0003','2013-1-1','2013-12-1',1)

insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM)

   values('A0010','0001','2013-1-1','2013-12-1',2)

5 代码调试与功能测试

5.1测试结果

首先测试查询功能

测试第一个功能

测试第二个功能

在测试插入功能

再看看插入进去了没,测试成功

然后测试删除操作

6 收获与体会

经过了一周的奋战,我完成了自己的课程设计,这个设计的java代码处理比价难的地方*极少*是参考网上的外,其他全是自己写的,因为对于java swing 不太会,甚至对java swing 一窍不通,所以我写了个命令行的界面,先从简单的查询的操作开始,到复杂的插入删除操作,通过从键盘接受的数据作为变量,然后将变量做合一起作为一个sql语句执行,费了不少劲。刚开始根本不知道java如何与数据库连接,经查询要用到jdbc,然后还要驱动,接着去网上找驱动的jar的包,加载的时候路径经历了各种错误,最终一一克服,唯一的缺憾就是没能实现图形化界面,因为实在不会java swing,不过听说java swing用的也不多了,总之,最后我凭借着大一仅存的java基础,写完了接近四百行的代码,虽然语句很简单,但总有一种莫名的额成就感。

                                                                **参考文献**

[1] 钱雪忠,王燕玲,林挺.数据库原理及技术[M].北京:清华大学出版社,2011.

[2] 钱雪忠,罗海驰,陈国俊.数据库原理及技术课程设计[M].北京:清华大学出版社,2014.

附  录

附录1源程序部分清单

附录1.1登陆代码

附录1.2全部代码

import java.sql.*;

import java.util.Scanner;

public class test {

 

​    //作为用户查询造作时输入要查询的列数

​    Connection conn;

​    //创建一个返回值为Connection的方法

​    public Connection getConnection(){

​        try {

​            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

​            System.out.println("数据库驱动加载成功");

​            conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=test3","sa","1");

​            if(conn!=null){

​                System.out.println("数据库连接成功");

​            }

​        } catch (Exception e) {

​            // TODO Auto-generated catch block

​            e.printStackTrace();

​        }

​        //返回Connection对象

​        return conn;

​    }

 

​    public static void main(String[] args) {

​        // TODO Auto-generated method stub

​        function gongnengxuanxiang = new function();

​        gongnengxuanxiang.gongneng();

​    }

 

}

class charu{//插入操作

​    String sql01;

 

​    int num03;

​    void charucaozuo(){

​        test getcon = new test();

​        getcon.getConnection();

​        Scanner scan = new Scanner(System.in);

​        System.out.println("请你选则要操作的表的序号:1.consumer   2.newspaper_info   3.subscri_record");

​        num03 = scan.nextInt();

​        if(num03<=0||num03>=4){

​            while(num03!=1&&num03!=2&&num03!=3)

​            {

​                System.out.println("不在范围内,请重新输入查询的表的序号:");

 

​                System.out.println("1.consumer   2.newspaper_info   3.subscri_record");

​                num03 = scan.nextInt();

​            }

​        }

​        if(num03==1){

​            Scanner sc = new Scanner(System.in);

​            System.out.println("CNO     CNA     CTE     CAD     CPO");

 

​            System.out.println("请输入您5个的数据,以1个空格分开:");

 

​            String s = sc.nextLine();

​            String[] x = s.split(" ");

​            sql01="insert into consumer(CNO,CNA,CTE,CAD,CPO) values(' "+x[0]+" ',' "+x[1]+" ',' "+x[2]+" ',' "+x[3]+" ',' "+x[4]+" ')";

​        }

​        if(num03==2){

​            Scanner sc = new Scanner(System.in);

​            System.out.println("PNO     PNA     PDATE     PUB_DATE     PPR      PSI     PDW     PYR");

​            System.out.println("请输入您8个的数据,以1个空格分开:");

​            String s = sc.nextLine();

​            String[] x = s.split(" ");

​            int a = Integer.parseInt(x[4]);

​            int b = Integer.parseInt(x[7]);

​            sql01="insert into newspaper_info(PNO,PNA,PDATE,PUB_DATE,PPR,PSI,PDW,PYR)values(' "+x[0]+" ',' "+x[1]+" ',' "+x[2]+" ',' "+x[3]+" ',' "+a+" ',' "+x[5]+" ',' "+x[6]+" ',' "+b+" ')";

​        }

​        if(num03==3){

​            Scanner sc = new Scanner(System.in);

​            System.out.println("CNO     PNO     STA_SUB     END_SUB     NUM");

​            System.out.println("请输入您5个的数据,以1个空格分开:");

​            String s = sc.nextLine();

​            String[] x = s.split(" ");

​            int c = Integer.parseInt(x[4]);

​            sql01="insert into subscri_record(CNO,PNO,STA_SUB,END_SUB,NUM) values(' "+x[0]+" ',' "+x[1]+" ',' "+x[2]+" ',' "+x[3]+" ',' "+c+" ')";

​        }

​        try {

​            PreparedStatement Ps = getcon.conn.prepareStatement(sql01);

​            Ps.executeUpdate();

​            Ps.close();

​        } catch (SQLException e) {

​            e.printStackTrace();

​        }

​    }

}

class shanchu{//删除操作

​    String sql01;

​    int num03;

​    void shanchucaozuo(){

​        test getcon = new test();

​        getcon.getConnection();

​        Scanner scan = new Scanner(System.in);

​        System.out.println("请你选则要操作的表的序号:1.consumer   2.newspaper_info   3.subscri_record");

​        num03 = scan.nextInt();

​        if(num03<=0||num03>=4){

​            while(num03!=1&&num03!=2&&num03!=3)

​            {

​                System.out.println("不在范围内,请重新输入查询的表的序号:");

​                System.out.println("1.consumer   2.newspaper_info   3.subscri_record");

​                num03 = scan.nextInt();

​            }

​        }

​        if(num03==1){

​            Scanner sc = new Scanner(System.in);

​            System.out.println("CNO     CNA     CTE     CAD     CPO");

​            System.out.println("请输入您要删除所在行的CNO的值:");

​            String s = sc.nextLine();

​            sql01="delete from consumer where CNO='"+s+"'";

​        }

​        if(num03==2){

​            Scanner sc = new Scanner(System.in);

​            System.out.println("PNO     PNA     PDATE     PUB_DATE     PPR      PSI     PDW     PYR");

​            System.out.println("请输入您要删除所在行的PNO的值:");

​            String s = sc.nextLine();

​            sql01="delete from newspaper_info where PNO='"+s+"'";

​        }

​        if(num03==3){

​            Scanner sc = new Scanner(System.in);

​            System.out.println("CNO     PNO     STA_SUB     END_SUB     NUM");

​            System.out.println("请输入您要删除所在行的CNO的值:");

​            String s = sc.nextLine();

​            sql01="delete from newspaper_info where PNO='"+s+"'";

​        }

​        try {

​            PreparedStatement Ps = getcon.conn.prepareStatement(sql01);

​            Ps.executeUpdate();

​            Ps.close();

​        } catch (SQLException e) {

​            e.printStackTrace();

​        }

 

​    }

}

class xiugai{//修改操作

​    String sql01;

​    void xiugaicaozuo(){

​        test getcon = new test();

​        getcon.getConnection();

​        Scanner scan = new Scanner(System.in);

​        System.out.println("请输入你的sql语句:");

​        sql01 = scan.nextLine();

​        System.out.println("你的sql语句:");

​        System.out.println(sql01);

​        try {

​            PreparedStatement Ps = getcon.conn.prepareStatement(sql01);

​            Ps.executeUpdate();

​            Ps.close();

​        } catch (SQLException e) {

​            e.printStackTrace();

​        }

​    }

}

class search {//查询操作

​    int num01;

​    int num02;

​    String sql;

​    void showfuntion01() {//显示用户交互信息,要查询的表

​        Scanner scan = new Scanner(System.in);

​        System.out.println("输入查询的表的序号:");

 

​        System.out.println("1.consumer   2.newspaper_info   3.subscri_record");

​        num02 = scan.nextInt();

​        if(num02<=0||num02>=4){

​            while(num02!=1&&num02!=2&&num02!=3)

​            {

​                System.out.println("不在范围内,请重新输入查询的表的序号:");

​                System.out.println("1.consumer   2.newspaper_info   3.subscri_record");

​                num02 = scan.nextInt();

​            }

​        }

​        if(num02==1){

​            sql = "SELECT * FROM [dbo].[consumer]";

​        }

​        if(num02==2){

​            sql = "SELECT * FROM [dbo].[newspaper_info]";

​        }

​        if(num02==3){

​             sql = "SELECT * FROM [dbo].[subscri_record]";

 

​        }

​    }

​    void showfuntion02() {//显示用户交互信息,要查询的列

​        Scanner scan = new Scanner(System.in);

​        System.out.println("输入查询的列数:");

​        num01 = scan.nextInt();

​    }

​    void Search02() {//查询操作

​        test getcon = new test();

​        getcon.getConnection();

​        //查询

​        try {

​            PreparedStatement Ps = getcon.conn.prepareStatement(sql);

​            ResultSet Rs = Ps.executeQuery();

​            if(num02==1) {

​                System.out.println("CNO     CNA     CTE     CAD     CPO");

​                while (Rs.next()) {

​                    System.out.println(Rs.getString(1) + "\t" + Rs.getString(2) + "\t" + Rs.getString(3) + "\t" + Rs.getString(4) + "\t" + Rs.getString(5) + "\t");

​                }

​            }

​            if(num02==2) {

​                System.out.println("PNO     PNA     PDATE     PUB_DATE     PPR      PSI     PDW     PYR");

​                while (Rs.next()) {

​                    System.out.println(Rs.getString(1) + "\t" + Rs.getString(2) + "\t" + Rs.getString(3) + "\t" + Rs.getString(4) + "\t" + Rs.getString(5) + "\t"+Rs.getString(6) + "\t"+Rs.getString(7) + "\t"+Rs.getString(8) + "\t");

​                }

​            }

​            if(num02==3) {

​                System.out.println("CNO     PNO     STA_SUB     END_SUB     NUM");

​                while (Rs.next()) {

​                    System.out.println(Rs.getString(1) + "\t" + Rs.getString(2) + "\t" + Rs.getString(3) + "\t" + Rs.getString(4) + "\t" + Rs.getString(5) + "\t");

​                }

​            }

​            Rs.close();

​            Ps.close();

​        } catch (SQLException e) {

​            e.printStackTrace();

​        }

​    }

​    

​    void Search01() {//查询操作

​        test getcon = new test();

​        getcon.getConnection();

​        //查询

 

​        try {

​            PreparedStatement Ps = getcon.conn.prepareStatement(sql);

​            ResultSet Rs = Ps.executeQuery();

​            while (Rs.next()) {

 

​                String show = Rs.getString(num01);

 

​                System.out.println(show);

​            }

 

​            Rs.close();

​            Ps.close();

​        } catch (SQLException e) {

 

​            e.printStackTrace();

​        }

​    }

 

}

 

class function{

​    int num;

​    void gongneng(){

​        Scanner scan = new Scanner(System.in);

 

​        while(num!=100){

​            System.out.println("你可以选择以下功能,并输入相应的序号:");

​            System.out.println("100.退出系统  1.查询某个表,并把表的内容全打印出来   2.查询某个表,并把表的某一列打印出来");

​            System.out.println("3.在某个表插入一行数据   4.在某个表中删除一行数据  5.在某个表中修改某一行数据");

​            num= scan.nextInt();

​            if(num<=-1||num>=6){

​                while(num!=1&&num!=2 &&num!=100&&num!=3&&num!=4&&num!=5)

​                {

​                    System.out.println("输入查询的表的序号:");

 

​                    System.out.println("100.退出系统  1.查询某个表,并把表的内容全打印出来   2.查询某个表,并把表的某一列打印出来");

​                    System.out.println("3.在某个表插入一行数据   4.在某个表中删除一行数据  5.在某个表中修改某一行数据");

​                    num = scan.nextInt();

 

 

​                }

​            }

​            if(num==1){

​                funtion01();

 

​            }

​            if(num ==2){

​                funtion02();

​            }

​            if(num==3){

​                funtion3();

​            }

​            if(num==4){

​                funtion4();

​            }

​            if(num==5){

​                funtion5();

​            }

​        }

​    }

 

​    void funtion01(){//查询某个表,并把表打印出来

 

​        search searchsort = new search();

​        searchsort.showfuntion01();

​        searchsort.Search02();

​    }

 

​    void funtion02(){//查询某个表,并把表的某一列打印出来

 

​        search searchsort = new search();

 

​        searchsort.showfuntion01();

​        searchsort.showfuntion02();

​        searchsort.Search01();

​    }

​    void funtion3(){//在某个表插入一行数据

​        charu charucaozuo =new charu();

​        charucaozuo.charucaozuo();

​    }

​    void funtion4(){//在某个表中删除一行数据

​        shanchu shanchucaozuo = new shanchu();

​        shanchucaozuo.shanchucaozuo();

 

​    }

​    void funtion5(){//在某个表中修改某一行数据

​        xiugai xiugaicaozuo = new xiugai();

​        xiugaicaozuo.xiugaicaozuo();

​    }

}

标签:订报,SUB,邮局,System,PNO,println,CNO,子系统,out
来源: https://www.cnblogs.com/suehoo/p/20190628you-ju-ding-bao-zi-xi-tong-she-ji-wan-zhen.html