当前位置: 首页 > news >正文

基于SSM的文化培训学校网站的设计与实现

末尾获取源码
开发语言:Java
Java开发工具:JDK1.8
后端框架:SSM
前端:Vue
数据库:MySQL5.7和Navicat管理工具结合
服务器:Tomcat8.5
开发软件:IDEA / Eclipse
是否Maven项目:是


目录

一、项目简介

二、系统功能

三、系统项目截图

管理员功能实现

教学资源管理

师资力量管理

课程介绍管理

学校简介管理

用户管理

课程类型管理

教师功能实现

个人信息

课程预约管理

学生功能实现

课程介绍

教学资源

师资力量

学校简介

四、核心代码

登录相关

文件上传

封装


一、项目简介

互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对培训学校展示信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用金旗帜文化培训学校网站可以有效管理,使信息管理能够更加科学和规范。

金旗帜文化培训学校网站在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,本系统实现的功能包括师资力量管理,教学资源管理,课程介绍和课程预约管理,学校简介管理等功能。

总之,金旗帜文化培训学校网站集中管理信息,有着保密性强,效率高,存储空间大,成本低等诸多优点。它可以降低信息管理成本,实现信息管理计算机化。


二、系统功能

在前面分析的管理员功能的基础上,进行接下来的设计工作,最终展示设计的管理员结构图(见下图)。管理员管理学校简介,课程介绍,师资力量,教学资源和课程预约信息等。

在前面分析的教师功能的基础上,进行接下来的设计工作,最终展示设计的教师结构图(见下图)。教师修改个人信息,管理课程预约信息。

 在前面分析的用户功能的基础上,进行接下来的设计工作,最终展示设计的用户结构图(见下图)。用户播放教学资源视频,查看课程介绍,预约课程,查看师资力量和学校简介。



三、系统项目截图

管理员功能实现

教学资源管理

管理员进入指定功能操作区之后可以管理教学资源。其页面见下图。管理员负责上传教学资源,可以修改,查询教学资源信息。

师资力量管理

管理员进入指定功能操作区之后可以管理教师资源信息。其页面见下图。管理员增删改查教师资源信息。

 

课程介绍管理

管理员进入指定功能操作区之后可以管理课程介绍。其页面见下图。管理员在本页面可以增删改查课程介绍信息。

 

学校简介管理

管理员进入指定功能操作区之后可以管理学校简介信息。其页面见下图。管理员负责发布学校简介信息,修改,删除学校简介信息。

 

用户管理

管理员进入指定功能操作区之后可以管理用户。其页面见下图。管理员对用户注册的信息也需要管理,包括修改用户注册信息,删除用户注册信息。

 

课程类型管理

管理员进入指定功能操作区之后可以管理课程类型。其页面见下图。管理员修改课程类型名称,提交课程类型名称查询课程类型。

 

教师功能实现

个人信息

教师进入指定功能操作区之后可以查看个人信息。其页面见下图。教师的个人信息可以进行修改,包括重新上传照片,修改联系方式和邮箱等信息。

 

课程预约管理

教师进入指定功能操作区之后可以管理课程预约信息。其页面见下图。教师根据课程名称查询课程预约信息,学生预约了该名教师的任课课程之后,其课程预约信息则会显示在本页面。

 

学生功能实现

课程介绍

学生进入指定功能操作区之后可以查看课程介绍。其页面见下图。学生查看课程详细信息,可以预约课程。

 

教学资源

学生进入指定功能操作区之后可以查看教学资源。其页面见下图。学生查看教学资源介绍,观看教学资源视频。

 

师资力量

学生进入指定功能操作区之后可以查看教师资源。其页面见下图。学生查看该学校的教师资源信息,点击教师图片即可查看其相关介绍。

 

学校简介

学生进入指定功能操作区之后可以查看学校简介。其页面见下图。学生通过查看该学校的学校简介信息可以更加深入地了解该学校。

 


四、核心代码

登录相关


package com.controller;import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;/*** 登录相关*/
@RequestMapping("users")
@RestController
public class UserController{@Autowiredprivate UserService userService;@Autowiredprivate TokenService tokenService;/*** 登录*/@IgnoreAuth@PostMapping(value = "/login")public R login(String username, String password, String captcha, HttpServletRequest request) {UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));if(user==null || !user.getPassword().equals(password)) {return R.error("账号或密码不正确");}String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());return R.ok().put("token", token);}/*** 注册*/@IgnoreAuth@PostMapping(value = "/register")public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {return R.error("用户已存在");}userService.insert(user);return R.ok();}/*** 退出*/@GetMapping(value = "logout")public R logout(HttpServletRequest request) {request.getSession().invalidate();return R.ok("退出成功");}/*** 密码重置*/@IgnoreAuth@RequestMapping(value = "/resetPass")public R resetPass(String username, HttpServletRequest request){UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));if(user==null) {return R.error("账号不存在");}user.setPassword("123456");userService.update(user,null);return R.ok("密码已重置为:123456");}/*** 列表*/@RequestMapping("/page")public R page(@RequestParam Map<String, Object> params,UserEntity user){EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));return R.ok().put("data", page);}/*** 列表*/@RequestMapping("/list")public R list( UserEntity user){EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();ew.allEq(MPUtil.allEQMapPre( user, "user")); return R.ok().put("data", userService.selectListView(ew));}/*** 信息*/@RequestMapping("/info/{id}")public R info(@PathVariable("id") String id){UserEntity user = userService.selectById(id);return R.ok().put("data", user);}/*** 获取用户的session用户信息*/@RequestMapping("/session")public R getCurrUser(HttpServletRequest request){Long id = (Long)request.getSession().getAttribute("userId");UserEntity user = userService.selectById(id);return R.ok().put("data", user);}/*** 保存*/@PostMapping("/save")public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {return R.error("用户已存在");}userService.insert(user);return R.ok();}/*** 修改*/@RequestMapping("/update")public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);userService.updateById(user);//全部更新return R.ok();}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Long[] ids){userService.deleteBatchIds(Arrays.asList(ids));return R.ok();}
}

文件上传

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{@Autowiredprivate 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);FileUtils.copyFile(dest, new File("C:\\Users\\Desktop\\jiadian\\springbootl7own\\src\\main\\resources\\static\\upload"+"/"+fileName));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);}}

封装

package com.utils;import java.util.HashMap;
import java.util.Map;/*** 返回数据*/
public class R extends HashMap<String, Object> {private static final long serialVersionUID = 1L;public R() {put("code", 0);}public static R error() {return error(500, "未知异常,请联系管理员");}public static R error(String msg) {return error(500, msg);}public static R error(int code, String msg) {R r = new R();r.put("code", code);r.put("msg", msg);return r;}public static R ok(String msg) {R r = new R();r.put("msg", msg);return r;}public static R ok(Map<String, Object> map) {R r = new R();r.putAll(map);return r;}public static R ok() {return new R();}public R put(String key, Object value) {super.put(key, value);return this;}
}

相关文章:

基于SSM的文化培训学校网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

gitee-git使用

克隆gitee某代码仓库某分支流程 1.克隆远程gitee仓库某分支到本地 2.如果克隆gitee仓库是私有的系统会弹出弹框让你输入gitee的账户和密码 3.克隆远程分支完成 git所需命令 克隆远程仓库到本地 git clone 仓库URLgit克隆远程分支到本地 git clone -b 分支名 仓库URLgit 拉…...

欧拉图(Euler Graph)

这种「一笔画」问题与欧拉图或者半欧拉图有着紧密的联系,下面给出定义: 通过图中所有边恰好一次且行遍所有顶点的通路称为 欧拉通路; 通过图中所有边恰好一次且行遍所有顶点的回路称为 欧拉回路; 具有欧拉回路的无向图称为 欧拉图; 具有欧拉通路但不具有欧拉回路的无向图…...

【安全体系架构】——零信任网络架构

什么是零信任网络架构&#xff1f; 零信任网络架构是一种网络和信息安全模型&#xff0c;它将传统的信任模型颠覆&#xff0c;不再信任内部或外部用户、设备或网络。相反&#xff0c;它将每个访问请求都视为不受信任&#xff0c;要求对每个用户、设备和流量都进行认证和授权&a…...

mybatis动态sql一对多查询

在数据库设计中&#xff0c;一对多关系是非常多的&#xff0c;例如消息通知和附件&#xff0c;一个消息通知中往往会包含多个附件&#xff0c;这种情况下使用mybatis动态sql可以很方便的查询出来。 1、数据库设计 消息表&#xff1a;sys_message CREATE TABLE sys_message (i…...

Leetcode.2316 统计无向图中无法互相到达点对数

题目链接 Leetcode.2316 统计无向图中无法互相到达点对数 rating : 1604 题目描述 给你一个整数 n n n &#xff0c;表示一张 无向图 中有 n n n 个节点&#xff0c;编号为 0 0 0 到 n − 1 n - 1 n−1 。同时给你一个二维整数数组 e d g e s edges edges &#xff0c;其…...

介绍机器学习中CatBoost工具的详细使用指南

在机器学习的动态世界中,Python 是创新背后的驱动力,专业人士必须使用正确的工具。CatBoost 就是这样一个工具,以其卓越的速度和准确性悄然改变了该领域。在本指南中,我们将深入研究 Python 3 中的 CatBoost,涵盖基础知识、高级技术和实际示例,包括使用示例数据集和绘图进…...

操作系统【OS】线程与进程的比较

进程 线程 是什么的单位? 是资源分配的基本单位 是调度的基本单位 不能共享什么? 不能共享虚拟地址空间 不能共享栈指针 可以共享什么? 拥有一个完整的资源平台 每个进程都有独立的地址空间和资源 除了共享全局变量&#xff0c;不允许其他进程访问 某进程中的线程…...

在Mac上使用安卓桌面模式

在安装Homeblew的基础上 替换国内源 export HOMEBREW_API_DOMAIN"https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" export HOMEBREW_BREW_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" brew update 安装Scrcpy …...

YOLO目标检测——人脸口罩佩戴数据集【(含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;公共场所监控场景下的大密度人群检测是否佩戴口罩&#xff0c;以及戴口罩的人证比对&#xff08;安检刷脸不用摘口罩&#xff09;、手机解锁、刷脸考勤等身份认证场景。数据集说明&#xff1a;人脸口罩佩戴检测数据集&#xff0c;真实场景的高质量图片…...

mongodb如何多表查询,如同时查询店铺以及里面对应的商品

多表查询场景介绍 一种很常见的场景&#xff0c;比如电商首页中&#xff0c;需要同时展示最近比较火热的店铺&#xff0c;以及直接展示店铺里对应的商品。或者用户下单之后购物车里可以看到所选的商品以及对应的店铺。如果不知道如何用mongodb自带的查询语句快速查询的话&#…...

Linux环境修改服务器时间和网络时间保持一致

目录 介绍UTC和CST 修改时区 修改时间 介绍UTC和CST UTC是协调世界时&#xff0c;是全球统一的时间标准。UTC的时间是基于原子钟计算的&#xff0c;以秒为单位&#xff0c;不受夏令时等影响。世界各地都可以通过UTC来同步时间。 CST是中央标准时间&#xff0c;相当于UTC-6…...

CUDA学习笔记6——事件计时

事件计时 CUDA事件是直接在GPU上实现的&#xff0c;因此它们不适用于对同时包含设备代码和主机代码的混合代码计时。 cudaEventCreate 创建一个事件cudaEventRecord 记录一个事件cudaEventElapsedTime 计算两个事件之间经历的时间&#xff0c;第一个参数为某个浮点变量的地址…...

使用vscode调试ffmpeg源码

ffmpeg的编译配置 # --enable-debug 设置为调试级别 # --disable-stripping 如果不加此选项&#xff0c;会strip去掉符号信息 ./configure --prefix{output_path} --enable-debug --disable-stripping make -j10VSCode的配置 将以下文件对比替换工程.vscode目录下的相同文件 …...

微信小程序--数字化会议OA系统之首页搭建

一、Flex弹性布局 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便&#xff0c;比如&#xff0c;垂直居中就不容易实现。 2009年&#xff0c;W3C提出了一种新的方案—-Flex布局&#xff0c;可…...

代码随想录算法训练营第六十天 | 739. 每日温度、496.下一个更大元素 I

739. 每日温度 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码 496.下一个更大元素 I 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码...

WebView 以及如何测试

混合应用 顾名思义&#xff0c;它们是本机应用程序和 Web 应用程序的混合体。它们可以在应用程序商店中下载&#xff0c;并且需要像本机应用程序一样从设备进行访问身份验证&#xff0c;但它们也有一个嵌入在应用程序中的浏览器&#xff08;WebView&#xff09;用于呈现 HTML。…...

Jetpack:013-Jetpack底部导航栏

文章目录 1. 概念介绍2. 使用方法2.1 NavigationBar2.2 NavigationBarItem 3. 示例代码3.1 代码和注释3.2 代码难点3.3 运行效果 4. 内容总结 我们在上一章回中介绍了Jetpack中弹出菜单相关的内容&#xff0c;本章回中将介绍 底部导航栏。闲话休提&#xff0c;让我们一起Talk …...

MATLAB - excel 读取

matlab中excel 读取 1. 写入excel文件 - xlswrite2. 读取excel文件 - xlsread 1. 写入excel文件 - xlswrite xlswrite(filename,A,sheet,xlRange) % 写入字符串 % 注意事项&#xff1a;Str需要是Cell格式&#xff0c;否则一个字母占一格 % Str {‘abc’}&#xff1b; xlswr…...

【AIGC核心技术剖析】Hotshot-XL 一种 AI 文本转 GIF 模型(论文 + 代码:经过训练可与Stable Diffusion XL一起使用)

Hotshot-XL 是一种 AI 文本转 GIF 模型,经过训练可与Stable Diffusion XL一起使用。 Hotshot-XL 可以使用任何经过微调的 SDXL 模型生成 GIF。这意味着两件事: 您将能够使用您可能想要使用的任何现有或新微调的 SDXL 模型制作 GIF。 如果您想制作个性化主题的 GIF,您可以…...

从Simulink仿真到C代码:Stateflow历史节点的底层逻辑与生成代码分析

Stateflow历史节点的执行机制与代码生成深度解析 在嵌入式系统开发中&#xff0c;状态机设计是控制逻辑的核心实现方式之一。Stateflow作为MATLAB/Simulink环境下的状态机建模工具&#xff0c;其历史节点(History Junction)功能常被用于复杂状态管理场景。但许多工程师仅停留在…...

如何从图表图像中智能提取数据?WebPlotDigitizer给你答案

如何从图表图像中智能提取数据&#xff1f;WebPlotDigitizer给你答案 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 你是否曾面对科研…...

NVIDIA NCCL 2.26性能优化与监控能力解析

1. NVIDIA NCCL 2.26深度解析&#xff1a;性能优化与监控能力全面提升在分布式AI训练和HPC领域&#xff0c;GPU间的通信效率直接决定了整体系统的扩展性。NVIDIA Collective Communications Library&#xff08;NCCL&#xff09;作为多GPU通信的事实标准&#xff0c;其2.26版本…...

Windows任务栏透明美化终极指南:用TranslucentTB打造个性化桌面

Windows任务栏透明美化终极指南&#xff1a;用TranslucentTB打造个性化桌面 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 还在为Window…...

Windows Shell扩展技术解析:HashCheck如何实现文件完整性验证

Windows Shell扩展技术解析&#xff1a;HashCheck如何实现文件完整性验证 【免费下载链接】HashCheck HashCheck Shell Extension for Windows with added SHA2, SHA3, and multithreading; originally from code.kliu.org 项目地址: https://gitcode.com/gh_mirrors/ha/Hash…...

5分钟搞定DOL中文美化:新手零基础终极指南

5分钟搞定DOL中文美化&#xff1a;新手零基础终极指南 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 你是否正在寻找Degrees of Lewdity的完美中文游戏体验&#xff1f;DOL-CHS-MODS整合包为你提供…...

企业级AI决策平台架构:Xpert AI的Agent-Workflow混合模式实践

1. 项目概述&#xff1a;企业级AI决策平台的架构与实践最近在梳理团队内部的数据决策流程&#xff0c;发现一个挺普遍的问题&#xff1a;业务部门想用大模型快速分析数据、生成报告&#xff0c;但IT和风控部门又担心模型“胡说八道”或者数据安全不可控。纯靠人工写死的工作流&…...

UnityFigmaBridge终极方案:三步实现设计与开发高效协作的完整指南

UnityFigmaBridge终极方案&#xff1a;三步实现设计与开发高效协作的完整指南 【免费下载链接】UnityFigmaBridge Easily bring your Figma Documents, Components, Assets and Prototypes to Unity 项目地址: https://gitcode.com/gh_mirrors/un/UnityFigmaBridge 在游…...

DeepSeek V4 的社区实测如何?从倒数第一到碾压全场的逆袭

DeepSeek V4 的社区实测如何&#xff1f;从倒数第一到碾压全场的逆袭 最近在 Reddit 上看到一个非常有意思的实验&#xff1a;一个 「7 个 AI 代理用 $100 构建创业公司」 的比赛。这不仅是一场有趣的竞赛&#xff0c;更是一次对大模型真实编程能力的极限压力测试。 而 DeepS…...

类脑计算基础:从神经科学到AI算法实践

1. 从神经科学到代码&#xff1a;开发者需要了解的类脑计算基础 2014年哈佛医学院的神经科学研究揭示&#xff0c;人类大脑在处理视觉信息时存在分层特征提取机制。这个发现直接启发了现代卷积神经网络的设计——这不是巧合&#xff0c;而是类脑计算&#xff08;Brain-Inspired…...