仿12306购票系统(3)
前面完成了乘车人登录功能的实现,本篇主要是控制台方面的管理
对于整体的控制台的设计,为了能够快速的检验,不进行登录拦截,在控制台的这个模块的controller层增加admin,以及在登录界面的拦截器排除掉admin.
车站
即都有那些车站
create table `station` (`id` bigint not null comment 'id',`name` varchar(20) not null comment '站名',`name_pinyin` varchar(50) not null comment '站名拼音',`name_py` varchar(50) not null comment '站名拼音首字母',`create_time` datetime(3) comment '新增时间',`update_time` datetime(3) comment '修改时间',primary key (`id`),unique key `name_unique` (`name`)
) engine=innodb default charset=utf8mb4 comment='车站';
首先,使用bigint类型的id作为主键,可以支持大量的车站记录。使用唯一标识进行每个车站的管理,便于数据库管理和关联其他表。为了方便查询车站,添加了站名,站名拼音和站名拼音首字母。
火车基础数据的管理
就是一辆火车的数据,这里设计如下
drop table if exists `train`;
create table `train` (`id` bigint not null comment 'id',`code` varchar(20) not null comment '车次编号',`type` char(1) not null comment '车次类型|枚举[TrainTypeEnum]',`start` varchar(20) not null comment '始发站',`start_pinyin` varchar(50) not null comment '始发站拼音',`start_time` time not null comment '出发时间',`end` varchar(20) not null comment '终点站',`end_pinyin` varchar(50) not null comment '终点站拼音',`end_time` time not null comment '到站时间',`create_time` datetime(3) comment '新增时间',`update_time` datetime(3) comment '修改时间',primary key (`id`),unique key `code_unique` (`code`)
) engine=innodb default charset=utf8mb4 comment='车次';
其中的车次类型是因为火车不仅仅有动车,还有高铁,普通列车等。可以仿照乘客表的乘客类型来进行车次车次类型的设计。为了计算不同车次的票价,在枚举类中为不同的车次类型增加系数,例如,高铁为1.2,表示票价=1.2*每公里单价*公里,实际上可能更加的复杂。这里只是基础讨论功能的实现。看上面的事件类型发现,出发时间,到站时间和新增时间与修改时间的类型不同,其中datatime类型非常适合需要同时记录具体哪一天的什么时候发生的场景。time类型记录事件发生的具体时间。这样设计是因为此时是基础的数据功能,并不是每日的车次,火车每天出发的时间是一定的,因此不需要记录具体的日期。
为了是选择时间,而不是手动的输入时间,可以在前端增加控件,如果是time类型,增加a-time-picker,如果是time类型,增加a-datepicker,为了方便,可以在自定义的代码生成器实现。
<#elseif field.javaType=='Date'><#if field.type=='time'><a-time-picker v-model:value="${domain}.${field.nameHump}" valueFormat="HH:mm:ss" placeholder="请选择时间" /><#elseif field.type=='date'><a-date-picker v-model:value="${domain}.${field.nameHump}" valueFormat="YYYY-MM-DD" placeholder="请选择日期" /><#else><a-date-picker v-model:value="${domain}.${field.nameHump}" valueFormat="YYYY-MM-DD HH:mm:ss" show-time placeholder="请选择日期" /></#if>
火车车站的管理
就是车次的车站,一列火车要经过那些车站。
create table `train_station` (`id` bigint not null comment 'id',`train_code` varchar(20) not null comment '车次编号',`index` int not null comment '站序',`name` varchar(20) not null comment '站名',`name_pinyin` varchar(50) not null comment '站名拼音',`in_time` time comment '进站时间',`out_time` time comment '出站时间',`stop_time` time comment '停站时长',`km` decimal(8, 2) not null comment '里程(公里)|从上一站到本站的距离',`create_time` datetime(3) comment '新增时间',`update_time` datetime(3) comment '修改时间',primary key (`id`),unique key `train_code_index_unique` (`train_code`, `index`),unique key `train_code_name_unique` (`train_code`, `name`)
) engine=innodb default charset=utf8mb4 comment='火车车站';
其中的车次编号和某辆火车进行关联,站序指的是从始发站到终点站经过的车站顺序的排列。停站时常是可以通过进站和出站时间进行计算,为了方便查询,将id作为主键。在实际的情况中,一辆火车从起点到终点不会经过某个站两次,因此需要增加唯一键来进行数据的检验。如何将这两张表进行关联呢,在train表中一个唯一键code,使用唯一键进行关联,方便业务上的一些功能,train_code的起名就是和train这张表的code字段进行关联。当然如果没有设计唯一键,可以考虑使用id进行关联。
火车车厢
create table `train_carriage` (`id` bigint not null comment 'id',`train_code` varchar(20) not null comment '车次编号',`index` int not null comment '厢号',`seat_type` char(1) not null comment '座位类型|枚举[SeatTypeEnum]',`seat_count` int not null comment '座位数',`row_count` int not null comment '排数',`col_count` int not null comment '列数',`create_time` datetime(3) comment '新增时间',`update_time` datetime(3) comment '修改时间',unique key `train_code_index_unique` (`train_code`, `index`),primary key (`id`)
) engine=innodb default charset=utf8mb4 comment='火车车厢';
每一列车厢都要对应一列火车,因此需要根火车表进行关联,即train_index,由于不可能发生一列火车有两个相同编号的车厢,因此需要进行车次编号和厢号的关联。由于不同的车厢有不同的作为类型,因此可以将其进行枚举。
座位表
对于一辆火车来说,没有座位表是不完整的,由于座位属于某个车次,因此需要和火车进行关联,座位应该属于某个车厢,因此应该和车厢有所关联。同车厢内,每个座位可以按照行和列进行唯一的查找,每一个车厢都是从123往后排的,因此需要一个同车厢坐序。
在进行枚举座位行类中,设定一等座一排四个,二等座一排5个,增加code和desc,最后要增加一个type,来描述是什么类型。这个type就是对于的SeatType的枚举类,假设传入一个一等座,可以根据type等于1查出一等座对应的列,这样前端做一些下拉框就比较方便,知道一等座,就能知道有那些可以选择。
/*** 根据车箱的座位类型,筛选出所有的列,比如车箱类型是一等座,则筛选出columnList={ACDF}*/public static List<SeatColEnum> getColsByType(String seatType) {List<SeatColEnum> colList = new ArrayList<>();EnumSet<SeatColEnum> seatColEnums = EnumSet.allOf(SeatColEnum.class);for (SeatColEnum anEnum : seatColEnums) {if (seatType.equals(anEnum.getType())) {colList.add(anEnum);}}return colList;}
优化
输入车站名称后自动显示拼音,前端可以引入"pinyin-pro"组件
watch(()=> station.value.name, () => {if (Tool.isNotEmpty(station.value.name)) {station.value.namePinyin = pinyin(station.value.name, {toneType: 'none'}).replaceAll(" ", "");station.value.namePy = pinyin(station.value.name, {pattern: 'first',toneType: 'none'}).replaceAll(" ","");}},{immediate: true});
利用watch函数监听响应式数据的变化。监听的是station.value.name的变化,并在变化时更新station.value.namePinyin和station.value.namePy两个属性。第一个参数是要监听的数据,第二个参数是回调函数,表示如果发生变换,立即执行回调函数
火车车站的车次编号应该座位下拉框:首先后端提供一个接口查询所有的车次,然后前端界面的更改。对于查询接口来说,不需要参数,将查到的车站按照降序排列,以List形式进行返回。
public List<TrainQueryResp> queryAll() {TrainExample trainExample = new TrainExample();trainExample.setOrderByClause("code desc");List<Train> trainList= trainMapper.selectByExample(trainExample);return BeanUtil.copyToList(trainList, TrainQueryResp.class);}@GetMapping("/query-all")public CommonResp<List<TrainQueryResp>> queryList() {List<TrainQueryResp> list = trainService.queryAll();return new CommonResp<>(list);}
然后前端去拿到后端的数据
const queryTrainCode = () => {axios.get("/business/admin/train/query-all").then((response) => {let data = response.data;if (data.success) {console.log(data.content);} else {notification.error({description: data.message});}});};
<a-select v-model:value="trainStation.trainCode" show-search:filterOption="filterTrainCodeOption"><a-select-option v-for="item in trains" :key="item.code" :value="item.code" :label="item.code + item.start + item.end">{{item.code}} | {{item.start}} ~ {{item.end}}</a-select-option></a-select>const filterTrainCodeOption = (input, option) => {console.log(input, option)return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;};
v-model:value="trainStation.trainCode": 将选择器的值绑定到trainStation对象的trainCode属性上,当选择一个选项时,trainStation.trainCode会自动更新为所选的值。show-search: 启用搜索框,允许通过输入来过滤列表中的选项。:filterOption="filterTrainCodeOption": 使用自定义的过滤函数filterTrainCodeOption来决定哪些选项应该在用户输入时显示。v-for="item in trains": 遍历trains数组:key="item.code": 为每个选项指定一个唯一的键,这里使用的是列车代码。:value="item.code": 设置选项的值为列车代码,这将与v-model绑定的值对应。:label="item.code + item.start + item.end": 定义选项的标签,这里是将列车代码、始发站和终点站的信息组合起来作为选项的显示文本。{{item.code}} | {{item.start}} ~ {{item.end}}: 更好地显示- filterTrainCodeOption筛选列车选项的函数
为了方便,可以将车次制作成一个组件,然后引入到各个模块,然后车站也可以做出下拉框组件,引入到各个模块。限于篇幅,这里不在赘述。
查询
由于火车各部分的数据量庞大,如果将所有数据全部显示,将会给系统带来显著的性能压力,并可能影响体验。因此,引入了条件查询机制,以便根据用户的具体需求动态加载和展示相关数据,从而优化性能并提升系统的响应速度。
对于后端的车站查询接口来说,如果是传入的train_code不为空,就根据请求参数得到的trainCode来进行查询,座位和车厢同理,只需要修改service层代码,以及增加参数的请求类型。
if(ObjectUtil.isNotEmpty(req.getTrainCode())) {criteria.andTrainCodeEqualTo(req.getTrainCode());
}package com.month.train.business.req;import com.month.train.common.req.PageReq;public class TrainSeatQueryReq extends PageReq {private String trainCode;public String getTrainCode() {return trainCode;}public void setTrainCode(String trainCode) {this.trainCode = trainCode;}@Overridepublic String toString() {return "TrainSeatQueryReq{" +"trainCode='" + trainCode + '\'' +"} " + super.toString();}
}
相关文章:
仿12306购票系统(3)
前面完成了乘车人登录功能的实现,本篇主要是控制台方面的管理 对于整体的控制台的设计,为了能够快速的检验,不进行登录拦截,在控制台的这个模块的controller层增加admin,以及在登录界面的拦截器排除掉admin. 车站 即…...
2025年2月个人工作生活总结
本文为 2025年2月工作生活总结。 工作记录 AI浪潮 AI非常火,春节至今,到处充斥着大量和AI、DeepSeek有关的新闻。领导也一再强调要用AI,甚至纳入到新一年的考核里。再往上,大领导开会的新闻稿里也作出要求,不能停下脚…...
【Python】网络爬虫——词云wordcloud详细教程,爬取豆瓣最新评论并生成各式词云
目录 一、功能介绍 二、关键技术 1、安装WordCloud 2、利用WordCloud 1、WordCloud的基础用法 **相关参数介绍** **WordCloud 提供的方法如下** 2、WordCloud的应用举例 3、设置停用词 4、WordCloud使用词频 三、程序设计的步骤 1、抓取网页数据 2、数据清洗 3、…...
第39天:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化
时间轴: Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等. 框架库:MyBatis,SpringMVC,SpringBoot…...
综合练习 —— 递归、搜索与回溯算法
目录 一、1863. 找出所有子集的异或总和再求和 - 力扣(LeetCode) 算法代码: 代码思路 问题分析 核心思想 实现细节 代码解析 初始化 DFS 函数 时间复杂度 空间复杂度 示例运行 输入 运行过程 总结 二、 47. 全排列 II - 力扣&a…...
c++ 中的 auto 与 const 关键字
总是看到这两个关键字,根据 AI 的回复进行了一些整理总结。 文章目录 **1. auto 关键字****基本用法****与指针、引用结合****与 const 结合****在函数返回值推导****auto 不能用于** **2. const 关键字****修饰变量****修饰指针****修饰函数参数****修饰成员函数**…...
.pem文件是什么
.pem 文件通常是一个 Privacy-Enhanced Mail 格式的文件,它是一个常见的 证书文件 格式,可以存储加密密钥、证书或其他加密数据。最常见的用途是 SSH 密钥 和 SSL/TLS 证书。 在 SSH 使用中,.pem 文件一般是 私钥 文件,用于通过公…...
【Java SE】Java中String的内存原理
参考笔记: Java String 类深度解析:内存模型、常量池与核心机制_java stringx、-CSDN博客 解析java中String的内存原理_string s1 new string("ab");内存分析-CSDN博客 目录 1.String初识 2.字符串字面量 3.内存原理图 4. 示例验证 4.…...
IDEA提示将方法形参更改为(什么什么类型),要检查对应的实体类中的字段类型是否正确
IDEA提示inviteCodeId应该是字符串,明显不对,后来检查发现是FakeRegistration类中把inviteCodeId定义为String类型了。...
DeepSeek-OpenSourceWeek-第五天-Launch of 3FS and Smallpond Framework
2025 年 2 月 28 日,DeepSeek 在开源周的最后一天宣布推出了 Fire-Flyer File System(3FS)和 Smallpond 数据处理框架。这些创新旨在提升数据访问和处理能力,特别是针对 AI 训练和推理工作负载。 Fire-Flyer File System (3FS) 3FS 是一种高性能的分布式文件系统,专为应对…...
【芯片设计】NPU芯片前端设计工程师面试记录·20250227
应聘公司 某NPU/CPU方向芯片设计公司。 小声吐槽两句,前面我问了hr需不需要带简历,hr不用公司给打好了,然后我就没带空手去的。结果hr小姐姐去开会了,手机静音( Ĭ ^ Ĭ )面试官、我、另外的hr小姐姐都联系不上,结果就变成了两个面试官和我一共三个人在会议室里一人拿出…...
初阶数据结构(C语言实现)——3顺序表和链表(3)
3.链表 3.1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续…...
Kubernetes故障排查实战指南
前言 在云原生时代,Kubernetes已成为容器编排的事实标准。然而,随着系统规模和复杂度的增加,故障排查变得越来越具有挑战性。本文将从实战角度,系统化介绍K8s故障排查方法和最佳实践。 © ivwdcwso (ID: u012172506) 一、故障排查方法论 1.1 三步排查法 问题定位:快…...
使用 VSCode 代替 BeyondStudio for NXP 开发 JN 5169
使用 VSCode 代替 BeyondStudio for NXP 开发 JN 5169 一、安装 VSCode二、搭建 NXP JN5169 ZigBee 3.0 开发环境和下载示例工程三、配置 VSCode1、配置环境变量 MYSYS_HOME2、VSCode 安装以下插件3、VSCode 配置头文件路径 四、编译工程1、JN-AN-1219 有 6 个构建选项2、修改 …...
Python常见面试题的详解24
1. 如何对关键词触发模块进行测试 要点 功能测试:验证正常关键词触发、边界情况及大小写敏感性,确保模块按预期响应不同输入。 性能测试:关注响应时间和并发处理能力,保证模块在不同负载下的性能表现。 兼容性测试:测…...
加载大数据时性能压力优化
1. 减少数据请求量 分页加载(Pagination) 原理:将数据拆分为多页,按需加载。实现: 传统分页(页码切换)。无限滚动(滚动到底部自动加载下一页,如社交媒体)。…...
动态自定义标签属性页面(Tomcat 9)
java文件 ,包名org.rain.tag package org.rain.tag; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.DynamicAttributes; import javax.servlet.jsp.…...
使用Fuse-DFS挂载文件存储 HDFS-后端存储ceph
1. 编译环境准备 yum install cmake3 ln -s /usr/bin/cmake3 /usr/bin/cmake yum install gcc-c安装挂载依赖 yum -y install fuse fuse-devel fuse-libs执行以下命令,载入FUSE模块 modprobe fuse2. 下载源码包 hadoop-3.3.4-src.tar.gz解压后执行以下命令 打开…...
DBGPT安装部署使用
简介 DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。 目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Mul…...
How to use VRX on ubuntu20.04 with ROS1 Noetic?[2]
How to use VRX on ubuntu20.04 with ROS1 Noetic?[2] 1.Which topics2.Control1.1操作模拟船(1)命令行直接发布(2)启动键盘控制文件 3.Customer your VRX world3.1Which world parameters3.2改变风的参数 3.2.1更改默认参数&…...
yolov8 目标追踪 (源码 +效果图)
1.在代码中 增加了s键开始追踪 e键结束追踪 显示移动距离(代码中可调标尺和像素的比值 以便接近实际距离) 2.绘制了监测区域 只在区域内的检测 3.规定了检测的类别 只有人类才绘制轨迹 import osimport cv2 from ultralytics import YOLO from collections import defaultdic…...
运维Apache面试题及参考答案
目录 简述 Apache Web 服务器的主要特点及适用场景 Apache 的默认监听端口是什么?如何修改为其他端口? Apache 的主配置文件名称及路径是什么?不同 Linux 发行版的默认路径有何差异? 解释 Apache 的 MPM(Multi-Processing Module)机制,列举常见的工作模式(如 prefor…...
基于Python的web漏洞挖掘,漏洞扫描系统(附源码,部署)
本次技术通过利用Python技术来开发一款针对web漏洞挖掘扫描的技术,通过web漏洞的挖掘扫描来实现对网站URL的漏洞检测,通过高中低风险的判断来实现对一款网站中存在的漏洞进行可视化的分析,从而能够找到问题并且尽快的实现问题的解决。 博主介…...
K8s部署主从结构MySQL服务
01 介绍 RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字、启停顺序等都是随机分配的,而StatefulSet,管理所有有状态的服务。 StatefulSet为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,一定的启停顺序,在StatefulSet中,Pod名字…...
岳阳市美术馆预约平台(小程序论文源码调试讲解)
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
ubuntu22.04系统如何自建2级ntp服务器
一:ntp服务器详情 服务器型号 系统版本 IP地址 主机名 ntp服务版本 虚拟机8c-32g-1T Ubuntu22.04 10.20.30.2 DMZ-NTP-SERVER 4.2.8p15 二:ntp服务端部署配置脚本 #!/bin/bash # 脚本信息 echo "--------------------------…...
DeepSeek赋能智慧社区:提升社区治理,优化资源配置,带来全新变革
在数字化浪潮的推动下,智慧社区正逐渐成为城市发展的重要方向。作为一款先进的人工智能大模型,DeepSeek凭借其强大的多模态数据分析和智能决策能力,正在为智慧社区的建设注入新的活力。 标准规范及顶层设计指南、供应商整体解决方案合集、供应…...
spring注解开发(Spring整合MyBatis——Mapper代理开发模式、(Spring、MyBatis、Jdbc)配置类)(6)
目录 一、纯MyBatis独立开发程序。 (1)数据库与数据表。 (2)实体类。 (3)dao层接口。(Mapper代理模式、无SQL映射文件——注解配置映射关系) (4)MyBatis核心配…...
springcloud组件调用顺序
Spring Cloud 组件的调用顺序并不是固定不变的,它依赖于具体的业务场景和微服务架构的设计。然而,可以概括出一个典型的微服务架构中 Spring Cloud 组件的调用流程,这个流程大致可以分为以下几个步骤: 服务注册与发现:…...
【MySQL】数据库-图书管理系统(CC++实现)
一.预期功能 该图书管理系统设计提供基本的设计模版,涉及数据库的增删查改等操作,包含登录功能,图书管理功能,图书借阅功能,用户管理功能等基础功能,详细功能查看以下菜单表,共包含三个菜单&am…...
