发表于: 2021-05-18 21:13:50

6 1218


一,今天完成的事情

任务三3-9

1,任务三条目3.依照接口规范设计好接口,遵循Rest风格,写好接口文档。

前台部分有的需要查询单个,有的需要查询多个,回复可以插入。查询的入参,规则不同,需要的结果不同。

我根据Rest风格规范设计了接口。接口文档如下。前面都需要加上前台域名,本地测试是localhost


Artstudio

查询所有展示的artstudio, should be show 1。后台使用,image_url不处理,后台,且列表不展示图

GET

/artstudio/all

请求参数:无

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
artstudios
结果列表
List


选择一个工作室管理页面

GET

/artstudio/{id}

请求参数:

字段
说明
类型
备注
是否必填
id
工作室管理id
Number


返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
artstudio
结果
Artstudio


Artwork

通过主键查询单条作品

GET

/artwork/{id}

请求参数

FieldTypeDescription
idNumber作品id


返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
artwork
结果
Artwork


查询所有可展示作品,根据修改时间先新后旧

GET

/artwork/all

请求参数:无

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
artworks
结果列表
List




查询对应manuId下可展示作品,所有,根据修改时间先新后旧

GET

/artwork/manuid/{manuId}

请求参数:

FieldTypeDescription
manuIdNumber上级,作品所属导航栏id

必须

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
artworks
结果列表
List


Banner

查询X个banners, 限制目前是6个, should be show 1

GET

/banner/limitbanners

请求参数:无

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
banners
结果列表
List



CommentReply

新增评论或者留言一个

POST

/commentReply

请求体

FieldTypeDescription
idNumber评论回复id
createdAtNumber创建时间
updatedAtNumber修改时间
editorIdNumber编辑人id
artworkIdNumber作品id
statusNumber

comment shows1;noshow0;administrators' reply2

parentIdNumber上级id。对于外部评论,上级id是作品id,此处设为0。对于作者回复,上级id是评论的id
contentString评论回复的文字内容

全部必填

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
commentReply
结果
CommentReply

返回被插入的对象



查询作品id下所有留言评论, 层级展示 return 对象列表,层级展示

GET

/commentReply/allcommentreply/{artworkId}

请求参数

FieldTypeDescription
artworkIdNumber作品id

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
commentReplies
结果层级
带层级的commentReply元素,List



查询作品Id下所有留言评论。return 对象列表,平板带parent_id

GET

/commentReply/all/{artworkId}

请求参数

FieldTypeDescription
artworkIdNumber作品id

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
commentReplies对象列表
List



Manu

查询root下所有目录, should be show 1 return 导航栏tree

GET

/manu/manuVoTree/{rootId}

请求参数

FieldTypeDescription
rootIdNumber想要查询的导航栏的根(上级)id。根的id是0,是一级导航的父,没有实际值


返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
manus
结果层级
导航tree,从根开始



查询root下所有目录, should be show 1 return 对象列表,平板带parent_id

GET

/manu/sortedlist/{rootId}

请求参数

FieldTypeDescription
rootIdNumber想要查询的导航栏的根(上级)id。根的id是0,是一级导航的父,没有实际值

返回参数:

字段
说明
类型
备注
是否必填
code
HTTP 状态码
Number
message
文字信息
String
commentReplies对象列表
List


2,任务三条目4.创建项目工程,先写好假数据。

我创建了一个web项目


由于GET需要输入ID或者不需要入参,简单。假数据准备了POST的json数据。

{
    "createdAt": 1678,
    "editorId": 1,
    "artworkId": 2,
    "id": 1,
    "parentId": 2,
    "content": "AzLfnNst0",
    "updatedAt": 7315,
    "status": 1}


Navicat输入数据简单,所以一开始就是用navicat输入数据后测试。service层写测试代码,和dao一起测试。

在service test中,带层级的各种测试,想到各种情况,new对象要new很多个对象,一一填写参数,没有navicat直观。dao也没那么容易有问题。先用小范围,有代表性的数据测试,在本机测试就很好。


3,任务3条目5.写好单元测试,和Service。每一张表的增删改查创建好。

我最终有的单元测试如下:

如果元素较多,不是assert,直接人眼看,在没要求代码测试覆盖的初期已经可以直接发现问题


我每一张表的增删改查,例如dao 的其中一个,是artstudio_ image interface如下。用工具生成基础增删改查。service,controller做比较复杂的处理。dao可能order by,可以limit。但是取到所有元素,service根据要求利用元素属性排序没问题。限制数量没问题。这个项目我都用了。一般对于mysql这样的关系型数据库,一定要想办法减少占用数据库时间,尽量不要锁。

package com.nicole.ssm.dao;

import com.nicole.ssm.entity.ArtstudioImage;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
* (ArtstudioImage)表数据库访问层
*
* @author nicole
*/
public interface ArtstudioImageDao {


/**
    * 查询多个,都是ArtstudioId下的图片
    *
    * @param artstudioId artstudioId
    * @return 实例对象
    */
   List<ArtstudioImage> queryByArtstudioId(Long artstudioId);

   /**
    * 通过ID查询单条数据
    *
    * @param id 主键
    * @return 实例对象
    */
   ArtstudioImage queryById(Long id);

   /**
    * 查询指定行数据
    *
    * @param offset 查询起始位置
    * @param limit 查询条数
    * @return 对象列表
    */
   List<ArtstudioImage> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);


   /**
    * 通过实体作为筛选条件查询
    *
    * @param artstudioImage 实例对象
    * @return 对象列表
    */
   List<ArtstudioImage> queryAll(ArtstudioImage artstudioImage);

   /**
    * 新增数据
    *
    * @param artstudioImage 实例对象
    * @return 影响行数
    */
   int insert(ArtstudioImage artstudioImage);

   /**
    * 修改数据
    *
    * @param artstudioImage 实例对象
    * @return 影响行数
    */
   int update(ArtstudioImage artstudioImage);

   /**
    * 通过主键删除数据
    *
    * @param id 主键
    * @return 影响行数
    */
   int deleteById(Long id);

}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nicole.ssm.dao.ArtstudioImageDao">

   <resultMap id="BaseResultMap" type="com.nicole.ssm.entity.ArtstudioImage">
       <!--@Table artstudio_image-->
       <result property="id" column="id" jdbcType="INTEGER"/>
       <result property="createdAt" column="created_at" jdbcType="INTEGER"/>
       <result property="updatedAt" column="updated_at" jdbcType="INTEGER"/>
       <result property="editorId" column="editor_id" jdbcType="INTEGER"/>
       <result property="status" column="status" jdbcType="INTEGER"/>
       <result property="imageUrl" column="image_url" jdbcType="VARCHAR"/>
       <result property="artstudioId" column="artstudio_id" jdbcType="INTEGER"/>
   </resultMap>

   <!--查询多个,都是ArtstudioId下的图片-->
   <select id="queryByArtstudioId" resultMap="BaseResultMap">
       select
id, created_at, updated_at, editor_id, status, image_url, artstudio_id
from art_room.artstudio_image
where artstudio_id = #{artstudioId}
</select>

   <!--查询单个-->
   <select id="queryById" resultMap="BaseResultMap">
       select
id, created_at, updated_at, editor_id, status, image_url, artstudio_id
from art_room.artstudio_image
where id = #{id}
</select>

   <!--查询指定行数据-->
   <select id="queryAllByLimit" resultMap="BaseResultMap">
       select
id, created_at, updated_at, editor_id, status, image_url, artstudio_id
from art_room.artstudio_image
limit #{offset}, #{limit}
</select>

   <!--通过实体作为筛选条件查询-->
   <select id="queryAll" resultMap="BaseResultMap">
       select
id, created_at, updated_at, editor_id, status, image_url, artstudio_id
from art_room.artstudio_image
<where>
           <if test="id != null">
               and id = #{id}
</if>
           <if test="createdAt != null">
               and created_at = #{createdAt}
</if>
           <if test="updatedAt != null">
               and updated_at = #{updatedAt}
</if>
           <if test="editorId != null">
               and editor_id = #{editorId}
</if>
           <if test="status != null">
               and status = #{status}
</if>
           <if test="imageUrl != null and imageUrl != ''">
               and image_url = #{imageUrl}
</if>
           <if test="artstudioId != null">
               and artstudio_id = #{artstudioId}
</if>
       </where>
   </select>

   <!--新增所有列-->
   <insert id="insert" keyProperty="id" useGeneratedKeys="true">
       insert into art_room.artstudio_image(created_at, updated_at, editor_id, status, image_url, artstudio_id)
values (#{createdAt}, #{updatedAt}, #{editorId}, #{status}, #{imageUrl}, #{artstudioId})
</insert>

   <!--通过主键修改数据-->
   <update id="update">
       update art_room.artstudio_image
<set>
           <if test="createdAt != null">
               created_at = #{createdAt},
</if>
           <if test="updatedAt != null">
               updated_at = #{updatedAt},
</if>
           <if test="editorId != null">
               editor_id = #{editorId},
</if>
           <if test="status != null">
               status = #{status},
</if>
           <if test="imageUrl != null and imageUrl != ''">
               image_url = #{imageUrl},
</if>
           <if test="artstudioId != null">
               artstudio_id = #{artstudioId},
</if>
       </set>
       where id = #{id}
</update>

   <!--通过主键删除-->
   <delete id="deleteById">
       delete from art_room.artstudio_image where id = #{id}
</delete>

</mapper>


4,任务三条目6.编写Ctroller,写好业务逻辑,图片直接存储在本地,配置Nginx去读取

对于前端,我返回的数据有Parent_id,所以父子关系前端是可以用直接列表处理的。但是我也写了前端喜欢的层级展示方式。

本报告展示artstudio controller,在service层就把多个image处理,用逗号分隔组合到了Artstudio的单个元素中。

package com.nicole.ssm.controller;

import com.nicole.ssm.entity.Artstudio;
import com.nicole.ssm.rest.Restful;
import com.nicole.ssm.service.ArtstudioService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
* (Artstudio)表控制层
*
* @author makejava
* @since 2021-05-11 15:40:06
*/
@RestController
@RequestMapping("/artstudio")
public class ArtstudioController {
private Logger logger = LoggerFactory.getLogger(ArtstudioController.class);

   /**
    * 服务对象
    */
   @Autowired
   private ArtstudioService artstudioService;

   /**
    * @api {GET} /artstudio/{id} selectOne
    * @apiVersion 1.0.0
    * @apiGroup ArtstudioController
    * @apiName selectOne
    * @apiDescription 选择一个工作室管理页面
    * @apiParam (请求参数) {Number} id
    * @apiParamExample 请求参数示例
    * id=2221
    * @apiSuccess (响应结果) {Object} response
    * @apiSuccessExample 响应结果示例
    * {}
    */
   @RequestMapping (value = "/{id}", method = RequestMethod.GET)
@ResponseBody
   public Map<String,Object> selectOne(@PathVariable(name = "id") long id) {
Artstudio artstudio = this.artstudioService.queryById(id);
       if ( null != artstudio ) {
return  Restful.set(200, "show artstudio successfully", artstudio);
       }
return Restful.set(404, "null artstudio showed");
   }


/**
    * @api {GET} /artstudio/all queryAllShow
    * @apiVersion 1.0.0
    * @apiGroup ArtstudioController
    * @apiName queryAllShow
    * @apiDescription 查询所有展示的artstudio, should be show 1。后台使用,image_url不处理,后台,且列表不展示图
    * @apiSuccess (响应结果) {Object} response
    * @apiSuccessExample 响应结果示例
    * {}
    */
   @RequestMapping (value = "/all", method = RequestMethod.GET)
@ResponseBody
   public Map<String,Object> queryAllShow() {
List<Artstudio> artstudios = artstudioService.queryAllShow();
       if ( null != artstudios ) {
return Restful.set(200, "show artstudios successfully", artstudios);

       }
return Restful.set(404, "null artstudios showed");
   }


}


配置Nginx,读取Nginx所在地,这里是我服务器本地的图片。

访问图片,视频等资源的时候,这2种变化一般不多,而且相对占用空间大。一般会说Nginx能配置动静分离,提高用户访问静态代码的速度,降低对后台应用访问。找到nginx .conf


之前新建了/usr/local/static 存放静态文件。其中/images存放图片


设置如下后,root是将images映射到/usr/local/static/images/  。目前图中的access log相关还是被 # 注释。红框上面是反向代理resin的配置。autoindex on是打开浏览功能。


修改完成后,进入到/usr/local/nginx/sbin 目录下

执行  ./nginx -s reload 重启nginx服务器


检查文件夹权限正确


在static/image中加入若干图片,访问结果



之前红框中还能做如下配置,第一行用正则表达式限制可以上传的文件的后缀。用expires 按照说明,配置-1 ,秒s,小时h,天数d,设置缓存时间。

location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {

root /var/xxxx/img/;

expires 30h;

}



二,今天问题

况师兄好。线下学习相对于线上学习的区别是什么?

复盘才开始敏捷开发实战吗?


三,今天的收获

任务三的

4.创建项目工程,先写好假数据。

5.写好单元测试,和Service。每一张表的增删改查创建好。

6.编写Ctroller,写好业务逻辑,图片直接存储在本地,配置Nginx去读取

7.Postman测试所有接口数据是否正常。

8.手动修改数据库,填充上正确的数据。

是很好的开发习惯。



越做越会。

不管一个人是什么背景,以前的经历如何,只要一个人基本掌握一份工作需要技能,能胜任工作,就能获得一份工作的录用。

最近3天一家公司的HR又来问我要不要去面试的事情,这家HR的KPI太难完成了。加班对我不是问题,公司技术名声在外一般都是好评,钱到位。我本人对公司也很认同。但是,我要达到要求才是核心。

从面试的角度说。这家公司的算法部分我信心满满,Medium或者以下几乎都能比较快的完成对方要求。要是常用数据结构hard的我也没什么问题。面向对象设计,甚至系统设计也比较有信心。自我各种介绍一般略过。

但是类似“深度思考”的题目,不知道怎么才能把握好对方的风格。不现场写代码来聊天的风格,我把握不好。我喜欢算法,喜欢逻辑。


从另一个角度说,就是葡萄藤老大的显著优点,就是我的缺点。


四,明天的计划

任务三7-9



返回列表 返回列表
评论

    分享到