[java 手把手教程][第二季]java 後端博客系統文章系統——No4

轉眼間第二季來到了第五章,也是咱們博客系統的第四章。前段時間由於我的私事較多,項目停更了兩期,可是這都不是問題,咱們繼續接着走下去。畢竟承諾的事情就得完成。javascript

這一期咱們的目標是完成後端博客系統的博客發佈功能。前端

按照咱們前面的設定,咱們的後端博客系統須要完成最簡單的博文發佈,咱們也得有後臺管理界面,同時須要將用戶權限這些都附帶上,可是因爲時間關係,咱們後端默認帳戶就是管理員吧,畢竟這一期的重點是實現博客的發佈。java


博文發佈系統git

咱們須要發佈博文,那麼後端必不可少的是登陸和發佈系統,至於其餘的咱們能夠先緩一緩,畢竟我也沒想好後端頁面怎麼設計,嘿嘿。github

前面我看了一下,確實是完美兼容WordPress仍是有不少難度,畢竟不少技術細節咱們並不知道,不過,至少說目前咱們已經兼容了博客文章,剩下的只須要一點點的適配就能大概完成任務。web

很少說了,咱們先完成後端登陸功能。算法

後端登陸

後端登陸,咱們不可能說一味的兼容WordPress,還有一些技術上面的設計理念可能也不是那麼那啥,因此咱們須要拿出一些本身的玩意。首先仍是老規矩,從Dao→Service→Controller。spring

  • Dao按照老規矩就是對數據庫的操做,因此咱們只須要寫上接口和mapper就好了。
  • Service層仍是同樣進行單元數據操做。
  • Controller是web應用的入口地點。
    有了上面的這些咱們只須要進行一個登陸驗證,也就是前面說過的密碼規則驗證,不過具體代碼以下:
@RequestMapping(value = "/login"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = RequestMethod.POST)
    @ApiOperation(
            value = "用戶登陸"
            , notes = "用戶登陸的接口,輸入用戶名和密碼進行登陸"
            , response = User.class)
    @ResponseBody
    public Object userLogin(HttpServletRequest request, @ApiParam(value = "用戶名不能爲空,不然不容許登陸" , required = true) @RequestParam("userLogin") String userLogin, @ApiParam(value = "用戶密碼不能爲空且必須爲16位小寫MD5,不然不容許登陸" , required = true) @RequestParam("userPass") String userPass) {
        ResponseObj<User> responseObj = new ResponseObj<>();
        User user;
        if (PublicUtil.isJsonRequest(request)) {    //確認是不是post的json提交
            try {
                user = new GsonUtils().jsonRequest2Bean(request.getInputStream(), User.class);  //轉換爲指定類型的對象
                userLogin = user.getUserLogin();
                userPass = user.getUserPass();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (StringUtils.isEmpty(userLogin) || StringUtils.isEmpty(userPass)) {
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("用戶名和密碼不能爲空!請檢查!");
            return new GsonUtils().toJson(responseObj);
        }

        user = userService.findOneById(userLogin);

        if (null == user) {
            responseObj.setCode(ResponseObj.EMPUTY);
            responseObj.setMsg("用戶不存在!請檢查!");
            return new GsonUtils().toJson(responseObj);
        }

        userPass = userPass.toLowerCase();  //將大寫md5轉換爲小寫md5

        if (userPass.length() > 16 && userPass.length() == 32) {    //32位小寫轉換爲16位小寫
            userPass = userPass.substring(8, 24).toLowerCase();
        } else if (userPass.length() > 32) {
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("密碼不規範!請檢查!");
            return new GsonUtils().toJson(responseObj);
        }

        String encryptPassword = EncryptUtils.encryptPassword(userPass, user.getUserActivationKey());

        if (!encryptPassword.equals(user.getUserPass())) {
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("用戶名和密碼不匹配!請檢查!");
            return new GsonUtils().toJson(responseObj);
        }

        user.setUserPass(request.getSession().getId()); //將sessionId放入用戶信息中
        user.setUserActivationKey("");  //將用戶註冊的salt清空
        user.setUserUrl("/user/endSupport/index");

        responseObj.setData(user);
        responseObj.setCode(ResponseObj.OK);
        responseObj.setMsg("登陸成功");

        return new GsonUtils().toJson(responseObj);
    }複製代碼

雖說不少東西咱們在前端或者是客戶端已經作了限制,可是爲了防止別人搞事情咱們仍是須要這樣作才行。數據庫

Spring-Fox,Api測試頁面

什麼是Spring-Fox呢?Springfox的前身是swagger-springmvc,是一個開源的API doc框架,能夠將咱們的Controller的方法以文檔的形式展示。express

爲何咱們要大費周章的作這些呢?

  • 它能夠幫助咱們歸類web訪問入口
  • 它能夠整理接口
  • 它能夠···

確實語言描述是個人弱點,不過呢,我這個理工直男癌就須要直截了當的說出來,沒時間解釋,直接上圖。

個人博客第五章-API_doc框架

正如上面的截圖所示,咱們首先應該找到對應的spring-fox的說明文檔,而後仔細一看網上分爲兩個版本,一個是開源中國的引入說明,一個是Spring-Fox官方的使用說明,那麼確定選擇官方的。

按照官方文檔,咱們簡單總結一下:

  • 版本選擇(Release或者Snapshot,推薦使用Release)
  • 依賴引入(maven或者gradle)
  • swagger設置
  • 重要細節(Spring-Fox官方文檔中沒有指明!!!)

按照官方文檔說明的是,他們的demo是在SpringBoot下面實現的,如今咱們須要單一的拆分出來,能夠當作咱們的項目就是Spring-Mvc,因此一些細節須要改變,固然當中一個很重要的細節官方文檔也是沒有指明,因此看官們且看我細細道來。

引入依賴資源

首先咱們引入引來資源,通讀全文最基本的依賴是:springfox-swagger、springfox-swagger-ui,因此咱們直接老規矩,在gradle的配置文件中引入依賴:

compile "io.springfox:springfox-swagger2:2.6.1"
compile 'io.springfox:springfox-swagger-ui:2.6.1'複製代碼

在引入上面的基本依賴後,咱們查看他們關聯的依賴能夠發現這些依賴裏面還有引入jackson,這個時候咱們能夠選擇提高咱們的Jackson或者無論他們也行,不過我仍是吧Jackson的版本提高了:

compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.4'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.8.4'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.8.4'複製代碼

swagger設置

根據官方文檔咱們能夠看到有一個swagger設置須要先引入後,才能讓咱們設定的東西生效,因此咱們先引入設置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/** * Created by mac on 2017/1/8. */
@Configuration  //說明這個是spring的設置
@EnableWebMvc   //不是SpringBoot須要引入這個
@EnableSwagger2 //開啓Swagger2
@ComponentScan("cn.acheng1314.controller")  //指定被掃描Controller的位置
public class Swagger2SpringMvc extends WebMvcConfigurerAdapter {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)  //Docket,Springfox的私有API設置初始化爲Swagger2
                .select()
// .apis(RequestHandlerSelectors.basePackage("cn.acheng1314.controller")) //此處設置掃描包和上面設置的掃描包同樣效果
                .paths(PathSelectors.any())
                .build()
                .apiInfo(new ApiInfoBuilder()  //設置API文檔的主體說明
                        .title("博客Apis")
                        .description("雨下一整夜的博客APIs")
                        .version("1.01")
                        .termsOfServiceUrl("http://acheng1314.cn/")
                        .build())
// .pathMapping("/")
// .genericModelSubstitutes(ResponseEntity.class)
// .alternateTypeRules(
// newRule(typeResolver.resolve(DeferredResult.class,
// typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
// typeResolver.resolve(WildcardType.class)))
                ;
    }

}複製代碼

設置完成上面的東西后,咱們須要幹什麼呢? 上面咱們很明顯的看到咱們 @configuration是一個spring框架的註解 ,顧名思義確定就應該是一個spring的設置。同時咱們能夠在idea的編輯器中看到類名有一層淡黃色的標記,而後選中類名按下代碼提示(Alt+Enter)會有提示告訴咱們這個設置沒有使用,而後自動完成後會給咱們自動添加到Spring的ApplicationContext中做爲CodeContext使用。

固然,上面的是懶人作事這樣作的後果會是致使apiInfo的設置不能生效。

那麼正常一點的應該是怎麼作呢?按照Spring的思想來講,咱們須要在Spring的設置文件中直接引入bean。因此咱們在spring-web.xml中插入對應的bean,以下:

<!--SpringFox設置引入-->
<bean id="SpringFox" class="cn.acheng1314.Swagger2SpringMvc"/>複製代碼

經過這樣的在spring的配置文件中設置後,咱們感受應該是能用的,因此咱們能夠先跑起來看看。

重要細節,我有特殊的裝X技巧

按照官方文檔咱們徹底設定了後,咱們能夠看到就算咱們在代碼中引入了配置後,同樣的在裏面不能看到網頁的接口列表(只看獲得上面的標題欄,下面的是空白),而後咱們仔細的查看網頁的請求會發現

http://localhost:8080/swagger-resources/configuration/ui複製代碼

這個請求是404。說實話這個錯誤困擾了我好久,同時這個問題前面我處理的時候仍是有一系列的綜合問題,後面整個工程師重建後完成的。

可是如今這個問題簡單直接找到問題所在了,那就是在咱們spring的設置中,關於web的設置咱們都是在spring-web.xml中完成的,同時裏面的東西咱們須要改動一下才能適應如今的須要,以下:

<!-- 4.掃描web相關的bean -->
    <context:component-scan base-package="cn.acheng1314.controller">
        <!-- 制定掃包規則 ,只掃描使用@Controller註解的JAVA類 -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

<!--上面的是原來的設置,如今咱們新的代碼以下:-->
<!-- 4.掃描web相關的bean -->
    <context:component-scan base-package="cn.acheng1314.controller,springfox">
        <!-- 制定掃包規則 ,只掃描使用@Controller註解的JAVA類 -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>複製代碼

也就是說,咱們除了要在Spring的配置文件中引入bean來初始化swagger相關的東西之外,咱們還須要在web掃描那裏添加springfox的掃描。因此咱們spring-fox的設置相關的完成了。

Spring-Fox的使用

從前面的學習中咱們能夠明白咱們全部的網絡請求都是在controller中來實現的,因此咱們這裏須要經過對controller作適當的修改才能實現SpringFox的使用。具體的直接仍代碼上來,你們詳細的看看就好了,不須要什麼深刻鑽研。

import cn.acheng1314.domain.*;
import cn.acheng1314.domain.Response.HomeBean;
import cn.acheng1314.service.postService.PostService;
import cn.acheng1314.service.userService.UserService;
import cn.acheng1314.utils.GsonUtils;
import cn.acheng1314.utils.PublicUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;

import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE;

/** * 前端頁面的控制器,博客系統前端頁面相對較少,因此都扔在這裏了 * Created by 程 on 2016/11/25. */
@Controller
@RequestMapping("/front")
@Api(value = "/front", description = "前臺頁面")
public class FrontWebController {

    @Autowired
    private PostService postService;
    @Autowired
    private UserService userService;

    /** * 返回主頁面 * * @return */
    @RequestMapping(value = "/main", method = RequestMethod.GET)
    @ApiOperation(
            value = "打開首頁界面"
            , notes = "首頁web界面,js模板加載網頁數據")
    public ModelAndView frontMain(HttpServletRequest request) throws Exception {
        ModelAndView view = new ModelAndView("frontMain");
        view.addObject("framJson", getFramJson());
        view.addObject("postsJson", findPublishPost(request, 1, 10));
        return view;
    }

    /** * 獲取文章分頁列表 * * @param request 用戶請求 * @param pageNum 當前頁碼 * @param pageSize 每一頁的長度 * @return * @throws Exception */
    @RequestMapping(value = "/findPublishPost"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ResponseBody
    @ApiOperation(  //接口描述
            value = "獲取文章分頁列表"  //功能簡介
            , notes = "返回文章列表,分頁加載" //接口功能說明
            , response = PostBean.class,    //返回數據的值說明
            responseContainer = "List") //返回數據類型說明
    public Object findPublishPost(HttpServletRequest request, @ApiParam(value = "當前頁碼,默認不能爲空,不然爲1", required = true, //參數是否必傳 defaultValue = "1" //參數默認值爲1 // ,allowableValues = "available,pending,sold" //暫時未知,待查閱文章 // ,allowMultiple = true //是否容許allowMultiple類型的參數 ) @RequestParam("pageNum") int pageNum, @ApiParam(value = "每一頁的長度,默認不能爲空,不然列表條目數量爲10", required = true, //參數是否必傳 defaultValue = "10" //參數默認值爲1 // ,allowableValues = "available,pending,sold" //暫時未知,待查閱文章 // ,allowMultiple = true //是否容許allowMultiple類型的參數 ) @RequestParam("pageSize") int pageSize) throws Exception {
        PageSplit page;
        ResponseList<PostBean> list = new ResponseList<>();

        if (PublicUtil.isJsonRequest(request)) {    //確認是不是post的json提交
            page = new GsonUtils().jsonRequest2Bean(request.getInputStream(), PageSplit.class);  //轉換爲指定類型的對象
            pageNum = page.getPageNum();
            pageSize = page.getPageSize();
        }
        if (pageNum <= 0) {
            pageNum = 1;
        }
        if (pageSize == 0) {
            pageSize = 10;
        }

        try {
            int toalNum; //總頁碼
            toalNum = postService.getAllCount();    //先把總條數賦值給總頁數,做爲緩存變量,減小下面算法的查找次數

            toalNum = toalNum % pageSize > 0 ? toalNum / pageSize + 1 : toalNum / pageSize;     //在每頁固定條數下能不能分頁完成,有餘則加一頁碼

            List<PostBean> tmp = postService.findAllPublish(pageNum, pageSize);
            if (null == tmp || tmp.size() == 0) {
                list.setCode(ResponseList.EMPUTY);
                list.setMsg(ResponseList.EMPUTY_STR);
                return new GsonUtils().toJson(list);
            }
            list.setCode(ResponseList.OK);
            list.setMsg(ResponseList.OK_STR);
            list.setPageNum(pageNum);
            list.setTotalNum(toalNum);
            list.setPageSize(pageSize);
            list.setData(tmp);
            return new GsonUtils().toJson(list);
        } catch (Exception e) {
            e.printStackTrace();
            //查詢失敗
            list.setCode(ResponseObj.FAILED);
            list.setMsg(ResponseList.FAILED_STR);
            return new GsonUtils().toJson(list);
        }

    }

    /** * 查找最近的文章 * * @return */
    @RequestMapping(value = "/findNewPost"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(
            value = "獲取最近文章"
            , notes = "獲取最近文章的json,具體字段請參照輸出的json數據"
            , response = PostBean.class)
    @ResponseBody
    public Object findNewPost() {
        ResponseObj<Object> responseObj = new ResponseObj<>();
        try {
            List<PostBean> allNew = postService.findAllNew();
            if (null == allNew || allNew.isEmpty()) {
                responseObj.setCode(ResponseObj.EMPUTY);
                responseObj.setMsg(ResponseObj.EMPUTY_STR);
            } else {
                responseObj.setCode(ResponseObj.OK);
                responseObj.setMsg(ResponseObj.OK_STR);
                responseObj.setData(allNew);
            }
            return new GsonUtils().toJson(responseObj);
        } catch (Exception e) {
            e.printStackTrace();
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg(ResponseObj.FAILED_STR);
            return new GsonUtils().toJson(responseObj);
        }
    }

    /** * 獲取熱點文章信息 * * @return */
    @RequestMapping(value = "/findHotPost"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(
            value = "獲取最熱文章"
            , notes = "獲取最熱文章的json,具體字段請參照輸出的json數據"
            , response = PostBean.class)
    @ResponseBody
    public Object findHotPost() {
        return findNewPost();
    }

    /** * 獲取隨機文章信息 * * @return 返回json */
    @RequestMapping(value = "/findRandomPost"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(
            value = "隨機獲取文章"
            , notes = "隨機獲取文章的json,具體字段請參照輸出的json數據"
            , response = PostBean.class)
    @ResponseBody
    public Object findRandomPost() {
        return findNewPost();
    }

    /** * 獲取主頁的json數據,按照道理講這裏應該根據頁面結構拆分組合的 * * @param user 用戶信息 * @return 返回首頁json */
    @RequestMapping(value = "/home"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ResponseBody
    @Deprecated
    public Object getHomeJson(User user) {
        if (null != user) {
            //埋點,AOP日誌記錄
        }
        HomeBean homeBean = new HomeBean(); //首頁內容
        HomeBean.DataBean dataBean = new HomeBean.DataBean();   //首頁下面的Data內容對象
        try {
            int toalNum; //總頁碼

            toalNum = postService.getAllCount();    //先把總條數賦值給總頁數,做爲緩存變量,減小下面算法的查找次數

            toalNum = toalNum % 10 > 0 ? toalNum / 10 + 1 : toalNum / 10;     //在每頁固定條數下能不能分頁完成,有餘則加一頁碼

            List<PostBean> postsData = postService.findAllPublish(1, 10);   //首頁下面的文章內容
            List<PostBean> newData = postService.findAllNew();   //首頁下面的文章內容
            if (null == postsData || postsData.isEmpty()) {
                dataBean.setPosts(null);
            } else {
                dataBean.setPosts(postsData);   //首頁文章列表信息設定
            }
            if (null == newData || newData.isEmpty()) {
                dataBean.setNewPosts(null);
                dataBean.setHotPosts(null);
                dataBean.setRandomPosts(null);
            } else {
                dataBean.setNewPosts(newData);   //首頁文章列表信息設定
                dataBean.setHotPosts(newData);
                dataBean.setRandomPosts(newData);
            }
            List<DateCountBean> allPostDateCount = postService.getAllPostDateCount();
            if (null != allPostDateCount && !allPostDateCount.isEmpty()) {
                dataBean.setDate(allPostDateCount);
            } else {
                dataBean.setDate(null);
            }
            //設置做者信息
            List<HashMap<String, String>> userMeta = userService.getUserMeta(1);
            dataBean.setAuthor(userMeta);

            dataBean.setPageNum(1);
            dataBean.setPageSize(10);
            dataBean.setTotalNum(toalNum);
            homeBean.setData(dataBean);
            homeBean.setCode(ResponseObj.OK);
            homeBean.setMsg(ResponseList.OK_STR);
            return new GsonUtils().toJson(homeBean);
        } catch (Exception e) {
            e.printStackTrace();
            //查詢失敗
            homeBean.setCode(ResponseObj.FAILED);
            homeBean.setMsg(ResponseList.FAILED_STR);
            return new GsonUtils().toJson(homeBean);
        }
    }

    /** * 頁面框架的變化信息 * 一、我的信息 * 二、最新熱點隨機文章信息 * 三、標籤信息 * * @return */
    @RequestMapping(value = "/getFramJson"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(
            value = "獲取主題框架的json"
            , notes = "整個頁面的主體框架的json數據")
    @ResponseBody
    public Object getFramJson() {
        HomeBean homeBean = new HomeBean(); //首頁內容
        HomeBean.DataBean dataBean = new HomeBean.DataBean();   //首頁下面的Data內容對象
        try {
            List<PostBean> newData = postService.findAllNew();
            if (null == newData || newData.isEmpty()) {
                //頁面上面推薦的文章信息不爲空
                dataBean.setNewPosts(null);
                dataBean.setHotPosts(null);
                dataBean.setRandomPosts(null);
            } else {
                //首頁文章列表信息設定
                dataBean.setNewPosts(newData);
                dataBean.setHotPosts(newData);
                dataBean.setRandomPosts(newData);
            }

            //日期歸檔
            List<DateCountBean> allPostDateCount = postService.getAllPostDateCount();
            if (null != allPostDateCount && !allPostDateCount.isEmpty()) {
                dataBean.setDate(allPostDateCount);
            } else {
                dataBean.setDate(null);
            }
            //設置做者信息
            List<HashMap<String, String>> userMeta = userService.getUserMeta(1);
            dataBean.setAuthor(userMeta);

            homeBean.setData(dataBean);
            homeBean.setCode(ResponseObj.OK);
            homeBean.setMsg(ResponseList.OK_STR);
            return new GsonUtils().toJson(homeBean);
        } catch (Exception e) {
            e.printStackTrace();
            //查詢失敗
            homeBean.setCode(ResponseObj.FAILED);
            homeBean.setMsg(ResponseList.FAILED_STR);
            return new GsonUtils().toJson(homeBean);
        }
    }

    /** * 根據做者的ID獲取做者的信息 * * @param userId 做者ID * @return 返回做者的json信息 */
    @RequestMapping(value = "/getAuthorInfo"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(
            value = "獲取做者信息"
            , notes = "獲取做者基本信息的json,具體字段請參照輸出的json數據"
            , response = PostBean.class)
    @ResponseBody
    public Object getAuthorJson(int userId) {
        ResponseObj<Object> responseObj = new ResponseObj<>();
        try {
            List<HashMap<String, String>> userMeta = userService.getUserMeta(userId);
            if (null == userMeta || userMeta.isEmpty()) {
                responseObj.setCode(ResponseObj.EMPUTY);
                responseObj.setMsg(ResponseObj.EMPUTY_STR);
            } else {
                responseObj.setCode(ResponseObj.OK);
                responseObj.setMsg(ResponseObj.OK_STR);
                responseObj.setData(userMeta);
            }
            return new GsonUtils().toJson(responseObj);
        } catch (Exception e) {
            e.printStackTrace();
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg(ResponseObj.FAILED_STR);
            return new GsonUtils().toJson(responseObj);
        }
    }

    /** * RESTful風格的文章頁面 * * @param postId 文章ID * @return 返回文章頁面 */
    @RequestMapping(path = "/post/{postId}", method = RequestMethod.GET)
    @ApiOperation(
            value = "打開文章詳情web界面"
            , notes = "文章詳情web界面,js模板加載網頁數據")
    public ModelAndView getPostView(@PathVariable int postId) {
        ModelAndView resultView = new ModelAndView("frontPost");
        resultView.addObject("framJson", getFramJson());
        resultView.addObject("postJson", getPostById(postId));
        return resultView;
    }

    /** * 根據文章ID獲取文章內容 * * @param postId 文章ID * @return 返回文章ID對應的文章內容 */
    @RequestMapping(value = "/getPost"
            , produces = {APPLICATION_JSON_UTF8_VALUE}
            , method = {RequestMethod.GET, RequestMethod.POST})
    @ApiOperation(
            value = "根據id獲取文章json"
            , notes = "根據文章的ID獲取文章的詳情json"
            , response = PostBean.class)
    @ResponseBody
    public Object getPostById( @ApiParam(value = "文章ID", required = true) @RequestParam("postId") int postId) {
        ResponseObj<Object> responseObj = new ResponseObj<>();
        try {
            PostBean postBean = postService.findPostById(postId);
            if (null == postBean) {
                responseObj.setCode(ResponseObj.EMPUTY);
                responseObj.setMsg(ResponseObj.EMPUTY_STR);
            } else {
                responseObj.setCode(ResponseObj.OK);
                responseObj.setMsg(ResponseObj.OK_STR);
                responseObj.setData(postBean);
            }
            return new GsonUtils().toJson(responseObj);
        } catch (Exception e) {
            e.printStackTrace();
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg(ResponseObj.FAILED_STR);
            return new GsonUtils().toJson(responseObj);
        }
    }

}複製代碼

至此咱們的Spring-Fox簡單實用已經完成,後續的操做咱們在須要的地方再查找資料就好了。

總結

本期項目都是簡單的介紹了一些東西,主要有:

  • 登陸密碼校驗規則(MD5→SHA256)
  • Spring-Fox的引入
  • Spring-Fox在非springBoot中的使用
  • Spring-Fox的使用

這一期原本是上一週就應該完成的,可是回家懶癌發做又拖了一週,期間女友還各類生病,天天也沒心思寫代碼,很對不起你們了,後面我會更加努力,也感謝一些哥們在我博客上面的留言鼓勵,謝謝你們。

相關文章
相關標籤/搜索