这是我的后台代码
通过POSTMAN测试访问后台方法都能正常使用,而一到前台访问就报404
@RestController
@RequestMapping("/exc")
@CrossOrigin
public class Tb_skuController {
    @Autowired
    Tb_skuService tbSkuService;
    @GetMapping("/showAll")
    public Map<String,Object> show(){
        List<Tb_sku> list = tbSkuService.showAll();
        Map<String,Object> map = new HashMap<>();
        map.put("code","0");
        map.put("data",list);
        return map;
    }    @PostMapping("/deleteTb/{id}")
    public int deleteTb(@PathVariable("id") int id){
    return tbSkuService.deleteTb(id);
    }    @PostMapping("/save")
    public int save(Tb_sku tb_sku){
        return tbSkuService.save(tb_sku);
    }    @PostMapping("/update")
    public int update(Tb_sku tb_sku){
        return tbSkuService.update(tb_sku);
    }    @PutMapping("/query/{demoReload}")
    public Map<String,Object> query(@PathVariable("demoReload")  String demoReload){
        List<Tb_sku> list = tbSkuService.query(demoReload);
        System.out.println(demoReload+"222222222");
        Map<String,Object> map = new HashMap<>();
        map.put("code","0");
        map.put("data",list);
        return map;
    }
}前台代码
table.render({   
    elem: '#test'
    ,url:'/exc/showAll'
    ,toolbar: '#toolbarDemo'
    ,title: '学生信息数据表'
    ,cols: [[
      {type: 'checkbox', fixed: 'left'}
      ,{field:'id', title:'id',fixed: 'left', unresize: true}
      ,{field:'spu_id', title:'spu_id',  edit: 'text'}
     ,{field:'title', title:'商品标题',  edit: 'text'}
  ,{field:'images', title:'商品图片', edit: 'text'}
   ,{field:'price', title:'销售单价', edit: 'text'}
    ,{field:'indexes', title:'下标组合',  edit: 'text'}
 ,{field:'own_spec', title:'键值对', edit: 'text'}
  ,{field:'enable', title:'是否有效',  edit: 'text'}
   ,{field:'create_time', title:'添加时间', edit: 'text'}
    ,{field:'last_update_time', title:'最后修改时间', edit: 'text'}
  ,{fixed: 'right', title:'操作', toolbar: '#barDemo'}
    ]]
,id:'testReload'

    ,page: true

  });
  
  
var $ = layui.$, active = {
    reload: function(){
alert($('#demoReload').val())
      var demoReload = $('#demoReload').val();
      
      //执行重载
      table.reload('testReload', {
  url:"/exc/query",
  method:"get",
     
        where: {

          
            'demoReload': demoReload
          
        }
      });
    }
  };
  
  $('.demoTable .layui-btn').on('click', function(){
    var type = $(this).data('type');
    active[type] ? active[type].call(this) : '';
  });
  
  
 
  
  
  //头工具栏事件
  table.on('toolbar(test)', function(obj){
    var checkStatus = table.checkStatus(obj.config.id);
    switch(obj.event){
      case 'save':
       //添加弹出form
   layer.open({
          type: 1,
  shade:0,
   content: $("#saveDiv").append(),
          id:"alertcenterdiv",
          title: '信息处理',
          area: ['700px', '500px'], //宽高
          cancel: function (index, layero) {
            layer.close(index);
            $("#saveDiv").css("display", "none");
            return false;
          }       
        });
     break;
        var data = checkStatus.data;
        layer.alert(JSON.stringify(data));
      break;
      case 'getCheckLength':
        var data = checkStatus.data;
        layer.msg('选中了:'+ data.length + ' 个');
      break;
      case 'isAll':
        layer.msg(checkStatus.isAll ? '全选': '未全选');
      break;
    };
  });
  
  
  //监听行工具事件
  table.on('tool(test)', function(obj){
    var data = obj.data;
    //console.log(obj)
    if(obj.event === 'del'){
      layer.confirm('真的删除行么', function(index){
       obj.del();
        
          $.ajax({
              url:'/exc/deleteTb',
              type:'post',
  
              data: {id: data.id},
              success: function (msg) {
                  if (msg == success) {
                      //删除这一行
                      alert("成功")
                      //关闭弹框
                      layer.close(index);
                     // layer.msg("删除成功", {icon: 6});
                      
                  } else {
                      layer.msg("删除失败", {icon: 5});
                  }
              }
          });        
        
        layer.close(index);
      });
    } else if(obj.event === 'edit'){
   //   layer.prompt({
   //     formType: 2
  //      ,value: data.email
  //    }, function(value, index){
  //      obj.update({
   //       email: value
   //     });
   //     layer.close(index);
   
      //});
     var data = obj.data; 
     var layEvent = obj.event; // 获得 lay-event 对应的值(也可以是表头的event 参数对应的值)
var tr = obj.tr;         // 获得当前行 tr 的DOM对象
    
     alert(form.val('filter','object'))
     //修改弹出form
layer.open({

        type: 1,
        shade:0,
content: $("#editDiv").append(),
        id:"alertcenterdiv1",
        title: '信息处理',
        area: ['400px', '500px'], //宽高
        
        success : function(layero, index) {
        
         //console.log(layero, index);
         //console.log(data.subno,data.subname);
         //console.log(data.tsex);
        
         alert("编辑");
         layer.iframeAuto(index);
$('#id1').val(data.id);
$('#spu_id1').val(data.spu_id);//机会来源
$('#title1').val(data.title);//创建人
$('#images1').val(data.images);
$('#indexes1').val(data.indexes);
$('#price1').val(data.price);
$('#own_spec1').val(data.own_spec);
$('#enable1').val(data.enable);
$('#create_time1').val(data.create_time);
$('#last_update_time1').val(data.last_update_time);



        }

      });

   
    }
    layui.use('form', function(){
        var form = layui.form;
        
        //监听提交
        form.on('submit(formDemo)', function(data){
          layer.msg(JSON.stringify(data.field));
          return false;
        });
      });
  });
    
  form.on('submit(btn1)', function(data){
    
    $.ajax({
method:"post",
data:{
 
spu_id:$("#spu_id").val()
,title:$("#title").val()
,images:$("#images").val()
,price:$("#price").val()
,indexes:$("#indexes").val()
,own_spec:$("#own_spec").val()
,enable:$("#enable").val()
,create_time:$("#create_time").val()
,last_update_time:$("#last_update_time").val()
},  
url:'/exc/save',
success:function (data){
var json = eval('(" + data + ")')
if(json){
alert("成功");
window.location.href= "http://localhost:3000/admin.html";
}else{
alert("失败");
}
}
});
    return false;
  });
  
  
  
  
  
  
 
  
  
  
  
  
  
  
  form.on('submit(btn2)', function(data){  
    $.ajax({
method:"post",
data:{
id:$("#id1").val()
,spu_id:$("#spu_id1").val()
,title:$("#title1").val()
,images:$("#images1").val()
,price:$("#price1").val()
,indexes:$("#indexes1").val()
,own_spec:$("#own_spec1").val()
,enable:$("#enable1").val()
,create_time:$("#create_time1").val()
,last_update_time:$("#last_update_time1").val()
},  
url:'/exc/update',
success:function (data){
var json = eval('(" + data + ")')
if(json){
alert("成功");
window.location.href= "http://localhost:3000/admin.html";
}else{
alert("失败");
}
}
});
console.log(data.id1,data.spu_id1);
//var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
        //parent.layer.close(index); //再执行关闭   //**********************
        //parent.location.reload();
return false;
  });中间件采用的是nodejs
const http = require('http');
const express = require('express');
const tracer = require('tracer').colorConsole();
const mysql = require("mysql");
const bp = require("body-parser");const app = express();
const db = mysql.createConnection({
    host: "localhost"
    ,port:3306
    ,database:"goodbase"
    ,user:"newuser"
    ,password:"123"
});
db.connect();app.use(bp.urlencoded({extended: true}));
app.use(bp.json());
app.use(express.static("./view"));
//调用应该直接把请求转向给spring-boottracer.info('服务已启动', `http://127.0.0.1:3000`);app.use('/*', function (req, res, next) { 
    tracer.info('Body', req.body);
    next();
});
app.use('/', function (req, res) {
    
    if (req.body) {
        tracer.info(req.body);
    }
    let option = {
        hostname: '192.168.55.127',
        port: 8081,
        path: req.baseUrl + req.path,
        method: req.method,
        headers: {
            'Content-Type': 'application/json',
            'charset': 'utf-8',
        }
    };
    let request = http.request(option, (response) => {
        response.setEncoding('utf8');
        let rawData = '';
        response.on('data', (chunk) => {
            rawData += chunk;
        }).on('end', () => {
console.log(typeof(rawData))
console.log(JSON.parse(rawData))
            res.send(rawData) || res.json({message: 'ERROR'});
        })
    })
request.on('error', (e) => {
tracer.error(e);
})
    request.write(JSON.stringify(req.body) + '\n');
    request.end();
});
app.listen(3000);