菌子导航系统(持续开发中)

news2024/11/18 6:25:39

文章目录

  • 菌子导航
    • 前言
      • 项目架构
      • spring-cloud 和 spring-boot 版本选择
      • 使用到的组件(依赖)
      • 架构分层
    • 项目基本功能
      • 1 使用Nacos做配置中心
      • 2 logback日志
      • 3 mybatis-plus操作数据库
      • 4 Caffeine 缓存整合
      • 5 LocalDateTime 序列化&反序列化
      • 6 参数校验快速失败配置
      • 7 集成日志链路
      • 8 控制器参数切面
      • 9 日志切面
      • 10 集成 Swagger + knife4j
      • 11 全局异常拦截
      • 12 Nacos 增加监听器
      • 13 RestTemplate 集成 okhttp4
      • 14 注册服务到Nacos
    • 项目业务功能
      • 1 集成有道文本翻译接口
      • 2 集成天行数据
      • 3 枚举生成器
    • 项目部署与运行
      • 1 Idea中运行
      • 2 打包在windows的cmd中运行

菌子导航

前言

本导航网站旨在对接多个三方接口,常用功能集成到导航系统中。目前已经在对接的是有道文本翻译接口、天行数据、自定义枚举生成器。
目前项目代码托管在 :
https://gitee.com/fengsoshuai/junzi-navigation.git
最新分支是 dev 分支。

本项目主要是练习Java后端的技术。基本不涉及前端技术。

项目架构

参考并使用DDD领域模型思想,架构搭建使用了阿里的 COLA 项目。

https://gitee.com/fengsoshuai/COLA#

使用命令: mvn archetype:generate -DgroupId=org.feng.navigation -DartifactId=junzi-navigation -Dversion=1.0.0-SNAPSHOT
-Dpackage=org.feng.navigation -DarchetypeArtifactId=cola-framework-archetype-service -DarchetypeGroupId=com.alibaba.cola
-DarchetypeVersion=4.0.1

spring-cloud 和 spring-boot 版本选择

参考:https://spring.io/projects/spring-cloud

spring-boot 选择 2.7.8 ,cloud选择 2021.0.5

使用到的组件(依赖)

组件版本
lombok1.18.16
okhttp4.9.0
mapstruct1.4.2.Final
mybatis-plus3.5.3.1
druid1.2.15
gson2.9.1
hutool-core5.8.11
caffeine2.9.3
swagger3.0.0
freemarker2.7.8
thymeleaf2.7.8
prometheus1.9.7
pinyin4j2.6.1

架构分层

常规的COLA分层说明:https://blog.csdn.net/significantfrank/article/details/110934799

本项目的分层简述:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKksUezq-1676096556002)(docs\架构.png)]

项目基本功能

1 使用Nacos做配置中心

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G7BcUq3X-1676096556003)(docs\20230119142832.png)]

配置内容如下:

junzi:
  nav:
    url:
      youDao: https://openapi.youdao.com/api
      tianXing: https://apis.tianapi.com
    app:
      youDao:
        appKey: 在有道注册得到的key
        appSecret: 在有道注册得到的secret
      tianXing:
        appKey: 在天行注册的key
# 数据源
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:13321/junzi-navigation?useUnicode=true&serverTimezone=UTC
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  # 支持post、delete等请求
  mvc:
    hiddenmethod:
      filter:
        enabled: true
# mybatis plus
mybatis-plus:
  # xml扫描,多个目录用逗号或者分号分隔(告诉mapper所对应的xml文件位置)
  mapper-locations: classpath*:mapper/**Mapper.xml
  # 以下配置均有默认值
  global-config:
    db-config:
      #主键类型  auto:"数据库ID自增" 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
      id-type: auto
      #字段策略 IGNORED:"忽略判断"  NOT_NULL:"非 NULL 判断")  NOT_EMPTY:"非空判断"
      field-strategy: NOT_EMPTY
      #数据库类型
      db-type: MYSQL
  configuration:
    # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: true
    # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
    call-setters-on-nulls: true
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 扫描实体
  type-aliases-package: org.feng.navigation.database.entity

2 logback日志

<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 %F文件,%L行号-->
            <pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p} ) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%t]){faint} %clr(%logger{39}.%M\(%F:%L\)){cyan} %clr(:){faint} ![method=%X{method:-default},businessId=%X{businessId:-default}] %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--rootLogger是默认的logger-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>

    <!--应用日志-->
    <logger name="org.feng.navigation" level="DEBUG"/>
</configuration>

3 mybatis-plus操作数据库

使用Mapper 和 ServiceImpl 作为常见的数据库功能实现。

并实现了 SQL 拦截 InnerInterceptor,打印出执行到的SQL(这一操作需要谨慎,线上部署可以去除)

4 Caffeine 缓存整合

使用 Spring Cache 中的 CacheManager管理缓存。

5 LocalDateTime 序列化&反序列化

增加序列化、反序列化的配置,将时间格式统一为 yyyy-MM-dd HH:mm:ss

并支持配置更改。

6 参数校验快速失败配置

在使用 Valid 注解进行参数校验时,默认会校验全部参数后,将错误信息才返回。

增加此配置后,只要发生了错误,就会直接返回,增加了校验效率与系统性能。

7 集成日志链路

使用拦截器 HandlerInterceptor 做了日志链路统一。

搭配着 MDC 和 logback 对关键词 “businessId” 进行输出。

使用效果是,同一请求的执行链路中,直接使用 lombok 打印日志,会将 businessId 打印出来。方便回溯和排查问题。

8 控制器参数切面

主要是在执行控制器的前、后打印数据。

执行前打印方法请求参数,执行后打印执行结果。

执行错误时,打印错误描述信息。

并且提供了 Check 接口的校验,如果当前参数DTO对象,实现了Check 接口,则会自动调用该接口的 check方法,对参数进行校验。

9 日志切面

搭配着MDC 和 lombok 将当前请求的接口对应的业务方法打印到日志中。

10 集成 Swagger + knife4j

集成了 3.0 版本的 Swagger 文档。

方便开发接口时的调试,测试。

11 全局异常拦截

对校验参数的异常进行捕获,对未知异常进行捕获并处理

12 Nacos 增加监听器

具体说明见博客:https://blog.csdn.net/FBB360JAVA/article/details/128878761

13 RestTemplate 集成 okhttp4

已经将httpclient 更改成为 okhttp。效率上快很多。

14 注册服务到Nacos

目标是另外新建项目后,可以用新建的项目 Feign 调用本项目。

目前新建项目已经搭建完毕:https://gitee.com/fengsoshuai/junzi-navigation-web.git

可以使用 junzi-navigation-web项目远程调用本项目。

项目业务功能

1 集成有道文本翻译接口

目前已经对接完毕,支持中、英翻译。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASFdDMHy-1676096556003)(docs\20230119145459.png)]

2 集成天行数据

在 https://www.tianapi.com/ 注册账号,并对接里边的接口。

目前对接了:

  • 天行数据新闻接口频道ID

3 枚举生成器

使用模板引擎thymeleaf渲染界面。目前界面使用最简单的标签。(界面简陋,不喜勿喷!)

通过访问主界面:

http://localhost:18080/junzi/index.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1lGrcZW-1676096556004)(docs\20230211141440.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdhHbs6u-1676096556004)(docs\20230211141328.png)]

在本地选择你自己的csv文件,指定类名、包名、枚举key值对应的索引(索引从0开始计数)

比如测试时使用 demo.csv文件内容:

1,线下热敏,线下热敏是一种物流
5,淘宝,淘淘他
7,拼多多,品谷博的武器二带我去

最终生成的Demo.java 文件的内容是:

package org.feng;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * TODO
 *
 * @version V1.0
 * @author: junzi
 * @date: 2023年02月11日 14时00分
 */
@Getter
@AllArgsConstructor
public enum Demo {

    /**
     * 线下热敏:1
     */
    XIAN_XIA_RE_MIN("1", "线下热敏", "线下热敏是一种物流"),
    /**
     * 淘宝:5
     */
    TAO_BAO("5", "淘宝", "淘淘他"),
    /**
     * 拼多多:7
     */
    PIN_DUO_DUO("7", "拼多多", "品谷博的武器二带我去"),
    ;
    /**
     *  TODO 待完善
     */
    private final Integer key;
    /**
     *  TODO 待完善
     */
    private final String desc;

    public static Demo of(Integer key) {
        if (key == null) {
            throw new IllegalArgumentException("key不能为空的啦");
        }
        return Arrays.stream(values())
                .filter(element -> element.key.equals(key))
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException("key不存在的啦"));
    }
}

项目部署与运行

1 Idea中运行

在下载项目源码后,使用idea的maven插件功能,在图中先 clean,再 install。

随后运行 start 模块中的启动类即可。

注意 profile 的指定,目前使用的是dev环境。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x6SQsdIA-1676096556004)(docs\20230129211940.png)]

2 打包在windows的cmd中运行

先打包,注意使用clean 和 package 插件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTWrJ4hL-1676096556004)(docs\20230129213414.png)]

等待打包成功后,在 start 模块中找到新打好的包。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmI803SP-1676096556005)(docs\20230129213602.png)]

随后在java11的运行环境中运行该jar包(注意要指定编码格式,cmd默认会是gbk):

java -Dfile.encoding=utf-8 -jar start-1.0.0-SNAPSHOT.jar

这里调整编码的操作是因为第一次运行时,读取到nacos中的配置内容,是带乱码的,导致程序启动不起来。因为nacos默认是utf-8编码的。

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

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

相关文章

ubuntu20.04 系统下 .7z 文件解压缩到指定的目录下

问题描述 环境&#xff1a; ubuntu 20.04 ubuntu 下有个 7z 的压缩文件需要解压&#xff0c;需要解压到指定的目录下&#xff0c;而不是压缩包当前目录下 安装 p7zip-full ubuntu 下的 7z 解压软件&#xff1a; p7zip-full 安装命令&#xff1a; sudo apt install p7zip-fu…

04-PS人像磨皮方法

1.高斯模糊磨皮 这种方法的原理就是建立一个将原图高斯模糊后图层, 然后用蒙版加画笔或者历史画笔工具将需要磨皮的地方涂抹出来, 通过图层透明度, 画笔流量等参数来控制磨皮程度 1.新建图层(命名为了高斯模糊磨皮), 混合模式设置为正常, 然后选择高斯模糊, 模糊数值设置到看…

前端也能悄悄对视频截图?js实现对视频按帧缓存

前言 虽然最后没有采用这种方案来实现滚动控制视频进度&#xff0c;但是仍然想自己试试这种方案的实现&#xff0c;毕竟应用范围也挺广的。 核心代码并不多&#xff0c;算是一篇小短文&#xff5e;。 掘金好像不允许放站外演示链接&#xff0c;所以这里就用动图大概展示下最终…

STL——list

一、list介绍及使用 1. list文档介绍 &#xff08;1&#xff09;list是可以在常数范围内&#xff0c;在任意位置进行插入、删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 &#xff08;2&#xff09;list的底层是带头结点的双向循环链表&#xff0c;其中每个元素…

【Java|golang】2335. 装满杯子需要的最短总时长

现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount &#xff0c;其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的…

web期末复习 2023.02.11

文章目录Web 的概念Web 组成用户通过浏览器请求资源的过程:HTML 超文本标记语言CSS插入样式表的方法有三种:对象&#xff0c;类&#xff0c;实例一个完整的 JavaScript 实现是由以下 3 个不同部分组成的&#xff1a;JavaScript 用法什么是 Java Server Pages?JSP 注释JSP 的 J…

《Linux运维实战:Centos7.6使用haproxy部署rabbitmq3.9.16高可用镜像模式集群》

一、集群架构 说明&#xff1a;对于消息的生产和消费者可以通过HAProxy的软负载将请求分发至RabbitMQ集群中的Node1&#xff5e;Node7节点&#xff0c;其中Node8&#xff5e;Node10的三个节点作为磁盘节点保存集群元数据和配置信息。 二、环境信息 环境信息如下&#xff1a; …

剑指 Offer 52. 两个链表的第一个公共节点

摘要 剑指 Offer 52. 两个链表的第一个公共节点 一、两个链表的第一个公共节点解析 使用双指针的方法&#xff0c;可以将空间复杂度降至 O(1)。只有当链表 headA headB都不为空时&#xff0c;两个链表才可能相交。因此首先判断链表 headA和 headB是否为空&#xff0c;如果其…

[watevrCTF 2019]Timeout 题解

事不一而理有定在&#xff0c;犹百川万折&#xff0c;必归于海。 ——《容斋随笔》 1.查壳 是一个64位像是ELF的文件 无壳子 2.拖入64位IDA IDA分析失败 是一个.com文件 COM格式文件是一种简单的可执行文件。在迪吉多公司于20世纪70年代推出的操作系统中&#xff0c;.COM被用…

c/c++开发,无可避免的函数指针使用案例

一、函数指针简介 函数指针是指指向函数而非指向对象的指针。像其他指针一样&#xff0c;函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定&#xff0c;而与函数名无关。例如&#xff1a; char* (*pf1)(char * p1,char *p2); 这是一个函数指针&#xff0c;其…

javassm超市在线配送管理系统

为了解决用户便捷地在网上购物&#xff0c;本文设计和开发了一个超市管理系统。本系统是基于web架构设计&#xff0c;SSM框架 &#xff0c;使用Mysql数据库管理&#xff0c;综合采用JSP模式来完成系统的相关功能。主要实现了管理员与用户的注册与登陆&#xff0c;个人中心、用户…

[标准库]STM32F103R8T6 高级定时器--PWM输出和带死区互补PWM输出

前言 STM32F103系列的MCU&#xff0c;相比普通的51单片机&#xff0c;在输出硬件PWM这个功能上要强不少&#xff0c;两者实现的方式都类似&#xff0c;都是通过一个定时器来启用硬件PWM输出&#xff0c;不过在输出PWM通道的数量上&#xff0c;32F103要强上不少。仅通过一个高级…

5.Redis 实现点赞 优化登陆(验证码 token..)

Redis&#xff08;1&#xff09;简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务&#xff0c;即原子性&#xff0c;通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中&#xff0c;性能高。&#xff08;2&#…

Docker中安装MySQL 8

前言 上一期在Windows中安装好了Docker环境&#xff0c;这一期在Docker中完成MySQL 8安装和配置。 启动Docker Desktop后在cmd窗口中输入docker -v即可查看到安装的docker版本 Docker启动容器的原理流程 Docker启动一个容器(应用)时&#xff0c;大致原理流程如下图&#x…

安全技术与防火墙工具iptables

目录 安全技术 安全技术 补充防水墙 防火墙的分类 按保护范围划分 按实现方式划分 按网络协议划分 iptables iptables的五表五链 三种报文流向 iptables基本语法 数据包常见的控制类型 iptables的基本选项 显示扩展模块 保存规则 持久保存规则 加载规则 开机自…

上岸!轻轻松松打工!Python数据分析证

俗话说的好&#xff0c;活到老学到&#x1f914;这个大内卷的时代掌握一项技能还是很重要&#x1f648;的&#xff0c;这不趁着下班时间的功夫&#xff0c;偷偷去考了个证 就是一个不论含金量&#xff0c;还是对实习和求职都非常有益的一个双协会认证的高含金量证书~BDA数据分析…

电影订票网站的设计与开发

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科技的发展&#xff0c;时代的进步&#xff0c;互联网已经成为了人们生活中不可缺少的一部分&#xff0c;网上购物已然是一种时代的象征。纵观市场&#xff0c;电影行业的发展尤为迅速&#xff0c;电影种类和数量的增多导致客流…

Portraiture全新4.0最新版人像磨皮插件更新内容

Portraiture是一款智能磨皮插件&#xff0c;为Photoshop和Lightroom添加一键磨皮美化功能&#xff0c;快速对照片中皮肤、头发、眉毛等部位进行美化&#xff0c;无需手动调整&#xff0c;大大提高P图效率。全新4版本&#xff0c;升级AI算法&#xff0c;并独家支持多人及全身模式…

ROS小车研究笔记2/11/2023:使用ssh远程登录小车

1 SSH简介&#xff1a; SSH全称Secure Shell&#xff0c;是一种建立在应用层的安全网络协议。其安全性又非对称加密(RSA)实现 对称加密&#xff1a;使用同一密钥对信息进行加密和解密&#xff0c;但是一旦该密钥被窃取就会威胁通信安全 非对称加密&#xff1a;使用公钥和私钥。…

【Java基础】018 -- 面向对象阶段项目下(拼图小游戏扩展)

文章目录切换游戏图片的业务分析:1&#xff0c;所需要的技术点2&#xff0c;分析业务逻辑项目实现步骤&#xff1a;添加组件绑定事件&#xff1a;代码实现登录界面的业务分析&#xff1a;1&#xff0c;所需要的技术点2&#xff0c;分析业务逻辑项目实现步骤&#xff1a;主界面设…