Commit 5614dede authored by 赵啸非's avatar 赵啸非

添加站点

parent f71c1844
...@@ -56,6 +56,8 @@ const router = new Router({ ...@@ -56,6 +56,8 @@ const router = new Router({
...restBuilder('product/version', 'product/version'),//产品 ...restBuilder('product/version', 'product/version'),//产品
...restBuilder('site', 'site'), // 站点管理
//以下为基础路由配置 //以下为基础路由配置
builder('', 'Home'), builder('', 'Home'),
builder('index', 'Home'), builder('index', 'Home'),
......
...@@ -174,6 +174,14 @@ ...@@ -174,6 +174,14 @@
<el-button @click="tree.open = false">取 消</el-button> <el-button @click="tree.open = false">取 消</el-button>
</div> </div>
</el-dialog> </el-dialog>
<!-- 查看二维码弹窗 -->
<el-dialog
title="设备二维码"
:visible.sync="qrCodeDialog.visible" width="350px">
<img :src="qrCodeDialog.qrCode">
<p style="word-wrap:break-word">{{qrCodeDialog.qrCodeUrl}}</p>
</el-dialog>
<!-- <dialog-show ref="dialogform" @ok="getData" /> --> <!-- <dialog-show ref="dialogform" @ok="getData" /> -->
<drawer-show ref="drawerform" @ok="getData" /> <drawer-show ref="drawerform" @ok="getData" />
...@@ -410,9 +418,27 @@ export default { ...@@ -410,9 +418,27 @@ export default {
/> />
); );
}, },
async viewQrCode(id) {
try {
const {qrCode, qrCodeUrl} = await this.$post('/device/viewQrCode', {
"id":id
});
this.qrCodeDialog.qrCode = qrCode;
this.qrCodeDialog.qrCodeUrl = qrCodeUrl;
this.qrCodeDialog.visible = true;
} catch (error) {
this.$message.error(error.message);
}
},
}, },
data() { data() {
return { return {
//二维码
qrCodeDialog: {
visible: false,
qrCode: "",
qrCodeUrl: "",
},
// 用户导入参数 // 用户导入参数
upload: { upload: {
// 是否显示弹出层(设备导入) // 是否显示弹出层(设备导入)
...@@ -551,6 +577,8 @@ export default { ...@@ -551,6 +577,8 @@ export default {
) : ( ) : (
"" ""
)} )}
<span> </span>
<el-button type="text" size='mini' onClick={()=>this.viewQrCode(row.id)}>二维码</el-button>
</div> </div>
); );
}, },
......
...@@ -23,7 +23,8 @@ ...@@ -23,7 +23,8 @@
<properties> <properties>
<profiles.active>develop</profiles.active> <profiles.active>develop</profiles.active>
<profiles.server.port>18222</profiles.server.port> <profiles.server.port>18222</profiles.server.port>
<profiles.queue.type></profiles.queue.type> <profiles.platform.type>standalone</profiles.platform.type>
<profiles.queue.type>rabbitmq</profiles.queue.type>
<profiles.datasource.uri> <profiles.datasource.uri>
<![CDATA[jdbc:mysql://localhost:3306/device-new-platform?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong]]></profiles.datasource.uri> <![CDATA[jdbc:mysql://localhost:3306/device-new-platform?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong]]></profiles.datasource.uri>
<profiles.datasource.username>root</profiles.datasource.username> <profiles.datasource.username>root</profiles.datasource.username>
...@@ -60,6 +61,7 @@ ...@@ -60,6 +61,7 @@
<properties> <properties>
<profiles.active>test</profiles.active> <profiles.active>test</profiles.active>
<profiles.server.port>18222</profiles.server.port> <profiles.server.port>18222</profiles.server.port>
<profiles.queue.type>cloud</profiles.queue.type>
<profiles.queue.type>rabbitmq</profiles.queue.type> <profiles.queue.type>rabbitmq</profiles.queue.type>
<profiles.datasource.uri> <profiles.datasource.uri>
<![CDATA[jdbc:mysql://192.168.0.98:3306/device-new-platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong]]></profiles.datasource.uri> <![CDATA[jdbc:mysql://192.168.0.98:3306/device-new-platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong]]></profiles.datasource.uri>
......
package com.mortals.xhx.common.utils;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.mortals.framework.util.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;
/**
* 二维码工具类
*
*/
public class QRCodeUtil {
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(QRCodeUtil.class);
private static final String CHARSET = "utf-8";
private static final String FORMAT = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 300;
// LOGO宽度
private static final int LOGO_WIDTH = 60;
// LOGO高度
private static final int LOGO_HEIGHT = 60;
private static BufferedImage createImage(String content, String logoPath, boolean needCompress) throws Exception {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
if (logoPath == null || "".equals(logoPath)) {
return image;
}
// 插入图片
QRCodeUtil.insertImage(image, logoPath, needCompress);
return image;
}
/**
* 插入LOGO
*
* @param source
* 二维码图片
* @param logoPath
* LOGO图片地址
* @param needCompress
* 是否压缩
* @throws Exception
*/
private static void insertImage(BufferedImage source, String logoPath, boolean needCompress) throws Exception {
File file = new File(logoPath);
if (!file.exists()) {
throw new Exception("logo file not found.");
}
Image src = ImageIO.read(new File(logoPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (needCompress) { // 压缩LOGO
if (width > LOGO_WIDTH) {
width = LOGO_WIDTH;
}
if (height > LOGO_HEIGHT) {
height = LOGO_HEIGHT;
}
Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
}
// 插入LOGO
Graphics2D graph = source.createGraphics();
int x = (QRCODE_SIZE - width) / 2;
int y = (QRCODE_SIZE - height) / 2;
graph.drawImage(src, x, y, width, height, null);
Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graph.setStroke(new BasicStroke(3f));
graph.draw(shape);
graph.dispose();
}
/**
* 生成二维码(内嵌LOGO) 二维码文件名随机,文件名可能会有重复
*
* @param content
* 内容
* @param logoPath
* LOGO地址
* @param destPath
* 存放目录
* @param needCompress
* 是否压缩LOGO
* @throws Exception
*/
public static String encode(String content, String logoPath, String destPath, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoPath, needCompress);
mkdirs(destPath);
String fileName = new Random().nextInt(99999999) + "." + FORMAT.toLowerCase();
ImageIO.write(image, FORMAT, new File(destPath + "/" + fileName));
return fileName;
}
/**
* 生成二维码(内嵌LOGO) 调用者指定二维码文件名
*
* @param content
* 内容
* @param logoPath
* LOGO地址
* @param destPath
* 存放目录
* @param fileName
* 二维码文件名
* @param needCompress
* 是否压缩LOGO
* @throws Exception
*/
public static String encode(String content, String logoPath, String destPath, String fileName, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoPath, needCompress);
mkdirs(destPath);
fileName = fileName.substring(0, fileName.indexOf(".") > 0 ? fileName.indexOf(".") : fileName.length()) + "." + FORMAT.toLowerCase();
ImageIO.write(image, FORMAT, new File(destPath + "/" + fileName));
return fileName;
}
/**
* 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir. (mkdir如果父目录不存在则会抛出异常)
*
* @param destPath
* 存放目录
*/
public static void mkdirs(String destPath) {
File file = new File(destPath);
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
}
/**
* 生成二维码
*
* @param content
* 内容
* @param destPath
* 存储地址
* @throws Exception
*/
public static String encode(String content, String destPath) throws Exception {
return QRCodeUtil.encode(content, null, destPath, false);
}
/**
* 生成二维码(内嵌LOGO)
*
* @param content
* 内容
* @param logoPath
* LOGO地址
* @param output
* 输出流
* @param needCompress
* 是否压缩LOGO
* @throws Exception
*/
public static void encode(String content, String logoPath, OutputStream output, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoPath, needCompress);
ImageIO.write(image, FORMAT, output);
}
/**
* 生成二维码
*
* @param content
* 内容
* @param output
* 输出流
* @throws Exception
*/
public static void encode(String content, OutputStream output) throws Exception {
QRCodeUtil.encode(content, null, output, false);
}
/**
* 将二维码转换成base64字符串
*
* @param content
* @param logoPath
* @param needCompress
* @return
* @throws Exception
*/
public static String encode(String content, String logoPath, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoPath, needCompress);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, FORMAT, outputStream);
return Base64.encode(outputStream.toByteArray());
}
public static byte[] encodeToBytes(String content, String logoPath, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoPath, needCompress);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, FORMAT, outputStream);
return outputStream.toByteArray();
}
/**
* 解析二维码
*
* @param file
* 二维码图片
* @return
* @throws Exception
*/
public static String decode(File file) throws Exception {
BufferedImage image;
image = ImageIO.read(file);
if (image == null) {
return null;
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
result = new MultiFormatReader().decode(bitmap, hints);
String resultStr = result.getText();
return resultStr;
}
/**
* 解析二维码
*
* @param path
* 二维码图片地址
* @return
* @throws Exception
*/
public static String decode(String path) throws Exception {
return QRCodeUtil.decode(new File(path));
}
/**
* 解析二维码
*
* @param file
* 二维码图片
* @return
* @throws Exception
*/
public static String decode(InputStream inputStream) throws Exception {
BufferedImage image = ImageIO.read(inputStream);
if (image == null) {
return null;
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
result = new MultiFormatReader().decode(bitmap, hints);
String resultStr = result.getText();
return resultStr;
}
public static void main(String[] args) throws Exception {
// String text =
// "https://mp.weixin.qq.com/a/~~qgbFJlgjTPg~wAWUfsCV6ni-VdasDWFqJg~~";
// QRCodeUtil.encode(text, "", "e:\\", "qrcodeTest", true);
// System.out.println(QRCodeUtil.decode("d:\\777.png"));
System.out.println(QRCodeUtil.decode("e:\\4.png"));
// https://mp.weixin.qq.com/a/~~7e4OEtdDP-A~N-WJjuAzvca5sdEzbkQ9hA~~
// https://mp.weixin.qq.com/a/~~hopFMAkydTI~RWT6ZsVRPo0jIZzPgXGVlg~~ 2
// https://mp.weixin.qq.com/a/~~GwiYx6fLcTQ~gglQBO3FfzX6SuWe2z65rg~~ 3
// https://mp.weixin.qq.com/a/~~UjQMf5HyHLM~8SjrWsLXuc-3XtoAgFPEIw~~ 4
// System.out.println(QRCodeUtil.encode(text,null, true).length());
}
}
...@@ -3,6 +3,7 @@ package com.mortals.xhx.module.device.web; ...@@ -3,6 +3,7 @@ package com.mortals.xhx.module.device.web;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth; import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.ap.GlobalSysInfo;
import com.mortals.framework.common.Rest; import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
...@@ -15,6 +16,7 @@ import com.mortals.xhx.common.code.*; ...@@ -15,6 +16,7 @@ import com.mortals.xhx.common.code.*;
import com.mortals.xhx.common.pdu.RespData; import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.site.SitePdu; import com.mortals.xhx.common.pdu.site.SitePdu;
import com.mortals.xhx.common.pdu.skin.SkinBasePdu; import com.mortals.xhx.common.pdu.skin.SkinBasePdu;
import com.mortals.xhx.common.utils.QRCodeUtil;
import com.mortals.xhx.feign.site.ISiteFeign; import com.mortals.xhx.feign.site.ISiteFeign;
import com.mortals.xhx.feign.skin.ISkinBaseFeign; import com.mortals.xhx.feign.skin.ISkinBaseFeign;
import com.mortals.xhx.module.device.model.DeviceEntity; import com.mortals.xhx.module.device.model.DeviceEntity;
...@@ -147,6 +149,36 @@ public class DeviceController extends BaseCRUDJsonBodyMappingController<DeviceSe ...@@ -147,6 +149,36 @@ public class DeviceController extends BaseCRUDJsonBodyMappingController<DeviceSe
return rest; return rest;
} }
/**
* 查看二维码
*/
@PostMapping(value = "viewQrCode")
public String viewQrCode(@RequestBody DeviceEntity deviceEntity) {
JSONObject jsonObject = new JSONObject();
try {
if (deviceEntity.getId() == null) {
throw new AppException("二维码为空");
}
String qrCodeUrl = GlobalSysInfo.getParamValue("qrcode", "http://192.168.0.98:18222/m/test");
String productType = "phj";
DeviceEntity device = service.get(deviceEntity.getId(), null);
if (ObjectUtils.isEmpty(device)) throw new AppException("当前设备不存在!");
// TODO: 2022/9/14 设备生成二维码内容待定
String qrCode = qrCodeUrl + "?productType=" + productType + "&deviceCode=" + device.getDeviceCode();
jsonObject.put("qrCode", "data:image/png;base64," + QRCodeUtil.encode(qrCode, null, false));
jsonObject.put("qrCodeUrl", qrCode);
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
} catch (Exception e) {
log.error("查看二维码错误", e);
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
jsonObject.put(KEY_RESULT_MSG, super.convertException(e));
}
return jsonObject.toJSONString();
}
/** /**
* 设备启用停用 * 设备启用停用
*/ */
......
...@@ -21,6 +21,7 @@ import com.mortals.xhx.module.device.model.DeviceEntity; ...@@ -21,6 +21,7 @@ import com.mortals.xhx.module.device.model.DeviceEntity;
import com.mortals.xhx.module.device.model.DeviceQuery; import com.mortals.xhx.module.device.model.DeviceQuery;
import com.mortals.xhx.module.device.service.DeviceService; import com.mortals.xhx.module.device.service.DeviceService;
import com.mortals.xhx.module.site.model.SiteQuery; import com.mortals.xhx.module.site.model.SiteQuery;
import com.mortals.xhx.module.site.model.SiteTreeSelect;
import com.mortals.xhx.module.site.service.SiteService; import com.mortals.xhx.module.site.service.SiteService;
import com.mortals.xhx.module.sitestat.model.SitestatQuery; import com.mortals.xhx.module.sitestat.model.SitestatQuery;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -36,6 +37,7 @@ import org.springframework.util.ObjectUtils; ...@@ -36,6 +37,7 @@ import org.springframework.util.ObjectUtils;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.mortals.framework.web.BaseController.*;
import static com.mortals.xhx.common.key.ErrorCode.ERROR_TOKEN_EXPIRED_CONTENT; import static com.mortals.xhx.common.key.ErrorCode.ERROR_TOKEN_EXPIRED_CONTENT;
/** /**
...@@ -81,7 +83,7 @@ public class SitestatServiceImpl extends AbstractCRUDServiceImpl<SitestatDao, Si ...@@ -81,7 +83,7 @@ public class SitestatServiceImpl extends AbstractCRUDServiceImpl<SitestatDao, Si
private Result<SitestatEntity> getSitestatEntityResult(SitestatEntity entity, PageInfo pageInfo, Context context, Result<SitestatEntity> res) { private Result<SitestatEntity> getSitestatEntityResult(SitestatEntity entity, PageInfo pageInfo, Context context, Result<SitestatEntity> res) {
if (ObjectUtils.isEmpty(entity.getSiteId())) return null; if (ObjectUtils.isEmpty(entity.getSiteId())) return null;
if (platFormType.equalsIgnoreCase(PlatformTypeEnum.CLOUD.getValue())) { if (platFormType.equalsIgnoreCase(PlatformTypeEnum.STANDALONE.getValue())) {
//根据返回的id 筛选列表 //根据返回的id 筛选列表
Map<Long, SitestatEntity> collectMap = this.findToMap(new SitestatEntity(), context); Map<Long, SitestatEntity> collectMap = this.findToMap(new SitestatEntity(), context);
List<SitestatEntity> list = this.siteService.find(new SiteQuery().id(entity.getSiteId())).stream().filter(f -> collectMap.containsKey(f.getId())).map(m -> collectMap.get(m.getId())).collect(Collectors.toList()); List<SitestatEntity> list = this.siteService.find(new SiteQuery().id(entity.getSiteId())).stream().filter(f -> collectMap.containsKey(f.getId())).map(m -> collectMap.get(m.getId())).collect(Collectors.toList());
...@@ -112,7 +114,7 @@ public class SitestatServiceImpl extends AbstractCRUDServiceImpl<SitestatDao, Si ...@@ -112,7 +114,7 @@ public class SitestatServiceImpl extends AbstractCRUDServiceImpl<SitestatDao, Si
} }
} }
return null; return res;
} }
private Result<SitestatEntity> getSitestatsResult(SitestatEntity entity, PageInfo pageInfo, Result<SitestatEntity> res) { private Result<SitestatEntity> getSitestatsResult(SitestatEntity entity, PageInfo pageInfo, Result<SitestatEntity> res) {
...@@ -185,7 +187,17 @@ public class SitestatServiceImpl extends AbstractCRUDServiceImpl<SitestatDao, Si ...@@ -185,7 +187,17 @@ public class SitestatServiceImpl extends AbstractCRUDServiceImpl<SitestatDao, Si
return resp; return resp;
} }
} else { } else {
return JSON.toJSONString(siteService.siteTree(context)); JSONObject jsonObject = new JSONObject();
Map<String, Object> model = new HashMap<>();
List<SiteTreeSelect> siteTree = siteService.getSiteTree(context);
if (ObjectUtils.isEmpty(siteTree)) {
log.info("为初始化站点树,重新构建!");
siteTree = siteService.siteTree(context);
}
model.put("siteTree", siteTree);
jsonObject.put(KEY_RESULT_DATA, model);
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
return jsonObject.toJSONString();
} }
return JSON.toJSONString(Rest.fail(ErrorCode.ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT)); return JSON.toJSONString(Rest.fail(ErrorCode.ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT));
} }
......
platform: platform:
type: standalone # type: standalone
type: @profiles.platform.type@
server: server:
port: @profiles.server.port@ port: @profiles.server.port@
servlet: servlet:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment