基于web 火车票务管理系统设计与实现

基于web 火车票务管理系统设计与实现
博主介绍:翰文编程 专注于Java(springboot ssm 等开发框架) vue  .net  php phython node.js    uniapp 微信小程序 等诸多技术领域和课设项目实战、企业信息化系统建设,从业十八余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了2000+题目解决方法案例  方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
文末下方有源码获取地址

3.4 系统总体设计

3.4.1 功能设计

火车票务管理系统主要用户信息管理与查看,管理员信息管理与查看,新闻信息管理与查看,列车信息管理与查看,途径站点信息管理与查看,订票信息管理与查看等功能,具体功能模块图如3.1所示:

图3.1 系统总体模块图

3.4.2 登录流程

当管理员需要登录的时候,需要有响应的页面来实现这一功能。登录界面是用来支持用户进行登录功能操作的界面,当在界面中输入普通用户的用户名、密码,就可以通过身份验证进入该系统。 登录界面需要让用户输入用户名、密码。如果是错误登录信息造成的还要显示错误信息。否则,当信息输入和权限选择正确时,将分别将用户导入各自对应的操作界面首页。登录流程具体如下:

图3.2 管理员登录流程图

管理员登录信息验证界面是非常重要的一部分,它接收登录表单提交的信息,并在用户信息表里检验是否存在对应的用户,和判断用户的类型以便获得相应的权限。

3.5 数据库设计

3.5.1 概念模型设计

将需求分析得到的用户需求抽象为信息结构,即概念模型的过程就是概念结构设计,它是整个数据库设计的关键。

(2)系统中实体E-R图

根据火车票务管理系统的详细设计系统的要求,规划出了以下一些实体,用户实体,管理员实体,新闻实体,列车实体,途径站点实体,订票实体。

用户信息实体,主要包括 用户编号,用户名,密码,姓名,性别,电话,邮箱,证件号 等信息实体。如图3.3所示:

图3.3 用户实体属性图

管理员信息实体,主要包括 管理员编号,用户名,密码,姓名,性别,电话,邮箱 等信息实体。如图3.4所示:

图3.4 管理员实体属性图


新闻信息实体,主要包括 新闻编号,标题,内容,发布时间 等信息实体。如图3.5所示:

图3.6 新闻实体属性图

列车信息实体,主要包括 列车编号,车次,起始站,目的站,发车时间,到站时间,票价,普通座价格,卧铺价格,软卧价格 等信息实体。如图3.7所示:

图3.7 列车实体属性图

途径站点信息实体,主要包括 途径站点编号,车次,站点,到站时间,停留时间 等信息实体。如图3.8所示:

图3.8 途径站点实体属性图

订票信息实体,主要包括 订票编号,流水,车次,日期,用户,证件号,座位类型,价格,状态,类型 等信息实体。如图3.9所示:

图3.9 订票实体属性图

3.5.2 关系模式设计

一个实体型转换为一个关系模式的集合。实体的属性就是关系的属性,实体的码就是关系的码。

对于实体间的联系则有以下不同的情况:

火车票务管理系统中,实体有用户实体,管理员实体,新闻实体,列车实体,途径站点实体,订票实体等等,他们之间的关系如图3.10所示:

图3.10 E-R关系图


3.5.3 逻辑结构设计

1 用户( 用户编号,用户名,密码,姓名,性别,电话,邮箱,证件号 )

2 管理员( 管理员编号,用户名,密码,姓名,性别,电话,邮箱 )

3 新闻( 新闻编号,标题,内容,发布时间 )

4 列车( 列车编号,车次,起始站,目的站,发车时间,到站时间,票价,普通座价格,卧铺价格,软卧价格 )

5 途径站点( 途径站点编号,车次,站点,到站时间,停留时间 )

6 订票( 订票编号,流水,车次,日期,用户,证件号,座位类型,价格,状态,类型 )

3.5.4 物理结构设计

由各个关系模式和根据需求分析阶段数据字典的数据项描述,给出各数据表结构。

(1)用户信息表如表3.1所示:

表3.1 用户信息表

序号

字段名称

数据类型

长度

主键

描述

1

yhid

INTEGER

11

用户编号

2

yhm

VARCHAR

40

用户名

3

mm

VARCHAR

40

密码

4

xm

VARCHAR

40

姓名

5

xb

VARCHAR

40

性别

6

dh

VARCHAR

40

电话

7

yx

VARCHAR

40

邮箱

8

zjh

VARCHAR

40

证件号

(2)管理员信息表如表3.2所示:

表3.2 管理员信息表

序号

字段名称

数据类型

长度

主键

描述

1

glyid

INTEGER

11

管理员编号

2

yhm

VARCHAR

40

用户名

3

mm

VARCHAR

40

密码

4

xm

VARCHAR

40

姓名

5

xb

VARCHAR

40

性别

6

dh

VARCHAR

40

电话

7

yx

VARCHAR

40

邮箱

(3)新闻信息表如表3.3所示:

表3.3新闻信息表

序号

字段名称

数据类型

长度

主键

描述

1

xwid

INTEGER

11

新闻编号

2

bt

VARCHAR

40

标题

3

nr

VARCHAR

40

内容

4

fbsj

VARCHAR

40

发布时间

(4)列车信息表如表3.4所示:

表3.4 列车信息表

序号

字段名称

数据类型

长度

主键

描述

1

lcid

INTEGER

11

列车编号

2

cc

VARCHAR

40

车次

3

qsz

VARCHAR

40

起始站

4

mdz

VARCHAR

40

目的站

5

fcsj

VARCHAR

40

发车时间

6

dzsj

VARCHAR

40

到站时间

7

pj

VARCHAR

40

票价

8

ptzjg

VARCHAR

40

普通座价格

9

wpjg

VARCHAR

40

卧铺价格

10

rwjg

VARCHAR

40

软卧价格

(5)途径站点信息表如表3.5所示:

表3.5 途径站点信息表

序号

字段名称

数据类型

长度

主键

描述

1

tjzdid

INTEGER

11

途径站点编号

2

cc

VARCHAR

40

车次

3

zd

VARCHAR

40

站点

4

dzsj

VARCHAR

40

到站时间

5

tlsj

VARCHAR

40

停留时间

(6)订票信息表如表3.6所示:

表3.6 订票信息表

序号

字段名称

数据类型

长度

主键

描述

1

dpid

INTEGER

11

订票编号

2

ls

VARCHAR

40

流水

3

cc

VARCHAR

40

车次

4

rq

VARCHAR

40

日期

5

yh

VARCHAR

40

用户

6

zjh

VARCHAR

40

证件号

7

zwlx

VARCHAR

40

座位类型

8

jg

VARCHAR

40

价格

9

zt

VARCHAR

40

状态

10

lx

VARCHAR

40

类型

3.6 本章小结

本章主要是系统的分析与设计,主要分为两个方面来设计,分别为总体和数据库设计,在总体设计方面,主要是根据需求分析,来设计系统的登录以及功能的开发设计;在数据库方面是设计系统的物理结构的设计和逻辑结构的设计。


4 系统的实现

详细设计阶段的任务就是把在总体设计阶段提出的比较抽象概括的解决问题的方法具体化,也就是“应该怎样具体地实现这个系统”。在本阶段将包括数据库的设计和每个模块的详细设计,确定实现模块功能所需要的算法和数据结构。

本系统的名称是“火车票务管理系统”,界面要求是简洁大方,避免过度包装。

4.1 登录模块界面

登录系统首页,出现用户名、密码的输入框,填写用户名和密码点击【提交】按钮,即可登录。具体的登录页面如图6.1所示:

图6.2 登录界面图

4.2 用户管理界面

4.3 新闻管理界面

package com.action; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import com.bean.*; import com.dao.*; @Controller @RequestMapping(value="/xinwen") public class xinwenAction { /** * 自动注入业务逻辑层,注入方式使用了注解自动注入 */ @Resource xinwenDao xinwendao; @RequestMapping(value="/addPage") public String addPage(xinwen xinwen,HttpServletRequest request){ Map<String,Object> map= new HashMap<String,Object>(); System.out.println("addPageok"); return "xinwen/xinwenadd"; } @RequestMapping(value="/add") public String add(xinwen xinwen,HttpServletRequest request){ Map<String,Object> map= new HashMap<String,Object>(); //String name=(String)request.getParameter("name"); map.put("xwid", xinwen.getXwid());//新闻编号 map.put("bt", xinwen.getBt());//标题 map.put("nr", xinwen.getNr());//内容 map.put("fbsj", xinwen.getFbsj());//发布时间 String xwid=(String)xinwen.getXwid();//新闻编号 String bt=(String)xinwen.getBt();//标题 String nr=(String)xinwen.getNr();//内容 String fbsj=(String)xinwen.getFbsj();//发布时间 xinwendao.save(map); request.setAttribute("msg", "<script>alert('添加成功');</script>"); System.out.println("addok"); return "xinwen/xinwenadd"; } /**删除 * */ @RequestMapping(value="/del") public String del(Integer id,HttpServletRequest request,Map<String,Object> map){ // Map<String,Object> map= new HashMap<String,Object>(); String a=(String)request.getParameter("keyid"); id=Integer.parseInt(a); request.setAttribute("msg", "<script>alert('删除成功');</script>"); xinwendao.del(id); return selectall(null,map,request); } /** * 修改xinwen信息 */ @RequestMapping(value="/update") public String update(xinwen xinwen,HttpServletRequest request,Map<String,Object> map1){ Map<String,Object> map= new HashMap<String,Object>(); map.put("xwid", xinwen.getXwid());//新闻编号 map.put("bt", xinwen.getBt());//标题 map.put("nr", xinwen.getNr());//内容 map.put("fbsj", xinwen.getFbsj());//发布时间 String xwid=(String)xinwen.getXwid();//新闻编号 String bt=(String)xinwen.getBt();//标题 String nr=(String)xinwen.getNr();//内容 String fbsj=(String)xinwen.getFbsj();//发布时间 request.setAttribute("msg", "<script>alert('修改成功');</script>"); xinwendao.update(map); return selectall(null,map1,request); } /** * 查询xinwen信息 */ @RequestMapping(value="/modify") public String modify(Integer id,Map<String,Object> map,HttpServletRequest request){ String keyid=(String)request.getParameter("keyid"); List<Map<String,Object>> list= new ArrayList<Map<String,Object>>(); list=xinwendao.select(Integer.parseInt(keyid)); request.setAttribute("xwid", list.get(0).get("xwid"));//新闻编号 request.setAttribute("bt", list.get(0).get("bt"));//标题 request.setAttribute("nr", list.get(0).get("nr"));//内容 request.setAttribute("fbsj", list.get(0).get("fbsj"));//发布时间 return "xinwen/xinwenmodify"; } @RequestMapping(value="/detail") public String detail(Integer id,Map<String,Object> map,HttpServletRequest request){ String keyid=(String)request.getParameter("keyid"); List<Map<String,Object>> list= new ArrayList<Map<String,Object>>(); list=xinwendao.select(Integer.parseInt(keyid)); request.setAttribute("xwid", list.get(0).get("xwid"));//新闻编号 request.setAttribute("bt", list.get(0).get("bt"));//标题 request.setAttribute("nr", list.get(0).get("nr"));//内容 request.setAttribute("fbsj", list.get(0).get("fbsj"));//发布时间 return "xinwen/xinwendetail"; } /** * 查询xinwen信息 */ @RequestMapping(value="/selectall") public String selectall(Integer id,Map<String,Object> map,HttpServletRequest request){ List<Map<String,Object>> list= new ArrayList<Map<String,Object>>(); Map<String,Object> map1= new HashMap<String,Object>(); String xwid=(String)request.getParameter("xwid");//新闻编号 if(xwid!=null&&!xwid.equals("")){ map1.put("xwid",xwid);//新闻编号 } String bt=(String)request.getParameter("bt");//标题 if(bt!=null&&!bt.equals("")){ map1.put("bt",bt);//标题 } String nr=(String)request.getParameter("nr");//内容 if(nr!=null&&!nr.equals("")){ map1.put("nr",nr);//内容 } String fbsj=(String)request.getParameter("fbsj");//发布时间 if(fbsj!=null&&!fbsj.equals("")){ map1.put("fbsj",fbsj);//发布时间 } list=xinwendao.selectAll(map1); System.out.println("listsize="+list.size()); map.put("mylist", list); return "xinwen/xinwenlist"; } /** * 查询xinwen信息 */ @RequestMapping(value="/list") public String list(Integer id,Map<String,Object> map,HttpServletRequest request){ List<Map<String,Object>> list= new ArrayList<Map<String,Object>>(); Map<String,Object> map1= new HashMap<String,Object>(); String xwid=(String)request.getParameter("xwid");//新闻编号 if(xwid!=null&&!xwid.equals("")){ map1.put("xwid",xwid);//新闻编号 } list=xinwendao.selectAll(map1); System.out.println("listsize="+list.size()); map.put("mylist", list); return "xinwen/list"; } } 

4.4 列车管理界面

大家点赞、收藏、关注、评论啦 其他的定制服务 商务合作 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者

Read more

【薅羊毛教程】LLaMaFactory 不用本地跑!免费 GPU,一键微调大模型

【薅羊毛教程】LLaMaFactory 不用本地跑!免费 GPU,一键微调大模型

一、环境 之前介绍过本地部署LLaMaFactory微调平台(https://blog.ZEEKLOG.net/m0_73982863/article/details/159208213?spm=1001.2014.3001.5501),如果你还在为设备问题而烦恼,那就来薅羊毛吧(手动狗头)。 首先注册魔搭社区,绑定个人阿里云账号即可,详情见:https://www.modelscope.cn/my/mynotebook ;然后就可免费获得36小时GPU环境。 8核:CPU有8个核心,主要负责数据的调度和预处理;32GB:内存,数据从硬盘加载后会暂时存放这里;显存24G;(比我自己的老古董好多 T-T) Ubuntu 22.04:Linux操作系统; CUDA 12.8.1:英伟达的并行计算平台。12.8版本意味着它支持最新的RTX

Chat took too long to get ready.Please ensure...<VSCode\Copilot>

Chat took too long to get ready.Please ensure...<VSCode\Copilot>

在VScode里面,应用Copilot提问,无法解决问题,该怎么解决呢? 1、在vscode里面,按键  ctrl + shift + p,输入setting,即看到setting.json文件 2、在setting.json文件中添加下面两行   "github.copilot.nextEditSuggestions.enabled": true,   "chat.extensionUnification.enabled":false, 参考图片25、26行 3、保存,重启vscode 4、重启后,点击vscode左下角人头像,查看是否有让授权Copilot的,如果有点击一下授权,解决!!! 如果这样无法解决,建议检查账号是不是不能使用Copilot功能了

ComfyUI Prompt Control:精准驾驭AI绘画提示词

ComfyUI Prompt Control:精准驾驭AI绘画提示词

摘要:本文详细介绍了ComfyUI Prompt Control,阐述其功能特点、使用方法及相关技巧。通过掌握这些内容,用户能更精准地控制AI绘画过程,生成符合预期的图像,提升创作效率与质量。 一、引言 在AI绘画领域,ComfyUI以其强大的功能和灵活性备受创作者青睐。而ComfyUI Prompt Control(提示词控制)则是其中关键的一环,它允许用户对提示词进行精细调整,从而更精准地引导AI生成理想的图像,为创作带来了更多可能性和可控性。 二、ComfyUI Prompt Control概述 ComfyUI Prompt Control提供了一系列工具和方法,让用户能够方便地编辑提示词,实现多种常见操作的提示词可控。它支持通过提示词控制Lora加载与调度、进行高级文本编码、区域提示等功能,还能生成与手工制作相似的动态图形。 三、主要功能 * 提示词权重调整:可使用<prompt:weight>语法为提示词部分加权,如(flowers:1.2)在蓝色花瓶里能让模型更强调花朵。也可通过快捷键Ctrl