This commit is contained in:
xiangwbs
2018-06-23 20:20:03 +08:00
parent ec4c6498e1
commit ff9e29e311
47 changed files with 925 additions and 914 deletions
@@ -21,18 +21,18 @@ public class CalendarDemo {
*/
calendar.set(Calendar.YEAR, 2008);// 年
calendar.set(Calendar.MONTH, 7);// 月从0开始,0表示1月
/*
* 设置日 对应的时间分量常用的: DATE:月中天 DAY_OF-MONTH:月中的天,与DATE一致
* DAY_OF_WEEK:周中的天,星期几 DAY_OF_YEAR:年中的天
*/
/*
* 设置日 对应的时间分量常用的: DATE:月中天 DAY_OF-MONTH:月中的天,与DATE一致
* DAY_OF_WEEK:周中的天,星期几 DAY_OF_YEAR:年中的天
*/
calendar.set(Calendar.DAY_OF_MONTH, 8);// 日
calendar.set(Calendar.HOUR_OF_DAY, 8);// 时
calendar.set(Calendar.MINUTE, 8);// 分
calendar.set(Calendar.SECOND, 8);// 秒
System.out.println(calendar.getTime());
/*
* int get(int field) 获取对应的分量的值
*/
/*
* int get(int field) 获取对应的分量的值
*/
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);// 获取年
int month = now.get(Calendar.MONTH) + 1;// 获取月+1
@@ -59,25 +59,25 @@ public class CalendarDemo {
now.set(Calendar.MONTH, 1);
System.out.println(now.getActualMaximum(Calendar.DAY_OF_MONTH));
/*
* 查看3年2个月零8天以后的日期?
*/
/*
* 查看3年2个月零8天以后的日期?
*/
Calendar nowTime = Calendar.getInstance();
System.out.println(nowTime.getTime());
nowTime.add(Calendar.YEAR, 3);
nowTime.add(Calendar.MONTH, 2);
nowTime.add(Calendar.DAY_OF_YEAR, 8);// 用DAY_OF_YEAR
System.out.println(nowTime.getTime());
/*
* 当遇到类似开发需求: 要求用户输入一个日期,然后对该日期进行一系列的运算 再将计算后的日期显示给用户时。 流程如下:
* 1:获取用户输入的日期字符串
* 2:使用SimpleDateFormat将其转换为Date
* 3:创建一个Calendar。使其表示Date表示的日期
* 4:使用Calendar根据需求计算时间
* 5:将Calendar转换为一个Date 6:使用SimpleDateFormal将Date转换为字符串后显示给用户
*/
/*
* 当遇到类似开发需求: 要求用户输入一个日期,然后对该日期进行一系列的运算 再将计算后的日期显示给用户时。 流程如下:
* 1:获取用户输入的日期字符串
* 2:使用SimpleDateFormat将其转换为Date
* 3:创建一个Calendar。使其表示Date表示的日期
* 4:使用Calendar根据需求计算时间
* 5:将Calendar转换为一个Date 6:使用SimpleDateFormal将Date转换为字符串后显示给用户
*/
}
}
@@ -16,7 +16,7 @@ import java.io.InputStream;
public class FileDemo {
public static void main(String[] args) throws IOException {
/*
*
*
* 文件
* 尽量使用相对路径
* 在eclipse中,"."当前目录,指的是
@@ -24,35 +24,35 @@ public class FileDemo {
*/
//创建文件对象
File file = new File("." + File.separator + "demo.txt");//创建文件对象,并不创建文件
if(!file.exists()){
if (!file.exists()) {
file.createNewFile(); //创建文件
}
if(file.exists()){
if (file.exists()) {
file.delete();//删除文件
}
String name = file.getName();//获取文件名
long length = file.length();//获取文件大小
long time = file.lastModified();//获取文件最后修改时间
//查看文件是否具有可运行,可读,可写的权限
boolean b=file.canExecute();
boolean b1=file.canRead();
boolean b2=file.canWrite();
boolean b = file.canExecute();
boolean b1 = file.canRead();
boolean b2 = file.canWrite();
boolean isDir = file.isDirectory();//是否为一个目录
boolean isFile = file.isFile();//是否为一个文件
boolean isHidden=file.isHidden();//是否为一个隐藏文件
boolean isHidden = file.isHidden();//是否为一个隐藏文件
/**
* 目录
*/
File dir=new File("demo");
File[] subs=dir.listFiles();//获取目录下的所有子项
if(!dir.exists()){
File dir = new File("demo");
File[] subs = dir.listFiles();//获取目录下的所有子项
if (!dir.exists()) {
dir.mkdir();
}else {
} else {
dir.delete();//空目录才能删除
}
File dirs =new File("a"+File.separator+"b"+File.separator+"c");
if(!dirs.exists()){
File dirs = new File("a" + File.separator + "b" + File.separator + "c");
if (!dirs.exists()) {
/*
* 在创建当前目录的同时将不存在的父目录一并创建出来
*/
@@ -22,6 +22,7 @@ import java.util.List;
public class FileUploadDemo {
/**
* 获取文件数据
*
* @param multipartFiles
* @return
*/
@@ -30,11 +31,11 @@ public class FileUploadDemo {
JSONObject materialInfo;
for (MultipartFile multipartFile : multipartFiles) {
if (!multipartFile.isEmpty()) {
materialInfo=new JSONObject();
materialInfo = new JSONObject();
String originName = multipartFile.getOriginalFilename();//原始名字
materialInfo.put("name",originName);
materialInfo.put("name", originName);
String fileType = originName.substring(originName.lastIndexOf(".") + 1);//获取文件后缀名
materialInfo.put("type",fileType);
materialInfo.put("type", fileType);
byte[] data;
try {
InputStream is = multipartFile.getInputStream();//文件输入流
@@ -45,7 +46,7 @@ public class FileUploadDemo {
throw new UtilException("读取数据错误");
}
String base64 = Base64.getEncoder().encodeToString(data);//对数据字节进行base64编码
materialInfo.put("data",base64);
materialInfo.put("data", base64);
list.add(materialInfo);
}
}
@@ -54,30 +55,31 @@ public class FileUploadDemo {
/**
* 采用file.Transto 来保存上传的文件
*
* @param multipartFile
*/
public void fileUpload(CommonsMultipartFile multipartFile) {
if (!multipartFile.isEmpty()) {
String name = multipartFile.getOriginalFilename();//原始名字
ClassPathResource file = new ClassPathResource("pic");
try {
String path = file.getFile().getAbsolutePath();
File targetFile = new File(path+ File.separator+name);
if (!targetFile.exists()) {
targetFile.createNewFile();
}
multipartFile.transferTo(targetFile);
} catch (IOException e) {
throw new UtilException("读取数据错误");
if (!multipartFile.isEmpty()) {
String name = multipartFile.getOriginalFilename();//原始名字
ClassPathResource file = new ClassPathResource("pic");
try {
String path = file.getFile().getAbsolutePath();
File targetFile = new File(path + File.separator + name);
if (!targetFile.exists()) {
targetFile.createNewFile();
}
multipartFile.transferTo(targetFile);
} catch (IOException e) {
throw new UtilException("读取数据错误");
}
}
}
public static void main(String[] args) throws Exception{
public static void main(String[] args) throws Exception {
ClassPathResource file = new ClassPathResource("pic");
String path = file.getFile().getAbsolutePath();
File targetFile = new File(path+ File.separator+"test.txt");
if(!targetFile.exists()){
File targetFile = new File(path + File.separator + "test.txt");
if (!targetFile.exists()) {
targetFile.createNewFile(); //创建文件
}
System.out.println("");
@@ -35,24 +35,24 @@ public class ForEachMap {
};
/*
* 遍历所有的key
* set<k> keySet()
* 该方法会将当前map中所有的key存入一个set集合后返回
* 那么遍历该集合就等于遍历类所有的key
*/
* set<k> keySet()
* 该方法会将当前map中所有的key存入一个set集合后返回
* 那么遍历该集合就等于遍历类所有的key
*/
Set<String> keySet = map.keySet();
for (String key : keySet) {
System.out.println(key);
}
/*
* 遍历每一组键值对(推荐)
* map中每一组键值对都是由map的内部类:
* java.util.map.entry的一个实例类表示的
* entry有两个方法:getkey getvalue 可以分别获取这一组键值对中的key和value
*
* Set<Entry> entrySet
* 该方法会将map中的每一组键对(entry实例)
* 存入一个set集合后返回
*/
* map中每一组键值对都是由map的内部类:
* java.util.map.entry的一个实例类表示的
* entry有两个方法:getkey getvalue 可以分别获取这一组键值对中的key和value
*
* Set<Entry> entrySet
* 该方法会将map中的每一组键对(entry实例)
* 存入一个set集合后返回
*/
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> e : entrySet) {
String key = e.getKey();
@@ -61,9 +61,9 @@ public class ForEachMap {
}
/*
* 遍历所有的value
* Collection values()
* 该方法会将当前map中所有的value存入一个集合后返回
*/
* Collection values()
* 该方法会将当前map中所有的value存入一个集合后返回
*/
Collection<Integer> values = map.values();
for (Integer value : values) {
System.out.println(value);
@@ -55,7 +55,7 @@ public class IODemo {
}
bis1.close();
bos1.close();
/*
* 字符流
* 读写单位是字符
@@ -52,15 +52,15 @@ public class Java8DateDemo {
LocalTime specificSecondTime = LocalTime.ofSecondOfDay(1);// 00:00:01
LocalDateTime dateTime = date.atTime(time);// Create LocalDateTime from
// LocalDate
// LocalDate
LocalDateTime today = LocalDateTime.now();// Current Date
today = LocalDateTime.of(LocalDate.now(), LocalTime.now());
LocalDateTime specificDate = LocalDateTime.of(2014, Month.JANUARY, 1,
10, 10, 30);// 2014-01-01T10:10:30
LocalDateTime todayKolkata1 = LocalDateTime.now(ZoneId
.of("Asia/Kolkata"));
int second=today.getSecond();//获取时间中的秒
int week=today.getDayOfWeek().getValue();//获取周几
int second = today.getSecond();//获取时间中的秒
int week = today.getDayOfWeek().getValue();//获取周几
/*
* 时钟
@@ -73,8 +73,8 @@ public class Java8DateDemo {
/*
*新旧日期转换
*/
Instant instant = new Date().toInstant();
Date dateee = Date.from(instant);
Instant instant = new Date().toInstant();
Date dateee = Date.from(instant);
/*
* 时间相差
@@ -4,26 +4,26 @@ import java.io.File;
/**
* 删除一个含有子项的目录
*
* @author xiangwb
*
* @author xiangwb
*/
public class RecursiveFIle {
public static void main(String[] args) {
File dir = new File("C:\\Users\\admin\\Desktop\\123");
deleteFile(dir);
}
/*
* 将给定的file表示的文件或目录删除
*/
public static void deleteFile(File f) {
if(f.isDirectory()){
//将该目录下的所有子项删除
File[] subs=f.listFiles();
for(File sub:subs){
deleteFile(sub);
}
}
f.delete();
}
public static void main(String[] args) {
File dir = new File("C:\\Users\\admin\\Desktop\\123");
deleteFile(dir);
}
/*
* 将给定的file表示的文件或目录删除
*/
public static void deleteFile(File f) {
if (f.isDirectory()) {
//将该目录下的所有子项删除
File[] subs = f.listFiles();
for (File sub : subs) {
deleteFile(sub);
}
}
f.delete();
}
}
@@ -29,8 +29,8 @@ public class ThreadSyncDemo {
Thread t2 = new Thread(s::buy);
t1.start();
t2.start();
/*
* 静态方法锁
*/
@@ -38,7 +38,7 @@ public class ThreadSyncDemo {
Thread tt2 = new Thread(ThreadSyncDemo::doSome);
tt1.start();
tt2.start();
/*
* 互斥
*/
@@ -3,6 +3,7 @@ package com.xwbing.demo;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
@@ -18,80 +19,78 @@ import org.dom4j.io.XMLWriter;
public class XmlDemo {
/**
*
* 功能描述:将doc对象(xml)写到文件中
* 作 者:xwb
* 创建时间:2017年2月16日 下午2:59:26
*
* @param doc
* @param xml
* @throws Exception
*/
private static void write2xml(Document doc, String fos) throws Exception {
FileOutputStream out = new FileOutputStream(fos);
// dom4j 提供类格式工具,可以输出时候对doc进行化妆,搞漂亮一些
OutputFormat fmt = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(out, fmt);// 格式
writer.write(doc);
writer.close();
}
/**
* 功能描述:将doc对象(xml)写到文件中
* 作 者:xwb
* 创建时间:2017年2月16日 下午2:59:26
*
* @param doc
* @param xml
* @throws Exception
*/
private static void write2xml(Document doc, String fos) throws Exception {
FileOutputStream out = new FileOutputStream(fos);
// dom4j 提供类格式工具,可以输出时候对doc进行化妆,搞漂亮一些
OutputFormat fmt = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(out, fmt);// 格式
writer.write(doc);
writer.close();
}
/**
*
* 功能描述: 读取XML文件到doc对象
* 作 者:xwb
* 创建时间:2017年2月16日 下午3:01:33
*
* @return
* @throws Exception
*/
private static Document readXml(String fis) throws Exception {
SAXReader reader = new SAXReader();
FileInputStream in = new FileInputStream(fis);
Document doc = reader.read(in);
return doc;
}
/**
* 功能描述: 读取XML文件到doc对象
* 作 者:xwb
* 创建时间:2017年2月16日 下午3:01:33
*
* @return
* @throws Exception
*/
private static Document readXml(String fis) throws Exception {
SAXReader reader = new SAXReader();
FileInputStream in = new FileInputStream(fis);
Document doc = reader.read(in);
return doc;
}
public static void main(String[] args) throws Exception {
Document doc = readXml("xmlDemo.xml");
System.out.println(doc.asXML() + "...............");
public static void main(String[] args) throws Exception {
Document doc = readXml("xmlDemo.xml");
System.out.println(doc.asXML() + "...............");
// doc 是全部的XML文件的内容
// doc 引用的是内存中的对象。
Element root = doc.getRootElement();// 获取xml的根元素,访问xml中数据的唯一入口
// 获取根元素下所有子元素,并遍历
List<Element> list = root.elements();
for (Element e2 : list) {
System.out.println(e2.getName());// 获取元素名字
System.out.println(e2.getText());// 获取元素内文本内容
}
// doc 是全部的XML文件的内容
// doc 引用的是内存中的对象。
Element root = doc.getRootElement();// 获取xml的根元素,访问xml中数据的唯一入口
// 获取根元素下所有子元素,并遍历
List<Element> list = root.elements();
for (Element e2 : list) {
System.out.println(e2.getName());// 获取元素名字
System.out.println(e2.getText());// 获取元素内文本内容
}
Element book = root.element("book");// 获取满足第一个条件的子元素
Element name = book.element("name");
name.setText("轶名名");// 修改元素内容
Attribute id = book.attribute("id");// 获取属性
System.out.println(id.getValue());
id.setValue("b3");// 修改属性
Element book = root.element("book");// 获取满足第一个条件的子元素
Element name = book.element("name");
name.setText("轶名名");// 修改元素内容
Attribute id = book.attribute("id");// 获取属性
System.out.println(id.getValue());
id.setValue("b3");// 修改属性
// 如果修改了doc 就能实现修改xml并写文件
// 为根元素添加子元素
Element newOne = root.addElement("book8");
newOne.addElement("name").setText("18岁给我一姑娘");
newOne.addAttribute("id", "b5");
newOne.addAttribute("lang", "中文");
// 如果修改了doc 就能实现修改xml并写文件
// 为根元素添加子元素
Element newOne = root.addElement("book8");
newOne.addElement("name").setText("18岁给我一姑娘");
newOne.addAttribute("id", "b5");
newOne.addAttribute("lang", "中文");
// 找到元素并且删除这个子元素
Element book1 = root.element("book8");
root.remove(book1);
write2xml(doc, "demo.xml");
// 找到元素并且删除这个子元素
Element book1 = root.element("book8");
root.remove(book1);
write2xml(doc, "demo.xml");
// 创建新的xml document对象
Document newDoc = DocumentHelper.createDocument();
// 为doc添加根元素
Element newRoot = newDoc.addElement("students");
newRoot.addElement("stu1");
newRoot.addElement("stu2");
write2xml(newDoc, "xmlDemoStu.xml");
}
// 创建新的xml document对象
Document newDoc = DocumentHelper.createDocument();
// 为doc添加根元素
Element newRoot = newDoc.addElement("students");
newRoot.addElement("stu1");
newRoot.addElement("stu2");
write2xml(newDoc, "xmlDemoStu.xml");
}
}
@@ -27,10 +27,10 @@ public class Client {
try {
/*
* 初始化socket需要传入两个参数: 1:远程计算机的ip地址 2:服务端应用程序在服务器上申请的端口
* 我们是通过ip地址找到服务器的计算机,在通过端口找到该机器上的服务端应用 程序,这个端口不是客户端决定的,而是服务端决定的
*
* 实例化socket的过程就是连接的过程 若服务端没有响应,这里会抛出异常
*/
* 我们是通过ip地址找到服务器的计算机,在通过端口找到该机器上的服务端应用 程序,这个端口不是客户端决定的,而是服务端决定的
*
* 实例化socket的过程就是连接的过程 若服务端没有响应,这里会抛出异常
*/
socket = new Socket("localhost", 7851);
} catch (Exception e) {
throw e;
@@ -44,8 +44,8 @@ public class Client {
Thread t = new Thread(handler);
t.start();
/*
* outputstream getoutputstream() 通过socket获取输出流,用来将数据发送至服务端
*/
* outputstream getoutputstream() 通过socket获取输出流,用来将数据发送至服务端
*/
Scanner sc = new Scanner(System.in);
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out, "utf-8");
@@ -35,9 +35,9 @@ public class Server {
public Server() throws Exception {
try {
/*
* 初始化serversocket并指定服务端口
* 该端口不能与其他应用程序冲突,否则会抛出异常
*/
* 初始化serversocket并指定服务端口
* 该端口不能与其他应用程序冲突,否则会抛出异常
*/
server = new ServerSocket(7851);
allOut = new ArrayList<>();
} catch (Exception e) {
@@ -79,12 +79,12 @@ public class Server {
*/
public void start() {
try {
/*
* scoket accept()
* serversocket提供了accept方法,该方法用于监听申请的服务端口,直到一个客户端连接
* 然后返回一个socket实例用于与该客户端通讯
* 这个方法是一个阻塞方法,直到客户端连接返回继续向下执行
*/
/*
* scoket accept()
* serversocket提供了accept方法,该方法用于监听申请的服务端口,直到一个客户端连接
* 然后返回一个socket实例用于与该客户端通讯
* 这个方法是一个阻塞方法,直到客户端连接返回继续向下执行
*/
while (true) {
System.out.println("等待客户端连接");
Socket socket = server.accept();
@@ -122,10 +122,10 @@ public class Server {
ClientHandler(Socket socket) {
this.socket = socket;
/*
* 通过socket可以获取远程计算机地址信息
* 对于服务端这边而言,远程计算机即客户端
*/
/*
* 通过socket可以获取远程计算机地址信息
* 对于服务端这边而言,远程计算机即客户端
*/
InetAddress address = socket.getInetAddress();
// 获取ip地址的字符串形式
host = address.getHostAddress();
@@ -137,31 +137,31 @@ public class Server {
try {
//通知所有客户该客户端上线了
sendMessage("[" + host + "]" + "上线了!");
/*
* 通过Socket获取输出流,用于将消息发送
* 给客户端
*/
/*
* 通过Socket获取输出流,用于将消息发送
* 给客户端
*/
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out, "utf-8");
pw = new PrintWriter(osw, true);
//将该客户端的输出流存入共享集合
addOut(pw);
/*
* inputstream getinputstream()
* socket提供的该方法用来获取一个输入流
* 通过该输入流可以读取远端计算机发送过来的数据
*/
/*
* inputstream getinputstream()
* socket提供的该方法用来获取一个输入流
* 通过该输入流可以读取远端计算机发送过来的数据
*/
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in, "utf-8");
BufferedReader br = new BufferedReader(isr);
//读取客户端发送过来的消息
String message;
/*
* 服务端接受客户端发送过来的消息时,由于客户端操作系统不同,
* 那么当客户端断开连接时的效果也不相同,
* 当windows的客户端断开连接后,br.readline方法会抛出异常
* 当linux的客户端断开连接后,br.readline会返回null
*/
/*
* 服务端接受客户端发送过来的消息时,由于客户端操作系统不同,
* 那么当客户端断开连接时的效果也不相同,
* 当windows的客户端断开连接后,br.readline方法会抛出异常
* 当linux的客户端断开连接后,br.readline会返回null
*/
while ((message = br.readLine()) != null) {
// System.out.println(host+"说:"+message);
// pw.println(host+"说:"+message);
@@ -169,17 +169,17 @@ public class Server {
}
} catch (Exception e) {
} finally {
/*
* 客户端与服务端断开后
*/
/*
* 客户端与服务端断开后
*/
try {
//将该客户端的输出流从共享集合中删除
removeOut(pw);
//下线
sendMessage("[" + host + "]" + "下线了!");
/*
* 通讯完毕后,应当socekt关闭,以释放底层资源
*/
/*
* 通讯完毕后,应当socekt关闭,以释放底层资源
*/
socket.close();
} catch (Exception e) {
e.printStackTrace();
@@ -11,53 +11,54 @@ import java.util.Date;
* 作者: xiangwb
*/
@Data
public class EmailModel {
public EmailModel(){
//默认值
}
/**
* 发送邮件协议名称,默认smtp
*/
private String protocol;
/**
* 发送邮箱地址
*/
private String fromEmail;
/**
* 邮箱密码
*/
private String password;
/**
* 接收邮箱
*/
private String toEmail;
/**
* 设置发送时间,默认是即时发送
*/
private Date sendTime;
/**
* 发送邮件服务器主机
*/
private String serverHost;
/**
* 发送邮件服务器端口
*/
private Integer serverPort;
/**
* 是否需要身份验证
*/
private boolean auth;
public class EmailModel {
public EmailModel() {
//默认值
}
/**
* 邮件主题
*/
private String subject;
/**
* 邮件内容
*/
private String centent;
/**
* 邮件附件的文件名
*/
private String[] attachFileNames;
/**
* 发送邮件协议名称,默认smtp
*/
private String protocol;
/**
* 发送邮箱地址
*/
private String fromEmail;
/**
* 邮箱密码
*/
private String password;
/**
* 接收邮箱
*/
private String toEmail;
/**
* 设置发送时间,默认是即时发送
*/
private Date sendTime;
/**
* 发送邮件服务器主机
*/
private String serverHost;
/**
* 发送邮件服务器端口
*/
private Integer serverPort;
/**
* 是否需要身份验证
*/
private boolean auth;
/**
* 邮件主题
*/
private String subject;
/**
* 邮件内容
*/
private String centent;
/**
* 邮件附件的文件名
*/
private String[] attachFileNames;
}
@@ -15,7 +15,7 @@ public class AliPayQueryResult extends AliPayBaseResult {
/**
* 交易支付状态
*/
private String tradeStatus;
private String tradeStatus;
public AliPayQueryResult(boolean success) {
this.setSuccess(success);
@@ -20,6 +20,7 @@ public class WxQueryResult extends WxBaseResult {
* 退款状态
*/
private String refundStatus;
public WxQueryResult(boolean success) {
this.setSuccess(success);
}
@@ -42,6 +42,7 @@ public class WxRefundParam {
this.refundFee = refundFee;
this.opUserId = opUserId;
}
public WxRefundParam(String transactionId, String outRefundNo, String opUserId, int totalFee, int refundFee) {
this.transactionId = transactionId;
this.outRefundNo = outRefundNo;
@@ -4,9 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.util.Date;
@@ -22,12 +19,12 @@ public class BaseEntity implements Serializable {
private static final long serialVersionUID = 8901948362657956187L;
@ApiModelProperty(value = "主键")
private String id;
@ApiModelProperty(value = "创建者",hidden = true)
@ApiModelProperty(value = "创建者", hidden = true)
private String creator;
@ApiModelProperty(value = "修改者",hidden = true)
@ApiModelProperty(value = "修改者", hidden = true)
private String modifier;
@ApiModelProperty(value = "创建时间",hidden = true)
@ApiModelProperty(value = "创建时间", hidden = true)
private Date createTime;
@ApiModelProperty(value = "修改时间",hidden = true)
@ApiModelProperty(value = "修改时间", hidden = true)
private Date modifiedTime;
}
@@ -4,9 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.Entity;
/**
* 说明: 权限
* 项目名称: boot-module-demo
@@ -20,18 +20,18 @@ import javax.validation.constraints.Pattern;
@Entity(name = "system_config")
public class SysConfig extends BaseEntity {
private static final long serialVersionUID = -7587016038432881980L;
@ApiModelProperty(value = "配置项的code",example = "email_config",required = true)
@ApiModelProperty(value = "配置项的code", example = "email_config", required = true)
@NotBlank(message = "配置项的code不能为空")
@Length(min = 1, max = 50, message = "code长度为1-50")
private String code;
@ApiModelProperty(value = "配置项的值",example = "{}",required = true)
@ApiModelProperty(value = "配置项的值", example = "{}", required = true)
@NotBlank(message = "配置项的value不能为空")
private String value;
@ApiModelProperty(value = "配置项的描述(名称)",example = "邮箱配置",required = true)
@ApiModelProperty(value = "配置项的描述(名称)", example = "邮箱配置", required = true)
@NotBlank(message = "配置项的name不能为空")
@Length(min = 1, max = 20, message = "value长度为1-20")
private String name;
@ApiModelProperty(value = "是否启用",example = "Y",required = true)
@ApiModelProperty(value = "是否启用", example = "Y", required = true)
@NotBlank(message = "是否启用不能为空")
@Pattern(regexp = "[Y|N]", message = "是否启用格式为Y|N")
private String enable;
@@ -4,8 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Entity;
/**
* 说明: 角色
* 项目名称: boot-module-demo
@@ -3,9 +3,6 @@ package com.xwbing.domain.entity.sys;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.Entity;
/**
* 说明: 角色权限关系
* 项目名称: boot-module-demo
@@ -3,9 +3,6 @@ package com.xwbing.domain.entity.sys;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.Entity;
/**
* 项目名称: boot-module-demo
* 创建时间: 2017/11/7 9:46
@@ -3,9 +3,6 @@ package com.xwbing.domain.entity.sys;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.Entity;
/**
* 说明: 用户角色关系
* 项目名称: boot-module-demo
@@ -16,13 +13,13 @@ import javax.persistence.Entity;
@Data
public class SysUserRole extends BaseEntity {
private static final long serialVersionUID = 7340808603856635810L;
public static String table="sys_user_role";
public static String table = "sys_user_role";
/**
* 用户主键
*/
private String userId;
private String userId;
/**
* 角色主键
*/
private String roleId;
private String roleId;
}
@@ -15,7 +15,7 @@ import java.util.List;
*/
@Data
@ApiModel
public class ListDataDictionaryVo extends RestMessageVo{
public class ListDataDictionaryVo extends RestMessageVo {
@ApiModelProperty(value = "返回数据")
private List<DataDictionary> data;
}
@@ -26,5 +26,6 @@ public class SysAuthVo extends SysAuthority {
e.printStackTrace();
}
}
private List<SysAuthVo> children;
}
@@ -14,7 +14,7 @@ import java.util.List;
public interface DataDictionaryRepository extends JpaRepository<DataDictionary, String> {
DataDictionary getByCode(String code);
DataDictionary getByCodeAndEnable(String code,String enable);
DataDictionary getByCodeAndEnable(String code, String enable);
List<DataDictionary> getByParentIdAndEnable(String parentId, String enable);
@@ -7,18 +7,18 @@ package com.xwbing.exception;
* 作者: xiangwb
*/
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 7493711492820795133L;
private static final long serialVersionUID = 7493711492820795133L;
public BusinessException(Throwable cause) {
super(cause);
}
public BusinessException(Throwable cause) {
super(cause);
}
public BusinessException(String message) {
super(message);
}
public BusinessException(String message) {
super(message);
}
public BusinessException(String message, Throwable cause) {
super(message, cause);
}
public BusinessException(String message, Throwable cause) {
super(message, cause);
}
}
@@ -13,6 +13,7 @@ import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 说明: 封装redis 缓存服务器服务接口
* 项目名称: boot-module-demo
@@ -26,7 +27,8 @@ public class RedisService {
private JedisPool jedisPool;
@Value("${redisCode}")
private String redisCode;
private final Logger logger= LoggerFactory.getLogger(RedisService.class);
private final Logger logger = LoggerFactory.getLogger(RedisService.class);
private RedisService() {
}
@@ -39,7 +41,7 @@ public class RedisService {
private Jedis getJedis() {
try {
return jedisPool.getResource();
}catch (Exception ex){
} catch (Exception ex) {
logger.error("redis连接失败==================================");
throw new BusinessException("redis连接失败");
}
@@ -384,9 +386,9 @@ public class RedisService {
String ping = jedis.ping();
logger.info("redis连接成功");
return ping;
} catch (BusinessException ex){//获取jedis客户端失败
} catch (BusinessException ex) {//获取jedis客户端失败
return "";
} catch (Exception ex){//ping失败
} catch (Exception ex) {//ping失败
logger.error("redis连接失败=================================");
return "";
} finally {
@@ -33,15 +33,15 @@ public class RedisStartupInit implements InitializingBean {
public void afterPropertiesSet() {
logger.info("redis启动===执行方法===刷新缓存==========================");
String ping = redisService.ping();
if(StringUtils.isNotEmpty(ping)){
if (StringUtils.isNotEmpty(ping)) {
redisService.set("test", "成功");
logger.info("redis获取测试数据:{}",redisService.get("test"));
logger.info("redis获取测试数据:{}", redisService.get("test"));
redisService.del("xwb");
boolean exists = redisService.exists("xwb");
logger.info("redis删除测试数据:{}",!exists);
logger.info("redis删除测试数据:{}", !exists);
Set<String> set = redisService.keys(redisCode + "*");
set.forEach(keyStr -> {
logger.info("删除缓存名称:{}",keyStr);
logger.info("删除缓存名称:{}", keyStr);
redisService.delInit(keyStr);
});
logger.info("redis初始化成功=================================");
@@ -87,8 +87,8 @@ public class ExpressDeliveryService {
if (infoVo != null) {
boolean success = infoVo.isSuccess();
logger.info("查询快递信息:{}", success);
if(success){
String status= StringUtils.isNotEmpty(infoVo.getState()) ? infoVo.getState() : "0";
if (success) {
String status = StringUtils.isNotEmpty(infoVo.getState()) ? infoVo.getState() : "0";
int statusValue = Integer.valueOf(status);
Optional<CommonEnum.ExpressStatusEnum> statusEnum = Arrays.stream(CommonEnum.ExpressStatusEnum.values()).filter(obj -> obj.getValue() == statusValue).findFirst();
statusEnum.ifPresent(expressStatusEnum -> infoVo.setDescribe(expressStatusEnum.getName()));
@@ -79,7 +79,7 @@ public class SysRoleAuthorityService {
if (deleteByIds != 0) {
result.setSuccess(true);
result.setMessage("批量删除成功");
}else {
} else {
result.setMessage("批量删除失败");
}
return result;
@@ -78,7 +78,7 @@ public class SysUserRoleService {
if (deleteByIds != 0) {
result.setSuccess(true);
result.setMessage("批量删除成功");
}else {
} else {
result.setMessage("批量删除失败");
}
return result;
@@ -34,8 +34,8 @@ public class EmailUtil {
throw new UtilException("发送邮件主机不能为空");
}
String protocol = emailModel.getProtocol();
if(protocol==null || "".equals(protocol.trim())){
protocol="smtp";
if (protocol == null || "".equals(protocol.trim())) {
protocol = "smtp";
}
props.setProperty("mail.transport.protocol", protocol);// 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", serverHost); // 发件人的邮箱的
@@ -63,12 +63,12 @@ public class EmailUtil {
message.setRecipients(Message.RecipientType.TO, toEmailList);
/*
* message.addRecipient(MimeMessage.RecipientType.TO,new
* InternetAddress("xx@xx.com")); // To: 增加收件人(单个)(可选)
* message.setRecipient(MimeMessage.RecipientType.CC,new
* InternetAddress("xx@xx.com")); // Cc: 抄送(可选)
* message.setRecipient(MimeMessage.RecipientType.BCC,new
* InternetAddress("xx@xx.com"));// Bcc: 密送(可选)
*/
* InternetAddress("xx@xx.com")); // To: 增加收件人(单个)(可选)
* message.setRecipient(MimeMessage.RecipientType.CC,new
* InternetAddress("xx@xx.com")); // Cc: 抄送(可选)
* message.setRecipient(MimeMessage.RecipientType.BCC,new
* InternetAddress("xx@xx.com"));// Bcc: 密送(可选)
*/
// Subject: 邮件主题
if (StringUtils.isEmpty(emailModel.getSubject())) {
throw new UtilException("邮件主题不能为空");
@@ -83,8 +83,8 @@ public class EmailUtil {
multipart.addBodyPart(html);
message.setContent(multipart);
Date sendTime = emailModel.getSendTime();
if(sendTime==null){
sendTime=new Date();
if (sendTime == null) {
sendTime = new Date();
}
message.setSentDate(sendTime);// 设置显示的发件时间
message.saveChanges();// 保存邮件
@@ -31,7 +31,8 @@ public class JsonResult {
/**
* 查询返回值为Object
* @param o Object/List
*
* @param o Object/List
* @param message
* @return
*/
@@ -47,6 +48,7 @@ public class JsonResult {
/**
* 增删改返回值为RestMessage
*
* @param rest
* @return
*/
@@ -61,6 +63,7 @@ public class JsonResult {
/**
* 直接返回错误提示
*
* @param error
* @return
*/
@@ -62,35 +62,37 @@ public class QRCodeUtil {
/**
* 生成默认尺寸带logo的二维码
*
* @param output 图片文件
* @param text 二维码内容
* @param text 二维码内容
* @param logoImg logo图片
* @param title 二维码图片描述
* @param title 二维码图片描述
*/
public static void createCodeLogo(File output,String text, InputStream logoImg, String title) {
createCodeLogo(output,text, logoImg, title, 200, 200,14);
public static void createCodeLogo(File output, String text, InputStream logoImg, String title) {
createCodeLogo(output, text, logoImg, title, 200, 200, 14);
}
/**
* 生成自定义尺寸带logo的二维码
* @param output 图片文件
* @param width 宽
* @param height 高
*
* @param output 图片文件
* @param width 宽
* @param height 高
* @param logoImg logo图片
* @param text 二维码内容
* @param title 二维码图片描述
* @param size 字体大小
* @param text 二维码内容
* @param title 二维码图片描述
* @param size 字体大小
*/
public static void createCodeLogo(File output,String text,InputStream logoImg, String title, int width, int height,int size) {
public static void createCodeLogo(File output, String text, InputStream logoImg, String title, int width, int height, int size) {
try {
internal._codeHeight = height;
internal._codeWidth = width;
internal._logoImg = logoImg;
internal._text = title;
internal._fontSize = size;
internal._output=output;
BitMatrix bitMatrix = internal.createCode(text);
internal.addMaterial(bitMatrix);
internal._output = output;
BitMatrix bitMatrix = internal.createCode(text);
internal.addMaterial(bitMatrix);
} catch (WriterException e) {
LOGGER.error(e.getMessage());
throw new UtilException("生成自定义尺寸带logo的二维码失败");
@@ -151,6 +153,7 @@ public class QRCodeUtil {
/**
* 根据内容生成二维码矩阵
*
* @param text
* @return
* @throws WriterException
@@ -208,6 +211,7 @@ public class QRCodeUtil {
/**
* 定位文字
*
* @param image
* @return
*/
@@ -227,6 +231,7 @@ public class QRCodeUtil {
/**
* 定位logo
*
* @param image
* @return
* @throws IOException
@@ -288,6 +293,7 @@ public class QRCodeUtil {
/**
* 二维码图片转化为输入流
*
* @param image
* @return
* @throws IOException
@@ -299,13 +305,13 @@ public class QRCodeUtil {
}
}
public static void main(String[] args) throws Exception{
public static void main(String[] args) throws Exception {
ClassPathResource file = new ClassPathResource("pic");
String path = file.getFile().getAbsolutePath();
File image = new File(path+File.separator+"logo.png");
FileInputStream logo=new FileInputStream(image);
File out = new File(path+File.separator+"QRCode.png");
createCodeLogo(out,"java生成的二維碼",logo,"logo");
File image = new File(path + File.separator + "logo.png");
FileInputStream logo = new FileInputStream(image);
File out = new File(path + File.separator + "QRCode.png");
createCodeLogo(out, "java生成的二維碼", logo, "logo");
}
}
@@ -13,103 +13,103 @@ import java.util.Random;
*/
public class CaptchaUtil {
// 随机产生的字符串
private static final String RANDOM_STRS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String FONT_NAME = "Fixedsys";
private Random random = new Random();
private static final int FONT_SIZE = 18;// 字体大小
private static final int WIDTH = 80;// 图片宽
private static final int HEIGHT = 25;// 图片高
private static final int LINE_NUM = 50;// 干扰线数量
private static final int STR_NUM = 4;// 随机产生字符数量
// 随机产生的字符串
private static final String RANDOM_STRS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String FONT_NAME = "Fixedsys";
private Random random = new Random();
private static final int FONT_SIZE = 18;// 字体大小
private static final int WIDTH = 80;// 图片宽
private static final int HEIGHT = 25;// 图片高
private static final int LINE_NUM = 50;// 干扰线数量
private static final int STR_NUM = 4;// 随机产生字符数量
/**
* 生成随机图片
*/
public BufferedImage genRandomCodeImage(StringBuffer randomCode) {
// BufferedImage类是具有缓冲区的Image类
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_BGR);
// 获取Graphics对象,便于对图像进行各种绘制操作
Graphics g = image.getGraphics();
// 设置背景色
g.setColor(getRandColor(200, 250));
// 填充矩形面积
g.fillRect(0, 0, WIDTH, HEIGHT);
// 设置干扰线的颜色
g.setColor(getRandColor(110, 120));
// 绘制干扰线
for (int i = 0; i <= LINE_NUM; i++) {
drowLine(g);
}
// 绘制随机字符
g.setFont(new Font(FONT_NAME, Font.PLAIN, FONT_SIZE));
for (int i = 1; i <= STR_NUM; i++) {
randomCode.append(drowString(g, i));
}
g.dispose();
return image;
}
/**
* 给定范围获得随机颜色
*/
private Color getRandColor(int fc, int bc) {
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
/**
* 生成随机图片
*/
public BufferedImage genRandomCodeImage(StringBuffer randomCode) {
// BufferedImage类是具有缓冲区的Image类
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_BGR);
// 获取Graphics对象,便于对图像进行各种绘制操作
Graphics g = image.getGraphics();
// 设置背景色
g.setColor(getRandColor(200, 250));
// 填充矩形面积
g.fillRect(0, 0, WIDTH, HEIGHT);
// 设置干扰线的颜色
g.setColor(getRandColor(110, 120));
// 绘制干扰线
for (int i = 0; i <= LINE_NUM; i++) {
drowLine(g);
}
// 绘制随机字符
g.setFont(new Font(FONT_NAME, Font.PLAIN, FONT_SIZE));
for (int i = 1; i <= STR_NUM; i++) {
randomCode.append(drowString(g, i));
}
g.dispose();
return image;
}
/**
* 绘制字符串
*/
private String drowString(Graphics g, int i) {
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
.nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRS
.length())));
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 16);
return rand;
}
/**
* 给定范围获得随机颜色
*/
private Color getRandColor(int fc, int bc) {
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
/**
* 绘制干扰线
*/
private void drowLine(Graphics g) {
int x = random.nextInt(WIDTH);
int y = random.nextInt(HEIGHT);
int x0 = random.nextInt(16);
int y0 = random.nextInt(16);
g.drawLine(x, y, x + x0, y + y0);
}
/**
* 绘制字符串
*/
private String drowString(Graphics g, int i) {
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
.nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRS
.length())));
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 16);
return rand;
}
/**
* 获取随机的字符
*/
private String getRandomString(int num) {
return String.valueOf(RANDOM_STRS.charAt(num));
}
/**
* 绘制干扰线
*/
private void drowLine(Graphics g) {
int x = random.nextInt(WIDTH);
int y = random.nextInt(HEIGHT);
int x0 = random.nextInt(16);
int y0 = random.nextInt(16);
g.drawLine(x, y, x + x0, y + y0);
}
public static void main(String[] args) {
CaptchaUtil tool = new CaptchaUtil();
StringBuffer code = new StringBuffer();
BufferedImage image = tool.genRandomCodeImage(code);
System.out.println("random code : " + code);
try {
// 将内存中的图片通过流动形式输出到客户端
ImageIO.write(image, "JPEG", new FileOutputStream(new File(
"random-code.jpg")));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取随机的字符
*/
private String getRandomString(int num) {
return String.valueOf(RANDOM_STRS.charAt(num));
}
public static void main(String[] args) {
CaptchaUtil tool = new CaptchaUtil();
StringBuffer code = new StringBuffer();
BufferedImage image = tool.genRandomCodeImage(code);
System.out.println("random code : " + code);
try {
// 将内存中的图片通过流动形式输出到客户端
ImageIO.write(image, "JPEG", new FileOutputStream(new File(
"random-code.jpg")));
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -1,5 +1,5 @@
/**
*
*
*/
package com.xwbing.util.wxpay;
@@ -12,67 +12,67 @@ import java.security.SignatureException;
public class MD5Signature {
public static String sign(String content, String key) throws Exception {
public static String sign(String content, String key) throws Exception {
String tosign = (content == null ? "" : content) + key;
String tosign = (content == null ? "" : content) + key;
System.out.println("signdata:" + tosign);
try {
return DigestUtils.md5Hex(getContentBytes(tosign, "utf-8"));
} catch (UnsupportedEncodingException e) {
throw new SignatureException("MD5签名[content = " + content + "; charset = utf-8" + "]发生异常!", e);
}
System.out.println("signdata:" + tosign);
try {
return DigestUtils.md5Hex(getContentBytes(tosign, "utf-8"));
} catch (UnsupportedEncodingException e) {
throw new SignatureException("MD5签名[content = " + content + "; charset = utf-8" + "]发生异常!", e);
}
}
}
public static boolean verify(String content, String sign, String key) throws Exception {
String tosign = (content == null ? "" : content) + key;
public static boolean verify(String content, String sign, String key) throws Exception {
String tosign = (content == null ? "" : content) + key;
try {
String mySign = DigestUtils.md5Hex(getContentBytes(tosign, "utf-8"));
try {
String mySign = DigestUtils.md5Hex(getContentBytes(tosign, "utf-8"));
return StringUtils.equals(mySign, sign) ? true : false;
} catch (UnsupportedEncodingException e) {
throw new SignatureException("MD5验证签名[content = " + content + "; charset =utf-8 " + "; signature = " + sign + "]发生异常!", e);
}
}
return StringUtils.equals(mySign, sign) ? true : false;
} catch (UnsupportedEncodingException e) {
throw new SignatureException("MD5验证签名[content = " + content + "; charset =utf-8 " + "; signature = " + sign + "]发生异常!", e);
}
}
public static boolean verify(String content, String sign, String key, String charset) throws Exception {
String tosign = (content == null ? "" : content) + key;
try {
String mySign = DigestUtils.md5Hex(getContentBytes(tosign, charset));
public static boolean verify(String content, String sign, String key, String charset) throws Exception {
String tosign = (content == null ? "" : content) + key;
try {
String mySign = DigestUtils.md5Hex(getContentBytes(tosign, charset));
return StringUtils.equals(mySign, sign) ? true : false;
} catch (UnsupportedEncodingException e) {
throw new SignatureException("MD5验证签名[content = " + content + "; charset =" + charset + "; signature = " + sign + "]发生异常!", e);
}
}
return StringUtils.equals(mySign, sign) ? true : false;
} catch (UnsupportedEncodingException e) {
throw new SignatureException("MD5验证签名[content = " + content + "; charset =" + charset + "; signature = " + sign + "]发生异常!", e);
}
}
/**
* @param content
* @param charset
* @return
* @throws SignatureException
* @throws UnsupportedEncodingException
*/
protected static byte[] getContentBytes(String content, String charset) throws UnsupportedEncodingException {
if (StringUtils.isEmpty(charset)) {
return content.getBytes();
}
/**
* @param content
* @param charset
* @return
* @throws SignatureException
* @throws UnsupportedEncodingException
*/
protected static byte[] getContentBytes(String content, String charset) throws UnsupportedEncodingException {
if (StringUtils.isEmpty(charset)) {
return content.getBytes();
}
return content.getBytes(charset);
}
return content.getBytes(charset);
}
public static void main(String[] args) {
try {
String str = MD5Signature.sign("123455", "666666666666666");
System.out.println("qqq:" + str);
System.out.println(MD5Signature.verify("123455", "6edd55a3421c6324db29690dbc334666", "666666666666666"));
public static void main(String[] args) {
try {
String str = MD5Signature.sign("123455", "666666666666666");
System.out.println("qqq:" + str);
System.out.println(MD5Signature.verify("123455", "6edd55a3421c6324db29690dbc334666", "666666666666666"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@@ -8,62 +8,60 @@ import java.security.NoSuchAlgorithmException;
* 功能:支付宝MD5加密处理核心文件,不需要修改 版本:3.1 修改日期:2010-11-01 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个
* */
*/
public class Md5Encrypt {
/**
* Used building output as Hex
*/
private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/**
* Used building output as Hex
*/
private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/**
* 对字符串进行MD5加密
*
* @param text
* 明文
*
* @return 密文
*/
public static String md5(String text) {
MessageDigest msgDigest = null;
/**
* 对字符串进行MD5加密
*
* @param text 明文
* @return 密文
*/
public static String md5(String text) {
MessageDigest msgDigest = null;
try {
msgDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("System doesn't support MD5 algorithm.");
}
try {
msgDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("System doesn't support MD5 algorithm.");
}
try {
msgDigest.update(text.getBytes("utf-8")); // 注意改接口是按照指定编码形式签名
try {
msgDigest.update(text.getBytes("utf-8")); // 注意改接口是按照指定编码形式签名
} catch (UnsupportedEncodingException e) {
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("System doesn't support your EncodingException.");
throw new IllegalStateException("System doesn't support your EncodingException.");
}
}
byte[] bytes = msgDigest.digest();
byte[] bytes = msgDigest.digest();
String md5Str = new String(encodeHex(bytes));
String md5Str = new String(encodeHex(bytes));
return md5Str;
}
return md5Str;
}
public static char[] encodeHex(byte[] data) {
public static char[] encodeHex(byte[] data) {
int l = data.length;
int l = data.length;
char[] out = new char[l << 1];
char[] out = new char[l << 1];
// two characters form the hex value.
for (int i = 0, j = 0; i < l; i++) {
out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]];
}
// two characters form the hex value.
for (int i = 0, j = 0; i < l; i++) {
out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]];
}
return out;
}
return out;
}
}
@@ -6,23 +6,24 @@ import java.util.Random;
* Created by drore-wzm on 2015/11/23.
*/
public class RandomKit {
static String[] la_arrs={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","S","X","Y","Z","0","1","2","3","4","5","6","7","8","9"};
static String[] la_arrs = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "S", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
/****
* 生成len个长度的随机字符
* @param len
* @return
*/
public static synchronized String buildRandom(int len){
if (len<=0) {
public static synchronized String buildRandom(int len) {
if (len <= 0) {
throw new RuntimeException("参数异常!!!");
}
StringBuffer random=new StringBuffer();
StringBuffer random = new StringBuffer();
for (int i = 0; i < len; i++) {
random.append(la_arrs[new Random().nextInt(la_arrs.length)]);
}
return random.toString();
}
public static void main(String[] args) {
System.out.println(buildRandom(32));
}
@@ -3,210 +3,225 @@ package com.xwbing.util.wxpay;
import java.security.MessageDigest;
public class SHA1 {
private final int[] abcde = {
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
};
private final int[] abcde = {
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
};
// 摘要数据存储数组
private int[] digestInt = new int[5];
private int[] digestInt = new int[5];
// 计算过程中的临时数据存储数组
private int[] tmpData = new int[80];
private int[] tmpData = new int[80];
// 计算sha-1摘要
private int process_input_bytes(byte[] bytedata) {
private int process_input_bytes(byte[] bytedata) {
// 初试化常量
System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
// 格式化输入字节数组,补10及长度数据
byte[] newbyte = byteArrayFormatData(bytedata);
byte[] newbyte = byteArrayFormatData(bytedata);
// 获取数据摘要计算的数据单元个数
int MCount = newbyte.length / 64;
int MCount = newbyte.length / 64;
// 循环对每个数据单元进行摘要计算
for (int pos = 0; pos < MCount; pos++) {
for (int pos = 0; pos < MCount; pos++) {
// 将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中
for (int j = 0; j < 16; j++) {
tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4));
}
for (int j = 0; j < 16; j++) {
tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4));
}
// 摘要计算函数
encrypt();
}
return 20;
}
encrypt();
}
return 20;
}
// 格式化输入字节数组格式
private byte[] byteArrayFormatData(byte[] bytedata) {
private byte[] byteArrayFormatData(byte[] bytedata) {
// 补0数量
int zeros = 0;
int zeros = 0;
// 补位后总位数
int size = 0;
int size = 0;
// 原始数据长度
int n = bytedata.length;
int n = bytedata.length;
// 模64后的剩余位数
int m = n % 64;
int m = n % 64;
// 计算添加0的个数以及添加10后的总长度
if (m < 56) {
zeros = 55 - m;
size = n - m + 64;
} else if (m == 56) {
zeros = 63;
size = n + 8 + 64;
} else {
zeros = 63 - m + 56;
size = (n + 64) - m + 64;
}
if (m < 56) {
zeros = 55 - m;
size = n - m + 64;
} else if (m == 56) {
zeros = 63;
size = n + 8 + 64;
} else {
zeros = 63 - m + 56;
size = (n + 64) - m + 64;
}
// 补位后生成的新数组内容
byte[] newbyte = new byte[size];
byte[] newbyte = new byte[size];
// 复制数组的前面部分
System.arraycopy(bytedata, 0, newbyte, 0, n);
System.arraycopy(bytedata, 0, newbyte, 0, n);
// 获得数组Append数据元素的位置
int l = n;
int l = n;
// 补1操作
newbyte[l++] = (byte) 0x80;
newbyte[l++] = (byte) 0x80;
// 补0操作
for (int i = 0; i < zeros; i++) {
newbyte[l++] = (byte) 0x00;
}
for (int i = 0; i < zeros; i++) {
newbyte[l++] = (byte) 0x00;
}
// 计算数据长度,补数据长度位共8字节,长整型
long N = (long) n * 8;
byte h8 = (byte) (N & 0xFF);
byte h7 = (byte) ((N >> 8) & 0xFF);
byte h6 = (byte) ((N >> 16) & 0xFF);
byte h5 = (byte) ((N >> 24) & 0xFF);
byte h4 = (byte) ((N >> 32) & 0xFF);
byte h3 = (byte) ((N >> 40) & 0xFF);
byte h2 = (byte) ((N >> 48) & 0xFF);
byte h1 = (byte) (N >> 56);
newbyte[l++] = h1;
newbyte[l++] = h2;
newbyte[l++] = h3;
newbyte[l++] = h4;
newbyte[l++] = h5;
newbyte[l++] = h6;
newbyte[l++] = h7;
newbyte[l++] = h8;
return newbyte;
}
private int f1(int x, int y, int z) {
return (x & y) | (~x & z);
}
private int f2(int x, int y, int z) {
return x ^ y ^ z;
}
private int f3(int x, int y, int z) {
return (x & y) | (x & z) | (y & z);
}
private int f4(int x, int y) {
return (x << y) | x >>> (32 - y);
}
long N = (long) n * 8;
byte h8 = (byte) (N & 0xFF);
byte h7 = (byte) ((N >> 8) & 0xFF);
byte h6 = (byte) ((N >> 16) & 0xFF);
byte h5 = (byte) ((N >> 24) & 0xFF);
byte h4 = (byte) ((N >> 32) & 0xFF);
byte h3 = (byte) ((N >> 40) & 0xFF);
byte h2 = (byte) ((N >> 48) & 0xFF);
byte h1 = (byte) (N >> 56);
newbyte[l++] = h1;
newbyte[l++] = h2;
newbyte[l++] = h3;
newbyte[l++] = h4;
newbyte[l++] = h5;
newbyte[l++] = h6;
newbyte[l++] = h7;
newbyte[l++] = h8;
return newbyte;
}
private int f1(int x, int y, int z) {
return (x & y) | (~x & z);
}
private int f2(int x, int y, int z) {
return x ^ y ^ z;
}
private int f3(int x, int y, int z) {
return (x & y) | (x & z) | (y & z);
}
private int f4(int x, int y) {
return (x << y) | x >>> (32 - y);
}
// 单元摘要计算函数
private void encrypt() {
for (int i = 16; i <= 79; i++) {
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^
tmpData[i - 16], 1);
}
int[] tmpabcde = new int[5];
for (int i1 = 0; i1 < tmpabcde.length; i1++) {
tmpabcde[i1] = digestInt[i1];
}
for (int j = 0; j <= 19; j++) {
int tmp = f4(tmpabcde[0], 5) +
f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[j] + 0x5a827999;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int k = 20; k <= 39; k++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[k] + 0x6ed9eba1;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int l = 40; l <= 59; l++) {
int tmp = f4(tmpabcde[0], 5) +
f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[l] + 0x8f1bbcdc;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int m = 60; m <= 79; m++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[m] + 0xca62c1d6;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int i2 = 0; i2 < tmpabcde.length; i2++) {
digestInt[i2] = digestInt[i2] + tmpabcde[i2];
}
for (int n = 0; n < tmpData.length; n++) {
tmpData[n] = 0;
}
}
private void encrypt() {
for (int i = 16; i <= 79; i++) {
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^
tmpData[i - 16], 1);
}
int[] tmpabcde = new int[5];
for (int i1 = 0; i1 < tmpabcde.length; i1++) {
tmpabcde[i1] = digestInt[i1];
}
for (int j = 0; j <= 19; j++) {
int tmp = f4(tmpabcde[0], 5) +
f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[j] + 0x5a827999;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int k = 20; k <= 39; k++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[k] + 0x6ed9eba1;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int l = 40; l <= 59; l++) {
int tmp = f4(tmpabcde[0], 5) +
f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[l] + 0x8f1bbcdc;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int m = 60; m <= 79; m++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[m] + 0xca62c1d6;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int i2 = 0; i2 < tmpabcde.length; i2++) {
digestInt[i2] = digestInt[i2] + tmpabcde[i2];
}
for (int n = 0; n < tmpData.length; n++) {
tmpData[n] = 0;
}
}
// 4字节数组转换为整数
private int byteArrayToInt(byte[] bytedata, int i) {
return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16) |
((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);
}
private int byteArrayToInt(byte[] bytedata, int i) {
return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16) |
((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);
}
// 整数转换为4字节数组
private void intToByteArray(int intValue, byte[] byteData, int i) {
byteData[i] = (byte) (intValue >>> 24);
byteData[i + 1] = (byte) (intValue >>> 16);
byteData[i + 2] = (byte) (intValue >>> 8);
byteData[i + 3] = (byte) intValue;
}
private void intToByteArray(int intValue, byte[] byteData, int i) {
byteData[i] = (byte) (intValue >>> 24);
byteData[i + 1] = (byte) (intValue >>> 16);
byteData[i + 2] = (byte) (intValue >>> 8);
byteData[i + 3] = (byte) intValue;
}
// 将字节转换为十六进制字符串
private static String byteToHexString(byte ib) {
char[] Digit = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
'D', 'E', 'F'
};
char[] ob = new char[2];
ob[0] = Digit[(ib >>> 4) & 0X0F];
ob[1] = Digit[ib & 0X0F];
String s = new String(ob);
return s;
}
private static String byteToHexString(byte ib) {
char[] Digit = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
'D', 'E', 'F'
};
char[] ob = new char[2];
ob[0] = Digit[(ib >>> 4) & 0X0F];
ob[1] = Digit[ib & 0X0F];
String s = new String(ob);
return s;
}
// 将字节数组转换为十六进制字符串
private static String byteArrayToHexString(byte[] bytearray) {
String strDigest = "";
for (int i = 0; i < bytearray.length; i++) {
strDigest += byteToHexString(bytearray[i]);
}
return strDigest;
}
private static String byteArrayToHexString(byte[] bytearray) {
String strDigest = "";
for (int i = 0; i < bytearray.length; i++) {
strDigest += byteToHexString(bytearray[i]);
}
return strDigest;
}
// 计算sha-1摘要,返回相应的字节数组
public byte[] getDigestOfBytes(byte[] byteData) {
process_input_bytes(byteData);
byte[] digest = new byte[20];
for (int i = 0; i < digestInt.length; i++) {
intToByteArray(digestInt[i], digest, i * 4);
}
return digest;
}
public byte[] getDigestOfBytes(byte[] byteData) {
process_input_bytes(byteData);
byte[] digest = new byte[20];
for (int i = 0; i < digestInt.length; i++) {
intToByteArray(digestInt[i], digest, i * 4);
}
return digest;
}
// 计算sha-1摘要,返回相应的十六进制字符串
public String getDigestOfString(byte[] byteData) {
return byteArrayToHexString(getDigestOfBytes(byteData));
}
public static void main(String[] args) {
String data = "123456";
System.out.println(data);
public String getDigestOfString(byte[] byteData) {
return byteArrayToHexString(getDigestOfBytes(byteData));
}
public static void main(String[] args) {
String data = "123456";
System.out.println(data);
String digest = new SHA1().getDigestOfString(data.getBytes());
System.out.println(digest);
// System.out.println( ToMD5.convertSHA1(data).toUpperCase());
// System.out.println( ToMD5.convertSHA1(data).toUpperCase());
}
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
@@ -217,6 +232,7 @@ public class SHA1 {
}
return buf.toString();
}
public static String encode(String str) {
if (str == null) {
return null;
@@ -15,11 +15,11 @@ public class WxSignKit {
* @param params
* @return
*/
public static String buildJsApiSign(Map<String, String> params){
public static String buildJsApiSign(Map<String, String> params) {
StringBuffer sb = new StringBuffer();
Map<String, String> result = paramsFilter(params);
String prestr = createLinkString(result); // 把数组所有元素,按照“参数参数值”的模式拼接成字符串
String encodeKey= SHA1.encode(prestr);
String encodeKey = SHA1.encode(prestr);
return encodeKey;
}
@@ -36,9 +36,9 @@ public class WxSignKit {
public static String buildSign(Map<String, String> params, String key) {
Map<String, String> result = paramsFilter(params);
String prestr = createLinkString(result); // 把数组所有元素,按照“参数参数值”的模式拼接成字符串
System.out.println(prestr+"===========");
prestr = prestr +"&key="+ key; // 把接口密钥+拼接后的字符串直接连接起来
System.out.println("==========="+prestr+"===========");
System.out.println(prestr + "===========");
prestr = prestr + "&key=" + key; // 把接口密钥+拼接后的字符串直接连接起来
System.out.println("===========" + prestr + "===========");
String mysign = Md5Encrypt.md5(prestr);
if (mysign != null) {
mysign = mysign.toUpperCase();
@@ -71,21 +71,20 @@ public class WxSignKit {
/**
* 把数组所有元素排序,并按照“参数参数值”的模式拼接成字符串
*
* @param params
* 需要排序并参与字符拼接的参数组
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
private static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String prestr = "";
StringBuffer sb=new StringBuffer();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
sb.append(key).append("=").append(value);
prestr = prestr + key +"="+ value+"&";
if (i<keys.size()-1) {
prestr = prestr + key + "=" + value + "&";
if (i < keys.size() - 1) {
sb.append("&");
}
}
@@ -1,5 +1,4 @@
###payConfig###
###wx pay set start##
wx.apiKey=FJDKLAJxfsldkjf354fsalfjdlksfafd
wx.appId=wx024418cfeab498fc
@@ -9,8 +8,6 @@ wx.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
wx.orderQueryUrl=https://api.mch.weixin.qq.com/secapi/pay/orderquery
wx.refundQueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
###wx pay set end###
###payAlipay pay set start##
aliPay.appId=2016072801676318
aliPay.requestUrl=https://openapi.alipay.com/gateway.do
@@ -32,17 +32,18 @@ public class DispatcherServletConfig extends WebMvcConfigurerAdapter {
private boolean loginInterceptorEnable;
@Value("${urlPermissionsInterceptorEnable}")
private boolean urlPermissionsInterceptorEnable;
/***
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
if(loginInterceptorEnable){
if (loginInterceptorEnable) {
log.info("注册登录拦截器LoginInterceptor ======================= ");
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login");
}
if(urlPermissionsInterceptorEnable){
if (urlPermissionsInterceptorEnable) {
log.info("注册权限拦截器UrlPermissionsInterceptor ======================= ");
registry.addInterceptor(urlPermissionsInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login");
}
@@ -39,7 +39,7 @@ public class CommonControl {
@LogInfo("上传文件")
@PostMapping("upload")
public JSONObject upload(@ApiParam(value = "文件",required = true) MultipartFile file) {
public JSONObject upload(@ApiParam(value = "文件", required = true) MultipartFile file) {
RestMessage restMessage = commonService.upload(file);
return JsonResult.toJSONObj(restMessage);
}
@@ -103,7 +103,7 @@ public class GlobalExceptionHandler {
*
* @param request
* @param response
* @param ex BindException
* @param ex BindException
* @return
*/
@ExceptionHandler(value = BindException.class)
+200 -200
View File
@@ -46,215 +46,215 @@ under the License.
<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
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
-->
<localRepository>E:\apache-maven-3.3.9\repo</localRepository>
<!-- interactiveMode
| This will determine whether maven prompts you when it needs input. If set to false,
| maven will use a sensible default value, perhaps based on some rest setting, for
| the parameter in question.
|
| Default: true
<interactiveMode>true</interactiveMode>
-->
<!-- offline
| Determines whether maven should attempt to connect to the network when executing a build.
| This will have an effect on artifact downloads, artifact deployment, and others.
|
| Default: false
<offline>false</offline>
-->
<!-- pluginGroups
| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
|-->
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
-->
</pluginGroups>
<localRepository>E:\apache-maven-3.3.9\repo</localRepository>
<!-- proxies
| This is a list of proxies which can be used on this machine to connect to the network.
| Unless otherwise specified (by system property or command-line switch), the first proxy
| specification in this list marked as active will be used.
|-->
<proxies>
<!-- proxy
| Specification for one proxy, to be used in connecting to the network.
<!-- interactiveMode
| This will determine whether maven prompts you when it needs input. If set to false,
| maven will use a sensible default value, perhaps based on some rest setting, for
| the parameter in question.
|
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
</proxies>
<!-- servers
| This is a list of authentication profiles, keyed by the server-id used within the system.
| Authentication profiles can be used whenever maven must make a connection to a remote server.
|-->
<servers>
<!-- server
| Specifies the authentication information to use when connecting to a particular server, identified by
| a unique name within the system (referred to by the 'id' attribute below).
|
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
| used together.
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
| Default: true
<interactiveMode>true</interactiveMode>
-->
<!-- Another sample, using keys to authenticate.
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
<!-- offline
| Determines whether maven should attempt to connect to the network when executing a build.
| This will have an effect on artifact downloads, artifact deployment, and others.
|
| Default: false
<offline>false</offline>
-->
<!-- 私服仓库认证 匹配对应id -->
<server>
<id>nexus-drore-team-3rd</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<!-- mirrors
| This is a list of mirrors to be used in downloading artifacts from remote repositories.
|
| It works like this: a POM may declare a repository to use in resolvincentralg certain artifacts.
| However, this repository may have problems with heavy traffic at times, so people have mirrored
| it to several places.
|
| That repository definition will have a unique id, so we can create a mirror reference for that
| repository, to be used as an alternate download site. The mirror site will be the preferred
| server for that repository.
|-->
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
-->
<!-- 给定仓库的下载镜像 -->
<mirror>
<id>nexus</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>*</mirrorOf> <!-- *代表所有仓库,central代表中央仓库 -->
</mirror>
</mirrors>
<!-- pluginGroups
| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
|-->
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups>
<!-- profiles
| This is a list of profiles which can be activated in a variety of ways, and which can modify
| the build process. Profiles provided in the settings.xml are intended to provide local machine-
| specific paths and repository locations which allow the build to work in the local environment.
|
| For example, if you have an integration testing plugin - like cactus - that needs to know where
| your Tomcat instance is installed, you can provide a variable here such that the variable is
| dereferenced during the build process to configure the cactus plugin.
|
| As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
| section of this document (settings.xml) - will be discussed later. Another way essentially
| relies on the detection of a system property, either matching a particular value for the property,
| or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
| value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
| Finally, the list of active profiles can be specified directly from the command line.
|
| NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
| repositories, plugin repositories, and free-form properties to be used as configuration
| variables for plugins in the POM.
|
|-->
<profiles>
<!-- profile
| Specifies a set of introductions to the build process, to be activated using one or more of the
| mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/>
| or the command line, profiles have to have an ID that is unique.
|
| An encouraged best practice for profile identification is to use a consistent naming convention
| for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.
| This will make it more intuitive to understand what the set of introduced profiles is attempting
| to accomplish, particularly when you only have a list of profile id's for debug.
|
| This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.
-->
<!-- 全局jdk配置 -->
<profile>
<id>jdk1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<!--
| Here is another profile, activated by the system property 'target-env' with a value of 'dev',
| which provides a specific path to the Tomcat instance. To use this, your plugin configuration
| might hypothetically look like:
|
| ...
| <plugin>
| <groupId>org.myco.myplugins</groupId>
| <artifactId>myplugin</artifactId>
|
| <configuration>
| <tomcatLocation>${tomcatPath}</tomcatLocation>
| </configuration>
| </plugin>
| ...
|
| NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
| anything, you could just leave off the <value/> inside the activation-property.
|
<profile>
<id>env-dev</id>
<!-- proxies
| This is a list of proxies which can be used on this machine to connect to the network.
| Unless otherwise specified (by system property or command-line switch), the first proxy
| specification in this list marked as active will be used.
|-->
<proxies>
<!-- proxy
| Specification for one proxy, to be used in connecting to the network.
|
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
</proxies>
<activation>
<property>
<name>target-env</name>
<value>dev</value>
</property>
</activation>
<!-- servers
| This is a list of authentication profiles, keyed by the server-id used within the system.
| Authentication profiles can be used whenever maven must make a connection to a remote server.
|-->
<servers>
<!-- server
| Specifies the authentication information to use when connecting to a particular server, identified by
| a unique name within the system (referred to by the 'id' attribute below).
|
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
| used together.
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
-->
<properties>
<tomcatPath>/path/to/tomcat/instance</tomcatPath>
</properties>
</profile>
<!-- Another sample, using keys to authenticate.
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
-->
<!-- 私服仓库认证 匹配对应id -->
<server>
<id>nexus-drore-team-3rd</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<!-- mirrors
| This is a list of mirrors to be used in downloading artifacts from remote repositories.
|
| It works like this: a POM may declare a repository to use in resolvincentralg certain artifacts.
| However, this repository may have problems with heavy traffic at times, so people have mirrored
| it to several places.
|
| That repository definition will have a unique id, so we can create a mirror reference for that
| repository, to be used as an alternate download site. The mirror site will be the preferred
| server for that repository.
|-->
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
-->
<!-- 给定仓库的下载镜像 -->
<mirror>
<id>nexus</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>*</mirrorOf> <!-- *代表所有仓库,central代表中央仓库 -->
</mirror>
</mirrors>
<!-- profiles
| This is a list of profiles which can be activated in a variety of ways, and which can modify
| the build process. Profiles provided in the settings.xml are intended to provide local machine-
| specific paths and repository locations which allow the build to work in the local environment.
|
| For example, if you have an integration testing plugin - like cactus - that needs to know where
| your Tomcat instance is installed, you can provide a variable here such that the variable is
| dereferenced during the build process to configure the cactus plugin.
|
| As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
| section of this document (settings.xml) - will be discussed later. Another way essentially
| relies on the detection of a system property, either matching a particular value for the property,
| or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
| value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
| Finally, the list of active profiles can be specified directly from the command line.
|
| NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
| repositories, plugin repositories, and free-form properties to be used as configuration
| variables for plugins in the POM.
|
|-->
<profiles>
<!-- profile
| Specifies a set of introductions to the build process, to be activated using one or more of the
| mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/>
| or the command line, profiles have to have an ID that is unique.
|
| An encouraged best practice for profile identification is to use a consistent naming convention
| for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.
| This will make it more intuitive to understand what the set of introduced profiles is attempting
| to accomplish, particularly when you only have a list of profile id's for debug.
|
| This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.
-->
<!-- 全局jdk配置 -->
<profile>
<id>jdk1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<!--
| Here is another profile, activated by the system property 'target-env' with a value of 'dev',
| which provides a specific path to the Tomcat instance. To use this, your plugin configuration
| might hypothetically look like:
|
| ...
| <plugin>
| <groupId>org.myco.myplugins</groupId>
| <artifactId>myplugin</artifactId>
|
| <configuration>
| <tomcatLocation>${tomcatPath}</tomcatLocation>
| </configuration>
| </plugin>
| ...
|
| NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
| anything, you could just leave off the <value/> inside the activation-property.
|
<profile>
<id>env-dev</id>
<activation>
<property>
<name>target-env</name>
<value>dev</value>
</property>
</activation>
<properties>
<tomcatPath>/path/to/tomcat/instance</tomcatPath>
</properties>
</profile>
-->
</profiles>
<!-- activeProfiles
| List of profiles that are active for all builds.
|
<activeProfiles>
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
-->
</profiles>
<!-- activeProfiles
| List of profiles that are active for all builds.
|
<activeProfiles>
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
-->
</settings>
@@ -1 +1 @@
var basePath="http://127.0.0.1:8080/";
var basePath = "http://127.0.0.1:8080/";
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome to the world</title>
<meta charset="UTF-8">
<title>Welcome to the world</title>
</head>
<body>
<h2>Hello World!</h2>