(附源码)基于Vue.js和Node.js的大学生学科竞赛项目管理系统设计与实现-计算机毕设 41883
基于Vue.js和Node.js的大学生学科竞赛项目管理系统设计与实现
目 录
摘 要
本项目利用Vue.js和Node.js技术,开发了一个大学生学科竞赛项目管理系统,以提高竞赛管理的效率和透明度。系统分为学生、教师、评委、财务及管理员五大用户模块,实现了从竞赛信息发布、作品提交到评分审核的一体化流程。学生用户能够方便地访问通知公告、校园资讯和竞赛信息,并参与竞赛报名及作品上传;教师用户则可以对学生的参赛作品进行指导与管理,评委通过系统完成作品评分工作,而财务人员负责处理相关报销事宜。整个系统结构清晰,功能全面,确保了竞赛活动有序开展。
前端采用Vue.js框架构建用户界面,提供了良好的交互体验,同时后端基于Node.js平台,保证了数据处理的高效性和系统的稳定性。系统特别强调用户体验和操作便捷性,使得各角色用户都能快捷准确地完成各自的任务。系统还支持个人信息修改、密码更新等功能,进一步增强了用户使用的灵活性和安全性。通过这种设计与实现方式,大大提升了学科竞赛管理工作的效率,同时也为其他类似项目的管理提供了一种可行的解决方案。
关键词:大学生学科竞赛项目管理系统;Vue.js框架;Node.js技术
Using Vue.js and Node.js technology, this project developed a project management system to improve the efficiency and transparency of competition management. The system is divided into five user modules: students, teachers, judges, finance and administrators, which realizes the integrated process from competition information release, work submission to scoring and review. Student users can easily access the notice announcement, campus information and competition information, and participate in the competition registration and work uploading; teachers and users can guide and manage the students' entries, and the financial staff are responsible for handling the relevant reimbursement matters. The whole system has a clear structure and comprehensive functions, ensuring the orderly development of the competition activities.
The front end uses the Vue.js framework to build the user interface, which provides a good interactive experience, while the back end is based on the Node.js platform to ensure the high efficiency of data processing and the stability of the system. The system puts special emphasis on user experience and operation convenience, so that each role user can complete their tasks quickly and accurately. The system also supports personal information modification, password update and other functions, further enhancing the user flexibility and security of use. Through this design and implementation method, the efficiency of discipline competition management is greatly improved, and it also provides a feasible solution for the management of other similar projects.
Keywords: project management system; Vue.js framework; Node.js technology
第一章 绪 论
1.1研究背景与意义
随着高校学科竞赛活动的日益增多,传统的管理方式逐渐暴露出效率低下、信息不对称和透明度不足的问题。面对这种情况,一个集成化的管理系统显得尤为重要。大学生学科竞赛项目管理系统通过提供一站式的解决方案,覆盖了从信息发布、报名参赛、作品提交到评分审核的全流程管理,有效解决了上述问题。各参与方,包括学生、教师、评委及管理人员,均能在这个平台上高效协作,极大提升了竞赛组织与管理的水平。
该系统不仅简化了流程,还增强了用户间的互动和沟通,促进了公平竞争环境的形成。对于学生而言,能够更便捷地获取竞赛信息并参与到各类赛事中;教师可以更好地指导学生准备参赛作品;评委在评分时享有更高的透明度和便利性;财务人员处理报销事务也更加高效准确。整体来看,这种系统化、规范化的管理方式有助于提升高校教育资源的利用效率,推动学科竞赛向更高层次发展,为培养创新型人才提供了有力支持。通过这样一个平台,不仅能够促进学生的全面发展,也为高校之间搭建了一个交流学习的桥梁。
1.2国内外研究现状
在国内外,关于大学生学科竞赛管理的研究主要集中在优化组织流程和提升参与体验方面。国外研究强调通过信息技术手段来增强竞赛管理的透明度和效率,例如采用在线平台实现从报名到评审的全流程电子化操作,以及利用数据分析工具对参赛作品进行初步筛选。这类研究关注如何简化行政负担,让组织者可以将更多精力投入到赛事的质量提升上。一些案例展示了高校之间通过合作共享资源和技术,以促进跨校竞赛的成功举办,并且这种合作模式有助于形成更广泛的学术交流网络。
国内相关领域的探索则更多地聚焦于如何通过系统化的管理方案来支持多样化的竞赛需求。研究表明,定制化的管理系统能够有效应对不同学科竞赛之间的差异性要求,为学生提供更加个性化的参赛服务。部分研究还探讨了通过建立完善的反馈机制,提高参赛者、指导教师及评委之间的互动质量,从而优化整个竞赛生态。通过对比国内外的研究发现,虽然具体方法有所不同,但共同目标都是为了打造一个高效、公平、透明的竞赛环境。这些研究成果为构建新一代大学生学科竞赛项目管理系统提供了宝贵的理论基础和实践经验。
1.3论文组织结构
本论文共分为七个主要章节,具体结构如下:
1. 绪论:介绍研究背景与意义,回顾国内外研究现状,并概述论文的组织结构。
2. 相关技术介绍:本章节将对大学生学科竞赛项目管理系统的实现关键技术进行简要介绍。
3. 需求分析:对系统的功能需求和非功能需求进行分析,明确用户和管理员的需求,并进行可行性分析,包括技术、操作和经济可行性。
4. 系统设计:涵盖系统架构设计、系统模块设计,并进行数据库的概念设计与表设计。
5. 系统实现:具体描述各个功能模块的实现过程,展示系统如何根据需求进行开发。
6. 系统测试:阐述测试的目的,分析测试结果并得出结论,以验证系统的稳定性和功能完整性。
7. 总结:总结研究的主要成果和贡献,指出存在的不足及未来的研究方向。
第二章 关键技术
2.1Node.JS开发语言
Node.js是一个开源的JavaScript运行环境,它能够在服务器端执行JavaScript代码[1]。Node.js采用事件驱动和非阻塞I/O模型,使其在处理高并发时展现出优越的性能和吞吐量,特别适合构建网络应用。这种运行环境允许开发者使用JavaScript编写服务器端的脚本,从而使得前后端的开发语言保持一致,简化了开发流程。Node.js的非阻塞I/O模型意味着它在处理输入输出操作时不会阻塞程序的其他部分,这大大提高了程序的效率,尤其是在处理大量并发连接时[2]。事件驱动的架构使得Node.js能够以轻量级的方式处理多个并发任务,这使得它在构建实时的、需要快速响应的应用程序时,如聊天应用、在线游戏和实时数据流处理等场景中,具有显著的优势。
2.2 MySQL数据库
MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),其稳定性、可靠性和卓越性能使其成为众多应用程序的首选数据库[3]。MySQL支持标准SQL语法,并提供丰富的功能和特性,如事务处理、触发器和存储过程等,以满足开发者对数据管理和操作的需求。MySQL具有良好的可扩展性,支持主从复制、分布式架构和集群部署,适用于各种规模和负载的应用场景[4]。作为一个开源项目,MySQL拥有庞大的用户社区和活跃的开发者社区,为用户提供了丰富的文档、教程和支持资源。总之,MySQL是一款可靠、强大且灵活的关系型数据库管理系统。通过其卓越性能和可扩展性,帮助开发者高效地管理和操作数据,并得到了广大用户的认可和应用[5]。
2.3Vue技术
Vue是一种渐进式JavaScript框架,专注于构建用户界面。Vue采用组件化的开发模式,允许开发者将应用程序拆分为独立的、可重用的组件,从而提高了开发效率和代码的可维护性[6]。框架的核心库专注于视图层,支持数据绑定和DOM操作,提供了简洁的API。Vue的虚拟DOM机制提升了应用的性能,减少了实际DOM操作的次数。
Vue支持双向数据绑定,能够自动更新视图与模型之间的变化。开发者可以通过Vue的指令系统,简化数据展示和事件处理。Vue还支持路由管理和状态管理,使得开发复杂单页面应用变得更加容易[7]。借助Vue的生态系统,开发者能够使用多种工具和库来扩展功能,满足不同的业务需求。Vue在前端开发中逐渐成为主流选择,受到广泛关注和应用。
2.4B/S模式
B/S(Browser/Server)架构,即浏览器/服务器架构,是一种现代的应用程序架构模式。这种架构模式的主要特点在于它将用户端的大部分处理工作转移到了浏览器端,这样一来,就大大简化了客户端的部署和维护工作。在本系统中,用户通过浏览器访问服务管理平台,而所有的后端业务逻辑和数据管理则完全由服务器端来处理,这样不仅提高了系统的运行效率,还形成了高效的数据交互模式。
2.5Node.jsScript脚本语言
Node.jsScript是一种被广泛采用的脚本语言,它在前端开发领域中扮演着至关重要的角色。这种语言特别擅长与HTML和CSS这两种标记语言和样式表语言相结合,从而能够创建出具有动态效果和用户交互功能的网页。在当前这个项目中,Node.jsScript不仅仅局限于前端的应用,它还被用来与Express框架的后端API进行有效的交互和数据交换[8]。
第三章 系统分析
3.1系统可行性分析
3.1.1技术可行性
在技术可行性方面,选择使用Node.js作为开发语言,结合相应的框架,以实现系统的功能需求。Node.js作为一种高效的服务器端JavaScript运行环境,具备非阻塞I/O和高并发处理能力,非常适合开发高性能的网络应用。作为Node.js的Web框架,提供了简洁且灵活的开发接口,能够帮助快速搭建和扩展Web应用,使得系统的设计和实现更加高效和便捷。结合的轻量级开发模式,进一步提升系统的技术可行性。
3.1.2经济可行性
系统开发采用开源技术栈,降低了软件授权与工具采购成本。Node.js和相应的框架简化了开发流程,缩短了项目周期,减少了人力投入。此外,借助云计算资源部署系统,可根据实际需求灵活调整服务器配置,进一步降低硬件成本。总体而言,该方案在经济上具有较高性价比。
3.1.3操作可行性
在操作可行性方面,本系统设计注重用户体验,采用了直观易用的界面设计,并提供详细的帮助文档支持,确保用户可以轻松上手使用各项功能。无论是用户还是后台管理员,都能通过简洁明了的操作流程完成信息查询和管理等任务。因此,从用户操作的角度来看,本系统具备良好的操作可行性。
3.2系统功能分析
3.2.1功能性分析
大学生学科竞赛项目管理系统划分为了前端模块和后端模块两大部分。
前端学生用户模块:
注册登录:学生用户可以通过注册页面创建新账户,需要填写用户名、密码、邮箱等信息,并通过邮箱验证激活账户。登录功能允许学生使用用户名和密码登录系统,支持记住我选项以便下次快速登录。
首页:首页是学生用户访问平台后看到的第一个页面,它展示了通知公告、校园资讯和竞赛信息三个模块的入口。通知公告部分列出了最新的网站公告和重要信息,校园资讯部分提供了校园新闻和活动信息,竞赛信息部分则展示了当前可参与的竞赛详情。
通知公告:通知公告模块允许学生查看最新的网站公告,了解平台的更新和重要信息。学生可以查看关于我们页面了解平台背景,通过联系方式获取帮助,以及通过网站介绍了解平台的功能和目的。
校园资讯:校园资讯模块提供了校园内的最新新闻和活动信息。学生可以对感兴趣的资讯进行点赞、收藏和评论,与他人分享自己的看法和意见。
竞赛信息:竞赛信息模块列出了当前可参与的各类竞赛,学生可以对感兴趣的竞赛进行点赞和收藏。学生还可以上传自己的作品参与竞赛,并对其他人的作品进行评论。
我的账户:在“我的账户”模块中,学生可以修改自己的登录密码和账户资料,如邮箱、用户名等,以确保账户安全和个人信息的准确性。
个人中心:个人中心是学生用户管理个人信息和活动的区域。学生可以查看个人首页,提交自己的作品,查看作品评分,添加团队信息,查看教师信息,进行问题反馈,处理财务报销事宜,管理自己的收藏和评论。
后端教师用户模块:
登录:教师用户通过输入由管理员分配的用户名和密码进行登录。登录成功后,教师可以进入后台进行各项操作。
后台首页:教师用户登录后,首先看到的是后台首页。在首页上,教师可以点击自己的头像,进入个人信息页面,在这里可以查看和修改自己的个人信息,包括但不限于姓名、联系方式等,并且可以修改登录密码。
竞赛信息管理:在竞赛信息管理页面,教师可以进行查询操作,查看所有竞赛信息,并且可以点击某个竞赛的详情,查看该竞赛的详细信息,如竞赛规则、时间安排等。
作品提交管理:教师可以在此页面进行作品提交的查询和管理。通过查询功能,教师可以查看所有提交的作品列表,并且可以点击作品详情,查看作品的具体内容和提交情况。
作品评分管理:在作品评分管理页面,教师可以查询所有提交的作品,并且可以对作品进行评分。点击作品详情,教师可以查看作品的详细信息,并进行打分和评论。
团队信息管理:教师可以在此页面查询所有参与竞赛的团队信息,并且可以查看团队的详细信息。此外,教师还可以向团队发送消息,进行沟通和指导。
教师消息管理:教师可以在此页面进行消息的添加、删除和查询操作。教师可以添加新的消息通知给学生,也可以删除不再需要的消息,同时可以查询历史消息记录,并查看每条消息的详细内容。
问题反馈管理:在问题反馈管理页面,教师可以查看学生提交的问题反馈,并进行查询和审核。对于每个问题,教师可以查看详细内容,并给出回复,帮助学生解决问题。
后端评委用户模块:
登录:评委用户通过输入账号和密码登录系统,登录信息由管理员预先添加至数据库中,确保评委身份的合法性。
后台首页:登录成功后,评委用户将进入后台首页,该页面展示所有作品的评分统计信息,方便评委快速了解整体评分情况。页面顶部显示评委的头像,点击头像可进入个人信息页面,进行查看和修改个人信息的操作。同时,评委还可以在后台首页修改自己的登录密码,以保证账户安全。
竞赛信息管理:评委用户可以在此模块中查询所有竞赛信息,并且可以点击具体竞赛查看详细信息,包括竞赛规则、参赛作品列表等,以便于评委对竞赛有全面的了解。
作品提交管理:此模块允许评委查询所有提交的作品,并且可以点击作品查看详细信息,包括作品名称、提交者信息、提交时间等。评委还可以在该模块中对作品进行评分,输入评分标准和评语,完成评分工作。
作品评分管理:评委可以在此模块中对已评分的作品进行管理,包括删除不合规或错误的评分记录,以及查询和查看作品的详细评分信息,确保评分的准确性和公正性。
后端财务用户模块:
登录:财务用户通过输入由管理员分配的用户名和密码进行登录。登录成功后,财务用户可以进入后台进行各项操作。
后台首页:用户登录成功后,会进入后台首页。在这个页面上,用户可以看到一个头像图标,点击头像可以进入个人信息页面。在这里,用户可以查看自己的详细信息。用户还可以修改自己的登录密码,以确保账户安全。
财务报销管理:在财务报销管理模块中,用户可以执行多个操作。用户可以进行查询操作,通过输入不同的条件来筛选出需要查看的报销记录。对于每一条报销记录,用户可以点击详情查看具体的报销信息,如报销金额、报销项目、提交时间等。审核功能允许用户对报销申请进行审核,根据报销的合理性和合规性来决定是否通过。通过审核的报销记录,财务用户可以执行支付操作,完成财务报销流程。
后端管理员模块:
登录功能:管理员可以通过输入正确的用户名和密码登录到后台管理系统。系统将验证输入的信息,确保只有授权的管理员才能访问管理界面。
后台首页:在后台首页,管理员可以看到作品评分的统计信息,方便了解整体评分情况。点击个人头像,管理员可以进入个人信息页面,在这里可以查看和修改自己的姓名、联系方式等信息。此外,管理员还可以在个人信息页面修改登录密码,以确保账户安全。
系统用户管理:系统中包含多种用户角色,包括管理员、学生用户、教师用户、评委用户和财务用户。管理员可以对这些用户进行添加、删除和查询操作,并查看每个用户的详细信息。
竞赛分类管理:管理员可以对竞赛分类进行管理,包括添加新的分类、删除不再需要的分类以及查询现有分类的详细信息。每个分类的详情页面将展示该分类下的所有竞赛信息。
竞赛信息管理:在竞赛信息管理模块,管理员可以添加新的竞赛信息,删除不再举办的竞赛,以及查询和查看现有竞赛的详细信息。管理员还可以查看用户对竞赛的评论,了解用户反馈。
作品提交管理:管理员可以对提交的作品进行管理,包括删除不合规或重复的作品,查询作品列表,并查看每个作品的详细信息。管理员还可以对作品进行评分,确保作品质量。
作品评分管理:在作品评分管理模块,管理员可以删除或查询评分记录,并查看每个作品的详细评分信息。这有助于管理员监督评分过程,确保评分的公正性。
团队信息管理:管理员可以对团队信息进行管理,包括删除不再活跃的团队、查询团队详情、查看团队消息、处理团队反馈以及审核团队报销申请。这些功能确保了团队管理的高效性和透明性。
教师消息管理:管理员可以对教师发送的消息进行管理,包括删除不再需要的消息、查询消息记录,并查看每条消息的详细内容。这有助于管理员及时了解教师的需求和反馈。
问题反馈管理:管理员可以对用户提交的问题反馈进行管理,包括删除无效的反馈、查询反馈记录,并查看每个反馈的详细内容。管理员还可以对反馈进行回复,确保用户问题得到解决。
财务报销管理:在财务报销管理模块,管理员可以删除不再需要的报销记录、查询报销详情、处理支付事宜以及审核报销申请。这些功能确保了财务流程的规范性和透明性。
系统管理:管理员可以对系统中的轮播图进行管理,包括添加新的轮播图、删除不再使用的轮播图以及查询轮播图的详细信息。管理员还可以查看轮播图的展示效果,确保轮播图内容的准确性和吸引力。
通知公告管理:管理员可以对通知公告进行管理,包括添加新的公告、删除过时的公告以及查询公告记录。管理员还可以查看公告的详细内容,确保信息传达的及时性和准确性。
资源管理:管理员可以管理校园资讯,包括添加新的资讯、删除不再需要的资讯以及查询资讯记录。管理员还可以对资讯进行分类管理,包括添加新的分类、删除不再需要的分类以及查询分类详情。管理员还可以查看资讯的评论,了解用户对资讯的反馈和意见。
3.2.2非功能性分析
大学生学科竞赛项目管理系统的非功能性需求比如大学生学科竞赛项目管理系统的安全性怎么样,可靠性怎么样,性能怎么样,可拓展性怎么样等,具体可以表示在如下3-1表格中:
表3-1大学生学科竞赛项目管理系统非功能需求表
|
安全性 |
主要指大学生学科竞赛项目管理系统数据库的安装,数据库的使用和密码的设定必须合乎规范。 |
|
可靠性 |
可靠性是指大学生学科竞赛项目管理系统能够安装用户的指示进行操作,经过测试,可靠性90%以上。 |
|
性能 |
性能是影响大学生学科竞赛项目管理系统占据市场的必要条件,所以性能最好要佳才好。 |
|
可扩展性 |
比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。 |
|
易用性 |
用户只要跟着大学生学科竞赛项目管理系统的页面展示内容进行操作,就可以了。 |
|
可维护性 |
大学生学科竞赛项目管理系统开发的可维护性是非常重要的,经过测试,可维护性没有问题 |
3.3系统用例分析
大学生学科竞赛项目管理系统的完整UML用例图分别是图3-1、3-2、3-3、3-4、3-5。
学生用户角色用例如下图所示。

图3-1大学生学科竞赛项目管理系统学生用户角色用例图
管理员角色用例如下图所示。

图3-2大学生学科竞赛项目管理系统管理员角色用例图
教师用户角色用例如下图所示。

图3-3大学生学科竞赛项目管理系统教师用户角色用例图
评委用户角色用例如下图所示。

图3-4大学生学科竞赛项目管理系统评委用户角色用例图
财务用户角色用例如下图所示。

图3-5大学生学科竞赛项目管理系统财务用户角色用例图
3.4系统总体流程设计
3.4.1数据开发流程
系统开发流程的主要步骤,从需求分析到系统完成的全过程。流程包括需求分析、总体设计(结构、功能、数据)、详细设计(模块、编码)、模块整合与调用,以及测试、扩展和完善,最终完成系统的开发。本系统的开发流程如下图所示

图3-6系统开发流程图
3.4.2用户登录流程
用户输入用户名和密码后,系统先检查输入是否为空,再验证用户名是否存在,若存在则通过用户名获取密码并校验。若密码正确则登录成功,否则提示密码错误。若用户名不存在或无法登录,提示用户操作无效。如下图所示。

图3-7登录流程图
3.4.3系统操作流程
用户首先进入系统登录界面,输入用户名和密码后,系统验证信息是否正确。若验证失败,返回登录界面重新输入,若验证成功,则进入功能界面,执行相应功能处理后结束操作流程。操作流程如下图所示。

图3-8系统操作流程图
3.4.4添加信息流程
管理员可以添加信息,用户添加可以自己权限内的信息,输入信息后,要想利用这个软件来进行系统的安全管理,首先需要登录到该软件中。添加信息流程如下图所示。

图3-9添加信息流程图
3.4.5修改信息流程
用户首先选择需要修改的记录,输入修改后的数据,系统判断输入数据是否合法。若数据不合法,提示重新输入,若数据合法,则将修改后的数据写入数据库,完成操作后流程结束。修改信息流程图如下图所示。

图3-10修改信息流程图
3.4.6删除信息流程
用户选择需要删除的记录后,系统判断是否确认删除。若未确认,返回选择环节,若确认删除,则更新数据库,删除对应记录,完成操作后流程结束。删除信息流程图如下图所示。

图3-11删除信息流程图
第四章 系统总体设计
本章主要讨论的内容包括大学生学科竞赛项目管理系统的功能模块设计、数据库系统设计。
4.1系统架构设计
本大学生学科竞赛项目管理系统从架构上分为三层:表现层(UI)、业务逻辑层(BLL)以及数据层(DL)。

图4-1大学生学科竞赛项目管理系统架构设计图
表现层(UI):也称为用户界面层,它负责与用户进行直接的交互。一个优秀的UI设计能够显著提升用户的体验,确保用户在使用大学生学科竞赛项目管理系统时感到舒适和便捷。为了确保良好的兼容性,UI界面设计需要适应不同版本的平台和各种屏幕尺寸的分辨率。此外,UI交互功能必须合理设计,确保用户的操作能够得到相应的反馈和结果,这要求表现层与业务逻辑层之间保持良好的通信和协同工作。
业务逻辑层(BLL):这一层主要处理大学生学科竞赛项目管理系统的数据和业务逻辑。当用户通过表现层提交数据时,业务逻辑层会接收这些数据,进行处理,并将结果传递给数据层进行存储或查询。同时,当系统需要从数据层读取数据时,业务逻辑层会处理这些数据,并将其传递给表现层进行展示。
数据层(DL):虽然本大学生学科竞赛项目管理系统的数据存储在服务端的MySQL数据库中,但数据层仍然作为一个独立的部分存在。它的主要功能是存储和管理大学生学科竞赛项目管理系统的数据。数据层与MySQL数据库进行交互,执行数据的增、删、改、查等操作,确保数据的完整性和安全性。
这三个层次相互独立但又紧密协作,共同构成了大学生学科竞赛项目管理系统的完整架构。通过合理的分层设计,可以提高系统的可维护性、可扩展性和可重用性,为用户提供更好的服务和体验。
4.2系统模块设计
在上一章节中主要对系统的功能性需求和非功能性需求进行分析,并且根据需求分析了本大学生学科竞赛项目管理系统中的用例。那么接下来就要开始对本大学生学科竞赛项目管理系统的架构、主要功能和数据库开始进行设计。大学生学科竞赛项目管理系统根据前面章节的需求分析得出,大学生学科竞赛项目管理系统的功能模块图如下图所示。

图4-2大学生学科竞赛项目管理系统功能模块图
4.3数据库设计
数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。
4.3.1数据库概念结构设计
下面是整个大学生学科竞赛项目管理系统中主要的数据库表总E-R实体关系图。

图4-3大学生学科竞赛项目管理系统总E-R关系图
4.3.2数据库逻辑结构设计
通过上一小节中大学生学科竞赛项目管理系统中总E-R关系图上得出一共需要创建多个数据表。在此主要罗列几个主要的数据库表结构设计。
表 4-1-access_token(登陆访问时长)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
token_id |
int |
是 |
是 |
临时访问牌ID |
|
|
2 |
token |
varchar |
64 |
否 |
否 |
临时访问牌 |
|
3 |
info |
text |
65535 |
否 |
否 |
信息 |
|
4 |
maxage |
int |
是 |
否 |
最大寿命:默认2小时 |
|
|
5 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
6 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
7 |
user_id |
int |
是 |
否 |
用户编号 |
表 4-2-article(文章)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
article_id |
mediumint |
是 |
是 |
文章id |
|
|
2 |
title |
varchar |
125 |
是 |
是 |
标题 |
|
3 |
type |
varchar |
64 |
是 |
否 |
文章分类 |
|
4 |
hits |
int |
是 |
否 |
点击数 |
|
|
5 |
praise_len |
int |
是 |
否 |
点赞数 |
|
|
6 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
7 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
8 |
source |
varchar |
255 |
否 |
否 |
来源 |
|
9 |
url |
varchar |
255 |
否 |
否 |
来源地址 |
|
10 |
tag |
varchar |
255 |
否 |
否 |
标签 |
|
11 |
content |
longtext |
4294967295 |
否 |
否 |
正文 |
|
12 |
img |
varchar |
255 |
否 |
否 |
封面图 |
|
13 |
description |
text |
65535 |
否 |
否 |
文章描述 |
表 4-3-article_type(文章分类)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
type_id |
smallint |
是 |
是 |
分类ID |
|
|
2 |
display |
smallint |
是 |
否 |
显示顺序 |
|
|
3 |
name |
varchar |
16 |
是 |
否 |
分类名称 |
|
4 |
father_id |
smallint |
是 |
否 |
上级分类ID |
|
|
5 |
description |
varchar |
255 |
否 |
否 |
描述 |
|
6 |
icon |
text |
65535 |
否 |
否 |
分类图标 |
|
7 |
url |
varchar |
255 |
否 |
否 |
外链地址 |
|
8 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
9 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-4-auth(用户权限管理)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
auth_id |
int |
是 |
是 |
授权ID |
|
|
2 |
user_group |
varchar |
64 |
否 |
否 |
用户组 |
|
3 |
mod_name |
varchar |
64 |
否 |
否 |
模块名 |
|
4 |
table_name |
varchar |
64 |
否 |
否 |
表名 |
|
5 |
page_title |
varchar |
255 |
否 |
否 |
页面标题 |
|
6 |
path |
varchar |
255 |
否 |
否 |
路由路径 |
|
7 |
parent |
varchar |
64 |
否 |
否 |
父级菜单 |
|
8 |
parent_sort |
int |
是 |
否 |
父级菜单排序 |
|
|
9 |
position |
varchar |
32 |
否 |
否 |
位置 |
|
10 |
mode |
varchar |
32 |
是 |
否 |
跳转方式 |
|
11 |
add |
tinyint |
是 |
否 |
是否可增加 |
|
|
12 |
del |
tinyint |
是 |
否 |
是否可删除 |
|
|
13 |
set |
tinyint |
是 |
否 |
是否可修改 |
|
|
14 |
get |
tinyint |
是 |
否 |
是否可查看 |
|
|
15 |
field_add |
text |
65535 |
否 |
否 |
添加字段 |
|
16 |
field_set |
text |
65535 |
否 |
否 |
修改字段 |
|
17 |
field_get |
text |
65535 |
否 |
否 |
查询字段 |
|
18 |
table_nav_name |
varchar |
500 |
否 |
否 |
跨表导航名称 |
|
19 |
table_nav |
varchar |
500 |
否 |
否 |
跨表导航 |
|
20 |
option |
text |
65535 |
否 |
否 |
配置 |
|
21 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
22 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-5-code_token(验证码)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
code_token_id |
int |
是 |
是 |
验证码ID |
|
|
2 |
token |
varchar |
255 |
否 |
否 |
令牌 |
|
3 |
code |
varchar |
255 |
否 |
否 |
验证码 |
|
4 |
expire_time |
timestamp |
是 |
否 |
失效时间 |
|
|
5 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
6 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-6-collect(收藏)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
collect_id |
int |
是 |
是 |
收藏ID |
|
|
2 |
user_id |
int |
是 |
是 |
收藏人ID |
|
|
3 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
4 |
source_field |
varchar |
255 |
否 |
否 |
来源字段 |
|
5 |
source_id |
int |
是 |
否 |
来源ID |
|
|
6 |
title |
varchar |
255 |
否 |
否 |
标题 |
|
7 |
img |
varchar |
255 |
否 |
否 |
封面 |
|
8 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
9 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-7-comment(评论)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
comment_id |
int |
是 |
是 |
评论ID |
|
|
2 |
user_id |
int |
是 |
是 |
评论人ID |
|
|
3 |
reply_to_id |
int |
是 |
否 |
回复评论ID |
|
|
4 |
content |
longtext |
4294967295 |
否 |
否 |
内容 |
|
5 |
nickname |
varchar |
255 |
否 |
否 |
昵称 |
|
6 |
avatar |
varchar |
255 |
否 |
否 |
头像地址 |
|
7 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
8 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
9 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
10 |
source_field |
varchar |
255 |
否 |
否 |
来源字段 |
|
11 |
source_id |
int |
是 |
否 |
来源ID |
表 4-8-competition_classification(竞赛分类)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
competition_classification_id |
int |
是 |
是 |
竞赛分类ID |
|
|
2 |
competition_classification |
varchar |
64 |
否 |
否 |
竞赛分类 |
|
3 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
4 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-9-contest_information(竞赛信息)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
contest_information_id |
int |
是 |
是 |
竞赛信息ID |
|
|
2 |
contest_name |
varchar |
64 |
否 |
否 |
竞赛名称 |
|
3 |
competition_classification |
varchar |
64 |
否 |
否 |
竞赛分类 |
|
4 |
competition_poster |
varchar |
255 |
否 |
否 |
竞赛海报 |
|
5 |
competition_location |
varchar |
64 |
否 |
否 |
竞赛地点 |
|
6 |
competition_time |
varchar |
64 |
否 |
否 |
竞赛时间 |
|
7 |
competition_details |
longtext |
4294967295 |
否 |
否 |
竞赛详情 |
|
8 |
scoring_criteria |
longtext |
4294967295 |
否 |
否 |
评分标准 |
|
9 |
hits |
int |
是 |
否 |
点击数 |
|
|
10 |
praise_len |
int |
是 |
否 |
点赞数 |
|
|
11 |
collect_len |
int |
是 |
否 |
收藏数 |
|
|
12 |
comment_len |
int |
是 |
否 |
评论数 |
|
|
13 |
submission_of_works_limit_times |
int |
是 |
否 |
作品上传限制次数 |
|
|
14 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
15 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-10-financial_reimbursement(财务报销)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
financial_reimbursement_id |
int |
是 |
是 |
财务报销ID |
|
|
2 |
student_users |
int |
否 |
否 |
学生用户 |
|
|
3 |
student_name |
varchar |
64 |
否 |
否 |
学生姓名 |
|
4 |
financial_user |
int |
否 |
否 |
财务用户 |
|
|
5 |
financial_name |
varchar |
64 |
否 |
否 |
财务姓名 |
|
6 |
team_name |
varchar |
64 |
否 |
否 |
团队名称 |
|
7 |
team_funding |
double |
否 |
否 |
团队经费 |
|
|
8 |
invoice_code |
varchar |
64 |
否 |
否 |
发票编码 |
|
9 |
details_of_funding |
text |
65535 |
否 |
否 |
经费详情 |
|
10 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
|
11 |
examine_reply |
varchar |
16 |
否 |
否 |
审核回复 |
|
12 |
pay_state |
varchar |
16 |
是 |
否 |
支付状态 |
|
13 |
pay_type |
varchar |
16 |
否 |
否 |
支付类型: 微信、支付宝、网银 |
|
14 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
15 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
16 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
17 |
source_id |
int |
否 |
否 |
来源ID |
|
|
18 |
source_user_id |
int |
否 |
否 |
来源用户 |
表 4-11-financial_user(财务用户)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
financial_user_id |
int |
是 |
是 |
财务用户ID |
|
|
2 |
financial_name |
varchar |
64 |
否 |
否 |
财务姓名 |
|
3 |
financial_gender |
varchar |
64 |
否 |
否 |
财务性别 |
|
4 |
contact_information |
varchar |
16 |
否 |
否 |
联系方式 |
|
5 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
|
6 |
user_id |
int |
是 |
否 |
用户ID |
|
|
7 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
8 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-12-hits(用户点击)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
hits_id |
int |
是 |
是 |
点赞ID |
|
|
2 |
user_id |
int |
是 |
否 |
点赞人 |
|
|
3 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
4 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
5 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
6 |
source_field |
varchar |
255 |
否 |
否 |
来源字段 |
|
7 |
source_id |
int |
是 |
否 |
来源ID |
表 4-13-judges_user(评委用户)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
judges_user_id |
int |
是 |
是 |
评委用户ID |
|
|
2 |
name_of_judges |
varchar |
64 |
否 |
否 |
评委姓名 |
|
3 |
gender_of_judges |
varchar |
64 |
否 |
否 |
评委性别 |
|
4 |
contact_information |
varchar |
16 |
否 |
否 |
联系方式 |
|
5 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
|
6 |
user_id |
int |
是 |
否 |
用户ID |
|
|
7 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
8 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-14-notice(公告)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
notice_id |
mediumint |
是 |
是 |
公告ID |
|
|
2 |
title |
varchar |
125 |
是 |
否 |
标题 |
|
3 |
content |
longtext |
4294967295 |
否 |
否 |
正文 |
|
4 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
5 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-15-praise(点赞)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
praise_id |
int |
是 |
是 |
点赞ID |
|
|
2 |
user_id |
int |
是 |
是 |
点赞人 |
|
|
3 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
4 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
5 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
6 |
source_field |
varchar |
255 |
否 |
否 |
来源字段 |
|
7 |
source_id |
int |
是 |
否 |
来源ID |
|
|
8 |
status |
tinyint |
是 |
否 |
点赞状态:1为点赞,0已取消 |
表 4-16-question_feedback(问题反馈)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
question_feedback_id |
int |
是 |
是 |
问题反馈ID |
|
|
2 |
student_users |
int |
否 |
否 |
学生用户 |
|
|
3 |
student_name |
varchar |
64 |
否 |
否 |
学生姓名 |
|
4 |
teacher_user |
int |
否 |
否 |
教师用户 |
|
|
5 |
teachers_name |
varchar |
64 |
否 |
否 |
教师姓名 |
|
6 |
feedback_time |
date |
否 |
否 |
反馈时间 |
|
|
7 |
feedback_content |
text |
65535 |
否 |
否 |
反馈内容 |
|
8 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
|
9 |
examine_reply |
varchar |
16 |
否 |
否 |
审核回复 |
|
10 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
11 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
12 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
13 |
source_id |
int |
否 |
否 |
来源ID |
|
|
14 |
source_user_id |
int |
否 |
否 |
来源用户 |
表 4-17-score(评分)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
score_id |
int |
是 |
是 |
评分ID |
|
|
2 |
user_id |
int |
是 |
否 |
评分人 |
|
|
3 |
nickname |
varchar |
64 |
否 |
否 |
昵称 |
|
4 |
score_num |
double |
是 |
否 |
评分 |
|
|
5 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
6 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
7 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
8 |
source_field |
varchar |
255 |
否 |
否 |
来源字段 |
|
9 |
source_id |
int |
是 |
否 |
来源ID |
表 4-18-score_of_works(作品评分)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
score_of_works_id |
int |
是 |
是 |
作品评分ID |
|
|
2 |
judges_user |
int |
否 |
否 |
评委用户 |
|
|
3 |
name_of_judges |
varchar |
64 |
否 |
否 |
评委姓名 |
|
4 |
student_users |
int |
否 |
否 |
学生用户 |
|
|
5 |
student_name |
varchar |
64 |
否 |
否 |
学生姓名 |
|
6 |
contest_name |
varchar |
64 |
否 |
否 |
竞赛名称 |
|
7 |
team_name |
varchar |
64 |
否 |
否 |
团队名称 |
|
8 |
name_of_work |
varchar |
64 |
否 |
否 |
作品名称 |
|
9 |
rating_information |
double |
否 |
否 |
评分信息 |
|
|
10 |
grading_time |
date |
否 |
否 |
评分时间 |
|
|
11 |
rating_details |
text |
65535 |
否 |
否 |
评分详情 |
|
12 |
comments_of_the_judges |
text |
65535 |
否 |
否 |
评委意见 |
|
13 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
14 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
15 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
16 |
source_id |
int |
否 |
否 |
来源ID |
|
|
17 |
source_user_id |
int |
否 |
否 |
来源用户 |
表 4-19-slides(轮播图)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
slides_id |
int |
是 |
是 |
轮播图ID |
|
|
2 |
title |
varchar |
64 |
否 |
否 |
标题 |
|
3 |
content |
varchar |
255 |
否 |
否 |
内容 |
|
4 |
url |
varchar |
255 |
否 |
否 |
链接 |
|
5 |
img |
varchar |
255 |
否 |
否 |
轮播图 |
|
6 |
hits |
int |
是 |
否 |
点击量 |
|
|
7 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
8 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-20-student_users(学生用户)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
student_users_id |
int |
是 |
是 |
学生用户ID |
|
|
2 |
student_name |
varchar |
64 |
否 |
否 |
学生姓名 |
|
3 |
student_gender |
varchar |
64 |
否 |
否 |
学生性别 |
|
4 |
contact_information |
varchar |
16 |
否 |
否 |
联系方式 |
|
5 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
|
6 |
user_id |
int |
是 |
否 |
用户ID |
|
|
7 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
8 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-21-submission_of_works(作品提交)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
submission_of_works_id |
int |
是 |
是 |
作品提交ID |
|
|
2 |
student_users |
int |
否 |
否 |
学生用户 |
|
|
3 |
student_name |
varchar |
64 |
否 |
否 |
学生姓名 |
|
4 |
contest_name |
varchar |
64 |
否 |
否 |
竞赛名称 |
|
5 |
team_name |
varchar |
64 |
否 |
否 |
团队名称 |
|
6 |
name_of_work |
varchar |
64 |
否 |
否 |
作品名称 |
|
7 |
work_progress |
varchar |
64 |
否 |
否 |
作品进度 |
|
8 |
work_file |
varchar |
255 |
否 |
否 |
作品文件 |
|
9 |
upload_time |
date |
否 |
否 |
上传时间 |
|
|
10 |
note_information |
text |
65535 |
否 |
否 |
备注信息 |
|
11 |
score_of_works_limit_times |
int |
是 |
否 |
评分限制次数 |
|
|
12 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
13 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
14 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
15 |
source_id |
int |
否 |
否 |
来源ID |
|
|
16 |
source_user_id |
int |
否 |
否 |
来源用户 |
表 4-22-teacher_message(教师消息)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
teacher_message_id |
int |
是 |
是 |
教师消息ID |
|
|
2 |
teacher_user |
int |
否 |
否 |
教师用户 |
|
|
3 |
teachers_name |
varchar |
64 |
否 |
否 |
教师姓名 |
|
4 |
student_users |
int |
否 |
否 |
学生用户 |
|
|
5 |
student_name |
varchar |
64 |
否 |
否 |
学生姓名 |
|
6 |
message_time |
date |
否 |
否 |
消息时间 |
|
|
7 |
message_content |
text |
65535 |
否 |
否 |
消息内容 |
|
8 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
9 |
update_time |
timestamp |
是 |
否 |
更新时间 |
|
|
10 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
11 |
source_id |
int |
否 |
否 |
来源ID |
|
|
12 |
source_user_id |
int |
否 |
否 |
来源用户 |
表 4-23-teacher_user(教师用户)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
teacher_user_id |
int |
是 |
是 |
教师用户ID |
|
|
2 |
teachers_name |
varchar |
64 |
否 |
否 |
教师姓名 |
|
3 |
gender_of_teachers |
varchar |
64 |
否 |
否 |
教师性别 |
|
4 |
contact_information |
varchar |
16 |
否 |
否 |
联系方式 |
|
5 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
|
6 |
user_id |
int |
是 |
否 |
用户ID |
|
|
7 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
8 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-24-team_information(团队信息)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
team_information_id |
int |
是 |
是 |
团队信息ID |
|
|
2 |
student_users |
int |
否 |
否 |
学生用户 |
|
|
3 |
student_name |
varchar |
64 |
否 |
否 |
学生姓名 |
|
4 |
teacher_user |
int |
否 |
否 |
教师用户 |
|
|
5 |
teachers_name |
varchar |
64 |
否 |
否 |
教师姓名 |
|
6 |
team_name |
varchar |
64 |
否 |
否 |
团队名称 |
|
7 |
team_tasks |
varchar |
64 |
否 |
否 |
团队任务 |
|
8 |
task_status |
varchar |
64 |
否 |
否 |
任务状态 |
|
9 |
team_members |
text |
65535 |
否 |
否 |
团队成员 |
|
10 |
teacher_message_limit_times |
int |
是 |
否 |
消息限制次数 |
|
|
11 |
question_feedback_limit_times |
int |
是 |
否 |
反馈限制次数 |
|
|
12 |
financial_reimbursement_limit_times |
int |
是 |
否 |
报销限制次数 |
|
|
13 |
create_time |
datetime |
是 |
否 |
创建时间 |
|
|
14 |
update_time |
timestamp |
是 |
否 |
更新时间 |
表 4-25-upload(文件上传)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
upload_id |
int |
是 |
是 |
上传ID |
|
|
2 |
name |
varchar |
64 |
否 |
否 |
文件名 |
|
3 |
path |
varchar |
255 |
否 |
否 |
访问路径 |
|
4 |
file |
varchar |
255 |
否 |
否 |
文件路径 |
|
5 |
display |
varchar |
255 |
否 |
否 |
显示顺序 |
|
6 |
father_id |
int |
否 |
否 |
父级ID |
|
|
7 |
dir |
varchar |
255 |
否 |
否 |
文件夹 |
|
8 |
type |
varchar |
32 |
否 |
否 |
文件类型 |
表 4-26-user(用户账户)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
user_id |
int |
是 |
是 |
用户ID |
|
|
2 |
state |
smallint |
是 |
否 |
账户状态:(1可用|2异常|3已冻结|4已注销) |
|
|
3 |
user_group |
varchar |
32 |
否 |
否 |
所在用户组 |
|
4 |
login_time |
timestamp |
是 |
否 |
上次登录时间 |
|
|
5 |
phone |
varchar |
11 |
否 |
否 |
手机号码 |
|
6 |
phone_state |
smallint |
是 |
否 |
手机认证:(0未认证|1审核中|2已认证) |
|
|
7 |
username |
varchar |
16 |
是 |
否 |
用户名 |
|
8 |
nickname |
varchar |
16 |
否 |
否 |
昵称 |
|
9 |
password |
varchar |
64 |
是 |
否 |
密码 |
|
10 |
|
varchar |
64 |
否 |
否 |
邮箱 |
|
11 |
email_state |
smallint |
是 |
否 |
邮箱认证:(0未认证|1审核中|2已认证) |
|
|
12 |
avatar |
varchar |
255 |
否 |
否 |
头像地址 |
|
13 |
open_id |
varchar |
255 |
否 |
否 |
针对获取用户信息字段 |
|
14 |
create_time |
timestamp |
是 |
否 |
创建时间 |
表 4-27-user_group(用户组)
|
编号 |
字段名 |
类型 |
长度 |
是否非空 |
是否主键 |
注释 |
|
1 |
group_id |
mediumint |
是 |
是 |
用户组ID |
|
|
2 |
display |
smallint |
是 |
否 |
显示顺序 |
|
|
3 |
name |
varchar |
16 |
是 |
否 |
名称 |
|
4 |
description |
varchar |
255 |
否 |
否 |
描述 |
|
5 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
|
6 |
source_field |
varchar |
255 |
否 |
否 |
来源字段 |
|
7 |
source_id |
int |
是 |
否 |
来源ID |
|
|
8 |
register |
smallint |
否 |
否 |
注册位置 |
|
|
9 |
create_time |
timestamp |
是 |
否 |
创建时间 |
|
|
10 |
update_time |
timestamp |
是 |
否 |
更新时间 |
第五章 系统详细设计与实现
5.1前端首页模块
首页是学生用户访问平台后看到的第一个页面,它展示了通知公告、校园资讯和竞赛信息三个模块的入口。通知公告部分列出了最新的网站公告和重要信息,校园资讯部分提供了校园新闻和活动信息,竞赛信息部分则展示了当前可参与的竞赛详情。模块展示如下图所示。

图5-1前台首页模块图
5.2用户注册模块
不是大学生学科竞赛项目管理系统中正式用户的是可以在线进行注册的,当填写上自己的账号+设置密码+确认密码+昵称+邮箱+身份+用户姓名+用户年龄+用户性别等信息后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可用户注册成功。其用户注册模块展示如下图所示。

图5-2注册模块图
5.3登录模块
大学生学科竞赛项目管理系统中的前台上注册后的用户是可以通过自己的用户名+密码进行登录的,当用户输入完整的自己的用户名+密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的用户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到大学生学科竞赛项目管理系统的首页中,否则将会提示相应错误信息,登录模块如下图所示。

图5-3登录模块图
5.4前端学生用户功能模块
5.4.1通知公告模块
通知公告模块允许学生查看最新的网站公告,了解平台的更新和重要信息。学生可以查看关于我们页面了解平台背景,通过联系方式获取帮助,以及通过网站介绍了解平台的功能和目的。如下图所示:

图5-4通知公告模块图
5.4.2校园资讯模块
校园资讯模块提供了校园内的最新新闻和活动信息。学生可以对感兴趣的资讯进行点赞、收藏和评论,与他人分享自己的看法和意见。如下图所示。

图5-5校园资讯详情模块图
5.4.3竞赛信息模块
竞赛信息模块列出了当前可参与的各类竞赛,学生可以对感兴趣的竞赛进行点赞和收藏。学生还可以上传自己的作品参与竞赛,并对其他人的作品进行评论。如下图所示。

图5-6竞赛信息模块图

图5-7竞赛信息详情模块图
5.4.4个人中心模块
个人中心是学生用户管理个人信息和活动的区域。学生可以查看个人首页,提交自己的作品,查看作品评分,添加团队信息,查看教师信息,进行问题反馈,处理财务报销事宜,管理自己的收藏和评论。如下图所示。

图5-8个人中心模块图
5.5后端教师用户功能模块
5.5.1团队信息管理模块
教师可以在此页面查询所有参与竞赛的团队信息,并且可以查看团队的详细信息。此外,教师还可以向团队发送消息,进行沟通和指导。如下所示。

图5-9团队信息管理模块图
5.5.2问题反馈管理模块
在问题反馈管理页面,教师可以查看学生提交的问题反馈,并进行查询和审核。对于每个问题,教师可以查看详细内容,并给出回复,帮助学生解决问题。如下所示。

图5-10问题反馈管理模块图
5.6后端评委用户功能模块
5.6.1作品提交管理模块
此模块允许评委查询所有提交的作品,并且可以点击作品查看详细信息,包括作品名称、提交者信息、提交时间等。评委还可以在该模块中对作品进行评分,输入评分标准和评语,完成评分工作。如下所示。

图5-11作品提交管理模块图
5.6.2竞赛信息管理模块
评委用户可以在此模块中查询所有竞赛信息,并且可以点击具体竞赛查看详细信息,包括竞赛规则、参赛作品列表等,以便于评委对竞赛有全面的了解。如下所示。

图5-12竞赛信息管理详情模块图
5.7后端财务用户功能模块
5.7.1财务报销管理模块
在财务报销管理模块中,用户可以执行多个操作。用户可以进行查询操作,通过输入不同的条件来筛选出需要查看的报销记录。对于每一条报销记录,用户可以点击详情查看具体的报销信息,如报销金额、报销项目、提交时间等。审核功能允许用户对报销申请进行审核,根据报销的合理性和合规性来决定是否通过。通过审核的报销记录,财务用户可以执行支付操作,完成财务报销流程。如下所示。

图5-13财务报销管理模块图
5.8后端管理员功能模块
5.8.1后台首页模块
在后台首页,管理员可以看到作品评分的统计信息,方便了解整体评分情况。点击个人头像,管理员可以进入个人信息页面,在这里可以查看和修改自己的姓名、联系方式等信息。此外,管理员还可以在个人信息页面修改登录密码,以确保账户安全。如下所示。

图5-14后台首页模块图
5.8.2系统用户模块
系统中包含多种用户角色,包括管理员、学生用户、教师用户、评委用户和财务用户。管理员可以对这些用户进行添加、删除和查询操作,并查看每个用户的详细信息。用户管理流程图如下所示。

图5-15用户管理流程图
系统用户模块如下图所示。

图5-16系统用户模块图
5.8.3竞赛分类管理模块
管理员可以对竞赛分类进行管理,包括添加新的分类、删除不再需要的分类以及查询现有分类的详细信息。每个分类的详情页面将展示该分类下的所有竞赛信息。如下图所示。

图5-17竞赛分类管理模块图
5.8.4竞赛信息管理模块
在竞赛信息管理模块,管理员可以添加新的竞赛信息,删除不再举办的竞赛,以及查询和查看现有竞赛的详细信息。管理员还可以查看用户对竞赛的评论,了解用户反馈。如下图所示。

图5-18竞赛信息管理添加模块图
5.8.5系统管理模块
管理员可以对系统中的轮播图进行管理,包括添加新的轮播图、删除不再使用的轮播图以及查询轮播图的详细信息。管理员还可以查看轮播图的展示效果,确保轮播图内容的准确性和吸引力。模块如下图所示。

图5-19轮播图管理模块图
5.8.6资源管理模块
管理员可以管理校园资讯,包括添加新的资讯、删除不再需要的资讯以及查询资讯记录。管理员还可以对资讯进行分类管理,包括添加新的分类、删除不再需要的分类以及查询分类详情。管理员还可以查看资讯的评论,了解用户对资讯的反馈和意见。模块如下图所示。

图5-20校园资讯管理模块图
第六章 系统测试
6.1系统测试的目的
测试的主要目的是确保系统的功能和性能满足预期的需求,同时识别和修复潜在的缺陷。通过系统测试,可以验证各个功能模块的正确性和稳定性,确保系统在不同使用场景下的表现符合设计要求。测试目的包括确认系统功能的完整性、验证数据处理的准确性、评估系统的性能和安全性。测试还可以提高用户满意度,保证用户在使用系统时获得流畅和可靠的体验。通过全面的测试,可以降低后期维护成本,减少系统上线后出现故障的风险,从而保障系统的长期稳定运行。
6.2测试方法
在本系统中,测试方法主要依赖于测试用例的设计与执行。测试用例是根据系统需求文档编写的,覆盖所有功能模块及其边界情况。每个测试用例包含输入数据、预期结果和实际结果的对比,以验证系统的功能是否按预期工作。
常见的测试用例包括功能测试用例、边界测试用例和异常测试用例。功能测试用例针对系统的各项功能进行验证;边界测试用例则侧重于输入数据的边界条件,验证系统在极端情况下是否能够稳定运行;异常测试用例则用于验证系统在处理错误输入或异常情况时的反应。本文选择功能测试用例进行系统测试。
在测试执行过程中,记录每个用例的执行结果,并根据实际结果与预期结果的对比,判断系统是否存在缺陷。通过系统化的测试用例执行,可以有效提高测试的覆盖率和效率,为系统的最终上线提供保障。
6.3测试用例
6.3.1用户登录功能测试
表6-1 用户登录功能测试表
|
用例名称 |
用户登录系统 |
|
目的 |
测试用户通过正确的用户名和密码可否登录功能 |
|
前提 |
未登录的情况下 |
|
测试流程 |
1) 进入登录页面 2) 输入正确的用户名和密码 |
|
预期结果 |
用户名和密码正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入 |
|
实际结果 |
实际结果与预期结果一致 |
6.3.2创建数据测试
在系统中,创建功能也是基础功能之一,因此创建功能的测试很有代表性。在此章节主要列举在创建时各种情况下系统结果的测试。由于系统涉及创建功能操作过多,因此将多处统称创建功能。
创建数据用例如表6-2 所示。
表6-2 创建数据测试用例
|
测试用例编号 |
YL_05 |
|
|
测试用例名称 |
系统使用者进行创建数据 |
|
|
测试用例描述 |
使用者输入要创建的数据 |
|
|
系统入口 |
浏览器 |
|
|
步骤 |
预期结果 |
实际结果 |
|
输入完整并且格式正确的数据 |
提示“创建成功”,并显示所有数据 |
预期结果 |
|
核心位置数据但非必要位置不输入数据 |
提示“创建成功”,并显示所有数据 |
预期结果 |
|
核心数据位置不输入数据 |
提示“创建失败” |
预期结果 |
6.3.3修改数据测试
在系统中,修改功能是系统主要实现功能,因此修改功能的测试很有代表性。在此章节主要列举在修改时各种情况下系统结果的测试。由于系统涉及修改功能操作过多,因此将多处数据表记录修改和状态修改统称修改功能。
修改数据用例如表6-3所示。
表6-3 修改数据测试用例
|
测试用例编号 |
YL_06 |
|
|
测试用例名称 |
系统使用者进行修改数据 |
|
|
测试用例描述 |
使用者对可修改的数据项进行修改 |
|
|
系统入口 |
浏览器 |
|
|
步骤 |
预期结果 |
实际结果 |
|
将现有数据修改成正确的数据 |
提示“修改成功”,并显示所有数据 |
预期结果 |
|
将现有数据修改成错误的数据 |
提示“修改失败” |
预期结果 |
6.3.4查询数据测试
在系统中,查询功能是使用系统使用最多也是最基础的功能,因此查询功能的测试很有代表性。在此章节主要列举在查询时各种情况下系统结果的测试。
查询数据用例如表6-4所示。
表6-4 查询数据测试用例
|
测试用例编号 |
YL_05 |
|
|
测试用例名称 |
系统使用者进行查询数据 |
|
|
测试用例描述 |
全部查询以及输入关键词查询 |
|
|
系统入口 |
浏览器 |
|
|
步骤 |
预期结果 |
实际结果 |
|
界面自动查询全部 |
显示对应所有记录 |
预期结果 |
|
输入已存在且能匹配成功的关键字 |
显示所查询到的数据 |
预期结果 |
|
输入不存在的关键字 |
显示数据界面为空 |
预期结果 |
6.4测试结果
在本次测试的过程主要针对所有功能下的添加操作,修改操作和删除操作,并以真实数据一一进行相关功能项目的输入,最终能够保证每个项目涉及的功能都能够正常运行,因此能够保证本次设计的,已实现的功能能够正常运行并且相关数据库的信息也同样保证正确。
本研究利用Vue.js和Node.js技术构建了一个大学生学科竞赛项目管理系统,实现了从信息发布、作品提交及评分审核的全流程在线管理。通过模块化设计,系统支持学生、教师、评委及财务人员等不同角色高效协作,提升了竞赛管理的透明度与效率。开发过程中,深入了解了现代Web应用的前后端交互模式,积累了丰富的跨平台开发经验,并提高了对复杂系统架构的理解与实践能力。
对于未来的发展,系统具备良好的扩展性,可以进一步集成更多功能以适应不断变化的需求。例如,增加数据分析功能,为决策提供数据支持;优化用户界面,提升用户体验;加强安全措施,保护用户数据隐私。随着技术的进步,持续更新系统,确保其始终保持在行业前沿水平,更好地服务于教育领域,促进学科竞赛活动更加健康有序地发展。
- 凌杰. Node.js后端全程实战[M]. 人民邮电出版社: 202305. 371.
- 黎青霞. Node. js在Web开发中的应用研究 [J]. 信息记录材料, 2024, 25 (10): 91-93+96.
- 陈芳. 基于MySQL数据库的数据录入系统设计研究 [J]. 科技资讯, 2024, 22 (20): 35-37.
- 刘瑶. 安全代理视域下MySQL数据库防护技术 [J]. 中国高新科技, 2024, (18): 32-34.
- 庞敏. MySQL数据库的数据安全应用设计技术研究 [J]. 数字通信世界, 2024, (09): 25-27.
- 赵媛.基于Vue的Web系统前端性能优化分析[J].电脑编程技巧与维护,2024,(09):44-46.
- 秦冬.浅析Vue框架在前端开发中的应用[J].信息与电脑(理论版),2024,36(13):61-63.
- 赵率宏. 基于Node.js的ORM框架研究与实现[D]. 西南科技大学, 2023.
- 唐榜. 基于Node.js的Web服务端框架研究与实现[D]. 西南科技大学, 2021.
- 王仡捷. 基于Node.JS技术的高并发网络应用架构的设计与实现 [J]. 通化师范学院学报, 2020, 41 (04): 64-67.
- Daniel B . Modern Full-Stack React Projects:Build, maintain, and deploy modern web apps using MongoDB, Express, React, and Node.js[M]. Packt Publishing Limited: 2024-06-07.
- Jamie C . Learn SQL using MySQL in One Day and Learn It Well:SQL for beginners with Hands-on Project[M]. Packt Publishing Limited: 2024-04-26.
- Unraveling the Mysteries: Celadonsoft Sheds Light on JavaScript vs. Node.js Distinctions [J]. M2 Presswire, 2024,
- 王兆坤,王明雨,石建强,等.产业学院背景下涉海类专业学科竞赛管理模式探索[J].珠江水运,2025,(04):103-105.DOI:10.14125/j.cnki.zjsy.2025.04.012.
- 杨斌,陈辉,李琳,等.基于自定义工作流与用户行为分析的学科竞赛管理平台研究[J].电脑编程技巧与维护,2025,(01):39-42.DOI:10.16184/j.cnki.comprg.2025.01.007.
- 白日荣,张首芳.大学生学科竞赛组织管理创新模式探讨——以全国大学生市场调查与分析大赛为例[J].湖北开放职业学院学报,2024,37(22):1-3+7.
- 张光进,田家华,毛建良.论高校学科竞赛的组织管理——以D大学为例[J].创新创业理论研究与实践,2021,4(09):159-161.
- 李嘉龙,于莉.民办高校学科竞赛管理体系的创新与实践——以广东海洋大学寸金学院为例[J].创新创业理论研究与实践,2020,3(13):171-173.
- 赵琳,吴小红,钟方翼.基于众包模式构建地方高校学科竞赛管理体系——以丽水学院为例[J].丽水学院学报,2020,42(03):98-103.
- 俞欣妍,奚曦.基于.NET平台的大学生学科竞赛项目管理系统的研究与初步实现[J].科技展望,2016,26(35):5+24.
大学生学科竞赛项目管理系统设计与实现工作已结束,虽然过程中充满挑战,但内心充满自豪和满足。感谢大学四年间教导我的所有老师,他们的专业知识与人生智慧让我成长为能独立完成系统的学生。特别感谢指导老师,他耐心解答疑惑,引导我解决问题,提升自主解决能力。室友和同学们的宝贵建议和支持也让我取得长足进步。未来,我将继续努力追求卓越,不辜负所学所悟和老师期望。坚信坚定信念和不懈努力,未来定能取得更辉煌成就。期待更美好未来!
大学生学科竞赛项目管理系统设计与实现不仅是技术挑战,挫折和困难是成长的垫脚石,让我更深入理解问题,精确找到解决方案。每次解决问题,都感到满足和自豪。
对于未来,我充满期待和信心。无论道路多崎岖,只要保持坚定信念,持续努力,定能取得更大成就。期待将知识和技能运用到实际中,为社会做出更大贡献。
最后,感谢所有帮助和支持我的人。你们的教诲、鼓励和支持让我有今天的成就。我会继续努力,不辜负期望,为实现更美好的未来而奋斗。
代码
连接数据库的文件在server 文件夹下的config.js文件,代码如下:
module.exports = {
db: "mysql",
web: {
port: 5000,
host: "0.0.0.0"
},
mysql: {
host: "127.0.0.1",
user: "root",
password: "root",
database: "projectxxxxx",
log: false,
timezone:"08:00"
}
}
项目启动文件index.js,代码如下:
const express = require("express");
const bodyParser = require("body-parser");
const session = require('express-session');
const cors = require("cors");
const path = require('path');
const fileUpload = require('express-fileupload');
const core = require("./core");
$.services = require("./services");
const router = require("./router");
var {
port,
host
} = $.config.web;
const app = express()
app.use(fileUpload({
createParentPath: true,
useTempFiles:true
}));
app.use(session({
secret: 'express:sess',
resave: false,
rolling:false,
saveUninitialized: true,
cookie: { secure: true,maxAge:1800000,httpOnly:true }
}))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(express.static(path.join(__dirname, 'static')))
app.engine('html', require('express-art-template'))
app.set('views', path.join(__dirname, 'templates'))
app.use(cors())
app.use(async (req,res, next) => {
var user = req.session.user;
if (!user) {
var headers = req.headers;
if (headers["x-auth-token"]) {
var token = headers["x-auth-token"];
var access_token = await $.services["access_token"].get_obj({
token
});
if (access_token) {
var end_time = Date.parse(access_token.create_time) + access_token.maxage * 3600 * 1000;
var date = Date.parse(new Date());
if (end_time >= date) {
req.session.user = JSON.parse(access_token.info);
} else {
$.services["access_token"].del({
token
});
}
}
}
}
await next();
});
app.use(router)
app.listen(port, host, () =>
console.log(`http://${host}:${port}`)
)
登陆拦截管理器,在router文件夹下的router.js文件,代码如下:
function loadRoute(controller, route_path) {
var {
get,
post,
get_api,
post_api
} = controller.config;
if (controller["index"]) {
router.get(route_path, route(controller, "index"));
// router.get(route_path + "/", route(controller, "index"));
router.post(route_path, route(controller, "index"));
// router.post(route_path + "/", route(controller, "index"));
}
if (controller["api"]) {
if(alias.includes(route_path)){
router.get("/api/user" + route_path, route(controller, "api"));
// router.get("/api/user" + route_path + "/", route(controller, "api"));
router.post("/api/user" + route_path, route(controller, "api"));
// router.post("/api/user" + route_path + "/", route(controller, "api"));
}else{
router.get("/api" + route_path, route(controller, "api"));
// router.get("/api" + route_path + "/", route(controller, "api"));
router.post("/api" + route_path, route(controller, "api"));
// router.post("/api" + route_path + "/", route(controller, "api"));
}
}
for (var i = 0; i < get.length; i++) {
var action = get[i];
router.get(route_path + "/" + action, route(controller, action));
}
for (var i = 0; i < post.length; i++) {
var action = post[i];
router.post(route_path + "/" + action, route(controller, action));
}
for (var i = 0; i < get_api.length; i++) {
var action = get_api[i];
router.get("/api" + route_path + "/" + action, route(controller, action));
}
for (var i = 0; i < post_api.length; i++) {
var action = post_api[i];
router.post("/api" + route_path + "/" + action, route(controller, action));
}
}
登陆接受管理器,在serverr文件夹下的index.js文件,控制请求头代码如下:
app.use(async (req,res, next) => {
var user = req.session.user;
if (!user) {
var headers = req.headers;
if (headers["x-auth-token"]) {
var token = headers["x-auth-token"];
var access_token = await $.services["access_token"].get_obj({
token
});
if (access_token) {
var end_time = Date.parse(access_token.create_time) + access_token.maxage * 3600 * 1000;
var date = Date.parse(new Date());
if (end_time >= date) {
req.session.user = JSON.parse(access_token.info);
} else {
$.services["access_token"].del({
token
});
}
}
}
}
await next();
});
增:
Service.prototype.add = async function(body, config, config) {
var sql = $.mysql.toAddSql(body, Object.assign({}, this.config, config || {}));
var ret = await this.run(sql);
return ret;
};
删:
Service.prototype.del = async function(query, config) {
var sql = $.mysql.toDelSql(query, Object.assign({}, this.config, config || {}));
var ret = await this.run(sql);
return ret;
};
改:
Service.prototype.set = async function(query, body, config) {
var sql = $.mysql.toSetSql(query, body, Object.assign({}, this.config, config || {}));
var ret = await this.run(sql);
return ret;
};
查一条数据:
Service.prototype.get_list = async function(query, config) {
var sql = $.mysql.toGetSql(query, Object.assign({}, this.config, config || {}));
return await this.run(sql);
};
查多条数据:
Service.prototype.get_obj = async function(query, config) {
var sql = $.mysql.toGetSql(query, Object.assign({}, this.config, config || {}));
var arr = await this.run(sql);
if (arr.length > 0) {
return arr[0];
}
return null;
};
分组计数:
Service.prototype.count_group = async function(query, config) {
var sql = $.mysql.toCountSql(query, Object.assign({}, this.config, config || {}));
return await this.run(sql);
};
分组求和:
Service.prototype.sum_group = async function(query, config) {
var sql = $.mysql.toSumSql(query, Object.assign({}, this.config, config || {}));
return await this.run(sql);
};
项目采用三层架构controller(每一个实体对应一个controller),services(项目表实体),core,Controller 均继承自auth.js,注入两个对象,一个是实体类(以Auth为例),另一个是其services文件下的auth.js:
var Service = require('../core/service.js');
class Auth extends Service {
constructor(config) {
super(Object.assign({
table: "auth",
size: 10
}, config));
}
}
module.exports = {
Auth
};
通过请求的参数获取列表数据,代码如下:
Controller.prototype.list = async function(req,res) {
var query = req.query;
var {
field,
page,
size,
sqlwhere
} = query;
delete query.field;
delete query.page;
delete query.size;
delete query.sqlwhere;
var list = await this.service.get_list(
query,
Object.assign({}, this.config, {
field,
page,
size,
sqlwhere
})
);
var model = await this.model(req, {
list,
});
return await res.render(this.config.tpl + "list.html", model);
};
获取某个组下面的数量,代码如下:
Controller.prototype.list_group = async function(req) {
var query = req.query;
var {
groupby,
sqlwhere
} = query;
if (!groupby) {
return {
error: 30000,
message: "groupby的值不能为空!",
};
}
delete query.groupby;
delete query.sqlwhere;
var result = await this.service.count_group(
query,
Object.assign({
groupby,
sqlwhere
},
this.config
)
);
if (this.service.error) {
return {
error: this.service.error,
};
}
for(var i = 0;i < result.length;i ++){
result[i][1] = result[i][groupby];
result[i][0] = result[i]["count"];
}
return {
result: {list: result},
};
};
获取某个组下面的总计值,代码如下:
Controller.prototype.count = async function(req) {
var result = await this.service.count(req.query, this.config);
if (this.service.error) {
return {
error: this.service.error,
};
}
return {
result,
};
};
图片或文件等的上传方法代码如下:
Controller.prototype.upload = async function(req) {
var query = req.query;
var url = "";
if (req.files && req.files.file) {
var f = req.files.file;
const render = fs.createReadStream(f.tempFilePath);
var name = f.name;
var dir = f.dir || "";
var file = _dir + dir + name;
try {
if (fs.existsSync(file)) {
var arr = name.split(".");
name = arr[0];
var extension = arr[arr.length - 1];
var num = 10000;
for (var i = 0; i < num; i++) {
var na = name + "_" + (i + 1) + "." + extension;
file = path.join(_dir, na);
if (!fs.existsSync(file)) {
name = na;
break;
}
}
}
const upStream = fs.createWriteStream(file);
render.pipe(upStream);
url = _path + name;
} catch (e) {
console.log("上传失败:", e);
}
return {
result: {
url
}
};
} else {
return {
code: 10000,
message: "上传的文件(file)不能为空!",
};
}
};
注册页UserController.java,传入user对象,并将"user_id"、 "state"、 "user_group"、"login_time"、"phone"、"phone_state"、 "username"、"nickname"、"password"、"email"、"email_state"、"avatar"、"create_time"输入,重点是 "username"、"nickname"、"password"必须输入,通过获取username,数据库查询是否有该用户,如果存在,则提示“用户已存在”,否则执行将UserId置为空(数据库表中该字段已设置自动递增),代码如下:
Register.prototype.index = async function(req,res) {
var group_list = await $.services["user_group"].get_list({}, Object.assign({}, this.config));
return await res.render(this.config.tpl + "index.html", {
group_list
});
};
Register.prototype.api = async function(req) {
var user = $.services.user;
var body = req.body;
var username = body.username;
var obj = await user.get_obj({
username
});
if (obj) {
return {
error: {
code: 70000,
message: "账户名已存在",
},
};
} else {
var password = md5(body.password);
var nickname = body.nickname;
var user_group = body.user_group;
var email = body.email;
var email_state= body.hasOwnProperty('email_state') ? body.email_state : 0;
var phone = body.phone;
var phone_state= body.hasOwnProperty('phone_state') ? body.phone_state : 0;
var bl_reg = await user.add({
username,
password,
nickname,
user_group,
email,
email_state,
phone,
phone_state
});
if (bl_reg) {
return {
result: "注册成功"
};
} else {
return {
error: {
code: 70000,
message: "注册失败",
},
};
}
}
};
注册页password则使用了MD5加密,代码如下:
先引入const md5 = require("md5");
在接口通过将md5函数包裹住前端请求发过来的密码进行加密代码如下:
var password = md5(body.password);
登录页,首先传入"username"、"email"、"phone"、"password",用户可通过用户名、邮箱、手机号进行登陆,通过判断$mysql返回来确定查询结果,然后执行查询用户组UserGroup,用户组里面不存在,依然报“用户不存在”,执行完以上代码,最后涉及到用户带有“审核”的,会查询examine_state(用户的审核状态),数据库表user_group中含有source_table和source_field进行查询,以上步骤完成,对输入的密码进行存储Token到数据库,匹对账号和密码,数据库中的AccessToken为令牌,用于身份认证,其代码如下:
Login.prototype.api = async function(req) {
var body = req.body;
var obj = await $.services["user"].get_obj({
username: body.username
},{like:false});
if (obj) {
var group = await $.services["user_group"].get_obj({
name:obj.user_group
})
if (group){
if (group.name!=="管理员"){
var sql = "select examine_state from "+ group.source_table +" WHERE user_id = " + obj.user_id;
var userExamine = await $.mysql.run(sql);
if (userExamine && userExamine.length > 0 && userExamine[0].examine_state!=="已通过"){
return {
error: {
code: 70000,
message: "该用户审核未通过"
},
};
}
}
if (obj.state!==1){
return {
error: {
code: 70000,
message: "用户非可用状态,不能登录"
},
};
}
var password = md5(body.password);
if (password === obj.password) {
req.session.user = obj;
var date = Date.parse(new Date());
var token = md5(obj.user_id + "_" + date);
await $.services["access_token"].add({
token,
info: JSON.stringify(obj),
user_id:obj.user_id
});
obj.token = token;
return {
result: {obj}
};
} else {
return {
error: {
code: 70000,
message: "密码错误"
},
};
}
}else {
return {
error: {
code: 70000,
message: "用户组不存在"
},
};
}
} else {
return {
error: {
code: 70000,
message: "账户不存在"
}
};
}
};
找回密码,接收用户输入的用户名、密码、验证码,并进行条件判断,代码如下:
Forget_password.prototype.api = async function(req) {
var user = $.services.user;
var body = req.body;
var username = body.username;
var email = body.email ? body.email : "";
var obj = await user.get_obj({
username,
});
if (obj) {
var password = md5(body.password);
var bl_for = await user.set({
username
}, {
password
});
if (bl_for) {
return {
result: "修改成功"
};
} else {
return {
error: {
code: 70000,
message: "修改失败",
},
};
}
} else {
return {
error: {
code: 70000,
message: "账户不存在或邮箱错误",
}
};
}
};
修改密码,通过请求data,获取旧密码,并将新密码重新赋值,期间都是需要通过加密,代码如下:
Change_password.prototype.api = async function(req) {
var user = $.services.user;
var body = req.body;
var token = req.headers["x-auth-token"];
var access_token = await $.services["access_token"].get_obj({
token
});
var info = JSON.parse(access_token.info);
var username = info.username;
var o_password = md5(body.o_password);
var change_password = md5(body.password);
var obj = await user.get_obj({
username
});
if (obj) {
if (o_password == obj.password) {
var bl_for = await user.set({
username
}, {
password: change_password
});
if (bl_for) {
return {
result: "修改成功"
};
} else {
return {
error: {
code: 70000,
message: "修改失败",
},
};
}
} else {
return {
error: {
code: 70000,
message: "密码错误",
},
};
}
} else {
return {
error: {
code: 70000,
message: "账户不存在",
},
};
}
};
请关注点赞+私信博主,免费领取项目源码
更多推荐
所有评论(0)