# 通用代码 **Repository Path**: josnma/universal-code ## Basic Information - **Project Name**: 通用代码 - **Description**: 通用代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-12 - **Last Updated**: 2025-10-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 通用代码--无脑使用 ## 1.前端 ### 1.1创建vue项目(最新版) ``` npm init vue@lateset ``` ### 1.2常用依赖安装 ``` # 加速镜像命令(单次使用) npm install express --registry=https://registry.npmmirror.com # axios npm install axios # Element_plus npm install element-plus --save ``` ### 1.3Element-plus使用流程 ``` 1.安装依赖 2.main.ts import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' app.use(ElementPlus) # ElementPlus 组件默认使用英语,配置使用中文 import zhCn from 'element-plus/es/locale/lang/zh-cn' app.use(ElementPlus, { locale: zhCn, }) ``` ### 1.4跨域配置 ``` # vite.config.js import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vite.dev/config/ export default defineConfig({ plugins: [ vue(), ], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } }, /** * 配置代理,解决跨域问题--以下代码仅在开发时使用 */ server:{ proxy:{ '/api':{ //获取路径中包含了/api的请求 target:'http://localhost:8080',//后台服务所在的源 changeOrigin : true,//修改源 rewrite: (path)=>path.replace(/^\/api/,'')// /api替换为‘’ 空字符串 } } } }) ``` ## 2.后端 ### 2.1常用依赖 ``` 4.0.0 org.springframework.boot spring-boot-starter-parent 3.3.1 17 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.mysql mysql-connector-j 8.0.31 org.mybatis.spring.boot mybatis-spring-boot-starter 3.0.3 org.springframework.boot spring-boot-starter-data-redis org.projectlombok lombok org.springframework.boot spring-boot-starter-validation com.auth0 java-jwt 4.4.0 com.github.pagehelper pagehelper-spring-boot-starter 1.4.6 com.aliyun.oss aliyun-sdk-oss 3.17.4 javax.xml.bind jaxb-api 2.3.1 javax.activation activation 1.1.1 org.glassfish.jaxb jaxb-runtime 2.3.3 org.springframework.boot spring-boot-maven-plugin ``` ### 2.2applications.yml ``` server: port: 8123 servlet: context-path: /api spring: application: name: chunqiu-picture-backend # 数据库配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/chunqiu_picture username: root password: 123456 servlet: multipart: max-file-size: 10MB mybatis-plus: configuration: map-underscore-to-camel-case: false # 仅在开发环境开启日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: isDelete # 全局逻辑删除的实体字段名 logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) # 接口文档配置 knife4j: enable: true openapi: title: "接口文档" version: 1.0 group: default: api-rule: package api-rule-resources: - com.josn.chunqiupicturebackend.controller # 对象存储配置(需要从腾讯云获取) cos: client: host: xx secretId: xx secretKey: xx region: xx bucket: xx ``` ### 2.3跨域配置类 ``` # CorsConfig.java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; //解决前后端为同一台机器时的跨域问题 @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { // 覆盖所有请求 registry.addMapping("/**") // 允许发送 Cookie .allowCredentials(true) // 放行哪些域名(必须用 patterns,否则 * 会和 allowCredentials 冲突) .allowedOriginPatterns("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .exposedHeaders("*"); } } ``` ### 2.4拦截器配置类 使用方法:LoginInterceptor.java 和 WebConfig.java搭配使用 ``` # WebConfig.java import com.josn.interceptors.LoginInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/register","/user/login"); } } ``` ``` # LoginInterceptor.java import com.josn.utils.JwtUtil; import com.josn.utils.ThreadLocalUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import java.util.Map; @Component public class LoginInterceptor implements HandlerInterceptor { @Autowired private StringRedisTemplate stringRedisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{ //获取令牌 String token = request.getHeader("Authorization"); //验证令牌 try { //从redis中获取相同的token ValueOperations operations=stringRedisTemplate.opsForValue(); String redisToken=operations.get(token); if (redisToken==null){ throw new RuntimeException(); } Map claims= JwtUtil.parseToken(token); //把业务数据存储到ThreadLocal ThreadLocalUtil.set(claims); //放行 return true; }catch (Exception e){ //http响应状态码为401 response.setStatus(401); //拦截 return false; } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //清空ThreadLocal中的数据 ThreadLocalUtil.remove(); } } ``` ### 2.5用户角色常量类 ``` # UserConstant.java /** * 用户常量 */ public interface UserConstant { /** * 用户登录态键 */ String USER_LOGIN_STATE = "user_login"; // region 权限 /** * 默认角色 */ String DEFAULT_ROLE = "user"; /** * 管理员角色 */ String ADMIN_ROLE = "admin"; // endregion } ``` ### 2.6错误码枚举类 ``` # ErrorCode.java import lombok.Getter; @Getter public enum ErrorCode { SUCCESS(0, "ok"), PARAMS_ERROR(40000, "请求参数错误"), NOT_LOGIN_ERROR(40100, "未登录"), NO_AUTH_ERROR(40101, "无权限"), NOT_FOUND_ERROR(40400, "请求数据不存在"), FORBIDDEN_ERROR(40300, "禁止访问"), SYSTEM_ERROR(50000, "系统内部异常"), OPERATION_ERROR(50001, "操作失败"); /** * 状态码 */ private final int code; /** * 信息 */ private final String message; ErrorCode(int code, String message) { this.code = code; this.message = message; } } ``` ### 2.7结果类 ``` # Result.java import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; //统一响应结果 @NoArgsConstructor @AllArgsConstructor @Data public class Result { private Integer code;//业务状态码 0-成功 1-失败 private String message;//提示信息 private T data;//响应数据 //快速返回操作成功响应结果(带响应数据) public static Result success(E data) { return new Result<>(0, "操作成功", data); } //快速返回操作成功响应结果 public static Result success() { return new Result(0, "操作成功", null); } public static Result error(String message) { return new Result(1, message, null); } } ``` ### 2.8ThreadLocal 工具类 ``` # ThreadLocalUtil.java import java.util.HashMap; import java.util.Map; /** * ThreadLocal 工具类 */ @SuppressWarnings("all") public class ThreadLocalUtil { //提供ThreadLocal对象 private static final ThreadLocal THREAD_LOCAL = new ThreadLocal(); //根据键获取值 public static T get(){ return (T) THREAD_LOCAL.get(); } //存储键值对 public static void set(Object value){ THREAD_LOCAL.set(value); } //清除ThreadLocal 防止内存泄漏 public static void remove(){ THREAD_LOCAL.remove(); } } ``` ### 2.9JWT工具类 ``` import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import java.util.Date; import java.util.Map; public class JwtUtil { private static final String KEY = "hongyu"; //接收业务数据,生成token并返回 public static String genToken(Map claims) { return JWT.create() .withClaim("claims", claims) .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60))//设置失效时间为1小时 .sign(Algorithm.HMAC256(KEY)); } //接收token,验证token,并返回业务数据 public static Map parseToken(String token) { return JWT.require(Algorithm.HMAC256(KEY)) .build() .verify(token) .getClaim("claims") .asMap(); } } ``` ### 2.10阿里云oss配置类 ``` import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import java.io.InputStream; public class AliOssUtil { // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。 private static final String ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com"; private static final String ACCESS_KEY_ID="LTAI5tPuAUyCajB5Gz8BPLZh"; private static final String ACCESS_KEY_SECRET="nqJtPMQ9v3Df3u936OdzAlS8ft7Cco"; // 填写Bucket名称,例如examplebucket。 private static final String BUCKET_NAME = "bigevent-mybatis"; public static String uploadFile(String objectName, InputStream in) throws Exception { // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(ENDPOINT,ACCESS_KEY_ID,ACCESS_KEY_SECRET); String url=""; try { // 填写字符串。 String content = "Hello OSS,你好世界"; // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName,in); // 上传字符串。 PutObjectResult result = ossClient.putObject(putObjectRequest); // url组成:https://bucket节点名称.区域节点/objectName url="https://"+BUCKET_NAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName; } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } return url; } } ``` ### 2.11腾讯云cos配置类 ``` ``` ## 3.密钥配置 ### 3.1腾讯云cos密钥配置 ``` ``` ### 3.2阿里云密钥配置 ``` ```