基于SpringBoot+Vue3的在线报名系统

一、项目介绍

1.1 项目介绍

本项目为一个报名系统,实现了基本的报名流程,功能完善,前后端皆有个人独立开发,功能相对不是特别难,但该有的功能还是都已经实现。

1.2 技术架构

主要技术栈: SpringBoot2 + Vue3 + MySQL8.0

1.3 主要功能

角色设计: 管理员/普通用户(报名者)

首页

数据信息

        报名详情 / 报名表 / 黑名单 / 信息列表

权限设置

        角色管理 / 用户管理

系统设置

        修改密码

管理员默认拥有所有权限,而普通用户则只拥有 首页/ 数据信息(报名详情、报名表)/ 系统设置(修改密码)权限信息可以修改。

1.4 运行项目

前端:

 # 安装依赖
 npm install
 ​
 # 启动开发服务器
 npm run dev

高德地图密钥配置:在MapContrainer.vue中配置高德地图的密钥 ,如果没有请先去高德地图开发者平台注册

 window._AMapSecurityConfig = {
     securityJsCode: "你的安全密钥",
   };
   AMapLoader.load({
     key: "Web端开发者Key", // 申请好的Web端开发者Key,首次调用 load 时必填
     version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
     plugins: ["AMap.Geolocation"], // 只使用 Geolocation 插件
   })

启动,访问 http://localhost:5173/

后端:

要启动你的项目,其他开发者需要按照以下步骤操作:

  1. 配置环境: 确保安装了以下环境和工具:

    • JDK 8 或更高版本

    • Maven

    • MySQL 数据库

  2. 配置数据库

    • 创建一个新的 MySQL 数据库。

    • 在 `src/main/resources/application.yaml 文件中配置数据库连接信息:

  3. 安装依赖: 使用 Maven 安装项目依赖:

     mvn clean install
  4. 运行项目,打开浏览器,访问 http://localhost:8085。

通过以上步骤,其他开发者应该能够成功启动并运行你的项目。

二、数据库设计

此项目共包含6张表; apply 报名表、 blacklist 黑名单、 information 报名信息表、menu 权限菜单表、 role角色表、 user 用户表。

各表设计如下:

 -- 报名列表 
 -- auto-generated definition
 create table apply
 (
   id          int auto_increment
   primary key,
   type_id     int           not null,
   typename    varchar(32)   not null,
   is_delete   int default 0 not null,
   description varchar(128)  null,
   is_show     int default 0 not null,
   begin_time  datetime      not null,
   end_time    datetime      not null
 )
     comment '报名列表';
 ​
     -- 黑名单 
 -- auto-generated definition
 create table blacklist
 (
   id           int auto_increment
   primary key,
   user_id      int           not null,
   is_delete    int default 0 not null,
   name         varchar(24)   not null comment '用户名',
   grade        int           not null,
   professional varchar(32)   not null comment '专业',
   description  varchar(128)  null comment '描述',
   add_time     datetime      not null,
   school       varchar(64)   not null comment '学校'
 )
     comment '黑名单';
 ​
     -- 报名信息表 
 -- auto-generated definition
 create table information
 (
   id            int auto_increment
   primary key,
   user_id       int                        not null comment '用户id',
   name          varchar(32)                not null,
   apply_id      int                        not null,
   is_delete     int         default 0      not null,
   user_add_time datetime                   not null,
   school        varchar(32)                not null,
   professional  varchar(32) default '其他' not null comment '专业',
   grades        int                        not null comment '年级',
   phone         varchar(32)                not null,
   email         varchar(128)               not null,
   sex           varchar(24)                not null
 )
     comment '报名信息表';
 ​
     -- 权限列表 
 -- auto-generated definition
 create table menu
 (
   id   int auto_increment comment '主键id'
   primary key,
   name varchar(32)   not null comment '菜单名称',
   path varchar(64)   not null comment '路径',
   icon varchar(32)   not null comment '菜单的图标',
   pid  int default 0 not null
 )
     comment '权限列表';
 ​
     -- 用户角色列表 
 -- auto-generated definition
 create table role
 (
   id          int auto_increment comment '主键id'
   primary key,
   role_name   varchar(32)                         not null comment '角色名称',
   is_delete   int          default 0              not null comment '0 启用, 1 禁用',
   description varchar(128) default '暂无具体描述' not null comment '描述',
   rights      json                                null comment '角色所拥有的权限'
 )
     comment '用户角色列表';
 ​
 ​
 -- 用户列表 
 -- auto-generated definition
 create table user
 (
   id          int auto_increment comment '主键id'
   primary key,
   user_name   varchar(32)                            not null comment '用户名',
   password    varchar(32) default '123'              not null comment '密码',
   role_id     int                                    not null comment '角色ID',
   description varchar(64) default '暂无具体描述信息' not null comment '描述',
   is_delete   int         default 0                  not null comment '是否已经被删除,0 : 启用, 1:已经被删除'
 )
     comment '用户列表';

三、后端

3.1 项目资源一览:

3.2 Jwt的使用

配置Jwt的主要过程如下:

3.2.1 引入依赖/ 配置参数
 <!-- JWT -->
         <dependency>
             <groupId>io.jsonwebtoken</groupId>
             <artifactId>jjwt</artifactId>
             <version>0.9.1</version>
         </dependency>
         <dependency>
             <groupId>com.auth0</groupId>
             <artifactId>java-jwt</artifactId>
             <version>3.19.2</version>
         </dependency>
         <!--jdk大于8时需要添加-->
         <dependency>
             <groupId>javax.xml.bind</groupId>
             <artifactId>jaxb-api</artifactId>
         </dependency>

在application.yaml中配置:

 config:
   jwt:
     secret: 123456 # 密钥
     expire: 36000 # 过期时间
     header: token # 请求头名称
3.2.2 创建JwtConfig配置类
package com.registration.registration_system.config;
 ​
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 ​
 import java.util.Date;
 ​
 @ConfigurationProperties(prefix = "config.jwt", ignoreUnknownFields = true)
 @Component
 @Data
 public class JwtConfig {
     private String secret;
     private long expire;
     private String header;
 ​
     // 生成token
     public String createToken(String subject) {
         // 当前时间与过期时间
         Date now = new Date();
         Date expireDate = new Date(now.getTime() + expire*1000);
         return Jwts.builder()
                 .setHeaderParam("typ", "JWT")
                 .setSubject(subject) // 设置主题
                 .setIssuedAt(now)  // 设置签发时间
                 .setExpiration(expireDate)  // 设置过期时间
                 .signWith(SignatureAlgorithm.HS512, secret)  // 设置签名
                 .compact();
     }
     // 解析token
     public Claims getTokenClaims(String token) {
         try {
             return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
 ​
     // 获取token中的用户名
     public String getUsernameFromToken(String token) {
         Claims claims = getTokenClaims(token);
         if (claims != null) {
             return claims.getSubject();
         }
         return null;
     }
 }
 
3.2.3 创建一个拦截器 TokenInterceptor,添加 JwtConfig配置类
 
 
package com.registration.registration_system.config;
 ​
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 ​
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 ​
 @Component
 @AllArgsConstructor
 public class TokenInterceptor extends HandlerInterceptorAdapter {
     private final JwtConfig jwtConfig;
 ​
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取请求头中的token
         String token = request.getHeader(jwtConfig.getHeader());
 ​
         // 如果token为空
         if(StringUtils.isEmpty(token)) {
             sendError(response, "token为空");
             return false;
         }
         // 解析token
         try {
             jwtConfig.getTokenClaims(token);
         } catch (Exception e) {
             sendError(response, "token过期或不正确,请重新登录");
             return false;
         }
         return true;
     }
     // 返回错误信息
     private void sendError(HttpServletResponse response, String message) {
         response.setStatus(401);
         response.setContentType("application/json;charset=UTF-8");
         response.setCharacterEncoding("UTF-8");
         try {
             response.getWriter().write(message);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 }
3.2.4 添加自定义的拦截器到webConfig配置类中
 
package com.registration.registration_system.config;
 ​
 import lombok.AllArgsConstructor;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 @Configuration
 @AllArgsConstructor
 public class WebConfig implements WebMvcConfigurer {
 ​
     private final TokenInterceptor tokenInterceptor;
 ​
     /**
      * 拦截器配置
      * @param registry
      */
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(tokenInterceptor)
                 .addPathPatterns("/**")
                 .excludePathPatterns("/adminapi/user/login/**");
     }
 ​
     /**
      * 跨域配置
      * @param registry
      */
     @Override
     public void addCorsMappings(CorsRegistry registry) {
         WebMvcConfigurer.super.addCorsMappings(registry);
     }
 }
 

到此,就已经配置好了jwt,使用示例如下,我们希望在调用登录接口的时候生成token并返回,主要代码可以在serviceImpl中实现:

 
/**
 * 登录
 * @param user
 * @return
 */
 @Transactional
 @Override
 public UserVo login(User user) {
   User new_user = userMapper.selectUser(user);
   if (new_user == null) {
     return null;
   } else {
     // 创建vo
     UserVo vo = new UserVo();
     BeanUtils.copyProperties(new_user, vo);
     // 生成token
     String token = jwtConfig.createToken(new_user.getUserName());
     vo.setToken(token);
     // 查询role
     Role role = new Role();
     role.setId(new_user.getRoleID());
     List<Role> roleList = roleMapper.selectRoleList(role);
     // 设置role为roleList的第一个
     vo.setRole(roleList.get(0));
     return vo;
   }
 }
3.3 PageHelper 分页插件
3.3.1 引入依赖
<!--分页插件-->
         <dependency>
             <groupId>com.github.pagehelper</groupId>
             <artifactId>pagehelper-spring-boot-starter</artifactId>
             <version>1.4.6</version>
         </dependency>
         <dependency>
             <groupId>com.github.jsqlparser</groupId>
             <artifactId>jsqlparser</artifactId>
             <version>4.2</version>
         </dependency>
3.3.2 使用
/**
      * 获取报名列表
      * @return
      */
     @Override
     public PageInfo<Apply> getApplyList(ApplyDto applyDto) {
         PageHelper.startPage(applyDto.getPageNum(), applyDto.getPageSize());
         Apply apply = new Apply();
         BeanUtils.copyProperties(applyDto, apply);
         List<Apply> applyList = applyMapper.selectApplyList(apply);
       return new PageInfo<>(applyList);
     }
 ​

分页插件的使用实际上非常简单,

首先,从前端接收到pageNum和PageSize之后,我们在serviceImpl层调用mapper接口之前,调用PageHelper.startPage来设置查询的数量和当前页。

然后我们正常进去查询,代码中所示是因为要有符合mapper接口的参数传入所以重新new了一个apply。

最后,返回一个 PageInfo<>类型的对象。

3.4 实现数据表导出成excel格式
/**
      * 导出信息
      * @param informationDto
      * @param response
      * @throws IOException
      */
     @Override
     public void exportInformation(InformationDto informationDto, HttpServletResponse response) throws IOException {
         // 创建一个 InformationVo 对象,并将 informationDto 的属性复制到该对象中
         InformationVo vo = new InformationVo();
         BeanUtils.copyProperties(informationDto, vo);
 ​
         // 创建一个空的列表,用于存储导出的数据
         List<Map<String, Object>> list = CollUtil.newArrayList();
         // 从数据库中查询信息列表
         List<InformationVo> infoList = informationMapper.selectInfoList(vo);
 ​
         // 遍历查询到的信息列表,将每条信息转换为 Map 并添加到 list 中
         for (InformationVo info : infoList) {
             Map<String, Object> row1 = new LinkedHashMap<>();
             row1.put("用户编号", info.getUserId());
             row1.put("姓名", info.getName());
             row1.put("性别", info.getSex());
             row1.put("参报项目", info.getTypeName());
             row1.put("报名时间", info.getUserAddTime());
             row1.put("学校", info.getSchool());
             row1.put("年级", info.getGrades());
             row1.put("专业", info.getProfessional());
             row1.put("手机号码", info.getPhone());
             row1.put("邮箱", info.getEmail());
 ​
             // 将每条信息的 Map 添加到 list 中
             list.add(row1);
         }
 ​
         // 创建一个 ExcelWriter 对象,用于写入 Excel 文件
         ExcelWriter writer = ExcelUtil.getWriter(true);
         // 一次性写出内容,强制输出标题
         writer.write(list, true);
 ​
         // 设置响应头,指定内容类型和文件名
         response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
         String fileName = URLEncoder.encode("下载信息", "UTF-8");
         response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
 ​
         // 获取响应的输出流
         ServletOutputStream out = response.getOutputStream();
         // 将 ExcelWriter 中的数据刷新到输出流中
         writer.flush(out, true);
         // 关闭 ExcelWriter,释放内存
         writer.close();
         // 关闭输出流
         IoUtil.close(System.out);
     }

Controller层接收一个额外参数response,然后我们在Service实现类中,先查询需要导入的数据,然后生成表头,最后写入Excel文件。

四、前端

本节主要记录在进行前端开发时所用到的一些插件

4.1 js-file-download

js-file-download 是一个用于在浏览器中触发文件下载的 JavaScript 库。它可以方便地将数据(如文本、JSON、二进制数据等)下载为文件,而无需服务器端的支持。这个库非常适合用于前端应用程序中需要生成和下载文件的场景。

4.1.1安装
 npm install js-file-download
 # 或者
 yarn add js-file-download
4.2.2 使用
 <template>
   <div>
     <el-button type="success" @click="handleExport">
             导出
             <el-icon><Download /></el-icon>
     </el-button>
   </div>
 </template>
 ​
 <script setup>
 import fileDownload from 'js-file-download';
 ​
 const handleExport = async () => {
   try {
     const res = await axios.get(
       `/adminapi/user/export?userName=${searchValue.value.userName}&roleName=${searchValue.value.roleName}`,
       {
         responseType: "blob",
       }
     );
     // console.log(res);
     fileDownload(
       res.data,
       "注册用户列表" + new Date().toLocaleString() + ".xlsx"
     );
     ElMessage.success("导出成功");
   } catch (error) {
     ElMessage.error("导出失败");
   }
 };
 </script>
 ​
 <style scoped>
 /* 添加你的样式 */
 </style>

这段代码使用 axios 发送 GET 请求以获取用户列表的 Excel 文件,并使用 js-file-download 库在浏览器中触发文件下载,同时显示导出成功或失败的消息。

4.2 tsparticles

tsparticles 是一个用于创建和管理粒子动画效果的 JavaScript 库。它可以在网页上生成各种粒子效果,如雪花、星空、气泡等,适用于背景动画、交互效果等场景。这个库非常灵活,支持多种配置和自定义效果。

4.2.1 安装
 npm install tsparticles
 # 或者
 yarn add tsparticles
4.2.2 使用
 <template>
   <vue-particles
     id="tsparticles"
     @particles-loaded="particlesLoaded"
     :options="tsOption"
   />
 </template>
 ​
 <script setup>
 import tsOption from "@/utils/tspartice.js";
 ​
 // 粒子效果
 const particlesLoaded = async (container) => {
   console.log("Particles container loaded", container);
 };
 </script>
 ​
 <style scoped>
 ​
 </style>

其中,tspartice.js文件 (由于内容过多显示部分):

 const option = {
   autoPlay: true,
   background: {
     color: {
       value: "#043564",
     },
     image: "url('./bg.png')",
     position: "0 50%",
     repeat: "no-repeat",
     size: "100%",
     opacity: 1,
   },
   backgroundMask: {
     composite: "destination-out",
     cover: {
       color: {
         value: "#fff",
       },
       opacity: 1,
     },
     enable: false,
   },
   clear: true,
   defaultThemes: {},
   delay: 0,
   fullScreen: {
     enable: true,
     zIndex: 0,
   },
   ...
 };
 ​
 export default option;
 ​
4.3 dayjs

dayjs 是一个轻量级的 JavaScript 日期库,具有与 Moment.js 类似的 API,但体积更小,性能更高。它用于解析、验证、操作和显示日期和时间。

  1. 解析日期:支持多种日期格式的解析。

  2. 格式化日期:可以将日期格式化为各种字符串格式。

  3. 操作日期:支持日期的加减操作。

  4. 本地化:支持多种语言的本地化。

  5. 插件系统:通过插件扩展功能,如相对时间、UTC、时区等。

4.3.1 安装
 npm install dayjs
 # 或者
 yarn add dayjs
4.3.2 使用
import dayjs from 'dayjs';
 ​
 // 解析日期
 const now = dayjs();
 console.log(now.format()); // 当前日期和时间
 ​
 // 格式化日期
 const formattedDate = now.format('YYYY-MM-DD');
 console.log(formattedDate); // 例如:2023-10-01
 ​
 // 操作日期
 const nextWeek = now.add(7, 'day');
 console.log(nextWeek.format('YYYY-MM-DD')); // 例如:2023-10-08
 ​
 // 本地化
 import 'dayjs/locale/zh-cn';
 dayjs.locale('zh-cn');
 console.log(now.format('MMMM D, YYYY')); // 例如:十月 1, 2023
4.4 其他插件
4.4.1 ECharts

主要功能: ECharts 是一个基于 JavaScript 的图表库,支持多种图表类型(如折线图、柱状图、饼图等),并提供丰富的交互功能。适合用于可视化数据展示。

安装方法:

npm install echarts --save
4.4.2 Element Plus 和 @element-plus/icons-vue

主要功能:

  • Element Plus: 一个基于 Vue 3 的 UI 组件库,提供了一系列高质量的组件,帮助开发者快速构建用户界面。

  • @element-plus/icons-vue: 提供 Element Plus 组件库的图标集,方便在项目中使用。

安装方法:

 npm install element-plus --save
 npm install @element-plus/icons-vue --save
4.4.3 Vue Router

主要功能: Vue Router 是 Vue.js 官方的路由管理器,允许开发者创建单页应用程序(SPA)时实现页面导航。支持动态路由匹配、嵌套路由等功能。

安装方法:

 npm install vue-router@4 --save
4.4.4 Pinia 和 pinia-plugin-persistedstate

主要功能:

  • Pinia: Vue 3 的状态管理库,提供了简单易用的 API 和类型支持,成为 Vuex 的替代品。

  • pinia-plugin-persistedstate: Pinia 的一个插件,用于将状态持久化存储到本地存储或其他存储方案,以便在页面刷新后保持状态。

安装方法:

 npm install pinia --save
 npm install pinia-plugin-persistedstate --save
4.4.5 @amap/amap-jsapi-loader

主要功能: AMap JavaScript API Loader 是一个加载高德地图 JavaScript API 的工具,简化了 API 的引入和使用,使得开发者能够方便地在 Vue 项目中集成高德地图服务。

安装方法:

 npm install @amap/amap-jsapi-loader --save
4.5 页面展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/884371.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC中的维纳滤波器实现详解:基于决策导向的SNR估计

目录 1. 维纳滤波器的基本原理2. WebRTC中的维纳滤波器实现3. 代码逐步剖析4. 总结 在WebRTC的噪声抑制模块中&#xff0c;维纳滤波器&#xff08;Wiener Filter&#xff09;是一种非常常见且重要的滤波器&#xff0c;用于提高语音信号的清晰度并抑制背景噪声。本文将详细解释维…

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对&#xff0c;window系统中的换行符与linux对不上&#xff0c;因…

AI芯片WT2605C赋能厨房家电,在线对话操控,引领智能烹饪新体验:尽享高效便捷生活

在智能家居的蓬勃发展中&#xff0c;智能厨电作为连接科技与生活的桥梁&#xff0c;正逐步渗透到每一个现代家庭的厨房中。蒸烤箱作为智能厨电的代表&#xff0c;以其丰富的功能和高效的性能&#xff0c;满足了人们对美食的多样化追求。然而&#xff0c;面对众多复杂的操作功能…

OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI DSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI&#xff08;Display Serial Interface&#x…

小阿轩yx-案例:代码管理系统简介与部署

小阿轩yx-案例&#xff1a;代码管理系统简介与部署 前言 开发一个项目时&#xff0c;如果只有几十行代码或几百行代码时维护还算简单&#xff0c;但是代码数量达到一定程度或两三个人共同开发一个项目时&#xff0c;就很容易会出现代码混乱、冲突、排错难等问题。代码编写完成…

【软件测试】如何设计测试用例? 设计测试用例常用的方法.

目录 一.什么是测试用例?二.总体设计测试用例的万能公式.2.1 功能性能界面兼容易用安全2.2 弱网测试2.3 安装卸载测试. 三. 常用设计具体测试用例的方法3.1 等价类3.2 边界值3.3 正交法3.3.1 正交表3.3.2 如何设计正交表,并根据正交表编写测试用例 3.4 判定表法3.4.1 根据判定…

828华为云征文 | 解锁高效项目管理,Zentao在华为云Flexusx容器化部署与应用指南

前言 在当今快速迭代的商业环境中&#xff0c;高效且灵活的项目管理成为企业竞争力的关键。华为云Flexusx实例&#xff0c;以其灵活的vCPU内存配比、热变配功能及按需计费模式&#xff0c;为项目管理软件如Zentao的部署提供了理想平台。Flexusx实例采用按需计费的灵活定价模式&…

Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理

文章目录 Ansible流程控制介绍1. 条件判断2. 循环3. 循环控制4. 错误处理5. 包含和导入6. 块和异常处理7. 角色的流程控制*include_tasks、import_tasks_include之间的区别 条件语句再细说且、或、非、是模糊条件when指令的详细使用方法 循环语句再细说如何使用使用item变量结合…

甄选范文“论软件需求管理”,软考高级论文,系统架构设计师论文

论文真题 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互关联,初始需求导出的同时就要形成需求管理规划,一旦启动了软件开发过程,需求管理活动就紧密相伴。 需求管理过程中主要包含变更控制、版本控制、需求跟踪和需求状态跟踪等4项活…

???Ansible-使用roles

文章目录 一、Ansible的内置的或官方推荐创建的目录及文件介绍roles目录解释1、roles/自定义角色名目录下2、roles/自定义角色名目录/tasks目录下3、roles/自定义角色名目录/handlers目录下4、roles/自定义角色名目录/templates目录下5、roles/自定义项目名目录/files目录下6、…

SSM超市售卖管理系统-计算机毕业设计源码23976

目 录 摘要 Abstract 1 绪论 1.1研究的背景和意义 1.2研究内容 1.3论文结构与章节安排 2 开发技术介绍 2.1 SSM框架 2.2 MySQL数据库 3 超市售卖管理系统系统分析 3.1 可行性分析 3.2 系统流程分析 3.2.1 数据流程 3.3.2 业务流程 3.3 系统功能分析 3.3.1 功…

港科夜闻 | 香港科大颁授荣誉大学院士予五位杰出人士

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大颁授荣誉大学院士予五位杰出人士。香港科大9月24日向五位杰出人士颁授荣誉大学院士&#xff0c;他们分别为包弼德教授、简吴秋玉女士、高秉强教授、吴永顺先生及容永祺博士(按姓氏英文字母排序)。荣誉大学院士颁…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核&#xff0c;可能是版本问题&#xff0c;一直报错&#xff0c;无法成功编译。然后换成NXP官方Linux内核6.6版本&#xff0c;初始编译虽然也报各种错&#xff0c;但都是缺少库或相关工具&#xff0c;全部安装后就可以成功编译出镜像了&#…

WiFi无线连接管理安卓设备工具:WiFiADB

介绍 WiFi ADB 使您能够通过 WiFi TCP/IP 连接直接在设备上轻松调试和测试 Android 应用&#xff0c;无需使用 USB 数据线。在启用 WiFi 上的 ADB 后&#xff0c;打开控制台将电脑连接到设备。 手机和电脑在同一个WiFi然后电脑上运行adb connect x.x.x.x:x命令即可 下载 谷…

IoT网关的主要功能有哪些?天拓四方

在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;技术凭借其独特的优势&#xff0c;逐渐在各个领域展现出强大的生命力。而IoT网关&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;其在物联网体系中的作用愈发凸显。 一、数据聚合与预处理…

leetcode每日一题day15(24.9.25)——公司命名

思路&#xff1a;首先如果没有相同的后缀&#xff0c;则无论只要不是相同的首字母交换都不会出现重复情况&#xff0c;如果有重复后缀&#xff0c;则还需多增加个不能和&#xff0c;首字符与另一相同后缀字串的首字符相同的字串交换。 主要矛盾已经明确&#xff0c;则可对矛盾…

Redis集群的两种方式

1.Redis集群 1.1 搭建主从集群 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写的分离。一般情况下&#xff0c;主节点负责写操作&#xff0c;从节点负责读操作。而从节点如何得知数据呢&#xff…

SpringBoot文档管理系统:架构与功能

第2章相关技术 2.1 Java技术介绍 Java语言擅长开发互联网类应用和企业级应用&#xff0c;现在已经相当的成熟&#xff0c;而且也是目前使用最多的编程语言之一。Java语言具有很好的面向对象性&#xff0c;可以符合人的思维模式进行设计&#xff0c;封装是将对象的属性和方法尽可…

【4.6】图搜索算法-DFS和BFS解合并二叉树

一、题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是 如果两个节点重叠&#xff0c;那么将他们的 值相加作为节点合并后的新值&#xff0c;否则不为 NUL L…

DERT目标检测源码流程图main.py的执行

DERT目标检测源码流程图main.py的执行 官网预测脚本 补充官网提供的预测部分的代码信息。 from PIL import Image import requests import matplotlib.pyplot as pltimport torch from torch import nn from torchvision.models import resnet50 import torchvision.transform…