云项目实战

云项目是现在工作室最常见的一种项目开发形式了,但是对于码农来说,云项目只是知道,但是如何部署,开发,配置环境等操作,是否能拿得出来呢?这是一个问题,最起码对博主来说,开发五六年了,还是第一次自己从框架到项目部署完整的操作呢,下面跟着博主的节奏,开始刷野吧!

第一步,项目框架搭建

项目框架的搭建,其实在开发中还是很少涉及的,主要是对于项目技术的选型以及对于pom文件的依赖版本关系的处理,还有就是技术面的广泛程度吧,技术含量对于博主来说,浅方面的还是很简单的。下面我就用我自己开发的一个工作项目来简单举例一下

  1. 第一是在IDEA 中建立一个springBoot 的项目,具体建立的步骤就不在赘述了,大家相信都会。
  2. 第二就是建立好项目之后,我们需要引入一些常见的依赖,比如mybaits puls的和lombok等一些依赖。下面贴一下我比较常用的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>vote-project</artifactId><version>0.0.1-SNAPSHOT</version><name>vote-project</name><description>vote-project</description><properties><java.version>17</java.version></properties><dependencies>
<!--		jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<!--		mybatis puls--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version><exclusions><exclusion><artifactId>mybatis-spring</artifactId><groupId>org.mybatis</groupId></exclusion></exclusions></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency>
<!--		msyql--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 引入 swagger--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.2</version></dependency><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>2.0.2</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.3-jre</version></dependency><dependency><groupId>net.sourceforge.nekohtml </groupId><artifactId>nekohtml </artifactId><version>1.9.22 </version></dependency><dependency><groupId>org.xmlunit</groupId><artifactId>xmlunit-core</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><!-- jwt --><dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version>9.31</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.26</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
  1. pom文件的依赖一定要注意版本的区别,我这边使用的是JDK17的版本,对于的版本也需要提高,因为springBoot3.x的版本最低要求是17,所以大家结合综合考虑,在pom依赖中,也添加了安全框架security和jwt来实现登录功能,大家如果不需要可以自行删除
  2. 引入mybaitpuls功能后,需要进行配置才可正常使用,配置文件如下
package com.example.voteproject.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
public class MybatisPlusConfig {/*** 加载分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}@Primary@Bean@ConfigurationProperties("mybatis-plus")public MybatisPlusProperties mybatisPlusProperties() {return new MybatisPlusProperties();}
}

这是固定写法,不需要更改
5. 上面配置了security和jwt,所以也附上一份配置代码,仅供参考哈

package com.example.voteproject.config;import lombok.Data;import java.util.List;/*** jwt实体数据*/
@Data
public class Claims {/*** 主题*/private String sub;/*** 签发时间*/private Long iat;/*** 过期时间*/private Long exp;/*** JWT ID*/private String jti;/*** 用户id*/private String userId;/*** 用户名*/private String username;/*** 用户状态(1:正常;0:禁用)*/private String status;/*** 用户角色*/private List<String> roles;/*** 权限列表*/private List<String> permissions;public Claims(String sub, Long iat, Long exp, String jti, String userId, String username, String status, List<String> roles, List<String> permissions) {this.sub = sub;this.iat = iat;this.exp = exp;this.jti = jti;this.userId = userId;this.username = username;this.status = status;this.roles = roles;this.permissions = permissions;}public String getSub() {return sub;}public void setSub(String sub) {this.sub = sub;}public Long getIat() {return iat;}public void setIat(Long iat) {this.iat = iat;}public Long getExp() {return exp;}public void setExp(Long exp) {this.exp = exp;}public String getJti() {return jti;}public void setJti(String jti) {this.jti = jti;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public List<String> getRoles() {return roles;}public void setRoles(List<String> roles) {this.roles = roles;}public List<String> getPermissions() {return permissions;}public void setPermissions(List<String> permissions) {this.permissions = permissions;}public static ClaimsBuilder builder() {return new ClaimsBuilder();}public static final class ClaimsBuilder {//主题private String sub;//签发时间private Long iat;//过期时间private Long exp;//JWT IDprivate String jti;//用户idprivate String userId;//用户名private String username;private String status;//用户角色private List<String> roles;private List<String> permissions;private ClaimsBuilder() {}public ClaimsBuilder sub(String sub) {this.sub = sub;return this;}public ClaimsBuilder iat(Long iat) {this.iat = iat;return this;}public ClaimsBuilder exp(Long exp) {this.exp = exp;return this;}public ClaimsBuilder jti(String jti) {this.jti = jti;return this;}public ClaimsBuilder userId(String userId) {this.userId = userId;return this;}public ClaimsBuilder username(String username) {this.username = username;return this;}public ClaimsBuilder status(String status) {this.status = status;return this;}public ClaimsBuilder roles(List<String> roles) {this.roles = roles;return this;}public ClaimsBuilder permissions(List<String> permissions) {this.permissions = permissions;return this;}public Claims build() {return new Claims(this.sub,this.iat,this.exp,this.jti,this.userId,this.username,this.status,this.roles,this.permissions);}}
}
package com.example.voteproject.config;public interface CommonConstants {String STATUS_DEL = "-1";String STATUS_NORMAL = "1";String STATUS_LOCK = "9";Long MENU_TREE_ROOT_ID = -1L;String MENU = "0";String UTF8 = "UTF-8";String CONTENT_TYPE = "application/json; charset=utf-8";String FRONT_END_PROJECT = "pig-ui";Integer SUCCESS = 0;Integer FAIL = 1;String CURRENT = "current";String SIZE = "size";String REQUEST_START_TIME = "REQUEST-START-TIME";int MIN_PAGE = 0;int MAX_LIMIT = 999;int DEFAULT_PAGE = 1;int DEFAULT_LIMIT = 10;String PAGE_KEY = "page";String PAGE_LIMIT_KEY = "limit";String PAGE_SORT_KEY = "sort";String PAGE_ORDER_KEY = "order";
}
package com.example.voteproject.config;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.example.voteproject.utils.JWTUtil;
import com.example.voteproject.utils.ResponseEntity;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;import java.io.IOException;
import java.util.logging.Logger;/*** @author : zy* <p>* 自定义jwt全局过滤器* 1.没有携带token放行* 2.携带token,将用户信息添加至security上下文中*/
@Component
public class JWTAuthenticationFilter extends OncePerRequestFilter {private static final Logger logger = Logger.getLogger(JWTAuthenticationFilter.class.toString());@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {//获取当前请求的uriString uri = request.getRequestURI();logger.info("请求路径:" + uri);//判断是否是认证请求路径//是:直接放行if (uri.endsWith("/auth/login") || uri.endsWith("/auth/logout") || uri.startsWith("/swagger-ui")|| uri.endsWith("doc.html") || uri.startsWith("/webjars/css") || uri.startsWith("/webjars/js")|| uri.startsWith("/v3/api-docs") || uri.startsWith("/favicon.ico")|| uri.startsWith("/user/login")|| uri.startsWith("/user/saveOrUpdateEvents")|| uri.startsWith("/voteMove")|| uri.startsWith("**/*.html") || uri.endsWith("/webjars/springfox-swagger-ui")|| uri.startsWith("/swagger-resources")) {filterChain.doFilter(request, response);return;}//否:获取请求头中携带的tokenString authorization = request.getHeader("Authorization");logger.info("携带authorization:" + authorization);//判断是否携带token//否:抛出异常if (StringUtils.isBlank(authorization)) {logger.info("未查询到token");return;}String realToken = authorization.replace("Bearer ", "");//是:校验jwt有效性ResponseEntity responseE = JWTUtil.verifyToken(realToken);Claims data = (Claims) responseE.getData();if (ObjectUtils.isEmpty(data)) {logger.info("token失效");return;}// 验证token对象是否存在及验证token是否过期if (ObjectUtils.isEmpty(data)) {logger.info("token无效或者已经失效");return;}if (responseE.getCode() != 200) {logger.info("token无效");return;}filterChain.doFilter(request, response);}
}
package com.example.voteproject.config;import com.example.voteproject.model.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;import java.util.ArrayList;
import java.util.Collection;@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginUser implements UserDetails {private User user;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return new ArrayList<>();}@Overridepublic String getPassword() {return user.getPassword();}@Overridepublic String getUsername() {return user.getName();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}
package com.example.voteproject.config;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.voteproject.mapper.UserMapper;
import com.example.voteproject.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;/*** @author zy*/
@Configuration
public class SecurityConfig {@Autowiredprivate UserMapper userMapper;@Autowiredprivate JWTAuthenticationFilter jwtAuthenticationFilter;@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic UserDetailsService userDetailsService() {return username -> {LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(User::getName,username);User user = userMapper.selectOne(lambdaQueryWrapper,false);if (user == null) {throw new UsernameNotFoundException("用户不存在");}return new LoginUser(user);};}@Beanpublic AuthenticationProvider authenticationProvider() {DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();authenticationProvider.setUserDetailsService(userDetailsService());authenticationProvider.setPasswordEncoder(passwordEncoder());authenticationProvider.setHideUserNotFoundExceptions(false);return authenticationProvider;}@Beanpublic AuthenticationManager authenticationManager() {return new ProviderManager(authenticationProvider());}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authenticationProvider(authenticationProvider()).addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class).authorizeHttpRequests().requestMatchers(HttpMethod.OPTIONS).permitAll().requestMatchers("/**").permitAll().requestMatchers("/auth/login").permitAll().requestMatchers("/auth/logout").permitAll().requestMatchers("/swagger-ui.html").permitAll().requestMatchers("/doc.html").permitAll().requestMatchers("/webjars/springfox-swagger-ui/**").permitAll().requestMatchers("/swagger-resources").permitAll().requestMatchers("/v3/api-docs/**").permitAll().requestMatchers("/favicon.ico").permitAll().requestMatchers("/error").permitAll().anyRequest().authenticated();return http.build();}
}
package com.example.voteproject.utils;import com.alibaba.fastjson2.JSON;
import com.example.voteproject.config.Claims;
import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;import java.text.ParseException;
import java.util.Date;
import java.util.UUID;/*** @author : zy* JWT工具类*/
public class JWTUtil {//密钥private static final String secret = "xpo1xgnl5ksinxkgu1nb6vcx3zaq1wsxvv";// 1000 * 60 * 60 * 24 * 1  一天//过期时间12h,单位毫秒private static final long EXPIRE = 1000 * 60 * 60 * 12;// 测试时为1min// private static final long EXPIRE = 1000 * 60 * 1;/*** 创建token** @param claims 用户信息* @return 令牌*/public static String createToken(Claims claims) {try {//对密钥进行签名JWSSigner jwsSigner = new MACSigner(secret);//准备JWS headerJWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build();//准备JWS payloadclaims.setJti(UUID.randomUUID().toString());claims.setIat(new Date().getTime());claims.setExp(new Date(System.currentTimeMillis() + EXPIRE).getTime());Payload payload = new Payload(JSON.toJSONString(claims));//封装JWS对象JWSObject jwsObject = new JWSObject(jwsHeader, payload);//签名jwsObject.sign(jwsSigner);return jwsObject.serialize();} catch (KeyLengthException e) {e.printStackTrace();} catch (JOSEException e) {e.printStackTrace();}return null;}/*** 验证并获取用户信息** @param token 令牌* @return 解析后用户信息*/public static ResponseEntity verifyToken(String token) {JWSObject jwsObject;ResponseEntity response = new ResponseEntity<>();try {jwsObject = JWSObject.parse(token);//HMAC验证器JWSVerifier jwsVerifier = new MACVerifier(secret);if (!jwsObject.verify(jwsVerifier)) {response.setCode(10008).setErrorMsg("token无效");return response;}String payload = jwsObject.getPayload().toString();Claims claims = JSON.parseObject(payload, Claims.class);if (claims.getExp() < new Date().getTime()) {response.setCode(10008).setErrorMsg("token无效");return response;}response.setCode(200).setData(claims).setMessage("解析成功");return response;} catch (ParseException | JOSEException e) {e.printStackTrace();}response.setCode(10008).setErrorMsg("token无效");return response;}
}
package com.example.voteproject.utils;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import java.util.HashMap;/*** @author zy*/
@Schema(description = "返回响应数据")
@Data
public class ResponseEntity<T> {@Schema(description = "编码")private int code = 200;@Schema(description = "基本信息")private String message = "成功";@Schema(description = "错误信息")private String errorMsg = "";@Schema(description = "返回对象")private T data;/*** 成功状态码*/public static final Integer SUCCESS = 200;/*** 失败状态码*/public static final Integer ERROR = 500;private static HashMap<Integer, String> ERROR_CODE = new HashMap<Integer, String>() {{put(100, "暂无数据");put(200, "成功");put(300, "失败");put(500, "失败状态码");put(10000, "通用错误");///用户类put(10001, "用户名或密码错误");put(10002, "登录状态已过期");put(10003, "注册用户已存在");put(10004, "账号已被锁定,请在一小时后重试");put(10005, "旧密码错误");put(10006, "用户名已存在");put(10007, "ip没有权限");put(10008, "token无效");put(10009, "token失效");///操作权限类put(20001, "无操作权限");///参数类put(30001, "非法参数");put(30002, "缺少必要参数");
//            数据操作类put(40001, "添加数据失败");put(40002, "更新数据失败");put(40003, "删除数据失败");put(40004, "添加数据失败,对象已经存在,建议修改或者删除");put(50001, "不存在的对象");put(99999, "无任何资源权限");put(990000, "系统错误");}};public ResponseEntity() {}public ResponseEntity(T date) {this.data = date;}public int getCode() {return code;}public ResponseEntity setCode(int code) {this.code = code;if (ERROR_CODE.containsKey(code)) {setMessage(ERROR_CODE.get(code));}return this;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public ResponseEntity setData(T data) {this.data = data;return this;}public static <T> ResponseEntity<T> def(Class<T> clazz) {return new ResponseEntity<>();}public ResponseEntity<T> ok() {setCode(200);return this;}public ResponseEntity<T> error(int code) {setCode(code);return this;}public ResponseEntity<T> message(String message) {setMessage(message);return this;}public ResponseEntity<T> data(T data) {setData(data);return this;}public ResponseEntity<T> back(int code, String message, T data) {setCode(code);setMessage(message);setData(data);return this;}public static <T> Boolean isError(ResponseEntity<T> r) {return !isSuccess(r);}public static <T> Boolean isSuccess(ResponseEntity<T> r) {return ResponseEntity.SUCCESS == r.getCode();}
}
package com.example.voteproject.enums;/*** 返回码** @author zeng*/
public enum ErrorCode {SUCCESS(0,"ok","") ,PARAMS_ERROR(40000,"请求参数错误",""),NULL_ERROR(40001,"请求参数为空",""),NO_LOGIN(40100,"未登录",""),NO_AUTH(40101,"暂无权限访问",""),SYSTEM_ERROR(50000,"系统内部异常","");//返回码private final int code;//操作响应信息private final String message;//响应信息的详细描述private final String description;//构造函数ErrorCode(int code, String message, String description) {this.code = code;this.message = message;this.description = description;}//get方法public int getCode() {return code;}public String getMessage() {return message;}public String getDescription() {return description;}
}

第二,阿里云配置

阿里云配置添加完成之后,需要去下载安装mysql ,jdk一类的环境,这个方便就不在赘述,其中进行配置端口开放连接外网的步骤,可以执行如下命令

无法连接mysql 服务可以通过使用下面命令解决
iptables -L -n
firewall-cmd --list-all
设置端口允许放行
firewall-cmd --add-port=3306/tcp
firewall-cmd --add-port=3306/tcp --permanent 

第三就是项目部署了

  1. 在idea中进行项目打包成jar包
  2. 第二是将jar包上传到服务器中
    启动jar包
nohup java -jar jar包名 

如果打印日志可以使用如下命令

nohup java -jar jar包名 >log.txt&

查看是否运行成功

ps -ef | grep java

在防护墙中开发端口,然后在阿里云安全组中添加开放端口即可使用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在ubuntu22.04上unsupported SSL backend ‘openssl‘. supported SSL backends: gnutls

在 Ubuntu 22.04 上遇到 Git 报告 “unsupported SSL backend ‘openssl’. supported SSL backends: gnutls” 的错误&#xff0c;通常是因为 Git 客户端被配置为尝试使用不支持的 SSL 后端。Ubuntu 的 Git 包默认使用 GnuTLS。这个问题可能是由于全局 Git 配置错误导致的&…

旅游系统-软件与环境

一. 软件 1.Navicat、phpstudy、Idea、Vsode 参考 网盘链接 二.配置文件 1.NodeJS、JDK、Mysql 参考 网盘链接 注意点&#xff1a; 1.Mysql 切记需要环境变量配置 2.数据库密码要好记点的&#xff0c;别乱设 3.环境变量配置的路径要能找到 三.安装运行 1.下载网盘内的软件&am…

Linux docker1--环境及docker安装

一、基础环境要求 Docker分为ce版本&#xff08;免费&#xff0c;试用7个月&#xff09;和ee版本&#xff08;收费&#xff09;。 最低配置要求&#xff1a;64位操作系统&#xff0c;centOS 7及以上&#xff0c;内核版本不低于3.10 二、部署docker 1、查看服务的基础环境是否满…

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

文章作者&#xff1a;ajun 随着文档处理需求的增加&#xff0c;格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性&#xff0c;将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件&#xff0c;提供了这样的转换功…

C语言数据结构与算法笔记(排序算法)

排序算法 基础排序 冒泡排序 核心为交换&#xff0c;通过不断进行交换&#xff0c;将大的元素一点一点往后移&#xff0c;每一轮最大的元素排到对应的位置上&#xff0c;形成有序。 设数组长度为N&#xff0c;过程为: 共进行N轮排序每一轮排序从数组的最左边开始&#xff0…

Django templates 存放html目录

模板 一概述 模板由两部分组成&#xff0c;一部分是HTML代码&#xff0c;一部分是逻辑控制代码&#xff08;变量&#xff0c;标签&#xff0c;过滤器&#xff09; 作用&#xff1a;可以通过一些逻辑控制代码减少一些重复的操作更快速的生成HTML代码&#xff0c;并且实现简单的…

基于Spring Boot的宿舍管理系统

摘 要 随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建宿舍管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种楼宇信息、宿舍信息、宿舍安排、缺勤信息…

pyav 处理 rtsp 视频流 options 参数选项

背景 最近接到一个老项目&#xff0c;算法开发的python代码&#xff0c;去拉取视频流&#xff0c;拿出来解析 里面用到了pyav&#xff0c;这个不是纯的python库&#xff0c;里面是加了其他东西的 代码里面拉取视频流很多时候会超时&#xff0c;就想着去修改连接选项&#xff0…

mysql笔记:21. 演示脏读、不可重复读和幻读现象

文章目录 脏读1. 设置窗口B中事务的隔离级别2. 演示脏读3. 重新设置窗口B中事务的隔离级别4. 再次验证脏读 不可重复读1. 演示不可重复读2. 设置窗口B中事务的隔离级别3. 再次验证不可重复读 幻读1. 设置窗口B中事务的隔离级别2. 演示幻读3. 重新设置窗口B中事务的隔离级别4. 再…

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式&#xff1a; 序列号&#xff1a;通过SYN传给接收端&#xff0c;当SYN为1&#xff0c;表示请求建立连接&#xff0c;且设置序列号初值&#xff0c;后面没法送一次数据&#xff0c;就累加数据大小&#xff0c;保证包有序。 确认应答号&#x…

Prometheus修改默认数据存储时间

Prometheus的默认数据存储时间可以通过修改启动脚本中的相关参数来调整。具体来说&#xff0c;可以通过修改--storage.tsdb.retention.time参数来改变数据保留的时长。该参数决定了何时删除旧数据&#xff0c;默认为15天。如果需要延长数据保留时间&#xff0c;可以将该参数的值…

【机器学习】函数

sigmoid函数 import matplotlib.pyplot as plt import numpy as npdef sigmoid(x):return 1/(1np.exp(-x))def plot_sigmoid():# param:起点&#xff0c;终点&#xff0c;间距x np.arange(-10, 10, 0.1) #起点&#xff0c;终点&#xff0c;间距y sigmoid(x)plt.plot(x, y)plt…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Rect)

矩形绘制组件。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Rect(value?: {width?: string | number,height?: string | number,radius?: string | number | Array<s…

Sentinel基础使用

1. 概念解释 限流&#xff1a;对并发访问进行限速。限流的一些行为&#xff1a; 1. 拒绝服务&#xff1a;将多余的请求直接拒绝掉2.服务降级&#xff1a;降级甚至关闭后台的某些服务3.特权请求&#xff1a;在多租户或者对用户进行分级时&#xff0c;考虑让特权用户进行访问4.延…

得物java春训营(一面面经)

1.聊项目技术点。 2.java中的threadlocal有了解过吗&#xff1f;使用threadlocal要注意什么呢&#xff1f;&#xff08;平时也没用过&#xff0c;后来复盘的时候才知道有内存泄露的问题&#xff0c;面试官提示到了和线程池共用&#xff0c;最后也没答出来。&#xff09; 3.线程…

代码随想录算法训练营day25 | 216.组合总和III、17.电话号码的字母组合

目录 组合总和III思路解题方法复杂度Code 电话号码的字母组合思路解题方法复杂度Code 总结 组合总和III 链接: 组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列…

论文解析:V3D: Video Diffusion Models are Effective 3DGenerators

摘要&#xff1a; 自动三维生成最近引起了广泛关注。最近的方法大大加快了生成速度&#xff0c;但由于模型容量有限或三维数据&#xff0c;生成的物体通常不够精细。在视频扩散模型最新进展的推动下&#xff0c;我们引入了 V3D&#xff0c;利用预训练视频扩散模型的世界模拟能…

YOLOV5 部署:基于web网页的目标检测(本地、云端均可)

1、前言 YOLOV5推理的代码很复杂,大多数都是要通过命令行传入参数进行推理,不仅麻烦而且小白不便使用。 本章介绍的web推理,仅仅需要十几行代码就能实现本地推理,并且只需要更改单个参数就可以很方便的部署云端,外网也可以随时的使用 之前文章介绍了QT的可视化推理界面,…

Linux初识环境变量

&#x1f30e;环境变量【上】 文章目录&#xff1a; 环境变量 什么是环境变量 关于命令行参数 环境变量       简单了解       为什么需要环境变量       系统中其他环境变量 总结 前言&#xff1a; 环境变量是一种非常重要的概念&#xff0c;它们对于系统的…

TH-FBCQX2防爆气象站

TH-FBCQX2防爆气象站主要适用于易燃易爆、危险性高的场所。以下是其主要的适用领域&#xff1a; 石油与天然气行业&#xff1a;在石油和天然气的生产、储存和运输过程中&#xff0c;防爆气象站可以监测环境中的可燃气体浓度&#xff0c;并根据气象条件预测爆炸风险。同时&…