首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,649 阅读
2
Mac打印机设置黑白打印
5,046 阅读
3
修改elementUI中el-table树形结构图标
4,947 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,705 阅读
5
intelliJ Idea 2022.2.X破解
4,463 阅读
后端开发
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
累计撰写
629
篇文章
累计收到
1,421
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
629
篇与
的结果
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,449 阅读
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,120 阅读
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,013 阅读
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,645 阅读
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,581 阅读
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,322 阅读
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,418 阅读
0 评论
2 点赞
2021-05-10
免费logo在线制作 字体logo logo设计
U钙网 免费logo在线制作 字体logo logo设计网站地址:http://www.uugai.com/
2021年05月10日
1,549 阅读
1 评论
3 点赞
2021-05-10
在线给GIF动图加水印字幕
这个网站的功能很简单,就是给GIF动图加文字水印或字幕用的大家可以用来加防盗图水印,也可以给一些趣图加上文字让它更有趣地址:http://www.yingjingtu.com/使用教程:http://www.yingjingtu.com/help
2021年05月10日
1,079 阅读
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,087 阅读
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,100 阅读
0 评论
1 点赞
2021-05-09
vue基础之slot内容分发(插槽)
什么是slotslot的官方定义是用于组件内容分发,简单通俗的解释就是在组件化开发中,虽然组件都是一样的,但是在不同的使用场景,组件的某一部分需要有不同的内容显示(slot还有一个形象的名字“插槽”),slot就好比在组件开发过程中定义的一个参数(通过name值来区分),如果不传入值就当默认值使用,如果传入了新值,在组件调用时就会替换定义时的slot默认值。slot分为以下两类":匿名slot具名slot匿名slot匿名slot顾名思义就是没有名字的插槽,特点是可以放任何内容。首先设想一个弹出提示框的场景,提示框都包含头部、中间内容和底部内容三部分。一般情况下头部、底部是固定不变的,只有中间内容可以任意放置。下面我们我们基于以上场景说一下匿名插槽的使用。新建组件我们创建一个名称为popup.vue的组件。<template> <div> <div>这是标题</div> <slot>这部分内容会被替换</slot> <div>这是底部内容</div> </div> </template> <script> export default {}; </script>引用组件我们在app.vue中引入刚才定义的组件。不替换插槽内容我们先只引入组件,不替换slot的内容<template> <div id="app"> <popup> </popup> </div> </template> <script> import popup from './components/popup.vue'; export default { components: { popup }, name: "app", data() { return { msg: "Welcome to Your Vue.js App1", }; }, mounted: function () {}, }; </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>可以看到,slot显示的是默认的内容。替换插槽内容这一次,我们替换slot的内容,修改app.vue如下<template> <div id="app"> <popup> 这部分内容会被替换 </popup> </div> </template> <script> import popup from './components/popup.vue'; export default { components: { popup }, name: "app", data() { return { msg: "Welcome to Your Vue.js App1", }; }, mounted: function () {}, }; </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>再次运行,查看内容可以看到,slot内容被替换成了我们app.vue中的内容。{message type="success" content="一个组件中,如果有多个匿名的slot,那么所有的slot都会被替"/}具名slot正如上面提到的,一个组件中,如果有多个匿名的slot,那么所有的slot都会被替换,还是上面的场景,如果我们的标题、中间部分及底部都是可替换的,显然匿名slot就无法解决我们的问题。针对这个场景,我们就可以使用具名slot。具名slot就是有名字的插槽,一旦有了名字,我们就可以针对特定的插槽进行替换。修改popup.vue组件这次,我们把标题、中间部分及底部都做成插槽。<template> <div> <slot name="title">这是标题</slot> <slot name="content">这部分内容会被替换</slot> <slot name="footer">这是底部内容</slot> </div> </template> <script> export default {}; </script>修改app.vue<template> <div id="app"> <popup> <div slot="title">这是替换后的标题</div> <div slot="content">这是替换后的内容</div> <!-- 不替换底部,显示的是默认值 --> </popup> </div> </template> <script> import popup from './components/popup.vue'; export default { components: { popup }, name: "app", data() { return { msg: "Welcome to Your Vue.js App1", }; }, mounted: function () {}, }; </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,117 阅读
0 评论
4 点赞
1
...
26
27
28
...
53