前後臺打通之springboot後臺要點記錄

接着之前的vue前端項目搭建成功,在實現了一些基本的頁面功能之後,現在再搭建一下基礎的後臺,從而實現前後臺打通,以下是整個打通過程中的一些關鍵點及感悟記錄:

springboot的後臺項目搭建比較簡單,如果單純的實現接口的話,實際上沒什麼好說的,但是爲了看起來不那麼單調,就先暫時集成了一些非常基礎的組件,例如logback、mybatis、lombok等。

mybatis關聯查詢和特定標籤使用

springboot操作mysql實際有更簡單的方案,例如jpa,但是考慮到這個項目是爲了鞏固工作中的技術,並期望在實現的過程中發現更多知識盲點,所以還是選用mybatis-plus。
mybatis-plus基本和mybatis是一樣的,常規操作也都差不多,並且目前涉及的業務也都不是太複雜,所以這裏也僅是對關聯查詢進行一個記錄。
例如系統需要查詢博客列表,而博客列表除了博客本身信息外,還需要基本的用戶信息以及訪問量等信息,所以這裏其實就涉及到了另外兩個信息的關聯查詢,除非選擇在後臺代碼中循環遍歷查詢,這肯定是不可取的。
對於關聯查詢,主要是返回結果的關聯映射,時間長了不寫可能就忘記細節,關鍵在於association 標籤的使用,如下:

<resultMap id="blogResultMap"
		type="com.tzx.blog.entity.BlogInfo">
		<result column="id" jdbcType="VARCHAR" property="id" />
		<result column="title" jdbcType="VARCHAR" property="title" />
		<result column="desc" jdbcType="VARCHAR" property="desc" />
		<result column="content" jdbcType="VARCHAR" property="content" />
		<result column="type" jdbcType="VARCHAR" property="type" />
		<result column="cate_id" jdbcType="VARCHAR" property="cateId" />
		<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
		<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
		<association property="userInfo" javaType="com.tzx.blog.entity.UserInfo">
            		<result property="id" jdbcType="VARCHAR" column="id"/>
            		<result property="name" jdbcType="VARCHAR" column="name"/>
            		<result property="img" jdbcType="VARCHAR" column="img"/>
        	</association>
       		<association property="blogDetailInfo" javaType="com.tzx.blog.entity.BlogDetailInfo">
            		<result property="id" jdbcType="VARCHAR" column="id"/>
            		<result property="blogId" jdbcType="VARCHAR" column="blog_id"/>
            		<result property="fabulousCount" jdbcType="VARCHAR" column="fabulous_count"/>
           		 <result property="readCount" jdbcType="VARCHAR" column="read_count"/>
            		<result property="commentCount" jdbcType="VARCHAR" column="comment_count"/>
           		<result property="forwardCount" jdbcType="VARCHAR" column="forward_count"/>
            		<result property="cateType" jdbcType="VARCHAR" column="cate_type"/>
            		<result property="power" jdbcType="VARCHAR" column="power"/>
            		<result property="blogType" jdbcType="VARCHAR" column="blog_type"/>
        	</association>
</resultMap>

跨域問題

使用vue和springboot前後端分離模式,前後臺都要獨立部署,這也就必然不可能在一臺機器上使用一樣的端口號,所以我後臺使用8089,前臺vue使用8088。
這樣一來,當我前臺訪問後臺接口時會拋出異常:

has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

實際上就是跨域訪問的問題,對於springboot項目,目前我瞭解到的解決方式有兩種,一種是註解方式,一種是配置方式。
註解方式又分爲類註解和方法註解,類註解的意思就是在controller類上邊加註解,例如:

@CrossOrigin(value = "http://localhost:8088")
@RequestMapping("/tzxblog/blog")
public class BlogController {

方法註解就是在要訪問的接口方法上加註解,例如:

@CrossOrigin(value = "http://localhost:8088")
@GetMapping("/category-list")
public TzxResVO<List<CategoryInfo>> findCategories

使用方法就如上邊所示,使用@CrossOrigin註解,然後填上允許跨域的域名、端口。
那麼上邊用法的弊端就是哪裏需要跨域,那裏就要加註解,可能會需要加很多。
所以也可以使用下邊配置的方式,在一個地方進行統一的管理,代碼示例如下:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	@Override
	public void addCorsMappings(CorsRegistry registry) {
	registry.addMapping("/**").allowedOrigins("http://localhost:8088").allowedMethods("*").allowedHeaders("*");
	}
}

上邊這個配置類,能解決跨域的問題,同時還能解決靜態資源訪問,例如圖片訪問的問題。

圖片資源訪問

常規來說,博客有作者,作者有頭像,加載博客列表可能就同時加載了作者暱稱和頭像。
對於頭像獲取的實現方式可能是是多樣化的,有的直接以流的方式提供,有的可能以ftp的方式提供,有的可能就像我這裏一樣直接使用靜態資源,只是需要進行一定的配置進行映射,從而實現網絡路徑和本地文件路徑的對接。
這個功能實現起來也不難,只需在上邊配置類中增加一個重寫方法即可:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/static/**").addResourceLocations("file:///" + imgConfig.getFilepath());
	}

上邊代碼的意思,就是當網絡訪問/static/下的資源時,系統訪問本地某個文件路徑的內容,就是一層虛擬服務的映射。
上邊文件路徑使用配置的方式,沒有在代碼中寫死,所以就又用到了spring屬性配置的內容。

自定義屬性配置

一般系統開發可能是在windows系統中,這個文件系統是以各種盤符開頭,而後期的使用則很可能是部署在linux環境,盤符則又是一種規則,所以代碼中寫死肯定是不明智的。
因此,我直接把路徑配在了springboog的配置文件application-dev.yml中,例如:

imgs:
  filepath: E:/img/

然後在代碼中使用@Value獲取時,會發現啓動都報錯,實際上是還需要引入一定的依賴:

<dependency>
	<groupId> org.springframework.boot </groupId>
	<artifactId> spring-boot-configuration-processor </artifactId>
	<optional> true </optional>
</dependency>

然後注入配置屬性的代碼指定配置內容,就可以在代碼中讀取自定義配置了:

@Component
@ConfigurationProperties(prefix = "imgs")
@Data
public class ImgConfig {
	// 上傳路徑
	private String filepath;
}

關於lombok

在上邊的自定義配置映射類中,有一個@Data註解,這個註解是lombok的功能,lombok可以簡化開發工作,替代自己寫的get、set以及toString等方法。
除了@Data註解,我們目前常用的還有@Slf4j,用來代替常規的自定義log變量方式。
但是lombok也有一定的弊端存在,例如有父子繼承關係的對象的equals方法就有一定的問題,同時,一旦使用了lombok,那麼所有用這個項目的人也都必須安裝lombok插件,實際上是很不友好的。

項目地址

項目代碼和文檔均以github託管,地址如下:
https://github.com/tuzongxun/tzxblog

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章