java定时任务## 依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <!-- jar包版 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.1</version>
</dependency>


<!-- 启动器版 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>

使用方式

1. 启动类注解

@EnableScheduling

1
2
3
4
5
6
7
8
@EnableScheduling
@SpringBootApplication
@MapperScan("com.panshi.qssys.dao")
public class MarketingApp {
public static void main(String[] args) {
SpringApplication.run(MarketingApp.class);
}
}

2. 定时任务类

@Component

所有的任务类命名规范 xxxTask , xxxTask
放到task包下
当任务比较多的时候,可以将task形成一个模块,项目

3. 定时方法

使用cron表达式

1
2
3
4
@Scheduled(cron = "0/5 * * * * *")
public void method(){
System.out.println(111);
}

cron表达式

java通过Sigar获取服务器信息## 介绍

今天在开发过程中遇到个问题,怎么在JAVA中获取到服务器信息?
经过寻找,终于找到了,那就是Sigar,那么什么是Sigar呢?

Sigar
Sigar是Hyperic-hq产品的基础包,是HypericHQ主要的数据收集组件。它用来从许多平台收集系统和处理信息.
这些平台包括:Linux,Windows, Solaris, AIX, HP-UX, FreeBSD and Mac OSX.
Sigar有C,C#,Java和PerlAPI,java版的API为sigar.jarsigar.jar的底层是用C语言编写的,它通过本地方法来调用操作系统API来获取系统相关数据。
Windows操作系统下Sigar.jar依赖sigar-amd64-winnt.dll或sigar-x86-winnt.dll,linux操作系统下则依赖libsigar-amd64-linux.so或libsigar-x86-linux.so

能获取的信息有:

1
2
3
4
5
6
7
8
9
CPU信息:包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
文件系统信息:包括Filesystem、Size、Used、Avail、Use%、Type
事件信息:类似Service Control Manager
内存信息:物理内存和交换内存的总数、使用数、剩余数;RAM的大小
网络信息:包括网络接口信息和网络路由信息
进程信息:包括每个进程的内存、CPU占用数、状态、参数、句柄
IO信息:包括IO的状态,读写大小等
服务状态信息
系统信息:包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等

Hyperic-hq官方网站

官网Sigar.jar下载地址

本站下载(推荐)

依赖

1
2
3
4
5
<dependency>
<groupId>org.hyperic</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
</dependency>

注意!!!!

需要将基本库文件放到jdk的bin目录下,不放运行会抛异常。

linux查看jdk目录

1
cmd -- java -verbose

比如在windows环境下是以下文件

1
2
3
sigar-amd64-winnt.dll
sigar-x86-winnt.dll
sigar-x86-winnt.lib

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
package com.meihao1104.rainbow.utils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.Properties;
import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.Swap;
import org.hyperic.sigar.Who;

public class RuntimeTest {
public static void main(String[] args) {
try {
// System信息,从jvm获取
property();
System.out.println("----------------------------------");
// cpu信息
cpu();
System.out.println("----------------------------------");
// 内存信息
memory();
System.out.println("----------------------------------");
// 操作系统信息
os();
System.out.println("----------------------------------");
// 用户信息
who();
System.out.println("----------------------------------");
// 文件系统信息
file();
System.out.println("----------------------------------");
// 网络信息
net();
System.out.println("----------------------------------");
// 以太网信息
ethernet();
System.out.println("----------------------------------");
} catch (Exception e1) {
e1.printStackTrace();
}
}

private static void property() throws UnknownHostException {
Runtime r = Runtime.getRuntime();
Properties props = System.getProperties();
InetAddress addr;
addr = InetAddress.getLocalHost();
String ip = addr.getHostAddress();
Map<String, String> map = System.getenv();
String userName = map.get("USERNAME");// 获取用户名
String computerName = map.get("COMPUTERNAME");// 获取计算机名
String userDomain = map.get("USERDOMAIN");// 获取计算机域名
System.out.println("用户名: " + userName);
System.out.println("计算机名: " + computerName);
System.out.println("计算机域名: " + userDomain);
System.out.println("本地ip地址: " + ip);
System.out.println("本地主机名: " + addr.getHostName());
System.out.println("JVM可以使用的总内存: " + r.totalMemory());
System.out.println("JVM可以使用的剩余内存: " + r.freeMemory());
System.out.println("JVM可以使用的处理器个数: " + r.availableProcessors());
System.out.println("Java的运行环境版本: " + props.getProperty("java.version"));
System.out.println("Java的运行环境供应商: " + props.getProperty("java.vendor"));
System.out.println("Java供应商的URL: " + props.getProperty("java.vendor.url"));
System.out.println("Java的安装路径: " + props.getProperty("java.home"));
System.out.println("Java的虚拟机规范版本: " + props.getProperty("java.vm.specification.version"));
System.out.println("Java的虚拟机规范供应商: " + props.getProperty("java.vm.specification.vendor"));
System.out.println("Java的虚拟机规范名称: " + props.getProperty("java.vm.specification.name"));
System.out.println("Java的虚拟机实现版本: " + props.getProperty("java.vm.version"));
System.out.println("Java的虚拟机实现供应商: " + props.getProperty("java.vm.vendor"));
System.out.println("Java的虚拟机实现名称: " + props.getProperty("java.vm.name"));
System.out.println("Java运行时环境规范版本: " + props.getProperty("java.specification.version"));
System.out.println("Java运行时环境规范供应商: " + props.getProperty("java.specification.vender"));
System.out.println("Java运行时环境规范名称: " + props.getProperty("java.specification.name"));
System.out.println("Java的类格式版本号: " + props.getProperty("java.class.version"));
System.out.println("Java的类路径: " + props.getProperty("java.class.path"));
System.out.println("加载库时搜索的路径列表: " + props.getProperty("java.library.path"));
System.out.println("默认的临时文件路径: " + props.getProperty("java.io.tmpdir"));
System.out.println("一个或多个扩展目录的路径: " + props.getProperty("java.ext.dirs"));
System.out.println("操作系统的名称: " + props.getProperty("os.name"));
System.out.println("操作系统的构架: " + props.getProperty("os.arch"));
System.out.println("操作系统的版本: " + props.getProperty("os.version"));
System.out.println("文件分隔符: " + props.getProperty("file.separator"));
System.out.println("路径分隔符: " + props.getProperty("path.separator"));
System.out.println("行分隔符: " + props.getProperty("line.separator"));
System.out.println("用户的账户名称: " + props.getProperty("user.name"));
System.out.println("用户的主目录: " + props.getProperty("user.home"));
System.out.println("用户的当前工作目录: " + props.getProperty("user.dir"));
}

private static void memory() throws SigarException {
Sigar sigar = new Sigar();
Mem mem = sigar.getMem();
// 内存总量
System.out.println("内存总量: " + mem.getTotal() / 1024L + "K av");
// 当前内存使用量
System.out.println("当前内存使用量: " + mem.getUsed() / 1024L + "K used");
// 当前内存剩余量
System.out.println("当前内存剩余量: " + mem.getFree() / 1024L + "K free");
Swap swap = sigar.getSwap();
// 交换区总量
System.out.println("交换区总量: " + swap.getTotal() / 1024L + "K av");
// 当前交换区使用量
System.out.println("当前交换区使用量: " + swap.getUsed() / 1024L + "K used");
// 当前交换区剩余量
System.out.println("当前交换区剩余量: " + swap.getFree() / 1024L + "K free");
}

private static void cpu() throws SigarException {
Sigar sigar = new Sigar();
CpuInfo infos[] = sigar.getCpuInfoList();
CpuPerc cpuList[] = null;
cpuList = sigar.getCpuPercList();
for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
CpuInfo info = infos[i];
System.out.println("第" + (i + 1) + "块CPU信息");
System.out.println("CPU的总量MHz: " + info.getMhz());// CPU的总量MHz
System.out.println("CPU生产商: " + info.getVendor());// 获得CPU的卖主,如:Intel
System.out.println("CPU类别: " + info.getModel());// 获得CPU的类别,如:Celeron
System.out.println("CPU缓存数量: " + info.getCacheSize());// 缓冲存储器数量
printCpuPerc(cpuList[i]);
}
}

private static void printCpuPerc(CpuPerc cpu) {
System.out.println("CPU用户使用率: " + CpuPerc.format(cpu.getUser()));// 用户使用率
System.out.println("CPU系统使用率: " + CpuPerc.format(cpu.getSys()));// 系统使用率
System.out.println("CPU当前等待率: " + CpuPerc.format(cpu.getWait()));// 当前等待率
System.out.println("CPU当前错误率: " + CpuPerc.format(cpu.getNice()));//
System.out.println("CPU当前空闲率: " + CpuPerc.format(cpu.getIdle()));// 当前空闲率
System.out.println("CPU总的使用率: " + CpuPerc.format(cpu.getCombined()));// 总的使用率
}

private static void os() {
OperatingSystem OS = OperatingSystem.getInstance();
// 操作系统内核类型如: 386、486、586等x86
System.out.println("操作系统: " + OS.getArch());
System.out.println("操作系统CpuEndian(): " + OS.getCpuEndian());//
System.out.println("操作系统DataModel(): " + OS.getDataModel());//
// 系统描述
System.out.println("操作系统的描述: " + OS.getDescription());
// 操作系统类型
// System.out.println("OS.getName(): " + OS.getName());
// System.out.println("OS.getPatchLevel(): " + OS.getPatchLevel());//
// 操作系统的卖主
System.out.println("操作系统的卖主: " + OS.getVendor());
// 卖主名称
System.out.println("操作系统的卖主名: " + OS.getVendorCodeName());
// 操作系统名称
System.out.println("操作系统名称: " + OS.getVendorName());
// 操作系统卖主类型
System.out.println("操作系统卖主类型: " + OS.getVendorVersion());
// 操作系统的版本号
System.out.println("操作系统的版本号: " + OS.getVersion());
}

private static void who() throws SigarException {
Sigar sigar = new Sigar();
Who who[] = sigar.getWhoList();
if (who != null && who.length > 0) {
for (int i = 0; i < who.length; i++) {
// System.out.println("当前系统进程表中的用户名" + String.valueOf(i));
Who _who = who[i];
System.out.println("用户控制台: " + _who.getDevice());
System.out.println("用户host: " + _who.getHost());
// System.out.println("getTime(): " + _who.getTime());
// 当前系统进程表中的用户名
System.out.println("当前系统进程表中的用户名: " + _who.getUser());
}
}
}

private static void file() throws Exception {
Sigar sigar = new Sigar();
FileSystem fslist[] = sigar.getFileSystemList();
for (int i = 0; i < fslist.length; i++) {
System.out.println("分区的盘符名称" + i);
FileSystem fs = fslist[i];
// 分区的盘符名称
System.out.println("盘符名称: " + fs.getDevName());
// 分区的盘符名称
System.out.println("盘符路径: " + fs.getDirName());
System.out.println("盘符标志: " + fs.getFlags());//
// 文件系统类型,比如 FAT32、NTFS
System.out.println("盘符类型: " + fs.getSysTypeName());
// 文件系统类型名,比如本地硬盘、光驱、网络文件系统等
System.out.println("盘符类型名: " + fs.getTypeName());
// 文件系统类型
System.out.println("盘符文件系统类型: " + fs.getType());
FileSystemUsage usage = null;
usage = sigar.getFileSystemUsage(fs.getDirName());
switch (fs.getType()) {
case 0: // TYPE_UNKNOWN :未知
break;
case 1: // TYPE_NONE
break;
case 2: // TYPE_LOCAL_DISK : 本地硬盘
// 文件系统总大小
System.out.println(fs.getDevName() + "总大小: " + usage.getTotal() + "KB");
// 文件系统剩余大小
System.out.println(fs.getDevName() + "剩余大小: " + usage.getFree() + "KB");
// 文件系统可用大小
System.out.println(fs.getDevName() + "可用大小: " + usage.getAvail() + "KB");
// 文件系统已经使用量
System.out.println(fs.getDevName() + "已经使用量: " + usage.getUsed() + "KB");
double usePercent = usage.getUsePercent() * 100D;
// 文件系统资源的利用率
System.out.println(fs.getDevName() + "资源的利用率: " + usePercent + "%");
break;
case 3:// TYPE_NETWORK :网络
break;
case 4:// TYPE_RAM_DISK :闪存
break;
case 5:// TYPE_CDROM :光驱
break;
case 6:// TYPE_SWAP :页面交换
break;
}
System.out.println(fs.getDevName() + "读出: " + usage.getDiskReads());
System.out.println(fs.getDevName() + "写入: " + usage.getDiskWrites());
}
return;
}

private static void net() throws Exception {
Sigar sigar = new Sigar();
String ifNames[] = sigar.getNetInterfaceList();
for (int i = 0; i < ifNames.length; i++) {
String name = ifNames[i];
NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
System.out.println("网络设备名: " + name);// 网络设备名
System.out.println("IP地址: " + ifconfig.getAddress());// IP地址
System.out.println("子网掩码: " + ifconfig.getNetmask());// 子网掩码
if ((ifconfig.getFlags() & 1L) <= 0L) {
System.out.println("!IFF_UP...skipping getNetInterfaceStat");
continue;
}
NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);
System.out.println(name + "接收的总包裹数:" + ifstat.getRxPackets());// 接收的总包裹数
System.out.println(name + "发送的总包裹数:" + ifstat.getTxPackets());// 发送的总包裹数
System.out.println(name + "接收到的总字节数:" + ifstat.getRxBytes());// 接收到的总字节数
System.out.println(name + "发送的总字节数:" + ifstat.getTxBytes());// 发送的总字节数
System.out.println(name + "接收到的错误包数:" + ifstat.getRxErrors());// 接收到的错误包数
System.out.println(name + "发送数据包时的错误数:" + ifstat.getTxErrors());// 发送数据包时的错误数
System.out.println(name + "接收时丢弃的包数:" + ifstat.getRxDropped());// 接收时丢弃的包数
System.out.println(name + "发送时丢弃的包数:" + ifstat.getTxDropped());// 发送时丢弃的包数
}
}

private static void ethernet() throws SigarException {
Sigar sigar = null;
sigar = new Sigar();
String[] ifaces = sigar.getNetInterfaceList();
for (int i = 0; i < ifaces.length; i++) {
NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]);
if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
|| NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {
continue;
}
System.out.println(cfg.getName() + "IP地址:" + cfg.getAddress());// IP地址
System.out.println(cfg.getName() + "网关广播地址:" + cfg.getBroadcast());// 网关广播地址
System.out.println(cfg.getName() + "网卡MAC地址:" + cfg.getHwaddr());// 网卡MAC地址
System.out.println(cfg.getName() + "子网掩码:" + cfg.getNetmask());// 子网掩码
System.out.println(cfg.getName() + "网卡描述信息:" + cfg.getDescription());// 网卡描述信息
System.out.println(cfg.getName() + "网卡类型" + cfg.getType());//
}
}
}

xml文件读取```java

package org.apache.ranger.plugin.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Map;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLUtils {

private static final Logger LOG = Logger.getLogger(XMLUtils.class);

private static final String XMLCONFIG_PROPERTY_TAGNAME = "property";
private static final String XMLCONFIG_NAME_TAGNAME = "name";
private static final String XMLCONFIG_VALUE_TAGNAME = "value";

/**
 * 读取
 * @param configFileName 配置文件路径
 * @param properties 集合
 */
public static void loadConfig(String configFileName, Map<Object, Object> properties) {
    try (InputStream input = getFileInputStream(configFileName)) {
        loadConfig(input, properties);
    } catch (Exception e) {
        LOG.error("Error loading : ", e);
    }
}

public static void loadConfig(InputStream input, Map<Object, Object> properties) {
    try {
        DocumentBuilderFactory xmlDocumentBuilderFactory = DocumentBuilderFactory.newInstance();
        xmlDocumentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        xmlDocumentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
                xmlDocumentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        xmlDocumentBuilderFactory.setIgnoringComments(true);
        xmlDocumentBuilderFactory.setNamespaceAware(true);

        DocumentBuilder xmlDocumentBuilder = xmlDocumentBuilderFactory.newDocumentBuilder();
        Document xmlDocument = xmlDocumentBuilder.parse(input);
        xmlDocument.getDocumentElement().normalize();

        NodeList nList = xmlDocument.getElementsByTagName(XMLCONFIG_PROPERTY_TAGNAME);

        for (int temp = 0; temp < nList.getLength(); temp++) {

            Node nNode = nList.item(temp);

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;

                String propertyName = "";
                String propertyValue = "";
                if (eElement.getElementsByTagName(XMLCONFIG_NAME_TAGNAME).item(0) != null) {
                    propertyName = eElement.getElementsByTagName(XMLCONFIG_NAME_TAGNAME)
                            .item(0).getTextContent().trim();
                }
                if (eElement.getElementsByTagName(XMLCONFIG_VALUE_TAGNAME).item(0) != null) {
                    propertyValue = eElement.getElementsByTagName(XMLCONFIG_VALUE_TAGNAME)
                            .item(0).getTextContent().trim();
                }

                if (properties.get(propertyName) != null) {
                    properties.remove(propertyName);
                }

                properties.put(propertyName, propertyValue);

            }
        }

    } catch (Exception e) {
        LOG.error("Error loading : ", e);
    }
}

private static InputStream getFileInputStream(String path) throws FileNotFoundException {

    InputStream ret = null;

    // Guard against path traversal attacks
    String sanitizedPath = new File(path).getName();
    if ("".equals(sanitizedPath)) {
        return null;
    }
    File f = new File(sanitizedPath);

    if (f.exists()) {
        ret = new FileInputStream(f);
    } else {
        ret = XMLUtils.class.getResourceAsStream(path);

        if (ret == null) {
            if (! path.startsWith("/")) {
                ret = XMLUtils.class.getResourceAsStream("/" + path);
            }
        }

        if (ret == null) {
            ret = ClassLoader.getSystemClassLoader().getResourceAsStream(path);
            if (ret == null) {
                if (! path.startsWith("/")) {
                    ret = ClassLoader.getSystemResourceAsStream("/" + path);
                }
            }
        }
    }

    return ret;
}

}

1
2
3
4
5
6
7
8
9

xml模版
```xml
<configuration>
<property>
<name>xxxxx</name>
<value>yyyy</value>
</property>
</configuration>

vue配合ElementUI导入导出excel表格本文主要使用elementUI上传文件

导入

1. 导入依赖

1
2
npm install -S file-saver xlsx
npm install -D script-loader

import XLSX from ‘xlsx’

2.ElementUI上传文件代码

1
2
3
4
5
6
7
8
9
10
11
<el-upload
class="upload-demo"
:action="'service/plugins/policies/importExcel/' + plugin"
:on-change="upLoad"
:limit="1"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
:auto-upload="false"
:file-list="config.data">
<el-button size="small" type="primary">选择文件</el-button>
<div slot="tip" class="el-upload__tip">只能上传xls/xlsx文件</div>
</el-upload>

3.js代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
upLoad(file, fileList) {
let fileTemp = file.raw;
if (fileTemp) {
if ((fileTemp.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|| (fileTemp.type === 'application/vnd.ms-excel')) {
this.readExcelFile(fileTemp);
} else {
this.$message({
type: 'warning',
message: '附件格式错误,请删除后重新上传!'
})
}
} else {
this.$message({
type: 'warning',
message: '请上传附件!'
})
}
},
// 主要方法
readExcelFile(file) {
// 通过DOM取文件数据
var rABS = false; //是否将文件读取为二进制字符串
var reader = new FileReader();
FileReader.prototype.readAsBinaryString = function (file) {
var binary = "";
var rABS = false; //是否将文件读取为二进制字符串
var workbook; //读取完成的数据
var outdata;
var reader = new FileReader();
reader.onload = function (e) {
var bytes = new Uint8Array(reader.result);
var length = bytes.byteLength;
for (var i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i]);
}
var XLSX = require('xlsx');
if (rABS) {
workbook = XLSX.read(btoa(fixdata(binary)), { //手动转化
type: 'base64'
});
} else {
workbook = XLSX.read(binary, {
type: 'binary'
});
}
outdata = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);

window.console.log("表格参数:" + workbook);
window.console.log("数据:" + outdata);
};
reader.readAsArrayBuffer(file);
};

if (rABS) {
reader.readAsArrayBuffer(file);
} else {
reader.readAsBinaryString(file);
}

},

导出

vue使用xlsx修改样式导出excel

参考

Vue+Element前端导入导出Excel

vue读取json文件和下载文件## 读取json文件

  1. 获取file文件
    具体步骤不说了,input上传文件或者elementUI上传文件都可以,只要拿到file对象就可以了
  2. 读取内容
    1
    2
    3
    4
    5
    6
    7
    8
    let file = "获取file文件对象";
    let reader = new FileReader();
    reader.readAsText(file, "UTF-8");
    reader.onload = function (e) {
    let data = JSON.parse(e.target.result);
    // 打印json数据
    window.console.log(data);
    }

下载文件

1
2
3
4
5
6
let services = {"key": "value"};
let data = JSON.stringify(services);
let blob = new Blob([data], {type: 'text/plain;charset=utf-8'});
// json或者txt都可以
let fileName = '文件名.json';
FileSaver.saveAs(blob, fileName);

vue在触发事件时附加自定义参数以ElementUI的分页组件为例,

我们找个事件
比如

1
2
3
4
5
6
<el-pagination
small
layout="prev, pager, next"
:current-change='changePage'
:total="50">
</el-pagination>
1
2
3
4
5
6
7
/**
* currentPage 改变时会触发
* @param index 当前页
*/
changePage(index){
console.log(index);
}

如上述代码,我们触发分页的事件后,changePage方法只能接受到一个index参数,如果我们修改成以下写法就会报错。

1
:current-change='changePage(index, id)'

解决方法

使用ES写法解决

1
:current-change='(index) => {changePage(index, id)}'
1
2
3
4
changePage(index, id){
console.log(index);
console.log(id);
}

Jetbrains系列产品2019.3.3最新激活方法其实这篇直接是拿了别人的教程过来的,也算是做个备份吧,原文出处在最下面。

ok,让我们开始

  1. 下载破解用的jar包

    在这里说明下,这个是本文编辑时下载的,后续更新可能失效,如果失效请在下方留言,或者直接去出处找。

    百度云下载
    提取码:2c4t。

自动挡

  1. 在创建项目界面,将破解jar包直接拖到IDE窗口,点 “Restart” 按钮重启IDE。
  2. 在弹出的JetbrainsAgent Helper对话框中,选择激活方式,点击安装按钮。
    如果你是无外网环境,在对话框中勾选:我无法访问外网 选项。
  3. 重启IDE,搞定。

x. 支持两种注册方式:License server 和 Activation code:
1). 选择License server方式,地址填入:http://fls.jetbrains-agent.com (网络不佳的用第2种方式)
2). 选择Activation code方式离线激活,请使用:ACTIVATION_CODE.txt 内的注册码激活
如果激活窗口一直弹出(error 1653219),请去hosts文件里“移除”jetbrains相关的项目
License key is in legacy format == Key invalid,表示agent配置未生效。
如果你需要自定义License name,请访问:https://zhile.io/custom-license.html
3). 现在你可以使用jetbrains-agent + license server激活jetbrains平台的付费插件了!
除了:”IEDIS 2” 和 “MINBATIS”,这两个请使用 IEDIS_MINBATIS_CODE.txt 来激活。
现在有这些付费插件:https://plugins.jetbrains.com/search?isPaid=true

手动挡

  1. 将解压出来的jetbrains-agent.jar文件放在idea的安装目录下
    右键点击idea图标,查看属性,点击 打开文件所在的位置,到达安装

image.png
image.png
3. 编辑同级目录下的idea64.exe.vmoptions文件
注意,只能用idea编辑,不能用其他编辑器!!!

在这里小伙伴们就有疑问了,我还没激活怎么编辑呢?试用30天呗。
image.png
image.png

一定要自己确认好路径(不要使用中文路径),填错会导致IDE打不开!!!最好使用绝对路径。

一个vmoptions内只能有一个-javaagent参数。
示例:
mac: -javaagent:/Users/neo/jetbrains-agent.jar
linux: -javaagent:/home/neo/jetbrains-agent.jar
windows: -javaagent:C:\Users\neo\jetbrains-agent.jar
如果还是填错了,参考这篇文章编辑vmoptions补救:
https://intellij-support.jetbrains.com/hc/en-us/articles/206544519

注:到这一步的朋友很有可能因为路径问题导致idea打不开,根据上文的链接,我们找到

1
C:\Users\你的用户名\.你的idea版本\config

路径下的 idea64.exe.vmoptions 文件,删掉即可,

  1. 重启后激活

    点击IDE菜单 “Help” -> “Register…” 或 “Configure” -> “Manage License…”
    支持两种注册方式:License server 和 Activation code:
    1). 选择License server方式,地址填入:http://jetbrains-license-server (应该会自动填上)

     或者点击按钮:"Discover Server"来自动填充地址。网络不佳的见第2种方式。

    2). 选择Activation code方式离线激活,请使用:ACTIVATION_CODE.txt 内的注册码激活

如果激活窗口一直弹出(error 1653219),请去hosts文件里移除jetbrains相关的项目
License key is in legacy format == Key invalid,表示agent配置未生效。
如果你需要自定义License name,请访问:https://zhile.io/custom-license.html
image.png
image.png
image.png

本文环境

可能之前小伙伴们用其他方式激活过,导致按照本文方法激活没有效果,下面是本文在激活时的环境。

  • hosts文件未做任何修改
  • idea版本 IntelliJ IDEA 2019.3.1

在以下IDE版本测试可成功激活(v3.0.3):

  • IntelliJ IDEA 2019.3.3及以下
  • AppCode 2019.3.5及以下
  • CLion 2019.3.4及以下
  • DataGrip 2019.3.3及以下
  • GoLand 2019.3.3及以下
  • PhpStorm 2019.3.3及以下
  • PyCharm 2019.3.3及以下
  • Rider 2019.3.4及以下
  • RubyMine 2019.3.3及以下
  • WebStorm 2019.3.3及以下

参考

Jetbrains系列产品2019.3.3最新激活方法[持续更新]

Maven私服搭建及使用# Maven私服搭建及使用

一、搭建环境

1. 安装包

安装包下载链接

当前服务器使用nexus 3.19.1-01

2. 安装步骤

具体步骤参考资料 Linux下使用Nexus创建maven私服

二、注意事项

密码错误

帐号: admin

当前服务器使用的版本的初始密码不是之前的 admin123

具体密码在 /nexus-data/admin.password 中 (明文未加密)

部署jar出现401权限错误

该pom文件的pom.xml文件需配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<distributionManagement>
<!-- 正式版 -->
<repository>
<!-- id和maven的相关id一致 -->
<id>nexus-releases</id>
<name>nexus-releases</name>
<url>http://jed:8081/repository/hadoop-hosted-test-repository/</url>
</repository>
<!-- 快照版 -->
<snapshotRepository>
<!-- id和maven的相关id一致 -->
<id>nexus-snapshot</id>
<name>nexus-snapshot</name>
<url>http://jed:8081/repository/hadoop-hosted-test-repository-snapshots/</url>
</snapshotRepository>
</distributionManagement>

maven的 settings.xml 需配置认证信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<servers>
<server>
<id>nexus-releases</id>
<username>hadoop</username>
<password>hadoop</password>
</server>
<server>
<id>nexus-snapshot</id>
<username>hadoop</username>
<password>hadoop</password>
</server>
</servers>

...

<mirror>
<id>dev-repository-group</id>
<mirrorOf>*</mirrorOf>
<name>dev-repository-group</name>
<url>http://192.168.8.123:8081/repository/dev-repository-group</url>
</mirror>
<mirror>
<id>dev-repository-hosted-snapshot</id>
<mirrorOf>*</mirrorOf>
<name>dev-repository-hosted-snapshot</name>
<url>http://192.168.8.123:8081/repository/dev-repository-snapshot</url>
</mirror>

参考资料

Linux下使用Nexus创建maven私服

额外参考 本地私服仓库nexus3.3.1使用手册

Docker 搭建Maven私服nexus 3.17初始密码登录不上问题/admin登陆不上问题

vue使用xlsx-populate读写Excel表格## 依赖

https://www.npmjs.com/package/xlsx-populate

读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 读取表格数据
readExcelFile(file) {
let _this = this;
this.tableData = [];
this.isCheck = true;
XlsxPopulate.fromDataAsync(file).then(workbook => {
let values = workbook.sheet(0).usedRange().value();
window.console.log(values);
}).catch(err => {
window.console.error(err);
_this.$message.error("读取文件错误");
// 设置表格加载状态
_this.tableLoading = false;
});
}

导出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* 导出
* @param data 导出数据
* @param fileName 文件名
* @param type 后缀名
*/
exportAccesses(data, fileName, type){
// 1.设计表头
let row1 = ["xxx","xxx","xxxx"]
data.unshift(row1);
let workbook = XlsxPopulate.fromBlankAsync().then(workbook => {
//获取第一个工作表
var sheet = workbook.sheet(0);
//设置值
sheet.cell("A1").value(data).style({
border: true
});
//设置单元格合并
sheet.range("A1:E1").merged(true)
//设置表头填充样式
for (let i = 1; i <= 2; i++) {
let cells = sheet.row(i)._cells;
for (let j = 1; j < cells.length; j++) {
cells[j].style("fill", "ddebf7");
}
}
//导出
return workbook.outputAsync().then(blob => {
type = undefined === type ? "xlsx" : type;
this.$fileUtils.saveFile(blob, fileName + "." + type);
})
}).catch(function (err) {
window.console.log(err.message || err);
throw err;
});
}

Navicat Premium版本:15
Navicat Keygen Patch版本: 5.6.0
下载地址

教程

  1. 安装 Navicat Premium
  2. 破解软件放在安装根目录
  3. 运行破解软件
  4. 点击 Patch
    Snipaste_20200331_165836.png
  5. 出现图中提示就是成功了,如果不是这个提示,卸载Navicat重装.
    image.png
  6. 启动 Navicat Premium
  7. 选择激活
  8. 点击 Generate 后就可以获取激活码
    image.png
  9. 点击激活按钮后会出现弹出框提示激活服务器不可用,选择手动激活
    image.png
  10. 请求码复制到激活软件的Request code 框内后点击 Generate获取激活码
    image.png
  11. 激活软件里生成的激活码会自动填入到Navicat Premium
  12. 点击激活即可
    image.png