springBoot+nodeJs实现前后端分离

发布时间:2019-05-06
技术:springboot+nodejs+mybatis+lombok

概述

这是一个前后端分离的项目demo,后端采用springboot+mybatis实现,并自定义的枚举类型到数据库类型的映射,nodejs作为服务器转发请求和访问静态页面,通过这个demo可以了解前后端分离项目的基本结构和实现。

详细

概述

这是一个前后端分离的项目demo,后端采用springboot+mybatis实现,并自定义的枚举类型到数据库类型的映射,nodejs作为服务器转发请求和访问静态页面,通过这个demo可以了解当前大部分公司使用的前后端分离项目的基本结构和实现。

详细

一、运行效果

登录页

登陆2.png

数据列表页

首页2.png

二、项目结构

前端项目结构

前端项目结构31.png

后端项目结构图

后端项目结构图55.png

三、实现

1,新建springboot项目,这个利用Idea或者sts开发工具生成的就行了,不多了,大家都会的。

2,配置数据库及mybatis

    application.properties文件配置

#指定扫描的实体类作为别名
mybatis.type-aliases-package=com.example.demo.domin
#mybatis sql映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/world?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
logging.level.com.example.demo.mapper=debug
#自定义的类型处理器handler路径
mybatis.type-handlers-package=com.example.demo.core
#mybatis主文件路劲
mybatis.config-location=classpath:mybatis-config.xml

    mybatis-config.xml文件配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeHandlers>
       <!-- 只配置了一个自定义枚举类型的处理器-->
       <typeHandler handler="com.example.demo.core.EnumValueTypeHandler"/>
    </typeHandlers>
</configuration>

    UserMapper.xml  mapper映射文件配置

<?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.example.demo.mapper.UserMapper">
 
    <resultMap id="map1" type="com.example.demo.domin.User">
        <result column="id"  property="id" />
        <!--这里可以直接将数据的int类型转为java枚举类型-->
        <result column="type"  property="type" typeHandler="com.example.demo.core.EnumValueTypeHandler" />
        <result column="name"  property="name" />
    </resultMap>
 
    <select id="getUser"  resultMap="map1">
        select id,username,sex,city   from t_users
    </select>

</mapper>

3.定义返回数据格式实体类

@Data
public class ResultBody<T> {
    //返回数据代码 0 表示成功  1 表示失败
    private int code;
    //返回失败时的提示信息
    private String msg;
    //记录总数
    private int count;
    //记录集合
    private List<T> data;


    public static  <T> ResultBody  returnSuc(List<T> data){
        ResultBody resultBody=new ResultBody();
        resultBody.setCode(0);
        resultBody.setMsg("");
        resultBody.setData(data);
        resultBody.setCount(data.size());
        return  resultBody;
    }
    public static  <T> ResultBody  returnFail(String errorMsg){
        ResultBody resultBody=new ResultBody();
        resultBody.setCode(1);
        resultBody.setMsg(errorMsg);
        return  resultBody;
    }

}

4.定义控制器类TestCon

@RestController
public class TestCon {
   
   @Autowired
   UserMapper userMapper;
   
   @RequestMapping("/api/users")
    public ResultBody getUser() {
      List<User> list =userMapper.getUser();
        return ResultBody.returnSuc(list);
    }
}

5.通过npm 安装express和http-proxy-middleware,并执行npm init生成package.json文件

{
  "name": "springbootlj",
  "version": "1.0.0",
  "description": "前后端分离项目测试",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/yiwuxia/springboot-mybatis-enum.git"
  },
  "keywords": [
    "7403"
  ],
  "author": "lijin",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/yiwuxia/springboot-mybatis-enum/issues"
  },
  "homepage": "https://github.com/yiwuxia/springboot-mybatis-enum#readme",
  "dependencies": {
    "express": "^4.16.4",
    "http-proxy-middleware": "^0.19.1"
  }
}

6.定义nodejs启动文件index.js

//引用模块
var express = require('express')
var proxy = require('http-proxy-middleware')
var app  = express()
//静态资源直接访问
//如dist/js/jquery.js  访问路径为 http://localhost/js/jquery.js 在script标签中src="js/jquery.js"
app.use(express.static('dist'))
//api子目录下的都是用8080代理
// 在我的源代码后端是8080端口开启 其中有两个controller  UserController  TestController
//UserController requestMapping是"/api"  访问http://localhost/api/users 相当于访问 http://localhost:8080/api/users
//TestController requestMapping是"/test" 访问http://localhost/test/users不能访问
//
const apiProxy = proxy('/api', { target: 'http://localhost:8080',changeOrigin: true });//将服务器代理到localhost:8080端口上[本地服务器为localhost:3000]
app.use('/api/*', apiProxy);


app.get('/', function (req, res) {
    console.log("1111111");
    res.sendFile( __dirname + "/src/" + "login.html" );
})

app.get('/index.html', function (req, res) {
    console.log("22222");
    res.sendFile( __dirname + "/src/" + "index.html" );
})

app.get('/login.html', function (req, res) {
    console.log("3333333");
    res.sendFile( __dirname + "/src/" + "login.html" );
})
// app.get('*',function(req,res){
//     res.sendFile( __dirname + "/src/" + "index.html" );
// })
//定义程序监听的端口
app.listen(8081,function(){
    console.log('connect successfully')
})

7,定义登陆页和数据表格页,html文件在zip中。

四、运行测试

进入index.js所在的文件夹目录,打开cmd窗口,执行node index.js,输出如下信息表示启动成功。

运行前端1.png

访问 http://localhost:8081/login.html  即可看到登陆页面,随便输入用户名密码,点击登陆进入数据页,页面显示从后台请求过来的数据项。


本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
手机上随时阅读、收藏该文章 ?请扫下方二维码