前端工程依赖安装与启动
npm install
# 启动工程
npm run dev
页面效果
前后端分离跨域问题
浏览器跨域问题:
-
只要请求的协议、端口、ip域名不一致,浏览器就拒绝访问对应的资源;
-
浏览器的同源策略:访问安全问题;
在前面的知识中,我们已经了解到项目进行前后端分离后,存在跨域问题,只需在前端进行简单配置即可;
前后端跨域配置
在stock_front_admin\src\settings.js文件下配置跨域:
devServer: {
port: 80,
host: '127.0.0.1',// 开发host
open:true,// 是否启动时打开浏览器
disableHostCheck: true, // 映射外网时,需要设置为true
/**
* 域名,他将会基于 window.location来链接服务器,需要使用public配置
* dev-server被代理到nginx中配置的 itheima.com
*/
public: "127.0.0.1:80",//itheima.com
publicPath:'/',
compress:true,
overlay: {// 是否在浏览器全屏显示错误与警告
warnings: false,
errors:true
},
proxy: {// 跨域请求配置
"/api": {
secure: false,// 关闭安全检测,默认请求 https
//target: "http://192.168.188.131:8091",
target: "http://localhost:8091",
changeOrigin: true,
// pathRewrite: {"^/api" : ""},
}
},
},
注意:请求路径中以api开头的路径则通过代理转发到8091端口,而8091端口就是我们后端展示服务的端口!
前后端交互数据格式
-
前端与后端使用json格式进行交互;
-
后端响应数据封装到统一类中;
{
code: 1 //状态码
msg: "" //提示信息
data: //任意响应数据
}
前端解析响应数据时,语法格式统一;
统一数据封装:
package com.itheima.stock.vo.resp;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* 返回数据类
* @JsonInclude 保证序列化json的时候,如果是null的对象,key也会消失
* @param <T>
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class R<T> implements Serializable {
private static final long serialVersionUID = 7735505903525411467L;
// 成功值,默认为1
private static final int SUCCESS_CODE = 1;
// 失败值,默认为0
private static final int ERROR_CODE = 0;
//状态码
private int code;
//消息
private String msg;
//返回数据
private T data;
private R(int code){
this.code = code;
}
private R(int code, T data){
this.code = code;
this.data = data;
}
private R(int code, String msg){
this.code = code;
this.msg = msg;
}
private R(int code, String msg, T data){
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T> R<T> ok(){
return new R<T>(SUCCESS_CODE,"success");
}
public static <T> R<T> ok(String msg){
return new R<T>(SUCCESS_CODE,msg);
}
public static <T> R<T> ok(T data){
return new R<T>(SUCCESS_CODE,data);
}
public static <T> R<T> ok(String msg, T data){
return new R<T>(SUCCESS_CODE,msg,data);
}
public static <T> R<T> error(){
return new R<T>(ERROR_CODE,"error");
}
public static <T> R<T> error(String msg){
return new R<T>(ERROR_CODE,msg);
}
public static <T> R<T> error(int code, String msg){
return new R<T>(code,msg);
}
public static <T> R<T> error(ResponseCode res){
return new R<T>(res.getCode(),res.getMessage());
}
public int getCode(){
return code;
}
public String getMsg(){
return msg;
}
public T getData(){
return data;
}
}
定义状态码与提示信息枚举:
package com.itheima.stock.vo.resp;
/**
* @author by itheima
* @Date 2021/12/21
* @Description
*/
public enum ResponseCode{
ERROR(0,"操作失败"),
SUCCESS(1,"操作成功"),
DATA_ERROR(0,"参数异常"),
NO_RESPONSE_DATA(0,"无响应数据"),
CHECK_CODE_NOT_EMPTY(0,"验证码不能为空"),
CHECK_CODE_ERROR(0,"验证码错误"),
USERNAME_OR_PASSWORD_ERROR(0,"用户名或密码错误"),
ACCOUNT_EXISTS_ERROR(0,"该账号已存在"),
ACCOUNT_NOT_EXISTS(0,"该账号不存在"),
TOKEN_ERROR(2,"用户未登录,请先登录"),
NOT_PERMISSION(3,"没有权限访问该资源"),
ANONMOUSE_NOT_PERMISSION(0,"匿名用户没有权限访问"),
INVALID_TOKEN(0,"无效的票据"),
OPERATION_MENU_PERMISSION_CATALOG_ERROR(0,"操作后的菜单类型是目录,所属菜单必须为默认顶级菜单或者目录"),
OPERATION_MENU_PERMISSION_MENU_ERROR(0,"操作后的菜单类型是菜单,所属菜单必须为目录类型"),
OPERATION_MENU_PERMISSION_BTN_ERROR(0,"操作后的菜单类型是按钮,所属菜单必须为菜单类型"),
OPERATION_MENU_PERMISSION_URL_CODE_NULL(0,"菜单权限的按钮标识不能为空"),
ROLE_PERMISSION_RELATION(0, "该菜单权限存在子集关联,不允许删除");
private int code;
private String message;
ResponseCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}