主頁 > 後端開發 > 瑞吉外賣實戰專案全攻略——第一天

瑞吉外賣實戰專案全攻略——第一天

2022-10-19 11:56:41 後端開發

瑞吉外賣實戰專案全攻略——第一天

該系列將記錄一份完整的實戰專案的完成程序,該篇屬于第一天

案例來自B站黑馬程式員Java專案實戰《瑞吉外賣》,請結合課程資料閱讀以下內容

該篇我們將完成以下內容:

  • 軟體開發整體介紹
  • 瑞吉外賣專案介紹
  • 開發環境搭建
  • 后臺登錄系統功能開發
  • 后臺退出系統功能開發

軟體開發整體介紹

這個專案屬于我的第一個完整專案,所以我們將從軟體開發的概念來開始介紹

軟體開發流程

軟體開發主要分為五個階段,每個階段帶有不同的需求:

  • 需求分析

需求分析需要設計產品原型,產生需求規格說明書

  • 設計

設計主要負責產品檔案,UI界面設計,概要設計,詳細設計,資料庫設計等設計資訊

  • 編碼

編碼主要負責專案代碼以及單元測驗,也就是我們著重介紹的部分

  • 測驗

測驗主要負責準備測驗用例,書寫測驗報告

  • 上線運維

上線運維主要包括軟體環境安裝,配置等

角色分工

我們的公司中通常具有不同的崗位,這些崗位被稱為角色

每個角色都具有不同的專案作用:

  • 專案經理

對整個專案負責,任務分配,把控進度

  • 產品經理

進行需求調研,輸出需求調研檔案,產品原型等

  • UI設計師

根據產品原型輸出界面效果圖

  • 架構師

專案整體架構設計,技術選型等

  • 開發工程師

代碼實作

  • 測驗工程師

撰寫測驗用例,輸出測驗報告

  • 運維工程師

軟體環境搭建,專案上線

軟體環境

我們的專案軟體在不同的情況下要處于不同的軟體環境下

軟體環境通常分為三種:

  • 開發環境(development)

開發人員在開發階段使用的環境,一般外部用戶無法訪問

  • 測驗環境(test)

專門給測驗人員使用的環境,用于測驗專案,一般外部用戶無法訪問

  • 生產環境(production)

即上線環境,正式提供對外服務的環境

瑞吉外賣專案介紹

我們想要開發產品,就要對產品具有一定的了解

專案介紹

首先我們介紹專案本身:

  • 本專案(瑞吉外賣)是專門為餐飲企業(餐廳、飯店)定制的一款軟體產 品,包括系統管理后臺和移動端應用兩部分,

  • 其中系統管理后臺主要提供給餐飲企業內部員工使用,可以對餐廳的菜品、套餐、訂單等進行管理維護,

  • 移動端應用主要提供給消費者使用,可以在線瀏覽菜品添加購物車、下單等,

再來介紹我們的開發計劃:

  • 本專案共分為3期進行開發
  • 第一期主要實作基本需求,其中移動端應用通過H5實作,用戶可以通過手機瀏覽器訪問,
  • 第二期主要針對移動端應用進行改進,使用微信小程式實作,用戶使用起來更加方便,
  • 第三期主要針對系統進行優化升級,提高系統的訪問性能,

產品原型展示

首先我們先來介紹產品原型:

  • 產品原型就是一個產品成型前的簡單框架,將頁面的排版布局展現出來,使初步構思有一個可視化的展示
  • 通過原型展示,可以更加直觀的了解專案的需求和提供的功能

注意點:

  • 產品原型主要用于展示專案的功能,并不是最終的頁面效果

關于產品原型的展示我們不再展示,產品原型在資料中已全部提供~

技術選型

我們給出整個專案的技術堆疊展示:

功能架構

我們同樣給出整個專案需要實作的功能架構:

角色展示

我們需要將專案中所出現的相關角色同列出來

本專案中大概出現三類角色:

  • 后臺系統管理員

登錄后臺系統,擁有后臺系統中的所有操作權限

  • 后臺系統普通員工

登錄后臺系統,對菜品,套餐,訂單進行管理

  • C端用戶

登錄移動端應用,可以瀏覽菜品,添加購物車,設定地址,在線下單等

開發環境搭建

在正式開始編程之前,我們需要將準備作業完成

我們需要從兩方面進行環境搭建,我們的資料庫使用MYSQL,開發工具采用IDEA

資料庫環境搭建

我們直接進入MYSQL資料庫,這里使用MYSQL便捷工具Navicat:

  1. 創建資料庫reggie

  1. 增添資料
# 資料中包含有我們所使用的資料,直接導包即可,因資料過長,這里不做展示

到這里我們的資料庫環境搭建就結束了

最后我們將匯入資料庫的表羅列出來進行一定說明展示:

Maven專案搭建

我們的代碼開發采用IDEA的Maven搭建:

  1. 創建maven(直接創建即可)

  1. pom.xml相對應依賴坐標匯入
<!--pom.xml資料也有提供,當然直接復制下列內容也可以-->

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <groupId>com.qiuluo</groupId>
    <artifactId>mydelivery</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

        <!-- 將物件 轉化為JSON格式-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.23</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.5</version>
            </plugin>
        </plugins>
    </build>

</project>
  1. yml組態檔匯入
server:
  port: 8080
spring:
  application:
    name: reggie_take_out
  datasource:
  # 德魯伊mysql配置,根據自己資料庫狀況修改
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: root
      password: 123456
mybatis-plus:
  configuration:
    #在映射物體或者屬性時,將資料庫中表名和欄位名中的下劃線去掉,按照駝峰命名法映射,默認情況下開啟(這里僅做科普)
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID
  1. 書寫主方法
// 在我們的java檔案夾下創建相對應的包
// 我創建的是com.qiuluo

package com.qiuluo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 我們添加注解@Slf4j,可以使用log的方法添加日志,便于程式管理
@Slf4j
// @SpringBootApplication表示是程式的啟動類
@SpringBootApplication
public class ReggieApplication {
    public static void main(String[] args) {
        // 啟動程式的關鍵代碼
        SpringApplication.run(ReggieApplication.class,args);
        // 日志輸出
        log.info("專案啟動成功");
    }
}

  1. 前端頁面匯入
// 我們該專案主要側重后端開發,前端知識我們直接采用資料中所給資料即可

// 前端頁面:backend和front檔案,我們放置于resources檔案夾下即可
  1. 書寫配置類設定靜態資源
// 正常情況下,我們的頁面訪問時會被Contoller攔截下來回傳資料,這時我們就需要設定靜態資源的轉發路徑

package com.qiuluo.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

// @Configuration設定為配置類,讓Spring可以讀取到該配置類
@Slf4j
@Configuration
// 注意:主要繼承WebMvcConfigurationSupport成為配置類
public class WebMvcConfig extends WebMvcConfigurationSupport {


    // 設定靜態資源的映射關系,繼承方法addResourceHandlers即可
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 日志輸出
        log.info("即將進行靜態資源的映射:");

        // 將請求路徑 /backend/** 映射到 專案靜態資源目錄 resources/backend 下
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");

    }
}
  1. 查看網頁是否映射成功
// 注意:需要先對專案整體進行clean操作后,再查看頁面,否則可能無法查看

后臺登錄功能開發

我們在進行功能開發時一般分為三個步驟進行開發

需求分析

首先我們需要得知,登錄是在前端哪個頁面通過什么方法請求資料

我們打開頁面后,通過F12來查看點擊相關功能后所進行的頁面請求或者直接在后端查看請求

頁面F12獲取請求:(這里由于我這里已經完成功能,點擊后直接跳轉,無法獲得資料)

后端查看請求:

function loginApi(data) {
  return $axios({
    'url': '/employee/login',
    'method': 'post',
    data
  })
}

通過查詢后我們可以發現點擊登錄后發送請求格式為下列:

URL:http://localhost:8080/employee/login
Request Method:POST

因此我們需要書寫Controller來完成該請求的相對應代碼

另一方面,我們都知道我們前端和后端在互動時會通過一個固定的格式來回傳請求

我們可以通過查詢相關代碼來確定回傳格式:

methods: {
        async handleLogin() {
          this.$refs.loginForm.validate(async (valid) => {
            if (valid) {
              this.loading = true
              let res = await loginApi(this.loginForm)
              if (String(res.code) === '1') {
                localStorage.setItem('userInfo',JSON.stringify(res.data))
                window.location.href= 'https://www.cnblogs.com/backend/index.html'
              } else {
                this.$message.error(res.msg)
                this.loading = false
              }
            }
          })
        }
      }

// 我們可以發現res屬性包含有code,data,msg等屬性

那么我們在后端代碼中需要規定一個物體類來充當回傳引數類

代碼開發

下面我們來到IDEA中書寫我們前面所需要的內容:

  1. 構造物體類Employee
// 我們創建entity檔案夾專門書寫物體類(資料中包含有物體類構造代碼)

// Employee是我們的員工表,相當于我們的賬號和密碼的主體類

package com.qiuluo.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;

@Data
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private String username;

    private String name;

    private String password;

    private String phone;

    private String sex;

    private String idNumber;

    private Integer status;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;

}
  1. 構造資料層
package com.qiuluo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiuluo.entity.Employee;
import org.apache.ibatis.annotations.Mapper;

// @Mapper幫助Spring自動識別資料層,采用全權代理開發
@Mapper
// 繼承BaseMapper<Employee>,其中包括有許多基本資料庫方法
public interface EmployeeMapper extends BaseMapper<Employee> {
}
  1. 構造業務層介面
package com.qiuluo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.qiuluo.entity.Employee;

// 繼承IService<Employee>實作多種方法
public interface EmployerService extends IService<Employee> {
}
  1. 構造業務層
package com.qiuluo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qiuluo.entity.Employee;
import com.qiuluo.mapper.EmployeeMapper;
import com.qiuluo.service.EmployerService;
import org.springframework.stereotype.Service;

// @Service幫助Spring自動識別
@Service
// 繼承ServiceImpl<EmployeeMapper,Employee>中的各種方法,第一個引數是Mapper,第二個引數是物體類
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper,Employee> implements EmployerService {
}
  1. 構造服務層
package com.qiuluo.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiuluo.common.R;
import com.qiuluo.entity.Employee;
import com.qiuluo.service.EmployerService;
import com.qiuluo.service.impl.EmployeeServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

// 書寫基本注解

// 日志注解
@Slf4j
// REST形式的Controller
@RestController
// 設定整體映射地址
@RequestMapping("/employee")
public class EmployeeController {

    // 自動裝配employeeService
    @Autowired
    private EmployeeServiceImpl employeeService;

}
  1. 構造回傳結構類R
// 我們構造一個回傳結構類作為回傳型別

package com.qiuluo.common;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

@Data
public class R<T> {

    private Integer code; //編碼:1成功,0和其它數字為失敗

    private String msg; //錯誤資訊

    private T data; //資料

    private Map map = new HashMap(); //動態資料

    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = https://www.cnblogs.com/qiuluoyuweiliang/p/object;
        r.code = 1;
        return r;
    }

    public static  R error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}
  1. 邏輯分析前端需求并實作
package com.qiuluo.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiuluo.common.R;
import com.qiuluo.entity.Employee;
import com.qiuluo.service.EmployerService;
import com.qiuluo.service.impl.EmployeeServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeServiceImpl employeeService;

    /**
     * 員工登錄
     * */
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){

        // 1. 將頁面提交的密碼經過md5加密(DigestUtils.md5DigestAsHex方法需要byte引數)
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        // 2.根據頁面提交的用戶名username查詢資料庫(采用LambdaQueryWrapper進行條件篩選)
        LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(lambdaQueryWrapper);

        // 3.如果沒有查詢到,判定失敗
        if (emp == null){
            return R.error("登陸失敗");
        }

        // 4.密碼比對,密碼不一致失敗
        if (!emp.getPassword().equals(password)){
            return R.error("登陸失敗");
        }

        // 5.查看員工狀態
        if (emp.getStatus() == 0){
            return R.error("賬戶已禁用");
        }

        // 6.登錄成功,并將員工id存入Session并回傳登錄成功結果
        request.getSession().setAttribute("employee",employee.getId());
        return R.success(emp);
    }

}
  1. 前端登錄測驗
# 測驗時盡量將代碼中書寫的各種情況都測驗一遍確保無誤

后臺退出功能開發

我們在進行功能開發時一般分為三個步驟進行開發

需求分析

員工登錄成功后,頁面跳轉到系統首頁頁面(backend/index.html),此時顯示當前用戶名

當我們點擊退出時,直接點擊退出按鈕即可退出頁面,回到登錄頁面

同樣我們采用F12或者后臺請求查看:

URL:http://localhost:8080/employee/logout
Request Method:POST

代碼開發

我們回到EmployeeController程式中開發請求地址為employee/logout的POST請求即可

具體步驟包括有:

  • 清理Session中的id
  • 回傳結果

我們的實際開發步驟分為兩步:

  1. 在EmployeeController中開發相對應的功能
package com.qiuluo.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiuluo.common.R;
import com.qiuluo.entity.Employee;
import com.qiuluo.service.EmployerService;
import com.qiuluo.service.impl.EmployeeServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeServiceImpl employeeService;

    /**
     * 員工登錄
     * */
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){

        // 1. 將頁面提交的密碼經過md5加密(DigestUtils.md5DigestAsHex方法需要byte引數)
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        // 2.根據頁面提交的用戶名username查詢資料庫(采用LambdaQueryWrapper進行比對)
        LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(lambdaQueryWrapper);

        // 3.如果沒有查詢到,判定失敗
        if (emp == null){
            return R.error("登陸失敗");
        }

        // 4.密碼比對,密碼不一致失敗
        if (!emp.getPassword().equals(password)){
            return R.error("登陸失敗");
        }

        // 5.查看員工狀態
        if (emp.getStatus() == 0){
            return R.error("賬戶已禁用");
        }

        // 6.登錄成功,并將員工id存入Session并回傳登錄成功結果
        request.getSession().setAttribute("employee",employee.getId());
        return R.success(emp);
    }


    /**
     * 退出管理員
     * */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        // 1. 將用戶id從Session中刪去
        request.getSession().removeAttribute("employee");
        // 2. 回傳推出成功的資訊即可
        return R.success("退出成功");
    }
}
  1. 實際測驗(點擊退出鍵回傳登錄頁面即可)

易錯點

在這里我們會點出該專案目前容易出錯的位置,當然是對于我來說可能~

設定靜態資源映射

易錯點位置:

  • 開發環境搭建中的Maven專案搭建

易錯原因:

  • 書寫過少,內容不夠了解

易錯點:

  • 設定靜態映射屬于配置類,需要添加@Configuration注解
  • 該類本身不具有配置功能,需要繼承WebMvcConfigurationSupport類實作其方法
  • 設定靜態類的方法為addResourceHandlers方法,采用內置引數registry的相關方法
  • registry的方法addResourceHandler后跟請求路徑,addResourceLocations后跟映射的靜態資源路徑
// 正常情況下,我們的頁面訪問時會被Contoller攔截下來回傳資料,這時我們就需要設定靜態資源的轉發路徑

package com.qiuluo.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

// @Configuration設定為配置類,讓Spring可以讀取到該配置類
@Slf4j
@Configuration
// 注意:主要繼承WebMvcConfigurationSupport成為配置類
public class WebMvcConfig extends WebMvcConfigurationSupport {


    // 設定靜態資源的映射關系,繼承方法addResourceHandlers即可
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 日志輸出
        log.info("即將進行靜態資源的映射:");

        // 將請求路徑 /backend/** 映射到 專案靜態資源目錄 resources/backend 下
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");

    }
}

結束語

該篇內容到這里就結束了,希望能為你帶來幫助~

附錄

該文章屬于學習內容,具體參考B站黑馬程式員的Java專案實戰《瑞吉外賣》

這里附上視頻鏈接:業務開發Day1-01-本章內容介紹_嗶哩嗶哩_bilibili

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517744.html

標籤:Java

上一篇:分布式理論----CAP理論與Base理論

下一篇:扔掉工具類!MyBatis 一個簡單配置搞定加密、解密,不能太方便了~!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more