Merge branch 'master' of http://git.hchbox.com/yuyou/eladmin into master
commit
14891755d0
@ -0,0 +1,5 @@
|
||||
package me.zhengjie.modules.buildrecord.rest.consts;
|
||||
|
||||
public class Sysconts {
|
||||
public static final Integer NO_SEND = 0;
|
||||
}
|
@ -0,0 +1,616 @@
|
||||
package me.zhengjie.modules.buildrecord.util;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.HashMap;
|
||||
|
||||
|
||||
public class KeyWordFilter {
|
||||
public static final String PATH_DIC_WFC = "/lib/wfc.dic";
|
||||
public static final String PATH_DIC_FQC = "/lib/fqc.dic";
|
||||
private HashMap<String, String> wfc_map = null;
|
||||
private HashMap<String, String> fqc_map = null;
|
||||
private HashMap<String, Integer> firstword_map = new HashMap<String, Integer>();
|
||||
private HashMap<String, Integer> firstword_fqc_map = new HashMap<String, Integer>();
|
||||
private static KeyWordFilter singleton;
|
||||
|
||||
private KeyWordFilter() {
|
||||
}
|
||||
|
||||
public synchronized static KeyWordFilter getInstance() {
|
||||
if (singleton == null) {
|
||||
singleton = new KeyWordFilter();
|
||||
}
|
||||
return singleton;
|
||||
}
|
||||
|
||||
public synchronized HashMap<String, String> getWfcMap() {
|
||||
if (wfc_map == null) {
|
||||
wfc_map = getWordMap(PATH_DIC_WFC, "");
|
||||
}
|
||||
return wfc_map;
|
||||
}
|
||||
|
||||
public synchronized HashMap<String, String> getFqcMap() {
|
||||
if (fqc_map == null) {
|
||||
fqc_map = getWordMap(PATH_DIC_FQC, "");
|
||||
}
|
||||
return fqc_map;
|
||||
}
|
||||
|
||||
public synchronized HashMap<String, Integer> getFirstwordMap() {
|
||||
if (firstword_map == null) {
|
||||
firstword_map = new HashMap<String, Integer>();
|
||||
}
|
||||
return firstword_map;
|
||||
}
|
||||
|
||||
public synchronized HashMap<String, Integer> getFirstwordFqcMap() {
|
||||
if (firstword_fqc_map == null) {
|
||||
firstword_fqc_map = new HashMap<String, Integer>();
|
||||
}
|
||||
return firstword_fqc_map;
|
||||
}
|
||||
|
||||
public boolean reload() {
|
||||
try {
|
||||
wfc_map = null;
|
||||
fqc_map = null;
|
||||
KeyWordFilter.getInstance().getWfcMap();
|
||||
KeyWordFilter.getInstance().getFqcMap();
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean restart() {
|
||||
try {
|
||||
singleton = null;
|
||||
getInstance();
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private HashMap<String, String> getWordMap(String dicPath, String replace) {
|
||||
InputStream is = null;
|
||||
HashMap<String, String> wordMap = new HashMap<String, String>();
|
||||
try {
|
||||
// is = new FileInputStream(dicPath);
|
||||
is = KeyWordFilter.class.getResourceAsStream(dicPath);
|
||||
if (is == null) {
|
||||
System.out.println(dicPath + " not found!!!");
|
||||
}
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is,
|
||||
"UTF-8"), 512);
|
||||
String theWord = null;
|
||||
HashMap<String, Integer> firstword = getFirstwordMap();
|
||||
HashMap<String, Integer> firstword_fqc = getFirstwordFqcMap();
|
||||
|
||||
String ss = null;
|
||||
if (dicPath.equals(PATH_DIC_FQC)) {
|
||||
do {
|
||||
theWord = br.readLine();
|
||||
if (theWord != null && !"".equals(theWord.trim())) {
|
||||
String[] sss = theWord.trim().toLowerCase().split("@@");
|
||||
if (sss[0] != null && !sss[0].equals("")) {
|
||||
if (firstword_fqc
|
||||
.containsKey(sss[0].toCharArray()[0] + "")
|
||||
&& firstword_fqc
|
||||
.get(sss[0].toCharArray()[0] + "") > sss[0]
|
||||
.length()) {
|
||||
// do nothing
|
||||
} else {
|
||||
firstword_fqc.put(sss[0].toCharArray()[0] + "",
|
||||
sss[0].length());
|
||||
}
|
||||
wordMap.put(sss[0], sss.length == 1 ? "" : sss[1]);
|
||||
}
|
||||
}
|
||||
} while (theWord != null);
|
||||
} else {
|
||||
do {
|
||||
theWord = br.readLine();
|
||||
if (theWord != null && !"".equals(theWord.trim())) {
|
||||
ss = theWord.trim().toLowerCase();
|
||||
if (firstword.containsKey(ss.toCharArray()[0] + "")
|
||||
&& firstword.get(ss.toCharArray()[0] + "") > ss
|
||||
.length()) {
|
||||
// do nothing
|
||||
} else {
|
||||
firstword.put(theWord.trim().toLowerCase()
|
||||
.toCharArray()[0]
|
||||
+ "", ss.length());
|
||||
}
|
||||
wordMap.put(theWord.trim().toLowerCase(), replace);
|
||||
}
|
||||
} while (theWord != null);
|
||||
|
||||
}
|
||||
|
||||
} catch (IOException ioe) {
|
||||
if (is == null) {
|
||||
System.err.println(dicPath + " not found!!!");
|
||||
} else {
|
||||
System.err.println(dicPath + " loading exception.");
|
||||
}
|
||||
ioe.printStackTrace();
|
||||
|
||||
} finally {
|
||||
try {
|
||||
if (is != null) {
|
||||
is.close();
|
||||
is = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return wordMap;
|
||||
}
|
||||
|
||||
public String filter_in(String content, String sta, String usid) {
|
||||
if (content == null || content.length() <= 0) {
|
||||
return "0";
|
||||
}
|
||||
if (usid == null) {
|
||||
usid = "0";
|
||||
}
|
||||
HashMap<String, String> wfc_map = KeyWordFilter.getInstance()
|
||||
.getWfcMap();
|
||||
HashMap<String, String> fqc_map = KeyWordFilter.getInstance()
|
||||
.getFqcMap();
|
||||
HashMap<String, Integer> firstword_map = KeyWordFilter.getInstance()
|
||||
.getFirstwordMap();
|
||||
HashMap<String, Integer> firstword_fqc_map = KeyWordFilter
|
||||
.getInstance().getFirstwordFqcMap();
|
||||
|
||||
int result_type = 0;
|
||||
char[] ch = content.toCharArray();
|
||||
StringBuffer ret = new StringBuffer();
|
||||
StringBuffer word = new StringBuffer();
|
||||
int start = 0;
|
||||
int step = 0;
|
||||
int max_length = 1;
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_fqc_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append(fqc_map.get(tmp.toLowerCase()));
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
ch = ret.toString().toCharArray();
|
||||
word = new StringBuffer();
|
||||
start = 0;
|
||||
step = 0;
|
||||
if (sta.equals("1")) {
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
|
||||
if (!firstword_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (wfc_map.containsKey(tmp.toLowerCase())) {
|
||||
result_type = 2;
|
||||
break;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
} else if (sta.equals("0")) {
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (wfc_map.containsKey(tmp.toLowerCase())) {
|
||||
result_type = 2;
|
||||
break;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Integer.toString(result_type);
|
||||
|
||||
}
|
||||
|
||||
public String filter_out(String content, String sta, String usid) {
|
||||
if (content == null || content.length() <= 0) {
|
||||
return "";
|
||||
}
|
||||
if (usid == null) {
|
||||
usid = "0";
|
||||
}
|
||||
HashMap<String, String> wfc_map = KeyWordFilter.getInstance()
|
||||
.getWfcMap();
|
||||
HashMap<String, String> fqc_map = KeyWordFilter.getInstance()
|
||||
.getFqcMap();
|
||||
HashMap<String, Integer> firstword_map = KeyWordFilter.getInstance()
|
||||
.getFirstwordMap();
|
||||
HashMap<String, Integer> firstword_fqc_map = KeyWordFilter
|
||||
.getInstance().getFirstwordFqcMap();
|
||||
|
||||
char[] ch = content.toCharArray();
|
||||
StringBuffer ret = new StringBuffer();
|
||||
StringBuffer word = new StringBuffer();
|
||||
int start = 0;
|
||||
int step = 0;
|
||||
int max_length = 1;
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_fqc_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append(fqc_map.get(tmp.toLowerCase()));
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
ch = ret.toString().toCharArray();
|
||||
ret = new StringBuffer();
|
||||
word = new StringBuffer();
|
||||
start = 0;
|
||||
step = 0;
|
||||
|
||||
if (sta.equals("1")) {
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
// System.out.println("i="+i+"\tstart="+start+"\tstep="+step+"\tret="+ret.toString());
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
|
||||
if (!firstword_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (wfc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append("");
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
|
||||
}
|
||||
} else if (sta.equals("0")) {
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (wfc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append("");
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String rs = ret.toString().replace("⊙", "");
|
||||
return rs;
|
||||
}
|
||||
|
||||
public String filter_search(String content) {
|
||||
if (content == null || content.length() <= 0) {
|
||||
return "";
|
||||
}
|
||||
HashMap<String, String> fqc_map = KeyWordFilter.getInstance()
|
||||
.getFqcMap();
|
||||
HashMap<String, String> wfc_map = KeyWordFilter.getInstance()
|
||||
.getWfcMap();
|
||||
HashMap<String, Integer> firstword_map = KeyWordFilter.getInstance()
|
||||
.getFirstwordMap();
|
||||
HashMap<String, Integer> firstword_fqc_map = KeyWordFilter
|
||||
.getInstance().getFirstwordFqcMap();
|
||||
|
||||
char[] ch = content.toCharArray();
|
||||
StringBuffer ret = new StringBuffer();
|
||||
StringBuffer word = new StringBuffer();
|
||||
int start = 0;
|
||||
int step = 0;
|
||||
int max_length = 1;
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_fqc_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append(fqc_map.get(tmp.toLowerCase()));
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
ch = ret.toString().toCharArray();
|
||||
ret = new StringBuffer();
|
||||
word = new StringBuffer();
|
||||
start = 0;
|
||||
step = 0;
|
||||
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (wfc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append("");
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
|
||||
String rs = ret.toString().replace("⊙", "");
|
||||
return rs;
|
||||
}
|
||||
|
||||
public String filter_jk(String content, String sta, String usid,
|
||||
String mgcstyle1, String mgcstyle2, String wfcstyle1,
|
||||
String wfcstyle2) {
|
||||
if (content == null || content.length() <= 0) {
|
||||
return "";
|
||||
}
|
||||
if (usid == null) {
|
||||
usid = "0";
|
||||
}
|
||||
HashMap<String, String> wfc_map = KeyWordFilter.getInstance()
|
||||
.getWfcMap();
|
||||
HashMap<String, String> fqc_map = KeyWordFilter.getInstance()
|
||||
.getFqcMap();
|
||||
HashMap<String, Integer> firstword_map = KeyWordFilter.getInstance()
|
||||
.getFirstwordMap();
|
||||
HashMap<String, Integer> firstword_fqc_map = KeyWordFilter
|
||||
.getInstance().getFirstwordFqcMap();
|
||||
|
||||
char[] ch = content.toCharArray();
|
||||
StringBuffer ret = new StringBuffer();
|
||||
StringBuffer word = new StringBuffer();
|
||||
int start = 0;
|
||||
int step = 0;
|
||||
int max_length = 1;
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_fqc_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (fqc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append(fqc_map.get(tmp.toLowerCase()));
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
ch = ret.toString().toCharArray();
|
||||
ret = new StringBuffer();
|
||||
word = new StringBuffer();
|
||||
start = 0;
|
||||
step = 0;
|
||||
|
||||
if (sta.equals("1")) {
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (wfc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append(wfcstyle1);
|
||||
ret.append(tmp.toLowerCase());
|
||||
ret.append(wfcstyle2);
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
} else if (sta.equals("0")) {
|
||||
for (int i = 0; i < ch.length; i++) {
|
||||
if (step == 0) {
|
||||
start = i;
|
||||
step = 1;
|
||||
}
|
||||
char c = ch[i];
|
||||
word.append(c);
|
||||
String tmp = word.toString();
|
||||
if (i == start) {
|
||||
if (!firstword_map.containsKey(tmp.toLowerCase())) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
continue;
|
||||
} else {
|
||||
max_length = firstword_map.get(tmp.toLowerCase());
|
||||
}
|
||||
}
|
||||
if (wfc_map.containsKey(tmp.toLowerCase())) {
|
||||
ret.append(wfcstyle1);
|
||||
ret.append(tmp.toLowerCase());
|
||||
ret.append(wfcstyle2);
|
||||
step = 0;
|
||||
} else if (word.length() >= max_length || i >= ch.length - 1) {
|
||||
step = 0;
|
||||
ret.append(ch[start]);
|
||||
word.delete(0, word.length());
|
||||
i = start;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String rs = ret.toString().replace("⊙", "");
|
||||
return rs;
|
||||
}
|
||||
}
|
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import javax.persistence.*;
|
||||
import javax.validation.constraints.*;
|
||||
import java.sql.Timestamp;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @description /
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name="tb_send_sms_content")
|
||||
public class TbSendSmsContent implements Serializable {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
@ApiModelProperty(value = "id")
|
||||
private Long id;
|
||||
|
||||
@Column(name = "gmt_create")
|
||||
@ApiModelProperty(value = "创建时间")
|
||||
private Timestamp gmtCreate;
|
||||
|
||||
@Column(name = "gmt_modified")
|
||||
@ApiModelProperty(value = "修改时间")
|
||||
private Timestamp gmtModified;
|
||||
|
||||
@Column(name = "operation")
|
||||
@ApiModelProperty(value = "操作人")
|
||||
private String operation;
|
||||
|
||||
@Column(name = "task_name")
|
||||
@ApiModelProperty(value = "任务名称")
|
||||
private String taskName;
|
||||
|
||||
@Column(name = "sms_content")
|
||||
@ApiModelProperty(value = "短信内容")
|
||||
private String smsContent;
|
||||
|
||||
@Column(name = "send_status")
|
||||
@ApiModelProperty(value = "推送状态")
|
||||
private Integer sendStatus;
|
||||
|
||||
@Column(name = "push_time")
|
||||
@ApiModelProperty(value = "推送时间")
|
||||
private Timestamp pushTime;
|
||||
|
||||
@Column(name = "link_url")
|
||||
@ApiModelProperty(value = "推送时间")
|
||||
private String linkUrl;
|
||||
|
||||
public void copy(TbSendSmsContent source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.repository;
|
||||
|
||||
import me.zhengjie.modules.smscontent.domain.TbSendSmsContent;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
public interface TbSendSmsContentRepository extends JpaRepository<TbSendSmsContent, Long>, JpaSpecificationExecutor<TbSendSmsContent> {
|
||||
}
|
@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.rest;
|
||||
|
||||
import me.zhengjie.annotation.Log;
|
||||
import me.zhengjie.modules.smscontent.domain.TbSendSmsContent;
|
||||
import me.zhengjie.modules.smscontent.service.TbSendSmsContentService;
|
||||
import me.zhengjie.modules.smscontent.service.dto.TbSendSmsContentQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import io.swagger.annotations.*;
|
||||
import java.io.IOException;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@Api(tags = "发送短信内容管理")
|
||||
@RequestMapping("/api/tbSendSmsContent")
|
||||
public class TbSendSmsContentController {
|
||||
|
||||
private final TbSendSmsContentService tbSendSmsContentService;
|
||||
|
||||
@Log("导出数据")
|
||||
@ApiOperation("导出数据")
|
||||
@GetMapping(value = "/download")
|
||||
@PreAuthorize("@el.check('tbSendSmsContent:list')")
|
||||
public void download(HttpServletResponse response, TbSendSmsContentQueryCriteria criteria) throws IOException {
|
||||
tbSendSmsContentService.download(tbSendSmsContentService.queryAll(criteria), response);
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
@Log("查询发送短信内容")
|
||||
@ApiOperation("查询发送短信内容")
|
||||
@PreAuthorize("@el.check('tbSendSmsContent:list')")
|
||||
public ResponseEntity<Object> query(TbSendSmsContentQueryCriteria criteria, Pageable pageable){
|
||||
return new ResponseEntity<>(tbSendSmsContentService.queryAll(criteria,pageable),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
@Log("新增发送短信内容")
|
||||
@ApiOperation("新增发送短信内容")
|
||||
@PreAuthorize("@el.check('tbSendSmsContent:add')")
|
||||
public ResponseEntity<Object> create(@Validated @RequestBody TbSendSmsContent resources){
|
||||
return new ResponseEntity<>(tbSendSmsContentService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
@Log("修改发送短信内容")
|
||||
@ApiOperation("修改发送短信内容")
|
||||
@PreAuthorize("@el.check('tbSendSmsContent:edit')")
|
||||
public ResponseEntity<Object> update(@Validated @RequestBody TbSendSmsContent resources){
|
||||
tbSendSmsContentService.update(resources);
|
||||
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除发送短信内容")
|
||||
@ApiOperation("删除发送短信内容")
|
||||
@PreAuthorize("@el.check('tbSendSmsContent:del')")
|
||||
@DeleteMapping
|
||||
public ResponseEntity<Object> delete(@RequestBody Long[] ids) {
|
||||
tbSendSmsContentService.deleteAll(ids);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.service;
|
||||
|
||||
import me.zhengjie.modules.smscontent.domain.TbSendSmsContent;
|
||||
import me.zhengjie.modules.smscontent.service.dto.TbSendSmsContentDto;
|
||||
import me.zhengjie.modules.smscontent.service.dto.TbSendSmsContentQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
import java.io.IOException;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @description 服务接口
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
public interface TbSendSmsContentService {
|
||||
|
||||
/**
|
||||
* 查询数据分页
|
||||
* @param criteria 条件
|
||||
* @param pageable 分页参数
|
||||
* @return Map<String,Object>
|
||||
*/
|
||||
Map<String,Object> queryAll(TbSendSmsContentQueryCriteria criteria, Pageable pageable);
|
||||
|
||||
/**
|
||||
* 查询所有数据不分页
|
||||
* @param criteria 条件参数
|
||||
* @return List<TbSendSmsContentDto>
|
||||
*/
|
||||
List<TbSendSmsContentDto> queryAll(TbSendSmsContentQueryCriteria criteria);
|
||||
|
||||
/**
|
||||
* 根据ID查询
|
||||
* @param id ID
|
||||
* @return TbSendSmsContentDto
|
||||
*/
|
||||
TbSendSmsContentDto findById(Long id);
|
||||
|
||||
/**
|
||||
* 创建
|
||||
* @param resources /
|
||||
* @return TbSendSmsContentDto
|
||||
*/
|
||||
TbSendSmsContentDto create(TbSendSmsContent resources);
|
||||
|
||||
/**
|
||||
* 编辑
|
||||
* @param resources /
|
||||
*/
|
||||
void update(TbSendSmsContent resources);
|
||||
|
||||
/**
|
||||
* 多选删除
|
||||
* @param ids /
|
||||
*/
|
||||
void deleteAll(Long[] ids);
|
||||
|
||||
/**
|
||||
* 导出数据
|
||||
* @param all 待导出的数据
|
||||
* @param response /
|
||||
* @throws IOException /
|
||||
*/
|
||||
void download(List<TbSendSmsContentDto> all, HttpServletResponse response) throws IOException;
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.sql.Timestamp;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @description /
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
@Data
|
||||
public class TbSendSmsContentDto implements Serializable {
|
||||
|
||||
private Long id;
|
||||
|
||||
/** 创建时间 */
|
||||
private Timestamp gmtCreate;
|
||||
|
||||
/** 修改时间 */
|
||||
private Timestamp gmtModified;
|
||||
|
||||
/** 操作人 */
|
||||
private String operation;
|
||||
|
||||
/** 任务名称 */
|
||||
private String taskName;
|
||||
|
||||
/** 短信内容 */
|
||||
private String smsContent;
|
||||
|
||||
/** 推送状态 */
|
||||
private Integer sendStatus;
|
||||
|
||||
/** 推送时间 */
|
||||
private Timestamp pushTime;
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.List;
|
||||
import me.zhengjie.annotation.Query;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
@Data
|
||||
public class TbSendSmsContentQueryCriteria{
|
||||
|
||||
/** 模糊 */
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String operation;
|
||||
|
||||
/** 模糊 */
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String taskName;
|
||||
|
||||
/** 模糊 */
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String smsContent;
|
||||
/** BETWEEN */
|
||||
@Query(type = Query.Type.BETWEEN)
|
||||
private List<Timestamp> createTime;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.service.impl;
|
||||
|
||||
import me.zhengjie.modules.smscontent.domain.TbSendSmsContent;
|
||||
import me.zhengjie.utils.ValidationUtil;
|
||||
import me.zhengjie.utils.FileUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import me.zhengjie.modules.smscontent.repository.TbSendSmsContentRepository;
|
||||
import me.zhengjie.modules.smscontent.service.TbSendSmsContentService;
|
||||
import me.zhengjie.modules.smscontent.service.dto.TbSendSmsContentDto;
|
||||
import me.zhengjie.modules.smscontent.service.dto.TbSendSmsContentQueryCriteria;
|
||||
import me.zhengjie.modules.smscontent.service.mapstruct.TbSendSmsContentMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import me.zhengjie.utils.PageUtil;
|
||||
import me.zhengjie.utils.QueryHelp;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.io.IOException;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @description 服务实现
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class TbSendSmsContentServiceImpl implements TbSendSmsContentService {
|
||||
|
||||
private final TbSendSmsContentRepository tbSendSmsContentRepository;
|
||||
private final TbSendSmsContentMapper tbSendSmsContentMapper;
|
||||
|
||||
@Override
|
||||
public Map<String,Object> queryAll(TbSendSmsContentQueryCriteria criteria, Pageable pageable){
|
||||
Page<TbSendSmsContent> page = tbSendSmsContentRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
|
||||
return PageUtil.toPage(page.map(tbSendSmsContentMapper::toDto));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TbSendSmsContentDto> queryAll(TbSendSmsContentQueryCriteria criteria){
|
||||
return tbSendSmsContentMapper.toDto(tbSendSmsContentRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public TbSendSmsContentDto findById(Long id) {
|
||||
TbSendSmsContent tbSendSmsContent = tbSendSmsContentRepository.findById(id).orElseGet(TbSendSmsContent::new);
|
||||
ValidationUtil.isNull(tbSendSmsContent.getId(),"TbSendSmsContent","id",id);
|
||||
return tbSendSmsContentMapper.toDto(tbSendSmsContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public TbSendSmsContentDto create(TbSendSmsContent resources) {
|
||||
return tbSendSmsContentMapper.toDto(tbSendSmsContentRepository.save(resources));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(TbSendSmsContent resources) {
|
||||
TbSendSmsContent tbSendSmsContent = tbSendSmsContentRepository.findById(resources.getId()).orElseGet(TbSendSmsContent::new);
|
||||
ValidationUtil.isNull( tbSendSmsContent.getId(),"TbSendSmsContent","id",resources.getId());
|
||||
tbSendSmsContent.copy(resources);
|
||||
tbSendSmsContentRepository.save(tbSendSmsContent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteAll(Long[] ids) {
|
||||
for (Long id : ids) {
|
||||
tbSendSmsContentRepository.deleteById(id);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void download(List<TbSendSmsContentDto> all, HttpServletResponse response) throws IOException {
|
||||
List<Map<String, Object>> list = new ArrayList<>();
|
||||
for (TbSendSmsContentDto tbSendSmsContent : all) {
|
||||
Map<String,Object> map = new LinkedHashMap<>();
|
||||
map.put("创建时间", tbSendSmsContent.getGmtCreate());
|
||||
map.put("修改时间", tbSendSmsContent.getGmtModified());
|
||||
map.put("操作人", tbSendSmsContent.getOperation());
|
||||
map.put("任务名称", tbSendSmsContent.getTaskName());
|
||||
map.put("短信内容", tbSendSmsContent.getSmsContent());
|
||||
map.put("推送状态", tbSendSmsContent.getSendStatus());
|
||||
map.put("推送时间", tbSendSmsContent.getPushTime());
|
||||
list.add(map);
|
||||
}
|
||||
FileUtil.downloadExcel(list, response);
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package me.zhengjie.modules.smscontent.service.mapstruct;
|
||||
|
||||
import me.zhengjie.base.BaseMapper;
|
||||
import me.zhengjie.modules.smscontent.domain.TbSendSmsContent;
|
||||
import me.zhengjie.modules.smscontent.service.dto.TbSendSmsContentDto;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
/**
|
||||
* @website https://el-admin.vip
|
||||
* @author weizhongxi
|
||||
* @date 2021-04-16
|
||||
**/
|
||||
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface TbSendSmsContentMapper extends BaseMapper<TbSendSmsContentDto, TbSendSmsContent> {
|
||||
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
南宁市永安@@南宁市永⊙安
|
||||
硫酸亚铁@@硫⊙酸亚铁
|
||||
硫酸铁@@硫⊙酸铁
|
||||
硫酸镁@@硫⊙酸镁
|
||||
成人学校@@成⊙人学校
|
||||
成人高考@@成⊙人高考
|
||||
蛋白粉@@蛋白⊙粉
|
||||
屏蔽电缆@@屏⊙蔽电缆
|
||||
钛白粉@@钛白⊙粉
|
||||
华莉达弹簧@@华莉达弹⊙簧
|
||||
沙发转盘@@沙发转⊙盘
|
||||
艺博彩鸿@@艺博⊙彩鸿
|
||||
屏蔽线@@屏⊙蔽线
|
||||
屏蔽网络线@@屏⊙蔽网络线
|
||||
隐形纱窗@@隐⊙形纱窗
|
||||
现代办公@@现代⊙办公
|
||||
钻枪支架@@钻枪⊙支架
|
||||
一次性用品@@一次性⊙用品
|
||||
广东王牌@@广东⊙王牌
|
||||
永康市@@永⊙康市
|
||||
门口交易@@门口⊙交易
|
||||
感情色彩@@感情⊙色彩
|
||||
港口交通@@港口⊙交通
|
||||
路口交通@@路口⊙交通
|
||||
口交换机@@口⊙交换机
|
||||
宝鸡巴士@@宝鸡⊙巴士
|
||||
江阴道路@@江阴⊙道路
|
||||
千百度@@千百⊙度
|
||||
解放军7@@解⊙放军7
|
||||
解放军七@@解⊙放军七
|
||||
茅台镇@@茅⊙台镇
|
||||
优阳科技@@优⊙阳科技
|
||||
打折机票预订@@打折机⊙票预订
|
||||
三螺@@三⊙螺
|
||||
3螺@@3⊙螺
|
||||
漂白粉@@漂白⊙粉
|
||||
电动车@@电动⊙车
|
||||
硫酸泵@@硫⊙酸泵
|
||||
硫酸离心泵@@硫⊙酸离心泵
|
||||
硫酸液下泵@@硫⊙酸液下泵
|
||||
硫酸钡@@硫⊙酸钡
|
||||
硫酸铵@@硫⊙酸铵
|
||||
ngcd@@ng⊙cd
|
||||
铅丝石笼@@铅⊙丝石笼
|
||||
ISO认证@@ISO认⊙证
|
||||
UC4@@UC⊙4
|
||||
厨房刀具@@厨房刀⊙具
|
||||
兽药@@兽⊙药
|
||||
电动门遥控器@@电动门遥控⊙器
|
||||
卷帘门遥控器@@卷帘门遥控⊙器
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue