Advertisement

球队训练信息管理系统

阅读量:

@TOC

springboot212球队训练信息管理系统

第1章 绪论

1.1选题动因

目前网络技术和软件技术均具备成熟的理论支撑,在市场中不断涌现各种技术驱动的应用程序。这些应用广泛应用于生活与工作等多个领域,并非单一领域的局限性。随着个人电脑与笔记本电脑的普及推广及各类型计算机硬件的不断升级优化,在性能上都有所提升的同时也能支持更多种类的应用程序运行需求。因此,在现代计算机设备上安装高效的处理程序以提升信息管理能力成为人们普遍的选择。对于球队训练信息管理系统的信息来讲,在传统的人工处理模式下当面对海量数据时耗时较长容易出现错误率较高且难以及时修正错误数据最后检索数据耗时耗力且效率低下鉴于此问题亟待解决有必要构建相应的管理系统来规范流程使管理工作更加系统化与程序化同时也能提高整体工作效率并确保系统的稳定运行

1.2目的和意义

球队训练信息管理系统能够对相关的信息实施集中管理和调控,并且能够完全消除传统管理模式的不足之处。该系统基于软件开发技术设计而成的应用系统,在数据处理效率方面具有显著提升的效果。无论是进行数据添加操作、数据维护工作还是开展统计分析以及查询操作等任务要求,该系统都能提供高效的解决方案。因此,在优化流程后使信息管理更加高效和规范地运用该系统将是最优选择。通过这种方式不仅实现了工作效率的最大化提升,在实际运行中也能够确保系统的稳定性和可靠性,并且能有效保障处理质量始终维持在较高水平状态。尽管该系统已经具备较为全面的功能模块设置但其运行效能仍需依靠管理人员不断提升自身专业水平与操作能力才能充分发挥其优势并使其在实际应用中展现出更高的效能表现

1.3论文结构安排

本文系统性地划分为六个章节;每一个章节都对本系统进行了独特的描述。随后将重点阐述本文的研究内容。

第1章:本章主要探讨论文的研究背景与研究意义,并基于此展开对所要开发系统的理论分析与技术方案设计

在本章中,我们将详细说明系统的各项技术基础。从涉及本系统开发所需的技术知识角度出发进行阐述。

本章专门探讨系统分析这一核心内容。主要围绕系统的适用性、功能与性能指标等维度展开论述

第4章:本章主要涉及系统设计相关内容。就系统功能结构而言以及数据库设计方面进行详细阐述。

第5章:该章节专门讨论系统的实现过程。从各系统功能模块运行效果的角度进行详细分析。

第6章:本章主要涉及系统的测试内容。基于系统的功能特性以及系统的测试方法等角度对系统的运行情况进行详细阐述。

第2章 开发环境与技术

建立该系统的训练信息管理平台需要配置编程环境;同时需通过调研评估各项相关技术;最后选择适用于本系统的技术和工具

2.1 MYSQL数据库

确定了是应用程序之后,则会系统地进行设计与分析工作。本课题涉及需采用数据库作为数据管理工具及承载平台,并将从程序功能分析阶段延伸至数据分析环节,在选择关系型数据库时成为关键考量因素。具体可选方案仅有五个:甲骨文公司提供两个版本、微软公司提供两个版本以及IBM公司提供一个版本。这些数据库均能满足所需的应用程序功能需求,在综合考虑各参数后发现它们在性能上并无显著差异。因此,在开发使用的老旧笔记本电脑情况下(最初购买时预算有限),必须权衡多方面的因素:一方面该电脑已使用多年性能已有所下降且耗电量较大;另一方面个人面临毕业临近毕业之际转学的想法也不太现实;再者则需考虑学习资料更新换代较快的特点等多重限制因素下作出最终决定

2.2 Tomcat 介绍

在最初学习Java语言的过程中,我发现还存在许多未知的概念与工具。在控制台中显示各种语法和运行结果的过程中显得尤为重要。基于其工作原理,Tomcat通常被用作中小型企业的轻量级Web服务器。严格来说,并非传统的服务器系统,而是类似于Vue引擎或容器的应用,在学术或原理层面有着精准的描述。然而,在实际应用中它确实扮演着Web服务器的角色,并承担着网站发布与运行的基本功能。基于其工作原理的特点,在大多数场景下它是适合中小规模开发需求的选择之一;例如某些行业应用由于客户端数量有限、连接需求不高而普遍采用该解决方案。配置方面较为灵活,在大多数开发环境中可以通过简单的配置管理多个网站;这些配置信息通常以“.config”扩展名存储,并具有明显的层次结构特点以便查阅维护等操作支持良好的可管理性特点。每当新版本的Java SDK发布时 Tomcat也会相应地进行升级以匹配新的软件环境目前该系列软件已推出至版本10号段 fallah

2.3 vue技术

vue技术能够帮助初学者快速掌握编写动态网站的能力,并非要求具备高级Java编程技能就可以书写代码。从学习效率和开发效率上都能带来显著提升。通过将网页开发者的职责与后台逻辑开发者的职责分离进行协作开发成为可能,并降低了学习成本,在无需考虑程序运行解释编译阶段的情况下,默认情况下vue网页本身即可理解为一个普通的Servlet。从结构来看,主要包含两大核心功能:一个是专有的vue引擎部分(即实现将Vue进行编译后能够运行并解释的功能),另一个是用于处理客户端请求的Web服务器部分(即Web Server)。整个编译与运行过程需要依赖这两个组件相互配合及协作完成,并且它们各自承担着明确的角色以确保系统正常运作。其中包含了一个称为容器的概念(Container),而这个容器内部又包含了专门用于处理前端请求的引擎部分(Engine)。实际上,在Tomcat中不仅支持处理Web应用的整体请求(即模拟Web服务器的功能),还支持处理基于纯HTML语言构建的应用(即模拟Vue引擎的功能)。尽管Tomcat能够在网站部署完成后直接处理客户端请求并返回网页内容供客户访问(即默认情况下充当Web服务器的角色),但它本质上只是一个特殊的Web服务器,并不具备动态处理网页内容的能力。例如JRUN和Resin系列都是基于特定框架构建的专用Vue引擎,默认情况下它们都只负责处理基于Vue框架构建的应用场景;而像Spring Boot这样的框架则专注于提供静态资源管理功能,默认情况下不具备支持基于Vue构建的应用场景能力。而像Vue这样的专用引擎则不仅能够运行纯HTML编写的静态网页内容(就像普通Web服务器的作用一样),还能无缝集成基于Vue构建的动态网站应用(就像普通Web服务器的作用一样)。尽管从表面上看两者都能够运行静态或动态网页内容,在效率上也只能相差一个微小幅度;但 Vue 引擎在功能上的强大优势使得它在实现某些特定需求时展现出明显的技术优势。

2.4 SpringBoot框架

众所周知,Java因其复杂性和繁琐性而备受争议。在开发过程中(或许我们还在辛苦地搭建项目),或许Python程序员早已完成了相关功能。这背后有两个主要原因:繁琐的配置设置以及开发过程中的开销(因为要在思考Spring特性配置和解决业务问题之间进行思维切换)。其一则是混乱的依赖管理问题(项目的依赖管理确实让人头疼)。选择所需的库确实令人头疼(你不仅要知道用哪些库构建项目),同时还需清楚各个库之间的兼容性问题(以免选错版本导致后续出现不可预测的问题)。而这种依赖管理的过程并不是编写业务逻辑代码的工作内容(它是一种额外负担)。幸运的是(并且值得庆幸的是),Spring Boot彻底改变了这一状况!通过运行命令即可自动生成一个独立且高效的Spring应用环境(无需手动配置启动器类)。它还提供了现成的配置选项(启动器类将自动包含必要的默认设置),因此我们只需简单地开始构建即可。大多数基于Spring Boot的应用只需要少量额外的Spring配置即可运行良好。你可以使用Java语言编写应用程序,并通过指定路径运行启动器类文件(即可自动生成一个完整的工作环境)。

第3章 系统分析

用户的需求以及市场上存在的一些与本系统相似的其他系统可作为系统分析中的参考资料。基于这些信息和数据资源, 分析人员能够识别出本系统的各项功能及其性能特征等关键指标。

3.1可行性分析

尽管系统按照用户的指示进行制作,在决定制作之前有必要对其进行可行性评估

3.1.1操作可行性分析

为开发该系统的所需工具而存在多种选择余地;由于我对这些工具较为熟悉,并且具备使用这些工具的能力,在项目中将全面负责球队训练信息管理系统的开发工作。运动队的信息管理系统的功能主要集中在数据记录与分析方面,并且覆盖了基础的数据增删改查等核心功能模块;为了提高工作效率和准确性,在实际应用中我们设计了一个方便的操作界面,并非传统的编程后台而是采用模块化设计的方式;这样一来大多数非技术人员也可以通过简单的图形用户界面进行数据的操作和管理。整体而言该系统的操作流程较为简便

3.1.2经济可行性分析

在开发本系统时,并未对资金进行投入购买开发工具。由于所使用的开发工具均是提前从百度下载并安装于个人电脑上,在软件技术逐渐成熟的背景下,在线学习平台应用越来越广泛的情况下,在线教育系统的功能实现主要依赖于编程语言与技术框架的选择与优化;而在线教育系统的功能实现主要依赖于编程语言与技术框架的选择与优化;相对而言,在线教育系统的功能实现主要依赖于编程语言与技术框架的选择与优化;在线教育系统的功能实现主要基于现有编程知识库资源进行模块化设计;在线教育系统的功能实现主要基于现有编程知识库资源进行模块化设计;在线教育系统的功能实现主要基于现有编程知识库资源进行模块化设计;经过少量代码修改即可将上述代码应用至本系统中使用;经过少量代码修改即可将上述代码应用至本系统中使用;经过少量代码修改即可将上述代码应用至本系统中使用;这些无需任何资金投入的前提下,在线教育系统的架构设计选择B/S模式,则成本微乎其微。

3.1.3技术可行性分析

本系统所需的软件包括Eclipse、Tomcat和MySQL等工具。这些工具均已被接触并使用过。对于Java、B/S架构、Vue以及HTML等技术,在图书馆中提供了相关书籍供学习参考。同时,在课堂上参与的编程小项目也对其进行了深入讲解。此外,在课程设计作业中通过实践锻炼了自身的编程能力。因此,在技术层面上则完成了球队训练信息管理系统程序开发工作。

基于上述分析,在经济适用性方面经判定本系统是完全适用的;同样,在技术可行性方面也是具备优势的;操作上同样没有问题。从而能够推导出当前环境下该系统的建设与实现方案得以实施。

3.2系统流程分析

该系统在数据处理过程中,其运行流程也需要通过相应的工具实现展示

本系统中的数据录入界面配备了完整的验证机制,在每位操作者的输入中都设置了必要的验证规则。例如,在输入的数据中禁止出现非法字符,并且原本应为汉字的数据若使用字母表示则不符合规定;此外还对包括长度在内的各项内容进行严格规范。这些规定有助于确保输入的数据准确性,并且在开发阶段就已预先考虑了这些规范。为了方便用户的操作流程,《下图》详细展示了具体的操作步骤。如果系统已经将待处理的数据保存到数据库中,则说明操作者的输入内容及格式均符合相关要求

图3.1 添加信息流程图

通常情况下,在系统中处理大量数据时(尤其是当涉及复杂业务逻辑时),容易出现一些错误)。因此必须及时纠正这些错误(避免影响后续操作)。本系统的后期数据修改功能为用户提供了一个便捷的操作界面(如图所示)。但更新后的数据同样需要经过数据有效性检验(只有当修正后的数据满足要求时才能被成功存入数据库)。

图3.2 修改信息流程图

当系统前台面对海量数据时,在线用户若想迅速检索所需信息,则需启用查询功能。其工作流程图示如下:该模块要求用户在启动时先输入关键词。当系统后台将与输入关键词匹配的数据存储完成后,在线用户即可看到这些数据将立即呈现出来,并且整个操作时间极为短暂。

图3.3 查询信息流程图

3.3系统性能分析

本系统在满足性能需求方面的表现可以从以下五个维度展开探讨:实用性(即功能完整性)、适应能力(应对不同训练场景的能力)、操作便捷性(界面友好度)、安全性(数据保护措施)以及维护简便性(故障处理效率)。

性能需求一:系统的实用性方面的要求主要体现在系统功能的实用价值上。本系统旨在让管理人员能够集中统一管理相关信息,并通过提供快速便捷的信息录入、编辑等功能模块来提升信息处理效率的同时减少运营支出。在提高信息管理人员工作效率的同时也显著减少了工作负担并有效降低了整体管理成本

性能需求二:系统的适应性方面而言,本系统对于运行环境的要求较为宽松,适用于各个场景。其优势在于无需复杂的配置,在常见的设备如个人电脑或便携式设备如笔记本电脑上搭建所需环境均能顺利运行本系统。此外,该系统提供的核心功能主要包含添加和修改操作,这些基本功能无需复杂的设置或额外步骤就能完成相应的操作流程。

性能需求三:系统的简便性,在功能配置上与同类产品相似,在实际应用中同样支持基本的增删改操作;该系统的操作流程设计符合大多数用户的使用习惯,并且其逻辑结构能够有效提升工作效率

性能需求四:系统的安全等级。该系统需确保数据存储与管理的安全性达到规定标准;在开发阶段需通过权限管理机制将功能按角色划分给不同用户;初次登录系统时应开发安全验证模块引导不同角色的用户进入各自的操作界面;此外还需对用户的基数信息如登录账号及密码等实施加密存储;可采用当前广泛采用且成熟的MD5加密技术来实现这一目标

性能需求五:系统的可维护性方面的要求是,在后续运行过程中会随着用户操作的持续积累产生大量数据信息。为实现后续管理与更新的需求,在数据库中设置相应的导出功能。同时规定对一些非关键性的阶段记录执行一次性清除操作的方式和标准流程。这样做的目的是为了减轻处理压力的同时提升整体系统的运行效率。

第4章 系统设计

市场上设计较为优秀的系统都具备一个共有特点,即主题突出显示. 通过优化页面布局,使内容(包括文字语言、视频图片等元素)能够清晰传达系统的核心理念. 让来访用户无需投入大量时间和精力去寻找所需内容.

4.1界面设计原则

通常情况下,在使用系统时会遇到不同的需求和场景:一部分用户的主要需求是通过系统获取所需信息;另一些用户则主要依赖于系统提供的各项服务。为了提升用户的使用体验并提高系统的整体使用频率,在进行界面设计时,请依据以下原则进行操作。

第一点要求我们对用户进行深入剖析,并明确识别他们的行为模式和偏好方向。考虑到大多数用户的浏览习惯,在规划最优布局时建议采用Z型或F型展示架构以提高信息获取效率。

第二点:规划合理的导航系统架构,在每个页面中均需展示明显的导航条标识。同时还可以考虑将导航条设于页面底部以增强整体一致性。当用户访问具体页面时,请在适当位置设置提示信息以帮助用户识别当前所在位置并快速定位目标内容。应在特定位置设置返回链接选项以便用户可选择返回至上一个页面或直接跳转至首页以优化用户体验

第三点:本系统应遵循统一的设计标准,在色彩风格、布局设计等方面保持一致,并对同类操作及专业术语进行规范表述以确保整体表述的一致性和专业性

第四点:设计的布局需确保信息传达直观明确;同时建议不要在页面上堆砌过多信息,并采用模块化管理来优化视觉焦点区域。

刚接触设计领域的人缺乏丰富的设计经验,在应用前面介绍的界面设计原则时能够参考这些方法构建出较为优秀的界面系统,并且能够显著提升用户体验

4.2功能结构设计

为了实现系统的编码工作能够顺利开展, 项目团队决定特别对本系统的功能模块进行了细致划分, 这样的系统功能架构将在下图中展示

球队训练信息管理系统

球员信息管理

公告信息管理

球队信息管理

教练信息管理

球员信息修改

球员信息新增

教练信息添加

教练信息删除

教练信息修改

公告类型添加

公告类型修改

公告类型删除

公告信息添加

公告信息删改

公告信息删除

球队信息添加

球队信息修改

球队信息删除

球队类型管理

球队类型修改

球队类型删除

球队类型添加

公告类型管理

图4.1 系统功能结构图

4.3 数据库设计

在构建任何系统时都需要事先规划好数据库结构。该数据库是由一系列相关数据构成的整体,并且这些数据按照特定的方式进行了系统化的组织。当前 databases 的广泛应用得益于它们在存储效率上具有显著优势。尽管 databases 提供了高效的信息存储服务,并且可以与程序实现良好的独立性运作(尽管 databases 与程序之间的耦合度较低)。总的来说……其相关技术也越发成熟……

4.3.1 数据库概念设计

这部分内容必须借助数据库关系图表来完成,并且也需借助特定工具辅助绘图。例如Visio软件则可以直接生成该系统的E-R 图表(即 E-R 图)。在设计数据库时需遵循一定的流程:首先需明确系统中的各个具体 entity;然后深入分析各 entity 所具有的属性;接着还需确定 entity 之间的关联关系;最后再按照 E-R 模型的要求绘制 E-R 图表。无论采用亿图软件还是 Visio 软件,在绘制 E-R 模型时所使用的图形符号均保持一致:常用矩形表示各 entity、菱形表示其间的关联关系、椭圆则代表 entity 的属性或特征;最后只需将这些图形元素通过连线的方式连接起来即可形成完整的 E-R 图表框架;随后便可以直接开始绘制该系统的 E-R 图表了。

(1)下图是公告信息实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi告信息.jpg

图4.1 公告信息实体属性图

(2)下图是字典表实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi典表.jpg

图4.2 字典表实体属性图

(3)下图是教练实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi练.jpg

图4.3 教练实体属性图

(4)下图是训练进度实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi练进度.jpg

图4.4 训练进度实体属性图

(5)下图是训练计划实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi练计划.jpg

图4.5 训练计划实体属性图

(6)下图是球队信息实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi队信息.jpg

图4.6 球队信息实体属性图

(7)下图是比赛首发名单实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi赛首发名单.jpg

图4.7 比赛首发名单实体属性图

(8)下图是加入的球队实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi入的球队.jpg

图4.8 加入的球队实体属性图

(9)下图是球员实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi员.jpg

图4.9 球员实体属性图

(10)下图是用户表实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi户表.jpg

图4.10 用户表实体属性图

(11)下图是考勤信息实体和其具备的属性。

C:sersdministratoresktopmgiuduixunlianxinxi勤信息.jpg

图4.11 考勤信息实体属性图

4.3.2 数据库物理设计

从程序后台运行的角度出发, 本数据库也需要规划其数据存储架构. 数据存储架构的规划主要包括构建数据表以及设定字段属性等内容. 在E-R模型中, 每个实体对应一张表, 实体特征则转化为该表中的字段. 根据本程序的数据存储要求, 需要明确每个字段的数据类型以及取值范围等关键参数. 当完成一张数据表的设计后, 应及时将其保存到数据库中, 并为每张数据表设置合理的命名方式. 推荐采用英文名称而非中文名称, 这不仅有助于避免编码时出现乱码问题, 还能提高程序运行效率. 在设计过程中, 可以通过表格形式直观展示各项参数设置结果

表4.1字典表表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 dic_code String 字段
3 dic_name String 字段名
4 code_index Integer 编码
5 index_name String 编码名字
6 super_id Integer 父字段id
7 beizhu String 备注
8 create_time Date 创建时间

表4.2教练表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 jiaolian_name String 教练姓名
3 jiaolian_phone String 手机号
4 jiaolian_email String 电子邮箱
5 jiaolian_delete Integer 假删
6 create_time Date 创建时间

表4.3加入的球队表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 qiudui_id Integer 球队
3 yonghu_id Integer 球员
4 jiarudeqiudui_number BigDecimal 工资
5 insert_time Date 加入时间
6 create_time Date 创建时间

表4.4公告信息表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 news_name String 公告标题
3 news_types Integer 公告类型
4 news_photo String 公告图片
5 insert_time Date 添加时间
6 news_content String 公告详情
7 create_time Date 创建时间

表4.5球队信息表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 qiudui_name String 球队名称
3 qiudui_types Integer 球队类型
4 qiudui_address String 所属地点
5 jiaolian_id Integer 教练
6 qiudui_content String 球队简介
7 create_time Date 创建时间

表4.6比赛首发名单表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 qiudui_id Integer 球队
3 shoufamingdan_file String 名单下载
4 create_time Date 创建时间

表4.7训练计划表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 qiudui_id Integer 球队
3 xunlianjihua_name String 标题
4 xunlianjihua_tianshu String 训练天数
5 xunlianjihua_text String 训练内容
6 create_time Date 创建时间

表4.8训练进度表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 xunlianjihua_id Integer 训练计划
3 yonghu_id Integer 球员
4 xunlianjindu_text String 训练进度
5 create_time Date 创建时间

表4.9考勤信息表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 xunlianjihua_id Integer 训练计划
3 yonghu_id Integer 球员
4 insert_time Date 打卡时间
5 create_time Date 创建时间

表4.10球员表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 yonghu_name String 球员姓名
3 yonghu_phone String 手机号
4 yonghu_id_number String 身份证号
5 yonghu_email String 电子邮箱
6 yonghu_delete Integer 假删
7 create_time Date 创建时间

表4.11用户表表

序号 列名 数据类型 说明 允许空
1 Id Int id
2 username String 用户名
3 password String 密码
4 role String 角色
5 addtime Date 新增时间

第5章 系统实现

该环节必须依赖先前的方案,并涉及对系统模块以及程序后台数据支持数据库的具体设计工作;尽管如此,这一部分的主要目标仍然是培养系统的开发人员的专业技能。我们的目标是将这些设计成果转化为一个完整且功能完善的系统。

功能模块的实现

5.1球员信息管理

如图5.1所示的是球员信息管理页面。该页面为管理员提供的功能包括:支持球队资料的查询与维护;能够移除队员记录;允许更新球队资料;并能添加新队员数据。

还进行了对用户名称的模糊查询的条件

图5.1 球员信息管理页面

5.2 教练信息管理

图5.2展示了教练信息管理界面;该界面为管理员提供了以下功能:查看已发布的数据、更新教练记录、取消coach 信息、删除coach记录以及按类型筛选coach 信息等。

图5.2 教练信息管理页面

5.3公告类型管理

如图5.3所示的是公告类型管理页面。该页面为管理员提供了多种功能:基于不同类型的公告支持条件性查询,并且管理员可在此处完成各类公告类型的新增操作、修改操作以及查询操作等。

图5.3 公告类型管理页面

5.1公告信息管理

如图5.4呈现了公告信息管理页面的相关内容,请注意该页面为管理员提供的功能包括新增、修改和查询公告信息等操作。

图5.4 公告信息管理页面

FileController.java
复制代码
    package com.controller;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    import java.util.UUID;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.util.ResourceUtils;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import com.annotation.IgnoreAuth;
    import com.baomidou.mybatisplus.mapper.EntityWrapper;
    import com.entity.ConfigEntity;
    import com.entity.EIException;
    import com.service.ConfigService;
    import com.utils.R;
    
    /** * 上传文件映射表
     */
    @RestController
    @RequestMapping("file")
    @SuppressWarnings({"unchecked","rawtypes"})
    public class FileController{
    	@Autowired
    private ConfigService configService;
    	/** * 上传文件
    	 */
    	@RequestMapping("/upload")
    	public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
    		if (file.isEmpty()) {
    			throw new EIException("上传文件不能为空");
    		}
    		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
    		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
    		if(!path.exists()) {
    		    path = new File("");
    		}
    		File upload = new File(path.getAbsolutePath(),"/upload/");
    		if(!upload.exists()) {
    		    upload.mkdirs();
    		}
    		String fileName = new Date().getTime()+"."+fileExt;
    		File dest = new File(upload.getAbsolutePath()+"/"+fileName);
    		file.transferTo(dest);
    		if(StringUtils.isNotBlank(type) && type.equals("1")) {
    			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
    			if(configEntity==null) {
    				configEntity = new ConfigEntity();
    				configEntity.setName("faceFile");
    				configEntity.setValue(fileName);
    			} else {
    				configEntity.setValue(fileName);
    			}
    			configService.insertOrUpdate(configEntity);
    		}
    		return R.ok().put("file", fileName);
    	}
    	
    	/** * 下载文件
    	 */
    	@IgnoreAuth
    	@RequestMapping("/download")
    	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
    		try {
    			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
    			if(!path.exists()) {
    			    path = new File("");
    			}
    			File upload = new File(path.getAbsolutePath(),"/upload/");
    			if(!upload.exists()) {
    			    upload.mkdirs();
    			}
    			File file = new File(upload.getAbsolutePath()+"/"+fileName);
    			if(file.exists()){
    				/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
    					getResponse().sendError(403);
    				}*/
    				HttpHeaders headers = new HttpHeaders();
    			    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
    			    headers.setContentDispositionFormData("attachment", fileName);    
    			    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
    	}
    	
    }
YonghuServiceImpl.java
复制代码
    package com.service.impl;
    
    import com.utils.StringUtil;
    import org.springframework.stereotype.Service;
    import java.lang.reflect.Field;
    import java.util.*;
    import com.baomidou.mybatisplus.plugins.Page;
    import com.baomidou.mybatisplus.service.impl.ServiceImpl;
    import org.springframework.transaction.annotation.Transactional;
    import com.utils.PageUtils;
    import com.utils.Query;
    import org.springframework.web.context.ContextLoader;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import com.dao.YonghuDao;
    import com.entity.YonghuEntity;
    import com.service.YonghuService;
    import com.entity.view.YonghuView;
    
    /** * 球员 服务实现类
     */
    @Service("yonghuService")
    @Transactional
    public class YonghuServiceImpl extends ServiceImpl<YonghuDao, YonghuEntity> implements YonghuService {
    
    @Override
    public PageUtils queryPage(Map<String,Object> params) {
        if(params != null && (params.get("limit") == null || params.get("page") == null)){
            params.put("page","1");
            params.put("limit","10");
        }
        Page<YonghuView> page =new Query<YonghuView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }
    
    
    }
XunlianjihuaServiceImpl.java
复制代码
    package com.service.impl;
    
    import com.utils.StringUtil;
    import org.springframework.stereotype.Service;
    import java.lang.reflect.Field;
    import java.util.*;
    import com.baomidou.mybatisplus.plugins.Page;
    import com.baomidou.mybatisplus.service.impl.ServiceImpl;
    import org.springframework.transaction.annotation.Transactional;
    import com.utils.PageUtils;
    import com.utils.Query;
    import org.springframework.web.context.ContextLoader;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import com.dao.XunlianjihuaDao;
    import com.entity.XunlianjihuaEntity;
    import com.service.XunlianjihuaService;
    import com.entity.view.XunlianjihuaView;
    
    /** * 训练计划 服务实现类
     */
    @Service("xunlianjihuaService")
    @Transactional
    public class XunlianjihuaServiceImpl extends ServiceImpl<XunlianjihuaDao, XunlianjihuaEntity> implements XunlianjihuaService {
    
    @Override
    public PageUtils queryPage(Map<String,Object> params) {
        if(params != null && (params.get("limit") == null || params.get("page") == null)){
            params.put("page","1");
            params.put("limit","10");
        }
        Page<XunlianjihuaView> page =new Query<XunlianjihuaView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }
    
    
    }
add-or-update.vue
复制代码
    <template>
    <div class="addEdit-block">
        <el-form
                class="detail-form-content"
                ref="ruleForm"
                :model="ruleForm"
                :rules="rules"
                label-width="80px"
                :style="{backgroundColor:addEditForm.addEditBoxColor}"
        >
            <el-row>
                <el-col :span="12">
                    <el-form-item class="input" v-if="type!='info'"  label="球队类型编码" prop="codeIndex">
                        <el-input v-model="ruleForm.codeIndex"
                                  placeholder="球队类型编码" clearable  :readonly="ro.codeIndex"></el-input>
                    </el-form-item>
                    <div v-else>
                        <el-form-item class="input" label="球队类型编码" prop="codeIndex">
                            <el-input v-model="ruleForm.codeIndex"
                                      placeholder="球队类型编码" readonly></el-input>
                        </el-form-item>
                    </div>
                </el-col>
                <el-col :span="12">
                    <el-form-item class="input" v-if="type!='info'"  label="球队类型" prop="indexName">
                        <el-input v-model="ruleForm.indexName"
                                  placeholder="球队类型" clearable  :readonly="ro.indexName"></el-input>
                    </el-form-item>
                    <div v-else>
                        <el-form-item class="input" label="球队类型" prop="indexName">
                            <el-input v-model="ruleForm.indexName"
                                      placeholder="球队类型" readonly></el-input>
                        </el-form-item>
                    </div>
                </el-col>
                <!--<el-col :span="12">
                    <el-form-item class="input" v-if="type!='info'"  label="备注" prop="beizhu">
                        <el-input v-model="ruleForm.beizhu"
                                  placeholder="备注" clearable  :readonly="ro.beizhu"></el-input>
                    </el-form-item>
                    <div v-else>
                        <el-form-item class="input" label="备注" prop="beizhu">
                            <el-input v-model="ruleForm.beizhu"
                                      placeholder="备注" readonly></el-input>
                        </el-form-item>
                    </div>
                </el-col>-->
            </el-row>
            <el-form-item class="btn">
                <el-button v-if="type!='info'" type="primary" class="btn-success" @click="onSubmit">提交</el-button>
                <el-button v-if="type!='info'" class="btn-close" @click="back()">取消</el-button>
                <el-button v-if="type=='info'" class="btn-close" @click="back()">返回</el-button>
            </el-form-item>
        </el-form>
    
    
    </div>
    </template>
    <script>
    import styleJs from "../../../utils/style.js";
    // 数字,邮件,手机,url,身份证校验
    import { isNumber,isIntNumer,isEmail,isPhone, isMobile,isURL,checkIdCard } from "@/utils/validate";
    export default {
        data() {
            let self = this
            return {
                addEditForm:null,
                id: '',
                type: '',
                ro:{
                    codeIndex : true,
                    indexName : false,
                    superId : false,
                    beizhu : false,
                },
                ruleForm: {
                    codeIndex: '',
                    indexName: '',
                    superId : '',
                    beizhu : '',
                },
                rules: {
                    /*beizhu: [
                        { required: true, message: '备注不能为空', trigger: 'blur' },
                        {  pattern: /^[1-9]\d*$/,
                            message: '备注只能为正整数',
                            trigger: 'blur'
                        }
                    ],*/
                }
            };
        },
        props: ["parent"],
        computed: {
        },
        created() {
            this.addEditForm = styleJs.addStyle();
            this.addEditStyleChange()
            this.addEditUploadStyleChange()
        },
        methods: {
            // 初始化
            init(id,type) {
                if (id) {
                    this.id = id;
                    this.type = type;
                }
                if(this.type=='info'||this.type=='else'){
                    this.info(id);
                }else{
                    //查询最大值 start
                    this.$http({
                        url: `dictionary/maxCodeIndex`,
                        method: "post",
                        data: {"dicCode":"qiudui_types"}
                    }).then(({ data }) => {
                        if (data && data.code === 0) {
                            this.ruleForm.codeIndex = data.maxCodeIndex;
                        } else {
                            this.$message.error(data.msg);
                        }
                    });
                    //查询最大值 end
                }
            },
            // 多级联动参数
            info(id) {
                this.$http({
                    url: `dictionary/info/${id}`,
                    method: "get"
                }).then(({ data }) => {
                    if (data && data.code === 0) {
                    this.ruleForm = data.data;
                    //解决前台上传图片后台不显示的问题
                    let reg=new RegExp('../../../upload','g')//g代表全部
                } else {
                    this.$message.error(data.msg);
                }
            });
            },
            // 提交
            onSubmit() {
                if((!this.ruleForm.indexName)){
                    this.$message.error('球队类型不能为空');
                    return
                }
                this.$refs["ruleForm"].validate(valid => {
                    if (valid) {
                        let ruleForm = this.ruleForm;
                        ruleForm["dicCode"]="qiudui_types";
                        ruleForm["dicName"]="球队类型";
                        this.$http({
                            url: `dictionary/${!this.ruleForm.id ? "save" : "update"}`,
                            method: "post",
                            data: ruleForm
                        }).then(({ data }) => {
                            if (data && data.code === 0) {
                                this.$message({
                                    message: "操作成功",
                                    type: "success",
                                    duration: 1500,
                                    onClose: () => {
                                        this.parent.showFlag = true;
                                        this.parent.addOrUpdateFlag = false;
                                        this.parent.dictionaryCrossAddOrUpdateFlag = false;
                                        this.parent.search();
                                        this.parent.contentStyleChange();
    
                                    }
                                });
                            } else {
                                this.$message.error(data.msg);
                            }
                        });
                    }
                });
            },
            // 返回
            back() {
                this.parent.showFlag = true;
                this.parent.addOrUpdateFlag = false;
                this.parent.dictionaryCrossAddOrUpdateFlag = false;
                this.parent.contentStyleChange();
            },
            addEditStyleChange() {
                this.$nextTick(()=>{
                    // input
                    document.querySelectorAll('.addEdit-block .input .el-input__inner').forEach(el=>{
                    el.style.height = this.addEditForm.inputHeight
                el.style.color = this.addEditForm.inputFontColor
                el.style.fontSize = this.addEditForm.inputFontSize
                el.style.borderWidth = this.addEditForm.inputBorderWidth
                el.style.borderStyle = this.addEditForm.inputBorderStyle
                el.style.borderColor = this.addEditForm.inputBorderColor
                el.style.borderRadius = this.addEditForm.inputBorderRadius
                el.style.backgroundColor = this.addEditForm.inputBgColor
            })
                document.querySelectorAll('.addEdit-block .input .el-form-item__label').forEach(el=>{
                    el.style.lineHeight = this.addEditForm.inputHeight
                el.style.color = this.addEditForm.inputLableColor
                el.style.fontSize = this.addEditForm.inputLableFontSize
            })
                // select
                document.querySelectorAll('.addEdit-block .select .el-input__inner').forEach(el=>{
                    el.style.height = this.addEditForm.selectHeight
                el.style.color = this.addEditForm.selectFontColor
                el.style.fontSize = this.addEditForm.selectFontSize
                el.style.borderWidth = this.addEditForm.selectBorderWidth
                el.style.borderStyle = this.addEditForm.selectBorderStyle
                el.style.borderColor = this.addEditForm.selectBorderColor
                el.style.borderRadius = this.addEditForm.selectBorderRadius
                el.style.backgroundColor = this.addEditForm.selectBgColor
            })
                document.querySelectorAll('.addEdit-block .select .el-form-item__label').forEach(el=>{
                    el.style.lineHeight = this.addEditForm.selectHeight
                el.style.color = this.addEditForm.selectLableColor
                el.style.fontSize = this.addEditForm.selectLableFontSize
            })
                document.querySelectorAll('.addEdit-block .select .el-select__caret').forEach(el=>{
                    el.style.color = this.addEditForm.selectIconFontColor
                el.style.fontSize = this.addEditForm.selectIconFontSize
            })
                // date
                document.querySelectorAll('.addEdit-block .date .el-input__inner').forEach(el=>{
                    el.style.height = this.addEditForm.dateHeight
                el.style.color = this.addEditForm.dateFontColor
                el.style.fontSize = this.addEditForm.dateFontSize
                el.style.borderWidth = this.addEditForm.dateBorderWidth
                el.style.borderStyle = this.addEditForm.dateBorderStyle
                el.style.borderColor = this.addEditForm.dateBorderColor
                el.style.borderRadius = this.addEditForm.dateBorderRadius
                el.style.backgroundColor = this.addEditForm.dateBgColor
            })
                document.querySelectorAll('.addEdit-block .date .el-form-item__label').forEach(el=>{
                    el.style.lineHeight = this.addEditForm.dateHeight
                el.style.color = this.addEditForm.dateLableColor
                el.style.fontSize = this.addEditForm.dateLableFontSize
            })
                document.querySelectorAll('.addEdit-block .date .el-input__icon').forEach(el=>{
                    el.style.color = this.addEditForm.dateIconFontColor
                el.style.fontSize = this.addEditForm.dateIconFontSize
                el.style.lineHeight = this.addEditForm.dateHeight
            })
                // upload
                let iconLineHeight = parseInt(this.addEditForm.uploadHeight) - parseInt(this.addEditForm.uploadBorderWidth) * 2 + 'px'
                document.querySelectorAll('.addEdit-block .upload .el-upload--picture-card').forEach(el=>{
                    el.style.width = this.addEditForm.uploadHeight
                el.style.height = this.addEditForm.uploadHeight
                el.style.borderWidth = this.addEditForm.uploadBorderWidth
                el.style.borderStyle = this.addEditForm.uploadBorderStyle
                el.style.borderColor = this.addEditForm.uploadBorderColor
                el.style.borderRadius = this.addEditForm.uploadBorderRadius
                el.style.backgroundColor = this.addEditForm.uploadBgColor
            })
                document.querySelectorAll('.addEdit-block .upload .el-form-item__label').forEach(el=>{
                    el.style.lineHeight = this.addEditForm.uploadHeight
                el.style.color = this.addEditForm.uploadLableColor
                el.style.fontSize = this.addEditForm.uploadLableFontSize
            })
                document.querySelectorAll('.addEdit-block .upload .el-icon-plus').forEach(el=>{
                    el.style.color = this.addEditForm.uploadIconFontColor
                el.style.fontSize = this.addEditForm.uploadIconFontSize
                el.style.lineHeight = iconLineHeight
                el.style.display = 'block'
            })
                // 多文本输入框
                document.querySelectorAll('.addEdit-block .textarea .el-textarea__inner').forEach(el=>{
                    el.style.height = this.addEditForm.textareaHeight
                el.style.color = this.addEditForm.textareaFontColor
                el.style.fontSize = this.addEditForm.textareaFontSize
                el.style.borderWidth = this.addEditForm.textareaBorderWidth
                el.style.borderStyle = this.addEditForm.textareaBorderStyle
                el.style.borderColor = this.addEditForm.textareaBorderColor
                el.style.borderRadius = this.addEditForm.textareaBorderRadius
                el.style.backgroundColor = this.addEditForm.textareaBgColor
            })
                document.querySelectorAll('.addEdit-block .textarea .el-form-item__label').forEach(el=>{
                    // el.style.lineHeight = this.addEditForm.textareaHeight
                    el.style.color = this.addEditForm.textareaLableColor
                el.style.fontSize = this.addEditForm.textareaLableFontSize
            })
                // 保存
                document.querySelectorAll('.addEdit-block .btn .btn-success').forEach(el=>{
                    el.style.width = this.addEditForm.btnSaveWidth
                el.style.height = this.addEditForm.btnSaveHeight
                el.style.color = this.addEditForm.btnSaveFontColor
                el.style.fontSize = this.addEditForm.btnSaveFontSize
                el.style.borderWidth = this.addEditForm.btnSaveBorderWidth
                el.style.borderStyle = this.addEditForm.btnSaveBorderStyle
                el.style.borderColor = this.addEditForm.btnSaveBorderColor
                el.style.borderRadius = this.addEditForm.btnSaveBorderRadius
                el.style.backgroundColor = this.addEditForm.btnSaveBgColor
            })
                // 返回
                document.querySelectorAll('.addEdit-block .btn .btn-close').forEach(el=>{
                    el.style.width = this.addEditForm.btnCancelWidth
                el.style.height = this.addEditForm.btnCancelHeight
                el.style.color = this.addEditForm.btnCancelFontColor
                el.style.fontSize = this.addEditForm.btnCancelFontSize
                el.style.borderWidth = this.addEditForm.btnCancelBorderWidth
                el.style.borderStyle = this.addEditForm.btnCancelBorderStyle
                el.style.borderColor = this.addEditForm.btnCancelBorderColor
                el.style.borderRadius = this.addEditForm.btnCancelBorderRadius
                el.style.backgroundColor = this.addEditForm.btnCancelBgColor
            })
            })
            },
            addEditUploadStyleChange() {
                this.$nextTick(()=>{
                    document.querySelectorAll('.addEdit-block .upload .el-upload-list--picture-card .el-upload-list__item').forEach(el=>{
                    el.style.width = this.addEditForm.uploadHeight
                el.style.height = this.addEditForm.uploadHeight
                el.style.borderWidth = this.addEditForm.uploadBorderWidth
                el.style.borderStyle = this.addEditForm.uploadBorderStyle
                el.style.borderColor = this.addEditForm.uploadBorderColor
                el.style.borderRadius = this.addEditForm.uploadBorderRadius
                el.style.backgroundColor = this.addEditForm.uploadBgColor
            })
            })
            },
        }
    };
    </script>
    <style lang="scss">
    .editor{
      height: 500px;
    
      & /deep/ .ql-container {
    	  height: 310px;
      }
    }
    .amap-wrapper {
      width: 100%;
      height: 500px;
    }
    .search-box {
      position: absolute;
    }
    .addEdit-block {
    	margin: -10px;
    }
    .detail-form-content {
    	padding: 12px;
    }
    .btn .el-button {
      padding: 0;
    }</style>

全部评论 (0)

还没有任何评论哟~