从b站学习springcloud项目,现在进行总结,该总结除去了视频中出现的小错误,对有些易错的地方进行了提醒
b站链接:https://www.bilibili.com/video/av55629580?p=1
资料链接:
https://pan.baidu.com/s/1o0Aju3IydKA15Vo1pP4z5w
提取码: 21ru
上一节链接:
https://blog.csdn.net/qq_40893824/article/details/103626809
下一节链接:
https://blog.csdn.net/qq_40893824/article/details/103641158
下面的内容总结:
module命名account→pom→bootstrap.yml→configserver创建本地配置→AccountApplication.java→entity2个实体类(User和Admin→repository接口(UserRepository和AdminRepository)→resources/mapping(2个.xml文件)→AccountHandler.java→检查
client/feign新建接口AccountFeign→client/controller中新建AccountHandler→现index.html删除,粘贴资料的index→account/admin复制至client→修改client/AccountHandler→ 检查
account:用户登录,用户分为 普通用户 和 管理员
实现细节:
1.新建module,命名为account,在其pom文件加入代码(和user的pom一样):
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
</dependencies>
2.讲user/resources中bootstrap.yml复制至account中,修改name为account:
spring:
application:
name: account
profiles:
active: dev
cloud:
config:
uri: http://localhost:8762
fail-fast: true
3.在configserver/shared复制一份user-dev.yml,但改名为account-dev.yml,修改代码,port为8050,name为account:
server:
port: 8050
spring:
application:
name: account
datasource:
name: qwe
url: jdbc:mysql://localhost:3306/qwe?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
mybatis:
mapper-locations: classpath:/mapping/*.xml
type-aliases-package: com.southwind.entity
运用多台创建接口,可分别查询管理员和用户的信息
4.在account/java创包com.southwind,在southwind创建启动类AccountApplication.java,加入代码:
package com.southwind;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.southwind.repository")
public class AccountApplication {
public static void main(String[] args) {
SpringApplication.run(AccountApplication.class,args);
}
}
5.创建account的实体类:在southwind中创包entity,将user/User复制至account/entity中
6.在entity中新建Admin,加入代码:
package com.southwind.entity;
import lombok.Data;
@Data
public class Admin {
private long id;
private String username;
private String password;
}
7.在southwind创包repository,创建接口AdminRepository.java,加入代码:
package com.southwind.repository;
import com.southwind.entity.Admin;
public interface AdminRepository {
public Admin login(String username , String password);
}
继续创建接口UserRepository.java,加入代码:
package com.southwind.repository;
import com.southwind.entity.User;
public interface UserRepository {
public User login(String username , String password);
}
8.在account/resources中创包mapping,将user/resources/mapping中UserRepository.xml复制至account/mapping中,再复制一次,但改名为AdminRepository.xml
9.对于AdminRepository.xml,只保留findAll部分,其他删除
第3行的UserRepository 改为 AdminRepository
第5行的 id=“findAll” 改为 id=“login”
后面的 resultType=“User” 改为 resultType=“Admin”
第6行的
select * from t_user limit #{param1},#{param2}
改为
select * from t_admin where username = #{param1} and password = #{param2}
完整代码:
<?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.southwind.repository.AdminRepository">
<select id="login" resultType="Admin">
select * from t_admin where username = #{param1} and password = #{param2}
</select>
</mapper>
10.对于UserReposiroey.xml,删除全部功能代码,将AdminRepository.xml中login部分复制进去,把第6行的 t_admin 改为 t_user,resultType=“Admin” 改为 resultType=“User”,其他不变:
<?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.southwind.repository.UserRepository">
<select id="login" resultType="User">
select * from t_user where username = #{param1} and password = #{param2}
</select>
</mapper>
11.在southwind创包controller,创建控制类AccountHandler.java添加代码:
package com.southwind.controller;
import com.southwind.repository.AdminRepository;
import com.southwind.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/account")
public class AccountHandler {
@Autowired
private AdminRepository adminRepository;
@Autowired
private UserRepository userRepository;
@GetMapping("/login/{username}/{password}/{type}")
//Object 即为多态
public Object login(@PathVariable("username")String username , @PathVariable("password")String password, @PathVariable("type")String type){
Object object = null;
switch (type){
case "user":
object = userRepository.login(username,password);
break;
case "admin":
object = adminRepository.login(username,password);
break;
}
return object;
}
}
检查,启动account
12. 进入 http://localhost:8050/account/login/admin1/123123/admin
其中admin1/123123是因为在t_admin中的数据是admin1 和 123123
成功查询管理员的数据!
进入 http://localhost:8050/account/login/zhangsan/123123/user
成功查询用户信息!
登录页面的实现:
1.在client/feign中新建接口AccountFeign,加入代码:
注意其类型是Object
package com.southwind.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "account")
public interface AccountFeign {
@GetMapping("/account/login/{username}/{password}/{type}")
public Object login(@PathVariable("username")String username, @PathVariable("password")String password, @PathVariable("type")String type);
}
2.在client/static/login.html中可以看到没有th标签,这意味着我不需要在后台使用redirect作为映射!
在client/controller中新建AccountHandler.java,添加代码:
在login中的三个参数对应于client/login.html中的三个参数
package com.southwind.controller;
import com.southwind.feign.AccountFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/account")
public class AccountHandler {
@Autowired
private AccountFeign accountFeign;
@PostMapping("/login")
public String login(@RequestParam("username")String username, @RequestParam("password")String password, @RequestParam("type")String type){
Object object = accountFeign.login(username, password, type);
System.out.println(object);
return "index";
}
}
检查,重启account 和 client
3. 进入 http://localhost:8030/login.html
登录后:
4.将自己现在的index.html删除,再把资料中index.html复制过来
5.将account/entity/Admin复制至client/entity中
6.在client/AccountHandler中第18行的 System.out.println(object); 删除
然后在参数表中加上 HttpSession session
package com.southwind.controller;
import com.southwind.entity.Admin;
import com.southwind.entity.User;
import com.southwind.feign.AccountFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.LinkedHashMap;
@Controller
@RequestMapping("/account")
public class AccountHandler {
@Autowired
private AccountFeign accountFeign;
@PostMapping("/login")
public String login(@RequestParam("username")String username, @RequestParam("password")String password, @RequestParam("type")String type, HttpSession session){
Object object = accountFeign.login(username, password, type);
LinkedHashMap<String,Object> hashMap = (LinkedHashMap)object;
String result = null;
if(object == null){
result = "login";
}else{
switch (type){
case "user":
User user = new User();
String idstr = hashMap.get("id")+"";//转成String,而不能装置转换类型!
long id = Long.parseLong(idstr);
String nickname = (String)hashMap.get("nickname");
user.setId(id);
user.setNickname(nickname);
session.setAttribute("user",user);
result = "index";
break;
case "admin":
Admin admin = (Admin) object;
session.setAttribute("admin",admin);
result = "";
break;
}
}
return result;
}
}
进入 http://localhost:8030/login.html,尝试登录
用户张三成功登录!
在client/index.html可以看到第13行有用户退出功能logout,现在实现之:
1.在client/controller的AccountHandler中添加代码:
@GetMapping("/logout")
public String logout(HttpSession session){
session.invalidate();
return "redirect:/login.html";
}
检查,启动eurekaserver,configserver,menu,account,client
2. 进入 http://localhost:8030/login.html,登录zhangsan
登录后:
点击退出后:
退出后就又回到登录页面了!
上一节链接:
https://blog.csdn.net/qq_40893824/article/details/103626809
下一节链接:
https://blog.csdn.net/qq_40893824/article/details/103641158