首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,718 阅读
2
Mac打印机设置黑白打印
5,261 阅读
3
修改elementUI中el-table树形结构图标
4,977 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,731 阅读
5
intelliJ Idea 2022.2.X破解
4,703 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Mac
Spring Cloud
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
MySQL
.Net
Spring Cloud Alibaba
Mybatis-Plus
Typecho
jQuery
Java Script
IntelliJ IDEA
微信小程序
Laughing
累计撰写
630
篇文章
累计收到
1,421
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
630
篇与
的结果
2021-05-17
MQTT使用三之Spring Boot集成MQTT简单使用
Spring Boot集成MQTT支持动态创建topic。添加依赖 <!-- MQTT --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency>添加配置文件server: port: 9999 #mqtt的配置 mqtt: server: url: tcp://ip:1883 port: 1883 username: 用户名 password: 密码 client: consumerId: consumerCo publishId: publishCo default: topic: topic completionTimeout: 3000MQTT配置文件package cc.lisen.mqtt.config; import cc.lisen.mqtt.utils.MqttReceiveHandle; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.core.MessageProducer; import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; import org.springframework.integration.mqtt.core.MqttPahoClientFactory; import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessagingException; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.Arrays; import java.util.List; /** * Description:消息订阅配置 * * @author : laughing * DateTime: 2021-05-18 13:31 */ @Configuration public class MqttConfig { public final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final byte[] WILL_DATA; static { WILL_DATA = "offline".getBytes(); } @Resource private MqttReceiveHandle mqttReceiveHandle; @Value("${mqtt.server.url}") private final String url = "tcp://139.198.172.114:1883"; @Value("${mqtt.server.port}") private final String port = "1883"; @Value("${mqtt.server.username}") private final String username = "admin"; @Value("${mqtt.server.password}") private final String password = "public"; @Value("${mqtt.client.consumerId}") private final String consumerId = "consumerClient"; @Value("${mqtt.client.publishId}") private final String publishId = "publishClient"; @Value("${mqtt.default.topic}") private final String topic = "topic"; @Value("${mqtt.default.completionTimeout}") private final Integer completionTimeout = 3000; //消息驱动 private MqttPahoMessageDrivenChannelAdapter adapter; //订阅的主题列表 private String listenTopics = ""; // //mqtt消息接收接口 // private MqttReceiveService mqttReceiveService; // // public void setMqttReceiveService(MqttReceiveService mqttReceiveService){ // this.mqttReceiveService = mqttReceiveService; // } /** * MQTT连接器选项 * **/ @Bean(value = "getMqttConnectOptions") public MqttConnectOptions getMqttConnectOptions(){ MqttConnectOptions mqttConnectOptions=new MqttConnectOptions(); // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接 mqttConnectOptions.setCleanSession(true); // 设置超时时间 单位为秒 mqttConnectOptions.setConnectionTimeout(10); mqttConnectOptions.setAutomaticReconnect(true); mqttConnectOptions.setUserName(username); mqttConnectOptions.setPassword(password.toCharArray()); mqttConnectOptions.setServerURIs(new String[]{url}); // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送心跳判断客户端是否在线,但这个方法并没有重连的机制 mqttConnectOptions.setKeepAliveInterval(10); // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息。 mqttConnectOptions.setWill("willTopic", WILL_DATA, 2, false); return mqttConnectOptions; } /** * MQTT工厂 * **/ @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); factory.setConnectionOptions(getMqttConnectOptions()); return factory; } /** * MQTT信息通道(生产者) * **/ @Bean public MessageChannel mqttOutboundChannel() { return new DirectChannel(); } /** * MQTT消息处理器(生产者) * **/ @Bean @ServiceActivator(inputChannel = "mqttOutboundChannel") public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(publishId, mqttClientFactory()); messageHandler.setAsync(true); messageHandler.setDefaultTopic(topic); return messageHandler; } /** * 配置client,监听的topic * MQTT消息订阅绑定(消费者) * **/ @Bean public MessageProducer inbound() { if(adapter == null){ adapter = new MqttPahoMessageDrivenChannelAdapter(consumerId, mqttClientFactory(), topic); } String [] topics = listenTopics.split(","); for(String topic: topics){ if(!StringUtils.isEmpty(topic)){ adapter.addTopic(topic,1); } } adapter.setCompletionTimeout(completionTimeout); adapter.setConverter(new DefaultPahoMessageConverter()); adapter.setQos(2); adapter.setOutputChannel(mqttInputChannel()); return adapter; } /** * 增加监听的topic * @param topicArr 消息列表 * @return 结果 */ public List<String> addListenTopic(String [] topicArr){ if(adapter == null){ adapter = new MqttPahoMessageDrivenChannelAdapter(consumerId, mqttClientFactory(), topic); } List<String> listTopic = Arrays.asList(adapter.getTopic()); for(String topic: topicArr){ if(!StringUtils.isEmpty(topic)){ if(!listTopic.contains(topic)){ adapter.addTopic(topic,1); } } } return Arrays.asList(adapter.getTopic()); } /** * 移除一个监听的topic * @param topic * @return */ public List<String> removeListenTopic(String topic){ if(adapter == null){ adapter = new MqttPahoMessageDrivenChannelAdapter(consumerId, mqttClientFactory(), topic); } List<String> listTopic = Arrays.asList(adapter.getTopic()); if(listTopic.contains(topic)){ adapter.removeTopic(topic); } return Arrays.asList(adapter.getTopic()); } /** * MQTT信息通道(消费者) * **/ @Bean public MessageChannel mqttInputChannel() { return new DirectChannel(); } /** * MQTT消息处理器(消费者) * **/ @Bean @ServiceActivator(inputChannel = "mqttInputChannel") public MessageHandler handler() { return new MessageHandler() { @Override public void handleMessage(Message<?> message) throws MessagingException { //处理接收消息 mqttReceiveHandle.handle(message); //String topic = message.getHeaders().get("mqtt_receivedTopic").toString(); //String msg = ((String) message.getPayload()).toString(); //mqttReceiveService.handlerMqttMessage(topic,msg); } }; } } 消息处理package cc.lisen.mqtt.utils; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.Message; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component public class MqttReceiveHandle implements MqttCallback { private final Logger logger = LoggerFactory.getLogger(MqttReceiveHandle.class); public void handle(Message<?> message) { try { logger.info("{},客户端号:{},主题:{},QOS:{},消息接收到的数据:{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), message.getHeaders().get(MqttHeaders.ID), message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC), message.getHeaders().get(MqttHeaders.RECEIVED_QOS), message.getPayload()); //处理mqtt数据 this.handle(message.getPayload().toString()); } catch (Exception e) { e.printStackTrace(); logger.error("处理错误" + e.getMessage()); } } private void handle(String str) throws Exception { logger.info(str); } @Override public void connectionLost(Throwable throwable) { logger.warn("连接丢失"); } @Override public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { logger.info("消息到达:" + topic + "\n" + "消息内容:" + new String(mqttMessage.getPayload()) + "\nclientId:" + mqttMessage.getId()); } @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { logger.info("clientId:" + iMqttDeliveryToken.getClient().getClientId()); } }消息发送package cc.lisen.mqtt.utils; import org.springframework.integration.annotation.MessagingGateway; import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.handler.annotation.Header; /** * Description: * * @author : laughing * DateTime: 2021-05-18 13:44 */ @MessagingGateway(defaultRequestChannel = "mqttOutboundChannel") public interface MqttGateway { /** * 发送信息到MQTT服务器 * * @param data 发送的文本 */ void sendToMqtt(String data); /** * 发送信息到MQTT服务器 * * @param topic 主题 * @param payload 消息主体 */ void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload); /** * 发送信息到MQTT服务器 * * @param topic 主题 * @param qos 对消息处理的几种机制。 * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。 * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。 * 2 多了一次去重的动作,确保订阅者收到的消息有一次。 * @param payload 消息主体 */ void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload); }测试package cc.lisen.mqtt.controller; import cc.lisen.mqtt.config.MqttConfig; import cc.lisen.mqtt.utils.MqttGateway; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @RestController public class MqttController { @Resource private MqttGateway mqttGateway; @Resource private MqttConfig mqttConfig; @GetMapping("/add/{topic}") public String addTopic(@PathVariable("topic") String topic) { String[] topics = {topic}; List<String> list = mqttConfig.addListenTopic(topics); return list.toString(); } @GetMapping("/pub") public String pubTopic() { String topic = "temperature1"; String msg = "client msg at: " + String.valueOf(System.currentTimeMillis()); mqttGateway.sendToMqtt(topic, 2, msg); return "OK"; } @GetMapping("/del/{topic}") public String delTopic(@PathVariable("topic") String topic) { List<String> list = mqttConfig.removeListenTopic(topic); return list.toString(); } }
2021年05月17日
1,400 阅读
2 评论
0 点赞
2021-05-17
MQTT使用二之EMQ X的安装及使用
EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。MQTT 是轻量的 (Lightweight)、发布订阅模式 (PubSub) 的物联网消息协议。EMQ X 设计目标是实现高可靠,并支持承载海量物联网终端的MQTT连接,支持在海量物联网设备间低延时消息路由:稳定承载大规模的 MQTT 客户端连接,单服务器节点支持50万到100万连接。分布式节点集群,快速低延时的消息路由,单集群支持1000万规模的路由。消息服务器内扩展,支持定制多种认证方式、高效存储消息到后端数据库。完整物联网协议支持,MQTT、MQTT-SN、CoAP、LwM2M、WebSocket 或私有协议支持。服务器支持EMQ X 目前支持的操作系统:CentOS 6CentOS 7CentOS 8OpenSUSE tumbleweedDebian 9Debian 10Ubuntu 16.04Ubuntu 18.04Ubuntu 20.04macOS 10.13macOS 10.14macOS 10.15Windows Server 2019{message type="success" content="产品部署建议 Linux 服务器,不推荐 Windows 服务器。"/}Shell 脚本一键安装 (Linux)curl https://repos.emqx.io/install_emqx.sh | bash包管理器安装(CentOS)安装所需要的依赖包sudo yum install -y yum-utils device-mapper-persistent-data lvm2使用以下命令设置稳定存储库,以 CentOS 7 为例sudo yum-config-manager --add-repo https://repos.emqx.io/emqx-ce/redhat/centos/7/emqx-ce.repo安装最新版本的 EMQ X Brokersudo yum install emqx启动直接启动 EMQ X Brokeremqx startsystemctl 启动sudo systemctl start emqx 查看状态emqx_ctl status停止 EMQ X Brokeremqx stop卸载sudo yum remove emqxDashboard安装完成后,通过ip:18083,打开出现界面代表安装成功。默认用户名是 admin,密码是 public更多安装方式可以参考:https://docs.emqx.cn/broker/v4.3/getting-started/install.html#
2021年05月17日
1,453 阅读
0 评论
1 点赞
2021-05-17
MQTT使用一之MQTT介绍
之前其实也没有用过MQTT,最近接触MQTT是因为有几个项目涉及传感器,在与传感器对接的过程中,通过MQTT完成数据的交互。简介MQTT(message queuing telemetry transport)是IBM开发的即时通讯协议,是一种发布/订阅极其轻量级的消息传输协议,专门为网络受限设备、低宽带以及高延迟和不可靠的网络而设计的。由于以上轻量级的特点,是实现智能家居的首选传输协议,相比于XMPP,更加轻量级而且占用宽带低。特点由于采用发布/订阅的消息模式,可以提供一对多的消息发布轻量级,网络开销小对负载内容会有屏蔽的消息传输有三种消息发布质量(Qos): qos=0:“至多一次”,这一级别会发生消息丢失或重复,消息发布依赖于TCP/IP网络 qos=1:“至少一次”,确保消息到达,但消息重复可能会发生 qos=2:“只有一次”,确保消息到达一次通知机制,异常中断时会通知双方原理MQTT协议有三种身份:发布者、代理、订阅者,发布者和订阅者都为客户端,代理为服务器,同时消息的发布者也可以是订阅者(为了节约内存和流量发布者和订阅者一般都会定义在一起)。MQTT传输的消息分为主题(Topic,可理解为消息的类型,订阅者订阅后,就会收到该主题的消息内容(payload))和负载(payload,可以理解为消息的内容)两部分。
2021年05月17日
1,126 阅读
0 评论
1 点赞
2021-05-17
linux zookeeper安装及使用
下载zookeeper从官网下载zookeeper上传并解压将tar.gz文件上传到服务器,执行以下命令解压tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz修改配置文件进入apache-zookeeper-3.7.0-bin下的conf文件夹,将zoo_sample.cfg修改为zoo.cfg启动进入bin文件夹,执行以下命令./zkServer.sh start
2021年05月17日
1,019 阅读
0 评论
2 点赞
2021-05-12
leeframe开源快速开发平台
平台简介本平台基于若依前后端分离项目,若依项目开源地址:https://gitee.com/y_project/RuoYi-Vueleeframe依托于若依前后端分离项目,同时结合自己项目中的实践及其他基于若依的扩展项目,对若依项目重新进行了封装。项目地址:https://gitee.com/lisen0629/lee-frame{message type="warning" content="由于目前尚未封装完成,所以暂时没有开源,待封装完成后进行开源"/}框架说明前端采用Vue、Element UI。后端采用Spring Boot、Spring Security、Redis & Jwt。权限认证使用Jwt,支持多终端认证系统。支持加载动态权限菜单,多方式轻松权限控制。高效率开发,使用代码生成器可以一键生成前后端代码。内置功能用户管理:用户是系统操作者,该功能主要完成系统用户配置。部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。岗位管理:配置系统用户所属担任职务。菜单管理:配置系统菜单,操作权限,按钮权限标识等。角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。字典管理:对系统中经常使用的一些较为固定的数据进行维护。参数管理:对系统动态配置常用参数。通知公告:系统通知公告信息发布维护。操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。登录日志:系统登录日志记录查询包含登录异常。在线用户:当前系统中活跃用户状态监控。定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。系统接口:根据业务代码自动生成相关的api接口文档。服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。缓存监控:对系统的缓存信息查询,命令统计等。在线构建器:拖动表单元素生成相应的HTML代码。连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。leeframe封装点集成mybatis-plus,使用更加方便。修改数据库默认主键,主键生成方式改成雪花算法。集成租户功能,支持超级管理员及企业管理员级别的权限分配。租户通过org_code进行数据隔离。数据新增时,通过拦截器自动设置当前用户对应的租户的org_code。集成mybatis-plus逻辑删除功能,数据库表需要预置del_flag字段,N代表未删除,Y代表已删除。调整前端显示样式,统一启用、停用、删除的提示语。修复el-table列不对齐的问题。创建人、修改人字段改成主键,并通过mybatis-plus拦截器自动设置对应的值。项目下一步计划替换框架中已有的mybatis写的sql。扩展代码生成功能。版本说明{timeline}{timeline-item color="#19be6b"}v2.0-2021年5月19日替换el-tree及el-table表格树的图标{/timeline-item}{timeline-item color="#ed4014"} v1.0-2021年5月12集成多租户管理功能。集成mybatis-plus。统一前端样式。登录页面替换滑块验证。{/timeline-item}{/timeline}
2021年05月12日
2,658 阅读
2 评论
6 点赞
2021-05-12
解决登录linux环境后每次都要source /etc/profile使环境变量生效问题
编辑~/.bashrc文件vi ~/.bashrc在末尾添加如下代码if [ -f /etc/profile ]; then . /etc/profile f输入:wq保存退出即可
2021年05月12日
1,585 阅读
0 评论
4 点赞
2021-05-11
mybatis-plus逻辑删除不生效的解决办法
我们在使用mybatis-plus时,一般设备逻辑删除是非常简单的,基本上在yaml等配置文件中做一下配置。然后在字段上注解@TableLogic就可以了。有不清楚的,可以参考https://lisen.cc/back/mybatis-plus-logical-deletion.html但是今天在项目中,发现一个问题,就是明明也正确的进行了配置,但是在进行数据库操作时,发现逻辑删除并没有生效。问题描述先说一下问题先想,数据库指定的字段可以使用,但是指定是否逻辑删除的值时还是mybatis-plus默认的0和1,并不是我指定的N和Y。配置文件先来看下我的配置文件。mybatisPlus: # 搜索指定包别名 typeAliasesPackage: cc.lisen.**.domain # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml global-config: db-config: # 配置逻辑删除 logic-delete-field: del_flag logic-not-delete-value: N logic-delete-value: Y通过配置文件,我指定数据库标记逻辑删除的字段为del_flag,如果已经删除,标记为Y,如果没有删除(默认值)就是N。实体通过提取的公共实体,标记逻辑删除字段,如下@Data public class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 搜索值 */ private String searchValue; /** * 创建者 */ @TableField(fill = FieldFill.INSERT) private Long createBy; /** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) private Date createTime; /** * 更新者 */ @TableField(fill = FieldFill.UPDATE) private Long updateBy; /** * 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.UPDATE) private Date updateTime; /** * 删除标志(Y-已删除,N-未删除) */ @TableLogic private String delFlag; /** * 开始时间 */ @JsonIgnore @TableField(exist = false) private String beginTime; /** * 结束时间 */ @JsonIgnore @TableField(exist = false) private String endTime; }使用调用了一个update方法postMapper.updatePost(post);在进行更新操作时,mybatis-plus会追加where条件防止更新到已删除数据,且使用wrapper.entity生成的where条件会忽略该字段。也就是说,我本来的方法对应的sql可能是update xx set xx where xx=xx如果我配置的逻辑删除没有问题的话,mybatis-plus生成的sql应该是update xx set xx where xx=xx and del_flag = 'N'但是实际我测试发现,生成的sql却是update xx set xx where xx=xx and del_flag = '0'可以看到,虽然逻辑删除的字段是对的,但是实际上,对应字段是否删除的值还是mybatis-plus默认的,并不是我们设置的。问题分析其实这个问题之前还是好的,让我想到应该是最近配置的SqlSessionFactory的问题。 @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage"); String mapperLocations = env.getProperty("mybatis-plus.mapperLocations"); String configLocation = env.getProperty("mybatis-plus.configLocation"); typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); VFS.addImplClass(SpringBootVFS.class); final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean (); sessionFactory.setDataSource(dataSource); sessionFactory.setTypeAliasesPackage(typeAliasesPackage); sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); sessionFactory.setPlugins(mybatisSqlInterceptor(),mybatisPlusInterceptor()); return sessionFactory.getObject(); }我这里重新注入了MybatisSqlSessionFactoryBean,但是并没有对它的配置进行修改,这就导致了我配置文件里的东西并没有加载。解决解决办法也很简单,两种方式我们分别说下。方式一方式一是在我们实体逻辑删除的注解上加上删除和未删除对应的值。 /** * 删除标志(Y-已删除,N-未删除) */ @TableLogic(value = "N",delval = "Y") private String delFlag;方式二方式二就是,我们在MybatisSqlSessionFactoryBean的bean里,把我们配置文件里的配置加上。对SqlSessionFactory改造如下 @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage"); String mapperLocations = env.getProperty("mybatis-plus.mapperLocations"); String configLocation = env.getProperty("mybatis-plus.configLocation"); typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); VFS.addImplClass(SpringBootVFS.class); final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean (); sessionFactory.setDataSource(dataSource); sessionFactory.setTypeAliasesPackage(typeAliasesPackage); sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); sessionFactory.setPlugins(mybatisSqlInterceptor(),mybatisPlusInterceptor()); sessionFactory.setGlobalConfig(globalConfig()); return sessionFactory.getObject(); } @Bean public MybatisSqlInterceptor mybatisSqlInterceptor() { MybatisSqlInterceptor mybatisSqlInterceptor = new MybatisSqlInterceptor(); Properties properties = new Properties(); mybatisSqlInterceptor.setProperties(properties); return mybatisSqlInterceptor; } /** * 逻辑删除插件 */ @Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig = new GlobalConfig(); GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig(); dbConfig.setLogicDeleteValue("Y"); dbConfig.setLogicNotDeleteValue("N"); globalConfig.setDbConfig(dbConfig); return globalConfig; }
2021年05月11日
2,323 阅读
0 评论
1 点赞
2021-05-11
mybatis plus 出现 Invalid bound statement (not found)
使用mybatis-plus时不能使用自带的SqlSessionFactory,要使用MybatisSqlSessionFactory,在配置类中加入如下配置(springboot) @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { String typeAliasesPackage = env.getProperty("mybatisPlus.typeAliasesPackage"); String mapperLocations = env.getProperty("mybatisPlus.mapperLocations"); String configLocation = env.getProperty("mybatisPlus.configLocation"); typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); VFS.addImplClass(SpringBootVFS.class); final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean (); sessionFactory.setDataSource(dataSource); sessionFactory.setTypeAliasesPackage(typeAliasesPackage); sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); sessionFactory.setPlugins(mybatisSqlInterceptor(),mybatisPlusInterceptor()); return sessionFactory.getObject(); }
2021年05月11日
1,422 阅读
0 评论
2 点赞
2021-05-10
免费logo在线制作 字体logo logo设计
U钙网 免费logo在线制作 字体logo logo设计网站地址:http://www.uugai.com/
2021年05月10日
1,563 阅读
1 评论
3 点赞
2021-05-10
在线给GIF动图加水印字幕
这个网站的功能很简单,就是给GIF动图加文字水印或字幕用的大家可以用来加防盗图水印,也可以给一些趣图加上文字让它更有趣地址:http://www.yingjingtu.com/使用教程:http://www.yingjingtu.com/help
2021年05月10日
1,091 阅读
0 评论
1 点赞
2021-05-09
vue前端生成二维码插件
安装插件 npm i qrcode -s引入插件import Vue from 'vue' import App from './App.vue' import QRCode from 'qrcode' Vue.use(QRCode) Vue.prototype.$QRCode = QRCode new Vue({ el: '#app', a:'123', render: h => h(App) }) 使用<template> <div id="app"> <canvas id="canvas"></canvas> </div> </template> <script> import popup from "./components/popup.vue"; export default { components: { popup }, name: "app", data() { return {}; }, mounted: function () { var cavas = document.getElementById("canvas") this.$QRCode.toCanvas(canvas,'https://lisen.cc') }, computed: { }, methods: { }, }; </script> <style> #app { font-family: "Avenir", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
2021年05月09日
1,102 阅读
0 评论
2 点赞
2021-05-09
vue状态管理与vuex
安装vuexnpm i vuex -s创建数据仓库创建store文件夹,并在文件夹下创建index.js文件import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { count: 0 }, mutations: { increment: state => state.count++, decrement: state => state.count-- } })引入数据仓库在main.js中引入我们定义的数据仓库。import Vue from 'vue' import App from './App.vue' import store from '@/store' new Vue({ el: '#app', store, render: h => h(App) })使用<template> <div id="app"> {{ count }} <button @click="increment">++</button> <button @click="decrement">--</button> </div> </template> <script> import popup from "./components/popup.vue"; export default { components: { popup }, name: "app", data() { return {}; }, mounted: function () {}, computed: { count() { return this.$store.state.count; }, }, methods: { increment: function () { this.$store.commit('increment') }, decrement: function () { this.$store.commit('decrement') }, }, }; </script> <style> #app { font-family: "Avenir", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>每次点++按钮,count自动+1
2021年05月09日
1,118 阅读
0 评论
1 点赞
1
...
26
27
28
...
53