1、软件整体开发流程
软件开发流程
角色分工
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egi2y9Ay-1678022008735)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
软件环境[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-23xPWg13-1678022008735)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
2、瑞吉外卖项目介绍
项目介绍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZ7OgKfs-1678022008735)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
产品原型展示
技术选型
功能架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vLKbIV9d-1678022014532)(null)]
角色
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lEEtCVI-1678022008737)(C:\Users\note\AppData\Roaming\Typora\typora-user-images\image-20230302132950181.png)]
3、开发环境搭建
数据库环境搭建
创建数据库
插入表数据
数据表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1x5m2vkp-1678022013312)(null)]
maven环境搭建
xml文件
创建maven工程,并配置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 https://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.7.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.godofball</groupId>
<artifactId>reggie</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>reggie</name>
<description>reggie</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.24</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yal
添加springboot配置文件application.yal
spring:
datasource:
url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启控制台 SQL 日志打印
map-underscore-to-camel-case: true #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
global-config:
db-config:
id-type: assign_id #如果不设置类型值,默认则使用IdType.ASSIGN_ID策略(自3.3.0起)。
#该策略会使用雪花算法自动生成主键ID,主键类型为长或字符串(分别对应的MySQL的表字段为BIGINT和VARCHAR)
将静态资源放在resource目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZacfiYE-1678022013731)(null)]
静态资源映射
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//如果请求静态资源的路径以/backend/开头,springboot将会到resources下的backend目录下找
log.info("开启静态资源映射");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}
后台登陆功能开发
需求分析
async handleLogin() {
this.$refs.loginForm.validate(async (valid) => {
if (valid) {
this.loading = true
let res = await loginApi(this.loginForm)
if (String(res.code) === '1') {//1表示登录成功
localStorage.setItem('userInfo', JSON.stringify(res.data))
window.location.href = '/backend/index.html'
} else {
this.$message.error(res.msg)//错误码
this.loading = false
}
}
})
}
data() {
return {
loginForm: {
username: 'admin',
password: '123456'
},
loading: false
}
}
function loginApi(data) {
return $axios({
'url': '/employee/login',
'method': 'post',
data
})
}
可以知道前端请求的地址为/employee/login,参数分别为username和password
后端处理请求后需要返回code(状态码)和msg(信息)
代码开发
创建Employee实体类,与数据库表Employee映射
@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;
}
EmployeeMapper
public interface EmployeeMapper extends BaseMapper<Employee> {}
EmployeeService
public interface EmployeeService extends IService<Employee> {}
EmployeeServiceImpl
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {}
如果Mapper接口没有标识@Mapper注解,可以再SpringBoot项目启动类上标注@MapperScan注解
@SpringBootApplication
@MapperScan("com.godofball.reggie.mapper")
public class ReggieApplication {
public static void main(String[] args) {SpringApplication.run(ReggieApplication.class, args);}
}
Result:服务器返回结果类——通用结果类,将要服务器响应的信息统一封装成此类返回给浏览器。
@Data
public class Result<T> {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static <T> Result<T> success(T object) {
Result<T> r = new Result<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> Result<T> error(String msg) {
Result r = new Result();
r.msg = msg;
r.code = 0;
return r;
}
public Result<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
员工登录处理逻辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AgfS8HXh-1678022014515)(null)]
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping("/login")
public Result<Employee> login(@RequestBody Employee employee, HttpSession session) {
//将密码进行MD5加密处理
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(employee.getPassword().getBytes());
//根据用户名查询数据库表中信息
LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Employee::getUsername,employee.getUsername());
Employee emp = employeeService.getOne(new QueryWrapper<Employee>().eq("username", employee.getUsername()));
//判断是否用户是否存在
if (emp == null) {
return Result.error("用户不存在");
}
//判断是否密码是否错误
if (!emp.getPassword().equals(password)) {
return Result.error("密码错误");
}
//判断是否用户状态
if (emp.getStatus() == 0) {
return Result.error("账号已禁用");
}
//6、登录成功,将用户id存入Session并返回成功结果
session.setAttribute("employee", emp.getId());
return Result.success(emp);
}
}
后台退出功能开发
@PostMapping("/logout")
public Result logout(HttpSession session){
session.removeAttribute("employee");
return Result.success("退出成功");
}
");
}
//6、登录成功,将用户id存入Session并返回成功结果
session.setAttribute(“employee”, emp.getId());
return Result.success(emp);
}
}
# 后台退出功能开发
```java
@PostMapping("/logout")
public Result logout(HttpSession session){
session.removeAttribute("employee");
return Result.success("退出成功");
}