這里面主要設計以下接口:
- 用戶登錄獲取accessToken
- news的增刪改查接口
為了保存accessToken,需要引入redis,為了定義返回的json,需要定義公共的JsonResult,下面依次說明
pom.xml添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml增加redis的配置信息
#config Redis
spring:
redis:
host: 127.0.0.1
port: 6379
database: 0
password:
定義redis調用相關類
共包括RedisUtil工具類、RedisKey公共值
@Component
public class RedisUtil {
/**
* 注入的stringRedisTemplate
*/
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* redisTemplate
*/
@Autowired
private RedisTemplate<?, ?> redisTemplate;
/**
* 設置key和對象的value
*
* @param key key
* @param value value
*/
public void set(final String key, Object value) {
final byte[] vbytes = SerializeUtil.serialize(value);
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.set(redisTemplate.getStringSerializer().serialize(key), vbytes);
return null;
}
});
}
/**
* 設置key和value,并加上時間(秒)
*
* @param key key
* @param value value
* @param l 時間
*/
public void set(final String key, Object value, final long l) {
final byte[] vbytes = SerializeUtil.serialize(value);
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.setEx(redisTemplate.getStringSerializer().serialize(key), l, vbytes);
return null;
}
});
}
/**
* 根據key來取值
*
* @param key key
* @param elementType 數據類型
* @param <T> 泛型
* @return 獲取的對象
*/
public <T> T get(final String key, Class<T> elementType) {
return redisTemplate.execute(new RedisCallback<T>() {
@Override
public T doInRedis(RedisConnection connection) throws DataAccessException {
byte[] keybytes = redisTemplate.getStringSerializer().serialize(key);
if (connection.exists(keybytes)) {
byte[] valuebytes = connection.get(keybytes);
T value = (T) SerializeUtil.deserialize(valuebytes);
return value;
}
return null;
}
});
}
/**
* 根據key刪除該值
*
* @param key key
*/
public void del(final String key) {
final byte[] keyBytes = redisTemplate.getStringSerializer().serialize(key);
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
connection.del(keyBytes);
return null;
}
});
}
}
public class RedisKey {
//用戶登錄后的accesstoken
public static final String ACCESS_TOKEN = "com:balance:accesstoken";
}
定義公共返回的json對象
public class JsonResult {
/**
* 是否成功
*/
private boolean success;
/**
* 消息
*/
private String message;
/**
* 返回碼
*/
private String code;
/**
* 額外的數據
*/
private Object data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public JsonResult(boolean success, String code, Object data) {
this(success, code);
this.data = data;
this.message = ReturnCodeUtil.getMsg(code);
}
public JsonResult() {
}
public JsonResult(boolean success) {
this.success = success;
}
/**
* message通過code獲取
*
* @param success
* @param code
*/
public JsonResult(boolean success, String code) {
this(success);
this.code = code;
this.message = ReturnCodeUtil.getMsg(code);
}
/**
* 三個參數,message自己賦值,不通過code獲取
*
* @param success
* @param code
* @param message
*/
public JsonResult(boolean success, String code, String message) {
this(success);
this.code = code;
this.message = message;
}
}
這個類用的地方非常多,基本每個controller都會用到,一定要通用、易使用,為了定義公共返回碼,還需要定義一個類存儲公共的全局返回碼,GlobalReturnCode
public class GlobalReturnCode {
/**
* 保存成功
*/
public static final String SAVE_SUCCESS = "10001";
/**
* 刪除成功
*/
public static final String DELETE_SUCCESS = "10002";
/**
* 操作成功
*/
public static final String OPERA_SUCCESS = "10003";
/**
* 審核成功
*/
public static final String AUDIT_SUCCESS = "10004";
/**
* 操作失敗
*/
public static final String OPERA_FAILURE = "20001";
/**
* 無權限
*/
public static final String NO_AUTH = "30001";
/**
* 系統錯誤
*/
public static final String SYSTEM_ERROR = "30002";
/**
* 參數錯誤
*/
public static final String PARAM_ERROR = "30003";
/**
* 路徑不存在
*/
public static final String SYSTEM_PATH_NOEXIST = "30004";
}
public class ReturnCodeUtil {
//定義返回碼及文字數據
private static Map<String, String> returnCodeMap;
static {
returnCodeMap.put(GlobalReturnCode.SAVE_SUCCESS, "保存成功");
returnCodeMap.put(GlobalReturnCode.DELETE_SUCCESS, "刪除成功");
returnCodeMap.put(GlobalReturnCode.OPERA_SUCCESS, "操作成功");
returnCodeMap.put(GlobalReturnCode.AUDIT_SUCCESS, "審核成功");
returnCodeMap.put(GlobalReturnCode.OPERA_FAILURE, "操作失敗");
returnCodeMap.put("20102", "賬號或密碼錯誤");
returnCodeMap.put(GlobalReturnCode.NO_AUTH, "無權限");
returnCodeMap.put(GlobalReturnCode.SYSTEM_ERROR, "系統錯誤");
returnCodeMap.put(GlobalReturnCode.PARAM_ERROR, "參數錯誤");
returnCodeMap.put(GlobalReturnCode.SYSTEM_PATH_NOEXIST, "路徑不存在");
}
/**
* 獲取返回的中文說明
*
* @param resultCode 返回碼
* @return 中文名稱
*/
public static String getMsg(String resultCode) {
if (returnCodeMap.containsKey(resultCode)) {
return returnCodeMap.get(resultCode);
} else {
return "";
}
}
}
ReturnCodeUtil
這個類定義類根據返回碼獲取對應的中文名的方法,實際應用中,可以把固定的返回碼存儲到數據庫中或者配置文件中。
LoginController
@RestController
@RequestMapping("/")
public class LoginControler {
@Autowired
private UserService userService;
@Autowired
private RedisUtil redisUtil;
/**
* 用戶登錄
*/
@PostMapping("/checkLogin")
public JsonResult checkLogin(HttpServletRequest request, @RequestBody LoginDto loginDto) {
User user = userService.getByUsername(loginDto.getUsername());
if (user != null && user.getPasssword().equals(loginDto.getPassword())) {
//登錄成功
String accessToken = UUID.randomUUID().toString();
//放入redis
redisUtil.set(RedisKey.ACCESS_TOKEN + accessToken, user, 30 * 60);
Map<String, String> map = new HashMap<>();
map.put("accessToken", accessToken);
JsonResult jsonResult = new JsonResult(true, GlobalReturnCode.OPERA_SUCCESS, accessToken);
return jsonResult;
} else {
JsonResult jsonResult = new JsonResult(false, "20102");
return jsonResult;
}
}
}
這里面是登錄后獲取accessToken的代碼,統一返回JsonResult。
要說明一點,可以利用@PostMapping
來指定該請求只接收post,簡化了以前的RequestMapping設置。用戶賬號或密碼錯誤,返回
用戶登錄成功,返回accessToken
登錄成功.png
賬號或密碼錯誤.png
NewsController
@RestController
@RequestMapping("/news")
public class NewsController {
@Autowired
private NewsService newsService;
@PostMapping("/add")
public JsonResult add(HttpServletRequest request, @RequestBody News news) {
int flag = newsService.add(news);
if (flag == 1) {
return new JsonResult(true, GlobalReturnCode.SAVE_SUCCESS);
} else {
return new JsonResult(false, GlobalReturnCode.OPERA_FAILURE);
}
}
@PostMapping("/update")
public JsonResult update(HttpServletRequest request, @RequestBody News news) {
int flag = newsService.update(news);
if (flag == 1) {
return new JsonResult(true, GlobalReturnCode.SAVE_SUCCESS);
} else {
return new JsonResult(false, GlobalReturnCode.OPERA_FAILURE);
}
}
@PostMapping("/delete")
public JsonResult delete(HttpServletRequest request, @RequestBody Map<String, String> map) {
int flag = newsService.delete(Integer.parseInt(map.get("id")));
if (flag == 1) {
return new JsonResult(true, GlobalReturnCode.SAVE_SUCCESS);
} else {
return new JsonResult(false, GlobalReturnCode.OPERA_FAILURE);
}
}
@PostMapping("/list")
public JsonResult list(HttpServletRequest request) {
List<News> list = newsService.list();
return new JsonResult(true, GlobalReturnCode.OPERA_SUCCESS, list);
}
@PostMapping("/get")
public JsonResult get(HttpServletRequest request, @RequestBody Map<String, String> map) {
News news = newsService.get(Integer.parseInt(map.get("id")));
return new JsonResult(true, GlobalReturnCode.OPERA_SUCCESS, news);
}
}
新增news.png
根據id獲取news.png
這里面比較簡單,需要注意的一點就是,傳參數即使只包括一個字段,也需要用@RequestBody
來接收