图谱完成

master
hujunbo 3 years ago
parent 849277cc01
commit 959678187e

@ -10,7 +10,7 @@
<name>ruoyi</name>
<url>http://www.ruoyi.vip</url>
<description>若依管理系统</description>
<description>管理系统</description>
<properties>
<ruoyi.version>3.8.3</ruoyi.version>

@ -31,4 +31,8 @@ public class SyncData {
}
}
public void mysqlToMongo(){
}
}

@ -113,7 +113,7 @@ public class SwaggerConfig
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:若依管理系统_接口文档")
.title("标题:管理系统_接口文档")
// 描述
.description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
// 作者信息

@ -89,7 +89,7 @@ token:
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期默认30分钟
expireTime: 30
expireTime: 1440
# MyBatis配置
mybatis:

@ -1,5 +1,6 @@
package com.ruoyi.biemo.business.controller;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.biemo.business.domain.DocInfo;
import com.ruoyi.biemo.business.service.DocInfoService;
import com.ruoyi.biemo.core.page.Page;
@ -88,8 +89,8 @@ public class DocInfoController extends BaseController {
return AjaxResult.success();
}
@PostMapping("/analysis")
public AjaxResult analysis(String id){
@GetMapping("/analysis/{id}")
public AjaxResult analysis(@PathVariable String id){
return AjaxResult.success(docInfoService.analysis(id));
}
}

@ -35,6 +35,8 @@ public class DocInfo implements Serializable {
private String author;
@FieldInfo(type = "keyword",participle = 0)
private String source;
@FieldInfo(type = "keyword",participle = 0)
private String url;
@FieldInfo(type = "long",participle = 0)
private Long click;
@FieldInfo(type = "keyword",participle = 0)

@ -0,0 +1,38 @@
package com.ruoyi.biemo.business.domain;
import java.util.List;
import java.util.Map;
//节点类
public class Node {
private String id;
private List<String> labels;
private Map<String,Object> properties;
public Node() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<String> getLabels() {
return labels;
}
public void setLabels(List<String> labels) {
this.labels = labels;
}
public Map<String, Object> getProperties() {
return properties;
}
public void setProperties(Map<String, Object> properties) {
this.properties = properties;
}
}

@ -0,0 +1,54 @@
package com.ruoyi.biemo.business.domain;
import java.util.Map;
public class Relationship {
private String id;
private String type;
private String startNode;
private String endNode;
private Map<String,Object> properties;
public Relationship() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getStartNode() {
return startNode;
}
public void setStartNode(String startNode) {
this.startNode = startNode;
}
public String getEndNode() {
return endNode;
}
public void setEndNode(String endNode) {
this.endNode = endNode;
}
public Map<String, Object> getProperties() {
return properties;
}
public void setProperties(Map<String, Object> properties) {
this.properties = properties;
}
}

@ -0,0 +1,80 @@
package com.ruoyi.biemo.business.response;
import com.ruoyi.biemo.business.domain.Node;
import com.ruoyi.biemo.business.domain.Relationship;
import java.util.List;
public class MyResultResponse {
private List<Datas> results;
private List<String> errors;
public List<String> getErrors() {
return errors;
}
public void setErrors(List<String> errors) {
this.errors = errors;
}
public List<Datas> getResults() {
return results;
}
public void setResults(List<Datas> results) {
this.results = results;
}
public static class Datas{
private List<String> columns;
private List<Data> data;
public List<String> getColumns() {
return columns;
}
public void setColumns(List<String> columns) {
this.columns = columns;
}
public List<Data> getData() {
return data;
}
public void setData(List<Data> data) {
this.data = data;
}
}
public static class Data{
private Graph graph;
public Graph getGraph() {
return graph;
}
public void setGraph(Graph graph) {
this.graph = graph;
}
}
public static class Graph{
private List<Node> nodes;
private List<Relationship> relationships;
public List<Node> getNodes() {
return nodes;
}
public void setNodes(List<Node> nodes) {
this.nodes = nodes;
}
public List<Relationship> getRelationships() {
return relationships;
}
public void setRelationships(List<Relationship> relationships) {
this.relationships = relationships;
}
}
}

@ -1,14 +1,18 @@
package com.ruoyi.biemo.business.service;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.util.StringUtil;
import com.ruoyi.biemo.business.domain.DocInfo;
import com.ruoyi.biemo.business.domain.event.CategoryDeleteEvent;
import com.ruoyi.biemo.business.domain.event.CategorySaveEvent;
import com.ruoyi.biemo.business.domain.Node;
import com.ruoyi.biemo.business.domain.Relationship;
import com.ruoyi.biemo.business.domain.event.DocInfoDeleteEvent;
import com.ruoyi.biemo.business.domain.event.DocInfoSaveEvent;
import com.ruoyi.biemo.business.response.MyResultResponse;
import com.ruoyi.biemo.core.page.Page;
import com.ruoyi.biemo.elasticsearch.util.EsService;
import com.ruoyi.biemo.mongodb.utils.MongoHelper;
import com.ruoyi.biemo.nlp.DependencyParserUtils;
import com.ruoyi.biemo.utils.MyObjects;
import com.ruoyi.common.utils.StringUtils;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
@ -19,10 +23,8 @@ import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
@ -152,13 +154,118 @@ public class DocInfoService extends EsService<DocInfo> {
}
public String analysis(String id) {
public MyResultResponse analysis(String id) {
if(StringUtils.isBlank(id)){
return null;
}
MyResultResponse response = null;
DocInfo docInfo = this.selectDocInfoById(id);
String grapData = docInfo.getParserGraphData();
if(StringUtils.isNotBlank(grapData)){
response = JSONObject.parseObject(grapData,MyResultResponse.class);
if(response!=null){
return response;
}
}
String content = docInfo.getContent();
List<Node> nodes = new ArrayList<>();
List<Relationship> relationships = new ArrayList<>();
//拆句
if(StringUtils.isNotBlank(content)){
content = MyObjects.delHTMLTag(content);
content = MyObjects.delSpace(content);
String regx = "\n|!|\\.|\\。|\\;|\\|\\|\\,|\\|\\、|\\@|\\#|\\$|\\¥|\\%|\\&|\\*|\\(|\\)|\\=|\\+|\\-|\\_|\\>|\\<|\\[|\\]|\\【|\\】|\\|\\?|”|\\\"";
String [] strArr = content.split(regx);
Set<String> allRelations = getAllRelations(strArr);
int i = 1;
Map<String,String> nodesMap = getAllNodes(allRelations);
if(allRelations!=null&&allRelations.size()>0){
for (String relation : allRelations) {
String[] nrn = StringUtils.isNotBlank(relation)?relation.split(","):null;
if(nrn==null||nrn.length<3){
continue;
}
String nodeName1 = nrn[0];
String relationName = nrn[1];
String nodeName2 = nrn[2];
Node node1 = new Node();
node1.setId(nodesMap.get(nodeName1));
node1.setLabels(new ArrayList<String>(){{add(nodeName1);}});
node1.setProperties(new HashMap<String,Object>(){{put("name",nodeName1);put("email","9094908@qq.com");}});
Node node2 = new Node();
node2.setId(nodesMap.get(nodeName2));
node2.setLabels(new ArrayList<String>(){{add(nodeName2);}});
node2.setProperties(new HashMap<String,Object>(){{put("name",nodeName2);put("email","9094908@qq.com");}});
nodes.add(node1);
nodes.add(node2);
Relationship relationship = new Relationship();
relationship.setId(String.valueOf(i++));
relationship.setType(relationName);
relationship.setStartNode(node1.getId());
relationship.setEndNode(node2.getId());
relationship.setProperties(new HashMap<String,Object>(){{put("source",nodeName1);put("relation",relationName);put("target",nodeName2);}});
relationships.add(relationship);
}
}
}
response = returnResponse(nodes,relationships);
docInfo.setParserGraphData(JSONObject.toJSONString(response));
docInfo.setStatus(1);
insertOrUpdateDocInfo(docInfo);
return response;
}
private Map<String, String> getAllNodes(Set<String> allRelations) {
Map<String,String> result = new HashMap<>();
Set<String> nodeSets = new HashSet<>();
if(allRelations!=null&&allRelations.size()>0){
allRelations.forEach(relation->{
String[] nrn = StringUtils.isNotBlank(relation)?relation.split(","):null;
if(nrn!=null&&nrn.length==3){
nodeSets.add(nrn[0]);
nodeSets.add(nrn[2]);
}
});
}
AtomicInteger i = new AtomicInteger(0);
if(nodeSets!=null&&nodeSets.size()>0){
nodeSets.forEach(set->{
result.put(set, String.valueOf(i.getAndIncrement()));
});
}
return result;
}
private Set<String> getAllRelations(String[] strArr) {
Set<String> allRelations = new HashSet<>();
if(strArr!=null&&strArr.length>0){
for(String text : strArr) {
Set<String> relations = DependencyParserUtils.analysis(text);
allRelations.addAll(relations);
}
}
return allRelations;
}
return null;
public MyResultResponse returnResponse(List<Node> nodes,List<Relationship> relationships) {
MyResultResponse response = new MyResultResponse();
List<MyResultResponse.Datas> datass = new ArrayList<>();
MyResultResponse.Datas datas = new MyResultResponse.Datas();
List<MyResultResponse.Data> dataList = new ArrayList<>();
MyResultResponse.Data data = new MyResultResponse.Data();
MyResultResponse.Graph graph = new MyResultResponse.Graph();
graph.setNodes(nodes);
graph.setRelationships(relationships);
data.setGraph(graph);
dataList.add(data);
datas.setColumns(new ArrayList<String>(){{add("user");add("entity");}});
datas.setData(dataList);
datass.add(datas);
response.setResults(datass);
response.setErrors(new ArrayList<>());
System.out.println(JSONObject.toJSONString(response));
return response;
}
}

@ -1,74 +0,0 @@
package com.ruoyi.biemo.elasticsearch.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class EsRestClientConfiguration {
/** 协议 */
@Value("${elasticsearch.schema:http}")
private String schema;
/** 集群地址,如果有多个用“,”隔开 */
@Value("${elasticsearch.address}")
private String address;
/** 连接超时时间 */
@Value("${elasticsearch.connectTimeout}")
private int connectTimeout;
/** Socket 连接超时时间 */
@Value("${elasticsearch.socketTimeout}")
private int socketTimeout;
/** 获取连接的超时时间 */
@Value("${elasticsearch.connectionRequestTimeout}")
private int connectionRequestTimeout;
/** 最大连接数 */
@Value("${elasticsearch.maxConnectNum}")
private int maxConnectNum;
/** 最大路由连接数 */
@Value("${elasticsearch.maxConnectPerRoute}")
private int maxConnectPerRoute;
@Bean(name = "restHighLevelClient")
public RestHighLevelClient restHighLevelClient(){
List<HttpHost> hostList = new ArrayList<>();
String[] addressArray = address.split(",");
for (String address : addressArray) {
String host = address.split(":")[0];
Integer port = Integer.parseInt(address.split(":")[1]);
hostList.add(new HttpHost(host, port, schema));
}
HttpHost[] httpPosts = hostList.toArray(new HttpHost[]{});
RestClientBuilder builder = RestClient.builder(httpPosts);
// 异步连接延时配置
builder.setRequestConfigCallback(requestConfigBuilder -> {
requestConfigBuilder.setConnectTimeout(connectTimeout);
requestConfigBuilder.setSocketTimeout(socketTimeout);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
return requestConfigBuilder;
});
// 异步连接数配置
builder.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setMaxConnTotal(maxConnectNum);
httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
return httpClientBuilder;
});
return new RestHighLevelClient(builder);
}
}

@ -0,0 +1,95 @@
package com.ruoyi.biemo.elasticsearch.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticsearchMonitorProperties {
/** 协议 */
@Value("${elasticsearch.schema:http}")
private String schema;
/** 集群地址,如果有多个用“,”隔开 */
@Value("${elasticsearch.address}")
private String address;
/** 连接超时时间 */
@Value("${elasticsearch.connectTimeout}")
private int connectTimeout;
/** Socket 连接超时时间 */
@Value("${elasticsearch.socketTimeout}")
private int socketTimeout;
/** 获取连接的超时时间 */
@Value("${elasticsearch.connectionRequestTimeout}")
private int connectionRequestTimeout;
/** 最大连接数 */
@Value("${elasticsearch.maxConnectNum}")
private int maxConnectNum;
/** 最大路由连接数 */
@Value("${elasticsearch.maxConnectPerRoute}")
private int maxConnectPerRoute;
public ElasticsearchMonitorProperties() {
}
public String getSchema() {
return schema;
}
public void setSchema(String schema) {
this.schema = schema;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public int getSocketTimeout() {
return socketTimeout;
}
public void setSocketTimeout(int socketTimeout) {
this.socketTimeout = socketTimeout;
}
public int getConnectionRequestTimeout() {
return connectionRequestTimeout;
}
public void setConnectionRequestTimeout(int connectionRequestTimeout) {
this.connectionRequestTimeout = connectionRequestTimeout;
}
public int getMaxConnectNum() {
return maxConnectNum;
}
public void setMaxConnectNum(int maxConnectNum) {
this.maxConnectNum = maxConnectNum;
}
public int getMaxConnectPerRoute() {
return maxConnectPerRoute;
}
public void setMaxConnectPerRoute(int maxConnectPerRoute) {
this.maxConnectPerRoute = maxConnectPerRoute;
}
}

@ -0,0 +1,75 @@
package com.ruoyi.biemo.elasticsearch.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* ElasticSearch
*/
@Slf4j
@Component
public class ElasticSearchPoolUtil{
@Autowired
ElasticsearchClientPoolFactory esClientPoolFactory;
private static GenericObjectPool<RestHighLevelClient> clientPool;
private static GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
static {
poolConfig.setMaxIdle(200);
poolConfig.setMaxTotal(50);
poolConfig.setMinEvictableIdleTimeMillis(1000L*3L);
}
@PostConstruct
public void init() {
// 对象池配置类,不写也可以,采用默认配置
// 利用对象工厂类和配置类生成对象池
clientPool = new GenericObjectPool<>(esClientPoolFactory, poolConfig);
}
/**
*
*
* @return
* @throws Exception
*/
public static RestHighLevelClient getClient() throws Exception {
// 从池中取一个对象
RestHighLevelClient client = clientPool.borrowObject();
return client;
}
/**
*
*
* @param client
*/
public static void returnClient(RestHighLevelClient client) {
// 使用完毕之后,归还对象
clientPool.returnObject(client);
}
/**
*
*
* @param client
*/
public static void destroyClient(RestHighLevelClient client) {
try {
// 发生异常之后,销毁对象
clientPool.invalidateObject(client);
} catch (Exception e) {
log.error("ElasticSearchPoolUtil.destroyClient error:", e);
}
}
}

@ -0,0 +1,90 @@
package com.ruoyi.biemo.elasticsearch.util;
import com.ruoyi.biemo.elasticsearch.entity.ElasticsearchMonitorProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
/**
* EliasticSearch
*
*/
@Slf4j
@Component
public class ElasticsearchClientPoolFactory implements PooledObjectFactory<RestHighLevelClient> {
@Autowired
private ElasticsearchMonitorProperties esProperties;
@Override
public void activateObject(PooledObject<RestHighLevelClient> arg0) throws Exception {
}
/**
*
*/
@Override
public void destroyObject(PooledObject<RestHighLevelClient> pooledObject) throws Exception {
RestHighLevelClient highLevelClient = pooledObject.getObject();
highLevelClient.close();
}
/**
*
*/
@Override
public PooledObject<RestHighLevelClient> makeObject() {
RestHighLevelClient restHighLevelClient = null;
try {
String[] urlArr = esProperties.getAddress().split(",");
HttpHost[] httpPostArr = new HttpHost[urlArr.length];
for (int i = 0; i < urlArr.length; i++) {
HttpHost httpHost = new HttpHost(urlArr[i].split(":")[0].trim(),
Integer.parseInt(urlArr[i].split(":")[1].trim()), "http");
httpPostArr[i] = httpHost;
}
RestClientBuilder builder = RestClient.builder(httpPostArr);
// 异步httpclient连接延时配置
builder.setRequestConfigCallback(requestConfigBuilder -> {
requestConfigBuilder.setConnectTimeout(esProperties.getConnectTimeout());
requestConfigBuilder.setSocketTimeout(esProperties.getSocketTimeout());
requestConfigBuilder.setConnectionRequestTimeout(esProperties.getConnectionRequestTimeout());
return requestConfigBuilder;
});
// 异步httpclient连接数配置
builder.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setMaxConnTotal(esProperties.getMaxConnectNum());
httpClientBuilder.setMaxConnPerRoute(esProperties.getMaxConnectPerRoute());
// httpclient保活策略
httpClientBuilder.setKeepAliveStrategy(((response, context) -> Duration.ofMinutes(5).toMillis()));
return httpClientBuilder;
});
restHighLevelClient = new RestHighLevelClient(builder);
} catch (Exception e) {
log.error("ElasticsearchClientPoolFactory.makeObject error:", e);
}
return new DefaultPooledObject<RestHighLevelClient>(restHighLevelClient);
}
@Override
public void passivateObject(PooledObject<RestHighLevelClient> arg0) throws Exception {
}
@Override
public boolean validateObject(PooledObject<RestHighLevelClient> arg0) {
return true;
}
}

@ -73,9 +73,7 @@ public abstract class EsService<T> {
int BATCH_LOAD_SIZE = 200;
// ES 滚动查询 有效时间 与 scroll查询有关
TimeValue SCROLL_TIME = TimeValue.timeValueMinutes(1);
@Qualifier("restHighLevelClient")
@Autowired
private RestHighLevelClient client;
private String index;
@ -133,7 +131,9 @@ public abstract class EsService<T> {
* @param clazz
*/
public boolean createIndexAndCreateMapping( Class clazz, boolean rebuild, int number_of_shards, int number_of_replicas) {
RestHighLevelClient client = null;
try{
client = ElasticSearchPoolUtil.getClient();
if (indexExist()) {
if(rebuild){
AcknowledgedResponse deleteIndexResponse = client.indices().delete(new DeleteIndexRequest(index), RequestOptions.DEFAULT);
@ -151,7 +151,9 @@ public abstract class EsService<T> {
return createIndexAndCreateMapping(index,ElasticSearchUtils.getFieldInfo(clazz), number_of_shards, number_of_replicas);
}
}catch (Exception e){
return false;
throw new RuntimeException();
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}
@ -168,6 +170,7 @@ public abstract class EsService<T> {
*/
public boolean createIndexAndCreateMapping(String index, List<FieldMapping> fieldMappingList, int number_of_shards, int number_of_replicas) {
XContentBuilder mapping = null;
RestHighLevelClient client = null;
try {
mapping = XContentFactory.jsonBuilder()
.startObject()
@ -253,27 +256,35 @@ public abstract class EsService<T> {
createIndexRequest.settings(createSettings(number_of_shards,number_of_replicas));
// 构建对应index的mapping
createIndexRequest.mapping(mapping);
client = ElasticSearchPoolUtil.getClient();
// 发送创建index的请求
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest,RequestOptions.DEFAULT);
return createIndexResponse.isAcknowledged();
} catch (Exception e) {
logger.error("根据信息自动创建索引与mapping创建失败失败信息为:"+ e.getMessage());
return false;
throw new RuntimeException();
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}
public boolean indexExist() throws Exception {
public boolean indexExist() throws Exception{
RestHighLevelClient client = null;
GetIndexRequest request = new GetIndexRequest(index);
request.local(false);
request.humanReadable(true);
request.includeDefaults(false);
return client.indices().exists(request, RequestOptions.DEFAULT);
client = ElasticSearchPoolUtil.getClient();
boolean result = client.indices().exists(request, RequestOptions.DEFAULT);
ElasticSearchPoolUtil.returnClient(client);
return result;
}
public void insertOrUpdateOne(T entity) {
IndexRequest request = new IndexRequest(index);
RestHighLevelClient client = null;
try {
request.id(this.getId.invoke(entity, null).toString());
} catch (IllegalAccessException e) {
@ -283,11 +294,12 @@ public abstract class EsService<T> {
}
request.source(JSON.toJSONString(entity), XContentType.JSON);
try {
client = ElasticSearchPoolUtil.getClient();
client.index(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}
@ -295,45 +307,50 @@ public abstract class EsService<T> {
if(list==null||list.size()==0){
return;
}
RestHighLevelClient client = null;
try {
client = ElasticSearchPoolUtil.getClient();
if(!indexExist()){
createIndexAndCreateMapping(list.get(0).getClass(),true,1,0);
}
} catch (Exception e) {
e.printStackTrace();
return;
}
BulkRequest request = new BulkRequest();
list.forEach(item -> {
try {
request.add(new IndexRequest(index).id(getId.invoke(item, null).toString())
.source(JSON.toJSONString(item), XContentType.JSON));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
});
try {
BulkRequest request = new BulkRequest();
list.forEach(item -> {
try {
request.add(new IndexRequest(index).id(getId.invoke(item, null).toString())
.source(JSON.toJSONString(item), XContentType.JSON));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
});
client.bulk(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}
public void deleteBatch(List<String> idList) {
BulkRequest request = new BulkRequest();
idList.forEach(item -> request.add(new DeleteRequest(index, item)));
RestHighLevelClient client = null;
try {
client = ElasticSearchPoolUtil.getClient();
client.bulk(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}
public List<T> search(SearchSourceBuilder builder) {
SearchRequest request = new SearchRequest(index);
request.source(builder);
RestHighLevelClient client = null;
try {
client = ElasticSearchPoolUtil.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
SearchHit[] hits = response.getHits().getHits();
List<T> res = new ArrayList<>(hits.length);
@ -344,6 +361,8 @@ public abstract class EsService<T> {
return res;
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}
@ -405,7 +424,9 @@ public abstract class EsService<T> {
}
}
SearchResponse searchResponse;
RestHighLevelClient client = null;
try {
client = ElasticSearchPoolUtil.getClient();
// 查询数据超过第10000
if (lastRowNum > MAX_RESULT_WINDOW) {
// 滚动搜索
@ -421,9 +442,11 @@ public abstract class EsService<T> {
content = loadDataByResponse(content, searchResponse);
}
}
} catch (IOException e) {
} catch (Exception e) {
logger.error("查询索引错误,错误如下:{}",e);
throw new CustomException("查询索引出错",e);
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
return total;
}
@ -482,7 +505,9 @@ public abstract class EsService<T> {
int scrollCount = 0;
// 滚动id
String scrollId;
RestHighLevelClient client = null;
try {
client = ElasticSearchPoolUtil.getClient();
searchSourceBuilder.size(MAX_RESULT_WINDOW);
searchRequest.scroll(SCROLL_TIME);
// scroll 查询 获取前10000 条数据和scrollId
@ -525,8 +550,10 @@ public abstract class EsService<T> {
}
}
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
return total;
}
@ -538,10 +565,15 @@ public abstract class EsService<T> {
* @return
* @throws IOException
*/
protected SearchResponse searchScroll(String scrollId) throws IOException {
protected SearchResponse searchScroll(String scrollId) throws Exception{
RestHighLevelClient client = null;
client = ElasticSearchPoolUtil.getClient();
SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
searchScrollRequest.scroll(SCROLL_TIME);
return client.scroll(searchScrollRequest, RequestOptions.DEFAULT);
SearchResponse response = client.scroll(searchScrollRequest, RequestOptions.DEFAULT);
ElasticSearchPoolUtil.returnClient(client);
return response;
}
@ -571,10 +603,14 @@ public abstract class EsService<T> {
}
public void deleteIndex() {
RestHighLevelClient client = null;
try {
client = ElasticSearchPoolUtil.getClient();
client.indices().delete(new DeleteIndexRequest(index), RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}
@ -583,10 +619,14 @@ public abstract class EsService<T> {
request.setQuery(builder);
request.setBatchSize(10000);
request.setConflicts("proceed");
RestHighLevelClient client = null;
try {
client = ElasticSearchPoolUtil.getClient();
client.deleteByQuery(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
ElasticSearchPoolUtil.returnClient(client);
}
}

@ -0,0 +1,27 @@
package com.ruoyi.biemo.nlp;
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLSentence;
import com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord;
import com.ruoyi.biemo.utils.ParserUtil;
import com.ruoyi.biemo.utils.RelationUtil;
import java.util.*;
/**
*
*/
public class DependencyParserUtils {
public static Set<String> analysis(String text){
List<CoNLLWord> parser = ParserUtil.parser(text);
List<Map<String, List<CoNLLWord>>> dict = ParserUtil.dict(text);
Set<String> result = RelationUtil.relation(parser, dict);
for (String rel : result) {
System.out.println(rel);
}
return result;
}
}

@ -0,0 +1,25 @@
package com.ruoyi.biemo.nlp;
import com.hankcs.hanlp.classification.classifiers.IClassifier;
import com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier;
import com.ruoyi.biemo.utils.TestUtility;
import java.io.IOException;
/**
*
*/
public class SentimentAnalysisUtils {
public static final String CORPUS_FOLDER = TestUtility.ensureTestData("ChnSentiCorp情感分析酒店评论", "http://hanlp.linrunsoft.com/release/corpus/ChnSentiCorp.zip");
public static String analysis(String text){
String result = "";
IClassifier classifier = new NaiveBayesClassifier(); //
try {
classifier.train(CORPUS_FOLDER);
result = classifier.classify(text);
} catch (IOException ioException) {
ioException.printStackTrace();
}
return result;
}
}

@ -0,0 +1,21 @@
package com.ruoyi.biemo.nlp;
import com.hankcs.hanlp.HanLP;
import java.util.List;
public class SummaryUtils {
//自动生成摘要
public static String autoSummary(String text){
String result = "";
try{
List<String> sentenceList = HanLP.extractSummary(text, 3);
result = String.join(",",sentenceList.toArray(new String[]{}));
}catch (Exception e){
e.printStackTrace();
}
return result;
}
}

@ -4,6 +4,7 @@ import com.hankcs.hanlp.classification.classifiers.IClassifier;
import com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier;
import com.hankcs.hanlp.classification.models.NaiveBayesModel;
import com.hankcs.hanlp.corpus.io.IOUtil;
import com.ruoyi.biemo.utils.TestUtility;
import java.io.File;
import java.io.IOException;
@ -21,13 +22,14 @@ public class TextClassificationUtils {
//文本分类
public static String getClassification(String text){
String result = "";
try {
IClassifier classifier = new NaiveBayesClassifier(trainOrLoadModel());
return classifier.classify(text);
result = classifier.classify(text);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return result;
}
//训练模型

@ -1,7 +1,11 @@
package com.ruoyi.biemo.utils;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MyObjects {
@ -43,4 +47,33 @@ public class MyObjects {
return flag;
}
public static String delHTMLTag(String htmlStr){
String regEx_script="<script[^>]*?>[\\s\\S]*?<\\/script>"; //定义script的正则表达式
String regEx_style="<style[^>]*?>[\\s\\S]*?<\\/style>"; //定义style的正则表达式
String regEx_html="<[^>]+>"; //定义HTML标签的正则表达式
Pattern p_script=Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);
Matcher m_script=p_script.matcher(htmlStr);
htmlStr=m_script.replaceAll(""); //过滤
Pattern p_style=Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE);
Matcher m_style=p_style.matcher(htmlStr);
htmlStr=m_style.replaceAll(""); //过滤style标签
Pattern p_html=Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE);
Matcher m_html=p_html.matcher(htmlStr);
htmlStr=m_html.replaceAll(""); //过滤html标签
return htmlStr.trim(); //返回文本字符串
}
public static String delSpace(String htmlStr){
htmlStr = htmlStr.replaceAll("\t", "\n");
htmlStr = htmlStr.replaceAll("\\u3000", "");
htmlStr = htmlStr.replaceAll("(\\s{4})", "\n");
htmlStr = htmlStr.replaceAll("\\s", "\n");
htmlStr = StringUtils.deleteWhitespace(htmlStr);
return htmlStr.trim(); //返回文本字符串
}
}

@ -0,0 +1,87 @@
package com.ruoyi.biemo.utils;
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLSentence;
import com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord;
import com.hankcs.hanlp.dependency.nnparser.NeuralNetworkDependencyParser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by on 2018/6/6.
*/
public class ParserUtil {
public static void main(String[] args) {
for (Map<String, List<CoNLLWord>> li:
dict("刘小绪和小明是同学")) {
System.out.println(li);
}
}
/**
* @param text
* @return
*/
public static List<CoNLLWord> parser(String text){
CoNLLSentence sentence = HanLP.parseDependency(text);
CoNLLWord wordArr[] = sentence.getWordArray();
List<CoNLLWord> result = new ArrayList<>();
for (int i = 0; i < wordArr.length; i++) {
result.add(wordArr[i]);
}
return result;
}
/**
* list
* mapkey
* maplist
* @param text
* @return
*/
public static List<Map<String, List<CoNLLWord>>> dict(String text){
CoNLLSentence sentence = HanLP.parseDependency(text);
//System.out.println(sentence);
CoNLLWord[] wordArray = sentence.getWordArray();
List<Map<String, List<CoNLLWord>>> result = new ArrayList<>();
for (int i = 0; i < wordArray.length; i++) {
CoNLLWord word = wordArray[i];
HashMap<String, List<CoNLLWord>> map = new HashMap<>();
for (int j = 0; j < wordArray.length; j++) {
CoNLLWord child = wordArray[j];
if (word.LEMMA.equals(child.HEAD.LEMMA)){
if (map.containsKey(child.DEPREL)){
map.get(child.DEPREL).add(child);
}else {
List<CoNLLWord> list= new ArrayList<>();
list.add(child);
map.put(child.DEPREL, list);
}
}
}
result.add(map);
}
return result;
}
}

@ -0,0 +1,218 @@
package com.ruoyi.biemo.utils;
import com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by on 2018/6/6.
*/
public class RelationUtil {
/**
*
* @param parser
* @param dict
*/
public static Set<String> relation(List<CoNLLWord> parser,
List<Map<String, List<CoNLLWord>>> dict){
/*
for (CoNLLWord word :
parser) {
System.out.println(word);
}
for (Map<String, List<CoNLLWord>> dic :
dict) {
System.out.println(dic);
}
*/
Set<String> result = new HashSet<>();
for (int i = 0; i < parser.size(); i++) {
// 事实三元组
Set<String> relationList = extract(parser, dict, i);
result.addAll(relationList);
}
return result;
}
/**
* @param parser
* @param dict
* @param i
* @return
*/
private static Set<String> extract(List<CoNLLWord> parser,
List<Map<String, List<CoNLLWord>>> dict,
int i) {
CoNLLWord word = parser.get(i);
Map<String, List<CoNLLWord>> dic = dict.get(i);
Set<String> result = new HashSet<>();
// 主谓宾关系:刘小绪生于四川
if (dic.containsKey("主谓关系") && dic.containsKey("动宾关系")){
CoNLLWord entity1 = dic.get("主谓关系").get(0);
// 排除:刘小绪和李华是朋友
// entity1.ID-1 即主语在依存字典中的索引
if (dict.get(entity1.ID-1).containsKey("并列关系")){
String relation = dic.get("动宾关系").get(0).LEMMA;
CoNLLWord entity2 = dict.get(entity1.ID-1).get("并列关系").get(0);
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}else {
CoNLLWord entity2 = dic.get("动宾关系").get(0);
String relation = word.LEMMA;
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
}
// 动补结构:刘小绪洗干净了衣服
if (dic.containsKey("动补结构") && dic.containsKey("主谓关系") && dic.containsKey("动宾关系")){
CoNLLWord entity1 = dic.get("主谓关系").get(0);
CoNLLWord complement = dic.get("动补结构").get(0);
CoNLLWord entity2 = dic.get("动宾关系").get(0);
if (dic.containsKey("右附加关系")){
CoNLLWord subjoin = dic.get("右附加关系").get(0);
String relation = word.LEMMA + complement.LEMMA + subjoin.LEMMA;
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}else {
String relation = word.LEMMA + complement.LEMMA;
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
}
if (dic.containsKey("定中关系")){
CoNLLWord entity1 = dic.get("定中关系").get(0);
String relation = word.LEMMA;
for (Map<String, List<CoNLLWord>> tempDic:
dict) {
if (tempDic.containsKey("主谓关系") && tempDic.containsKey("动宾关系")){
if (tempDic.get("主谓关系").get(0).LEMMA.equals(relation)){
CoNLLWord entity2 = tempDic.get("动宾关系").get(0);
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
}
}
}
// 状动结构:父亲非常喜欢跑步
// 非常 是 跑步的状语,关系应该为非常喜欢
if (dic.containsKey("状中结构") && dic.containsKey("主谓关系") && dic.containsKey("动宾关系")){
CoNLLWord entity1 = dic.get("主谓关系").get(0);
CoNLLWord adverbial = dic.get("状中结构").get(0);
CoNLLWord entity2 = dic.get("动宾关系").get(0);
String relation = adverbial.LEMMA + word.LEMMA;
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
// 状动补结构:
if (dic.containsKey("状中结构") && dic.containsKey("动补结构") &&
dic.containsKey("主谓关系") && dic.containsKey("动宾关系")){
CoNLLWord entity1 = dic.get("主谓关系").get(0);
CoNLLWord adverbial = dic.get("状中结构").get(0);
CoNLLWord complement = dic.get("动补结构").get(0);
CoNLLWord entity2 = dic.get("动宾关系").get(0);
String relation = adverbial.LEMMA + word.LEMMA + complement.LEMMA;
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
// 定语后置:父亲是来自肯尼亚的留学生
if (word.DEPREL.equals("定中关系")){
if (dic.containsKey("动宾关系")){
CoNLLWord entity1 = word.HEAD;
String relation = word.LEMMA;
CoNLLWord entity2 = dic.get("动宾关系").get(0);
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
}
// 介宾关系:刘小绪就职于学校
// 于 和 学校 是介宾关系
if (dic.containsKey("主谓关系") && dic.containsKey("动补结构")){
CoNLLWord entity1 = dic.get("主谓关系").get(0);
CoNLLWord prep = dic.get("动补结构").get(0);
// 介词的索引
int prepIndex = prep.ID - 1;
Map<String, List<CoNLLWord>> prepDict = dict.get(prepIndex);
if (prepDict.containsKey("介宾关系")){
CoNLLWord entity2 = prepDict.get("介宾关系").get(0);
String relation = word.LEMMA + prep.LEMMA;
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
}
// 宾语前置结构:海洋由水组成
if (dic.containsKey("前置宾语")){
CoNLLWord entity2 = dic.get("前置宾语").get(0);
if (dic.containsKey("状中结构")){
CoNLLWord adverbial = dic.get("状中结构").get(0);
int prepIndex = adverbial.ID - 1;
Map<String, List<CoNLLWord>> prepDict = dict.get(prepIndex);
if (prepDict.containsKey("介宾关系")){
CoNLLWord entity1 = prepDict.get("介宾关系").get(0);
String relation = word.LEMMA;
result.add(entity1.LEMMA + "," + relation + "," + entity2.LEMMA);
}
}
}
return result;
}
/**
* @param textArr
* @return
*/
public static Set<String> entityRelation(String[] textArr){
Set<String> result = new HashSet<>();
for (String text :
textArr) {
List<CoNLLWord> parser = ParserUtil.parser(text);
List<Map<String, List<CoNLLWord>>> dict = ParserUtil.dict(text);
Set<String> rel = relation(parser, dict);
result.addAll(rel);
}
return result;
}
public static void main(String[] args) {
String text = "里根号核动力航空母舰前往南海";
List<CoNLLWord> parser = ParserUtil.parser(text);
List<Map<String, List<CoNLLWord>>> dict = ParserUtil.dict(text);
Set<String> result = relation(parser, dict);
for (String rel : result) {
System.out.println(rel);
}
}
}

@ -8,7 +8,7 @@
* This source is subject to Han He. Please contact Han He for more information.
* </copyright>
*/
package com.ruoyi.biemo.nlp;
package com.ruoyi.biemo.utils;
import java.io.*;
import java.net.HttpURLConnection;

@ -2,7 +2,7 @@ package com.ruoyi.common.utils.file;
/**
*
*
*
* @author ruoyi
*/
public class MimeTypeUtils
@ -16,7 +16,7 @@ public class MimeTypeUtils
public static final String IMAGE_BMP = "image/bmp";
public static final String IMAGE_GIF = "image/gif";
public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
public static final String[] FLASH_EXTENSION = { "swf", "flv" };
@ -36,7 +36,7 @@ public class MimeTypeUtils
// 视频格式
"mp4", "avi", "rmvb",
// pdf
"pdf" };
"pdf","json" };
public static String getExtension(String prefix)
{

@ -111,6 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage").anonymous()
.antMatchers("/makesoft/**").permitAll()
.antMatchers("/common/**").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

@ -24,7 +24,9 @@ public class DemoDependencyParser extends TestUtility
{
public static void main(String[] args)
{
CoNLLSentence sentence = HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。");
CoNLLSentence sentence = HanLP.parseDependency("花鼓戏是哪个省的地方戏\n" +
"  花鼓戏中国戏曲剧种是各地方小戏花鼓、灯戏的总称。有湖南、湖北、皖北花鼓戏等以湖南花鼓戏影响较大。花鼓戏源出于民歌逐渐发展成一旦一丑的初级表演形式。清嘉庆时已有演出同治初年已出现书生、书童、柳莺、婢女4个角色演出也具有一定规模。\n" +
"  湖南花鼓戏又为湖南各地花鼓戏的总称,细分为:长沙花鼓戏(益阳花鼓戏)、岳阳花鼓戏(临湘花鼓戏)、衡州花鼓戏(衡阳花鼓戏)、邵阳花鼓戏、常德花鼓戏、永州花鼓戏(零陵花鼓戏)等六个流派。");
System.out.println(sentence);
// 可以方便地遍历它
for (CoNLLWord word : sentence)

@ -26,8 +26,8 @@ public class DemoNLPSegment extends TestUtility
{
public static void main(String[] args)
{
NLPTokenizer.ANALYZER.enableCustomDictionary(false); // 中文分词≠词典,不用词典照样分词。
System.out.println(NLPTokenizer.segment("我新造一个词叫幻想乡你能识别并正确标注词性吗?")); // “正确”是副形词。
NLPTokenizer.ANALYZER.enableCustomDictionary(true); // 中文分词≠词典,不用词典照样分词。
System.out.println(NLPTokenizer.segment("我新造一个词叫别摸文化你能识别并正确标注词性吗?")); // “正确”是副形词。
// 注意观察下面两个“希望”的词性、两个“晚霞”的词性
System.out.println(NLPTokenizer.analyze("我的希望是希望张晚霞的背影被晚霞映红").translateLabels());
System.out.println(NLPTokenizer.analyze("支援臺灣正體香港繁體微软公司於1975年由比爾·蓋茲和保羅·艾倫創立。"));

@ -22,7 +22,7 @@ public class DemoPosTagging
{
public static void main(String[] args)
{
String text = "教授正在教授自然语言处理课程";
String text = "里根号核动力航空母舰前往南海";
Segment segment = HanLP.newSegment();
System.out.println("未标注:" + segment.seg(text));

@ -1,10 +1,10 @@
# 页面标题
VUE_APP_TITLE = 若依管理系统
VUE_APP_TITLE = 管理系统
# 开发环境配置
ENV = 'development'
# 若依管理系统/开发环境
# 管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
# 路由懒加载

@ -1,8 +1,8 @@
# 页面标题
VUE_APP_TITLE = 若依管理系统
VUE_APP_TITLE = 管理系统
# 生产环境配置
ENV = 'production'
# 若依管理系统/生产环境
# 管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'

@ -1,10 +1,10 @@
# 页面标题
VUE_APP_TITLE = 若依管理系统
VUE_APP_TITLE = 管理系统
NODE_ENV = production
# 测试环境配置
ENV = 'staging'
# 若依管理系统/测试环境
# 管理系统/测试环境
VUE_APP_BASE_API = '/stage-api'

@ -1,7 +1,7 @@
{
"name": "ruoyi",
"version": "3.8.3",
"description": "若依管理系统",
"description": "管理系统",
"author": "若依",
"license": "MIT",
"scripts": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

@ -42,3 +42,11 @@ export function delDocInfo(id) {
method: 'delete'
})
}
// 获取分析结果
export function getDocInfoAnalysis(id) {
return request({
url: '/makesoft/docInfo/analysis/' + id,
method: 'get'
})
}

@ -0,0 +1,73 @@
<template>
<div class="image-body">
<el-input v-model="name" style="position: relative" clearable placeholder clearfilterIcons
@input="filterIcons">
i slot="suffix" @click.stop="filterIcons"class="el-icon-search el-input_icon"
</el-input>
<div class="image-list">
<div v-for="(item, index) in imageList" :key="index" @click="selectedIcon(item)">
< img :src="getNodeImg({icon: item})" style="height:16px;width:16px;">
<span>{{ item }}</span>
</div>
</div>
</div>
</template>
<script>
import icons from './requireImages'
export default {
name: 'IconSelect',
data() {
return {
name: '',
imageList: icons
}
}, methods: {
filterIcons() {
this.imageList = icons
if (this.name) {
this.imageList - this.imageList.filter(item => item.includes(this.name))
}
},
selectedIcon(name) {
this.$emit('selected', name)
document.body.click()
}
,
reset() {
this.name = ''
this.imageList = icons
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.image-body {
width: 100%;
padding: 10px;
.image-list {
height: 200px;
overflow-y: scroll;
div {
height: 30px;
line-height: 30px;
margin-bottom: -5px;
cursor: pointer;
width: 33%;
float: left;
display: flex;
align-items: center;
}
span {
display: inline-block;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
margin-left: 5px;
}
}
}
</style>

@ -0,0 +1,7 @@
const req = require.context('../../../public/ontology',false,/\.png$/)
const requireAll = requireContext => requireContext.keys()
const re = /\.\/(.*)\.png/
const icons = requireAll(req).map(i => {
return i.match(re)[1]
})
export default icons

@ -35,7 +35,7 @@ export default {
},
data() {
return {
title: '若依管理系统',
title: '管理系统',
logo: logoImg
}
}

@ -2,8 +2,8 @@
<div id="neo4jd3"></div>
</template>
<script>
import { getDocInfo } from "@/api/biemo/docInfo";
import { getDocInfoAnalysis } from "@/api/biemo/docInfo";
import Neo4jd3 from "@/views/neo4jd3/js/neo4jd3";
export default {
data(){
return{
@ -13,17 +13,16 @@ export default {
},
props: ["id"],
created(){
this.getDocInfoById(this.id);
this.init();
},
mounted() {
},
async mounted() {
await this.getData(this.id);
},
methods: {
getDocInfoById(id){
getDocInfo(id).then(response=>{
this.docInfo = response.data;
});
async getData(id){
let res = await getDocInfoAnalysis(id);
this.docInfo = res.data;
this.init();
},
init() {
var neo4jd3 = new Neo4jd3('#neo4jd3', {
@ -39,17 +38,12 @@ export default {
}
],
icons: {
// 'Address': 'home',
'Api': 'gear',
// 'BirthDate': 'birthday-cake',
'Cookie': 'paw',
// 'CreditCard': 'credit-card',
// 'Device': 'laptop',
'Email': 'at',
'Git': 'git',
'Github': 'github',
'Google': 'google',
// 'icons': 'font-awesome',
'Ip': 'map-marker',
'Issues': 'exclamation-circle',
'Language': 'language',
@ -65,7 +59,6 @@ export default {
},
images: {
'Address': 'img/twemoji/1f3e0.svg',
// 'Api': 'img/twemoji/1f527.svg',
'BirthDate': 'img/twemoji/1f382.svg',
'Cookie': 'img/twemoji/1f36a.svg',
'CreditCard': 'img/twemoji/1f4b3.svg',
@ -79,30 +72,16 @@ export default {
'Language': 'img/twemoji/1f1f1-1f1f7.svg',
'Options': 'img/twemoji/2699.svg',
'Password': 'img/twemoji/1f511.svg',
// 'Phone': 'img/twemoji/1f4de.svg',
'Project': 'img/twemoji/2198.svg',
'Project|name|neo4jd3': 'img/twemoji/2196.svg',
// 'SecurityChallengeAnswer': 'img/twemoji/1f4ac.svg',
'User': 'img/twemoji/1f600.svg'
// 'zoomFit': 'img/twemoji/2194.svg',
// 'zoomIn': 'img/twemoji/1f50d.svg',
// 'zoomOut': 'img/twemoji/1f50e.svg'
},
minCollision: 60,
neo4jDataUrl: 'json/neo4jData.json',
//neo4jDataUrl: '/dev-api/common/download/resource?resource=/profile/my.json',
neo4jData: this.docInfo,
nodeRadius: 25,
onNodeDoubleClick: function(node) {
switch(node.id) {
case '25':
// Google
window.open(node.properties.url, '_blank');
break;
default:
var maxNodes = 5,
data = neo4jd3.randomD3Data(node, maxNodes);
neo4jd3.updateWithD3Data(data);
break;
}
},
onRelationshipDoubleClick: function(relationship) {
console.log('double click on relationship: ' + JSON.stringify(relationship));
@ -113,26 +92,13 @@ export default {
}
}
</script>
<style rel="stylesheet/scss" lang="scss">
@import '../neo4jd3/css/neo4jd3.css';
<style lang="scss">
.newsinfo-container {
padding: 0 4px;
.title {
font-size: 20px;
text-align: center;
margin: 15px 0;
color: #000000;
}
.subtitle {
font-size: 16px;
color: #090909;
display: flex;
justify-content: center ;
}
.content {
width: 100%;
justify-content: center ;
font-size: 16px;
}
.neo4jd3 {
position: relative;
background: #fff;
height: 700px;
}
</style>

@ -1,19 +1,24 @@
<template>
<div class="newsinfo-container">
<!-- 大标题 -->
<h3 class="title">{{ docInfo.title }}</h3>
<!-- 子标题 -->
<p class="subtitle">
<span>发表时间{{ parseTime(docInfo.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }} <span v-html="'&nbsp;&nbsp;'"></span></span>
<span>作者{{ docInfo.author }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>来源{{ docInfo.source }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>评分{{ docInfo.score }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>点击{{ docInfo.click }}</span>
</p>
<hr>
<!-- 内容区域 -->
<div class="content" v-html="docInfo.content"></div>
<div class="newsinfo-detail-main">
<div class="newsinfo-container">
<!-- 大标题 -->
<h3 class="title">{{ docInfo.title }}</h3>
<!-- 子标题 -->
<p class="subtitle">
<span>作者{{ docInfo.author }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>来源{{ docInfo.source }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>时间{{ parseTime(docInfo.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }} <span v-html="'&nbsp;&nbsp;'"></span></span>
</p>
<hr>
<!-- 内容区域 -->
<div class="content" v-html="docInfo.content"></div>
</div>
<div class="newsinfo-right">
</div>
</div>
</template>
<script>
@ -43,11 +48,13 @@ export default {
<style lang="scss">
.newsinfo-container {
padding: 0 4px;
float:left;
width: 50%;
.title {
font-size: 20px;
text-align: center;
margin: 15px 0;
color: #000000;
color: #188ffe;
}
.subtitle {
font-size: 16px;
@ -59,6 +66,15 @@ export default {
width: 100%;
justify-content: center ;
font-size: 16px;
color: #393636;
font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', DengXian, SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif;
}
}
.newsinfo-right{
padding: 0 4px;
float: left;
width: 50%;
}
</style>

@ -1,11 +1,12 @@
<template>
<div>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tabs v-model="activeName" @tab-click="handleClick" height="700px">
<el-tab-pane
v-for="(item, index) in tabsArr"
:key="index"
:label="item.label"
:name="item.name"
height="700px"
>
<components :is="item.name" :id="id" v-if="item.name == nowName"></components>
</el-tab-pane>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,4)" id="g20"><path id="path22" style="fill:#e6e7e8;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -20,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 20,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(19.0029,23.5781)" id="g24"><path id="path26" style="fill:#be1931;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-6.163 c 0.728,0.087 1.435,0.179 2.119,0.265 1.326,0.178 2.286,0.286 2.879,0.332 0.048,0.11 0.103,0.232 0.168,0.363 0.199,0.641 0.463,1.645 0.798,3.015 0.264,1.084 0.393,1.769 0.393,2.057 0,0.353 -0.338,0.529 -1.024,0.529 C 4.292,0.398 2.637,0.277 0.36,0.035 0.232,0.035 0.107,0.022 0,0 m -7.259,-6.69 c 1.812,0.085 3.545,0.195 5.203,0.327 l 0,6.132 c -1.702,-0.199 -3.347,-0.464 -4.937,-0.796 -0.31,-0.111 -0.596,-0.187 -0.862,-0.232 0,-0.264 0.022,-0.529 0.067,-0.793 0.265,-2.012 0.441,-3.56 0.529,-4.638 m -3.346,7.221 c 0.53,0 0.995,-0.078 1.391,-0.233 0.244,-0.066 0.453,-0.143 0.63,-0.231 0.796,0.044 1.612,0.122 2.453,0.231 1.104,0.134 2.463,0.298 4.075,0.498 l 0,2.319 c 0,1.613 -0.188,2.948 -0.563,4.01 -0.155,0.332 -0.233,0.551 -0.233,0.662 0,0.331 0.133,0.497 0.398,0.497 0.707,0 1.36,-0.089 1.955,-0.266 C 0.187,7.82 0.528,7.565 0.528,7.257 0.528,7.146 0.486,6.915 0.395,6.561 0.13,5.876 0,4.606 0,2.751 L 0,1.028 c 1.299,0.132 2.723,0.276 4.271,0.43 0.706,0.045 1.38,0.166 2.022,0.366 0.463,0.088 0.739,0.132 0.83,0.132 0.264,0 0.837,-0.222 1.72,-0.662 C 9.771,0.741 10.236,0.309 10.236,0 c 0,-0.242 -0.12,-0.486 -0.362,-0.729 C 9.055,-1.61 8.466,-2.538 8.115,-3.512 L 7.317,-5.203 C 7.187,-5.532 7.041,-5.787 6.892,-5.963 6.934,-5.984 6.978,-6.009 7.02,-6.03 c 0.507,-0.311 0.76,-0.586 0.76,-0.828 0,-0.199 -0.182,-0.31 -0.559,-0.332 -1.7,0 -3.237,-0.088 -4.607,-0.266 L 0,-7.652 -0.034,-12.095 c 0,-2.009 -0.069,-3.62 -0.198,-4.838 -0.134,-1.368 -0.334,-2.34 -0.598,-2.914 -0.243,-0.486 -0.443,-0.731 -0.596,-0.731 -0.09,0 -0.232,0.266 -0.431,0.798 -0.133,0.617 -0.199,1.687 -0.199,3.214 l 0,8.749 -1.789,-0.167 c -1.194,-0.112 -2.111,-0.168 -2.75,-0.168 -0.266,0 -0.488,0.024 -0.664,0.069 -0.044,-0.2 -0.11,-0.376 -0.197,-0.533 -0.133,-0.287 -0.277,-0.43 -0.433,-0.43 -0.197,0 -0.385,0.154 -0.562,0.465 -0.287,0.438 -0.442,0.892 -0.464,1.358 l -0.397,2.584 c -0.155,1.349 -0.332,2.286 -0.531,2.818 -0.111,0.551 -0.409,1.081 -0.894,1.59 -0.177,0.11 -0.266,0.187 -0.266,0.231 0,0.354 0.133,0.531 0.398,0.531"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,4)" id="g20"><path id="path22" style="fill:#e6e7e8;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -20,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 20,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(11,29)" id="g24"><path id="path26" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C -2.519,0 -4.583,-1.87 -4.929,-4.294 -4.198,-3.503 -3.161,-3 -2,-3 0.209,-3 2,-4.791 2,-7 2,-9 3.497,-9.198 2.706,-9.929 5.13,-9.583 5,-7.519 5,-5 5,-2.239 2.761,0 0,0"/></g><g transform="translate(23,22)" id="g28"><path id="path30" style="fill:#55acee;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,2.209 1.791,4 4,4 5.161,4 6.198,3.497 6.929,2.706 6.583,5.13 4.52,7 2,7 -0.762,7 -3,4.761 -3,2 -3,-0.519 -3.131,-2.583 -0.707,-2.929 -1.497,-2.198 0,-2 0,0"/></g><g transform="translate(14,24)" id="g32"><path id="path34" style="fill:#ffac33;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,4.971 4,9 4,9 4,9 8,4.971 8,0 8,-4.971 6.209,-9 4,-9 1.791,-9 0,-4.971 0,0"/></g><g transform="translate(11.7065,14.9287)" id="g36"><path id="path38" style="fill:#553788;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0.791,-0.73 1.294,-1.768 1.294,-2.929 0,-2.209 -1.791,-4 -4,-4 -1.162,0 -2.199,0.503 -2.929,1.293 0.345,-2.424 2.409,-4.293 4.929,-4.293 2.761,0 5,2.239 5,5 0,2.52 -1.87,4.583 -4.294,4.929"/></g><g transform="translate(27,8)" id="g40"><path id="path42" style="fill:#553788;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -2.209,0 -4,1.791 -4,4 0,1.161 0.503,2.198 1.293,2.929 C -5.131,6.583 -7,4.52 -7,2 c 0,-2.762 2.238,-5 5,-5 2.52,0 4.583,1.869 4.929,4.293 C 2.198,0.503 1.161,0 0,0"/></g><g transform="translate(14,12)" id="g44"><path id="path46" style="fill:#9266cc;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,-4.971 3,-9 4,-9 5,-9 8,-4.971 8,0 8,4.971 6.209,9 4,9 1.791,9 0,4.971 0,0"/></g><g transform="translate(13,19)" id="g48"><path id="path50" style="fill:#edbb9f;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,3.866 3,4 5,4 7,4 10,3.866 10,0 10,-3.865 7.762,-7 5,-7 2.239,-7 0,-3.865 0,0"/></g><g transform="translate(17.0005,19)" id="g52"><path id="path54" style="fill:#662113;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.552 -0.448,-1 -1,-1 -0.552,0 -1,0.448 -1,1 0,0.552 0.448,1 1,1 0.552,0 1,-0.448 1,-1"/></g><g transform="translate(21,19)" id="g56"><path id="path58" style="fill:#662113;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.552 -0.447,-1 -1,-1 -0.552,0 -1,0.448 -1,1 0,0.552 0.448,1 1,1 0.553,0 1,-0.448 1,-1"/></g><g transform="translate(18,14)" id="g60"><path id="path62" style="fill:#662113;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 1.105,0 2,0.896 2,2 L -2,2 C -2,0.896 -1.104,0 0,0"/></g><g transform="translate(7,25)" id="g64"><path id="path66" style="fill:#a0041e;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.552 -0.448,-1 -1,-1 -0.552,0 -1,0.448 -1,1 0,0.552 0.448,1 1,1 0.552,0 1,-0.448 1,-1"/></g><g transform="translate(29,25)" id="g68"><path id="path70" style="fill:#226699;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,-0.552 0.447,-1 1,-1 1.553,-1 2,-0.552 2,0 2,0.552 1.553,1 1,1 0.447,1 0,0.552 0,0"/></g><g transform="translate(17,33)" id="g72"><path id="path74" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,0.552 0.448,1 1,1 1.552,1 2,0.552 2,0 2,-0.552 1.552,-1 1,-1 0.448,-1 0,-0.552 0,0"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(15.0874,15.6191)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 5.891,0 3.008,8.992 2.946,8.992 0,0 Z m -0.341,11.256 c 0.527,1.426 1.736,2.573 3.318,2.573 1.643,0 2.791,-1.085 3.317,-2.573 l 6.078,-16.867 c 0.185,-0.496 0.248,-0.931 0.248,-1.148 0,-1.209 -0.993,-2.046 -2.139,-2.046 -1.303,0 -1.954,0.682 -2.264,1.612 l -0.93,2.915 -8.62,0 -0.93,-2.884 c -0.31,-0.961 -0.962,-1.643 -2.233,-1.643 -1.24,0 -2.294,0.93 -2.294,2.17 0,0.496 0.155,0.868 0.217,1.024 l 6.232,16.867 z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(15.1489,11.0928)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.659,0 c 1.675,0 2.915,0.961 2.915,2.697 0,1.458 -1.117,2.45 -3.287,2.45 L 0,5.147 0,0 Z m 0,9.24 2.419,0 c 1.519,0 2.511,0.899 2.511,2.449 0,1.457 -1.147,2.202 -2.511,2.202 L 0,13.891 0,9.24 Z m -4.65,6.418 c 0,1.488 1.023,2.325 2.449,2.325 l 5.953,0 c 3.224,0 5.83,-2.17 5.83,-5.457 0,-2.17 -0.901,-3.628 -2.885,-4.557 l 0,-0.063 c 2.637,-0.372 4.713,-2.573 4.713,-5.27 0,-4.372 -2.914,-6.729 -7.194,-6.729 l -6.386,0 c -1.427,0 -2.48,0.9 -2.48,2.357 l 0,17.394 z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(24.0156,17.999)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,3.872 -2.016,7.36 -6.016,7.36 -4,0 -6.015,-3.488 -6.015,-7.36 0,-3.903 1.951,-7.359 6.015,-7.359 C -1.951,-7.359 0,-3.903 0,0 m -17.023,0 c 0,6.656 4.48,11.776 11.007,11.776 6.432,0 11.008,-5.28 11.008,-11.776 0,-6.623 -4.449,-11.774 -11.008,-11.774 -6.495,0 -11.007,5.151 -11.007,11.774"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#226699;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(16,18)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.063,0 c 2.017,0 3.296,1.465 3.296,3.385 0,1.92 -1.279,3.391 -3.296,3.391 L 0,6.776 0,0 Z M -5,8.504 C -5,10.008 -4.104,11 -2.504,11 l 5.664,0 c 4.703,0 8.192,-2.944 8.192,-7.52 0,-4.67 -3.618,-7.48 -8,-7.48 L 0,-4 0,-9.479 c 0,-1.599 -1.024,-2.496 -2.4,-2.496 -1.376,0 -2.6,0.897 -2.6,2.496 l 0,17.983 z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(7.458,15.7646)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 5.32,0 2.716,8.119 2.66,8.119 0,0 Z m -0.308,10.163 c 0.476,1.288 1.568,2.324 2.996,2.324 1.484,0 2.52,-0.979 2.997,-2.324 l 5.488,-15.231 c 0.168,-0.449 0.223,-0.84 0.223,-1.036 0,-1.092 -0.896,-1.848 -1.931,-1.848 -1.177,0 -1.765,0.616 -2.044,1.456 l -0.879,2.731 -7.72,0 -0.866,-2.703 c -0.28,-0.868 -0.868,-1.484 -2.016,-1.484 -1.12,0 -2.072,0.84 -2.072,1.96 0,0.448 0.14,0.784 0.196,0.924 l 5.628,15.231 z"/></g><g transform="translate(24.2002,12)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.304,0 c 1.512,0 2.632,0.729 2.632,2.296 0,1.315 -1.008,2.112 -2.968,2.112 L 0,4.408 0,0 Z m 0,8 2.184,0 c 1.372,0 2.268,0.815 2.268,2.216 0,1.315 -1.036,2.088 -2.268,2.088 L 0,12.304 0,8 Z m -4.2,5.9 c 0,1.344 0.924,2.1 2.212,2.1 l 5.376,0 C 6.3,16 8.652,14.04 8.652,11.072 8.652,9.112 7.84,7.796 6.048,6.956 l 0,-0.056 C 8.428,6.564 10.304,4.477 10.304,2.041 10.304,-1.907 7.672,-4 3.808,-4 l -5.768,0 c -1.288,0 -2.24,0.876 -2.24,2.192 l 0,15.708 z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(12.8101,29.4482)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 2.263,0 6.667,-0.744 6.667,-3.473 0,-1.116 -0.776,-2.077 -1.923,-2.077 -1.271,0 -2.14,1.085 -4.744,1.085 -3.845,0 -5.829,-3.256 -5.829,-7.038 0,-3.689 2.015,-6.852 5.829,-6.852 2.604,0 3.658,1.301 4.93,1.301 1.395,0 2.046,-1.394 2.046,-2.107 0,-2.977 -4.682,-3.659 -6.976,-3.659 -6.294,0 -10.666,4.992 -10.666,11.41 C -10.666,-4.961 -6.325,0 0,0"/></g><g transform="translate(21.332,26.8438)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,1.55 0.992,2.418 2.326,2.418 3.66,2.418 4.652,1.55 4.652,0 l 0,-15.564 5.518,0 c 1.582,0 2.264,-1.179 2.232,-2.233 -0.06,-1.023 -0.867,-2.047 -2.232,-2.047 l -7.75,0 C 0.9,-19.844 0,-18.852 0,-17.301 L 0,0 Z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(5.9697,23.1416)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 1.022,0 3.012,-0.336 3.012,-1.569 0,-0.504 -0.35,-0.939 -0.869,-0.939 -0.574,0 -0.966,0.49 -2.143,0.49 -1.737,0 -2.633,-1.47 -2.633,-3.179 0,-1.667 0.91,-3.096 2.633,-3.096 1.177,0 1.653,0.589 2.227,0.589 0.63,0 0.925,-0.631 0.925,-0.953 0,-1.345 -2.115,-1.653 -3.152,-1.653 -2.843,0 -4.818,2.255 -4.818,5.155 C -4.818,-2.241 -2.857,0 0,0"/></g><g transform="translate(16.3169,17.9863)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,1.695 -0.882,3.222 -2.633,3.222 -1.751,0 -2.634,-1.527 -2.634,-3.222 0,-1.709 0.855,-3.222 2.634,-3.222 C -0.854,-3.222 0,-1.709 0,0 m -7.452,0 c 0,2.914 1.961,5.155 4.819,5.155 2.815,0 4.819,-2.311 4.819,-5.155 0,-2.899 -1.948,-5.154 -4.819,-5.154 -2.844,0 -4.819,2.255 -4.819,5.154"/></g><g transform="translate(26.4258,17.9863)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,1.695 -0.883,3.222 -2.635,3.222 -1.75,0 -2.633,-1.527 -2.633,-3.222 0,-1.709 0.855,-3.222 2.633,-3.222 C -0.855,-3.222 0,-1.709 0,0 m -7.453,0 c 0,2.914 1.961,5.155 4.818,5.155 2.817,0 4.819,-2.311 4.819,-5.155 0,-2.899 -1.946,-5.154 -4.819,-5.154 -2.843,0 -4.818,2.255 -4.818,5.154"/></g><g transform="translate(29.1934,21.9648)" id="g36"><path id="path38" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,0.7 0.447,1.093 1.051,1.093 1.652,1.093 2.102,0.7 2.102,0 l 0,-7.032 2.492,0 c 0.715,0 1.023,-0.532 1.01,-1.008 -0.03,-0.463 -0.393,-0.925 -1.01,-0.925 l -3.502,0 C 0.406,-8.965 0,-8.517 0,-7.816 L 0,0 Z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(1.8364,23.4155)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.738 0.504,1.404 1.405,1.404 l 4.609,0 C 6.806,1.404 7.22,0.792 7.22,0.162 7.22,-0.45 6.824,-1.08 6.014,-1.08 l -3.313,0 0,-2.629 2.791,0 c 0.864,0 1.296,-0.613 1.296,-1.224 0,-0.631 -0.432,-1.261 -1.296,-1.261 l -2.791,0 0,-3.925 c 0,-0.9 -0.576,-1.405 -1.35,-1.405 -0.775,0 -1.351,0.505 -1.351,1.405 L 0,0 Z"/></g><g transform="translate(12.5293,19.1484)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 1.855,0 c 0.99,0 1.674,0.594 1.674,1.603 0,1.025 -0.684,1.584 -1.674,1.584 L 0,3.187 0,0 Z m -2.701,4.267 c 0,0.864 0.486,1.404 1.387,1.404 l 3.169,0 c 2.772,0 4.483,-1.242 4.483,-4.068 0,-1.982 -1.495,-3.116 -3.331,-3.404 l 3.061,-3.277 c 0.252,-0.27 0.36,-0.54 0.36,-0.792 0,-0.702 -0.558,-1.387 -1.351,-1.387 -0.324,0 -0.756,0.126 -1.044,0.469 l -3.997,4.843 -0.036,0 0,-3.907 c 0,-0.9 -0.576,-1.405 -1.351,-1.405 -0.774,0 -1.35,0.505 -1.35,1.405 l 0,10.119 z"/></g><g transform="translate(19.4766,23.2534)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.9 0.449,1.566 1.404,1.566 l 4.465,0 c 0.865,0 1.279,-0.612 1.279,-1.242 0,-0.612 -0.433,-1.242 -1.279,-1.242 l -3.168,0 0,-2.629 2.952,0 c 0.882,0 1.314,-0.613 1.314,-1.243 0,-0.612 -0.45,-1.242 -1.314,-1.242 l -2.952,0 0,-2.737 3.33,0 c 0.865,0 1.279,-0.611 1.279,-1.242 0,-0.613 -0.433,-1.242 -1.279,-1.242 l -4.644,0 C 0.594,-11.253 0,-10.713 0,-9.903 L 0,0 Z"/></g><g transform="translate(27.4512,23.2534)" id="g36"><path id="path38" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.9 0.449,1.566 1.404,1.566 l 4.465,0 c 0.863,0 1.277,-0.612 1.277,-1.242 0,-0.612 -0.431,-1.242 -1.277,-1.242 l -3.17,0 0,-2.629 2.953,0 c 0.883,0 1.315,-0.613 1.315,-1.243 0,-0.612 -0.449,-1.242 -1.315,-1.242 l -2.953,0 0,-2.737 3.332,0 c 0.864,0 1.278,-0.611 1.278,-1.242 0,-0.613 -0.432,-1.242 -1.278,-1.242 l -4.646,0 C 0.594,-11.253 0,-10.713 0,-9.903 L 0,0 Z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#9266cc;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(5.7173,26.8438)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,1.55 0.992,2.418 2.325,2.418 3.658,2.418 4.65,1.55 4.65,0 l 0,-17.611 c 0,-1.551 -0.992,-2.418 -2.325,-2.418 -1.333,0 -2.325,0.867 -2.325,2.418 L 0,0 Z"/></g><g transform="translate(17.8071,11.2793)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.132,0 c 4,0 5.828,2.945 5.828,6.666 0,3.969 -1.859,6.852 -6.138,6.852 L 0,13.518 0,0 Z m -4.65,15.409 c 0,1.427 0.992,2.388 2.387,2.388 l 5.147,0 c 6.946,0 10.914,-4.465 10.914,-11.348 0,-6.511 -4.216,-10.728 -10.604,-10.728 l -5.395,0 c -1.024,0 -2.449,0.558 -2.449,2.325 l 0,17.363 z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(1.5273,22.8789)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.85 0.544,1.326 1.275,1.326 0.323,0 0.85,-0.255 1.071,-0.561 l 5.388,-7.191 0.034,0 0,6.426 c 0,0.85 0.544,1.326 1.275,1.326 0.731,0 1.275,-0.476 1.275,-1.326 l 0,-9.655 c 0,-0.85 -0.544,-1.325 -1.275,-1.325 -0.323,0 -0.833,0.254 -1.071,0.56 l -5.389,7.106 -0.033,0 0,-6.341 c 0,-0.85 -0.544,-1.325 -1.275,-1.325 C 0.544,-10.98 0,-10.505 0,-9.655 L 0,0 Z"/></g><g transform="translate(12.5942,22.624)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.85 0.425,1.479 1.326,1.479 l 4.215,0 c 0.816,0 1.207,-0.578 1.207,-1.173 0,-0.578 -0.408,-1.173 -1.207,-1.173 l -2.992,0 0,-2.482 2.788,0 c 0.833,0 1.241,-0.578 1.241,-1.172 0,-0.579 -0.425,-1.173 -1.241,-1.173 l -2.788,0 0,-2.584 3.145,0 c 0.816,0 1.207,-0.578 1.207,-1.173 0,-0.578 -0.407,-1.173 -1.207,-1.173 l -4.385,0 C 0.561,-10.624 0,-10.114 0,-9.35 L 0,0 Z"/></g><g transform="translate(19.9043,22.5049)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -0.051,0.221 -0.068,0.34 -0.068,0.578 0,0.544 0.459,1.122 1.207,1.122 0.816,0 1.207,-0.476 1.359,-1.224 l 1.445,-7.224 0.035,0 2.209,7.445 C 6.375,1.309 6.885,1.7 7.514,1.7 8.143,1.7 8.652,1.309 8.84,0.697 l 2.209,-7.445 0.033,0 1.445,7.224 C 12.68,1.224 13.072,1.7 13.887,1.7 14.635,1.7 15.094,1.122 15.094,0.578 15.094,0.34 15.078,0.221 15.025,0 l -2.158,-9.281 c -0.17,-0.714 -0.73,-1.325 -1.681,-1.325 -0.834,0 -1.481,0.543 -1.684,1.24 l -1.973,6.561 -0.033,0 -1.972,-6.561 c -0.204,-0.697 -0.85,-1.24 -1.682,-1.24 -0.952,0 -1.514,0.611 -1.684,1.325 L 0,0 Z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(2.5083,25.3613)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,1.2 0.768,1.872 1.8,1.872 0.456,0 1.2,-0.36 1.513,-0.792 l 7.608,-10.153 0.048,0 0,9.073 c 0,1.2 0.768,1.872 1.8,1.872 1.032,0 1.8,-0.672 1.8,-1.872 l 0,-13.633 c 0,-1.2 -0.768,-1.872 -1.8,-1.872 -0.456,0 -1.176,0.36 -1.512,0.792 l -7.609,10.033 -0.047,0 0,-8.953 c 0,-1.2 -0.768,-1.872 -1.801,-1.872 -1.032,0 -1.8,0.672 -1.8,1.872 L 0,0 Z"/></g><g transform="translate(31.9102,20.1289)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 1.512,0 2.111,-0.768 2.111,-2.305 0,-4.632 -3.023,-8.112 -7.824,-8.112 -4.873,0 -8.257,3.864 -8.257,8.833 0,4.992 3.361,8.833 8.257,8.833 3.623,0 6.6,-1.705 6.6,-3.385 0,-1.032 -0.647,-1.68 -1.489,-1.68 -1.63,0 -1.966,1.752 -5.111,1.752 -3,0 -4.513,-2.616 -4.513,-5.52 0,-2.929 1.464,-5.521 4.513,-5.521 1.897,0 4.08,1.056 4.08,3.792 l -2.447,0 c -0.984,0 -1.682,0.697 -1.682,1.681 0,1.008 0.77,1.632 1.682,1.632 L 0,0 Z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(14.7017,18.5449)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,2.904 -1.512,5.52 -4.513,5.52 -3,0 -4.512,-2.616 -4.512,-5.52 0,-2.929 1.464,-5.521 4.512,-5.521 C -1.464,-5.521 0,-2.929 0,0 m -12.769,0 c 0,4.992 3.36,8.833 8.256,8.833 4.825,0 8.257,-3.961 8.257,-8.833 0,-4.969 -3.336,-8.833 -8.257,-8.833 -4.872,0 -8.256,3.864 -8.256,8.833"/></g><g transform="translate(19.9316,25.4575)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.984 0.721,1.776 1.801,1.776 1.031,0 1.8,-0.672 1.8,-1.776 l 0,-5.185 5.905,6.289 c 0.264,0.288 0.719,0.672 1.39,0.672 0.913,0 1.778,-0.696 1.778,-1.728 0,-0.624 -0.385,-1.128 -1.176,-1.92 l -4.537,-4.465 5.545,-5.785 c 0.576,-0.576 1.008,-1.103 1.008,-1.824 0,-1.128 -0.889,-1.655 -1.873,-1.655 -0.696,0 -1.151,0.407 -1.825,1.128 l -6.215,6.721 0,-6.122 c 0,-0.935 -0.72,-1.727 -1.8,-1.727 -1.032,0 -1.801,0.672 -1.801,1.727 L 0,0 Z"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(9.7622,23.4824)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.78 -0.52,-1.48 -1.34,-1.48 -0.82,0 -1.46,0.6 -2.66,0.6 -0.861,0 -1.641,-0.46 -1.641,-1.3 0,-2.06 6.681,-0.74 6.681,-5.901 0,-2.861 -2.36,-4.642 -5.121,-4.642 -1.54,0 -4.861,0.361 -4.861,2.241 0,0.78 0.521,1.42 1.34,1.42 0.941,0 2.061,-0.78 3.361,-0.78 1.321,0 2.041,0.74 2.041,1.721 0,2.36 -6.682,0.939 -6.682,5.58 C -8.882,0.26 -6.581,2 -3.92,2 -2.8,2 0,1.581 0,0"/></g><g transform="translate(21.7627,18.1211)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,2.421 -1.261,4.602 -3.761,4.602 -2.5,0 -3.76,-2.181 -3.76,-4.602 0,-2.44 1.22,-4.601 3.76,-4.601 C -1.22,-4.601 0,-2.44 0,0 m -10.643,0 c 0,4.161 2.801,7.362 6.882,7.362 4.021,0 6.881,-3.3 6.881,-7.362 0,-4.141 -2.78,-7.361 -6.881,-7.361 -4.061,0 -6.882,3.22 -6.882,7.361"/></g><g transform="translate(34.1426,23.4824)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.78 -0.521,-1.48 -1.342,-1.48 -0.82,0 -1.459,0.6 -2.66,0.6 -0.859,0 -1.641,-0.46 -1.641,-1.3 0,-2.06 6.682,-0.74 6.682,-5.901 0,-2.861 -2.359,-4.642 -5.121,-4.642 -1.539,0 -4.861,0.361 -4.861,2.241 0,0.78 0.521,1.42 1.341,1.42 0.94,0 2.061,-0.78 3.36,-0.78 1.32,0 2.041,0.74 2.041,1.721 0,2.36 -6.682,0.939 -6.682,5.58 C -8.883,0.26 -6.582,2 -3.922,2 -2.801,2 0,1.581 0,0"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save