继开 | 博客

热爱生活,努力学习,实现自己的价值


  • 短诗的序

  • 迷途自渡

  • 寒星三两

  • 林深见鹿

  • 记昨日书

  • 顾探往昔

RedisTemplate设置过期时间

发表于 2022-05-23
字数统计: 390 字 | 阅读时长 ≈ 2 min
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 @Resource
private RedisTemplate<String,Object> redisTemplate;

//缓存map数据,用hash 存数据
Map<String,Object> map = new HashMap<>();
map.put("token","用户token");
//存入hash 值
redisTemplate.opsForHash().putAll("TOKEN_MAP",map);
//设置 hash 值在凌晨23;59:59 清理
Date date = Date.from(LocalDateTime.of(LocalDate.now(), LocalTime.MAX).toInstant(ZoneOffset.of("+8")))
redisTemplate.expireAt("TOKEN_MAP",date);

//设置 hash 值在30分钟后清理
redisTemplate.expire("TOKEN_MAP",30,TimeUnit.MINUTES);

//向redis里存入数据和设置缓存时间
redisTemplate.opsForValue().set("redisKey", "100", 60 * 10, TimeUnit.SECONDS);

//val做-1操作
redisTemplate.boundValueOps("redisKey").increment(-1);

//根据key获取缓存中的val
redisTemplate.opsForValue().get("redisKey")

//val +1
redisTemplate.boundValueOps("redisKey").increment(1);

//根据key获取过期时间
redisTemplate.getExpire("redisKey");

//根据key获取过期时间并换算成指定单位
redisTemplate.getExpire("redisKey",TimeUnit.SECONDS);

//根据key删除缓存
redisTemplate.delete("redisKey");

//检查key是否存在,返回boolean值
redisTemplate.hasKey("redisKey");

//向指定key中存放set集合
redisTemplate.opsForSet().add("redisKey", "1","2","3");

//设置过期时间
redisTemplate.expire("redisKey",1000 , TimeUnit.MILLISECONDS);

//根据key查看集合中是否存在指定数据
redisTemplate.opsForSet().isMember("redisKey", "1");

//根据key获取set集合
redisTemplate.opsForSet().members("redisKey");

//验证有效时间
Long expire = redisTemplate.boundHashOps("redisKey").getExpire();

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Map转json格式string字符串

发表于 2022-05-08
字数统计: 318 字 | 阅读时长 ≈ 2 min

##工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.List;
import java.util.Map;

/**
* @Description map 转 json格式string字符串
* @Date 2022-05-08
*/
public class MapToJson {
public static String mapTojsonString(Map<String, Object> map) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("{");
if (map != null && map.size() > 0) {
for (String key : map.keySet()) {
if (!stringBuilder.toString().endsWith("{")) {stringBuilder.append(",");}

String value = mapTojsonString(map.get(key));
stringBuilder.append("\"").append(key).append("\"")
.append(":")
.append(value);
}
}
stringBuilder.append("}");
return stringBuilder.toString();
}

static String mapTojsonString(Object obj) {
if (obj instanceof String) {return "\"" + obj.toString() + "\"";}
if (obj instanceof Map) {return mapTojsonString((Map) obj);}
if (obj instanceof List) {return listToString((List<Object>) obj);}
if (obj == null) {return null;}
return obj.toString();
}

static String listToString(List<Object> list) {
StringBuilder builder = new StringBuilder();
builder.append("[");
if (list != null && list.size() > 0) {
for (Object obj : list) {
if (!builder.toString().endsWith("[")){ builder.append(",");}
builder.append(mapTojsonString(obj));
}
}
builder.append("]");
return builder.toString();
}
}

##使用

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {


List<Map<String, String>> list = new ArrayList<>();

Map<String, Object> map1 = new HashMap<>();
map1.put("name", "张三");
map1.put("age", "18");
map1.put("gender", "男");

System.out.println(mapTojsonString(map1));
}

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Java读取文件头部获得文件类型的工具类

发表于 2022-05-05
字数统计: 1,101 字 | 阅读时长 ≈ 6 min

原因

为什么不直接使用文件后缀判断文件类型,而要通过读取文件头部获得文件类型呢?
原因是,处于安全考虑,部分木马程序是通过改变后缀来伪装为文件,上传到服务器,在服务器中作为可执行文件,对服务器进行攻击,通过文件头部文件获取真实文件类型,来限制此类病毒文件的上传来保护服务

##工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
 
import java.io.File;

import java.io.FileInputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

/***********************************************************************

*

* Description: 主要用于判断文件的类型

*

***********************************************************************/

class FileTools {
public final static Map FILE_TYPE_MAP = new HashMap();

/*-----------------------------目前可以识别的类型----------------------------*/

private static void getAllFileType() {
FILE_TYPE_MAP.put("jpg", "FFD8FF"); //JPEG

FILE_TYPE_MAP.put("png", "89504E47"); //PNG

FILE_TYPE_MAP.put("gif", "47494638"); //GIF

FILE_TYPE_MAP.put("tif", "49492A00"); //TIFF

FILE_TYPE_MAP.put("bmp", "424D"); //Windows Bitmap

FILE_TYPE_MAP.put("dwg", "41433130"); //CAD

FILE_TYPE_MAP.put("html", "68746D6C3E"); //HTML

FILE_TYPE_MAP.put("rtf", "7B5C727466"); //Rich Text Format

FILE_TYPE_MAP.put("xml", "3C3F786D6C");

FILE_TYPE_MAP.put("zip", "504B0304");

FILE_TYPE_MAP.put("rar", "52617221");

FILE_TYPE_MAP.put("psd", "38425053"); //PhotoShop

FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A"); //Email [thorough only]

FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F"); //Outlook Express

FILE_TYPE_MAP.put("pst", "2142444E"); //Outlook

FILE_TYPE_MAP.put("office", "D0CF11E0"); //office类型,包括doc、xls和ppt

FILE_TYPE_MAP.put("mdb", "000100005374616E64617264204A"); //MS Access

FILE_TYPE_MAP.put("wpd", "FF575043"); //WordPerfect

FILE_TYPE_MAP.put("eps", "252150532D41646F6265");

FILE_TYPE_MAP.put("ps", "252150532D41646F6265");

FILE_TYPE_MAP.put("pdf", "255044462D312E"); //Adobe Acrobat

FILE_TYPE_MAP.put("qdf", "AC9EBD8F"); //Quicken

FILE_TYPE_MAP.put("pwl", "E3828596"); //Windows Password

FILE_TYPE_MAP.put("wav", "57415645"); //Wave

FILE_TYPE_MAP.put("avi", "41564920");

FILE_TYPE_MAP.put("ram", "2E7261FD"); //Real Audio

FILE_TYPE_MAP.put("rm", "2E524D46"); //Real Media

FILE_TYPE_MAP.put("mpg", "000001BA"); //

FILE_TYPE_MAP.put("mov", "6D6F6F76"); //Quicktime

FILE_TYPE_MAP.put("asf", "3026B2758E66CF11"); //Windows Media

FILE_TYPE_MAP.put("mid", "4D546864"); //MIDI (mid)

}

/**
* 通过读取文件头部获得文件类型
*
* @param file
* @return 文件类型
*/

public static String getFileType(File file) {
getAllFileType();

String fileExtendName = null;

FileInputStream is;

try {
is = new FileInputStream(file);

byte[] b = new byte[16];

is.read(b, 0, b.length);

String filetypeHex = String.valueOf(bytesToHexString(b));

Iterator<Entry> entryiterator = FILE_TYPE_MAP.entrySet().iterator();

while (entryiterator.hasNext()) {
Entry entry = entryiterator.next();

String fileTypeHexValue = (String) entry.getValue();

if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {
fileExtendName = (String) entry.getKey();

if (fileExtendName.equals("office")) {
fileExtendName = getOfficeFileType(is);

}

is.close();

break;

}

}

// 如果不是上述类型,则判断扩展名

if (fileExtendName == null) {
String fileName = file.getName();

// 如果无扩展名,则直接返回空串

if (-1 == fileName.indexOf(".")) {
return "";

}

// 如果有扩展名,则返回扩展名

return fileName.substring(fileName.indexOf(".") + 1);

}

is.close();

return fileExtendName;

} catch (Exception exception) {
return "";

}

}

/**
* 判断office文件的具体类型
*
* @param fileInputStream
* @return office文件具体类型
*/

private static String getOfficeFileType(FileInputStream fileInputStream) {
String officeFileType = "doc";

byte[] b = new byte[512];

try {
fileInputStream.read(b, 0, b.length);

String filetypeHex = String.valueOf(bytesToHexString(b));

String flagString = filetypeHex.substring(992, filetypeHex.length());

if (flagString.toLowerCase().startsWith("eca5c")) {
officeFileType = "doc";

} else if (flagString.toLowerCase().startsWith("fdffffff09")) {
officeFileType = "xls";

} else if (flagString.toLowerCase().startsWith("09081000000")) {
officeFileType = "xls";

} else {
officeFileType = "ppt";

}

return officeFileType;

} catch (Exception e) {
e.printStackTrace();
return "";
}

}

/**
* 获得文件头部字符串
*
* @param src
* @return
*/

private static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();

if (src == null || src.length <= 0) {
return null;

}

for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;

String hv = Integer.toHexString(v);

if (hv.length() < 2) {
stringBuilder.append(0);

}

stringBuilder.append(hv);

}

return stringBuilder.toString();

}

public static void main(String[] args) {
File file = new File("E:/济指办发〔2022〕203号关于加强改进重点区域管理服务工作的通知.word");
String testfileName = getFileType(file);
System.out.println("真实:"+testfileName);
FileInputStream is;

try {
is = new FileInputStream(file);

byte[] b = new byte[16];

is.read(b, 0, b.length);

String filetypeHex = String.valueOf(bytesToHexString(b));
System.out.println("前16位码:"+filetypeHex);

String fileName = file.getName();

System.out.println("外部编译:"+fileName.substring(fileName.indexOf(".") + 1));

} catch (Exception e) {
e.printStackTrace();

}

}
}

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

For与foreach的区别

发表于 2022-04-29
字数统计: 1,199 字 | 阅读时长 ≈ 6 min

遍历元素

首先,我们一一段代码为例:

1
2
3
4
5
6
7
8
9
10
11
12
String[] array = {"1", "2", "3"};
for (String i : array) {
System.out.println(i);
}

ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
for (String i : list) {
System.out.println(i);
}

遍历后结果如下:

1
2
3
4
5
6
1
2
3
111
222
333

结果毫无疑问。

我们再来看看编译后的源码(idea自带,在target包里打开你的类源码文件即可):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String[] array = new String[]{"1", "2", "3"};
String[] var2 = array;
int var3 = array.length;

for(int var4 = 0; var4 < var3; ++var4) {
String i = var2[var4];
System.out.println(i);
}

ArrayList<String> list = new ArrayList();
list.add("111");
list.add("222");
list.add("333");
Iterator var7 = list.iterator();

while(var7.hasNext()) {
String i = (String)var7.next();
System.out.println(i);
}

可见,遍历数组使用的是原始for循环,集合的话使用的是Iterator迭代器。

删除元素

接下来我们来删除元素:

使用for循环:

1
2
3
4
5
6
7
8
9
10
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
log.info(list.toString());
for (int i = 0; i <list.size(); i++) {
list.remove("222");
}

log.info(list.toString());

结果:

1
2
11:11:52.532 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
11:11:52.539 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 333]

显然成功!

使用foreach:

1
2
3
4
5
6
7
8
9
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
log.info(list.toString());
for (String i : list) {
list.remove("222");
}
log.info(list.toString());

结果:

1
2
3
4
5
11:50:48.333 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.xiaolinge.com.hello.HelloWord.main(HelloWord.java:30)

显然木有成功!

原因:

迭代器内部的每次遍历都会记录List内部的modcount当做预期值,然后在每次循环中用预期值与List的成员变量modCount作比较,但是普通list.remove调用的是List的remove,这时modcount++,但是iterator内记录的预期值=并没有变化,所以会报错。

如果想要删除元素的话需要使用迭代器内部的remove方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
log.info(list.toString());
Iterator<String> it = list.iterator();
while (it.hasNext()){
String next = it.next();
//if外使用list的remove方法还是会报错的
if(next.equals("222")){
it.remove();//这里使用的是迭代器里面的remove()方法,
// 当然如果使用list的remove方法在此删除质地感元素的话是成功的,比如:list.remove("222")
}
}
log.info(list.toString());

结果:

1
2
12:06:14.042 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
12:06:14.046 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 333]

修改元素

使用原始for:

1
2
3
4
5
6
7
8
9
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
log.info(list.toString());
for (int i = 0; i <list.size(); i++) {
list.set(i,"444");
}
log.info(list.toString());

结果:

1
2
12:12:56.910 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
12:12:56.915 [main] INFO com.xiaolinge.com.hello.HelloWord - [444, 444, 444]

可以修改元素;

使用foreach:

1
2
3
4
5
6
7
8
9
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
log.info(list.toString());
for (String i : list) {
i="444";
}
log.info(list.toString());

结果:

1
2
12:34:47.207 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
12:34:47.211 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]

看到咯,不行的哦。

辣么,修改元素不行,修改元素的属性可不可以呢?让我们来看下吧。

foreach修改元素属性

(for就不测试了)

创建一个学生类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
public Student(){};
public Student(int age,String name){
this.age=age;
this.name=name;
}
}

接下来测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
Student student=new Student(1,"huge");
Student student1=new Student(1,"xiaoyao");
List<Student> studentList=new ArrayList<Student>();
studentList.add(student);
studentList.add(student1);
System.out.println(student.getName());
System.out.println(student1.getName());
for(Student stu:studentList)
{
stu.setName("jingtian");
}
System.out.println(student.getName());
System.out.println(student1.getName());

结果:

1
2
3
4
huge
xiaoyao
jingtian
jingtian

很神奇!修改不了对象,却可以修改对象的属性。

总结

for与foreach都可以遍历数组/集合,不过for则在较复杂的循环中效率更高。

foreach不可以删除/修改集合元素,而for可以

foreach和for都可以修改元素里面的属性

所以相比较下来for循环更为灵活。

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Markdown 必备组合神器!

发表于 2022-04-21
字数统计: 458 字 | 阅读时长 ≈ 2 min

程序员应该都了解 Typora 是专注于编写 Markdown 格式的编辑软件,使用方便,支持多种格式导出。

PicGo 是一款免费的图床管理应用,支持拖拽上传,剪切板上传等方式。你可以用它快捷地将图片上传到图床并获得网络链接。

注意:请不要把 PicGo 安装到 C 盘 Program Files 下

为什么需要图床

Markdown 可以理解为增强版的文本文档,语法简单,支持更多的风格样式,相比 word 更加轻便,文件大小更小,同时可导出为指定格式,目前大多是技术博客论坛已支持 Markdown 格式,基本上可以做到一次编写多处使用。当然 Markdown 也存在缺点,比如图片。

Markdown 文档编写时可使用本地图片,但是无法在网络上使用。图床的作用可以理解为将文档中的图片放到网络上,直接引用网络地址,这样可以做到无论在那个平台都可以使用统一的图片地址。

搭建图床教程较多此处不做讨论,作者使用的是 github 搭建的免费图床。

配置 PicGo (CDN 加速)
图片

仓库名:用户名/仓库名
分支名:所属分支
token:
|-seetings
|– Developer settings
|——Personal access tokens 下生成

至此,便可通过 Typora 优雅的编写 Markdown 文档,图片粘贴到文档就能够自动上传到 github 图床了。
PicGo下载:
PicGo 开源地址:https://github.com/Molunerfinn/PicGo

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

Docker-Compose搭建青龙面板

发表于 2022-04-14
字数统计: 322 字 | 阅读时长 ≈ 2 min

简介

青龙面板 自身是可以支持python3、javaScript、shell、typescript 的定时任务管理面板(A timed task management panel that supports typescript, javaScript, python3, and shell.),在这里,我们就是通过它来定时执行js脚本薅羊毛的。

qinglong.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

#mkdir -p /data/ql/{config,log,db,repo,raw,scripts,jbot}
#docker-compose -f qinglong.yml up -d
#qinglong.yml 配置文件如下

# docker run -dit \
# -v $PWD/ql/config:/ql/config \
# -v $PWD/ql/log:/ql/log \
# -v $PWD/ql/db:/ql/db \
# -v $PWD/ql/repo:/ql/repo \
# -v $PWD/ql/raw:/ql/raw \
# -v $PWD/ql/scripts:/ql/scripts \
# -v $PWD/ql/jbot:/ql/jbot \
# -p 5700:5700 \
# --name qinglong \
# --hostname qinglong \
# --restart unless-stopped \
# whyour/qinglong:latest

version: "2"

services:
qinglong:
image: whyour/qinglong:latest
ports:
- "5700:5700"
volumes:
- /data/ql/config:/ql/config \
- /data/ql/log:/ql/log \
- /data/ql/db:/ql/db \
- /data/ql/repo:/ql/repo \
- /data/ql/raw:/ql/raw \
- /data/ql/scripts:/ql/scripts \
- /data/ql/jbot:/ql/jbot \
restart: always
container_name: qinglong
networks:
test-net:
ipv4_address: 172.100.0.98
networks:
test-net:
external: true

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

学之思考试系统搭建

发表于 2022-04-07
字数统计: 3,037 字 | 阅读时长 ≈ 17 min

docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#mkdir -p /data/test-xzs/{conf,data,logs,mysql}
#docker-compose -f test-xzs.yml up -d
#test-xzs.yml 配置文件如下
# docker run -d --name xzs --privileged -it -d -p 28000:8000 -v /etc/localtime:/etc/localtime:ro registry.cn-hangzhou.aliyuncs.com/mindskip/xzs:v3.5.0 /usr/sbin/init
version: "2"

services:
test-xzs:
image: registry.cn-hangzhou.aliyuncs.com/mindskip/xzs:v3.5.0
ports:
- "28000:8000"
- "28006:3306"
privileged: true
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /etc/localtime:/etc/localtime:ro
- /usr/local/xzs:/data/test-xzs/data
restart: always
container_name: test-xzs
networks:
test-net:
ipv4_address: 172.100.0.202
networks:
test-net:
external: true

sql 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
/*
Navicat Premium Data Transfer

Source Server : 192.168.48.131xzs
Source Server Type : MySQL
Source Server Version : 80022
Source Host : 192.168.48.131:28006
Source Schema : xzs

Target Server Type : MySQL
Target Server Version : 80022
File Encoding : 65001

Date: 07/04/2022 17:24:27
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_exam_paper
-- ----------------------------
DROP TABLE IF EXISTS `t_exam_paper`;
CREATE TABLE `t_exam_paper` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '试卷名称',
`subject_id` int NULL DEFAULT NULL COMMENT '学科',
`paper_type` int NULL DEFAULT NULL COMMENT '试卷类型( 1固定试卷 2临时试卷 3班级试卷 4.时段试卷 5.推送试卷)',
`grade_level` int NULL DEFAULT NULL COMMENT '级别',
`score` int NULL DEFAULT NULL COMMENT '试卷总分(千分制)',
`question_count` int NULL DEFAULT NULL COMMENT '题目数量',
`suggest_time` int NULL DEFAULT NULL COMMENT '建议时长(分钟)',
`limit_start_time` datetime NULL DEFAULT NULL COMMENT '时段试卷 开始时间',
`limit_end_time` datetime NULL DEFAULT NULL COMMENT '时段试卷 结束时间',
`frame_text_content_id` int NULL DEFAULT NULL COMMENT '试卷框架 内容为JSON',
`create_user` int NULL DEFAULT NULL,
`create_time` datetime NULL DEFAULT NULL,
`deleted` bit(1) NULL DEFAULT NULL,
`task_exam_id` int NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_exam_paper
-- ----------------------------
INSERT INTO `t_exam_paper` VALUES (1, 'a', 1, 1, 12, 10, 1, 3, NULL, NULL, 2, 2, '2022-04-07 17:13:04', b'0', NULL);

-- ----------------------------
-- Table structure for t_exam_paper_answer
-- ----------------------------
DROP TABLE IF EXISTS `t_exam_paper_answer`;
CREATE TABLE `t_exam_paper_answer` (
`id` int NOT NULL AUTO_INCREMENT,
`exam_paper_id` int NULL DEFAULT NULL,
`paper_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '试卷名称',
`paper_type` int NULL DEFAULT NULL COMMENT '试卷类型( 1固定试卷 2临时试卷 3班级试卷 4.时段试卷 )',
`subject_id` int NULL DEFAULT NULL COMMENT '学科',
`system_score` int NULL DEFAULT NULL COMMENT '系统判定得分',
`user_score` int NULL DEFAULT NULL COMMENT '最终得分(千分制)',
`paper_score` int NULL DEFAULT NULL COMMENT '试卷总分',
`question_correct` int NULL DEFAULT NULL COMMENT '做对题目数量',
`question_count` int NULL DEFAULT NULL COMMENT '题目总数量',
`do_time` int NULL DEFAULT NULL COMMENT '做题时间(秒)',
`status` int NULL DEFAULT NULL COMMENT '试卷状态(1待判分 2完成)',
`create_user` int NULL DEFAULT NULL COMMENT '学生',
`create_time` datetime NULL DEFAULT NULL COMMENT '提交时间',
`task_exam_id` int NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_exam_paper_answer
-- ----------------------------
INSERT INTO `t_exam_paper_answer` VALUES (1, 1, 'a', 1, 1, 0, 0, 10, 0, 1, 2, 2, 1, '2022-04-07 17:14:56', NULL);

-- ----------------------------
-- Table structure for t_exam_paper_question_customer_answer
-- ----------------------------
DROP TABLE IF EXISTS `t_exam_paper_question_customer_answer`;
CREATE TABLE `t_exam_paper_question_customer_answer` (
`id` int NOT NULL AUTO_INCREMENT,
`question_id` int NULL DEFAULT NULL COMMENT '题目Id',
`exam_paper_id` int NULL DEFAULT NULL COMMENT '答案Id',
`exam_paper_answer_id` int NULL DEFAULT NULL,
`question_type` int NULL DEFAULT NULL COMMENT '题型',
`subject_id` int NULL DEFAULT NULL COMMENT '学科',
`customer_score` int NULL DEFAULT NULL COMMENT '得分',
`question_score` int NULL DEFAULT NULL COMMENT '题目原始分数',
`question_text_content_id` int NULL DEFAULT NULL COMMENT '问题内容',
`answer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '做题答案',
`text_content_id` int NULL DEFAULT NULL COMMENT '做题内容',
`do_right` bit(1) NULL DEFAULT NULL COMMENT '是否正确',
`create_user` int NULL DEFAULT NULL COMMENT '做题人',
`create_time` datetime NULL DEFAULT NULL,
`item_order` int NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_exam_paper_question_customer_answer
-- ----------------------------
INSERT INTO `t_exam_paper_question_customer_answer` VALUES (1, 1, 1, 1, 1, 1, 0, 10, 1, NULL, NULL, b'0', 1, '2022-04-07 17:14:56', 1);

-- ----------------------------
-- Table structure for t_message
-- ----------------------------
DROP TABLE IF EXISTS `t_message`;
CREATE TABLE `t_message` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题',
`content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '内容',
`create_time` datetime NULL DEFAULT NULL,
`send_user_id` int NULL DEFAULT NULL COMMENT '发送者用户ID',
`send_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送者用户名',
`send_real_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送者真实姓名',
`receive_user_count` int NULL DEFAULT NULL COMMENT '接收人数',
`read_count` int NULL DEFAULT NULL COMMENT '已读人数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_message
-- ----------------------------

-- ----------------------------
-- Table structure for t_message_user
-- ----------------------------
DROP TABLE IF EXISTS `t_message_user`;
CREATE TABLE `t_message_user` (
`id` int NOT NULL AUTO_INCREMENT,
`message_id` int NULL DEFAULT NULL COMMENT '消息内容ID',
`receive_user_id` int NULL DEFAULT NULL COMMENT '接收人ID',
`receive_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接收人用户名',
`receive_real_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接收人真实姓名',
`readed` bit(1) NULL DEFAULT NULL COMMENT '是否已读',
`create_time` datetime NULL DEFAULT NULL,
`read_time` datetime NULL DEFAULT NULL COMMENT '阅读时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_message_user
-- ----------------------------

-- ----------------------------
-- Table structure for t_question
-- ----------------------------
DROP TABLE IF EXISTS `t_question`;
CREATE TABLE `t_question` (
`id` int NOT NULL AUTO_INCREMENT,
`question_type` int NULL DEFAULT NULL COMMENT '1.单选题 2.多选题 3.判断题 4.填空题 5.简答题',
`subject_id` int NULL DEFAULT NULL COMMENT '学科',
`score` int NULL DEFAULT NULL COMMENT '题目总分(千分制)',
`grade_level` int NULL DEFAULT NULL COMMENT '级别',
`difficult` int NULL DEFAULT NULL COMMENT '题目难度',
`correct` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '正确答案',
`info_text_content_id` int NULL DEFAULT NULL COMMENT '题目 填空、 题干、解析、答案等信息',
`create_user` int NULL DEFAULT NULL COMMENT '创建人',
`status` int NULL DEFAULT NULL COMMENT '1.正常',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`deleted` bit(1) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_question
-- ----------------------------
INSERT INTO `t_question` VALUES (1, 1, 1, 10, 12, 2, 'A', 1, 2, 1, '2022-04-07 17:12:39', b'0');

-- ----------------------------
-- Table structure for t_subject
-- ----------------------------
DROP TABLE IF EXISTS `t_subject`;
CREATE TABLE `t_subject` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '语文 数学 英语 等',
`level` int NULL DEFAULT NULL COMMENT '年级 (1-12) 小学 初中 高中 大学',
`level_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '一年级、二年级等',
`item_order` int NULL DEFAULT NULL COMMENT '排序',
`deleted` bit(1) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_subject
-- ----------------------------
INSERT INTO `t_subject` VALUES (1, '高三学科', 12, '高三', NULL, b'0');

-- ----------------------------
-- Table structure for t_task_exam
-- ----------------------------
DROP TABLE IF EXISTS `t_task_exam`;
CREATE TABLE `t_task_exam` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`grade_level` int NULL DEFAULT NULL COMMENT '级别',
`frame_text_content_id` int NULL DEFAULT NULL COMMENT '任务框架 内容为JSON',
`create_user` int NULL DEFAULT NULL,
`create_time` datetime NULL DEFAULT NULL,
`deleted` bit(1) NULL DEFAULT NULL,
`create_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_task_exam
-- ----------------------------

-- ----------------------------
-- Table structure for t_task_exam_customer_answer
-- ----------------------------
DROP TABLE IF EXISTS `t_task_exam_customer_answer`;
CREATE TABLE `t_task_exam_customer_answer` (
`id` int NOT NULL AUTO_INCREMENT,
`task_exam_id` int NULL DEFAULT NULL,
`create_user` int NULL DEFAULT NULL,
`create_time` datetime NULL DEFAULT NULL,
`text_content_id` int NULL DEFAULT NULL COMMENT '任务完成情况(Json)',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_task_exam_customer_answer
-- ----------------------------

-- ----------------------------
-- Table structure for t_text_content
-- ----------------------------
DROP TABLE IF EXISTS `t_text_content`;
CREATE TABLE `t_text_content` (
`id` int NOT NULL AUTO_INCREMENT,
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`create_time` datetime NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_text_content
-- ----------------------------
INSERT INTO `t_text_content` VALUES (1, '{\"titleContent\":\"sssssssss\",\"analyze\":\"aaaaaaaaaa\",\"questionItemObjects\":[{\"prefix\":\"A\",\"content\":\"<p class=\\\"ueditor-p\\\">aaa</p>\",\"score\":null,\"itemUuid\":null},{\"prefix\":\"B\",\"content\":\"<p class=\\\"ueditor-p\\\">b</p>\",\"score\":null,\"itemUuid\":null},{\"prefix\":\"C\",\"content\":\"<p class=\\\"ueditor-p\\\">ccc</p>\",\"score\":null,\"itemUuid\":null},{\"prefix\":\"D\",\"content\":\"<p class=\\\"ueditor-p\\\" style=\\\"text-align: left;\\\">ddd</p>\",\"score\":null,\"itemUuid\":null}],\"correct\":\"A\"}', '2022-04-07 17:12:39');
INSERT INTO `t_text_content` VALUES (2, '[{\"name\":\"aaa\",\"questionItems\":[{\"id\":1,\"itemOrder\":1}]}]', '2022-04-07 17:13:04');

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int NOT NULL AUTO_INCREMENT,
`user_uuid` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`real_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
`age` int NULL DEFAULT NULL,
`sex` int NULL DEFAULT NULL COMMENT '1.男 2女',
`birth_day` datetime NULL DEFAULT NULL,
`user_level` int NULL DEFAULT NULL COMMENT '学生年级(1-12)',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`role` int NULL DEFAULT NULL COMMENT '1.学生 2.老师 3.管理员',
`status` int NULL DEFAULT NULL COMMENT '1.启用 2禁用',
`image_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像地址',
`create_time` datetime NULL DEFAULT NULL,
`modify_time` datetime NULL DEFAULT NULL,
`last_active_time` datetime NULL DEFAULT NULL,
`deleted` bit(1) NULL DEFAULT NULL COMMENT '是否删除',
`wx_open_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信openId',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'd2d29da2-dcb3-4013-b874-727626236f47', 'student', 'D1AGFL+Gx37t0NPG4d6biYP5Z31cNbwhK5w1lUeiHB2zagqbk8efYfSjYoh1Z/j1dkiRjHU+b0EpwzCh8IGsksJjzD65ci5LsnodQVf4Uj6D3pwoscXGqmkjjpzvSJbx42swwNTA+QoDU8YLo7JhtbUK2X0qCjFGpd+8eJ5BGvk=', '学生', 18, 1, '2019-09-01 16:00:00', 12, '158800882', 1, 1, 'http://xzs.file.mindskip.net/Fp1ogUuzOKPz1FJ_WrlRpAAFTRtX', '2019-09-07 18:55:02', '2020-02-04 08:26:54', NULL, b'0', NULL);
INSERT INTO `t_user` VALUES (2, '52045f5f-a13f-4ccc-93dd-f7ee8270ad4c', 'admin', 'D1AGFL+Gx37t0NPG4d6biYP5Z31cNbwhK5w1lUeiHB2zagqbk8efYfSjYoh1Z/j1dkiRjHU+b0EpwzCh8IGsksJjzD65ci5LsnodQVf4Uj6D3pwoscXGqmkjjpzvSJbx42swwNTA+QoDU8YLo7JhtbUK2X0qCjFGpd+8eJ5BGvk=', '管理员', 30, 1, '2019-09-07 18:56:07', NULL, NULL, 3, 1, NULL, '2019-09-07 18:56:21', NULL, NULL, b'0', NULL);

-- ----------------------------
-- Table structure for t_user_event_log
-- ----------------------------
DROP TABLE IF EXISTS `t_user_event_log`;
CREATE TABLE `t_user_event_log` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NULL DEFAULT NULL COMMENT '用户id',
`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
`real_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',
`create_time` datetime NULL DEFAULT NULL COMMENT '时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_user_event_log
-- ----------------------------
INSERT INTO `t_user_event_log` VALUES (1, 2, 'admin', '管理员', 'admin 登录了学之思考试系统', '2020-11-17 16:01:19');
INSERT INTO `t_user_event_log` VALUES (2, 2, 'admin', '管理员', 'admin 登出了学之思考试系统', '2020-11-17 16:02:43');
INSERT INTO `t_user_event_log` VALUES (3, 2, 'admin', '管理员', 'admin 登录了学之思考试系统', '2020-11-17 16:03:19');
INSERT INTO `t_user_event_log` VALUES (4, 1, 'student', '学生', 'student 登录了学之思考试系统', '2020-11-17 16:36:18');
INSERT INTO `t_user_event_log` VALUES (5, 1, 'student', '学生', 'student 登录了学之思考试系统', '2021-01-29 10:04:37');
INSERT INTO `t_user_event_log` VALUES (6, 2, 'admin', '管理员', 'admin 登录了学之思考试系统', '2021-01-29 10:32:42');
INSERT INTO `t_user_event_log` VALUES (7, 2, 'admin', '管理员', 'admin 登出了学之思考试系统', '2021-01-29 10:32:56');
INSERT INTO `t_user_event_log` VALUES (8, 2, 'admin', '管理员', 'admin 登录了学之思考试系统', '2021-03-17 12:29:46');
INSERT INTO `t_user_event_log` VALUES (9, 2, 'admin', '管理员', 'admin 登出了学之思考试系统', '2021-03-17 12:31:37');
INSERT INTO `t_user_event_log` VALUES (10, 2, 'admin', '管理员', 'admin 登录了学之思考试系统', '2021-03-17 12:31:44');
INSERT INTO `t_user_event_log` VALUES (11, 2, 'admin', '管理员', 'admin 登出了学之思考试系统', '2021-03-17 12:48:18');
INSERT INTO `t_user_event_log` VALUES (12, 1, 'student', '学生', 'student 登录了学之思考试系统', '2021-03-17 12:48:34');
INSERT INTO `t_user_event_log` VALUES (13, 1, 'student', '学生', 'student 登出了学之思考试系统', '2021-03-17 12:49:09');
INSERT INTO `t_user_event_log` VALUES (14, 1, 'student', '学生', 'student 登录了学之思开源考试系统', '2022-04-07 17:14:51');
INSERT INTO `t_user_event_log` VALUES (15, 1, 'student', '学生', 'student 提交试卷:a 得分:0 耗时:2 秒', '2022-04-07 17:14:56');
INSERT INTO `t_user_event_log` VALUES (16, 2, 'admin', '管理员', 'admin 登录了学之思开源考试系统', '2022-04-07 17:17:10');

-- ----------------------------
-- Table structure for t_user_token
-- ----------------------------
DROP TABLE IF EXISTS `t_user_token`;
CREATE TABLE `t_user_token` (
`id` int NOT NULL AUTO_INCREMENT,
`token` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`user_id` int NULL DEFAULT NULL COMMENT '用户Id',
`wx_open_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信openId',
`create_time` datetime NULL DEFAULT NULL,
`end_time` datetime NULL DEFAULT NULL,
`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

-- ----------------------------
-- Records of t_user_token
-- ----------------------------

SET FOREIGN_KEY_CHECKS = 1;

一辈子很短,努力的做好两件事就好:
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱。

Sqlserver分组合并数据和多级查询

发表于 2022-03-22
字数统计: 258 字 | 阅读时长 ≈ 1 min

分组后按字段拼接

【例如】:
部门表:id,name,parent_id
选择某一部门时,该部门下所有子部门分组,将名字拼接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

SELECT
parent_id,
NAME = stuff ((
SELECT
',' + NAME
FROM
organization t
WHERE
t.parent_id = a.parent_id FOR XML path ( '' )),
1,
1,
''
)
FROM
organization a
GROUP BY
parent_id

多级树形查询

Sql Server:
使用Common Table Expression (CTE)
【例如】:
部门表:id,name,parent_id
选择某一部门时,该部门下所有子部门、子子部门全部遍历出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH cte_child ( id, NAME, parent_id ) AS (
SELECT
id,
NAME,
parent_id
FROM
organization
WHERE
id = 50 UNION ALL
SELECT
a.id,
a.NAME,
a.parent_id
FROM
organization a
INNER JOIN cte_child b ON ( a.parent_id = b.id )) SELECT
*
FROM
cte_child

一辈子很短,努力的做好两件事就好:
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱。

1…131415…38

继开

一辈子很短,努力的做好两件事就好:第一件事是热爱生活,好好的去爱身边的人;第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱。

303 日志
171 标签
RSS
gitee E-Mail
0%
鲁ICP备18007712号
© 2025 继开 | 站点字数统计: 262.2k
博客使用 Hexo 搭建
|
主题 — NexT.Mist v5.1.4
人访问 次查看