SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

时间:2022-08-23 20:22:00

1、概念:Restful 基础架构

2、具体内容

对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为 了清晰可见,创建一套新的微服务架构:部门微服务(Dept)。

如果要想进行 SpringCloud 开发,那么一定要对 SpringBoot 有一定的了解,同时本次也将融合 MyBatis 开发技术实现整体的微 服务的创建处理。

2.1、搭建项目环境

对于现在的项目创建一个:microcloud 的整体父 pom 项目,那么随后为了方便管理,将创建其三个子模块:

· microcloud-api 模块,作为公共的信息导入配置模块;

· microcloud-provider-dept-8001:作为服务提供者,该提供者负责使用 Mybatis 与数据库交互;

· microcloud-consumer-80:作为微服务调用的客户端使用。

1、 创建一个新的 maven 项目:microcloud;

2、 【microcloud】修改 pom.xml 文件,主要追加 springcloud 与 springboot 两个开发包的依赖关系;

注意:SpringCloud 中针对于依赖包的版本并不是像传统那样采用数字的形式定义的,而是使用了一系列的英国的地铁或城镇的名字来定义的。

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.study</groupId>
<artifactId>microcloud</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<name>microcloud</name>
<url>http://maven.apache.org</url>
<properties>
<jdk.version>1.8</jdk.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency> <!-- 进行SpringCloud依赖包的导入处理 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency> <!-- SpringCloud离不开SpringBoot,所以必须要配置此依赖包 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>microcloud</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source><!-- 源代码使用的开发版本 -->
<target>${jdk.version}</target><!-- 需要生成的目标class文件的编译版本 -->
<encode>${project.build.sourceEncoding}</encode>
</configuration>
</plugin>
</plugins>
</build>
</project>
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

3、 【microcloud-api】建立一个 api 的公共模块,该模块的主要功能是提供有公共处理类,本次预计建立一个 Dept 数据表,里面 的字段:deptno(Long)、dname(String)、loc(保存的数据库的名字);

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.vo;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Dept implements Serializable {
private Long deptno ;
private String dname ;
private String loc ;
public Long getDeptno() {
return deptno;
}
public void setDeptno(Long deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc
+ "]";
}
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

4、 创建一个 Rest 提供者的【microcloud-provider-dept-8001】项目模块,在这个模块里面主要定义要使用的数据库脚本:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
DROP DATABASE IF EXISTS "study8001" ;
CREATE DATABASE study8001 CHARACTER SET UTF8 ;
USE study8001 ;
CREATE TABLE dept (
deptno BIGINT AUTO_INCREMENT ,
dname VARCHAR(50) ,
loc VARCHAR(50) ,
CONSTRAINT pk_deptno PRIMARY KEY(deptno)
) ;
INSERT INTO dept(dname,loc) VALUES ('开发部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('财务部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('市场部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('后勤部',database()) ;
INSERT INTO dept(dname,loc) VALUES ('公关部',database()) ;
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

由于在整个微服务里面需要进行负载均衡的操作,所以本次在使用的时候加入了数据库的名称信息。

备注:

创建子模块【microcloud-api】【microcloud-provider-dept-8001】的步骤

在【microcloud】项目右键-new-other

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

2.2、创建 Dept 微服务

所谓的微服务的核心本质就是 JSON 的传输,那么既然现在要求使用 MyBatis 进行数据库操作,所以应该在项目里面配置 Druid 数据库连接池,而后对外进行项目的发布。

1、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,追加相关的依赖程序支持包:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
    <dependencies>
<dependency>
<groupId>cn.study</groupId>
<artifactId>microcloud-api</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

2、 【microcloud-provider-dept-8001】创建一个 IDeptDAO 数据操作接口,这个接口里面将提供有三个数据操作方法:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import cn.study.vo.Dept;
@Mapper
public interface IDeptDAO {
public boolean doCreate(Dept vo) ;
public Dept findById(Long id) ;
public List<Dept> findAll() ;
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

3、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加 mybatis 和服务的相关配置信息:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: cn.study.vo # 定义所有操作类的别名所在包
mapper-locations: # 所有的mapper映射文件
- classpath:mybatis/mapper/**/*.xml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型
driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驱动程序类
url: jdbc:mysql://localhost:3306/study8001 # 数据库连接地址
username: root # 数据库用户名
password: mysqladmin # 数据库连接密码
dbcp2: # 进行数据库连接池的配置
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化提供的连接数
max-total: 5 # 最大的连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

4、 【microcloud-provider-dept-8001】定义 src/main/resources/mybatis/mybatis.cfg.xml 配置文件:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
<?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> <!-- 进行Mybatis的相应的环境的属性定义 -->
<settings> <!-- 在本项目之中开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

5、 【microcloud-provider-dept-8001】修改 src/main/resources/mybatis/mapper/cn/mldn/Dept.xml 配置文件:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
<?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="cn.study.microcloud.dao.IDeptDAO">
<select id="findById" resultType="Dept" parameterType="long">
SELECT deptno,dname,loc FROM dept WHERE deptno=#{deptno} ;
</select>
<select id="findAll" resultType="Dept">
SELECT deptno,dname,loc FROM dept ;
</select>
<insert id="doCreate" parameterType="Dept">
INSERT INTO dept(dname,loc) VALUES (#{dname},database()) ;
</insert>
</mapper>
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

6、 【microcloud-provider-dept-8001】建立 IDeptService 接口,做业务实现:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud.service;

import java.util.List;

import cn.study.vo.Dept;

public interface IDeptService {
public Dept get(long id) ;
public boolean add(Dept dept) ;
public List<Dept> list() ;
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import cn.study.microcloud.dao.IDeptDAO;
import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;
@Service
public class DeptServiceImpl implements IDeptService {
@Resource
private IDeptDAO deptDAO ;
@Override
public Dept get(long id) {
return this.deptDAO.findById(id);
} @Override
public boolean add(Dept dept) {
return this.deptDAO.doCreate(dept);
} @Override
public List<Dept> list() {
return this.deptDAO.findAll();
} }
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

7、 【microcloud-provider-dept-8001】定义程序的运行主类

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Dept_8001_StartSpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args);
}
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

8、 【microcloud-provider-dept-8001】进行业务接口测试编写:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.test;

import static org.junit.Assert.fail;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import cn.study.microcloud.Dept_8001_StartSpringCloudApplication;
import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept;
@SpringBootTest(classes = Dept_8001_StartSpringCloudApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class IDeptServiceTest {
@Resource
private IDeptService deptService ;
@Test
public void testGet() {
System.out.println(this.deptService.get(1));
} @Test
public void testAdd() {
Dept dept = new Dept() ;
dept.setDname("测试部-" + System.currentTimeMillis());
System.out.println(this.deptService.add(dept));
} @Test
public void testList() {
System.out.println(this.deptService.list());
} }
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

9、 【microcloud-provider-dept-8001】建立Restful的DeptRest 服务类:

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud.rest;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import cn.study.microcloud.service.IDeptService;
import cn.study.vo.Dept; @RestController
public class DeptRest {
@Resource
private IDeptService deptService ;
@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
public Object get(@PathVariable("id") long id) {
return this.deptService.get(id) ;
}
@RequestMapping(value="/dept/add",method=RequestMethod.GET)
public Object add(@RequestBody Dept dept) {
return this.deptService.add(dept) ;
}
@RequestMapping(value="/dept/list",method=RequestMethod.GET)
public Object list() {
return this.deptService.list() ;
}
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

10、 修改 hosts 配置文件,追加一个映射路径(路径:C:\Windows\System32\drivers\etc\hosts)。

127.0.0.1 dept-8001.com

11、 观察 Rest 服务能否正常提供:

· 调用 get 操作:dept-8001.com:8001/dept/get/1;

· 调用 list 操作:http://dept-8001.com:8001/dept/list;

2.3、客户端调用微服务

1、 创建一个 Maven 的新的模块:microcloud-consumer-80;

2、 【microcloud-consumer-80】修改 application.yml 配置文件:

server:
port: 80

3、 【microcloud-consumer-80】创建一个 Rest 的配置程序类,主要进行 RestTemplate 类对象创建,这里很重要,编写这个类然后在控制器里面使用@Resource注解注入以后控制器就可以调用其他微服务了

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; @Configuration
public class RestConfig {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate() ;
}
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

4、 【microcloud-consumer-80】创建一个控制器,为了简化处理,本次不再进行页面定义了,所有服务结果都使用 Rest 返回;

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud.controller;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import cn.study.vo.Dept; @RestController
public class ConsumerDeptController {
public static final String DEPT_GET_URL = "http://dept-8001.com:8001/dept/get/";
public static final String DEPT_LIST_URL = "http://dept-8001.com:8001/dept/list/";
public static final String DEPT_ADD_URL = "http://dept-8001.com:8001/dept/add";
//使用@Resource注解注入RestTemplate以后控制器就可以调用其他微服务了
@Resource
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/dept/get")
public Object getDept(long id) {
Dept dept = this.restTemplate.getForObject(DEPT_GET_URL + id,
Dept.class);
return dept;
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/consumer/dept/list")
public Object listDept() {
List<Dept> allDepts = this.restTemplate.getForObject(DEPT_LIST_URL,
List.class);
return allDepts;
}
@RequestMapping(value = "/consumer/dept/add")
public Object addDept(Dept dept) {
Boolean flag = this.restTemplate.postForObject(DEPT_ADD_URL, dept,
Boolean.class);
return flag;
}
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

5、 【microcloud-consumer-80】编写启动程序类

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Consumer_80_StartSpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,
args);
}
}
SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

6、 修改 hosts 配置文件,追加访问控制路径:

127.0.0.1 client.com

7、 进行代码测试调用:

· 调用数据返回:http://client.com/consumer/dept/get?id=1;

· 测试列表数据:http://client.com/consumer/dept/list;

· 测试数据增加:http://client.com/consumer/dept/add?dname=WEB 测试

SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)的更多相关文章

  1. 用c&num;开发微信 &lpar;11&rpar; 微统计 - 阅读分享统计系统 1 基础架构搭建

    微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...

  2. Mina 系列&lpar;二&rpar;之基础

    Mina 系列(二)之基础 Mina 使用起来多么简洁方便呀,就是不具备 Java NIO 的基础,只要了解 Mina 常用的 API,就可以灵活使用并完成应用开发. 1. Mina 概述 首先,看 ...

  3. Java电商项目-1&period;构建数据库&comma;搭建项目环境

    目录 到Github获取源码请点击此处 一. 数据库还原 二. Mybatis逆向生成工具的使用 三. 搭建项目环境 四. 在linux虚拟机上部署zookeeper, 搭建Dubbo服务. linu ...

  4. 02 - Unit01:服务器返回数据的json处理&plus;搭建项目环境

    服务器返回数据的json处理+搭建项目环境 服务器返回数据的json处理 springMVC JSP响应流程 请求 -->DispatcherServlet -->HandlerMappi ...

  5. IDEA中搭建项目环境

    ladies and gentlemen,Welcome to my blog! 本文主要在IDEA中搭建项目环境. 有问题和指正,欢迎下方留言~ 1. 使用GitLab将项目下载下来   1.1 选 ...

  6. Web API系列之二WebApi基础框架搭建

    本文主要介绍如何搭建一个WebApi的项目.关于如何搭建WebApi的方式一共有两种: 一.通过vs直接新建一个WebApi的项目,步骤如下: 第一步: 新建一个空的Web应用程序,可以理解为作为We ...

  7. Vue环境搭建-项目的创建-启动生命周期-组件的封装及应用

    vue项目环境的搭建 """ node >>> python:node是用c++编写用来运行js代码的 npm(cnpm) >>> p ...

  8. Hibernate 再接触 基础配置 搭建Log4j环境 Junit日志环境等

    <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.aut ...

  9. 搭建Nodejs环境 创建Express应用

    1. Nodejs Nodejs是一种服务器端js脚本运行环境: Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎 2. Express开发框架 极简的web框架,完全是由路 ...

随机推荐

  1. Lua 练习中的Bug 以及日志

    使用 Lua 中的table.getn获得数组的table的长度:运行失败-- > t ={1,2,3 } > print(table.getn(t)) stdin:1: attempt ...

  2. &lpar;ASP&period;NET&rpar;总结MVC中&commat;Html表单用法

    1.当type类型是text时:@Html.TextBoxFor(model => Model.Name,new{@style = "width: 50px;", @clas ...

  3. linux内核申请内存函数

    kmap函数:    把某块高端内存映射到页表,然后返回给用户一个填好vitual字段的page结构    建立永久地址映射,不是简单的返回virtual字段的pageioremap:    驱动程序 ...

  4. OC中协议的概念以及用法

    OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...

  5. Android-设置PullToRefresh下拉刷新样式

    以下是开源控件PullToRefresh的自定义样式属性: <?xml version="1.0" encoding="utf-8"?> <r ...

  6. hao947 &colon; Mybatis resultMap配置插入和主键自增返回 &colon; 好947

    映射配置文件  好947  <!-- type:映射实体类的数据类型 id:resultMap的唯一标识 -->  <resultMap type="person&quot ...

  7. css中padding中样式的顺序含义

    4种可能的情况.举例说明: padding:10px; 四个内边距都是10px padding:5px 10px; 上下5px 左右10px padding:5px 10px 15px; 上5px 右 ...

  8. svn客户端的安装与中文版本语言库

    首先在mac下下载svn或者其他软件请看另一篇博客链接:http://www.cnblogs.com/minyc/p/myc201606191543.html 另附svn常用命令操作详解:http:/ ...

  9. margin-top导致父标签偏移问题

    从一个大神博客中看到这句话: 这个问题发生的原因是根据规范,一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子的上边距会和其内部文档流中的第一个子元素的上边 ...

  10. kod 编辑器下载

    链接: https://pan.baidu.com/s/1ZACwJZ_x2ZBziqPlm17z6w 提取码: 3w9m