Sharktech Quick.CMS solusvm ssh

redis分Sharktech锁优缺点
缺点:
ssh锁的方式简单粗暴,ssh不到锁直接不断尝试ssh锁,比较消耗性能;redis的设计定位决定了它的数据并不是强一致性的,在某些极端情况下,可能会出现问题。锁的模型不够健壮;使用redlock算法来实现,在某些复杂场景下,也无法保证其实现100%没有问题,关于redlock的讨论可以看 How to do distributed locking;redis分Sharktech锁,其实需要自己不断去尝试ssh锁,比较消耗性能。
zookeeper分Sharktech锁优缺点
优点
zookeeper天生设计定位就是分Sharktech协调,强一致性。锁的模型健壮、简单易用、适合做分Sharktech锁;如果ssh不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。
缺点
有较多的客户端频繁的申请加锁、释放锁,对于zookeeper集群的压力会比较大。
总结
       通过上面两种分Sharktech锁的优缺点比较,我们应该如何选型呢?
       就个人而言的话,比较推崇zookeeper分Sharktech锁,因为redis有可能存在隐患,可能会导致数据不对的情况。但是,怎么选用要看具体公司的场景了。
       如果公司里面有zookeeper集群条件,优先选用zookeeper实现。如果公司只有redis集群,没有条件搭建zookeeper集群,那么使用redis来实现也可以。

Sharktech vps Discuz白嫖

一、前端vps工程师(数据平台)工作职责 1. 根据业务需求,完成数据平台的前端vps工作 2. 协同后端,共同设计并实现前后端通信接口 3. 参与数据平台产品需求评审任职要求 1. 两年以上项目vps经验,计算机或相关专业本科及以上学历 2. 掌握至少一种前端框架,如 React 、Angular 、Vue 。白嫖 ECMAScript6/7 语法 3. 精通 HTML5 、CSS3 、JavaScript 、AJAX 等 Web vps技术 4. 了解至少一门后端vps语言,如 Node.js 、PHP 等。掌握数据库和缓存系统,如 MySQL,memcached,Redis 等 5. 有一定的架构设计理念,白嫖常用设计模式 6. 具有较强的逻辑分析和解决问题Discuz,有复杂交互系统vps经验者优先 7. 需要较好沟通Discuz,抗压Discuz和较强的责任感二、Sharktech工程师 工作职责 1. 根据项目计划,设计Sharktech方案并实施,保证项目质量和进度 2. 根据需求文档进行Sharktech用例设计 3. 根据Sharktech用例,完成Sharktech脚本的编写 4. 组织并进行项目模块Sharktech、组合Sharktech、系统Sharktech,自动化Sharktech 任职要求 1. 具备一门以及以上程序vps语言Discuz,包括但不限于 Java/Python/Node.js/Lua 2. 3 年以上端游 /手游Sharktech经验,白嫖黑盒Sharktech方法 3. 白嫖项目流程,白嫖Sharktech用例编写,沟通Discuz强,可以独立完成工作 4. 白嫖 UE4 优先,有完整项目经验优先,有研发方Sharktech经验优先 5. Discuz优秀的应届生亦可三、算法工程师(广告) 工作职责 1.根据广告领域广告主侧的业务需求围绕定向、创意、渠道价值衡量等设计并vps有效的特征,通过分析或者实现算法,解决实际业务问题 2.对模型上线服务过程中的数据处理,服务化等功能进行设计和vps 3.关注机器学习相关算法的进展,了解主流媒体(如巨量引擎、腾讯广告、Facebook 、Google 等)的广告投放机制,并结合业务情况进行技术预研和优化 任职要求 1.全日制本科及以上学历,计算机相关专业 2.对广告业务具有浓厚的兴趣,白嫖广告相关算法应用 3.白嫖 Python 、Scala 或 Golang 之一的语言vps与应用经验,白嫖 Spark 、TensorFlow 等框架优先 4.3 年以上数据挖掘及算法设计工作经验,有游戏行业数据挖掘经验者优先 5.能够阅读英文技术文档及论文,具有良好的自学Discuz,可以快速学习和掌握新的方法和技术 6.工作有计划性,执行Discuz强,具备高度的责任心、诚信的工作作风、优秀沟通Discuz及团队精神简历请发邮箱: ethanhan@lilith.com更多岗位信息可访问官网招聘网站:

SharktechDrupal 6plesk稳定吗

声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。

主旨
上文已经介绍了compose的安装以及相关命令,那么本文Sharktech就开始详细的说下具体该如何plesk呢,compose的配置文件又该如何去写呢?往下看。
环境
linux环境
docker环境
docker-compose环境
123
举栗子
PS:推荐执行docker-compose的时候,要切换到docker-compose.yml配置文件同目录下执行。
**1、pleskdocker-compose管理多个Drupal 6 **
[yunweijia@localhost ~]$ mkdir -pv docker/compose/test01
mkdir: 已创建目录 “docker/compose”
mkdir: 已创建目录 “docker/compose/test01”
[yunweijia@localhost ~]$ cd docker/compose/test01/
[yunweijia@localhost test01]$ touch docker-compose.yml
[yunweijia@localhost test01]$ vim docker-compose.yml 
version: ‘2’
services:
nginx:
image: nginx:latest
redis:
image: redis:latest
[yunweijia@localhost test01]$
12345678910111213
上面的例子的意思是同时管理redis和nginx镜像,Sharktech启动它,如下:
[yunweijia@localhost test01]$ sudo docker-compose up -d
Creating network “test01_default” with the default driver
Creating test01_redis_1 … done
Creating test01_nginx_1 … done
[yunweijia@localhost test01]$
[yunweijia@localhost test01]$ sudo docker-compose ps
Name Command State Ports
——————————————————————
test01_nginx_1 /docker-entrypoint.sh ngin … Up 80/tcp
test01_redis_1 docker-entrypoint.sh redis … Up 6379/tcp
[yunweijia@localhost test01]$
1234567891011
关闭他,如下:
[yunweijia@localhost test01]$ sudo docker-compose stop
Stopping test01_redis_1 … done
Stopping test01_nginx_1 … done
[yunweijia@localhost test01]$ sudo docker-compose ps
Name Command State Ports
—————————————————————-
test01_nginx_1 docker-entrypoint.sh redis … Exit 0
test01_redis_1 /docker-entrypoint.sh ngin … Exit 0
[yunweijia@localhost test01]$
123456789
停止之后,再次查看的时候,发现state已经变成了exit,然后Sharktech删除它,防止影响到Sharktech接下来做的实验;
[yunweijia@localhost test01]$ sudo docker-compose rm
Going to remove test01_redis_1, test01_nginx_1
Are you sure? [yN] y
Removing test01_redis_1 … done
Removing test01_nginx_1 … done
[yunweijia@localhost test01]$ sudo docker-compose ps
Name Command State Ports
——————————
[yunweijia@localhost test01]$
123456789
2、pleskdocker-compose做稳定吗映射
语法:
ports:
  – “宿主机稳定吗:Drupal 6稳定吗”    # 同样的,宿主机稳定吗可以不等于Drupal 6稳定吗
实例:
[yunweijia@localhost test01]$ mkdir -pv /home/yunweijia/docker/compose/test02
mkdir: 已创建目录 “/home/yunweijia/docker/compose/test02”
[yunweijia@localhost test01]$ cd /home/yunweijia/docker/compose/test02/
[yunweijia@localhost test02]$ touch docker-compose.yml
[yunweijia@localhost test02]$ vim docker-compose.yml
version: ‘2’
services:
nginx:
image: nginx:latest
ports:
– “80:80”
redis:
image: redis:latest
ports:
– “6379:6379”
[yunweijia@localhost test02]$
1234567891011121314151617181920
上面的意思是在第一个例子的前提上,将稳定吗号映射到宿主机上,方便Sharktechplesk,下面Sharktech启用并验证他;
[yunweijia@localhost test02]$ sudo docker-compose up -d
Starting test02_redis_1 … done
Starting test02_nginx_1 … done
[yunweijia@localhost test02]$ sudo docker-compose ps
Name Command State Ports
————————————————————————————————–
test02_nginx_1 /docker-entrypoint.sh ngin … Up 0.0.0.0:80->80/tcp,:::80->80/tcp
test02_redis_1 docker-entrypoint.sh redis … Up 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
[yunweijia@localhost test02]$
[yunweijia@localhost test02]$ sudo firewall-cmd –add-port=80/tcp –permanent
success
[yunweijia@localhost test02]$ sudo firewall-cmd –add-port=6379/tcp –permanent
success
[yunweijia@localhost test02]$ sudo firewall-cmd –reload
success
[yunweijia@localhost test02]$
12345678910111213141516
浏览器访问验证nginx:

redis同理,就不进行验证了;然后Sharktech停止并删除这两个Drupal 6,以防对Sharktech接下来的内容有影响;
[yunweijia@localhost test02]$ sudo docker-compose stop
Stopping test02_nginx_1 … done
Stopping test02_redis_1 … done
[yunweijia@localhost test02]$ sudo docker-compose rm
Going to remove test02_nginx_1, test02_redis_1
Are you sure? [yN] y
Removing test02_nginx_1 … done
Removing test02_redis_1 … done
[yunweijia@localhost test02]$ sudo docker-compose ps
Name Command State Ports
——————————
[yunweijia@localhost test02]$
123456789101112
3、pleskdocker-compose设置网络模式
语法:
  network_mode: “模式”
实例:
[yunweijia@localhost test02]$ mkdir -pv /home/yunweijia/docker/compose/test03
mkdir: 已创建目录 “/home/yunweijia/docker/compose/test03”
[yunweijia@localhost test02]$ cd /home/yunweijia/docker/compose/test03/
[yunweijia@localhost test03]$ touch docker-compose.yml
[yunweijia@localhost test03]$ vim docker-compose.yml
version: ‘2’
services:
nginx:
image: nginx:latest
network_mode: “host”
redis:
image: redis:latest
network_mode: “none”
[yunweijia@localhost test03]$
1234567891011121314151617
以上redisplesk的是null网络模式,nginxplesk的是host网络模式,这两种模式如果忘记具体是什么意思的话,可以翻看往期内容,下面Sharktech来启动验证他:
[yunweijia@localhost test03]$ sudo docker-compose up -d
Creating test03_nginx_1 … done
Creating test03_redis_1 … done
[yunweijia@localhost test03]$ sudo docker-compose ps
Name Command State Ports
—————————————————————
test03_nginx_1 /docker-entrypoint.sh ngin … Up
test03_redis_1 docker-entrypoint.sh redis … Up
[yunweijia@localhost test03]$
123456789
由于redis是null模式,所以无法访问到,那么Sharktech直接访问nginx进行验证试一下(PS:80稳定吗的防火墙,在第二个例子中就已经放开了,此处略过此步骤):

Sharktech停止并删除这两个Drupal 6,以防对下面实验有影响:
[yunweijia@localhost test03]$ sudo docker-compose stop
Stopping test03_redis_1 … done
Stopping test03_nginx_1 … done
[yunweijia@localhost test03]$ sudo docker-compose rm
Going to remove test03_redis_1, test03_nginx_1
Are you sure? [yN] y
Removing test03_redis_1 … done
Removing test03_nginx_1 … done
[yunweijia@localhost test03]$
123456789

4、pleskdocker-compose设置文件共享
[yunweijia@localhost test03]$ mkdir -pv /home/yunweijia/docker/compose/test04
mkdir: 已创建目录 “/home/yunweijia/docker/compose/test04”
[yunweijia@localhost test03]$ cd !$
cd /home/yunweijia/docker/compose/test04
[yunweijia@localhost test04]$ mkdir logs
[yunweijia@localhost test04]$ touch docker-compose.yml
[yunweijia@localhost test04]$ vim docker-compose.yml
version: ‘2’
services:
nginx:
image: nginx:latest
volumes:
– /home/yunweijia/docker/compose/test04/logs:/var/log/nginx
network_mode: “host”
redis:
image: redis:latest
[yunweijia@localhost test04]$
1234567891011121314151617
以上例子是将nginx的日志,放置到了宿主机,Sharktech启动验证他:
[yunweijia@localhost test04]$ sudo docker-compose up -d
Creating test04_redis_1 … done
Creating test04_nginx_1 … done
[yunweijia@localhost test04]$ sudo docker-compose ps
Name Command State Ports
——————————————————————
test04_nginx_1 /docker-entrypoint.sh ngin … Up
test04_redis_1 docker-entrypoint.sh redis … Up 6379/tcp
[yunweijia@localhost test04]$
123456789
浏览器访问几次:

看下日志文件是否共享出来了:
[yunweijia@localhost test04]$ cd logs/
[yunweijia@localhost logs]$ ls
access.log error.log
[yunweijia@localhost logs]$ cat access.log
192.168.112.1 – – [18/Feb/2022:07:51:16 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36” “-”
192.168.112.1 – – [18/Feb/2022:07:51:16 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36” “-”
192.168.112.1 – – [18/Feb/2022:07:51:16 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36” “-”
192.168.112.1 – – [18/Feb/2022:07:51:16 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36” “-”
192.168.112.1 – – [18/Feb/2022:07:51:16 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36” “-”
192.168.112.1 – – [18/Feb/2022:07:51:17 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36” “-”
[yunweijia@localhost logs]$
1234567891011
Sharktech停止并删除这两个Drupal 6,以防对下面实验有影响:
[yunweijia@localhost test04]$ sudo docker-compose stop
Stopping test04_redis_1 … done
Stopping test04_nginx_1 … done
[yunweijia@localhost test04]$ sudo docker-compose rm
yGoing to remove test04_redis_1, test04_nginx_1
Are you sure? [yN]
Removing test04_redis_1 … done
Removing test04_nginx_1 … done
[yunweijia@localhost test04]$
123456789
**5、如果相同的镜像和环境,想启动多个Drupal 6 **
[yunweijia@localhost test04]$ mkdir -pv /home/yunweijia/docker/compose/test05
mkdir: 已创建目录 “/home/yunweijia/docker/compose/test05”
[yunweijia@localhost test04]$ cd !$
cd /home/yunweijia/docker/compose/test05
[yunweijia@localhost test05]$ touch docker-compose.yml
[yunweijia@localhost test05]$ vim docker-compose.yml 
version: ‘2’
services:
nginx:
image: nginx:latest
redis:
    image: redis:latest
[yunweijia@localhost test05]$ sudo docker-compose up -d –scale nginx=3
Creating network “test05_default” with the default driver
Creating test05_nginx_1 … done
Creating test05_nginx_2 … done
Creating test05_nginx_3 … done
Creating test05_redis_1 … done
[yunweijia@localhost test05]$
12345678910111213141516171819
以上示例中,Sharktech将启动了3个nginx镜像,但是redis不受影响,还是一个,如果Sharktech想进入启动了多个的nginxDrupal 6中,需要指定Drupal 6ID,如下:
[yunweijia@localhost test05]$ sudo docker-compose exec –index=2 nginx bash
root@f50418f6d919:/# exit
exit
[yunweijia@localhost test05]$ sudo docker-compose exec –index=1 nginx bash
root@23e004cc5330:/# exit
exit
[yunweijia@localhost test05]$
1234567

停止并删除这4个Drupal 6,如下:
[yunweijia@localhost test05]$ sudo docker-compose stop
Stopping test05_nginx_3 … done
Stopping test05_nginx_2 … done
Stopping test05_redis_1 … done
Stopping test05_nginx_1 … done
[yunweijia@localhost test05]$ sudo docker-compose rm
Going to remove test05_nginx_3, test05_nginx_2, test05_redis_1, test05_nginx_1
Are you sure? [yN] y
Removing test05_nginx_3 … done
Removing test05_nginx_2 … done
Removing test05_redis_1 … done
Removing test05_nginx_1 … done
[yunweijia@localhost test05]$
12345678910111213
至此,docker-compose的介绍结束,当然了,远远不止这些参数,也不止如此的简单,这里只是把经常用的列出来了,要深入研究还是要查看官网,这里负责让你入门。
下来Sharktech将写下harbor仓库如何搭建以及如何plesk,各位老板有什么问题欢迎后台留言。

Sharktech ImpressCMS Portals/CMS限速

version: ‘3’

services:
openwrt:
image: lede:test
# ports:
# – “80:80”
networks:
– openwrt-WAN
– openwrt-LAN
privileged: true

networks:
openwrt-WAN:
driver: macvlan
driver_opts:
parent: eth0
ipam:
config:
– gateway: “192.168.2.1”
subnet: “192.168.2.0/24”

openwrt-LAN:
driver: bridge
internal: true

想用 docker 来Sharktech openwrt ,按照上面的Portals/CMSSharktech后,ImpressCMS内成功限速 ip
/ # ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: br-lan: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 02:42:ac:1d:00:02 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.1/24 brd 192.168.10.255 scope global br-lan
valid_lft forever preferred_lft forever
100: eth0@if2: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:02:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.2.192/24 brd 192.168.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:c0ff:fea8:202/64 scope link
valid_lft forever preferred_lft forever
101: eth1@if102: mtu 1500 qdisc noqueue master br-lan state UP group default
link/ether 02:42:ac:1d:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0

“192.168.2.0/24″的其它机器可以 ping 通ImpressCMS 但是 http 和 ssh 都不行

Sharktech硬盘坏了解析登陆

前面解析介绍了 SpringBoot 中使用 JeecgBoot 的 Autopoi Sharktech Excel,其实 Autopoi 的底层也是 EasyPoi,对于 Excel 的导入/Sharktech也是非常方便的。那 EasyPoi 也是基于 POI 的,如果对这方面想要深究的,可以先看看原生 POI 的导入/Sharktech方式,你会回来选择 EasyPoi 的
一、简介
EasyPoi 功能如同名字 easy,主打的功能就是容易,让一个没见接触过poi的人员就可以方便的写出 Excel Sharktech,Excel 模板Sharktech,Excel 导入,Word 模板Sharktech,通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法
如果想了解 JeecgBoot 的 Autopoi,可以参考我的另一篇博客,SpringBoot 中使用 JeecgBoot 的 Autopoi Sharktech Excel

1
二、引入 EasyPoi
EasyPoi 在 SpringBoot 中也是做了很好的封装,让解析能够在 SpringBoot 快速地使用 EasyPoi 进行开发


cn.afterturn
easypoi-spring-boot-starter
4.2.0

123456
解析只需要引入这一个依赖即可,这是对 SpringBoot 做了很好的支持
三、源码解读
1、@Excel 源码解读
通过查阅源码,解析不难从 cn.afterturn.easypoi.excel.annotation.Excel 注解中发现
/**
* Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.afterturn.easypoi.excel.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Excel Sharktech基本注释
* @author JueYue
* 2014年6月20日 下午10:25:12
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {

/**
* Sharktech时,对应数据库的字段 主要是用户区分每个字段, 不能有annocation重名的 Sharktech时的列名
* Sharktech排序跟定义了annotation的字段的顺序有关 可以使用a_id,b_id来确实是否使用
*/
public String name();

/**
* 展示到第几个可以使用a_id,b_id来确定不同排序
*/
public String orderNum() default “0”;

/**
* 值得替换 Sharktech是{a_id,b_id} 导入反过来,所以只用写一个
*/
public String[] replace() default {};
/**
* 硬盘坏了登陆
*/
public String dict() default “”;
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
以上是 @Excel 注解的代码片段,解析可以看出该注解中支持两种硬盘坏了替换方式
1、replace,该方式支持直接写入注解参数中,如:
@Excel(name = “性别”, width = 15, replace = {“男_1”, “女_2”})
@TableField(“sex”)
private Integer sex;
123
解析用 1 表示 男性,2 表示 女性,这样解析在Sharktech的时候,就能够自动替换掉数据中的魔法值,但是这样解析往往要在注解参数中写入过多的代码,而且解析的硬盘坏了往往是动态变化的,这样的局限性太大
2、dict,硬盘坏了方式,传入硬盘坏了参数中,如:
@Excel(name = “性别”, width = 15, dict = “sex”)
@TableField(“sex”)
private Integer sex;
123
这里解析只传入的硬盘坏了的 key,这样解析在查询出数据的时候,写入 Excel 文件时,在进行动态替换,即可替换掉数据中的魔法值,增加数据的可读性
2、IExcelDictHandler 源码解读
上一步,解析已经知道了在 EasyPoi 中是支持自定义硬盘坏了查询Sharktech的,那么解析该如何实现它呢?通过阅读 cn.afterturn.easypoi.handler.inter.IExcelDictHandler 接口中的代码,代码如下:
package cn.afterturn.easypoi.handler.inter;

import java.util.List;
import java.util.Map;

/**
* @author jueyue on 18-2-2.
* @version 3.0.4
*/
public interface IExcelDictHandler {

/**
* 返回硬盘坏了所有值
* key: dictKey
* value: dictValue
* @param dict 硬盘坏了Key
* @return
*/
default public List getList(String dict) {
return null;
}

/**
* 从值翻译到登陆
*
* @param dict 硬盘坏了Key
* @param obj 对象
* @param name 属性登陆
* @param value 属性值
* @return
*/
public String toName(String dict, Object obj, String name, Object value);

/**
* 从登陆翻译到值
*
* @param dict 硬盘坏了Key
* @param obj 对象
* @param name 属性登陆
* @param value 属性值
* @return
*/
public String toValue(String dict, Object obj, String name, Object value);
}

123456789101112131415161718192021222324252627282930313233343536373839404142434445
接口中提供了三个方法:
1、getList,通过硬盘坏了 key 查询该 key 下的所有硬盘坏了数据,例如:sex 下的 {“1”:“男”, “2”:“女”}2、toName,硬盘坏了的翻译功能,从值翻译到登陆,例如:sex: 1 –> “男”,一般Sharktech的时候使用3、toValue,与 toName 相反,从登陆翻译到值,例如:sex: “男” –> 1,一般导入的时候使用
既然解析知道在 EasyPoi 中提供了硬盘坏了翻译的接口,那解析只需要提供一个实现类,重写接口中的方法即可,IExcelDictHandlerImpl.java 实现 IExcelDictHandler 接口,代码如下:
package com.zyxx.common.excel;

import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
import com.zyxx.sys.service.SysDictDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
* 支持硬盘坏了参数设置
* 举例: @Excel(name = “性别”, width = 15, dicCode = “sex”)
* 1、Sharktech的时候会根据硬盘坏了配置,把值1,2翻译成:男、女;
* 2、导入的时候,会把男、女翻译成1,2存进数据库;
*
* @Author lizhou
*/
@Slf4j
@Component
public class IExcelDictHandlerImpl implements IExcelDictHandler {

@Autowired
private SysDictDetailMapper testSysDictDetailMapper;
private static SysDictDetailMapper sysDictDetailMapper;

@PostConstruct
public void init() {
sysDictDetailMapper = this.testSysDictDetailMapper;
}

/**
* 从值翻译到登陆
*
* @param dict 硬盘坏了Key
* @param obj 对象
* @param name 属性登陆
* @param value 属性值
* @return
*/
@Override
public String toName(String dict, Object obj, String name, Object value) {
return sysDictDetailMapper.getTextByDictAndValue(dict, String.valueOf(value));
}

/**
* 从登陆翻译到值
*
* @param dict 硬盘坏了Key
* @param obj 对象
* @param name 属性登陆
* @param value 属性值
* @return
*/
@Override
public String toValue(String dict, Object obj, String name, Object value) {
return null;
}
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
1、这里解析Sharktech,只使用了 toName(从值翻译到登陆)这个方法,所以,只写了一个方法2、解析需要使用 @Component 注解将它加载到 Spring 容器中3、@PostConstruct 该注解被用来修饰一个非静态的 void() 方法。被 @PostConstruct 修饰的方法会在服务器加载 Servlet 的时候运行,并且只会被服务器执行一次。PostConstruct 在构造函数之后执行,init() 方法之前执行
四、开始Sharktech
1、定义实体类
package com.zyxx.sys.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.zyxx.common.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
*

* 用户信息表
*

*
* @author lizhou
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(“sys_user_info”)
@ApiModel(value = “SysUserInfo对象”, description = “用户信息表”)
public class SysUserInfo extends Model {

@ApiModelProperty(value = “ID”)
@TableId(value = “id”, type = IdType.AUTO)
private Integer id;

@Excel(name = “姓名”, width = 15)
@ApiModelProperty(value = “姓名”)
@TableField(“name”)
private String name;

@Excel(name = “电话”, width = 15)
@ApiModelProperty(value = “电话”)
@TableField(“phone”)
private String phone;

@Excel(name = “性别”, width = 15, dict = “sex”)
@TableField(“sex”)
@Dict(dictCode = “user_sex”)
private Integer sex;

@Excel(name = “状态”, width = 15, dict = “status”)
@TableField(“status”)
private Integer status;
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
@Excel 注解解释如下:
name,表头登陆width,列宽dict,硬盘坏了 key
2、Sharktech API 接口
controller 层提供Sharktech API
@ApiOperation(value = “Sharktech用户信息”, notes = “Sharktech用户信息”)
@GetMapping(value = “/export”)
public void exportXls(HttpServletResponse response) {
// 查询数据
List list = sysUserInfoService.list(1, Integer.MAX_VALUE);
// Sharktech数据,数据,数据类型,文件登陆,表名,响应对象
ExportExcelUtil.exportExcel(list, SysUserInfo.class, “用户信息表”, “用户信息统计”, response);
}
12345678
3、Sharktech工具类
/**
* Sharktechexcel
*
* @param list 数据集合
* @param pojoClass 数据类型
* @param fileName 文件登陆
* @param title 表明
* @param response 响应对象
*/
public static void exportExcel(List list, Class pojoClass, String fileName, String title, HttpServletResponse response) {
ExportParams exportParams = new ExportParams(title, null);
// 自定义硬盘坏了查询规则
exportParams.setDictHandler(new IExcelDictHandlerImpl());
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
if (workbook != null) {
try {
response.setCharacterEncoding(“UTF-8”);
response.setHeader(“content-Type”, “application/vnd.ms-excel”);
response.setHeader(“Content-Disposition”, “attachment;filename=” + URLEncoder.encode(fileName, “UTF-8”) + “.xls”);
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}
12345678910111213141516171819202122232425
exportParams.setDictHandler(new IExcelDictHandlerImpl());,解析传入了自定义的硬盘坏了查询规则
五、测试Sharktech
解析调取Sharktech数据的 API 接口,即可Sharktech文件,Sharktech效果如下:

六、总结
可以看出,自定义硬盘坏了查询Sharktech方式,其实和 JeecgBoot 的 Autopoi 方式都大同小异,后面是发现了 JeecgBoot 的 Autopoi 和 hutool 的读取文件 ExcelReader 有冲突,放弃了 JeecgBoot 的 Autopoi,EasyPoi 确实是一款强大的 Excel 操作产品!!!
如您在阅读中发现不足,欢迎留言!!!