当前位置:首页 > 分类
SpringBoot 10 JavaWeb 2 Android 0 源码分析 1 Thymeleaf 1 MyBatis 0 SSM 1 翻译 0 数据库设计 9 Gradle 1 Test 1 Tomcat 1 前端设计 2 ElasticSearch 2 阿里巴巴 9 Redis 3 Docker 1 实验报告 1 SpringCloud相关 1 生活 1阿里云ECS训练营_Day05_搭建JavaWeb开发环境
- 2020-08-11
- 364
- 阿里巴巴
# 阿里云ECS训练营-Day05-打造JavaWeb开发环境
今天是最后一天了!!!内容比较简单,快速过一遍即可
## 1. 连接ECS服务器
我习惯用 Xshell 连接服务器进行命令行操作,用 Xftp 来传输文件。
## 2. 安装 JDK
使用 yum 安装 jdk
```bash
yum -y install java-1.8.0-openjdk*
```
查看是否安装成功
```bash
java -version
```
安装成功之后,结果如下图所示:

## 3. 安装 MySql 数据库
为了方便起见,可以直接使用宝塔面板进行安装即可!
宝塔面板官网地址:https://www.bt.cn/
按照文档安装完之后,在“软件商店”找到 MySql 数据库,进行安装即可。
安装完成之后,用宝塔面板的 phpMyAdmin 可以连接上,或者使用 Navicat,DataGrip 之类的图形工具连接。
-----
如果使用 yum 进行安装,那么可能用到下面几条命令:
##### 1. 修改默认 MySql 密码
```bash
set global validate_password_policy=0; #修改密码安全策略为低(只校验密码长度,至少8位)。
ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';
```
##### 2. 授予 root 用户远程管理权限
```bash
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678';
```
## 4. 安装 Tomcat
手动下载Tomcat压缩包上传至服务器或者使用 wget 命令直接下载。
##### 4.1 使用 wget 命令下载 tomcat 压缩包
```bash
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.57/bin/apache-tomcat-8.5.57.tar.gz
```
##### 4.2 解压
```bash
tar -zxvf apache-tomcat-8.5.57.tar.gz
```
##### 4.3 将文件复制到指定目录
```bash
mv apache-tomcat-8.5.57 /usr/local/Tomcat8.5
```
##### 4.4 授予权限
```bash
chmod +x /usr/local/Tomcat8.5/bin/*.sh
```
##### 4.5 启动 tomcat
```bash
/usr/local/Tomcat8.5/bin/./startup.sh
```
访问8080端口:

阿里云ECS训练营_Day04_打造离线下载服务器CCAA
- 2020-08-10
- 277
- 阿里巴巴
# 安装 CCAA
这个是官方的CCAA的帮助文档地址:https://www.yuque.com/helloz/ccaa/install
官方文档放在语雀上面的,可以按照上面的步骤来,更加详细。**(记得开放安全组端口)**
(PS:顺便给语雀打个广告~~)
- 在服务器上输入下面命令
```bash
bash <(curl -Lsk https://raw.githubusercontent.com/helloxz/ccaa/master/ccaa.sh) cdn
```
- 之后会让你选择,输入1,然后按下回车即可

- 然后设置绝对路径,默认即可,按下回车

- 然后输入密钥

- 然后就可以访问了**(记得要开放阿里云安全组对应端口6080)**


- **注意:如果 Aria2 状态一直显示未连接的话,原因是端口未开放**
需要同时开放 6080,6081(文件管理),6800(AriaNg设置里)。
因为在 AriaNg 设置里面使用到了 6800 端口,如下图所示:

-----
然后就可以愉快的下载了!但是,这东西好像没啥用处,好像种子文件也下不了。我试着下了个PhotoShop-CC2019,就这网速???还不如我用自己电脑直接下呢。。。。

阿里云ECS训练营_Day03_微擎的安装与使用
- 2020-08-08
- 295
- 阿里巴巴
阿里云ECS训练营第3天!今天主要在服务器上安装微擎来管理微信公众号。
# 环境说明
CnetOs7,Apache2.4.43,PHP5.3
# 安装微擎
微擎官网文档地址:http://s.w7.cc/store-static-install.html 今天的安装比较简单,跟着文档走就行。
##### (1)下载微擎的 .zip 压缩包
##### (2)上传至站点的根目录并解压
- 我的根目录是在这个文件夹下

- 解压
解压之后得到一个 install.php 文件
```bash
unzip WeEngine-Laster-Online.zip
```

##### (3)地址栏访问
- 根据自己的站点结构,访问 install.php 即可,然后或自动跳转到微擎的登录页面
- 例如我的就是访问 `http://39.98.86.223/install.php`
##### (4) 注册账号并登录
第一次使用的话,要求注册一个账号,然后登录即可。

##### (5)配置数据库,安装系统
这里数据库用户和名称就填我们的MySql创建的数据库。

##### (6)设置站点名称和密码

##### (7)进入应用控制台

- 然后进入应用控制台,个人中心,就可以查看自己站点信息了

-----
到这里,微擎就基本安装完了,后面就是一些基本的使用了!
阿里云ECS训练营_Day02_MeidaWiki的搭建
- 2020-08-07
- 341
- 阿里巴巴
# 阿里云ECS训练营-Day02-MediaWiki搭建
官网地址:https://www.mediawiki.org/wiki/Download
### 1. 环境搭建
服务器:Centos7
PHP版本:PHP7.4
Apache版本:2.4.43
MySql版本:5.5.62
> 说明
由于 MediaWiki 需要Web服务软件,**PHP7.2.9或更高版本**,同时还需要数据库服务器。

所以为了方便起见,我们这里直接使用宝塔面板进行安装,这是我的宝塔面板已经安装的软件:

### 2. 下载安装 MediaWiki
##### (1)下载压缩包
进入下载页面(https://www.mediawiki.org/wiki/Download),下载压缩包即可,我这里选择的压缩包版本是 `1.3.42`
下载完之后,按照官网的说法,我们需要将 MediaWiki 解压的 Web服务器的根目录。我们可以在宝塔面板的 `网站` 功能中,创建一个站点,并选择目录为 `/data/wwwroot/default`,这样在外部就可以访问了。**(这样更方便,宝塔面板会帮助我们创建目录结构)**

##### (2) 解压至指定目录
用 xftp 将文件将下载好的压缩包上传至 `/data/wwwroot/default` 然后解压即可。
```bash
tar -zxcf mediawiki-1.34.2.tar.gz
```
之后再对该根目录赋予权限
```bash
chown -R www /data/wwwroot/default/mediawiki-1.34.2
```

##### (3)访问测试
完成上面操作之后,我们可以进入 mediawiki 的根目录,可以看到里面有一个 index.php 文件,这个就是我们要在浏览器中访问的文件。
> 但是,第一次访问出现了下面的问题

网上查了一些,应该是 php 环境没搭好,还要再安装一个 `fileinfo `的扩展。使用宝塔面板安装完该扩展,**然后在重启 php 服务**,如下所示:

然后刷新页面,如下所示。

这样就表明你的 MediaWiki 安装好了,后面就是进行配置使用了。
### 3. 配置使用 MediaWiki
##### (1)选择语言

##### (2)选择数据库
这个按照自己的喜好选,MySql和SQlite都可以,我这里选择的是 MySql


##### (3)安装配置完成

#####(4)按照提示,将 LocalSettings.php 放在 index.php 同级目录即可

##### (5)安装配置成功

------
ok,到这里,MeidaWiki就基本搭建好了!
阿里云ECS训练营_Day01_打造专属云笔记
- 2020-08-06
- 406
- 阿里巴巴
# 阿里云ECS训练营-Day01-打造专属云笔记
### 前言
**今天是关于使用 VuePress 搭建静态云笔记的,之前对 Node.js 和 Vue 都不太了解,还是尝试去做了。官网文档配合视频简介,对 VuePress 有了一个基本的了解,也复习了一些 Linux 的操作,收获不错。**
VuePress官网地址:https://www.vuepress.cn/
------
> 该系列博客时关于阿里云ESC训练营7天进阶路线对应的博客。
### 1. 设置安全组
VuePress默认使用8080端口,开放即可

### 2. 安装Node.js
视频中用的 wget 下载安装包,我这里用的本地下载然后上传到服务器上。
支持yum和npm安装
----
##### (1)去 Node.js 官网下载安装包,上传至服务器
压缩包放在 `/tmp`
##### (2)解压
解压到该目录:`/usr/local/lib/nodejs`
- 先递归创建目录
```
mkdir -p /usr/local/lib/nodejs
```
> 问题1

这个文件是以 `.xz` 为后缀的,而 `z` 参数不适用,应该用 `J` 参数

> 问题2
由于疏忽,未指定目录,应该用 `-C` 指定解压到的目录

-----
最终的命令:
```bash
tar -xJvf node-v12.18.3-linux-x64.tar.xz -C /usr/local/lib/nodejs
```
##### (3)验证安装是否成功
进入解压后的目录里面的 bin 目录,执行命令 `./node -v`,显示版本号即安装成功
```bash
[root@jacklin bin]# pwd
/usr/local/lib/nodejs/node-v12.18.3-linux-x64/bin
[root@jacklin bin]# ls
node npm npx
[root@jacklin bin]# ./node -v
v12.18.3
```
##### (4)配置环境变量
为了方便,在其他目录下也可以使用node命令,在 `/etc/profile` 后面添加一句
```bash
export PATH=$PATH:/usr/local/lib/nodejs/node-v12.18.3-linux-x64/bin
```
然后执行 `source /etc/profile`立即生效即可
### 3. 安装 VuePress
##### (1)使用 npm 安装
官网文档:https://www.vuepress.cn/guide/getting-started.html
这里先使用淘宝的镜像仓库并验证。
```bash
[root@jacklin /]# npm config set registry https://registry.npm.taobao.org
[root@jacklin /]# npm config get registry
https://registry.npm.taobao.org/
[root@jacklin /]# npm install -g vuepress
```

##### (2)尝试使用 --> 全局安装
跟着官网走,先简单的尝试一下
```bash
[root@jacklin /]# cd home # 随便进入一个文件夹
[root@jacklin home]# mkdir vuepress-starter # 创建一个项目根目录
[root@jacklin home]# cd vuepress-starter/
[root@jacklin vuepress-starter]# echo 'Hello VuePress ---- By JackLin' > README.md # 编辑文件
[root@jacklin vuepress-starter]# ls
README.md
[root@jacklin vuepress-starter]# vuepress dev . # 开始写作
wait Extracting site metadata...
tip Apply theme @vuepress/theme-default ...
tip Apply plugin container (i.e. "vuepress-plugin-container") ...
tip Apply plugin @vuepress/register-components (i.e. "@vuepress/plugin-register-components") ...
tip Apply plugin @vuepress/active-header-links (i.e. "@vuepress/plugin-active-header-links") ...
tip Apply plugin @vuepress/search (i.e. "@vuepress/plugin-search") ...
tip Apply plugin @vuepress/nprogress (i.e. "@vuepress/plugin-nprogress") ...
✔ Client
Compiled successfully in 7.82s
ℹ 「wds」: Project is running at http://0.0.0.0:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wds」: Content not from webpack is served from /home/vuepress-starter/.vuepress/public
ℹ 「wds」: 404s will fallback to /index.html
success [17:52:33] Build 82f839 finished in 7822 ms!
> VuePress dev server listening at http://localhost:8080/
✔ Client
Compiled successfully in 224.24ms
success [17:52:33] Build a3f338 finished in 225 ms! ( http://localhost:8080/ )
```
注意:此时服务正在运行,进入浏览器查看,可以查看到内容如下所示:

此时的文件目录是这样的:
```bash
[root@jacklin vuepress-starter]# ls -al
total 12
drwxr-xr-x 2 root root 4096 Aug 6 18:12 .
drwxr-xr-x. 13 root root 4096 Aug 6 18:12 ..
-rw-r--r-- 1 root root 33 Aug 6 18:12 README.md
```
然后执行 `vuepress build .` 构建静态文件之后的文件目录是这样的;这个 .vuepress目录是隐藏目录
```bash
[root@jacklin vuepress-starter]# ls -al
total 16
drwxr-xr-x 3 root root 4096 Aug 6 18:23 .
drwxr-xr-x. 13 root root 4096 Aug 6 18:12 ..
-rw-r--r-- 1 root root 33 Aug 6 18:12 README.md
drwxr-xr-x 3 root root 4096 Aug 6 18:23 .vuepress
[root@jacklin vuepress-starter]# cd .vuepress/
[root@jacklin .vuepress]# ls -al
total 12
drwxr-xr-x 3 root root 4096 Aug 6 18:23 .
drwxr-xr-x 3 root root 4096 Aug 6 18:23 ..
drwxr-xr-x 3 root root 4096 Aug 6 18:23 dist
[root@jacklin .vuepress]# cd dist
[root@jacklin dist]# ls
404.html assets index.html
[root@jacklin dist]# cd assets
[root@jacklin assets]# ls
css img js
```
##### (3) 现有项目 ---> 深入了解
刚才只是简单的尝试了一下,现在是在项目中使用 VuePress,用来管理文档。
按照官网的说法,应将 VuePress 安装为本地依赖。那就来呗!
从官网截的目录结构图:**约定优于配置**,所有要遵守他的目录结构

还有一个是视频中的截图,我们就按照这个目录结构来搭建基本结构吧。

- 创建另一个根目录
```bash
mkdir vuepress-starter2
```
- 初始化项目
一开始对 Node.js 不是很了解,看了群里大佬们的文章才知道用 `npm init ` 来初始化项目
```bash
npm init -y
```
- 之后再 package.json 中加入下面脚本
```json
{
"scripts": {
"docs:dev": "vuepress dev docs",
"docs:build": "vuepress build docs"
}
}
```

- 接着创建 docs 目录
```bash
mkdir docs
```
- 在 docs 目录下新建 Markdown 文件
```
echo '# VuePress 现有项目 ---- by JackLin' > README.md
```
- 在 docs 下面创建 .vuepress 目录,再在 .vuepress 里面创建 public 目录和 config.js 文件
- 退到根目录,执行 `vuepress dev docs`,然后在浏览器访问

至于后面的如何具体配置,官网应该写了,网上也有文章,我就不重复了。
阿里云AI训练营_Day04_车辆检测系统
- 2020-06-08
- 201
- 阿里巴巴
## 项目介绍
参加阿里云AI训练营的第4天,完成一个车辆检测系统
主要思路:用户上传身份证和受损车辆图片,识别结果返回前端,同时将数据存入数据库。
## 项目用到文档地址
阿里云达摩院视觉开放平台:https://vision.aliyun.com/
阿里云视觉开放平台 “车辆损伤识别” 地址:https://help.aliyun.com/document_detail/155002.html?spm=a2c4g.11174283.6.755.77e06bdfN9iMtt
## 项目模块1-各种识别服务
### (1)说明
一开始的设想是用到身份证识别和车辆识别2个服务,但是发现同时导入 2 个依赖之后,有一些 jar 包会冲突,导致身份证识别的部分由于缺少一些 jar 包而不能正常运行。最后只用到了机动车识别和车辆损伤识别2个服务。
### (2)导入项目依赖
这里的依赖我们使用较早的版本
```xml
<!-- 内容识别对应依赖 -->
<!-- https://mvnrepository.com/artifact/com.aliyun/objectdet -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>objectdet</artifactId>
<version>0.0.5</version>
</dependency>
<!-- 图片识别 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ocr</artifactId>
<version>1.0.3</version>
</dependency>
```
之后同样要开通 “目标检测服务” 才能正常运行。
### (3)创建 Client,Config类
虽然身份证识别部分会报错,但是这里依旧吧身份证识别部分的代码贴出来
> CraService.java
```java
@Value("${accessKeyId}")
private String accessKeyId;
@Value("${accessKeySecret}")
private String accessKeySecret;
// "内容识别" --> 导入这个类:import com.aliyun.objectdet20191230.Client;
private com.aliyun.objectdet.Client objectClient;
private com.aliyun.ocr.Client ocrClient;
private RuntimeObject runtimeObject;
private RuntimeOptions runTimeOperations;
@PostConstruct
public void initClient() throws Exception {
Config objectConfig = new Config();
objectConfig.type = "access_key";
objectConfig.regionId = "cn-shanghai";
objectConfig.accessKeyId = accessKeyId;
objectConfig.accessKeySecret = accessKeySecret;
// 注意这里的域名,我们是 “内容识别” 服务,所以开头是 objectdet=
objectConfig.endpoint = "objectdet.cn-shanghai.aliyuncs.com";
objectClient = new com.aliyun.objectdet.Client(objectConfig);
runtimeObject = new RuntimeObject();
com.aliyun.ocr.models.Config ocrConfig = new com.aliyun.ocr.models.Config();
ocrConfig.type = "access_key";
ocrConfig.regionId = "cn-shanghai";
ocrConfig.accessKeyId = accessKeyId;
ocrConfig.accessKeySecret = accessKeySecret;
// 注意这里的域名,我们是 “内容识别” 服务,所以开头是 objectdet=
ocrConfig.endpoint = "ocr.cn-shanghai.aliyuncs.com";
ocrClient = new com.aliyun.ocr.Client(ocrConfig);
runTimeOperations = new RuntimeOptions();
}
```
需要注意的是两个 Client 是不同的包下面的 Client 类,一个是 “内容识别” 的,另一个是 “图像识别” 的。
### (4)调用关键 API
这里原本调用了3个服务,分别是 “身份证识别”,“机动车识别”,“车辆受损识别”,关键代码如下:
```java
// “机动车识别”
public String myDetectVehicle(String filePath) throws Exception {
DetectVehicleAdvanceRequest request = new DetectVehicleAdvanceRequest();
request.imageURLObject = new FileInputStream(filePath);
DetectVehicleResponse response = objectClient.detectVehicleAdvance(request, runtimeObject);
String result = null;
// 发现这是一个内部类
for (DetectVehicleResponse.DetectVehicleResponseDataDetectObjectInfoList item:response.data.detectObjectInfoList
) {
System.out.println(item.type);
System.out.println(item.score);
if ("vehicle".equals(item.type)) {
System.out.println("检测成功!是机动车");
} else {
System.out.println("该图片不是机动车!");
}
result = item.type;
}
return result;
}
// “车辆损伤识别”
public String myRecognizeVehicle(String filePath) throws Exception {
// 使用 xxxAdvanceRequest,支持本地图片上传
RecognizeVehicleDamageAdvanceRequest request = new RecognizeVehicleDamageAdvanceRequest();
request.imageURLObject = new FileInputStream(filePath);
// 识别 “车辆损伤”
RecognizeVehicleDamageResponse response = objectClient.recognizeVehicleDamageAdvance(request, runtimeObject);
return getHurtResult(response.data.elements);
}
// “身份证识别” -------->
public String MyRecognizeIdCard(String filePath, String side) throws Exception {
RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();
request.imageURLObject = Files.newInputStream(Paths.get(filePath));
request.side = side;
RecognizeIdentityCardResponse response = ocrClient.recognizeIdentityCardAdvance(request, runTimeOperations);
if ("face".equals(side)) {
return JSON.toJSONString(response.data.frontResult);
} else {
return "";
}
}
```
### (5) 车辆损伤补充代码
看文档我们知道,由于车辆损伤有很多种情况,所以我们需要对数据进行一定的处理,思路是通过一个 switch~case 语句区分各种损伤的具体情况。

> 具体代码:
```java
// 对 “车辆损伤” 识别出来的数据进行一定的处理,方便前台展示
public String getHurtResult(RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements[] items) {
StringBuffer type = new StringBuffer("检测到的车辆损伤为:");
for (RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements item:items
) {
switch (item.type) {
case "1": type.append("轻微刮擦 ");
break;
case "2": type.append("重度刮擦 ");
break;
case "3": type.append("轻度变形 ");
break;
case "4": type.append("中度变形 ");
break;
case "5": type.append("重度变形 ");
break;
case "6": type.append("crack破损孔洞 ");
break;
case "7": type.append("翼子板和大灯缝隙 ");
break;
case "8": type.append("翼子板保险杠缝隙 ");
break;
case "9": type.append("大灯轻微刮擦 ");
break;
case "10": type.append("大灯重度刮擦 ");
break;
case "11": type.append("大灯破损 ");
break;
case "12": type.append("后视镜轻微刮擦 ");
break;
case "13": type.append("后视镜玻璃破损 ");
break;
case "14": type.append("后视镜脱落 ");
break;
case "15": type.append("挡风玻璃破损 ");
break;
}
}
return type.toString();
}
```
## 项目模块2-图片上传服务,及数据库操作
这部分做的比较简易,没有美化样式,能看就行~就是一个简单的 from 表单
> test.html
```html
<form th:action="@{/upload}" enctype="multipart/form-data" method="post">
身份证:<input type="file" name="identityfile">
受损车辆:<input type="file" name="carfile">
<input type="submit" value="upload">
</form>
```
----
图片上传对应的 Controller,上传完成之后,同时进行识别,然后在将识别输入存入数据库中
> CarController.java
```java
@RequestMapping("/upload")
public String fileUpload(@RequestParam("carfile") MultipartFile carFile, @RequestParam("identityfile") MultipartFile identityFile, Model model) throws IOException {
// 1. 上传图片 ----》 “身份证”
String identityPath = aiCarService.fileUpload(identityFile);
// 2. 上传图片 -----》 “受损车辆”
String carPath = aiCarService.fileUpload(carFile);
// 3. 调用 Service 层分析图片
String face = null;
String carStr = null;
String carStr2 = null;
try {
// 3.1 身份证识别 ---> 只需要识别正面
// face = carService.MyRecognizeIdCard(identityPath , "face");
// 3.2 机动车检查
carStr = aiCarService.myDetectVehicle(carPath);
// 3.3 车辆损伤识别
carStr2 = aiCarService.myRecognizeVehicle(carPath);
} catch (Exception e) {
e.printStackTrace();
}
// 4. 保存数据到数据库中
Car car = new Car(null, carStr, carStr2);
carService.insert(car);
// 4. 将图片路径放入 Model 中
String carFileName = carFile.getOriginalFilename();
String identityFileName = identityFile.getOriginalFilename();
model.addAttribute("carfilename", "/upload/" + carFileName);
model.addAttribute("identityfilename", "/upload/" + identityFileName);
model.addAttribute("face", face);
if ("vehicle".equals(carStr)) {
model.addAttribute("carStr", "检测成功!是机动车");
} else {
model.addAttribute("carStr", "您上传的图片不是机动车,请重新上传!!");
}
model.addAttribute("carStr2", carStr2);
return "result";
}
```
对应的 Service
> CarService.java
```java
/**
* @Description: 图片上传服务
* @Param: [file]
* @return: void
* @Author: 林凯
* @Date: 2020/6/8
*/
public String fileUpload(MultipartFile file) {
// 1. 获取文件名
String uploadFileName = file.getOriginalFilename();
// 2. 上传路径保存设置 UUID
String path = "src/main/resources/static/upload";
// 2.1 如果路径不存在,创建一个
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
// 3. 上传文件,并保存
InputStream is = null; //文件输入流
OutputStream os = null;
try {
is = file.getInputStream();
os = new FileOutputStream(new File(realPath, uploadFileName));
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return path + "\\" + uploadFileName;
}
```
返回结果给前端,前端的处理部分
> result.html
```html
<img th:src="${carfilename}" alt="">
<img th:src="${identityfilename}" alt="">
<p th:text="${carStr}"></p>
<p th:text="${carStr2}"></p>
```
## 测试效果
首先进入上传图片页面,并上传2张图片

然后点击 upload 上传并查看结果:

数据库里面的结果:

## 阿里云高校计划
最后在贴一张阿里云的广告:”阿里云高校计划“,快来加入我们吧!
