2022 六月8
CREATE TABLESPACE DEMO LOGGING DATAFILE '/opt/oracle/oradata/ORCLCDB/DEMO.dbf' SIZE 200M AUTOEXTEND ON NEXT 32M MAXSIZE 500M EXTENT MANAGEMENT LOCAL;
create temporary tablespace DEMO_TEMP tempfile '/opt/oracle/oradata/ORCLCDB/DEMO_TEMP.dbf' size 100m autoextend on next 32m maxsize 500m extent management local;
alter session set "_ORACLE_SCRIPT"=true;
create user DEMO identified by DEMO default tablespace DEMO temporary tablespace DEMO_TEMP;
alter user DEMO identified by DEMO;
grant connect,resource,dba to DEMO;
alter user DEMO quota unlimited on users;
2021 十月18
nvm 切换node版本
nvm alias default 14
nvm use 14
nodes-sass 安装
npm install --target_arch=x64
2021 九月17
location /api/v1 {
set $is_matched 0;
if ($request_uri ~ /api/v1/user/100001/ ) {
proxy_pass https://127.0.0.1:1001/;
set $is_matched 1;
}
if ($request_uri ~ /api/v1/user/100002/ ) {
proxy_pass https://127.0.0.1:1001/;
set $is_matched 1;
}
# 没有匹配到,跳转到默认页面
if ($is_matched = 0) {
proxy_pass https://127.0.0.1:8080;
}
}
2021 七月30
采用最新Java驱动
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.3.0</version>
</dependency>
获取数据源及数据库
/**
* @author wizzer@qq.com
*/
public class ZMongoDatabase {
private MongoDatabase db;
public ZMongoDatabase(MongoDatabase db) {
this.db = db;
}
/**
* 获取集合,集合不存在则返回 null
*
* @param name 集合名称
* @return 集合薄封装
*/
public MongoCollection<Document> getCollection(String name) {
if (!this.collectionExists(name)) {
return null;
}
return db.getCollection(name);
}
/**
* 获取一个集合,如果集合不存在,就创建它
*
* @param name 集合名
* @param dropIfExists true 如果存在就清除
* @return 集合薄封装
*/
public MongoCollection<Document> createCollection(String name, boolean dropIfExists) {
// 不存在则创建
if (!this.collectionExists(name)) {
return createCollection(name, null);
}
// 固定清除
else if (dropIfExists) {
db.getCollection(name).drop();
return createCollection(name, null);
}
// 已经存在
return db.getCollection(name);
}
/**
* 获取一个集合,如果集合不存在,就创建它
*
* @param name 集合名
* @param options 集合配置信息
* @param dropIfExists true 如果存在就清除
* @return 集合薄封装
*/
public MongoCollection<Document> createCollection(String name, CreateCollectionOptions options, boolean dropIfExists) {
// 不存在则创建
if (!this.collectionExists(name)) {
return createCollection(name, options);
}
// 固定清除
else if (dropIfExists) {
db.getCollection(name).drop();
return createCollection(name, options);
}
// 已经存在
return db.getCollection(name);
}
/**
* 创建一个集合
*
* @param name 集合名
* @param options 集合配置信息
* @return 集合薄封装
*/
public MongoCollection<Document> createCollection(String name, CreateCollectionOptions options) {
if (this.collectionExists(name)) {
throw Lang.makeThrow("Colection has exists: %s.%s", db.getName(), name);
}
// 创建默认配置信息
if (null == options) {
options = new CreateCollectionOptions().capped(false);
}
db.createCollection(name, options);
return db.getCollection(name);
}
/**
* 判断集合是否存在
*
* @param collectionName 集合名
* @return
*/
public boolean collectionExists(String collectionName) {
return listCollectionNames().contains(collectionName);
}
/**
* @return 当前数据库所有可用集合名称
*/
public List<String> listCollectionNames() {
return db.listCollectionNames().into(new ArrayList<String>());
}
public MongoDatabase getNativeDB() {
return this.db;
}
}
初始化数据库示例
@Inject
private ZMongoDatabase zMongoDatabase;
public void init() {
CreateCollectionOptions collectionOptions = new CreateCollectionOptions();
TimeSeriesOptions timeSeriesOptions = new TimeSeriesOptions("ts");
timeSeriesOptions.metaField("metadata");
timeSeriesOptions.granularity(TimeSeriesGranularity.SECONDS);
collectionOptions.timeSeriesOptions(timeSeriesOptions);
MongoCollection<Document> deviceCollection = zMongoDatabase.createCollection("device", collectionOptions, true);
List<Document> list = new ArrayList<>();
Device device = new Device(Times.now(), 36.7, "0001");
list.add(new Document().append("ts", device.getTs()).append("temperature", device.getTemperature()).append("metadata",
new Document().append("no", device.getNo())));
Device device1 = new Device(Times.now(), 35.2, "0002");
list.add(new Document().append("ts", device1.getTs()).append("temperature", device1.getTemperature()).append("metadata",
new Document().append("no", device1.getNo())));
Device device2 = new Device(Times.now(), 10.7, "0002");
list.add(new Document().append("ts", device2.getTs()).append("temperature", device2.getTemperature()).append("metadata",
new Document().append("no", device2.getNo())));
Device device3 = new Device(Times.nextDay(Times.now(), 1), 30.0, "0002");
list.add(new Document().append("ts", device3.getTs()).append("temperature", device3.getTemperature()).append("metadata",
new Document().append("no", device3.getNo())));
// Document.parse(Json.toJson(new Device()));
InsertManyResult insertManyResult = deviceCollection.insertMany(list);
log.info(Json.toJson(insertManyResult));
}
时序数据求平均值示例
// 官方时序数据统计Demo https://docs.mongodb.com/manual/core/timeseries-collections/
@Ok("json:full")
@At("/avg")
public Object avg(@Param(value = "no", df = "0002") String no) {
List<Bson> bsons = new ArrayList<>();
// 筛选条件
Bson match = Aggregates.match(Filters.eq("metadata.no", no));
// 输出对象
Bson project = Aggregates.project(Projections.fields(
// 日期格式化
Projections.computed("date", new Document("$dateToParts", new Document().append("date", "$ts"))),
Projections.computed("temperature", 1)
));
// 分组统计 平均值
Bson group = Aggregates.group(new Document("date", new Document().append("year", "$date.year").append("month", "$date.month").append("day", "$date.day")),
Accumulators.avg("avgTemp", "$temperature")
);
bsons.add(match);
bsons.add(project);
bsons.add(group);
log.info(Json.toJson(bsons));
return zMongoDatabase.getCollection("device").aggregate(bsons);
}
完整代码:
nutzboot starter 组件
nutzboot-starter-mongodb-plus
组件使用示例
nutzboot-demo-simple-mongodb-plus
i’am a separator…
2021 五月12
1、el-tabs 中放置 el-tree 使用 this.$ref[‘tree’] 获取不到对象
使用 this.$ref[‘tree’][0] 可以取到
2、el-cascader 动态加载行政区划,修改表单时无法初始化选中的值
需要设置属性 :key=”xx” ,在数据加载完成后让 xx ++ 自加1
2021 三月25
nutz 及 nutzboot 已支持 TDengine
基于 nutzboot 开发 TDengine 实例
开发环境
服务端:CentOS 8.2 64 位 客户端:Windows 10 64 位
TDengine 安装及配置
官网下载 rpm 安装包 执行安装 rpm -ivh TDengine-server-2.0.18.0-Linux-x64.rpm
修改配置文件 vi /etc/taos/taos.cfg
加上当前服务器 hostname 主机名
# first fully qualified domain name (FQDN) for TDengine system
firstEp wizzer-test:6030
# local fully qualified domain name (FQDN)
fqdn wizzer-test
若为默认密码则直接输入 taos
或 taos -h 127.0.0.1
执行数据库创建命令
taos > create database test;
Windows 10 hosts 配置
修改 C:\Windows\System32\drivers\etc\hosts
添加 ip wizzer-test
创建 nutzboot Maven 项目
pom.xml 文件加入 nutzboot 及 TDengine JDBC 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.budwk</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<nutzboot.version>2.4.2-SNAPSHOT</nutzboot.version>
<jaxb-api.version>2.3.1</jaxb-api.version>
<slf4j.version>1.7.25</slf4j.version>
<logback.version>1.2.3</logback.version>
<taos-jdbcdriver.version>2.0.23</taos-jdbcdriver.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.nutz</groupId>
<artifactId>nutzboot-core</artifactId>
</dependency>
<dependency>
<groupId>org.nutz</groupId>
<artifactId>nutzboot-starter-nutz-dao</artifactId>
</dependency>
<dependency>
<groupId>org.nutz</groupId>
<artifactId>nutzboot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>${taos-jdbcdriver.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.nutz</groupId>
<artifactId>nutzboot-parent</artifactId>
<version>${nutzboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>nutz</id>
<url>http://jfrog.nutz.cn/artifactory/libs-release</url>
</repository>
<repository>
<id>nutz-snapshots</id>
<url>http://jfrog.nutz.cn/artifactory/snapshots</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nutz-snapshots</id>
<url>http://jfrog.nutz.cn/artifactory/snapshots</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
<plugin>
<groupId>org.nutz.boot</groupId>
<artifactId>nutzboot-maven-plugin</artifactId>
<version>${nutzboot.version}</version>
</plugin>
</plugins>
</build>
</project>
/**
* 注意 TDengine 表及字段名都为小写字母
*/
@Table("iot_dev")
public class Iot_dev implements Serializable {
private static final long serialVersionUID = 1L;
@Column
@Comment("ID")
@ColDefine(type = ColType.TIMESTAMP)
private Date ts;
@Column("devid") //字段名都为小写字母
@Comment("设备 ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String devId;
@Column("devtype") //字段名都为小写字母
@Comment("设备类型")
@ColDefine(type = ColType.BINARY, width = 32)
private String devType;
@Column
@Comment("状态")
@ColDefine(type = ColType.BOOLEAN)
private Boolean status;
@Column
@Comment("读数 1")
@ColDefine(type = ColType.DOUBLE)
private Double val1;
@Column
@Comment("读数 2")
@ColDefine(type = ColType.INT)
private Integer val2;
@Column
@Comment("读数 3")
@ColDefine(type = ColType.INT,width = 3)
private Integer val3;
@Column
@Comment("读数 4")
@ColDefine(type = ColType.INT,width = 2)
private Integer val4;
}
完整代码见
https://gitee.com/wizzer/demo/tree/master/nutzboot-tdengine-demo
2021 三月24
本插件不同于V5代码生成器插件,无须引入项目中其他jar包,无须事先编译POJO类:
插件不依赖任何第三方jar包 通过 POJO 类生成接口类、接口实现类、控制类 IDEA 须从项目根目录打开加载项目(以获取正确的 projectBasePath ) 打开 POJO 类Java文件,在文件内部右击选择”Generate”->”WkCodeGenerator”
插件下载:https://gitee.com/budwk/budwk-codegenerator/releases
插件源码:
https://gitee.com/budwk/budwk-codegenerator
https://github.com/budwk/budwk-codegenerator
2021 三月12
1、终端设置代理
export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080
2、安装Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
3、Spotlight 索引占有CPU过高
关闭
sudo mdutil -a -i off
打开
sudo mdutil -a -i on
2020 十二月23
<el-cascader ref="area" v-model="infoForm.area" :props="cascaderProps" style="width: 500px;"
size="small" placeholder="请选择区域"></el-cascader>
cascaderProps: {
lazy: true,
value: 'id',
label: 'text',
lazyLoad: function (node, resolve) {
if (node.level === 0) {
var url = base + "/assets/platform/plugins/zoning/0.json";
$.get(url, function (d) {
resolve(d);
}, "json");
} else {
var pidaspath = node.data.id > 0 ? (node.data.id.substring(0, 2) + "/" + node.data.id) : 0;
var url = base + "/assets/platform/plugins/zoning/"+pidaspath+".json";
$.get(url, function (d) {
resolve(d);
}, "json");
}
}
},
infoForm: {
type: 'designer',
area: [],
areaCode: '',
areaText: '',
},
// 后台返回数据时
this.$set(this.infoForm,'area',this.infoForm.areaCode.split(','))
// 前端入库数据处理
if (this.infoForm.area) {
this.$set(this.infoForm, 'areaCode', this.infoForm.area.toString());
}
if (this.$refs['area']) {
var tree = this.$refs['area'].getCheckedNodes();
this.$set(this.infoForm, 'areaText', tree[0].pathLabels.toString());
}