Fork me on GitHub

JackLin的博客

当前位置:首页 > 标签

SpringBoot 14 Spring 2 SpringMVC 3 MyBatis 2 Linux 4 阿里云 13 宝塔 1 Docker 3 ElasticSearch 2 Redis 4 Shiro 0 Dubbo 0 Swagger 0 Thymeleaf 6 数据库 11 MySQL 11 外键 2 Gradle 1 Test 0 Tomcat 1 JavaWeb 7 Ajax 1 注解 3 css 2 报错 3 多数据源 1 Java基础 1 源码 2 Servlet 1 JSP 1 环境搭建 8 RabbitMQ 1 七牛云 1 Edit.md 1 图像识别 4 英语 2 Zookeeper 1

阿里云ECS训练营_Day05_搭建JavaWeb开发环境

  • 2020-08-11
  • 131
  • 阿里巴巴
# 阿里云ECS训练营-Day05-打造JavaWeb开发环境 今天是最后一天了!!!内容比较简单,快速过一遍即可 ## 1. 连接ECS服务器 我习惯用 Xshell 连接服务器进行命令行操作,用 Xftp 来传输文件。 ## 2. 安装 JDK 使用 yum 安装 jdk ```bash yum -y install java-1.8.0-openjdk* ``` 查看是否安装成功 ```bash java -version ``` 安装成功之后,结果如下图所示: ![](http://image.linkaiblog.top/image-20200811183436411.png) ## 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端口: ![](http://image.linkaiblog.top/image-20200811184939209.png)

阿里云ECS训练营_Day04_打造离线下载服务器CCAA

  • 2020-08-10
  • 112
  • 阿里巴巴
# 安装 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,然后按下回车即可 ![](http://image.linkaiblog.top/image-20200808162341201.png) - 然后设置绝对路径,默认即可,按下回车 ![](http://image.linkaiblog.top/image-20200808162514990.png) - 然后输入密钥 ![](http://image.linkaiblog.top/image-20200808162723024.png) - 然后就可以访问了**(记得要开放阿里云安全组对应端口6080)** ![](http://image.linkaiblog.top/image-20200808162916090.png) ![](http://image.linkaiblog.top/image-20200808163225791.png) - **注意:如果 Aria2 状态一直显示未连接的话,原因是端口未开放** 需要同时开放 6080,6081(文件管理),6800(AriaNg设置里)。 因为在 AriaNg 设置里面使用到了 6800 端口,如下图所示: ![](http://image.linkaiblog.top/image-20200808165406672.png) ----- 然后就可以愉快的下载了!但是,这东西好像没啥用处,好像种子文件也下不了。我试着下了个PhotoShop-CC2019,就这网速???还不如我用自己电脑直接下呢。。。。 ![](http://image.linkaiblog.top/image-20200808171146715.png)

阿里云ECS训练营_Day03_微擎的安装与使用

  • 2020-08-08
  • 117
  • 阿里巴巴
阿里云ECS训练营第3天!今天主要在服务器上安装微擎来管理微信公众号。 # 环境说明 CnetOs7,Apache2.4.43,PHP5.3 # 安装微擎 微擎官网文档地址:http://s.w7.cc/store-static-install.html 今天的安装比较简单,跟着文档走就行。 ##### (1)下载微擎的 .zip 压缩包 ##### (2)上传至站点的根目录并解压 - 我的根目录是在这个文件夹下 ![](http://image.linkaiblog.top/image-20200808153504516.png) - 解压 解压之后得到一个 install.php 文件 ```bash unzip WeEngine-Laster-Online.zip ``` ![](http://image.linkaiblog.top/image-20200808151910746.png) ##### (3)地址栏访问 - 根据自己的站点结构,访问 install.php 即可,然后或自动跳转到微擎的登录页面 - 例如我的就是访问 `http://39.98.86.223/install.php` ##### (4) 注册账号并登录 第一次使用的话,要求注册一个账号,然后登录即可。 ![](http://image.linkaiblog.top/image-20200807193535238.png) ##### (5)配置数据库,安装系统 这里数据库用户和名称就填我们的MySql创建的数据库。 ![](http://image.linkaiblog.top/image-20200808152234714.png) ##### (6)设置站点名称和密码 ![](http://image.linkaiblog.top/image-20200808152240122.png) ##### (7)进入应用控制台 ![](http://image.linkaiblog.top/image-20200808152408306.png) - 然后进入应用控制台,个人中心,就可以查看自己站点信息了 ![](http://image.linkaiblog.top/image-20200808153013248.png) ----- 到这里,微擎就基本安装完了,后面就是一些基本的使用了!

阿里云ECS训练营_Day02_MeidaWiki的搭建

  • 2020-08-07
  • 121
  • 阿里巴巴
# 阿里云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或更高版本**,同时还需要数据库服务器。 ![](http://image.linkaiblog.top/image-20200807180859554.png) 所以为了方便起见,我们这里直接使用宝塔面板进行安装,这是我的宝塔面板已经安装的软件: ![](http://image.linkaiblog.top/image-20200807190129035.png) ### 2. 下载安装 MediaWiki ##### (1)下载压缩包 进入下载页面(https://www.mediawiki.org/wiki/Download),下载压缩包即可,我这里选择的压缩包版本是 `1.3.42` 下载完之后,按照官网的说法,我们需要将 MediaWiki 解压的 Web服务器的根目录。我们可以在宝塔面板的 `网站` 功能中,创建一个站点,并选择目录为 `/data/wwwroot/default`,这样在外部就可以访问了。**(这样更方便,宝塔面板会帮助我们创建目录结构)** ![](http://image.linkaiblog.top/image-20200807181223792.png) ##### (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 ``` ![](http://image.linkaiblog.top/image-20200807181615912.png) ##### (3)访问测试 完成上面操作之后,我们可以进入 mediawiki 的根目录,可以看到里面有一个 index.php 文件,这个就是我们要在浏览器中访问的文件。 > 但是,第一次访问出现了下面的问题 ![](http://image.linkaiblog.top/image-20200807125748598.png) 网上查了一些,应该是 php 环境没搭好,还要再安装一个 `fileinfo `的扩展。使用宝塔面板安装完该扩展,**然后在重启 php 服务**,如下所示: ![](http://image.linkaiblog.top/image-20200807125835133.png) 然后刷新页面,如下所示。 ![](http://image.linkaiblog.top/image-20200807155706816.png) 这样就表明你的 MediaWiki 安装好了,后面就是进行配置使用了。 ### 3. 配置使用 MediaWiki ##### (1)选择语言 ![](http://image.linkaiblog.top/image-20200807182148767.png) ##### (2)选择数据库 这个按照自己的喜好选,MySql和SQlite都可以,我这里选择的是 MySql ![](http://image.linkaiblog.top/image-20200807184817138.png) ![](http://image.linkaiblog.top/image-20200807184841951.png) ##### (3)安装配置完成 ![](http://image.linkaiblog.top/image-20200807185424763.png) #####(4)按照提示,将 LocalSettings.php 放在 index.php 同级目录即可 ![](http://image.linkaiblog.top/image-20200807185324314.png) ##### (5)安装配置成功 ![](http://image.linkaiblog.top/image-20200807185424763.png) ------ ok,到这里,MeidaWiki就基本搭建好了!

阿里云ECS训练营_Day01_打造专属云笔记

  • 2020-08-06
  • 202
  • 阿里巴巴
# 阿里云ECS训练营-Day01-打造专属云笔记 ### 前言 **今天是关于使用 VuePress 搭建静态云笔记的,之前对 Node.js 和 Vue 都不太了解,还是尝试去做了。官网文档配合视频简介,对 VuePress 有了一个基本的了解,也复习了一些 Linux 的操作,收获不错。** VuePress官网地址:https://www.vuepress.cn/ ------ > 该系列博客时关于阿里云ESC训练营7天进阶路线对应的博客。 ### 1. 设置安全组 VuePress默认使用8080端口,开放即可 ![](http://image.linkaiblog.top/image-20200806164912644.png) ### 2. 安装Node.js 视频中用的 wget 下载安装包,我这里用的本地下载然后上传到服务器上。 支持yum和npm安装 ---- ##### (1)去 Node.js 官网下载安装包,上传至服务器 压缩包放在 `/tmp` ##### (2)解压 解压到该目录:`/usr/local/lib/nodejs` - 先递归创建目录 ``` mkdir -p /usr/local/lib/nodejs ``` > 问题1 ![](http://image.linkaiblog.top/image-20200806170802207.png) 这个文件是以 `.xz` 为后缀的,而 `z` 参数不适用,应该用 `J` 参数 ![](http://image.linkaiblog.top/image-20200806171014840.png) > 问题2 由于疏忽,未指定目录,应该用 `-C` 指定解压到的目录 ![](http://image.linkaiblog.top/image-20200806171040858.png) ----- 最终的命令: ```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 ``` ![](http://image.linkaiblog.top/image-20200806173614539.png) ##### (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/ ) ``` 注意:此时服务正在运行,进入浏览器查看,可以查看到内容如下所示: ![](http://image.linkaiblog.top/image-20200806181952100.png) 此时的文件目录是这样的: ```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 安装为本地依赖。那就来呗! 从官网截的目录结构图:**约定优于配置**,所有要遵守他的目录结构 ![](http://image.linkaiblog.top/image-20200806184815522.png) 还有一个是视频中的截图,我们就按照这个目录结构来搭建基本结构吧。 ![](http://image.linkaiblog.top/image-20200806180527253.png) - 创建另一个根目录 ```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" } } ``` ![](http://image.linkaiblog.top/image-20200806184608250.png) - 接着创建 docs 目录 ```bash mkdir docs ``` - 在 docs 目录下新建 Markdown 文件 ``` echo '# VuePress 现有项目 ---- by JackLin' > README.md ``` - 在 docs 下面创建 .vuepress 目录,再在 .vuepress 里面创建 public 目录和 config.js 文件 - 退到根目录,执行 `vuepress dev docs`,然后在浏览器访问 ![](http://image.linkaiblog.top/image-20200806190117843.png) 至于后面的如何具体配置,官网应该写了,网上也有文章,我就不重复了。

阿里云AI训练营_Day05_创意日_图片识别文字

  • 2020-06-08
  • 176
  • SpringBoot
## 项目介绍 参加阿里云AI训练营的第5天,也是最后一天了。今天是创意日,想做什么就做什么,没有题目约束。 那么我打算做一个简单的识别图片中的文字的应用,并部署上线,以后也可能经常会用到。 ## 项目用到的文档地址 阿里云达摩院视觉开放平台:https://vision.aliyun.com/ 阿里云视觉开放平台 “通用识别” 地址:https://help.aliyun.com/document_detail/151896.html?spm=a2c4g.11186623.6.620.44da1ded5yuZbF ## 项目开始 ### (1)说明 经过前面几天的训练,自我感觉良好。已经对阿里云的视觉开放平台比较熟悉了,也熟悉使用提供的API的一些基础的步骤,感觉就是这些套路。 那么就不啰嗦了,直接上代码。由于只用到了一个场景,所以代码也比较简单,记得测试前要到阿里云开启 “文字识别服务” 哦! ![](http://image.linkaiblog.top/image-20200608223154211.png) ### (2)导入Maven依赖 ```xml <dependency> <groupId>com.aliyun</groupId> <artifactId>ocr</artifactId> <version>1.0.3</version> </dependency> <!-- 阿里巴巴的 fstjson ,和 jackson 的功能类似,用来处理 json字符串--> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> ``` ### (3)创建Client,Config类 > AIService.java ```java private Client ocrClient; private RuntimeOptions runtimeOptions; @Value("${accessKeyId}") private String accessKeyId; @Value("${accessKeySecret}") private String accessKeySecret; @PostConstruct private void init() throws Exception { Config config = new Config(); config.type = "access_key"; config.regionId = "cn-shanghai"; config.accessKeyId = accessKeyId; config.accessKeySecret = accessKeySecret; config.endpoint = "ocr.cn-shanghai.aliyuncs.com"; ocrClient = new Client(config); runtimeOptions = new RuntimeOptions(); } ``` ### (4)关键代码,调用API函数 这里由于我们需要上传图片,所以参数选择了一个 InputStream,直接从文件中获取输入流。 看文档我们知道,从图片中识别的文字会被封装在一个 data 里面,我们从这里面获取数据即可。 ![](http://image.linkaiblog.top/image-20200608223740407.png) 同时,经过测试,文字识别的过程是一行一行识别的,每行识别出来的文字都成为封装在数组的一个元素里面,所以我们定义一个 StringBuffer 对象,用来拼接这些生成的文字。 > AiService.java ```java public String myRecognizeCharacter(InputStream is) throws Exception { RecognizeCharacterAdvanceRequest request = new RecognizeCharacterAdvanceRequest(); request.imageURLObject = is; request.minHeight = 10; request.outputProbability = true; RecognizeCharacterResponse response = ocrClient.recognizeCharacterAdvance(request, runtimeOptions); StringBuffer result = new StringBuffer(); for (RecognizeCharacterResponse.RecognizeCharacterResponseDataResults item:response.data.results ) { result.append(item.text + "\n"); } return result.toString(); } ``` ### (5)文件上传逻辑 我们在 Service 层实现文件上传的逻辑,然后在 Controller 层调用,并返回上传之后的文件名。 > AiService.java ```java public String uploadImage(MultipartFile file, HttpServletRequest request) { //获取文件名 : file.getOriginalFilename(); String uploadFileName = file.getOriginalFilename(); System.out.println("上传文件名 : "+uploadFileName); String uuid = UUID.randomUUID().toString().replaceAll("-", ""); System.out.println(uuid); String newFileName = "AI-Word-" + uuid + "-" + uploadFileName; //上传路径保存设置 UUID String path = request.getServletContext().getRealPath("/upload"); // String path = "src/main/resources/static/upload"; //如果路径不存在,创建一个 File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } System.out.println("上传文件保存地址:"+realPath); InputStream is = null; //文件输入流 OutputStream os = null; try { is = file.getInputStream(); os = new FileOutputStream(new File(realPath, newFileName)); //文件输出流 //读取写出 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 newFileName; } ``` ### (6)Controller 层的逻辑 下面我们来看一下 Controller 层的代码,主要就是实现视图的跳转。然后调用 Service 层,获得数据并放在 Model 中并返回给前端 > AiController.jva ```java @Controller public class AIController { @Autowired private AIService aiService; @RequestMapping("/") public String toMain() { return "main"; } @RequestMapping("/fileupload") public String fileUpload(@RequestParam("file") MultipartFile file , HttpServletRequest request, Model model) throws IOException { // 1. 文件上传,返回上传之后新的文件名称 String newFileName = aiService.uploadImage(file, request); // 2. 图片中文字内容识别 InputStream is = file.getInputStream(); String resultWord = null; try { resultWord = aiService.myRecognizeCharacter(is); } catch (Exception e) { e.printStackTrace(); } model.addAttribute("result", "/upload/" + newFileName); model.addAttribute("word", resultWord); return "result"; } } ``` ### (7) 前端部分 最后再来看一下前端部分代码: > Result.html ```html <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> <style> div { width: 400px; border: 1px solid #ff5037; margin-top: 70px; } img { height: 400px; } </style> </head> <body> <div th:text="${word}"></div> <img th:src="@{${result}}" alt=""> </body> </html> ``` ## 测试 先进入主页面,选择图片并点击上传按钮: ![](http://image.linkaiblog.top/image-20200608224523080.png) 识别出来的结果: ![](http://image.linkaiblog.top/_2020060822581958SS.png) ## 阿里云高校计划 最后在贴一张阿里云的广告:”阿里云高校计划“,快来加入我们吧! ![](http://image.linkaiblog.top/image-20200606222043666.png)