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

如何用社交网站开发客户网站设计是不是会要用代码做

如何用社交网站开发客户,网站设计是不是会要用代码做,手机投资app平台,免费做手机网站有哪些项目初始化脚手架搭建 仓库地址 easy-web: 一个快速初始化SpringBoot项目的脚手架 (gitee.com) 目前这个项目还是个单体项目#xff0c;后续笔者有时间可能会改造成父子工程项目#xff0c;将通用模块抽象出来#xff0c;有兴趣的小伙伴也可以自行 CV 改造。 1、项目初始化…项目初始化脚手架搭建 仓库地址 easy-web: 一个快速初始化SpringBoot项目的脚手架 (gitee.com) 目前这个项目还是个单体项目后续笔者有时间可能会改造成父子工程项目将通用模块抽象出来有兴趣的小伙伴也可以自行 CV 改造。 1、项目初始化 1.1 创建一个 Spring Boot 新项目 1.2 选择项目版本和依赖 1.3 该配置文件为 .yml 格式 2、数据库表设计 用户表注以下字符集是 MySQL 8 版本的 CREATE TABLE user (id bigint NOT NULL AUTO_INCREMENT COMMENT id,user_account varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 登录账号,user_password varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 密码,user_name varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 用户昵称,user_avatar varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 用户头像,gender tinyint DEFAULT 0 COMMENT 性别0 - 未知1 - 男2 -女,phone varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 手机号码,email varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 邮箱,user_role varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT user COMMENT 用户角色user - 普通用户admin - 管理员,user_status varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 0 COMMENT 用户状态0 - 正常1 - 禁用,create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,is_delete tinyint NOT NULL DEFAULT 0 COMMENT 是否删除0 - 未删1 - 已删,PRIMARY KEY (id) USING BTREE,UNIQUE KEY uni_userAccount (user_account) USING BTREE ) ENGINEInnoDB AUTO_INCREMENT26 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci ROW_FORMATDYNAMIC COMMENT用户表;3、Mybatis X 插件自动生成代码 1.1 1.2 1.3 取消勾选 toString 1.4 生成的结果 将需要的代码拖进对应的软件包即可导入 mybatis-plus 依赖 dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.1/version/dependency选项解释 4、定义统一错误码 这是一个枚举类用于定义系统中可能出现的错误码和对应的错误信息。 枚举值必须是私有且不可变 可以参考下阿里巴巴 Java 开发手册 https://github.com/alibaba/p3c public enum ErrorCode {SUCCESS(0, ok),PARAMS_ERROR(40000, 请求参数错误),NOT_LOGIN_ERROR(40100, 未登录),NO_AUTH_ERROR(40101, 无权限),NOT_FOUND_ERROR(40400, 请求的数据不存在),FORBIDDEN_EEOR(40300, 禁止访问),SYSTEM_ERROR(50000, 系统内部异常),OPERTATION_ERROR(50001, 操作失败);/*** 状态码*/private final int code;/*** 信息*/private final String message;ErrorCode(int code, String message) {this.code code;this.message message;}/*** 获取错误状态码** return int*/public int getCode() {return code;}/*** 获取错误响应信息** return {code String}*/public String getMessage() {return message;}}5、创建通用返回类 Data public class BaseResponseT implements Serializable {private int code; // 状态码private T data; // 数据private String message; // 响应信息public BaseResponse(int code, T data, String message) {this.code code;this.data data;this.message message;}public BaseResponse(int code, T data) {this(code, data, );}public BaseResponse(ErrorCode errorCode) {this(errorCode.getCode(), null, errorCode.getMessage());} }6、异常处理 自定义异常类 public class BusinessException extends RuntimeException {private final int code;public BusinessException(int code, String message) {super(message);this.code code;}public BusinessException(ErrorCode errorCode) {super((errorCode.getMessage()));this.code errorCode.getCode();}public BusinessException(ErrorCode errorCode, String message) {super(message);this.code errorCode.getCode();}public int getCode() {return code;}}全局异常处理 RestControllerAdvice Slf4j public class GlobalExceptionHandler {ExceptionHandler(BusinessException.class)public BaseResponse? businessExceptionHandler(BusinessException e) {log.error(businessException: e.getMessage(), e);return ResultUtils.error(e.getCode(), e.getMessage());}ExceptionHandler(RuntimeException.class)public BaseResponse? runtimeExceptionHandler(RuntimeException e) {log.error(runtimeException, e);return ResultUtils.error(ErrorCode.SYSTEM_ERROR, e.getMessage());} }RestControllerAdvice 的作用 它结合了 ControllerAdvice 和 ResponseBody 两个注解的功能用于全局异常处理和返回统一的格式化响应数据。 当控制器中抛出异常时RestControllerAdvice 会捕获这些异常并根据异常类型返回相应的数据格式。我们可以在 ExceptionHandler 注解下定义多个异常处理方法每个方法处理一个或多个不同类型的异常。这些方法可以返回不同类型的数据如 JSON、视图或其他对象。 除了异常处理RestControllerAdvice 还可以在控制器方法执行前或执行后执行一些操作例如记录日志、数据验证等。 7、定义用户常量 避免使用魔法值 public interface UserConstant {/*** 用户登录态键*/String USER_LOGIN_STATE userLoginState;/*** 系统用户 id虚拟用户*/long SYSTEM_USER_ID 0;// region 权限/*** 默认权限*/String DEFAULT_ROLE user;/*** 管理员权限*/String ADMIN_ROLE admin;// endregion }8、返回结果工具类 public class ResultUtils {/*** 成功** param data 数据* return {code BaseResponseT}*/public static T BaseResponseT success(T data) {return new BaseResponse(0, data, ok);}/*** 失败** param errorCode 错误码* return*/public static BaseResponse error(ErrorCode errorCode) {return new BaseResponse(errorCode);}/*** 失败** param code 状态码* param message 信息* return*/public static BaseResponse error(int code, String message) {return new BaseResponse(code, null, message);}/*** 失败** param errorCode 错误码* param message 信息* return*/public static BaseResponse error(ErrorCode errorCode, String message) {return new BaseResponse(errorCode.getCode(), null, message);} }9、分层领域模型规约 DOData Object此对象与数据库表结构一一对应通过 DAO 层向上传输数据源对象。DTOData Transfer Object数据传输对象Service 或 Manager 向外传输的对象。BOBusiness Object业务对象可以由 Service 层输出的封装业务逻辑的对象。Query数据查询对象各层接收上层的查询请求。注意超过 2 个参数的查询封装禁止使用 Map 类来传输。VOView Object显示层对象通常是 Web 向模板渲染引擎层传输的对象。 10、userAccount.intern() userAccount.intern() 是 Java 中的字符串常量池方法它的作用是将字符串对象添加到字符串常量池中并返回该字符串对象在常量池中的引用。如果常量池中已经存在该字符串则直接返回该字符串在常量池中的引用。 当我们使用字符串字面量例如String userAccount admin创建字符串时Java 虚拟机会自动将其添加到字符串常量池中因此这种方式创建的字符串对象在常量池中只会存在一份。而当我们通过 new 关键字创建字符串时例如String userAccount new String(admin)则会在堆内存中创建一个新的字符串对象该对象不会被添加到常量池中。 在实际开发中我们可以使用 intern() 方法在运行时将堆中的字符串对象添加到常量池中以便更有效地利用内存。但需要注意的是由于常量池是在运行时被创建的因此在使用 intern() 方法时需要注意字符串的生命周期以避免不必要的内存消耗。 synchronized (userAccount.intern()) {// 3. 加密String encryptPassword DigestUtils.md5DigestAsHex((SALT newPassword).getBytes());// 4. 更新数据user.setUserPassword(encryptPassword);boolean result this.updateById(user);if (!result) {throw new BusinessException(ErrorCode.SYSTEM_ERROR, 密码找回失败数据库错误);}// 5. 返回用户idreturn user.getId();}11、分页查询 userVOPage.setRecords(userVOList) 这段代码是将一个 List 列表中的元素设置到一个分页对象Page中的记录records属性中。 通过调用 userVOPage 的 setRecords 方法将 userVOList 列表中的元素设置到 userVOPage 的记录属性中从而实现了将查询结果封装成一个分页对象的功能。这样就可以将分页查询结果返回给前端展示方便用户进行浏览和操作。 public PageUserVO listUserByPage(UserQueryRequest userQueryRequest, HttpServletRequest request) {long current 1; // 默认当前页为第一页long size 10; // 默认每页查询10条数据User userQuery new User(); // 创建用户查询对象if (userQueryRequest ! null) { // 如果查询请求参数不为空BeanUtils.copyProperties(userQueryRequest, userQuery); // 将请求参数拷贝到用户查询对象中current userQueryRequest.getCurrent(); // 获取当前页数size userQueryRequest.getPageSize(); // 获取每页查询记录数}LambdaQueryWrapperUser lambdaQueryWrapper new LambdaQueryWrapper(); // 创建Lambda查询条件对象PageUser userPage this.page(new Page(current, size), lambdaQueryWrapper); // 分页查询用户信息PageUserVO userVOPage new PageDTO(userPage.getCurrent(), userPage.getSize(), userPage.getTotal()); // 创建用户VO分页对象ListUserVO userVOList userPage.getRecords().stream().map(user - {UserVO userVO new UserVO(); // 创建用户VO对象BeanUtils.copyProperties(user, userVO); // 将用户信息拷贝到用户VO对象中return userVO;}).collect(Collectors.toList()); // 将用户VO对象转化为List集合// 将userVOList列表中的元素设置到userVOPage的记录recodes属性中userVOPage.setRecords(userVOList);return userVOPage; }12、分页插件配置 Configuration MapperScan(com.chenmeng.project.mapper) public class MyBatisPlusConfig {/*** 拦截器配置** return*/Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();// 分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;} }13、Knife4j 接口文档配置 knife4j 是为 Java MVC 框架集成 Swagger 生成 Api 文档的增强解决方案前身是 swagger-bootstrap-ui取名 knife4j 是希望它能像一把匕首一样小巧、轻量并且功能强悍。其底层是对 Springfox 的封装使用方式也和 Springfox 一致只是对接口文档 UI 进行了优化。 参考博客 Swagger与Knife4j的学习 1、导入依赖 !-- https://doc.xiaominfo.com/knife4j/documentation/get_start.html--dependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-spring-boot-starter/artifactIdversion3.0.3/version/dependency2、指定 MVC 匹配路径 - yml 文件中 mvc:pathmatch:# 指定URL路径匹配的策略--Ant--风格默认的URL路径匹配的策略是AntPathMatchermatching-strategy: ANT_PATH_MATCHER不指定的话会报错Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPointerException 原因在配置 Swagger 后 springBoot 处理映射匹配的默认策略发生了变化Spring MVC 处理映射匹配的默认策略已从 AntPathMatcher 更改为 PathPatternParser。 参考博客 https://blog.csdn.net/Shipley_Leo/article/details/129100908 3、写配置文件 Configuration EnableSwagger2 Profile(dev) public class Knife4jConfig {Beanpublic Docket defaultApi2() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(new ApiInfoBuilder().title(project-backend).description(后端接口项目文档).version(1.0).build()).select()// 指定 Controller 扫描包路径.apis(RequestHandlerSelectors.basePackage(com.chenmeng.project.controller)).paths(PathSelectors.any()).build();} }4、显示以下页面表示配置成功 14、全局跨域配置 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {// 覆盖所有请求registry.addMapping(/**)// 允许发送 Cookie.allowCredentials(true)// 放行哪些域名必须用 patterns否则 * 会和 allowCredentials 冲突.allowedOriginPatterns(*).allowedMethods(GET, POST, PUT, DELETE, OPTIONS).allowedHeaders(*).exposedHeaders(*);} }15、自定义权限校验注解 Target(ElementType.METHOD) // 表示该注解只能添加在方法上 Retention(RetentionPolicy.RUNTIME) // 表示该注解在运行时可用 public interface AuthCheck {/*** 有任何一个角色** return {code String[]}*/String[] anyRole() default ;/*** 必须有某个角色** return {code String}*/String mustRole() default ;}16、AOP 首先需要导入 AOP 依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency1、权限校验拦截器 AOP Aspect Component public class AuthInterceptor {Resourceprivate UserService userService;/*** 执行拦截** param joinPoint 连接点即被拦截到的方法* param authCheck 自定义注解 - 身份验证检查* return {code Object}*/Around(annotation(authCheck))public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {// 获取 AuthCheck 注解的 anyRole 属性值并将 非空字符串 添加到列表中。ListString anyRole Arrays.stream(authCheck.anyRole()).filter(StringUtils::isNotBlank).collect(Collectors.toList());// 获取 AuthCheck 注解的 mustRole 属性值String mustRole authCheck.mustRole();// 获取当前请求的属性RequestAttributes requestAttributes RequestContextHolder.currentRequestAttributes();// 获取当前请求对象HttpServletRequest request ((ServletRequestAttributes) requestAttributes).getRequest();// 获取当前登录用户User user userService.getLoginUser(request);// 拥有任意权限即可通过if (CollectionUtils.isNotEmpty(anyRole)) { // 判断 anyRole 列表是否非空String userRole user.getUserRole();if (!anyRole.contains(userRole)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}}// 必须拥有所有权限才可通过if (StringUtils.isNotBlank(mustRole)) { // 判断 mustRole 列表是否非空String userRole user.getUserRole();if (!mustRole.equals(userRole)) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}}// 通过权限校验放行return joinPoint.proceed();} }Aspect 注解和 Around 注解用于拦截带有 AuthCheck 注解的方法进行身份验证校验。 Aspect 注解表示这是一个切面类用于定义切点和通知。Component 注解表示这个类是一个 Spring 组件需要被 Spring 容器管理。Around(annotation(authCheck)) 表示它拦截带有 AuthCheck 注解的方法并在方法执行前进行身份验证校验。 AuthCheck authCheck 表示被拦截方法上的 AuthCheck 注解对象。 2、请求响应日志拦截器 AOP Aspect Component Slf4j public class LogInterceptor {/*** 执行拦截** param point 连接点* return {code Object}* throws Throwable throwable*/Around(execution(* com.chenmeng.project.controller.*.*(..)))public Object doInterceptor(ProceedingJoinPoint point) throws Throwable {// 计时StopWatch stopWatch new StopWatch();stopWatch.start();// 获取请求路径RequestAttributes requestAttributes RequestContextHolder.currentRequestAttributes();HttpServletRequest httpServletRequest ((ServletRequestAttributes) requestAttributes).getRequest();// 生成请求唯一 idString requestId UUID.randomUUID().toString();String url httpServletRequest.getRequestURI();// 获取请求参数Object[] args point.getArgs();String reqParam [ StringUtils.join(args, , ) ];// 输出请求日志log.info(request startid: {}, path: {}, ip: {}, params: {}, requestId, url,httpServletRequest.getRemoteHost(), reqParam);// 执行原方法Object result point.proceed();// 输出响应日志stopWatch.stop();long totalTimeMillis stopWatch.getTotalTimeMillis();log.info(request end, id: {}, cost: {}ms, requestId, totalTimeMillis);return result;} }依赖解析 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.12/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.chenmeng/groupIdartifactIdeasy-web/artifactIdversion0.0.1-SNAPSHOT/versionnameeasy-web/namedescriptionSpring Boot 后端项目脚手架/descriptionpropertiesjava.version1.8/java.version/propertiesdependenciesdependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.1/version/dependency!--commons-lang3工具类--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.12.0/version/dependency!--hutool工具类--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.18/version/dependency!-- swagger knife4j 接口文档--dependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-spring-boot-starter/artifactIdversion3.0.3/version/dependency!-- gson解析库 --dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.9.0/version/dependency!--AOP--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.1/version/dependency!-- devtools热部署依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId!-- 防止将依赖传递到其他模块中 --optionaltrue/optional!-- 只在运行时起作用打包时不打进去防止线上执行打包后的程序启动文件监听线程File Watcher耗费大量的内存资源 --scoperuntime/scope/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project1、热部署依赖 spring-boot-devtools 提供以下功能 自动应用程序重启在开发应用程序时当我们对代码进行更改并保存后应用程序将自动重新启动以便更快地查看更改的结果而无需手动重启应用程序。LiveReload 支持当我们更改 HTML、CSS、JavaScript 文件时LiveReload 将自动重新加载浏览器页面以便更快地查看更改的结果。全局默认属性设置在开发期间我们可能需要设置一些默认属性例如开启调试模式禁用缓存等。spring-boot-devtools 提供了一种简单的方式来设置这些属性以便在整个应用程序中生效。 需要注意的是spring-boot-devtools 只应该在开发环境中使用不应该在生产环境中使用。因为在生产环境中自动重启和 LiveReload 可能会导致应用程序的性能下降甚至可能会引起一些安全问题。 热部署https://www.jianshu.com/p/de544b13b9d5 注册器参数设置解析 首先在 IDEA 中按 Ctrl Alt Shift /或 Cmd Option Shift / on macOS打开 Registry。 compiler.automake.build.while.idle.timeout 是 IntelliJ IDEA 的注册表Registry中的一项设置。这个设置项控制的是在系统空闲状态下IDEA 自动构建项目的等待时间。compiler.automake.postpone.when.idle.less.than 是 IntelliJ IDEA 注册表Registry中的另一个设置项它控制了在系统空闲时间小于特定值时是否延迟自动构建。 注意事项 请注意这种自动构建可能会对系统的资源使用产生影响尤其是在大型项目中。如果你发现系统响应变慢或者 CPU 使用率过高可以尝试调低这个设置值或关闭自动构建功能。 2、gson 解析依赖库 Gson 是 Google 提供的一个 Java 库用于将 Java 对象和 JSON 数据相互转换。它可以将一个 Java 对象序列化为 JSON 格式的字符串也可以将一个 JSON 格式的字符串反序列化为一个 Java 对象。 Gson 支持 Java 中的基本数据类型、集合类型和自定义对象类型并且可以对 Java 对象进行自定义序列化和反序列化操作。 !-- https://mvnrepository.com/artifact/com.google.code.gson/gson --dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.9.0/version/dependency可以看看下面这篇文章 Gson的基本使用
http://www.zqtcl.cn/news/176661/

相关文章:

  • 如何做京东优惠券网站建设银行网站储蓄账户查询密码
  • 月付购物网站建站方维网络科技有限公司
  • 广东外贸网站建设企业手写代码网站
  • 信誉好的菏泽网站建设自己做网站一定要实名吗
  • 头像网站模板长春建工集团官网
  • 微信网站建设费用网站建设评价标准
  • 济宁市建设工程招投标网站购物网站建设图标大全
  • 婚恋网站制作网站建设服务案例
  • 学校 网站建设 报销discuz做网站赚钱经历
  • 上海做高端网站制小吃加盟招商方案
  • 焦作市建设工程网站网站开发遵循的原则
  • 网站搜索引擎优化主要方法分子信标探针在线设计网站
  • 湘潭做网站 定制磐石网络建设规划许可证公示网站
  • seo查询 站长工具热门行业
  • 广州网站设计与制作公司windows优化大师官方下载
  • 找公司做网站要注意什么网站优化方法页面
  • 贵州省都匀市网站建设it培训机构培训排名
  • 网站开发的技术栈网页设计1920尺寸
  • 在中国可以做国外的域名网站吗中国建设银行人力资源网站
  • 中石化第四建设公司 网站电商app开发价格表
  • dhru商城网站建设免费英文网站建设
  • 公司建设网站的 计划书深圳华强北电子商城
  • 宁波网站建设有限公司大圣网站建设
  • wish网站应该怎么做网站的html代码在哪
  • 哪个网站可以做体育主播站长工具seo综合查询怎么去掉
  • 哪个网站做logo设计师公司做网站需要什么资料
  • 想自己做衣服上哪个网站学网站设计网上培训学校
  • 做餐饮的网站云匠网可能会遇到哪些问题
  • 制作网页网站的软件是网络科技公司怎么注册
  • 如何做百度推广网站价格网如何查产品价格