国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

蒼穹外賣(mài)day02項(xiàng)目日志

這篇具有很好參考價(jià)值的文章主要介紹了蒼穹外賣(mài)day02項(xiàng)目日志。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 描述清楚新增員工的實(shí)現(xiàn)流程

1.1需求分析與設(shè)計(jì)

參考產(chǎn)品原型,設(shè)計(jì)表和接口。

1.1.1設(shè)計(jì)表

看員工管理的產(chǎn)品原型:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

有員工姓名、賬號(hào)、手機(jī)號(hào)、賬號(hào)狀態(tài)、最后操作時(shí)間等。

注意,操作一欄不是字段,其中的啟用禁用才是。

再看添加員工的原型:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?可以發(fā)現(xiàn)還有性別和身份證號(hào)。

不要忘了旁邊:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

還有密碼。

總結(jié)出了以下字段:

員工姓名name

用戶名username

密碼password

手機(jī)號(hào)tel

性別gender

身份證號(hào)idNumber

啟用禁用狀態(tài)status

更新時(shí)間update_time

這些統(tǒng)稱(chēng)為業(yè)務(wù)字段。

不過(guò)除了這些,還有基礎(chǔ)字段

主鍵id

創(chuàng)建時(shí)間create_time

創(chuàng)建操作人create_user

更新時(shí)間update_time

更新操作人update_user

這樣就設(shè)計(jì)完了表。

作為練習(xí),然后我們可以回過(guò)頭來(lái)和設(shè)計(jì)好的表進(jìn)行對(duì)比,看我們漏了哪一步?jīng)]有。

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

可以看到,多了一個(gè)昨天加的,用來(lái)驗(yàn)證登錄的鹽值salt,其他都一樣。?

1.1.2設(shè)計(jì)接口

設(shè)計(jì)接口需要設(shè)計(jì)4個(gè)東西:

  1. 請(qǐng)求路徑
  2. 請(qǐng)求參數(shù)
  3. 請(qǐng)求方式
  4. 響應(yīng)數(shù)據(jù)

對(duì)應(yīng)我們這個(gè)新增員工的接口就是如下設(shè)計(jì):

  1. 請(qǐng)求路徑?/admin/employee(可以加/add,也可以通過(guò)請(qǐng)求方式確定添加操作)
  2. 請(qǐng)求參數(shù)?傳json(如{“username”:”xxx”, “name”:””, “tel”:””, “sex(或gender)”:””})
  3. 請(qǐng)求方式?POST
  4. 響應(yīng)數(shù)據(jù) {“code”:””,”msg(錯(cuò)誤信息,錯(cuò)了是什么原因)”:””, data:””}

注意,在公司里,接口設(shè)計(jì)或多或少都會(huì)和現(xiàn)在學(xué)的有些出入,這是正常的,習(xí)慣一下。

另外,正真在公司里,設(shè)計(jì)表會(huì)比較少,因?yàn)榫湍敲磶讉€(gè);但設(shè)計(jì)接口會(huì)比較多。而復(fù)雜點(diǎn)的表,小后端的水平也設(shè)計(jì)不太來(lái)。沒(méi)關(guān)系,慢慢學(xué)。

1.2代碼開(kāi)發(fā)

3步,分別是寫(xiě)Controller、寫(xiě)Service、寫(xiě)Mapper。

1.2.1寫(xiě)入表現(xiàn)層Controller

接受請(qǐng)求參數(shù),調(diào)用service完成添加操作,響應(yīng)結(jié)果。

代碼如下:

/**
 * 員工管理
 */
@RestController
@RequestMapping("/admin/employee")
@Slf4j
@Api(tags = "硬普洛伊康戳勒 員工相關(guān)接口")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;
    
    ...

    /**
     * 員工新增功能
     * @param employeeDTO 前端提交的參數(shù)
     * @return 成功的結(jié)果
     */
    @PostMapping
    public Result add(@RequestBody EmployeeDTO employeeDTO) {
        employeeService.addEmp(employeeDTO);
        return Result.success();
    }
}

1.2.2寫(xiě)入業(yè)務(wù)層Service

根據(jù)數(shù)據(jù)庫(kù)中字段的要求,完善數(shù)據(jù),調(diào)用mapper完成添加操作。

接口中:

public interface EmployeeService {

    ...

    /**
     * 員工新增功能
     */
    void addEmp(EmployeeDTO employeeDTO);
}

實(shí)現(xiàn)類(lèi)中:

@Service
public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    private EmployeeMapper employeeMapper;

    ...

    @Override
    public void addEmp(EmployeeDTO employeeDTO) {
        // employeeDTO: username name phone sex idNumber
        // database: id password status salt create_tim create_user update_time update_user
        // our preparing work: password(described in origin) salt create_time update_time
        // our preparing work: create_user update_user(awkward somehow, do it later)

        // Create object of Employee
        Employee employee = new Employee();

        // copy data in EmployeeDTO to employee
        BeanUtils.copyProperties(employeeDTO, employee);

        // supplement data
        LocalDateTime now = LocalDateTime.now();
        employee.setUpdateTime(now);
        employee.setCreateTime(now);
        // TODO create user and update user haven't finish rightly
        employee.setCreateUser(666L);
        employee.setUpdateUser(666L);
        String password = "123456";

        // product a random salt
        String salt = UUID.randomUUID().toString().replace("-", "");
        // finish MD5 with both salt and origin password
        password = DigestUtils.md5DigestAsHex((password + salt).getBytes());
        employee.setPassword(password);
        employee.setSalt(salt);

        // insert
        employeeMapper.insertEmp(employee);
    }

}

注意那個(gè)TODO注釋?zhuān)梢栽趇dea下面窗口中顯示你還需要完善的代碼。

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

講到這,老師講了一個(gè)慘痛的經(jīng)歷:

有個(gè)老哥,寫(xiě)測(cè)試類(lèi)忘改了,下單都是0.01元,給公司損失了幾十上百萬(wàn)……

這老哥被開(kāi)沒(méi)開(kāi),被告沒(méi)告,不知道,不過(guò)大家一定要吸取教訓(xùn)啊。

1.2.3寫(xiě)入持久層Mapper

@Mapper
public interface EmployeeMapper {

    /**
     * 根據(jù)用戶名查詢(xún)員工
     * @param username
     * @return
     */
    @Select("select * from employee where username = #{username}")
    Employee getByUsername(String username);

    /**
     * 添加員工
     * @param employee
     */
    void insertEmp(Employee employee);
}

對(duì)應(yīng)xml文件中:

<?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.sky.mapper.EmployeeMapper">

    <insert id="insertEmp">
        insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user,
                              update_user, salt)
        value (#{name}, #{username}, #{password}, #{phone}, #{sex}, #{idNumber}, #{createTime}, #{updateTime},
            #{createUser}, #{updateUser}, #{salt})
    </insert>

</mapper>

1.2.4Swagger測(cè)試

運(yùn)行項(xiàng)目,進(jìn)入Swagger鏈接:

http://localhost:8080/doc.html

首先到登錄接口,用管理員賬戶登錄,獲得請(qǐng)求頭。

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?到全局參數(shù)設(shè)置,加入我們的請(qǐng)求頭。

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

然后進(jìn)入添加員工界面,輸入?yún)?shù)測(cè)試是否正常添加員工。?

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

查看顯示結(jié)果:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?1.3代碼完善

1.3.1異常處理

用戶輸入的用戶名在數(shù)據(jù)庫(kù)中已經(jīng)存在,這種情況下會(huì)報(bào)錯(cuò),需要處理。

解決方式:

在全局異常處理器中添加一個(gè)方法,專(zhuān)門(mén)處理這個(gè)異常;

在異常處理方法中,截取重復(fù)的用戶名,響應(yīng)錯(cuò)誤信息給前端。

代碼:

@ExceptionHandler
public Result sqlIntegrityConstraintViolationExceptionHandler(SQLIntegrityConstraintViolationException ex){
    String message = ex.getMessage();
    log.error("異常信息:{}", message);
    // 1. 判斷異常類(lèi)型是否是想處理的類(lèi)型 / 是否包含Duplicate entry
    if (message.contains("Duplicate entry")) {
        // 2. 如果是,則獲取異常message  Duplicate entry 'abc' for key 'employee.idx_username'
        // 3. 截取用戶名信息
        String username = message.split(" ")[2];
        // 4. 拼接提示信息 “xxx用戶名已存在,請(qǐng)重新輸入”
        // 5. 返回錯(cuò)誤信息給前端
        return Result.error(username+"用戶名已存在,請(qǐng)重新輸入");
    }
    
    return Result.error(ex.getMessage());
}

1.3.2創(chuàng)/修改人設(shè)置(ThreadLocal)

詳見(jiàn)下面第三大問(wèn)。

1.4測(cè)試

1.4.1接口測(cè)試

用Swagger。

測(cè)試正常添加功能:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

在數(shù)據(jù)庫(kù)中查看添加人情況:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

添加重復(fù)名稱(chēng)員工,測(cè)試異常處理功能:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

1.4.2前端后端聯(lián)調(diào)

測(cè)試正常添加功能:?

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

在數(shù)據(jù)庫(kù)中查看添加人情況:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

添加重復(fù)名稱(chēng)員工,測(cè)試異常處理功能:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

2. 描述清楚員工分頁(yè)條件查詢(xún)的實(shí)現(xiàn)流程

2.1需求分析

2.1.1分析產(chǎn)品原型扣細(xì)節(jié)

查詢(xún)需要加分頁(yè)和查詢(xún)條件(模糊匹配,動(dòng)態(tài)SQL)。

排序按照創(chuàng)建時(shí)間降序排列。

2.1.2接口設(shè)計(jì)

  1. 請(qǐng)求路徑?

    /admin/employee
    至于添加子路徑,那得看情況??赡苡泻芏嗖煌N的查詢(xún),就加路徑;簡(jiǎn)單情況下,還是用get請(qǐng)求就行了。
    所以加路徑就/admin/employee/page

  2. 請(qǐng)求參數(shù)??page=1&pageSize=10&name=zhangsan
  3. 請(qǐng)求方式?GET
  4. 響應(yīng)數(shù)據(jù)

    {
    ? ? “code”:1
    ? ? “msg”:””,(失敗才有msg)
    ? ? “data”:{
    ? ? ? ? “total(或rows)”:100,
    ? ? ? ? “records”: [
    ? ? ? ? ? ? {},
    ? ? ? ? ? ? {},
    ? ? ? ? ]
    ? ? }
    }

2.2代碼開(kāi)發(fā)

2.2.1Controller層

@ApiOperation(value = "員工分頁(yè)查詢(xún)接口")
@GetMapping("/page")
public Result page(EmployeePageQueryDTO employeePageQueryDTO) {
    PageResult pr = employeeService.pageQuery(employeePageQueryDTO);
    return Result.success(pr);
}

2.2.2Service層

@Override
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
    // 1. 設(shè)置分頁(yè)參數(shù),開(kāi)啟分頁(yè)查詢(xún)
    PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
    // 2. 調(diào)用mapper執(zhí)行分頁(yè)查詢(xún),返回分頁(yè)結(jié)果對(duì)象 Page
    Page<Employee> page = employeeMapper.selectByPageAndName(employeePageQueryDTO.getName());
    // 3. 通過(guò)分頁(yè)對(duì)象Page中獲取當(dāng)前頁(yè)的數(shù)據(jù)和總記錄
    long total = page.getTotal();
    List<Employee> records = page.getResult();
    // 4. 封裝當(dāng)前頁(yè)數(shù)據(jù)和總記錄,封裝進(jìn)PageResult,并返回
    return new PageResult(total, records);
}

2.2.3Mapper層

<select id="selectByPageAndName" resultType="com.sky.entity.Employee">
    select * from employee
    <where>
        <if test="name!=null and name!=''">
            name like concat('%', #{name}, '%')
        </if>
    </where>
    order by create_time desc
</select>

2.3測(cè)試

2.3.1接口測(cè)試

Swagger結(jié)果:

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

2.3.2前后端聯(lián)調(diào)

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-620198.html

?

3. 如何用ThreadLocal實(shí)現(xiàn)員工ID的獲???

3.1簡(jiǎn)化意義

之前學(xué)過(guò)拿到請(qǐng)求頭的方法。大致是:注入request對(duì)象,獲取請(qǐng)求頭,拿到token,再解析token拿到登入id。

這樣子做是可以。但存在問(wèn)題:

代碼太繁瑣了,后期其他地方用到id又要再次編寫(xiě)上面代碼,冗余的地方就會(huì)很多。

于是我們用到了新方案: 利用線程對(duì)象(包含一個(gè)集合,可以實(shí)現(xiàn)在一個(gè)線程之間共享數(shù)據(jù)),在登錄驗(yàn)證的攔截器中實(shí)現(xiàn)獲取id的操作,id設(shè)置到線程對(duì)象變成共享的,使用的時(shí)候獲取即可。這就是ThreadLocal技術(shù)思路。

3.2實(shí)現(xiàn)

我們已經(jīng)定義好了一個(gè)封裝了ThreadLocal的類(lèi),在common模塊下的context包中,有個(gè)BaseContext。

 

?我們看看它的代碼:

package com.sky.context;

public class BaseContext {
    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    public static Long getCurrentId() {
        return threadLocal.get();
    }

    public static void removeCurrentId() {
        threadLocal.remove();
    }

}

3.2.1set方法

其中setCurrentId調(diào)用了ThreadLocal的set方法, 設(shè)置id。

3.2.2get方法

getCurrentId則調(diào)用了get方法,用于得到設(shè)置好的,或者默認(rèn)的id。

3.2.3remove方法

removeCurrentId調(diào)用了remove方法,可以移除設(shè)置的參數(shù),讓內(nèi)存回收。

再看入具體實(shí)現(xiàn):

3.2.4攔截器中添加代碼

//2、校驗(yàn)令牌
try {
    log.info("jwt校驗(yàn):{}", token);
    Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
    Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());
    log.info("當(dāng)前員工id:{}", empId);
    // put hte id in thread
    BaseContext.setCurrentId(empId);  // 添加到此處
    //3、通過(guò),放行
    return true;
} catch (Exception ex) {
    //4、不通過(guò),響應(yīng)401狀態(tài)碼
    response.setStatus(401);
    return false;
}

再這里,我們要獲取當(dāng)前員工的id,并得到。之后就可以調(diào)用ThreadLocal對(duì)象,直接得到員工id,方便插入操作人的操作。

3.2.5業(yè)務(wù)層添加代碼

添加代碼如下:

Long currentId = BaseContext.getCurrentId();
employee.setCreateUser(currentId);
employee.setUpdateUser(currentId);

這里就直接用保存的員工id,進(jìn)行添加了。

3.2.6思考題

什么時(shí)候remove比較合適呢?代碼又應(yīng)該寫(xiě)在哪里呢?

3.3原理

我們可以看一看ThreadLocal中的set方法:

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

可以看到,它將線程和map綁定,以達(dá)到我們的用線程可以得到綁定值的效果。

再看看get方法:

public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

也是同上的原理,調(diào)用綁定的線程就可以獲取對(duì)應(yīng)的設(shè)置的值。

如果還有不清楚,可以再點(diǎn)進(jìn)具體的類(lèi)中看看,比如getMap函數(shù)、ThreadLocalMap對(duì)象中去看。?

3.4思考題答案

我們?cè)诰€程結(jié)束,request結(jié)束的時(shí)候,把它remove了最好。在這之前,可能還是會(huì)用到。

所以寫(xiě)在攔截器的后面兩個(gè)要重寫(xiě)的方法中即可。這里就挑第一個(gè),postHandle。第二個(gè)的afterCompletion也可以。

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    BaseContext.removeCurrentId();
}

4. Java對(duì)象轉(zhuǎn)json的日期格式如何指定?

4.1方案一

在每個(gè)日期屬性上都加上格式轉(zhuǎn)換的代碼。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

4.1.1缺點(diǎn)

繁瑣,每一個(gè)都要加。

4.2方案二

在WebMvcConfiguration中擴(kuò)展SpringMVC的消息轉(zhuǎn)換器,統(tǒng)一對(duì)日期類(lèi)型進(jìn)行格式處理。

使用sky-common模塊中,json包下的JacksonObjectMapper類(lèi)

package com.sky.json;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;

/**
 * 對(duì)象映射器:基于jackson將Java對(duì)象轉(zhuǎn)為json,或者將json轉(zhuǎn)為Java對(duì)象
 * 將JSON解析為Java對(duì)象的過(guò)程稱(chēng)為 [從JSON反序列化Java對(duì)象]
 * 從Java對(duì)象生成JSON的過(guò)程稱(chēng)為 [序列化Java對(duì)象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知屬性時(shí)不報(bào)異常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化時(shí),屬性不存在的兼容處理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注冊(cè)功能模塊 例如,可以添加自定義序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

然后在配置類(lèi)WebMvcConfiguration中加入以下代碼:

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("擴(kuò)展消息轉(zhuǎn)換器...");
    //創(chuàng)建一個(gè)消息轉(zhuǎn)換器對(duì)象
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    //需要為消息轉(zhuǎn)換器設(shè)置一個(gè)對(duì)象轉(zhuǎn)換器,對(duì)象轉(zhuǎn)換器可以將Java對(duì)象序列化為json數(shù)據(jù)
    converter.setObjectMapper(new JacksonObjectMapper());
    //將自己的消息轉(zhuǎn)化器加入容器中
    converters.add(0,converter);
}

4.3結(jié)果驗(yàn)證

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?

5. 描述清楚修改員工的實(shí)現(xiàn)流程

包括修改員工狀態(tài)和編輯員工。

5.1需求分析和設(shè)計(jì)

5.1.1具體業(yè)務(wù)

修改員工狀態(tài):

用戶點(diǎn)擊啟用/禁用按鈕,切換用戶狀態(tài)。

編輯員工:

數(shù)據(jù)回顯:根據(jù)id查詢(xún)員工信息,并展示在編輯的表單中。

提交修改:根據(jù)id修改數(shù)據(jù)。

5.1.2設(shè)計(jì)接口

修改員工狀態(tài):

  1. 請(qǐng)求路徑?/admin/employee/status/{status}
  2. 請(qǐng)求參數(shù)??id=1
  3. 請(qǐng)求方式?POST
  4. 響應(yīng)數(shù)據(jù)
    {
    ? ? “code”:1,
    ? ? “msg”:””,
    ? ? “data”:null
    }

編輯員工:

  1. 請(qǐng)求路徑 /admin/employee
  2. 請(qǐng)求參數(shù) json,用EmployeeDTO接收
  3. 請(qǐng)求方式 PUT
  4. 響應(yīng)數(shù)據(jù) 還是code、msg和data。

5.2代碼開(kāi)發(fā)

5.2.1Controller層

/**
 * 啟用/禁用員工賬號(hào)接口
 * @param status
 * @param id
 * @return
 */
@ApiOperation(value = "啟用/禁用員工賬號(hào)接口")
@PostMapping("/status/{status}")
public Result updateStatus(@PathVariable Integer status, Long id) {
    employeeService.updateStatus(status, id);
    return Result.success();
}

/**
 * 根據(jù)id查詢(xún)員工信息
 * @param id
 * @return
 */
@GetMapping("/{id}")
public Result getByID(@PathVariable Long id) {
    Employee employee = employeeService.getById(id);
    return Result.success(employee);
}

/**
 * 編輯員工信息
 * @param employeeDTO
 * @return
 */
@PutMapping
public Result update(@RequestBody EmployeeDTO employeeDTO) {
    employeeService.update(employeeDTO);
    return Result.success();
}

5.2.2Service層

public void updateStatus(Integer status, Long id) {
    Employee employee = new Employee();
    employee.setStatus(status);
    employee.setId(id);
    employee.setUpdateTime(LocalDateTime.now());
    employee.setUpdateUser(BaseContext.getCurrentId());
    employeeMapper.updateById(employee);
}

@Override
public Employee getById(Long id) {
    return employeeMapper.getById(id);
}

@Override
public void update(EmployeeDTO employeeDTO) {
    Employee employee = new Employee();
    BeanUtils.copyProperties(employeeDTO, employee);
    employee.setUpdateTime(LocalDateTime.now());
    employee.setUpdateUser(BaseContext.getCurrentId());
    employeeMapper.updateById(employee);
}

5.2.3Mapper層

Java代碼:

/**
     * 根據(jù)id修改員工狀態(tài)
     * @param employee
     */
    void updateById(Employee employee);

    @Select("select * from employee where id=#{id}")
    Employee getById(Long id);

xml文件:

<update id="updateById">
    update employee
        <set>
            <if test="name!=null and name!=''">name = #{name},</if>
            <if test="username != null and name !=''">username = #{username},</if>
            <if test="password != null and name !=''">password = #{password},</if>
            <if test="phone != null">phone = #{phone},</if>
            <if test="sex != null">sex = #{sex},</if>
            <if test="idNumber != null">id_number = #{idNumber},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="updateUser != null">update_user = #{updateUser},</if>
            <if test="status != null">status = #{status},</if>
        </set>
    where id = #{id};
</update>

5.3測(cè)試

5.2.1接口測(cè)試

修改員工狀態(tài):

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

編輯員工?

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

5.2.2前后端聯(lián)調(diào)

修改員工狀態(tài)?

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

編輯員工

蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?蒼穹外賣(mài)day02項(xiàng)目日志,spring boot,java,spring,java-ee,maven

?

到了這里,關(guān)于蒼穹外賣(mài)day02項(xiàng)目日志的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • itheima蒼穹外賣(mài)項(xiàng)目學(xué)習(xí)筆記--Day9: 訂單模塊

    (1). 查詢(xún)歷史訂單 在OrderController中,創(chuàng)建查詢(xún)方法 在OrderServiceImpl中,創(chuàng)建分頁(yè)查詢(xún)方法,及其父類(lèi)接口 在OrderMapper中,添加查詢(xún)方法,并在映射文件中寫(xiě)入動(dòng)態(tài)SQL語(yǔ)句 在OrderDetailMapper中,實(shí)現(xiàn)根據(jù)訂單id查詢(xún)訂單明細(xì) (2). 查詢(xún)訂單詳細(xì) 在OrderController中,創(chuàng)建查詢(xún)訂單詳細(xì)方

    2024年02月16日
    瀏覽(184)
  • 基于Spring boot和Mybatis外賣(mài)項(xiàng)目瑞吉外賣(mài)Day9-Redis的快速入門(mén)

    基于Spring boot和Mybatis外賣(mài)項(xiàng)目瑞吉外賣(mài)Day9-Redis的快速入門(mén)

    4.1 Redis數(shù)據(jù)結(jié)構(gòu)介紹 Redis是一個(gè)key-value的數(shù)據(jù)庫(kù),key一般是String類(lèi)型,不過(guò)value的類(lèi)型多種多樣: 貼心小建議:命令不要死記,學(xué)會(huì)查詢(xún)就好啦 Redis為了方便我們學(xué)習(xí),將操作不同數(shù)據(jù)類(lèi)型的命令也做了分組,在官網(wǎng)( https://redis.io/commands )可以查看到不同的命令: 當(dāng)然我們

    2023年04月09日
    瀏覽(32)
  • 蒼穹外賣(mài) Spring Task 來(lái)單提醒 催單Apache ECharts day10~11

    蒼穹外賣(mài) Spring Task 來(lái)單提醒 催單Apache ECharts day10~11

    Spring Task 訂單狀態(tài)定時(shí)處理 WebSocket 來(lái)單提醒 客戶催單 功能實(shí)現(xiàn): 訂單狀態(tài)定時(shí)處理 、 來(lái)單提醒 和 客戶催單 訂單狀態(tài)定時(shí)處理: 來(lái)單提醒: 客戶催單: 1.1 介紹 Spring Task 是Spring框架提供的 任務(wù)調(diào)度工具 ,可以按照約定的時(shí)間自動(dòng)執(zhí)行某個(gè)代碼邏輯。 定位: 定時(shí)任務(wù)框

    2024年02月14日
    瀏覽(21)
  • itheima蒼穹外賣(mài)項(xiàng)目學(xué)習(xí)筆記--Day1:項(xiàng)目介紹與開(kāi)發(fā)環(huán)境搭建

    itheima蒼穹外賣(mài)項(xiàng)目學(xué)習(xí)筆記--Day1:項(xiàng)目介紹與開(kāi)發(fā)環(huán)境搭建

    (1). 前端環(huán)境搭建 前端工程基于 nginx 運(yùn)行 啟動(dòng)nginx:雙擊 nginx.exe 即可啟動(dòng) nginx 服務(wù),訪問(wèn)端口號(hào)為 80 (2). 后端環(huán)境搭建 后端工程基于 maven 進(jìn)行項(xiàng)目構(gòu)建,并且進(jìn)行分模塊開(kāi)發(fā) (3). 前后端聯(lián)調(diào) 修改數(shù)據(jù)庫(kù)中明文密碼,改為MD5加密后的密文 修改Java代碼,前端提交的密碼進(jìn)行

    2024年02月15日
    瀏覽(28)
  • itheima蒼穹外賣(mài)項(xiàng)目學(xué)習(xí)筆記--Day7:緩存商品 / 購(gòu)物車(chē)

    通過(guò)Redis來(lái)緩存菜品數(shù)據(jù),減少數(shù)據(jù)庫(kù)查詢(xún)操作。 緩存邏輯分析: 每個(gè)分類(lèi)下的菜品保存一份緩存數(shù)據(jù) 數(shù)據(jù)庫(kù)中菜品數(shù)據(jù)有變更時(shí)清理緩存數(shù)據(jù) 修改用戶端接口 DishController 的 list 方法,加入緩存處理邏輯 修改管理端接口 DishController 的相關(guān)方法,加入清理緩存的邏輯,需要

    2024年02月16日
    瀏覽(22)
  • 蒼穹外賣(mài)day10——訂單狀態(tài)定時(shí)處理(Spring Task)、來(lái)單提醒和客戶催單(WebSocket)

    蒼穹外賣(mài)day10——訂單狀態(tài)定時(shí)處理(Spring Task)、來(lái)單提醒和客戶催單(WebSocket)

    ? ?對(duì)于超時(shí)沒(méi)處理的需要定時(shí)程序處理?;赟pringTask實(shí)現(xiàn)。 來(lái)單提醒和客戶催單?;赪ebSocket實(shí)現(xiàn)。 ? ? 周幾通常不能和日一起指定。? ?cron表達(dá)式在線生成器 在線Cron表達(dá)式生成器 ?創(chuàng)建定時(shí)任務(wù)類(lèi) ? ? 新建一個(gè)task包中一個(gè)類(lèi)如下 在OrderMapper中 運(yùn)行測(cè)試無(wú)誤。 ? ? 導(dǎo)

    2024年02月14日
    瀏覽(20)
  • itheima蒼穹外賣(mài)項(xiàng)目學(xué)習(xí)筆記--Day10: 訂單狀態(tài)定時(shí)處理/來(lái)單提醒和客戶催單

    Spring Task 是Spring框架提供的任務(wù)調(diào)度工具,可以按照約定的時(shí)間自動(dòng)執(zhí)行某個(gè)代碼邏輯。 定位:定時(shí)任務(wù)框架 作用:定時(shí)自動(dòng)執(zhí)行某段Java代碼 cron表達(dá)式其實(shí)就是一個(gè)字符串,通過(guò)cron表達(dá)式可以定義任務(wù)觸發(fā)的時(shí)間構(gòu)成規(guī)則: 分為6或7個(gè)域,由空格分隔開(kāi), 每個(gè)域代表一個(gè)

    2024年02月17日
    瀏覽(20)
  • 蒼穹外賣(mài)-day10:Spring Task、訂單狀態(tài)定時(shí)處理、來(lái)單提醒(WebSocket的應(yīng)用)、客戶催單(WebSocket的應(yīng)用)

    蒼穹外賣(mài)-day10:Spring Task、訂單狀態(tài)定時(shí)處理、來(lái)單提醒(WebSocket的應(yīng)用)、客戶催單(WebSocket的應(yīng)用)

    Spring Task 訂單狀態(tài)定時(shí)處理 WebSocket 來(lái)單提醒 客戶催單 功能實(shí)現(xiàn): 訂單狀態(tài)定時(shí)處理 、 來(lái)單提醒 和 客戶催單 訂單狀態(tài)定時(shí)處理: 來(lái)單提醒: 客戶催單: 1.1 介紹 Spring Task 是Spring框架提供的任務(wù)調(diào)度工具,可以按照約定的時(shí)間 自動(dòng)執(zhí)行 某個(gè)代碼邏輯。 定位 :定時(shí)任務(wù)框

    2024年04月28日
    瀏覽(23)
  • 【java蒼穹外賣(mài)項(xiàng)目實(shí)戰(zhàn)三】nginx反向代理和負(fù)載均衡

    【java蒼穹外賣(mài)項(xiàng)目實(shí)戰(zhàn)三】nginx反向代理和負(fù)載均衡

    我們思考一個(gè)問(wèn)題: 前端發(fā)送的請(qǐng)求,是如何請(qǐng)求到后端服務(wù)的? 前端請(qǐng)求地址:http://localhost/api/employee/login 后端接口地址:http://localhost:8080/admin/employee/login 很明顯,兩個(gè)地址不一致,那是如何請(qǐng)求到后端服務(wù)的呢? 1、nginx反向代理 nginx 反向代理 ,就是將前端發(fā)送的動(dòng)態(tài)

    2024年02月21日
    瀏覽(26)
  • 《蒼穹外賣(mài)》電商實(shí)戰(zhàn)項(xiàng)目(java)知識(shí)點(diǎn)整理(P1~P65)【上】

    《蒼穹外賣(mài)》電商實(shí)戰(zhàn)項(xiàng)目(java)知識(shí)點(diǎn)整理(P1~P65)【上】

    史上最完整的《蒼穹外賣(mài)》項(xiàng)目實(shí)操筆記,跟視頻的每一P對(duì)應(yīng),全系列10萬(wàn)字,涵蓋詳細(xì)步驟與問(wèn)題的解決方案。如果你操作到某一步卡殼,參考這篇,相信會(huì)帶給你極大啟發(fā)。 《蒼穹外賣(mài)》項(xiàng)目實(shí)操筆記【中】:P66~P122《蒼穹外賣(mài)》項(xiàng)目實(shí)操筆記【中】 1. nginx反向代理好處

    2024年01月24日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包