精易模块 Excel 操作实战:中小学生成绩管理系统
介绍基于易语言和精易模块开发的中小学生成绩管理系统。系统采用三层架构,使用 MySQL 存储数据,利用精易模块实现 Excel 数据的导入导出、报表生成及图表可视化。功能涵盖用户权限管理、班级学生课程管理、成绩录入统计及多角色权限控制,解决了传统 Excel 管理数据分散、统计效率低等问题,提供了完整的开发与部署方案。

介绍基于易语言和精易模块开发的中小学生成绩管理系统。系统采用三层架构,使用 MySQL 存储数据,利用精易模块实现 Excel 数据的导入导出、报表生成及图表可视化。功能涵盖用户权限管理、班级学生课程管理、成绩录入统计及多角色权限控制,解决了传统 Excel 管理数据分散、统计效率低等问题,提供了完整的开发与部署方案。

在中小学校和培训机构中,学生成绩管理是教学管理的重要环节,但传统的 Excel 表格管理方式存在以下问题:
易语言配合精易模块的 Excel 操作组件和 MySQL 数据库,可以开发出功能完备、稳定可靠的学生成绩管理系统,将学生成绩集中存储、分类管理、快速检索、自动统计,大大提高了教学管理的效率和安全性。
某初级中学拥有 3 个年级、12 个班级、600 余名学生和 40 余名教师,主要教授语文、数学、英语、物理、化学、生物、历史、地理、政治等课程。目前的成绩管理方式主要是使用 Excel 表格,存在以下问题:
✅ 功能需求:
✅ 非功能需求:
✅ 开发语言:易语言
✅ 核心支持库:精易模块(版本:5.1.2)、MySQL 支持库、网络支持库、Web 支持库、图像处理支持库、多线程支持库、文件支持库、正则表达式支持库
✅ Excel 操作:精易模块 Excel 操作组件(如精易 Excel 操作、精易 Excel 模板操作)
✅ 数据库:MySQL 8.0
✅ 服务器操作系统:Windows Server 2016/2019(可选,也可以使用本地 MySQL 数据库)
✅ 客户端操作系统:Windows 7/10/11
✅ 定时任务调度:精易模块的定时任务组件
✅ 报表生成:精易模块的 Excel 操作组件、PDF 生成组件
✅ 数据可视化:精易模块的图表组件
✅ 加密解密:AES 加密算法
采用三层架构 + 模块化设计:
创建以下核心表:
.版本 2 .支持库 spec .支持库 eDB .支持库 eJYM .程序集 程序集 1 .程序集变量 g_用户信息,类_用户信息 .程序集变量 g_权限列表,集合 .程序集变量 g_登录状态,逻辑型 .子程序 __启动窗口_创建完毕 ' 初始化组件属性 _启动窗口。标题 = '中小学生成绩管理系统登录' _启动窗口。宽度 = 400 _启动窗口。高度 = 300 _启动窗口。左边 = (取屏幕宽度 () - _启动窗口。宽度) ÷ 2 _启动窗口。顶边 = (取屏幕高度 () - _启动窗口。高度) ÷ 2 ' 初始化数据库连接 .如果真 (数据库连接_初始化 () = #假) 信息框 ('数据库连接失败!', 0, '错误提示') 结束 () .如果真结束 调试输出 ('系统初始化成功!') .子程序 数据库连接_初始化,逻辑型 .局部变量 连接句柄,整数型 .局部变量 服务器 IP, 文本型 .局部变量 服务器端口,整数型 .局部变量 用户名,文本型 .局部变量 密码,文本型 .局部变量 数据库名,文本型 ' 从配置文件中读取数据库配置 服务器 IP = 配置文件_取文本 ('Database', 'Host', '127.0.0.1') 服务器端口 = 到数值 (配置文件_取文本 ('Database', 'Port', '3306')) 用户名 = 配置文件_取文本 ('Database', 'User', 'root') 密码 = 文本_解密 (配置文件_取文本 ('Database', 'Password', ''), 'student_score_system_2023') ' 使用 AES 算法解密密码 数据库名 = 配置文件_取文本 ('Database', 'Name', 'student_score_system') ' 连接 MySQL 数据库 连接句柄 = MySQL.连接 (服务器 IP, 服务器端口,用户名,密码,数据库名) .如果真 (连接句柄 ≤ 0) 调试输出 ('数据库连接失败!错误信息:', MySQL.取错误信息 ()) 返回 (#假) .如果真结束 调试输出 ('数据库连接成功!连接句柄:', 连接句柄) 返回 (#真) .子程序 _btnLogin_被单击 .局部变量 用户名,文本型 .局部变量 密码,文本型 .局部变量 加密密码,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 获取输入 用户名 = txtUsername.内容 密码 = txtPassword.内容 .如果真 (用户名 = '' 或 密码 = '') 信息框 ('请输入用户名和密码!', 0, '警告提示') 返回 () .如果真结束 ' 使用 MD5 算法加密密码 加密密码 = 到文本 (编码_BASE64 编码 (加密_MD5 (到字节集 (密码), ), ), ) ' 查询用户信息 SQL 语句 = 'SELECT * FROM user WHERE username = '' + 文本_替换 (用户名, ''', '''') + '' AND password = '' + 文本_替换 (加密密码, ''', '''') + '' AND status = 1' 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) ' 用户名或密码错误 信息框 ('用户名或密码错误!', 0, '错误提示') 调试输出 ('用户名或密码错误!用户名:', 用户名) .判断 (记录集。到记录尾 () = #假) ' 登录成功 g_登录状态 = #真 g_用户信息。用户 ID = 记录集。读大整数 ('user_id') g_用户信息。用户名 = 记录集。读文本 ('username') g_用户信息。角色 ID = 记录集。读大整数 ('role_id') g_用户信息。真实姓名 = 记录集。读文本 ('real_name') g_用户信息。电话 = 记录集。读文本 ('phone') g_用户信息。邮箱 = 记录集。读文本 ('email') g_用户信息。地址 = 记录集。读文本 ('address') g_用户信息。状态 = 记录集。读整数 ('status') ' 获取用户权限列表 获取用户权限列表 () ' 根据角色显示对应的主窗口 .判断开始 (g_用户信息。角色 ID = 1) ' 管理员 管理员主窗口。创建 (真) .判断 (g_用户信息。角色 ID = 2) ' 年级主任 年级主任主窗口。创建 (真) .判断 (g_用户信息。角色 ID = 3) ' 班主任 班主任主窗口。创建 (真) .判断 (g_用户信息。角色 ID = 4) ' 任课教师 任课教师主窗口。创建 (真) .判断结束 ' 隐藏登录窗口 _启动窗口。隐藏 () 调试输出 ('登录成功!用户名:', 用户名, ' 角色:', 角色_取角色名称 (g_用户信息。角色 ID)) .判断结束 ' 关闭记录集 记录集。关闭 () .子程序 获取用户权限列表 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询用户权限列表 SQL 语句 = 'SELECT p.permission_id, p.permission_name, p.permission_description, p.module FROM user_permission up LEFT JOIN permission p ON up.permission_id = p.permission_id WHERE up.user_id = ' + 到文本 (g_用户信息。用户 ID) 记录集 = MySQL.查询 (SQL 语句) ' 清空权限列表 g_权限列表。清除 () ' 遍历记录集,添加权限到权限列表 .判断循环首 (记录集。到记录尾 () = #假) 权限信息 = 权限信息 () 权限信息。权限 ID = 记录集。读大整数 ('permission_id') 权限信息。权限名称 = 记录集。读文本 ('permission_name') 权限信息。权限描述 = 记录集。读文本 ('permission_description') 权限信息。所属模块 = 记录集。读文本 ('module') g_权限列表。添加 (权限信息) 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () 调试输出 ('用户权限列表获取成功!权限数量:', g_权限列表。取数组成员数 ()) .子程序 __启动窗口_将被销毁 ' 断开数据库连接 MySQL.断开 () 调试输出 ('程序结束!')
.版本 2 .支持库 spec .支持库 eDB .支持库 eJYM .支持库 eFile .支持库 eExcel .程序集 程序集 1 .程序集变量 g_用户信息,类_用户信息 .程序集变量 g_学生列表,集合 .子程序 __启动窗口_创建完毕 ' 初始化组件属性 _启动窗口。标题 = '学生管理' _启动窗口。宽度 = 1000 _启动窗口。高度 = 700 _启动窗口。左边 = (取屏幕宽度 () - _启动窗口。宽度) ÷ 2 _启动窗口。顶边 = (取屏幕高度 () - _启动窗口。高度) ÷ 2 ' 加载学生列表 加载学生列表 () 调试输出 ('学生管理窗口初始化成功!') .子程序 加载学生列表 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 ' 查询学生列表(根据角色显示对应的学生) .判断开始 (g_用户信息。角色 ID = 1) ' 管理员 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 2) ' 年级主任 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE c.年级 = ' + 到文本 (获取年级主任管理的年级 (g_用户信息。用户 ID)) + ' AND s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 3) ' 班主任 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE c.班主任姓名 = '' + g_用户信息。真实姓名 + '' AND s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 4) ' 任课教师 SQL 语句 = 'SELECT DISTINCT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN score sc ON s.学生 ID = sc.学生 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE co.任课教师 ID = ' + 到文本 (g_用户信息。用户 ID) + ' AND s.status = 1 ORDER BY s.学号 ASC' .判断结束 记录集 = MySQL.查询 (SQL 语句) ' 清空学生列表框 lstStudent.全部删除 () ' 遍历记录集,显示数据到学生列表框 .判断循环首 (记录集。到记录尾 () = #假) lstStudent.插入表项 (, ) lstStudent.置标题 (i, 0, 到文本 (记录集。读大整数 ('学生 ID'))) lstStudent.置标题 (i, 1, 记录集。读文本 ('学号')) lstStudent.置标题 (i, 2, 记录集。读文本 ('学生姓名')) lstStudent.置标题 (i, 3, 文本_替换 (到文本 (记录集。读整数 ('性别')), '0', '男', '1', '女')) lstStudent.置标题 (i, 4, 到文本 (记录集。读日期 ('出生日期'), , 'yyyy-MM-dd')) lstStudent.置标题 (i, 5, 记录集。读文本 ('班级名称')) lstStudent.置标题 (i, 6, 记录集。读文本 ('家庭住址')) lstStudent.置标题 (i, 7, 记录集。读文本 ('联系电话')) i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () .子程序 _btnAddStudent_被单击 ' 显示添加学生窗口 添加学生窗口。创建 (真) .子程序 _btnEditStudent_被单击 .局部变量 学生 ID, 大整数型 .局部变量 学生信息,学生信息 ' 获取选中的学生 ID .如果真 (lstStudent.现行选中项 = -1) 信息框 ('请选择要修改的学生!', 0, '警告提示') 返回 () .如果真结束 学生 ID = 到数值 (lstStudent.取标题 (lstStudent.现行选中项,0)) ' 获取学生信息 学生信息 = 获取学生信息 (学生 ID) ' 显示修改学生窗口,并传递学生信息 修改学生窗口。创建 (真,学生信息) .子程序 _btnDeleteStudent_被单击 .局部变量 学生 ID, 大整数型 .局部变量 SQL 语句,文本型 .局部变量 影响行数,整数型 ' 获取选中的学生 ID .如果真 (lstStudent.现行选中项 = -1) 信息框 ('请选择要删除的学生!', 0, '警告提示') 返回 () .如果真结束 学生 ID = 到数值 (lstStudent.取标题 (lstStudent.现行选中项,0)) ' 确认删除 .如果真 (信息框 ('确定要删除该学生吗?删除后将无法恢复!', 4, '确认提示') = #取消钮) 返回 () .如果真结束 ' 删除学生信息(软删除) SQL 语句 = 'UPDATE student SET status = 0 WHERE 学生 ID = ' + 到文本 (学生 ID) 影响行数 = MySQL.执行 SQL (SQL 语句) .如果真 (影响行数 > 0) 信息框 ('学生删除成功!', 0, '成功提示') ' 刷新学生列表 加载学生列表 () .如果真结束 .子程序 _btnSearchStudent_被单击 .局部变量 搜索关键词,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 ' 获取搜索关键词 搜索关键词 = txtSearch.内容 .如果真 (搜索关键词 = '') ' 搜索关键词为空,加载所有学生 加载学生列表 () 返回 () .如果真结束 ' 查询学生列表(根据角色和搜索关键词) .判断开始 (g_用户信息。角色 ID = 1) ' 管理员 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 2) ' 年级主任 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE c.年级 = ' + 到文本 (获取年级主任管理的年级 (g_用户信息。用户 ID)) + ' AND (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 3) ' 班主任 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE c.班主任姓名 = '' + g_用户信息。真实姓名 + '' AND (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 4) ' 任课教师 SQL 语句 = 'SELECT DISTINCT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN score sc ON s.学生 ID = sc.学生 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE co.任课教师 ID = ' + 到文本 (g_用户信息。用户 ID) + ' AND (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND s.status = 1 ORDER BY s.学号 ASC' .判断结束 记录集 = MySQL.查询 (SQL 语句) ' 清空学生列表框 lstStudent.全部删除 () ' 遍历记录集,显示数据到学生列表框 .判断循环首 (记录集。到记录尾 () = #假) lstStudent.插入表项 (, ) lstStudent.置标题 (i, 0, 到文本 (记录集。读大整数 ('学生 ID'))) lstStudent.置标题 (i, 1, 记录集。读文本 ('学号')) lstStudent.置标题 (i, 2, 记录集。读文本 ('学生姓名')) lstStudent.置标题 (i, 3, 文本_替换 (到文本 (记录集。读整数 ('性别')), '0', '男', '1', '女')) lstStudent.置标题 (i, 4, 到文本 (记录集。读日期 ('出生日期'), , 'yyyy-MM-dd')) lstStudent.置标题 (i, 5, 记录集。读文本 ('班级名称')) lstStudent.置标题 (i, 6, 记录集。读文本 ('家庭住址')) lstStudent.置标题 (i, 7, 记录集。读文本 ('联系电话')) i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () .子程序 _btnImportStudent_被单击 .局部变量 Excel 操作对象,类_Excel 操作 .局部变量 文件路径,文本型 .局部变量 行数,整数型 .局部变量 i, 整数型 .局部变量 学生信息,学生信息 .局部变量 SQL 语句,文本型 .局部变量 影响行数,整数型 ' 打开文件选择对话框,选择 Excel 文件 文件路径 = 文件_打开 ('Excel 文件|*.xlsx;*.xls', '选择要导入的学生数据 Excel 文件') .如果真 (文件路径 = '') 返回 () .如果真结束 ' 打开 Excel 文件 Excel 操作对象。创建 () .如果真 (Excel 操作对象。打开文件 (文件路径) = #假) 信息框 ('Excel 文件打开失败!', 0, '错误提示') Excel 操作对象。销毁 () 返回 () .如果真结束 ' 获取 Excel 文件的行数(从第 2 行开始,第 1 行为标题) 行数 = Excel 操作对象。取行数 (1) ' 遍历 Excel 文件的行,导入学生数据 .计次循环首 (行数 - 1, i) ' 读取学生信息 学生信息。学号 = Excel 操作对象。读单元格文本 (1, i + 2, 1) 学生信息。学生姓名 = Excel 操作对象。读单元格文本 (1, i + 2, 2) 学生信息。性别 = 到整数 (文本_替换 (Excel 操作对象。读单元格文本 (1, i + 2, 3), '男', '0', '女', '1')) 学生信息。出生日期 = Excel 操作对象。读单元格日期 (1, i + 2, 4) 学生信息。班级 ID = 获取班级 ID (Excel 操作对象。读单元格文本 (1, i + 2, 5)) 学生信息。家庭住址 = Excel 操作对象。读单元格文本 (1, i + 2, 6) 学生信息。联系电话 = Excel 操作对象。读单元格文本 (1, i + 2, 7) 学生信息。状态 = 1 ' 检查学生是否已存在 SQL 语句 = 'SELECT * FROM student WHERE 学号 = '' + 文本_替换 (学生信息。学号, ''', '''') + '' AND status = 1' .如果真 (MySQL.查询单字段值 (SQL 语句) ≠ '') ' 学生已存在,跳过 调试输出 ('学生已存在!学号:', 学生信息。学号) 继续循环 () .如果真结束 ' 插入学生信息到数据库 SQL 语句 = 'INSERT INTO student (学号,学生姓名,性别,出生日期,班级 ID, 家庭住址,联系电话,status) VALUES ('' SQL 语句 = SQL 语句 + 文本_替换 (学生信息。学号, ''', '''') + '','' + 文本_替换 (学生信息。学生姓名, ''', '''') + '',' + 到文本 (学生信息。性别) + ','' + 到文本 (学生信息。出生日期, , 'yyyy-MM-dd') + '',' + 到文本 (学生信息。班级 ID) + ','' + 文本_替换 (学生信息。家庭住址, ''', '''') + '','' + 文本_替换 (学生信息。联系电话, ''', '''') + '',1)' 影响行数 = MySQL.执行 SQL (SQL 语句) .如果真 (影响行数 = 0) 调试输出 ('学生导入失败!学号:', 学生信息。学号) .如果真结束 .计次循环首 () ' 关闭 Excel 文件 Excel 操作对象。关闭文件 () Excel 操作对象。销毁 () ' 刷新学生列表 加载学生列表 () 信息框 ('学生数据导入成功!成功导入' + 到文本 (行数 - 1) + '条数据!', 0, '成功提示') .子程序 _btnExportStudent_被单击 .局部变量 Excel 操作对象,类_Excel 操作 .局部变量 文件路径,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 ' 打开文件保存对话框,选择导出路径 文件路径 = 文件_保存 ('Excel 文件|*.xlsx', '选择学生数据导出路径') .如果真 (文件路径 = '') 返回 () .如果真结束 ' 创建 Excel 文件 Excel 操作对象。创建 () Excel 操作对象。创建文件 () ' 写入标题行 Excel 操作对象。写单元格文本 (1, 1, 1, '学号') Excel 操作对象。写单元格文本 (1, 1, 2, '学生姓名') Excel 操作对象。写单元格文本 (1, 1, 3, '性别') Excel 操作对象。写单元格文本 (1, 1, 4, '出生日期') Excel 操作对象。写单元格文本 (1, 1, 5, '班级名称') Excel 操作对象。写单元格文本 (1, 1, 6, '家庭住址') Excel 操作对象。写单元格文本 (1, 1, 7, '联系电话') ' 加粗标题行 Excel 操作对象。设置单元格字体加粗 (1, 1, 1, 1, 7, #真) ' 居中对齐标题行 Excel 操作对象。设置单元格对齐方式 (1, 1, 1, 1, 7, #居中,#居中) ' 查询学生列表(根据角色) .判断开始 (g_用户信息。角色 ID = 1) ' 管理员 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 2) ' 年级主任 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE c.年级 = ' + 到文本 (获取年级主任管理的年级 (g_用户信息。用户 ID)) + ' AND s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 3) ' 班主任 SQL 语句 = 'SELECT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID WHERE c.班主任姓名 = '' + g_用户信息。真实姓名 + '' AND s.status = 1 ORDER BY s.学号 ASC' .判断 (g_用户信息。角色 ID = 4) ' 任课教师 SQL 语句 = 'SELECT DISTINCT s.*, c.班级名称 FROM student s LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN score sc ON s.学生 ID = sc.学生 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE co.任课教师 ID = ' + 到文本 (g_用户信息。用户 ID) + ' AND s.status = 1 ORDER BY s.学号 ASC' .判断结束 记录集 = MySQL.查询 (SQL 语句) ' 遍历记录集,写入学生数据 i = 2 .判断循环首 (记录集。到记录尾 () = #假) Excel 操作对象。写单元格文本 (1, i, 1, 记录集。读文本 ('学号')) Excel 操作对象。写单元格文本 (1, i, 2, 记录集。读文本 ('学生姓名')) Excel 操作对象。写单元格文本 (1, i, 3, 文本_替换 (到文本 (记录集。读整数 ('性别')), '0', '男', '1', '女')) Excel 操作对象。写单元格日期 (1, i, 4, 记录集。读日期 ('出生日期')) Excel 操作对象。写单元格文本 (1, i, 5, 记录集。读文本 ('班级名称')) Excel 操作对象。写单元格文本 (1, i, 6, 记录集。读文本 ('家庭住址')) Excel 操作对象。写单元格文本 (1, i, 7, 记录集。读文本 ('联系电话')) i = i + 1 记录集。到下一条 () .判断循环尾 () ' 自动调整列宽 Excel 操作对象。自动调整列宽 (1) ' 保存 Excel 文件 Excel 操作对象。保存文件 (文件路径) Excel 操作对象。销毁 () 信息框 ('学生数据导出成功!导出路径:' + 文件路径,0, '成功提示') .子程序 获取学生信息,学生信息,公开 .参数 学生 ID, 大整数型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 学生信息,学生信息 ' 查询学生信息 SQL 语句 = 'SELECT * FROM student WHERE 学生 ID = ' + 到文本 (学生 ID) 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 (学生信息) .判断 (记录集。到记录尾 () = #假) 学生信息。学生 ID = 记录集。读大整数 ('学生 ID') 学生信息。学号 = 记录集。读文本 ('学号') 学生信息。学生姓名 = 记录集。读文本 ('学生姓名') 学生信息。性别 = 记录集。读整数 ('性别') 学生信息。出生日期 = 记录集。读日期 ('出生日期') 学生信息。班级 ID = 记录集。读大整数 ('班级 ID') 学生信息。家庭住址 = 记录集。读文本 ('家庭住址') 学生信息。联系电话 = 记录集。读文本 ('联系电话') 学生信息。状态 = 记录集。读整数 ('status') .判断结束 ' 关闭记录集 记录集。关闭 () 返回 (学生信息) .子程序 获取班级 ID, 大整数型,公开 .参数 班级名称,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询班级 ID SQL 语句 = 'SELECT 班级 ID FROM class WHERE 班级名称 = '' + 文本_替换 (班级名称, ''', '''') + '' AND status = 1' 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 (0) .判断 (记录集。到记录尾 () = #假) 返回 (记录集。读大整数 ('班级 ID')) .判断结束 ' 关闭记录集 记录集。关闭 ()
.版本 2 .支持库 spec .支持库 eDB .支持库 eJYM .支持库 eFile .支持库 eExcel .程序集 程序集 1 .程序集变量 g_用户信息,类_用户信息 .程序集变量 g_成绩列表,集合 .子程序 __启动窗口_创建完毕 ' 初始化组件属性 _启动窗口。标题 = '成绩管理' _启动窗口。宽度 = 1000 _启动窗口。高度 = 700 _启动窗口。左边 = (取屏幕宽度 () - _启动窗口。宽度) ÷ 2 _启动窗口。顶边 = (取屏幕高度 () - _启动窗口。高度) ÷ 2 ' 加载成绩列表 加载成绩列表 () 调试输出 ('成绩管理窗口初始化成功!') .子程序 加载成绩列表 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 ' 查询成绩列表(根据角色显示对应的成绩) .判断开始 (g_用户信息。角色 ID = 1) ' 管理员 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 2) ' 年级主任 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE c.年级 = ' + 到文本 (获取年级主任管理的年级 (g_用户信息。用户 ID)) + ' AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 3) ' 班主任 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE c.班主任姓名 = '' + g_用户信息。真实姓名 + '' AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 4) ' 任课教师 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE co.任课教师 ID = ' + 到文本 (g_用户信息。用户 ID) + ' AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断结束 记录集 = MySQL.查询 (SQL 语句) ' 清空成绩列表框 lstScore.全部删除 () ' 遍历记录集,显示数据到成绩列表框 .判断循环首 (记录集。到记录尾 () = #假) lstScore.插入表项 (, ) lstScore.置标题 (i, 0, 到文本 (记录集。读大整数 ('成绩 ID'))) lstScore.置标题 (i, 1, 记录集。读文本 ('学号')) lstScore.置标题 (i, 2, 记录集。读文本 ('学生姓名')) lstScore.置标题 (i, 3, 记录集。读文本 ('班级名称')) lstScore.置标题 (i, 4, 记录集。读文本 ('课程代码')) lstScore.置标题 (i, 5, 记录集。读文本 ('课程名称')) lstScore.置标题 (i, 6, 到文本 (记录集。读大数值 ('成绩'))) lstScore.置标题 (i, 7, 到文本 (记录集。读时间 ('考试时间'), , 'yyyy-MM-dd HH:mm:ss')) lstScore.置标题 (i, 8, 文本_替换 (到文本 (记录集。读整数 ('考试类型')), '0', '期中', '1', '期末', '2', '月考', '3', '周考', '4', '模拟考')) i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () .子程序 _btnAddScore_被单击 ' 显示添加成绩窗口 添加成绩窗口。创建 (真) .子程序 _btnEditScore_被单击 .局部变量 成绩 ID, 大整数型 .局部变量 成绩信息,成绩信息 ' 获取选中的成绩 ID .如果真 (lstScore.现行选中项 = -1) 信息框 ('请选择要修改的成绩!', 0, '警告提示') 返回 () .如果真结束 成绩 ID = 到数值 (lstScore.取标题 (lstScore.现行选中项,0)) ' 获取成绩信息 成绩信息 = 获取成绩信息 (成绩 ID) ' 显示修改成绩窗口,并传递成绩信息 修改成绩窗口。创建 (真,成绩信息) .子程序 _btnDeleteScore_被单击 .局部变量 成绩 ID, 大整数型 .局部变量 SQL 语句,文本型 .局部变量 影响行数,整数型 ' 获取选中的成绩 ID .如果真 (lstScore.现行选中项 = -1) 信息框 ('请选择要删除的成绩!', 0, '错误提示') 返回 () .如果真结束 成绩 ID = 到数值 (lstScore.取标题 (lstScore.现行选中项,0)) ' 确认删除 .如果真 (信息框 ('确定要删除该成绩吗?删除后将无法恢复!', 4, '确认提示') = #取消钮) 返回 () .如果真结束 ' 删除成绩信息(软删除) SQL 语句 = 'UPDATE score SET status = 0 WHERE 成绩 ID = ' + 到文本 (成绩 ID) 影响行数 = MySQL.执行 SQL (SQL 语句) .如果真 (影响行数 > 0) 信息框 ('成绩删除成功!', 0, '成功提示') ' 刷新成绩列表 加载成绩列表 () .如果真结束 .子程序 _btnSearchScore_被单击 .局部变量 搜索关键词,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 ' 获取搜索关键词 搜索关键词 = txtSearch.内容 .如果真 (搜索关键词 = '') ' 搜索关键词为空,加载所有成绩 加载成绩列表 () 返回 () .如果真结束 ' 查询成绩列表(根据角色和搜索关键词) .判断开始 (g_用户信息。角色 ID = 1) ' 管理员 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR co.课程代码 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR co.课程名称 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 2) ' 年级主任 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE c.年级 = ' + 到文本 (获取年级主任管理的年级 (g_用户信息。用户 ID)) + ' AND (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR co.课程代码 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR co.课程名称 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 3) ' 班主任 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE c.班主任姓名 = '' + g_用户信息。真实姓名 + '' AND (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR co.课程代码 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR co.课程名称 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 4) ' 任课教师 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE co.任课教师 ID = ' + 到文本 (g_用户信息。用户 ID) + ' AND (s.学号 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%' OR s.学生姓名 LIKE '%' + 文本_替换 (搜索关键词, ''', '''') + '%') AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断结束 记录集 = MySQL.查询 (SQL 语句) ' 清空成绩列表框 lstScore.全部删除 () ' 遍历记录集,显示数据到成绩列表框 .判断循环首 (记录集。到记录尾 () = #假) lstScore.插入表项 (, ) lstScore.置标题 (i, 0, 到文本 (记录集。读大整数 ('成绩 ID'))) lstScore.置标题 (i, 1, 记录集。读文本 ('学号')) lstScore.置标题 (i, 2, 记录集。读文本 ('学生姓名')) lstScore.置标题 (i, 3, 记录集。读文本 ('班级名称')) lstScore.置标题 (i, 4, 记录集。读文本 ('课程代码')) lstScore.置标题 (i, 5, 记录集。读文本 ('课程名称')) lstScore.置标题 (i, 6, 到文本 (记录集。读大数值 ('成绩'))) lstScore.置标题 (i, 7, 到文本 (记录集。读时间 ('考试时间'), , 'yyyy-MM-dd HH:mm:ss')) lstScore.置标题 (i, 8, 文本_替换 (到文本 (记录集。读整数 ('考试类型')), '0', '期中', '1', '期末', '2', '月考', '3', '周考', '4', '模拟考')) i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () .子程序 _btnImportScore_被单击 .局部变量 Excel 操作对象,类_Excel 操作 .局部变量 文件路径,文本型 .局部变量 行数,整数型 .局部变量 i, 整数型 .局部变量 成绩信息,成绩信息 .局部变量 SQL 语句,文本型 .局部变量 影响行数,整数型 ' 打开文件选择对话框,选择 Excel 文件 文件路径 = 文件_打开 ('Excel 文件|*.xlsx;*.xls', '选择要导入的成绩数据 Excel 文件') .如果真 (文件路径 = '') 返回 () .如果真结束 ' 打开 Excel 文件 Excel 操作对象。创建 () .如果真 (Excel 操作对象。打开文件 (文件路径) = #假) 信息框 ('Excel 文件打开失败!', 0, '错误提示') Excel 操作对象。销毁 () 返回 () .如果真结束 ' 获取 Excel 文件的行数(从第 2 行开始,第 1 行为标题) 行数 = Excel 操作对象。取行数 (1) ' 遍历 Excel 文件的行,导入成绩数据 .计次循环首 (行数 - 1, i) ' 读取成绩信息 成绩信息。学生 ID = 获取学生 ID (Excel 操作对象。读单元格文本 (1, i + 2, 1)) 成绩信息。课程 ID = 获取课程 ID (Excel 操作对象。读单元格文本 (1, i + 2, 2)) 成绩信息。成绩 = 到数值 (Excel 操作对象。读单元格文本 (1, i + 2, 3)) 成绩信息。考试时间 = Excel 操作对象。读单元格时间 (1, i + 2, 4) 成绩信息。考试类型 = 到整数 (文本_替换 (Excel 操作对象。读单元格文本 (1, i + 2, 5), '期中', '0', '期末', '1', '月考', '2', '周考', '3', '模拟考', '4')) 成绩信息。状态 = 1 ' 检查成绩是否已存在 SQL 语句 = 'SELECT * FROM score WHERE 学生 ID = ' + 到文本 (成绩信息。学生 ID) + ' AND 课程 ID = ' + 到文本 (成绩信息。课程 ID) + ' AND 考试时间 = '' + 到文本 (成绩信息。考试时间, , 'yyyy-MM-dd HH:mm:ss') + '' AND status = 1' .如果真 (MySQL.查询单字段值 (SQL 语句) ≠ '') ' 成绩已存在,跳过 调试输出 ('成绩已存在!学生 ID:', 成绩信息。学生 ID, ' 课程 ID:', 成绩信息。课程 ID, ' 考试时间:', 成绩信息。考试时间) 继续循环 () .如果真结束 ' 插入成绩信息到数据库 SQL 语句 = 'INSERT INTO score (学生 ID, 课程 ID, 成绩,考试时间,考试类型,status) VALUES (' SQL 语句 = SQL 语句 + 到文本 (成绩信息。学生 ID) + ',' + 到文本 (成绩信息。课程 ID) + ',' + 到文本 (成绩信息。成绩) + ','' + 到文本 (成绩信息。考试时间, , 'yyyy-MM-dd HH:mm:ss') + '',' + 到文本 (成绩信息。考试类型) + ',1)' 影响行数 = MySQL.执行 SQL (SQL 语句) .如果真 (影响行数 = 0) 调试输出 ('成绩导入失败!学生 ID:', 成绩信息。学生 ID, ' 课程 ID:', 成绩信息。课程 ID, ' 考试时间:', 成绩信息。考试时间) .如果真结束 .计次循环首 () ' 关闭 Excel 文件 Excel 操作对象。关闭文件 () Excel 操作对象。销毁 () ' 刷新成绩列表 加载成绩列表 () 信息框 ('成绩数据导入成功!成功导入' + 到文本 (行数 - 1) + '条数据!', 0, '成功提示') .子程序 _btnExportScore_被单击 .局部变量 Excel 操作对象,类_Excel 操作 .局部变量 文件路径,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 ' 打开文件保存对话框,选择导出路径 文件路径 = 文件_保存 ('Excel 文件|*.xlsx', '选择成绩数据导出路径') .如果真 (文件路径 = '') 返回 () .如果真结束 ' 创建 Excel 文件 Excel 操作对象。创建 () Excel 操作对象。创建文件 () ' 写入标题行 Excel 操作对象。写单元格文本 (1, 1, 1, '学号') Excel 操作对象。写单元格文本 (1, 1, 2, '学生姓名') Excel 操作对象。写单元格文本 (1, 1, 3, '班级名称') Excel 操作对象。写单元格文本 (1, 1, 4, '课程代码') Excel 操作对象。写单元格文本 (1, 1, 5, '课程名称') Excel 操作对象。写单元格文本 (1, 1, 6, '成绩') Excel 操作对象。写单元格文本 (1, 1, 7, '考试时间') Excel 操作对象。写单元格文本 (1, 1, 8, '考试类型') ' 加粗标题行 Excel 操作对象。设置单元格字体加粗 (1, 1, 1, 1, 8, #真) ' 居中对齐标题行 Excel 操作对象。设置单元格对齐方式 (1, 1, 1, 1, 8, #居中,#居中) ' 查询成绩列表(根据角色) .判断开始 (g_用户信息。角色 ID = 1) ' 管理员 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 2) ' 年级主任 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE c.年级 = ' + 到文本 (获取年级主任管理的年级 (g_用户信息。用户 ID)) + ' AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 3) ' 班主任 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE c.班主任姓名 = '' + g_用户信息。真实姓名 + '' AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断 (g_用户信息。角色 ID = 4) ' 任课教师 SQL 语句 = 'SELECT sc.*, s.学号,s.学生姓名,c.班级名称,co.课程代码,co.课程名称 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID LEFT JOIN class c ON s.班级 ID = c.班级 ID LEFT JOIN course co ON sc.课程 ID = co.课程 ID WHERE co.任课教师 ID = ' + 到文本 (g_用户信息。用户 ID) + ' AND sc.status = 1 AND s.status = 1 AND c.status = 1 AND co.status = 1 ORDER BY s.学号,co.课程代码 ASC' .判断结束 记录集 = MySQL.查询 (SQL 语句) ' 遍历记录集,写入成绩数据 i = 2 .判断循环首 (记录集。到记录尾 () = #假) Excel 操作对象。写单元格文本 (1, i, 1, 记录集。读文本 ('学号')) Excel 操作对象。写单元格文本 (1, i, 2, 记录集。读文本 ('学生姓名')) Excel 操作对象。写单元格文本 (1, i, 3, 记录集。读文本 ('班级名称')) Excel 操作对象。写单元格文本 (1, i, 4, 记录集。读文本 ('课程代码')) Excel 操作对象。写单元格文本 (1, i, 5, 记录集。读文本 ('课程名称')) Excel 操作对象。写单元格数值 (1, i, 6, 记录集。读大数值 ('成绩'), '0.00') Excel 操作对象。写单元格时间 (1, i, 7, 记录集。读时间 ('考试时间')) Excel 操作对象。写单元格文本 (1, i, 8, 文本_替换 (到文本 (记录集。读整数 ('考试类型')), '0', '期中', '1', '期末', '2', '月考', '3', '周考', '4', '模拟考')) i = i + 1 记录集。到下一条 () .判断循环尾 () ' 自动调整列宽 Excel 操作对象。自动调整列宽 (1) ' 保存 Excel 文件 Excel 操作对象。保存文件 (文件路径) Excel 操作对象。销毁 () 信息框 ('成绩数据导出成功!导出路径:' + 文件路径,0, '成功提示') .子程序 _btnStatisticScore_被单击 ' 显示成绩统计窗口 成绩统计窗口。创建 (真) .子程序 获取成绩信息,成绩信息,公开 .参数 成绩 ID, 大整数型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 成绩信息,成绩信息 ' 查询成绩信息 SQL 语句 = 'SELECT * FROM score WHERE 成绩 ID = ' + 到文本 (成绩 ID) 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 (成绩信息) .判断 (记录集。到记录尾 () = #假) 成绩信息。成绩 ID = 记录集。读大整数 ('成绩 ID') 成绩信息。学生 ID = 记录集。读大整数 ('学生 ID') 成绩信息。课程 ID = 记录集。读大整数 ('课程 ID') 成绩信息。成绩 = 记录集。读大数值 ('成绩') 成绩信息。考试时间 = 记录集。读时间 ('考试时间') 成绩信息。考试类型 = 记录集。读整数 ('考试类型') 成绩信息。状态 = 记录集。读整数 ('status') .判断结束 ' 关闭记录集 记录集。关闭 () 返回 (成绩信息) .子程序 获取学生 ID, 大整数型,公开 .参数 学号,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询学生 ID SQL 语句 = 'SELECT 学生 ID FROM student WHERE 学号 = '' + 文本_替换 (学号, ''', '''') + '' AND status = 1' 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 (0) .判断 (记录集。到记录尾 () = #假) 返回 (记录集。读大整数 ('学生 ID')) .判断结束 ' 关闭记录集 记录集。关闭 () .子程序 获取课程 ID, 大整数型,公开 .参数 课程代码,文本型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询课程 ID SQL 语句 = 'SELECT 课程 ID FROM course WHERE 课程代码 = '' + 文本_替换 (课程代码, ''', '''') + '' AND status = 1' 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 (0) .判断 (记录集。到记录尾 () = #假) 返回 (记录集。读大整数 ('课程 ID')) .判断结束 ' 关闭记录集 记录集。关闭 ()
.版本 2 .支持库 spec .支持库 eDB .支持库 eJYM .支持库 eFile .支持库 eExcel .程序集 程序集 1 .程序集变量 g_用户信息,类_用户信息 .子程序 生成学生成绩报告单,, 公开 .参数 学生 ID, 大整数型 .参数 导出路径,文本型 .局部变量 Excel 操作对象,类_Excel 操作 .局部变量 学生信息,学生信息 .局部变量 课程成绩数组,成绩信息, , "0" .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 .局部变量 总分,双精度小数型 .局部变量 平均分,双精度小数型 ' 获取学生信息 学生信息 = 获取学生信息 (学生 ID) ' 获取学生的课程成绩数组 SQL 语句 = 'SELECT sc.* FROM score sc WHERE sc.学生 ID = ' + 到文本 (学生 ID) + ' AND sc.status = 1 ORDER BY sc.课程 ID ASC' 记录集 = MySQL.查询 (SQL 语句) ' 遍历记录集,收集课程成绩数组 i = 0 .判断循环首 (记录集。到记录尾 () = #假) 重定义数组 (课程成绩数组, , i + 1) 课程成绩数组 [i].成绩 ID = 记录集。读大整数 ('成绩 ID') 课程成绩数组 [i].学生 ID = 记录集。读大整数 ('学生 ID') 课程成绩数组 [i].课程 ID = 记录集。读大整数 ('课程 ID') 课程成绩数组 [i].成绩 = 记录集。读大数值 ('成绩') 课程成绩数组 [i].考试时间 = 记录集。读时间 ('考试时间') 课程成绩数组 [i].考试类型 = 记录集。读整数 ('考试类型') 课程成绩数组 [i].状态 = 记录集。读整数 ('status") i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () ' 计算总分和平均分 总分 = 0.0 .计次循环首 (取数组成员数 (课程成绩数组), i) 总分 = 总分 + 课程成绩数组 [i].成绩 .计次循环首 () 平均分 = 总分 ÷ 取数组成员数 (课程成绩数组) ' 打开 Excel 模板 Excel 操作对象。创建 () .如果真 (Excel 操作对象。打开文件 (系统配置_取配置值 ('Excel 模板路径') + '学生成绩报告单.xlsx") = #假) 信息框 ('Excel 模板打开失败!', 0, '错误提示') Excel 操作对象。销毁 () 返回 () .如果真结束 ' 填写学生信息 Excel 操作对象。写单元格文本 (1, 3, 2, 学生信息。学号) Excel 操作对象。写单元格文本 (1, 3, 4, 学生信息。学生姓名) Excel 操作对象。写单元格文本 (1, 3, 6, 文本_替换 (到文本 (学生信息。性别), '0', '男', '1', '女')) Excel 操作对象。写单元格文本 (1, 4, 2, 获取班级名称 (学生信息。班级 ID)) Excel 操作对象。写单元格文本 (1, 4, 4, 到文本 (学生信息。出生日期, , 'yyyy-MM-dd")) Excel 操作对象。写单元格文本 (1, 4, 6, 学生信息。联系电话) ' 填写课程成绩 i = 7 .计次循环首 (取数组成员数 (课程成绩数组), ) Excel 操作对象。写单元格文本 (1, i, 1, 获取课程代码 (课程成绩数组 [i].课程 ID)) Excel 操作对象。写单元格文本 (1, i, 2, 获取课程名称 (课程成绩数组 [i].课程 ID)) Excel 操作对象。写单元格数值 (1, i, 3, 课程成绩数组 [i].成绩, '0.00") Excel 操作对象。写单元格文本 (1, i, 4, 获取考试类型名称 (课程成绩数组 [i].考试类型)) Excel 操作对象。写单元格文本 (1, i, 5, 到文本 (课程成绩数组 [i].考试时间, , 'yyyy-MM-dd HH:mm:ss")) i = i + 1 .计次循环首 () ' 填写总分和平均分 Excel 操作对象。写单元格数值 (1, i + 1, 3, 总分, '0.00") Excel 操作对象。写单元格数值 (1, i + 2, 3, 平均分, '0.00") ' 填写生成时间 Excel 操作对象。写单元格文本 (1, i + 4, 6, 到文本 (取现行时间 (), , 'yyyy-MM-dd HH:mm:ss")) ' 保存 Excel 文件 Excel 操作对象。保存文件 (导出路径) Excel 操作对象。销毁 () 信息框 ('学生成绩报告单生成成功!导出路径:' + 导出路径,0, '成功提示") .子程序 生成班级成绩单,, 公开 .参数 班级 ID, 大整数型 .参数 导出路径,文本型 .局部变量 Excel 操作对象,类_Excel 操作 .局部变量 学生信息数组,学生信息, , "0" .局部变量 课程信息数组,课程信息, , "0" .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 .局部变量 j, 整数型 .局部变量 班级平均分,双精度小数型 ' 获取班级的学生信息数组 SQL 语句 = 'SELECT * FROM student WHERE 班级 ID = ' + 到文本 (班级 ID) + ' AND status = 1 ORDER BY 学号 ASC" 记录集 = MySQL.查询 (SQL 语句) ' 遍历记录集,收集学生信息数组 i = 0 .判断循环首 (记录集。到记录尾 () = #假) 重定义数组 (学生信息数组, , i + 1) 学生信息数组 [i].学生 ID = 记录集。读大整数 ('学生 ID") 学生信息数组 [i].学号 = 记录集。读文本 ('学号") 学生信息数组 [i].学生姓名 = 记录集。读文本 ('学生姓名") 学生信息数组 [i].性别 = 记录集。读整数 ('性别") 学生信息数组 [i].出生日期 = 记录集。读日期 ('出生日期") 学生信息数组 [i].班级 ID = 记录集。读大整数 ('班级 ID") 学生信息数组 [i].家庭住址 = 记录集。读文本 ('家庭住址") 学生信息数组 [i].联系电话 = 记录集。读文本 ('联系电话") 学生信息数组 [i].状态 = 记录集。读整数 ('status") i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () ' 获取班级的课程信息数组 SQL 语句 = 'SELECT * FROM course WHERE 课程 ID IN (SELECT DISTINCT sc.课程 ID FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID WHERE s.班级 ID = ' + 到文本 (班级 ID) + ' AND sc.status = 1 AND s.status = 1) AND status = 1 ORDER BY 课程代码 ASC" 记录集 = MySQL.查询 (SQL 语句) ' 遍历记录集,收集课程信息数组 i = 0 .判断循环首 (记录集。到记录尾 () = #假) 重定义数组 (课程信息数组, , i + 1) 课程信息数组 [i].课程 ID = 记录集。读大整数 ('课程 ID") 课程信息数组 [i].课程代码 = 记录集。读文本 ('课程代码") 课程信息数组 [i].课程名称 = 记录集。读文本 ('课程名称") 课程信息数组 [i].课程类型 = 记录集。读整数 ('课程类型") 课程信息数组 [i].学分 = 记录集。读大数值 ('学分") 课程信息数组 [i].任课教师 ID = 记录集。读大整数 ('任课教师 ID") 课程信息数组 [i].状态 = 记录集。读整数 ('status") i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () ' 打开 Excel 模板 Excel 操作对象。创建 () .如果真 (Excel 操作对象。打开文件 (系统配置_取配置值 ('Excel 模板路径') + '班级成绩单.xlsx") = #假) 信息框 ('Excel 模板打开失败!', 0, '错误提示") Excel 操作对象。销毁 () 返回 () .如果真结束 ' 填写班级信息 Excel 操作对象。写单元格文本 (1, 3, 2, 获取班级名称 (班级 ID)) Excel 操作对象。写单元格文本 (1, 3, 4, 到文本 (取现行时间 (), , 'yyyy-MM-dd HH:mm:ss") ' 填写课程标题 i = 6 .计次循环首 (取数组成员数 (课程信息数组), ) Excel 操作对象。写单元格文本 (1, 3, i, 获取课程名称 (课程信息数组 [i].课程 ID)) i = i + 1 .计次循环首 () ' 填写学生信息和课程成绩 i = 4 .计次循环首 (取数组成员数 (学生信息数组), ) Excel 操作对象。写单元格文本 (1, i, 2, 学生信息数组 [i].学号) Excel 操作对象。写单元格文本 (1, i, 3, 学生信息数组 [i].学生姓名) Excel 操作对象。写单元格文本 (1, i, 4, 文本_替换 (到文本 (学生信息数组 [i].性别), '0', '男', '1', '女')) j = 6 .计次循环首 (取数组成员数 (课程信息数组), ) ' 查询学生的课程成绩 SQL 语句 = 'SELECT 成绩 FROM score WHERE 学生 ID = ' + 到文本 (学生信息数组 [i].学生 ID) + ' AND 课程 ID = ' + 到文本 (课程信息数组 [j].课程 ID) + ' AND status = 1 ORDER BY 考试时间 DESC LIMIT 1" 成绩 = 到数值 (MySQL.查询单字段值 (SQL 语句)) Excel 操作对象。写单元格数值 (1, i, j, 成绩, '0.00") j = j + 1 .计次循环首 () ' 计算学生总分和平均分 SQL 语句 = 'SELECT SUM(成绩) as 总分,AVG(成绩) as 平均分 FROM score WHERE 学生 ID = ' + 到文本 (学生信息数组 [i].学生 ID) + ' AND status = 1" 记录集 = MySQL.查询 (SQL 语句) Excel 操作对象。写单元格数值 (1, i, j, 记录集。读大数值 ('总分'), '0.00") Excel 操作对象。写单元格数值 (1, i, j + 1, 记录集。读大数值 ('平均分'), '0.00") 记录集。关闭 () i = i + 1 .计次循环首 () ' 填写班级平均分 j = 6 .计次循环首 (取数组成员数 (课程信息数组), ) SQL 语句 = 'SELECT AVG(成绩) as 班级平均分 FROM score sc LEFT JOIN student s ON sc.学生 ID = s.学生 ID WHERE s.班级 ID = ' + 到文本 (班级 ID) + ' AND sc.课程 ID = ' + 到文本 (课程信息数组 [j].课程 ID) + ' AND sc.status = 1 AND s.status = 1" 班级平均分 = 到数值 (MySQL.查询单字段值 (SQL 语句)) Excel 操作对象。写单元格数值 (1, i, j, 班级平均分, '0.00") j = j + 1 .计次循环首 () ' 保存 Excel 文件 Excel 操作对象。保存文件 (导出路径) Excel 操作对象。销毁 () 信息框 ('班级成绩单生成成功!导出路径:' + 导出路径,0, '成功提示") .子程序 生成课程成绩单,, 公开 .参数 课程 ID, 大整数型 .参数 导出路径,文本型 .局部变量 Excel 操作对象,类_Excel 操作 .局部变量 学生信息数组,学生信息, , "0" .局部变量 成绩信息数组,成绩信息, , "0" .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 .局部变量 i, 整数型 .局部变量 j, 整数型 .局部变量 课程平均分,双精度小数型 .局部变量 最高分,双精度小数型 .局部变量 最低分,双精度小数型 ' 获取课程的学生信息数组 SQL 语句 = 'SELECT DISTINCT s.* FROM student s LEFT JOIN score sc ON s.学生 ID = sc.学生 ID WHERE sc.课程 ID = ' + 到文本 (课程 ID) + ' AND s.status = 1 AND sc.status = 1 ORDER BY s.学号 ASC" 记录集 = MySQL.查询 (SQL 语句) ' 遍历记录集,收集学生信息数组 i = 0 .判断循环首 (记录集。到记录尾 () = #假) 重定义数组 (学生信息数组, , i + 1) 学生信息数组 [i].学生 ID = 记录集。读大整数 ('学生 ID") 学生信息数组 [i].学号 = 记录集。读文本 ('学号") 学生信息数组 [i].学生姓名 = 记录集。读文本 ('学生姓名") 学生信息数组 [i].性别 = 记录集。读整数 ('性别") 学生信息数组 [i].出生日期 = 记录集。读日期 ('出生日期") 学生信息数组 [i].班级 ID = 记录集。读大整数 ('班级 ID") 学生信息数组 [i].家庭住址 = 记录集。读文本 ('家庭住址") 学生信息数组 [i].联系电话 = 记录集。读文本 ('联系电话") 学生信息数组 [i].状态 = 记录集。读整数 ('status") i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () ' 获取课程的成绩信息数组 SQL 语句 = 'SELECT sc.* FROM score sc WHERE sc.课程 ID = ' + 到文本 (课程 ID) + ' AND sc.status = 1 ORDER BY sc.学生 ID, sc.考试时间 DESC" 记录集 = MySQL.查询 (SQL 语句) ' 遍历记录集,收集成绩信息数组 i = 0 .判断循环首 (记录集。到记录尾 () = #假) 重定义数组 (成绩信息数组, , i + 1) 成绩信息数组 [i].成绩 ID = 记录集。读大整数 ('成绩 ID") 成绩信息数组 [i].学生 ID = 记录集。读大整数 ('学生 ID") 成绩信息数组 [i].课程 ID = 记录集。读大整数 ('课程 ID") 成绩信息数组 [i].成绩 = 记录集。读大数值 ('成绩") 成绩信息数组 [i].考试时间 = 记录集。读时间 ('考试时间") 成绩信息数组 [i].考试类型 = 记录集。读整数 ('考试类型") 成绩信息数组 [i].状态 = 记录集。读整数 ('status") i = i + 1 记录集。到下一条 () .判断循环尾 () ' 关闭记录集 记录集。关闭 () ' 打开 Excel 模板 Excel 操作对象。创建 () .如果真 (Excel 操作对象。打开文件 (系统配置_取配置值 ('Excel 模板路径') + '课程成绩单.xlsx") = #假) 信息框 ('Excel 模板打开失败!', 0, '错误提示") Excel 操作对象。销毁 () 返回 () .如果真结束 ' 填写课程信息 Excel 操作对象。写单元格文本 (1, 3, 2, 获取课程代码 (课程 ID)) Excel 操作对象。写单元格文本 (1, 3, 4, 获取课程名称 (课程 ID)) Excel 操作对象。写单元格文本 (1, 3, 6, 获取任课教师姓名 (获取课程信息 (课程 ID).任课教师 ID)) Excel 操作对象。写单元格文本 (1, 4, 2, 到文本 (取现行时间 (), , 'yyyy-MM-dd HH:mm:ss") ' 填写学生信息和课程成绩 i = 5 .计次循环首 (取数组成员数 (学生信息数组), ) Excel 操作对象。写单元格文本 (1, i, 2, 学生信息数组 [i].学号) Excel 操作对象。写单元格文本 (1, i, 3, 学生信息数组 [i].学生姓名) Excel 操作对象。写单元格文本 (1, i, 4, 文本_替换 (到文本 (学生信息数组 [i].性别), '0', '男', '1', '女')) Excel 操作对象。写单元格文本 (1, i, 5, 获取班级名称 (学生信息数组 [i].班级 ID)) ' 查询学生的最新成绩 j = 0 .判断循环首 (j < 取数组成员数 (成绩信息数组)) .如果真 (成绩信息数组 [j].学生 ID = 学生信息数组 [i].学生 ID) Excel 操作对象。写单元格数值 (1, i, 6, 成绩信息数组 [j].成绩, '0.00") Excel 操作对象。写单元格文本 (1, i, 7, 获取考试类型名称 (成绩信息数组 [j].考试类型)) Excel 操作对象。写单元格文本 (1, i, 8, 到文本 (成绩信息数组 [j].考试时间, , 'yyyy-MM-dd HH:mm:ss") 跳出循环 () .如果真结束 j = j + 1 .判断循环尾 () i = i + 1 .计次循环首 () ' 填写统计信息 SQL 语句 = 'SELECT AVG(成绩) as 课程平均分,MAX(成绩) as 最高分,MIN(成绩) as 最低分 FROM score WHERE 课程 ID = ' + 到文本 (课程 ID) + ' AND status = 1" 记录集 = MySQL.查询 (SQL 语句) 课程平均分 = 记录集。读大数值 ('课程平均分") 最高分 = 记录集。读大数值 ('最高分") 最低分 = 记录集。读大数值 ('最低分") 记录集。关闭 () Excel 操作对象。写单元格数值 (1, i + 1, 6, 课程平均分, '0.00") Excel 操作对象。写单元格数值 (1, i + 2, 6, 最高分, '0.00") Excel 操作对象。写单元格数值 (1, i + 3, 6, 最低分, '0.00") ' 保存 Excel 文件 Excel 操作对象。保存文件 (导出路径) Excel 操作对象。销毁 () 信息框 ('课程成绩单生成成功!导出路径:' + 导出路径,0, '成功提示") .子程序 获取班级名称,文本型,公开 .参数 班级 ID, 大整数型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询班级名称 SQL 语句 = 'SELECT 班级名称 FROM class WHERE 班级 ID = ' + 到文本 (班级 ID) + ' AND status = 1" 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 ('") .判断 (记录集。到记录尾 () = #假) 返回 (记录集。读文本 ('班级名称") .判断结束 ' 关闭记录集 记录集。关闭 () .子程序 获取课程代码,文本型,公开 .参数 课程 ID, 大整数型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询课程代码 SQL 语句 = 'SELECT 课程代码 FROM course WHERE 课程 ID = ' + 到文本 (课程 ID) + ' AND status = 1" 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 ('") .判断 (记录集。到记录尾 () = #假) 返回 (记录集。读文本 ('课程代码") .判断结束 ' 关闭记录集 记录集。关闭 () .子程序 获取课程名称,文本型,公开 .参数 课程 ID, 大整数型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询课程名称 SQL 语句 = 'SELECT 课程名称 FROM course WHERE 课程 ID = ' + 到文本 (课程 ID) + ' AND status = 1" 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 ('") .判断 (记录集。到记录尾 () = #假) 返回 (记录集。读文本 ('课程名称") .判断结束 ' 关闭记录集 记录集。关闭 () .子程序 获取考试类型名称,文本型,公开 .参数 考试类型,整数型 .判断开始 (考试类型 = 0) 返回 ('期中") .判断 (考试类型 = 1) 返回 ('期末") .判断 (考试类型 = 2) 返回 ('月考") .判断 (考试类型 = 3) 返回 ('周考") .判断 (考试类型 = 4) 返回 ('模拟考") .判断结束 返回 ('") .子程序 获取任课教师姓名,文本型,公开 .参数 任课教师 ID, 大整数型 .局部变量 记录集,类_记录集 .局部变量 SQL 语句,文本型 ' 查询任课教师姓名 SQL 语句 = 'SELECT 真实姓名 FROM user WHERE user_id = ' + 到文本 (任课教师 ID) + ' AND status = 1" 记录集 = MySQL.查询 (SQL 语句) .判断开始 (记录集。到记录尾 () = #真) 返回 ('") .判断 (记录集。到记录尾 () = #假) 返回 (记录集。读文本 ('真实姓名") .判断结束 ' 关闭记录集 记录集。关闭 ()
✅ 测试方法: ① 使用正确的用户名和密码登录系统 ② 使用错误的用户名或密码登录系统 ③ 使用已禁用的用户登录系统 ④ 不同角色的用户登录系统,检查权限是否正确
✅ 预期结果: ① 登录成功,显示对应的主窗口和功能菜单 ② 登录失败,显示'用户名或密码错误!'的警告提示 ③ 登录失败,显示'用户已被禁用!'的警告提示 ④ 不同角色的用户登录系统,显示对应的主窗口和功能菜单,权限控制正确
✅ 测试方法: ① 添加一个新学生 ② 修改学生信息 ③ 删除学生 ④ 搜索学生 ⑤ 导入学生数据(Excel 格式) ⑥ 导出学生数据(Excel 格式)
✅ 预期结果: ① 学生添加成功,刷新学生列表后可以看到该学生 ② 学生信息修改成功,刷新学生列表后可以看到修改后的信息 ③ 学生删除成功,刷新学生列表后看不到该学生 ④ 搜索功能正常,根据搜索关键词显示对应的学生 ⑤ 学生数据导入成功,成功导入 Excel 文件中的学生数据 ⑥ 学生数据导出成功,导出的 Excel 文件格式正确
✅ 测试方法: ① 添加一个新成绩 ② 修改成绩信息 ③ 删除成绩 ④ 搜索成绩 ⑤ 导入成绩数据(Excel 格式) ⑥ 导出成绩数据(Excel 格式) ⑦ 查看成绩统计信息(班级平均分、学生总分、排名、各分数段人数等)
✅ 预期结果: ① 成绩添加成功,刷新成绩列表后可以看到该成绩 ② 成绩信息修改成功,刷新成绩列表后可以看到修改后的信息 ③ 成绩删除成功,刷新成绩列表后看不到该成绩 ④ 搜索功能正常,根据搜索关键词显示对应的成绩 ⑤ 成绩数据导入成功,成功导入 Excel 文件中的成绩数据 ⑥ 成绩数据导出成功,导出的 Excel 文件格式正确 ⑦ 成绩统计信息正确,班级平均分、学生总分、排名、各分数段人数等计算正确
✅ 测试方法: ① 生成学生成绩报告单 ② 生成班级成绩单 ③ 生成课程成绩单
✅ 预期结果: ① 学生成绩报告单生成成功,Excel 文件格式正确,包含学生的个人信息、课程成绩、总分、平均分等 ② 班级成绩单生成成功,Excel 文件格式正确,包含班级的学生信息、课程成绩、总分、平均分、班级平均分等 ③ 课程成绩单生成成功,Excel 文件格式正确,包含课程的学生信息、课程成绩、考试类型、考试时间、课程平均分、最高分、最低分等
✅ 内存优化:
✅ 算法优化:
✅ IO 优化:
✅ 防破解:
✅ 防调试:
✅ 防注入:
✅ 数据加密:
✅ 权限控制:
✅ 操作步骤: ① 打开易语言开发环境,点击'工具→安装包制作工具' ② 选择要打包的程序,设置程序的安装路径、快捷方式等 ③ 选择要打包的支持库和资源文件 ④ 点击'生成安装包'按钮,生成安装包
✅ 本地部署: ① 安装 MySQL 数据库,创建 student_score_system 数据库 ② 导入数据库表结构和初始数据 ③ 配置 MySQL 数据库的用户名和密码 ④ 安装客户端程序,配置客户端程序的数据库连接信息 ⑤ 运行客户端程序,使用正确的用户名和密码登录系统
✅ 服务器部署: ① 在服务器上安装 MySQL 数据库,创建 student_score_system 数据库 ② 导入数据库表结构和初始数据 ③ 配置 MySQL 数据库的用户名和密码,允许远程连接 ④ 安装客户端程序,配置客户端程序的服务器连接信息 ⑤ 运行客户端程序,使用正确的用户名和密码登录系统
✅ 本项目成功实现了一个中小学生成绩管理系统,具备以下功能:
✅ 项目采用三层架构 + 模块化设计,提高了代码的可读性、可维护性和可复用性。项目使用精易模块的强大功能,配合 MySQL 数据库,实现了快速开发和高效运行。
✅ 精易模块的高级使用方法:
✅ 多表关联查询和数据统计:
✅ Excel 数据导入导出和报表生成:
✅ 功能改进:
✅ 性能改进:
✅ 安全改进:
✅ 智能化改进:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online