期末大作业:综合使用本课程所学知识,完成一个大作业,该作业将作为期末评分的重要组成部分要求如下:
一、题目(三选一)
1、建立一个基于MySQL数据库的学生成绩管理系统,存储及管理学生信息、课程信息、成绩等内容。要求具有图形化界面,实现数据录入、查询、删除、修改等功能。
2、实现一个类QQ通信软件。要求具有图形化客户端界面、服务器端(不要求图形化),实现好友添加、删除功能、收发信息功能。
3、建立一个图片浏览器软件。可浏览不同文件夹,当该文件夹存在图片时,显示所有图片的缩略图,点击缩略图查看大图。
二、要求
每人独立完成,要求使用Java技术为主,开发内容属于应用软件(不含JSP、WEB、移动应用)。可参考书本或网络上范例,但必须在文档中加以说明。
警告!不得抄袭!违者将在年级通知群中公布!
三、提交内容
1、作品的完整项目文件夹,命名为“班别姓名”模式,如“3班张达”
2、开发文档,内容至少包括作品简介、数据库设计(如果有)、模块设计、核心代码说明、总结等
3、在开发文档的附件中说明参考文档、参考范例、并附上相应网络地址
四、提交时间
2022年1月24日前,即本学期最后一周结束之前。
五、提交方式
将作品及文档压缩为“班别姓名.rar”模式,“3班张达.rar”后提交到励儒云。
六、评分标准
根据作品的实现难度、完善程度、创新性评分
总体概述:
- 实现MySQL的数据录入、查询、删除、修改,不局限于题目要求,拓展通用性(设计包和类时使其快速能够适应其他数据表),使得以后迁移应用到别的场合更方便
规划功能细目:
-
初始化
-
(可选)实现注册和登录,使用加密算法存密码
-
选择数据库版本、URL、用户名、密码、(编码格式)
(可选)支持高级模式参数自定义(全部参数自己输入)
(可选)支持重新选择
-
自动创建数据表
-
-
通用设置
- (可选)多语言支持
- (可选)清空、重新初始化
- 备份和回档
- 保存和自动保存设置
-
通用功能
- 单独增删改、显示所有
- 条件设置(预设和自定义MySQL语句)
- (可选)按格式批量添加、导入已有
- 使用帮助
- 操作日志记录
-
具体功能
- 添加、删除、修改单个学生、课程、成绩
- 按学生名、课程名、成绩范围等单项查询(支持模糊)
- 统计(各学生、各课程平均分、最值)
实际实现的功能细目:
在路径data/ 下,配置文件
-
user.txt登录密码的MD5加密,密码为类包里的默认密码,如无特别规定的话下同 -
validate.txt校验文本,为了防止删除data/强行初始化来破解程序而保留的文件,该文件必须与user.txt的类包默认密码AES加密一致,当user.txt为空时,必须与Empty&文本的类包默认密码AES加密一致缺陷:破解方法是直接下载发行版的
data/复制替代即可 -
settings.txt数据库设置文本格式为一行一个信息,依次是:
- 0下标 版本号
- 1下标 IP
- 2下标 端口
- 3下标 数据库名
- 4下标 用户名
- 5下标 密码(AES加密)
- 6下标 参数(一行一个)
在路径log/ 下,为若干程序运行产生的日志文件,每次程序正常退出时写入一次日志文件(未来如有必要增加关闭写日志的选项)
日志文件为未来可能增加的诸如逐步撤销和逐步重做、自动批处理等功能做铺垫
文件格式为:年yyyy-月mm-日dd-时hh-分mm-秒ss.log ,如 2022-01-01-15-54-09
每行是一条用户的操作行为及其操作的时间(时:分:秒)
以 went 数据库为例(在样例中使用mysql8 的 127.0.0.1:3306)
全局变量表 info (类似于.ini配置文件) 记录全局状态信息
表结构:
- id 主键
- key 信息名
- value 信息值整数
建表语句:
create table if not exists `info` (
`id` int not null auto_increment,
`key` varchar(20) not null,
`value` int not null,
primary key(`id`),
unique(`key`)
) engine=InnoDB default charset=utf8;存储的信息有:
-
cnt累计建表数(下一次生成的表号由此决定) -
saved是否已保存临时表,是1否0 -
main主表编号 -
temp临时表编号 -
a_x$x$ 号表累积学生数,默认为0 -
b_x$x$ 号表累积课程数,默认为0 -
c_x$x$ 号表累积成绩数,默认为0
性质:
- 所有操作在
temp表进行,每次操作赋值saved=0 - 当
saved=1时,main表和temp表数据完全一致 - 当保存操作时,复制
temp表到main表,置saved=1 - 当还原/不保存时,复制
main表到temp表,置saved=1
学生表 student_x 第$x$份学生表
- id
- name
- student_number 字符串 学号
- major 字符串
建表语句:
create table if not exists `student` (
`id` int not null auto_increment,
`name` varchar(20) not null,
`student_number` varchar(20) not null,
`major` varchar(20),
primary key(`id`)
) engine=InnoDB default charset utf8;课程表 subject_x
- id
- name
- semester 字符串,如2020秋
建表语句:
create table if not exists `subject` (
`id` int not null auto_increment,
`name` varchar(40) not null,
`semester` varchar(10),
primary key(`id`)
) engine InnoDB default charset utf8;成绩表 score_x
- id
- student_id
- subject_id
- value
建表语句:
create table if not exists `score` (
`id` int not null auto_increment,
`student_id` int not null,
`subject_id` int not null,
`value` int not null,
primary key(`id`)
) engine InnoDB default charset utf8;-
info全局状态信息表 -
student_x第$x$ 份学生表subject_x第$x$ 份课程表score_x第$x$ 份成绩表
包 - 类 - 主要成员的树状结构表。
plugin包 通用功能
-
Base64PluginBase64编码解码类-
public static String get(byte[] key)编码 -
public static byte[] from(String key)解码
-
-
Encrypt加解密类public static byte[] fill(String psw)public static String encode(String ori[, String psw])-
public static String decode(String ori[, String psw])失败返回 null
-
PswMD5MD5加密类public static String encrypt(String data)-
public static String password_md5(String psw)加盐
-
Checker检验输入合法性等-
public static boolean isInt(String s)字符串是否是整数 -
public static boolean isRInt(String s, int x)字符串是否否是大于等于$x$ 的整数 -
public static boolean isPosInt(String s)字符串是否是正整数
-
-
FileHelper文件操作类-
public static String read(File/String f)失败null -
public static String[] readlines(File/String f)失败null -
public static boolean write(String t, File/String f)失败false -
public static boolean writelines(String[] t, File/String f)失败false -
public static boolean touch(File/String f)新建文件,失败false
-
-
SwingHelper简化Swing操作-
public static String font_size(String s, int siz)得到 HTML 的div标签,font-size:为siz
-
-
FsLabel设置了字体大小的JLabelpublic FsLabel([String s[, int siz]])
mysql包 数据库功能
Link数据库链接和加载配置public static int version = 8数据库版本,当前版本只能取8;未来版本支持5public static boolean loaded = false数据库外部库是否已加载public static Connection con = null数据库连接public static String err_msg = ""报错信息public static boolean load()导入数据库外部库,返回是否成功public static void create_database(String ip, String port, String db, String name, String psw)创建数据库(不存在时)public static boolean connect(String ip, String port, String db, String name, String psw, String cfg)按参数连接到数据库,返回是否成功public static boolean connect()按配置文件连接到数据库
Ctrl数据库控制操作类public static void raised(Exception e)输出报错信息到前台public static boolean run(String cmd)执行一般SQL语句public static boolean update(String cmd)执行更新SQL语句public static ResultSet query(String cmd)执行查询语句public static boolean exists(ResultSet res, String col, String key)查找结果某列是否有某值public static PreparedStatement pre(String cmd)创建一个预处理语句public static int getv(ResultSet res, String col, String key, String value)得到结果中col列为key的这一行里面value列的值(int类型)public static int getv(ResultSet/String res)执行只获得一行一列的查询语句并返回整数结果
base包 基础功能
-
Init初始化-
public static String login_md5 = null登录密码MD5加密 -
public static boolean isValidate()密码存储是否正确 -
public static boolean change_psw(String psw)修改密码 -
public static String[] read_db_settings()读取数据库连接信息(下标$[1,6]$ 有效;有可能读空) -
public static boolean is_inited_db()数据库连接信息是否不为空 -
public static void update_db_settings(String ip, String port, String db, String user, String psw, String cfg)将数据库连接信息保存到文件 -
public static final int psw_pos = 5数据库连接信息密码项下标
-
-
DbLoader数据库初始化和加载-
public static void checkinit()检查并执行(若需要)初始化 -
public static void cr_table()建立新的表 -
public static void del_table(int x)删除指定编号的表 -
public static void overwrite(int from, int to)用 from 表覆盖 to 表 -
public static void save()保存临时表覆盖主表 -
public static void undo()撤销临时表回退为主表 -
public static int t_main = 0主表编号 -
public static int t_temp = 0临时表编号 -
public static int saved = 1临时表是否已保存到主表 -
public static Vector<String> backups = new Vector<>()备份表编号列表 -
public static int cnt_stu = 0临时表累积学生数 -
public static int cnt_sub = 0临时表累积课程数 -
public static int cnt_sco = 0临时表累积成绩数 -
public static void add_info(String key, int value)增加一条全局信息 -
public static void set_info(String key, int value)修改一条全局信息 -
public static int get_info(String key)获取一条全局信息 -
public static int del_info(String key)删除一条全局信息
-
-
DbCtrl数据库操纵-
public static void write_diary(String dia)增加运行日志行 (dia不需换行符) -
public static void save_diary()将日记写入磁盘 -
public static int add_stu(String name, String number, String major)添加一个学生到临时表 -
public static void upd_stu(int id, String name, String number, String major)修改一个临时表学生 -
public static void del_stu(int id)删除一个学生 -
public static String sea_stu(String name, String number, String major)得到模糊搜索学生的对应 SQL 语句 -
public static int add_sub(String name, String semester)添加一个课程到临时表 -
public static void upd_sub(int id, String name, String semester)修改一个临时表课程 -
public static void del_sub(int id)删除一个课程 -
public static String sea_sub(String name, String semester)得到模糊搜索课程的对应 SQL 语句 -
public static int add_sco(int stu, int subj, int sco)添加一个成绩到临时表 -
public static void upd_sco(int id, int stu, int subj, int sco)修改一个临时表成绩 -
public static void del_sco(int id)删除一个成绩 -
public static String sea_sco(String stu, String subj, String sco)得到模糊搜索成绩的对应 SQL 语句
-
-
DbSearch成绩搜索和统计类-
public static String sea_all查询所有成绩语句 -
public static String search(int min, int max, String stuname, String major, String subjname, String semester)得到按六个条件模糊搜索指定条件的成绩的语句 -
public static String stat()统计搜索结果
-
ui包 窗口化功能
Root主窗口public static void start_root()检查登录并启动程序public static void updateTitle()更新标题(未保存时有*字符)
Login登录本程序的对话窗public boolean suc = false登录是否成功public Login()启动对话窗,进行登录,返回结果suc
RootMenu主窗口的菜单栏public RootMenu(Root frame)
ChangePsw修改密码对话窗public ChangePsw(Root frame)
SetDatabase修改数据库连接配置对话窗public SetDatabase(Root frame)
Page主面板类public Page()
DbTable数据库结果表格类public DbTable()public void render(ResultSet/String res)将查询语句(或结果)传入,将查询结果显示public void refresh()刷新当前查询语句public static void fresh()刷新当前查询语句public void addRow(String[] row)增加一行public void setRow(int row, String[] s)更新一行public static void updRow(int row, String[] s)更新一行public static void delSeleRow()删除所有选中行public static int table_idx = 0当前表格编号,0学生,1课程,2成绩public static DbTable that = null当前组件对象
Tabbar操作栏类 各种按钮的集合public Tabbar(DbTable jt)传入操作的表格
TbGlobalpublic TbGlobal(DbTable jt)public static ActionListener e_save事件监听器(保存)public static ActionListener e_undo事件监听器(撤销)public static ActionListener e_backup事件监听器(备份)public static ActionListener e_frombackup事件监听器(还原)public static ActionListener e_delbackup事件监听器(删除备份)public static ActionListener e_importall事件监听器(导入)public static ActionListener e_exportall事件监听器(导出全部)public static ActionListener e_exporta事件监听器(导出当前表)public static String get_newpath()从文件选择器获得一个.sql文件路径
TbStu学生数据管理的全部按钮和输入框public TbStu(DbTable jt)public static void upd_input(String[] s)更新输入框
TbSubj课程数据管理的全部按钮和输入框public TbSubj()public static void upd_input(String[] s)更新输入框
TbSco成绩数据管理的全部按钮和输入框public TbSco()public static void upd_input(String[] s)更新输入框
TbSearch成绩搜索与统计的全部按钮和输入框public TbSearch()