init
This commit is contained in:
178
01-讲义/其他文档/Jenkins使用手册.md
Normal file
178
01-讲义/其他文档/Jenkins使用手册.md
Normal file
@@ -0,0 +1,178 @@
|
||||
# 1、Jenkins介绍
|
||||

|
||||
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。官网: [http://jenkins-ci.org/](http://jenkins-ci.org/)。
|
||||
Jenkins的特征:
|
||||
|
||||
- 开源的 Java语言开发持续集成工具,支持持续集成,持续部署。
|
||||
- 易于安装部署配置:可通过 yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。
|
||||
- 消息通知及测试报告:集成 RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告。
|
||||
- 分布式构建:支持 Jenkins能够让多台计算机一起构建/测试。
|
||||
- 文件识别: Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
|
||||
- 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如 git,svn,maven,docker等。
|
||||
|
||||
Jenkins安装和持续集成环境配置
|
||||

|
||||
|
||||
- 首先,开发人员每天进行代码提交,提交到Git仓库
|
||||
- 然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
|
||||
- 最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。
|
||||
# 2、部署安装
|
||||
在神领物流项目中采用Docker方式部署Jenkins,部署脚本如下:
|
||||
```shell
|
||||
docker run -d \
|
||||
-p 8090:8080 \
|
||||
-p 50000:50000 \
|
||||
-v /usr/local/src/jenkins:/var/jenkins_home \
|
||||
-v /maven:/maven \
|
||||
-v /etc/localtime:/etc/localtime \
|
||||
-v /usr/bin/docker:/usr/bin/docker \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
--privileged \
|
||||
--name jenkins \
|
||||
-e TZ=Asia/Shanghai \
|
||||
--restart=always \
|
||||
--add-host=git.sl-express.com:192.168.150.101 \
|
||||
--add-host=maven.sl-express.com:192.168.150.101 \
|
||||
jenkins/jenkins:lts-jdk11
|
||||
```
|
||||
在部署脚本中指定了时区、hosts并且将宿主机的docker服务映射到容器内部。
|
||||
访问地址:[http://jenkins.sl-express.com/](http://jenkins.sl-express.com/) 用户名密码为:root/123
|
||||
# 3、系统配置
|
||||
Jenkins安装完成后,需要进行一些配置才能正常使用。
|
||||
## 3.1、配置Maven
|
||||

|
||||

|
||||
在【系统管理】中的【全局工具配置】中进行配置。
|
||||
指定Maven配置文件:
|
||||

|
||||
配置文件内容如下:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<settings
|
||||
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
|
||||
|
||||
<localRepository>/maven/repository</localRepository>
|
||||
|
||||
<pluginGroups></pluginGroups>
|
||||
<proxies></proxies>
|
||||
|
||||
<servers>
|
||||
<server>
|
||||
<id>sl-releases</id>
|
||||
<username>deployment</username>
|
||||
<password>deployment123</password>
|
||||
</server>
|
||||
<server>
|
||||
<id>sl-snapshots</id>
|
||||
<username>deployment</username>
|
||||
<password>deployment123</password>
|
||||
</server>
|
||||
</servers>
|
||||
|
||||
<mirrors>
|
||||
<mirror>
|
||||
<id>mirror</id>
|
||||
<mirrorOf>central,jcenter,!sl-releases,!sl-snapshots</mirrorOf>
|
||||
<name>mirror</name>
|
||||
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
|
||||
</mirror>
|
||||
</mirrors>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>sl</id>
|
||||
<properties>
|
||||
<altReleaseDeploymentRepository>
|
||||
sl-releases::default::http://maven.sl-express.com/nexus/content/repositories/releases/
|
||||
</altReleaseDeploymentRepository>
|
||||
<altSnapshotDeploymentRepository>
|
||||
sl-snapshots::default::http://maven.sl-express.com/nexus/content/repositories/snapshots/
|
||||
</altSnapshotDeploymentRepository>
|
||||
</properties>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
<activeProfiles>
|
||||
<activeProfile>sl</activeProfile>
|
||||
</activeProfiles>
|
||||
|
||||
</settings>
|
||||
|
||||
```
|
||||
## 3.2、配置Git
|
||||

|
||||
## 3.3、安装Gogs插件
|
||||
我们使用的Git管理工具是Gogs,需要在用户提交代码之后触发自动构建,需要安装Gogs插件。
|
||||

|
||||
搜索Gogs安装即可。
|
||||

|
||||
在Gogs中的仓库设置钩子,例如:
|
||||

|
||||
格式:`http://jenkins.sl-express.com/gogs-webhook/?job=xxxx`
|
||||
# 4、构建任务
|
||||
在提供的虚拟机环境中虽然已经创建好了构建任务,如果不满足需求,可以执行创建任务,可以通过复制的方式完成。
|
||||
首先点击【新建任务】:
|
||||

|
||||
输入任务的名称,建议名称就是微服务的名字。
|
||||

|
||||
选择已有的构建任务:
|
||||

|
||||
输入任务的名称:
|
||||

|
||||
设置Gogs钩子:
|
||||

|
||||
设置构建参数,主要用于构建时的脚本使用:
|
||||

|
||||
设置git地址,每个项目都不一样,一定要修改!
|
||||

|
||||
设置构建开始前将workspace删除,确保没有之前编译产物的干扰:
|
||||

|
||||
设置ssh执行命令,主要是宿主机安装的docker服务具备权限,可以在容器内执行:
|
||||

|
||||
设置maven打包命令:
|
||||

|
||||
设置部署的ssh脚本,主要是完成微服务打包成docker镜像进行部署:
|
||||

|
||||
执行命令如下:
|
||||
```shell
|
||||
#!/bin/bash
|
||||
# 微服务名称
|
||||
SERVER_NAME=${serverName}
|
||||
|
||||
# 服务版本
|
||||
SERVER_VERSION=${version}
|
||||
|
||||
# 服务版本
|
||||
SERVER_PORT=${port}
|
||||
|
||||
# 源jar名称,mvn打包之后,target目录下的jar包名称
|
||||
JAR_NAME=$SERVER_NAME-$SERVER_VERSION
|
||||
|
||||
# jenkins下的目录
|
||||
JENKINS_HOME=/var/jenkins_home/workspace/$SERVER_NAME
|
||||
|
||||
cd $JENKINS_HOME
|
||||
|
||||
# 修改文件权限
|
||||
chmod 755 target/$JAR_NAME.jar
|
||||
|
||||
docker -v
|
||||
|
||||
echo "---------停止容器($SERVER_NAME)---------"
|
||||
docker stop $SERVER_NAME
|
||||
|
||||
echo "---------删除容器($SERVER_NAME)---------"
|
||||
docker rm $SERVER_NAME
|
||||
|
||||
echo "---------删除镜像($SERVER_NAME:$SERVER_VERSION)---------"
|
||||
docker rmi $SERVER_NAME:$SERVER_VERSION
|
||||
|
||||
echo "---------打包镜像($SERVER_NAME:$SERVER_VERSION)---------"
|
||||
docker build -t $SERVER_NAME:$SERVER_VERSION .
|
||||
|
||||
echo "---------运行服务---------"
|
||||
docker run -d -p $SERVER_PORT:8080 --name $SERVER_NAME -e SERVER_PORT=8080 -e SPRING_CLOUD_NACOS_DISCOVERY_IP=${SPRING_CLOUD_NACOS_DISCOVERY_IP} -e SPRING_CLOUD_NACOS_DISCOVERY_PORT=${port} -e SPRING_PROFILES_ACTIVE=stu $SERVER_NAME:$SERVER_VERSION
|
||||
```
|
||||
最后,保存即可。
|
||||
389
01-讲义/其他文档/hutool使用手册.md
Normal file
389
01-讲义/其他文档/hutool使用手册.md
Normal file
@@ -0,0 +1,389 @@
|
||||
测试代码在`sl-express-ms-base-service`的测试用例中,[点击查看](http://git.sl-express.com/sl/sl-express-ms-base-service/src/master/src/test/java/com/sl/transport/common/util)。
|
||||
# 1、[树结构工具-TreeUtil](https://hutool.cn/docs/#/core/%E8%AF%AD%E8%A8%80%E7%89%B9%E6%80%A7/%E6%A0%91%E7%BB%93%E6%9E%84/%E6%A0%91%E7%BB%93%E6%9E%84%E5%B7%A5%E5%85%B7-TreeUtil?id=%e6%a0%91%e7%bb%93%e6%9e%84%e5%b7%a5%e5%85%b7-treeutil)
|
||||
### 构建Tree示例
|
||||
```java
|
||||
package com.sl.transport.common.util;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.lang.tree.Tree;
|
||||
import cn.hutool.core.lang.tree.TreeNode;
|
||||
import cn.hutool.core.lang.tree.TreeNodeConfig;
|
||||
import cn.hutool.core.lang.tree.TreeUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
class TreeUtilTest {
|
||||
|
||||
@Test
|
||||
void treeTest() {
|
||||
// 构建node列表
|
||||
List<TreeNode<String>> nodeList = CollUtil.newArrayList();
|
||||
|
||||
nodeList.add(new TreeNode<>("1", "0", "系统管理", 5));
|
||||
nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222));
|
||||
nodeList.add(new TreeNode<>("111", "11", "用户添加", 0));
|
||||
nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1));
|
||||
nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
|
||||
nodeList.add(new TreeNode<>("221", "2", "添加商品", 2));
|
||||
|
||||
//配置
|
||||
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
|
||||
// 自定义属性名 都要默认值的
|
||||
treeNodeConfig.setWeightKey("weight");
|
||||
treeNodeConfig.setIdKey("id");
|
||||
// 最大递归深度
|
||||
treeNodeConfig.setDeep(3);
|
||||
//构造树结构
|
||||
List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0",
|
||||
(treeNode, tree) -> {
|
||||
tree.setId(treeNode.getId());
|
||||
tree.setParentId(treeNode.getParentId());
|
||||
tree.putAll(BeanUtil.beanToMap(treeNode));
|
||||
tree.remove("bid");
|
||||
});
|
||||
|
||||
log.info("treeNodes {}", JSONUtil.toJsonStr(treeNodes));
|
||||
}
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```json
|
||||
[{
|
||||
"id": "2",
|
||||
"parentId": "0",
|
||||
"name": "店铺管理",
|
||||
"weight": 1,
|
||||
"children": [{
|
||||
"id": "221",
|
||||
"parentId": "2",
|
||||
"name": "添加商品",
|
||||
"weight": 2
|
||||
}, {
|
||||
"id": "21",
|
||||
"parentId": "2",
|
||||
"name": "商品管理",
|
||||
"weight": 44
|
||||
}]
|
||||
}, {
|
||||
"id": "1",
|
||||
"parentId": "0",
|
||||
"name": "系统管理",
|
||||
"weight": 5,
|
||||
"children": [{
|
||||
"id": "11",
|
||||
"parentId": "1",
|
||||
"name": "用户管理",
|
||||
"weight": 222222,
|
||||
"children": [{
|
||||
"id": "111",
|
||||
"parentId": "11",
|
||||
"name": "用户添加",
|
||||
"weight": 0
|
||||
}]
|
||||
}]
|
||||
}]
|
||||
```
|
||||
|
||||
# 2、[Bean工具-BeanUtil](https://hutool.cn/docs/#/core/JavaBean/Bean%E5%B7%A5%E5%85%B7-BeanUtil?id=bean%e5%b7%a5%e5%85%b7-beanutil)
|
||||
### 对象转Bean
|
||||
```java
|
||||
@Slf4j
|
||||
public class BeanUtilTest {
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public static class SubPerson extends Person {
|
||||
|
||||
public static final String SUBNAME = "TEST";
|
||||
|
||||
private UUID id;
|
||||
private String subName;
|
||||
private Boolean slow;
|
||||
private LocalDateTime date;
|
||||
private LocalDate date2;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public static class Person {
|
||||
private String name;
|
||||
private int age;
|
||||
private String openid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象转Bean
|
||||
*/
|
||||
@Test
|
||||
public void toBeanTest() {
|
||||
SubPerson person = new SubPerson();
|
||||
person.setAge(14);
|
||||
person.setOpenid("11213232");
|
||||
person.setName("测试A11");
|
||||
person.setSubName("sub名字");
|
||||
|
||||
Map<?, ?> map = BeanUtil.toBean(person, Map.class);
|
||||
Assert.assertEquals("测试A11", map.get("name"));
|
||||
Assert.assertEquals(14, map.get("age"));
|
||||
Assert.assertEquals("11213232", map.get("openid"));
|
||||
// static属性应被忽略
|
||||
log.info("map是否包含名为SUBNAME的key {}", map.containsKey("SUBNAME"));
|
||||
}
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
map是否包含名为SUBNAME的key false
|
||||
```
|
||||
# 3、[验证码工具-CaptchaUtil](https://hutool.cn/docs/#/captcha/%E6%A6%82%E8%BF%B0)
|
||||
### 生成验证码
|
||||
```java
|
||||
package com.sl.transport.common.util;
|
||||
|
||||
import cn.hutool.captcha.CaptchaUtil;
|
||||
import cn.hutool.captcha.LineCaptcha;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* 直线干扰验证码单元测试
|
||||
*
|
||||
* @author looly
|
||||
*/
|
||||
@Slf4j
|
||||
public class CaptchaTest {
|
||||
|
||||
/**
|
||||
* 生成验证码
|
||||
*/
|
||||
@Test
|
||||
public void lineCaptchaTest1() {
|
||||
// 定义图形验证码的长和宽
|
||||
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
|
||||
Assert.assertNotNull(lineCaptcha.getCode());
|
||||
log.info("直线干扰验证码: {}", lineCaptcha.getCode());
|
||||
log.info("直线干扰验证码验证结果: {}",lineCaptcha.verify(lineCaptcha.getCode()));
|
||||
}
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
直线干扰验证码: 5ku0o
|
||||
直线干扰验证码验证结果: true
|
||||
```
|
||||
# 4、[类型转换工具类-Convert](https://hutool.cn/docs/#/core/%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2/%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%E5%B7%A5%E5%85%B7%E7%B1%BB-Convert?id=%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2%e5%b7%a5%e5%85%b7%e7%b1%bb-convert)
|
||||
### 转换值为指定类型
|
||||
```java
|
||||
/**
|
||||
* 转换值为指定类型
|
||||
*/
|
||||
@Test
|
||||
public void toObjectTest() {
|
||||
final Object result = Convert.convert(Object.class, "aaaa");
|
||||
log.info(result + "");
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
aaaa
|
||||
```
|
||||
# 5、[对象工具-ObjectUtil](https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E5%AF%B9%E8%B1%A1%E5%B7%A5%E5%85%B7-ObjectUtil?id=%e5%af%b9%e8%b1%a1%e5%b7%a5%e5%85%b7-objectutil)
|
||||
### 对象相等
|
||||
```java
|
||||
/**
|
||||
* 比较两个对象是否相等
|
||||
*/
|
||||
@Test
|
||||
public void equalsTest() {
|
||||
Object a = null;
|
||||
Object b = null;
|
||||
log.info("是否相等:{}" , ObjectUtil.equals(a, b));
|
||||
}
|
||||
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
是否相等:true
|
||||
```
|
||||
# 6、[数字工具-NumberUtil](https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E6%95%B0%E5%AD%97%E5%B7%A5%E5%85%B7-NumberUtil?id=%e6%95%b0%e5%ad%97%e5%b7%a5%e5%85%b7-numberutil)
|
||||
### 加法运算
|
||||
```java
|
||||
/**
|
||||
* 提供精确的加法运算
|
||||
*/
|
||||
@Test
|
||||
public void addTest() {
|
||||
final Float a = 3.15f;
|
||||
final Double b = 4.22;
|
||||
final double result = NumberUtil.add(a, b).doubleValue();
|
||||
log.info(result + "");
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
7.37
|
||||
```
|
||||
# 7、[日期时间工具-DateUtil](https://hutool.cn/docs/#/core/%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4/%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E5%B7%A5%E5%85%B7-DateUtil?id=%e6%97%a5%e6%9c%9f%e6%97%b6%e9%97%b4%e5%b7%a5%e5%85%b7-dateutil)
|
||||
### 当前时间
|
||||
```java
|
||||
/**
|
||||
* 当前时间
|
||||
*/
|
||||
@Test
|
||||
public void nowTest() {
|
||||
// 当前时间
|
||||
final Date date = DateUtil.date();
|
||||
Assert.assertNotNull(date);
|
||||
// 当前时间
|
||||
final Date date2 = DateUtil.date(Calendar.getInstance());
|
||||
Assert.assertNotNull(date2);
|
||||
// 当前时间
|
||||
final Date date3 = DateUtil.date(System.currentTimeMillis());
|
||||
Assert.assertNotNull(date3);
|
||||
|
||||
// 当前日期字符串,格式:yyyy-MM-dd HH:mm:ss
|
||||
final String now = DateUtil.now();
|
||||
Assert.assertNotNull(now);
|
||||
// 当前日期字符串,格式:yyyy-MM-dd
|
||||
final String today = DateUtil.today();
|
||||
log.info(today);
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
2023-03-10
|
||||
```
|
||||
# 8、[集合工具-CollUtil](https://hutool.cn/docs/#/core/%E9%9B%86%E5%90%88%E7%B1%BB/%E9%9B%86%E5%90%88%E5%B7%A5%E5%85%B7-CollUtil?id=%e9%9b%86%e5%90%88%e5%b7%a5%e5%85%b7-collutil)
|
||||
### 自定义函数判断集合是否包含某类值
|
||||
```java
|
||||
/**
|
||||
* 自定义函数判断集合是否包含某类值
|
||||
*/
|
||||
@Test
|
||||
public void testPredicateContains() {
|
||||
final ArrayList<String> list = CollUtil.newArrayList("bbbbb", "aaaaa", "ccccc");
|
||||
log.info( "" + CollUtil.contains(list, s -> s.startsWith("a")));
|
||||
log.info( "" + CollUtil.contains(list, s -> s.startsWith("d")));
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
true
|
||||
false
|
||||
```
|
||||
# 9、[集合串行流工具-CollStreamUtil](https://hutool.cn/docs/#/core/%E9%9B%86%E5%90%88%E7%B1%BB/%E9%9B%86%E5%90%88%E4%B8%B2%E8%A1%8C%E6%B5%81%E5%B7%A5%E5%85%B7-CollStreamUtil?id=%e9%9b%86%e5%90%88%e4%b8%b2%e8%a1%8c%e6%b5%81%e5%b7%a5%e5%85%b7-collstreamutil)
|
||||
### 将Collection转化为map
|
||||
```java
|
||||
/**
|
||||
* 将Collection转化为map(value类型与collection的泛型不同)
|
||||
*/
|
||||
@Test
|
||||
public void testToMap() {
|
||||
Map<Long, String> map = CollStreamUtil.toMap(null, Student::getStudentId, Student::getName);
|
||||
Assert.assertEquals(map, Collections.EMPTY_MAP);
|
||||
List<Student> list = new ArrayList<>();
|
||||
map = CollStreamUtil.toMap(list, Student::getStudentId, Student::getName);
|
||||
Assert.assertEquals(map, Collections.EMPTY_MAP);
|
||||
list.add(new Student(1, 1, 1, "张三"));
|
||||
list.add(new Student(1, 1, 2, "李四"));
|
||||
list.add(new Student(1, 1, 3, "王五"));
|
||||
map = CollStreamUtil.toMap(list, Student::getStudentId, Student::getName);
|
||||
Assert.assertEquals(map.get(1L), "张三");
|
||||
Assert.assertEquals(map.get(2L), "李四");
|
||||
Assert.assertEquals(map.get(3L), "王五");
|
||||
Assert.assertNull(map.get(4L));
|
||||
|
||||
// 测试value为空时
|
||||
list.add(new Student(1, 1, 4, null));
|
||||
map = CollStreamUtil.toMap(list, Student::getStudentId, Student::getName);
|
||||
log.info(map.get(4L));
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
null
|
||||
```
|
||||
# 10、[JSON工具-JSONUtil](https://hutool.cn/docs/#/json/JSONUtil?id=json%e5%b7%a5%e5%85%b7-jsonutil)
|
||||
### JSON字符串转JSONObject对象
|
||||
```java
|
||||
/**
|
||||
* JSON字符串转JSONObject对象
|
||||
*/
|
||||
@Test
|
||||
public void toJsonStrTest2() {
|
||||
final Map<String, Object> model = new HashMap<>();
|
||||
model.put("mobile", "17610836523");
|
||||
model.put("type", 1);
|
||||
|
||||
final Map<String, Object> data = new HashMap<>();
|
||||
data.put("model", model);
|
||||
data.put("model2", model);
|
||||
|
||||
final JSONObject jsonObject = JSONUtil.parseObj(data);
|
||||
|
||||
log.info("是否相等{}", ObjectUtil.equals( "17610836523", jsonObject.getJSONObject("model").getStr("mobile")));
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
是否相等true
|
||||
```
|
||||
# 11、[唯一ID工具-IdUtil](https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E5%94%AF%E4%B8%80ID%E5%B7%A5%E5%85%B7-IdUtil?id=%e5%94%af%e4%b8%80id%e5%b7%a5%e5%85%b7-idutil)
|
||||
### 获取随机UUID
|
||||
```java
|
||||
/**
|
||||
*获取随机UUID
|
||||
*/
|
||||
@Test
|
||||
public void randomUUIDTest() {
|
||||
String randomUUID = IdUtil.randomUUID();
|
||||
log.info(randomUUID);
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
e514518b-21d7-4918-9b34-792b21b0b64f
|
||||
```
|
||||
# 12、[枚举工具-EnumUtil](https://hutool.cn/docs/#/core/%E5%B7%A5%E5%85%B7%E7%B1%BB/%E6%9E%9A%E4%B8%BE%E5%B7%A5%E5%85%B7-EnumUtil?id=%e6%9e%9a%e4%b8%be%e5%b7%a5%e5%85%b7-enumutil)
|
||||
### 枚举类中所有枚举对象的name列表
|
||||
```java
|
||||
public enum TestEnum{
|
||||
TEST1("type1"), TEST2("type2"), TEST3("type3");
|
||||
|
||||
TestEnum(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
private final String type;
|
||||
@SuppressWarnings("unused")
|
||||
private String name;
|
||||
|
||||
public String getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 枚举类中所有枚举对象的name列表
|
||||
*/
|
||||
@Test
|
||||
public void getNamesTest() {
|
||||
List<String> names = EnumUtil.getNames(TestEnum.class);
|
||||
boolean equalList = CollUtil.isEqualList(CollUtil.newArrayList("TEST1", "TEST2", "TEST3"), names);
|
||||
log.info(equalList + "");
|
||||
}
|
||||
```
|
||||
### 输出结果
|
||||
```
|
||||
true
|
||||
```
|
||||
108
01-讲义/其他文档/前端部署文档.md
Normal file
108
01-讲义/其他文档/前端部署文档.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# 1、说明
|
||||
前端包括4个端,分别是:
|
||||
|
||||
- 用户端(微信小程序)
|
||||
- 快递员端(安卓app)
|
||||
- 司机端(安卓app)
|
||||
- 后台管理端(pc web)
|
||||
# 2、用户端
|
||||
## 2.1、开发者工具
|
||||
用户端是基于微信小程序开发的,首先需要下载并安装微信开发者工具:
|
||||

|
||||
可以使用课程资料中提供的安装包或在线下载,[点击下载](https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html)
|
||||
## 2.2、申请测试账号
|
||||
接下来,申请微信小程序的测试账号,[点击申请](https://mp.weixin.qq.com/wxamp/sandbox),通过手机微信扫码进行操作。
|
||||

|
||||
申请成功后,进行登录,[点击登录](https://mp.weixin.qq.com/),如下:
|
||||

|
||||
通过手机微信进行扫码登录:
|
||||

|
||||
即可看到测试账号信息:
|
||||

|
||||
|
||||
需要将AppID和AppSecret保存到nacos配置中心的 `sl-express-ms-web-customer.properties`中:
|
||||

|
||||
## 2.3、导入代码
|
||||
从git拉取代码,地址:[http://git.sl-express.com/sl/project-wl-yonghuduan-uniapp-vue3](http://git.sl-express.com/sl/project-wl-yonghuduan-uniapp-vue3)
|
||||

|
||||
打开微信开发者工具(需要通过手机上的微信客户端进行扫码登录,不要使用游客身份登录),导入代码,注意导入的目录为:`project-wl-yonghuduan-uniapp-vue3\unpackage\dist\dev\mp-weixin`,使用测试账号:
|
||||

|
||||
导入完成后,需要修改`env.js`配置文件,将`baseUrl`变量设置为:`http://api.sl-express.com/customer`,此链接为与后端服务交互的地址,入口为网关地址:(修改完成后需要点击【编译】按钮进行重新编译)
|
||||

|
||||
如果需要完成登录,需要确保如下服务保持启动状态:
|
||||

|
||||
测试登录:
|
||||

|
||||

|
||||

|
||||
登录成功:
|
||||

|
||||
# 3、司机、快递员端
|
||||
司机和快递员端都是安卓app的,可以安装在手机或通过模拟器进行使用,这里介绍模拟器的方式进行使用。(如果使用手机的话,需要通过内网穿透的方式访问网关)
|
||||
## 3.1、模拟器
|
||||
### 3.1.1、联想模拟器
|
||||
在Windows平台推荐使用【联想模拟器】,安装包在`资料\软件包\模拟器`中找到。(如果联想模拟器不能正常使用也可以使用其他的模拟器)
|
||||
安装完成后,设置分辨率为【手机 720 * 1280】:
|
||||

|
||||
效果如下:(安装apk直接拖入即可)
|
||||

|
||||
模拟器中的共享目录:
|
||||

|
||||
在模拟器的定位功能中可以设定位置信息,主要用于app中获取定位,在项目用于车辆位置上报等场景:
|
||||

|
||||
### 3.1.2、官方模拟器
|
||||
如果使用的是苹果Mac电脑并且是M1、M2芯片的同学,可以安装官方的模拟器进行使用。
|
||||
在资料文件夹中找到`android-emulator-m1-preview-v3.dmg`安装包,进行安装。
|
||||
安装完成后,还不能安装apk,需要安装android-sdk,这里通过brew命令安装,首先安装brew,在命令控制台输入命令:
|
||||
`/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" `
|
||||
推荐使用2号安装:
|
||||

|
||||
> 如果没有安装git,在提示框中选择安装即可。
|
||||
|
||||

|
||||
执行命令立即生效:`source /Users/tianze/.zprofile`
|
||||
接下来安装android-sdk:
|
||||
```shell
|
||||
#先安装android-sdk,再安装android-platform-tools
|
||||
brew install --cask android-sdk
|
||||
|
||||
brew install android-platform-tools
|
||||
|
||||
#查看
|
||||
brew list android-sdk
|
||||
brew list android-platform-tools
|
||||
```
|
||||
可以看到在`/opt/homebrew/Caskroom`目录下有`android-platform-tools`和`android-sdk`两个文件夹:
|
||||

|
||||
在模拟器中设置adb路径:`/opt/homebrew/Caskroom/android-platform-tools/34.0.1/platform-tools/adb`
|
||||

|
||||
设置完成后,即可拖入apk进行安装:
|
||||

|
||||
## 3.2、启动服务
|
||||
测试登录的话,需要确保如下的服务处于启动状态:
|
||||

|
||||
## 3.3、快递员端
|
||||
在app中设置接口地址:`http://192.168.150.101:9527/courier`
|
||||

|
||||

|
||||
使用正确的用户密码即可登录:
|
||||

|
||||
## 3.4、司机端
|
||||
司机端与快递员端类似,需要配置url为:`http://192.168.150.101:9527/driver`
|
||||
输入正确的用户名密码即可登录成功:
|
||||

|
||||
# 4、pc管理端
|
||||
pc管理端是需要将前端开发的vue进行编译,发布成html,然后通过nginx进行访问,这个过程已经在Jenkins中配置,执行点击发布即可。
|
||||
地址:[http://jenkins.sl-express.com/view/%E5%89%8D%E7%AB%AF/job/project-slwl-admin-vue/](http://jenkins.sl-express.com/view/%E5%89%8D%E7%AB%AF/job/project-slwl-admin-vue/)
|
||||

|
||||
vue打包命令:
|
||||

|
||||
将打包后的html等静态文件拷贝到指定目录下:
|
||||

|
||||
nginx中的配置:
|
||||

|
||||
nginx所在目录:`/usr/local/src/nginx/conf`
|
||||
输入地址进行测试:[http://admin.sl-express.com/#/login](http://admin.sl-express.com/#/login)
|
||||

|
||||
确保如下服务是启动状态:
|
||||

|
||||
84
01-讲义/其他文档/学习目标.md
Normal file
84
01-讲义/其他文档/学习目标.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# day01
|
||||
- 了解神领物流项目
|
||||
- 了解物流行业
|
||||
- 了解项目的技术架构
|
||||
- 了解项目的业务功能
|
||||
- 能够搭建出开发环境
|
||||
- 能够完成鉴权的任务开发
|
||||
# day02
|
||||
|
||||
- 理解单token存在的问题
|
||||
- 理解双token三验证解决方案的设计思想
|
||||
- 能够实现用户端token校验与鉴权
|
||||
- 掌握支付宝平台的对接方法
|
||||
- 掌握微信支付平台的对接方法
|
||||
- 理解分布式锁的原理以及应用
|
||||
# day03
|
||||
|
||||
- 了解支付微服务的需求
|
||||
- 能够读懂渠道管理相关的代码
|
||||
- 能够理解分布式锁的应用
|
||||
- 能够读懂支付宝扫描支付的代码
|
||||
- 掌握xxl-job的使用
|
||||
- 能够读懂同步支付状态的两种方式
|
||||
# day04
|
||||
|
||||
- 了解计算运费的业务需求
|
||||
- 了解运费模板表的设计
|
||||
- 了解项目中的代码规范
|
||||
- 能够实现运费计算的业务逻辑
|
||||
- 能够完成部署服务以及功能测试
|
||||
# day05
|
||||
|
||||
- 了解路线规划需求
|
||||
- 了解路线规划实现方案
|
||||
- 掌握Neo4j的基本使用
|
||||
- 掌握Cypher的编写
|
||||
- 掌握Spring Data Neo4j使用
|
||||
# day06
|
||||
|
||||
- 了解路线规划功能
|
||||
- 理解实现机构数据同步
|
||||
- 能够实现路线管理
|
||||
- 能够完成综合功能测试
|
||||
# day07
|
||||
|
||||
- 理解什么是智能调度
|
||||
- 能够实现订单转运单
|
||||
- 掌握美团Leaf的使用
|
||||
- 能够完善运单服务
|
||||
- 能够完成合并运单
|
||||
# day08
|
||||
|
||||
- 理解智能调度生成运输任务
|
||||
- 掌握运输任务相关业务的实现
|
||||
- 掌握司机入库业务的实现
|
||||
# day09
|
||||
|
||||
- 掌握MongoDB的基本使用
|
||||
- 掌握Spring Data MongoDB的使用
|
||||
- 理解作业范围功能需求
|
||||
- 能够实现机构与快递员的作业范围
|
||||
# day10
|
||||
|
||||
- 了解快递员取派件任务需求
|
||||
- 理解递员取派件任务相关功能开发
|
||||
- 能够实现调度中心的任务调度
|
||||
- 能够完成整体业务功能的测试
|
||||
# day11
|
||||
|
||||
- 了解物流信息的需求分析
|
||||
- 理解物流信息的技术实现
|
||||
- 掌握基于MongoDB的功能实现
|
||||
- 掌握多级缓存的解决方案
|
||||
- 掌握Redis缓存存在的问题分析并解决
|
||||
# day12
|
||||
|
||||
- 了解什么是分布式日志
|
||||
- 掌握Graylog的部署安装
|
||||
- 掌握Graylog进行日志收集
|
||||
- 掌握Graylog的搜索语法
|
||||
- 了解什么是链路追踪
|
||||
- 掌握Skywalking的基本使用
|
||||
- 掌握整合微服务使用Skywalking
|
||||
- 掌握将Skywalking整合到Docker中
|
||||
108
01-讲义/其他文档/常见问题手册.md
Normal file
108
01-讲义/其他文档/常见问题手册.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# 一、前端问题
|
||||
## 1、用户端登录失败
|
||||
#### 1.1 可能是网关配置不对
|
||||
解决:查看utils/evn.js 第2行,另外更改baseurl后需要重新编译
|
||||
另外,需要检查本地hosts文件中的api.sl-express.com域名配置是否指向到了192.168.150.101。
|
||||

|
||||
#### 1.2 小程序获取不到手机号
|
||||
如果出现获取手机号失败,需要进行真机调试,并在手机上打开开发者模式,然后获取手机验证码进行验证,之后既可以正常在电脑上使用微信小程序
|
||||
**真机调试:**
|
||||

|
||||
**打开开发者模式:**
|
||||

|
||||
#### 1.3 修改前端代码后没有重新编译
|
||||
#### 
|
||||
## 2、前端代码Jenkins部署不成功
|
||||
可能是以下情况,请详细检查
|
||||
|
||||
1. host配置是否正确
|
||||
2. 虚拟机路径下(/itcast/admin-web)是否有静态文件(index.html)
|
||||
3. 可能为浏览器缓存
|
||||
## 3、用户端网络异常且不提示登录
|
||||
解决:需要清除当前小程序重新扫码使用
|
||||
## 4、微信开发者工具 启动闪烁
|
||||
解决:关闭开发者工具,再次导入项目。
|
||||
# 二、虚拟机环境问题
|
||||
## 1、虚拟机启动失败
|
||||
虚拟机启动失败很可能是因为下载文件存在缺失。将原始文件做成种子,然后下发给学员下载,某些文件可能会丢失。
|
||||
**解决方案:**
|
||||
出现问题的话,可通过硬盘或者U盘进行下载
|
||||
## 2、虚拟机防火墙关闭命令
|
||||
**systemctl-stop-firewalld**
|
||||
# 三、idea环境问题
|
||||
## 1、微服务pom文件中依赖报红
|
||||
通过git拉下来代码之后,发现微服务里面的pom文件报红
|
||||

|
||||
**解决方案:**
|
||||
#### **1.1 能够成功编译**
|
||||
通过maven进行编译项目,如果能够成功编译,说明是IDEA存在缓存,未识别到已下载的依赖,无需处理,正常学习即可
|
||||

|
||||
#### **1.2 不能成功编译**
|
||||
##### 1.2.1 setting文件不正常
|
||||
maven的配置文件settings.xml是否和讲义中一致,并且本地仓库地址修改为自己的
|
||||

|
||||

|
||||
##### 1.2.2 使用的maven不正确
|
||||
检查IDEA中使用的maven是否正确,一定要是自己安装的,不要使用默认的
|
||||

|
||||
##### 1.2.3 使用的JDK不正确
|
||||
检查maven编译使用的jdk是否为11
|
||||

|
||||
## 2、使用IDEA输入错误git密码
|
||||
部分学员输入使用IDEA开发项目进行提交时,意外输错git密码,由于IDEA本地记录有密码数据,仅仅清除git配置是无法解决的,最根本的是需要删除掉IDEA本地保存的git密码
|
||||
**解决方案:**
|
||||
|
||||
1. 确定自己的IDEA版本号:Help-->About
|
||||
|
||||

|
||||

|
||||
|
||||
2. 进入到文件夹C:\Users\Atom\AppData\Roaming\JetBrains(注:中间的Atom为自定义的用户名,如自己命名为zhangsan,此处即为zhangsan,实际路径自己修改)找到对应版本的IDEA文件夹
|
||||
|
||||

|
||||
|
||||
3. 进入对应版本文件夹,删除掉c.kdbx文件
|
||||
|
||||

|
||||
|
||||
4. 修改IDEA配置,如下图,勾选Protect master password
|
||||
|
||||

|
||||
|
||||
5. 以上步骤全部完成重新提交代码,IDEA即会提示重新输入密码
|
||||
## 3、maven下载不到
|
||||
#### 3.1可能是有idea 缓存
|
||||

|
||||
#### 3.2 setting文件不正确
|
||||
备份自己电脑原有的setting文件,复制课程中的setting文件,修改复制出的setting文件中本地仓库位置为自己电脑的位置。
|
||||
#### 3.3 本地仓库依赖包不完整
|
||||
需要手动删除该文件夹下全部文件,执行maven编译命令,再次下载。下图为正常情况。
|
||||

|
||||
## 4、Command line is too long
|
||||
需要修改启动配置如下
|
||||

|
||||

|
||||
## 5、No appropriate protocol
|
||||

|
||||

|
||||
# 四、业务流程问题
|
||||
## 1、如何查询Neo4j中线路ID
|
||||
解决:登录neo4j后台,选择某条线路,右侧属性区域中的ID即为线路ID
|
||||

|
||||
## 2、如何临时发起一次车次计划调度
|
||||
truck_plan车辆计划表中 status改为1,schedule_status改为0,确认plan_departure_time小于当前时间+ 2小时 即可重新调度一次。
|
||||

|
||||
## 3、nacos配置没生效
|
||||
改完nacos配置需要重启生效,改nacos配置有空格也会问题。
|
||||
## 4、后台验证码不显示
|
||||
idea服务运行了,但前端登陆验证码一直出不来,可能是本机防火墙没有关,导致虚拟机无法向本机ip发送请求,有类似情况的同学可以留意下,把本机防火墙给关掉。
|
||||

|
||||

|
||||
## 5、Mysql无法连接
|
||||
版本太高 用idea插件可以,课程提供的客户端也可以
|
||||
## 6、扫码支付提示买家不匹配
|
||||

|
||||
解决:最常见的原因:第一买家扫码的时候是a用户,然后不付钱,b用户又扫码一次,就会报这个错。支付宝二维码只能由第一次扫码的买家进行支付。
|
||||
|
||||
|
||||
|
||||
225
01-讲义/其他文档/权限管家使用说明.md
Normal file
225
01-讲义/其他文档/权限管家使用说明.md
Normal file
@@ -0,0 +1,225 @@
|
||||
# 1、了解权限管家
|
||||
## 1.1、介绍
|
||||
|
||||
公司有多个业务系统,这些业务系统的公共部分包括组织、用户、权限等系统管理:
|
||||

|
||||
这个公共的系统管理,可以剥离出一套基础组件服务,即权限管家。
|
||||
|
||||
传智权限管家是一个通用的权限管理中台服务,在神领物流项目中,我们使用权限系统管理企业内部员工,比如:快递员、司机、管理员等。
|
||||
|
||||
在权限管家中可以管理用户,管理后台系统的菜单,以及角色的管理。
|
||||
## 1.2、逻辑模型
|
||||
|
||||
权限管家的接口根据管理范围分为公司级、应用级和系统接口,如下图:
|
||||

|
||||
# 2、部署安装
|
||||
|
||||
参考:[https://sl-express.itheima.net/#/zh-cn/base-service?id=权限管家](https://sl-express.itheima.net/#/zh-cn/base-service?id=%e6%9d%83%e9%99%90%e7%ae%a1%e5%ae%b6)
|
||||
# 3、登录
|
||||
|
||||
登录地址:[http://auth.sl-express.com/api/authority/static/index.html#/login](http://auth.sl-express.com/api/authority/static/index.html#/login)
|
||||
|
||||
用户名密码:admin/123456
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
# 4、应用管理
|
||||
|
||||
权限管家是一个多应用的管理系统,所以要接入权限管家首先需要创建应用。
|
||||
|
||||
【应用管理】 => 【添加应用】
|
||||

|
||||
|
||||
创建成功:
|
||||
|
||||

|
||||
|
||||
查看应用所对应的ID和CODE:
|
||||

|
||||
|
||||
# 5、组织管理
|
||||
|
||||
一般公司会设置不同的组织结构用来管理人员,比如:总部、分公司、人事部、行政部、财务部、物流部、物流转运等。
|
||||
|
||||

|
||||
|
||||
添加组织,组织是一颗树,所以需要选择上级组织:
|
||||
|
||||

|
||||
|
||||
添加完成:
|
||||
|
||||

|
||||
|
||||
# 6、进入应用
|
||||
|
||||
对于应用的操作需要进入到应用中才能操作:
|
||||
|
||||

|
||||
|
||||
进入应用后,可以看到左侧菜单有3项管理:【用户管理】、【菜单管理】、【角色管理】
|
||||
|
||||

|
||||
|
||||
对应的后台系统的菜单列表:**(不要修改)**
|
||||
|
||||

|
||||
|
||||
应用中的角色:
|
||||
|
||||

|
||||
|
||||
# 7、新增用户
|
||||
|
||||
新增用户需要【返回权限管家】进行操作,在【用户管理】中【新增用户】:
|
||||
|
||||

|
||||

|
||||
|
||||
新增用户:
|
||||
|
||||

|
||||
|
||||
添加成功:
|
||||
|
||||

|
||||
|
||||
# 8、分配角色
|
||||
|
||||
现在为【test01】分配快递员角色,怎么操作呢?
|
||||
|
||||
首先需要进入到【神领物流】应用,在【用户管理】中分配角色:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这样,test01就拥有了【快递员】角色了。
|
||||
|
||||
同理,可以添加其他的用户了。
|
||||
# 9、SDK使用说明
|
||||
## 9.1、关于authority-sdk
|
||||
|
||||
authority-sdk是基于authority-sdk的restful接口实现的Java SDK的封装,实现了token、组织、菜单、角色等功能。
|
||||
## 9.2、快速集成使用
|
||||
|
||||
authority-sdk提供了两种方式与业务系统对接,分别是:
|
||||
|
||||
- java sdk方式
|
||||
- Spring Boot集成方式
|
||||
## 9.3、使用方法
|
||||
### 9.3.1、java sdk方式
|
||||
> **第一步,导入maven依赖**
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.itheima.em.auth</groupId>
|
||||
<artifactId>authority-sdk</artifactId>
|
||||
<version>{version}</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
> **第二步,实例化AuthTemplate对象**
|
||||
|
||||
|
||||
```java
|
||||
String host = "127.0.0.1"; //Authority服务地址
|
||||
int port = 8764; //Authority服务端口
|
||||
int timeout = 1000; //http请求的超时时间,不传值默认为10S
|
||||
|
||||
//token,非登录请求都需要带上,一般情况下登录成功后将该数据放入缓存中
|
||||
String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIiwiYWNjb3VudCI6ImFkbWluIiwibmFtZSI6IuW5s-WPsOeuoeeQhuWRmCIsIm9yZ2lkIjo4NzQyMjc2MTUxNzM0NDk4MjUsInN0YXRpb25pZCI6ODU3OTQwMTU3NDYwOTU3NTM3LCJhZG1pbmlzdHJhdG9yIjp0cnVlLCJleHAiOjE2NTEyNTkyODB9.anqT0MD9zAr13KG9OE4mqHHK2UMCOXUjeMrEsN1wy9_a14zFbjPkiDZ8dM7JirsAgj61yvshoP6pqBImdmyilQN-iFSa_ci15Ii4HhfFE1mcaRon3ojX_T9ncjHKuF9Y9ZPKT68NOzOfCwvhDrG_sDiaI1C-TwEJmhLM78FhwAI";
|
||||
//应用ID,非登录请求都需要带上,该参数表示你需要查询哪个应用相关数据,一般情况下置于配置文件中
|
||||
Long applicationId = 1L;
|
||||
//登录获取token
|
||||
AuthTemplate authTemplate = new AuthTemplate(host,port,TIME_OUT);
|
||||
Result<LoginDTO> result = authTemplate.opsForLogin().token("admin","123456");
|
||||
|
||||
//后续基于AuthTemplate可以调用各种服务
|
||||
AuthTemplate authTemplate = new AuthTemplate(host,port,TIME_OUT,token,applicationId);
|
||||
Result<List<MenuDTO>> result = authTemplate.opsForPermission().getMenu();
|
||||
log.info("菜单:{}", JSONObject.toJSONString(result));
|
||||
```
|
||||
|
||||
### 9.3.2、Spring Boot集成方式
|
||||
> **第一步,导入maven依赖**
|
||||
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.itheima.em.auth</groupId>
|
||||
<artifactId>itcast-auth-spring-boot-starter</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 如果是SNAPSHOT版本,如要在项目的pom.xml文件中引入快照版源 -->
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>sonatypeSnapshots</id>
|
||||
<name>Sonatype Snapshots</name>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
```
|
||||
|
||||
> **第二步,配置application.yml文件**
|
||||
|
||||
|
||||
```yaml
|
||||
itcast:
|
||||
authority:
|
||||
host: 127.0.0.1 #authority服务地址,根据实际情况更改
|
||||
port: 8764 #authority服务端口
|
||||
timeout: 10000 #http请求的超时时间
|
||||
```
|
||||
|
||||
**第三步,使用用例**
|
||||
|
||||
```java
|
||||
package com.example.demo.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.itheima.auth.sdk.AuthTemplate;
|
||||
import com.itheima.auth.sdk.common.Result;
|
||||
import com.itheima.auth.sdk.dto.LoginDTO;
|
||||
import com.itheima.auth.sdk.dto.MenuDTO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class AuthService {
|
||||
|
||||
@Value("${itcast.authority.host}")
|
||||
private String host;
|
||||
|
||||
@Value("${itcast.authority.port}")
|
||||
private int port;
|
||||
|
||||
private final static int TIME_OUT = 10000;
|
||||
|
||||
/**
|
||||
* 登录获取token
|
||||
* @param account
|
||||
* @param password
|
||||
*/
|
||||
public void login(String account, String password) {
|
||||
AuthTemplate authTemplate = new AuthTemplate(host,port);
|
||||
Result<LoginDTO> loginDTO = authTemplate.opsForLogin().token(account, password);
|
||||
log.info("登录结果:{}", JSONObject.toJSONString(loginDTO));
|
||||
}
|
||||
}
|
||||
```
|
||||
104
01-讲义/其他文档/虚拟机导入手册.md
Normal file
104
01-讲义/其他文档/虚拟机导入手册.md
Normal file
@@ -0,0 +1,104 @@
|
||||
# 1、方案说明
|
||||
神领物流项目需要使用配套的虚拟机环境才能学习,在虚拟机中提供了各种开发需要的环境,比如:git、maven私服、jenkins、mysql等(具体[点击查看](https://sl-express.itheima.net/#/zh-cn/base-service)),由于学生的电脑品牌、配置存在较大的差异,所以在这里提供了三种使用虚拟机方案,如下:
|
||||
|
||||
**方案一:**windows电脑环境安装虚拟机,此方案适用于大部分学生的环境,在自己的win电脑安装安装Vmware软件导入虚拟机即可。
|
||||
**方案二:**苹果电脑(M1、M2芯片)安装虚拟机,此方案适用于部分学生使用新款苹果电脑的方案,在电脑中安装Vmware Fusion导入虚拟机即可。
|
||||
**方案三:**电脑配置低(内存低于16GB)或使用旧款苹果电脑(配置低的Inter芯片),此方案需要再借(或买或租)一台电脑(建议win系统)配合完成,基本思路是在这台电脑中导入虚拟机,通过网络连接到这台机器,进行开发学习。
|
||||
# 2、方案一:windows环境
|
||||
VMware安装过程省略,建议版本使用15.5以上版本。
|
||||
默认虚拟机设置的内存大小内8G,虚拟内存为16GB,建议保持此配置,不建议进行调整。
|
||||
## 2.1.配置VMware网络
|
||||
因为虚拟机配置了静态IP地址为192.168.150.101,因此需要VMware软件的虚拟网卡采用与虚拟机相同的网段。
|
||||
### 2.1.1.配置VMware
|
||||
首先,在VMware中选择编辑,虚拟网络编辑器:
|
||||

|
||||
这里需要管理员权限,因此要点击更改设置:
|
||||

|
||||
接下来,就可以修改虚拟网卡的IP地址了,流程如图:
|
||||

|
||||
注意:一定要严格按照标号顺序修改,并且IP地址也要保持一致!
|
||||
### 2.1.2.验证
|
||||
点击确定后,等待一段时间,VMware会重置你的虚拟网卡。完成后,可以在windows的网络控制面板看到:
|
||||

|
||||
选中该网卡,右键点击,在菜单中选择状态,并在弹出的状态窗口中选择详细信息:
|
||||

|
||||
在详细信息中,查看IPv4地址是否是 `192.168.150.1`:
|
||||

|
||||
如果与我一致,则证明配置成功!
|
||||
## 2.2.导入虚拟机
|
||||
### 2.2.1.导入
|
||||
资料中提供了一个虚拟机文件:
|
||||

|
||||
打开VMware,选择文件,然后打开,找到之前提供的虚拟机文件夹,进入文件夹后,选中CentOS7.vmx文件,然后点击打开:
|
||||

|
||||
导入成功:
|
||||

|
||||
启动虚拟机,选择【我已复制该虚拟机】:
|
||||

|
||||
### 2.2.2.登入
|
||||
虚拟机登入信息如下:
|
||||
```shell
|
||||
# 用户名
|
||||
root
|
||||
# 密码
|
||||
123321
|
||||
```
|
||||
## 2.3.测试网络
|
||||
最后,通过命令测试网络是否畅通:
|
||||
```
|
||||
ping baidu.com
|
||||
```
|
||||
# 3、方案二:MacBook M1 M2
|
||||
此方案适用于新款苹果MacBook的M系列芯片电脑,需要在电脑中安装VMware Fusion,建议版本为13.x以上。
|
||||
默认虚拟机设置的内存大小内8G,虚拟内存为16GB,建议保持此配置,不建议进行调整。
|
||||
## 3.1、配置网络
|
||||
在Mac系统中进行网络设置:
|
||||

|
||||
修改网络配置文件,命令:`sudo vi /Library/Preferences/VMware\ Fusion/networking`
|
||||

|
||||
主要是修改以上两处内容,需要注意两点:
|
||||
|
||||
- 对应你的网络名称进行修改,我对应的是VNET_2
|
||||
- ip地址**必须**为:`192.168.150.0`,虚拟机的ip地址固定为:`192.168.150.101`
|
||||
|
||||
修改完成后,退出VMware Fusion,然后重新打开VMware Fusion软件。
|
||||
|
||||
以上操作完成后,检查网关是否正确,如果显示`192.168.150.2`表示设置成功,查看命令(修改成自己的网络名称):
|
||||
`sudo vi /Library/Preferences/VMware\ Fusion/vmnet2/nat.conf`
|
||||

|
||||
## 3.2、导入虚拟机
|
||||
在VMware Fusion中,选择文件 -> 打开,找到资料中提供的【Centos7-sl-x】文件,点击打开即可。
|
||||

|
||||
设置虚拟机网络为自定义网络:
|
||||

|
||||
启动虚拟机,通过 `root/123321 `登陆到虚拟机:
|
||||

|
||||
测试网络是否正常:
|
||||

|
||||

|
||||
查看正在运行的服务:
|
||||

|
||||
如果你的测试结果与上述一致,说明虚拟机导入成功。
|
||||
# 4、方案三:双电脑方案
|
||||
此方案需要借助于另外一台电脑安装虚拟机环境,自己的电脑做开发学习使用,其原理如图所示:
|
||||

|
||||
## 4.1、MacBook
|
||||
按照官方文档进行设置网络共享:[https://support.apple.com/zh-cn/guide/mac-help/mchlp1540/mac](https://support.apple.com/zh-cn/guide/mac-help/mchlp1540/mac)
|
||||
|
||||
下面,修改配置文件,目的是修改为192.168.150.x网段:
|
||||
在`/Library/Preferences/SystemConfiguration/com.apple.nat.plist`文件增加如下内容:
|
||||
```xml
|
||||
<key>SharingNetworkMask</key>
|
||||
<string>255.255.255.0</string>
|
||||
<key>SharingNetworkNumberEnd</key>
|
||||
<string>192.168.150.254</string>
|
||||
<key>SharingNetworkNumberStart</key>
|
||||
<string>192.168.150.2</string>
|
||||
```
|
||||
修改示例:
|
||||

|
||||
本地的ip地址为192.168.150.2,所以在本地跑微服务时注册的ip地址为:192.168.150.2。
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user