@ -0,0 +1,19 @@ |
|||||
|
{ |
||||
|
"presets": [ |
||||
|
"@babel/preset-react", |
||||
|
"@babel/preset-env" |
||||
|
|
||||
|
], |
||||
|
"plugins": [ |
||||
|
"@babel/plugin-proposal-class-properties", |
||||
|
"@babel/plugin-proposal-object-rest-spread", |
||||
|
["import", { |
||||
|
"libraryName": "antd", |
||||
|
"libraryDirectory": "es" |
||||
|
|
||||
|
}] |
||||
|
], |
||||
|
"env": { |
||||
|
"development": {} |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
{ |
||||
|
"version": "0.2.0", |
||||
|
"configurations": [ |
||||
|
{ |
||||
|
"name": "Server", |
||||
|
"type": "node", |
||||
|
"request": "launch", |
||||
|
"program": "${workspaceRoot}/server.js", |
||||
|
"args": [ |
||||
|
"-u http://127.0.0.1:4000", |
||||
|
//阿里OSS |
||||
|
"--aliOssAccessKey LTAI5tNDfn7UhStYQcn3JBtw", |
||||
|
"--aliOssSecretKey rnoXtDWQA1djJ5Xqcdn1OSEol0lVyv", |
||||
|
"--aliOssBucket test-c371", |
||||
|
"--aliOssRegion oss-cn-hangzhou", |
||||
|
], |
||||
|
"outputCapture": "std", |
||||
|
"env": { |
||||
|
"NODE_ENV": "development" |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
// 将设置放入此文件中以覆盖默认值和用户设置。 |
||||
|
{ |
||||
|
"editor.fontSize": 16, |
||||
|
} |
@ -0,0 +1,56 @@ |
|||||
|
#FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2 |
||||
|
FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2 |
||||
|
COPY ./web/ /var/app |
||||
|
WORKDIR /var/app |
||||
|
EXPOSE 8080 |
||||
|
|
||||
|
RUN apk update && apk add --no-cache \ |
||||
|
sudo \ |
||||
|
curl \ |
||||
|
build-base \ |
||||
|
g++ \ |
||||
|
libpng \ |
||||
|
libpng-dev \ |
||||
|
jpeg-dev \ |
||||
|
pango-dev \ |
||||
|
cairo-dev \ |
||||
|
giflib-dev \ |
||||
|
python \ |
||||
|
; |
||||
|
RUN npm config set registry=https://nexus.ngaiot.com/repository/fs-npm/ |
||||
|
RUN npm cache clean -f |
||||
|
#RUN npm install -g node-gyp |
||||
|
RUN rm -rf package-lock.json |
||||
|
RUN npm install --registry https://nexus.ngaiot.com/repository/fs-npm/ |
||||
|
RUN npm run build |
||||
|
RUN rm -rf client/src |
||||
|
RUN rm -rf node_modules |
||||
|
RUN npm install --production --registry https://nexus.ngaiot.com/repository/fs-npm/ |
||||
|
#RUN npm cache clean -f && npm install --production --force --registry http://10.8.30.22:7000 |
||||
|
CMD ["-u", "http://localhost:8088"] |
||||
|
ENTRYPOINT [ "node", "server.js" ] |
||||
|
|
||||
|
# FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12-dev as builder |
||||
|
|
||||
|
# COPY . /var/app |
||||
|
|
||||
|
# WORKDIR /var/app |
||||
|
|
||||
|
# EXPOSE 8080 |
||||
|
|
||||
|
# RUN npm config set registry=http://10.8.30.22:7000 |
||||
|
# RUN echo "{\"time\":\"$BUILD_TIMESTAMP\",\"build\": \"$BUILD_NUMBER\",\"revision\": \"$SVN_REVISION_1\",\"URL\":\"$SVN_URL_1\"}" > version.json |
||||
|
# RUN npm cache clean -f |
||||
|
# RUN rm -rf package-lock.json |
||||
|
# RUN npm install --registry http://10.8.30.22:7000 |
||||
|
# RUN npm run build |
||||
|
# RUN rm -rf client/src |
||||
|
# RUN rm -rf node_modules |
||||
|
# RUN npm install --production --force --registry http://10.8.30.22:7000 |
||||
|
# FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12 |
||||
|
|
||||
|
# COPY --from=builder --chown=node /var/app /home/node/app |
||||
|
|
||||
|
# WORKDIR /home/node/app |
||||
|
|
||||
|
# CMD ["node", "server.js"] |
@ -0,0 +1,370 @@ |
|||||
|
*{margin: 0;padding: 0;list-style: none;} |
||||
|
/* |
||||
|
KISSY CSS Reset |
||||
|
理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 |
||||
|
2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 |
||||
|
3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 |
||||
|
特色:1. 适应中文;2. 基于最新主流浏览器。 |
||||
|
维护:玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com> |
||||
|
*/ |
||||
|
|
||||
|
/** 清除内外边距 **/ |
||||
|
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ |
||||
|
dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ |
||||
|
pre, /* text formatting elements 文本格式元素 */ |
||||
|
form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ |
||||
|
th, td /* table elements 表格元素 */ { |
||||
|
margin: 0; |
||||
|
padding: 0; |
||||
|
} |
||||
|
|
||||
|
/** 设置默认字体 **/ |
||||
|
body, |
||||
|
button, input, select, textarea /* for ie */ { |
||||
|
font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; |
||||
|
} |
||||
|
h1, h2, h3, h4, h5, h6 { font-size: 100%; } |
||||
|
address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ |
||||
|
code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ |
||||
|
small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ |
||||
|
|
||||
|
/** 重置列表元素 **/ |
||||
|
ul, ol { list-style: none; } |
||||
|
|
||||
|
/** 重置文本格式元素 **/ |
||||
|
a { text-decoration: none; } |
||||
|
a:hover { text-decoration: underline; } |
||||
|
|
||||
|
|
||||
|
/** 重置表单元素 **/ |
||||
|
legend { color: #000; } /* for ie6 */ |
||||
|
fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ |
||||
|
button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ |
||||
|
/* 注:optgroup 无法扶正 */ |
||||
|
|
||||
|
/** 重置表格元素 **/ |
||||
|
table { border-collapse: collapse; border-spacing: 0; } |
||||
|
|
||||
|
/* 清除浮动 */ |
||||
|
.ks-clear:after, .clear:after { |
||||
|
content: '\20'; |
||||
|
display: block; |
||||
|
height: 0; |
||||
|
clear: both; |
||||
|
} |
||||
|
.ks-clear, .clear { |
||||
|
*zoom: 1; |
||||
|
} |
||||
|
|
||||
|
.main { |
||||
|
padding: 30px 100px; |
||||
|
width: 960px; |
||||
|
margin: 0 auto; |
||||
|
} |
||||
|
.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} |
||||
|
|
||||
|
.helps{margin-top:40px;} |
||||
|
.helps pre{ |
||||
|
padding:20px; |
||||
|
margin:10px 0; |
||||
|
border:solid 1px #e7e1cd; |
||||
|
background-color: #fffdef; |
||||
|
overflow: auto; |
||||
|
} |
||||
|
|
||||
|
.icon_lists{ |
||||
|
width: 100% !important; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.icon_lists li{ |
||||
|
float:left; |
||||
|
width: 100px; |
||||
|
height:180px; |
||||
|
text-align: center; |
||||
|
list-style: none !important; |
||||
|
} |
||||
|
.icon_lists .icon{ |
||||
|
font-size: 42px; |
||||
|
line-height: 100px; |
||||
|
margin: 10px 0; |
||||
|
color:#333; |
||||
|
-webkit-transition: font-size 0.25s ease-out 0s; |
||||
|
-moz-transition: font-size 0.25s ease-out 0s; |
||||
|
transition: font-size 0.25s ease-out 0s; |
||||
|
|
||||
|
} |
||||
|
.icon_lists .icon:hover{ |
||||
|
font-size: 100px; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.markdown { |
||||
|
color: #666; |
||||
|
font-size: 14px; |
||||
|
line-height: 1.8; |
||||
|
} |
||||
|
|
||||
|
.highlight { |
||||
|
line-height: 1.5; |
||||
|
} |
||||
|
|
||||
|
.markdown img { |
||||
|
vertical-align: middle; |
||||
|
max-width: 100%; |
||||
|
} |
||||
|
|
||||
|
.markdown h1 { |
||||
|
color: #404040; |
||||
|
font-weight: 500; |
||||
|
line-height: 40px; |
||||
|
margin-bottom: 24px; |
||||
|
} |
||||
|
|
||||
|
.markdown h2, |
||||
|
.markdown h3, |
||||
|
.markdown h4, |
||||
|
.markdown h5, |
||||
|
.markdown h6 { |
||||
|
color: #404040; |
||||
|
margin: 1.6em 0 0.6em 0; |
||||
|
font-weight: 500; |
||||
|
clear: both; |
||||
|
} |
||||
|
|
||||
|
.markdown h1 { |
||||
|
font-size: 28px; |
||||
|
} |
||||
|
|
||||
|
.markdown h2 { |
||||
|
font-size: 22px; |
||||
|
} |
||||
|
|
||||
|
.markdown h3 { |
||||
|
font-size: 16px; |
||||
|
} |
||||
|
|
||||
|
.markdown h4 { |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
.markdown h5 { |
||||
|
font-size: 12px; |
||||
|
} |
||||
|
|
||||
|
.markdown h6 { |
||||
|
font-size: 12px; |
||||
|
} |
||||
|
|
||||
|
.markdown hr { |
||||
|
height: 1px; |
||||
|
border: 0; |
||||
|
background: #e9e9e9; |
||||
|
margin: 16px 0; |
||||
|
clear: both; |
||||
|
} |
||||
|
|
||||
|
.markdown p, |
||||
|
.markdown pre { |
||||
|
margin: 1em 0; |
||||
|
} |
||||
|
|
||||
|
.markdown > p, |
||||
|
.markdown > blockquote, |
||||
|
.markdown > .highlight, |
||||
|
.markdown > ol, |
||||
|
.markdown > ul { |
||||
|
width: 80%; |
||||
|
} |
||||
|
|
||||
|
.markdown ul > li { |
||||
|
list-style: circle; |
||||
|
} |
||||
|
|
||||
|
.markdown > ul li, |
||||
|
.markdown blockquote ul > li { |
||||
|
margin-left: 20px; |
||||
|
padding-left: 4px; |
||||
|
} |
||||
|
|
||||
|
.markdown > ul li p, |
||||
|
.markdown > ol li p { |
||||
|
margin: 0.6em 0; |
||||
|
} |
||||
|
|
||||
|
.markdown ol > li { |
||||
|
list-style: decimal; |
||||
|
} |
||||
|
|
||||
|
.markdown > ol li, |
||||
|
.markdown blockquote ol > li { |
||||
|
margin-left: 20px; |
||||
|
padding-left: 4px; |
||||
|
} |
||||
|
|
||||
|
.markdown code { |
||||
|
margin: 0 3px; |
||||
|
padding: 0 5px; |
||||
|
background: #eee; |
||||
|
border-radius: 3px; |
||||
|
} |
||||
|
|
||||
|
.markdown pre { |
||||
|
border-radius: 6px; |
||||
|
background: #f7f7f7; |
||||
|
padding: 20px; |
||||
|
} |
||||
|
|
||||
|
.markdown pre code { |
||||
|
border: none; |
||||
|
background: #f7f7f7; |
||||
|
margin: 0; |
||||
|
} |
||||
|
|
||||
|
.markdown strong, |
||||
|
.markdown b { |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.markdown > table { |
||||
|
border-collapse: collapse; |
||||
|
border-spacing: 0px; |
||||
|
empty-cells: show; |
||||
|
border: 1px solid #e9e9e9; |
||||
|
width: 95%; |
||||
|
margin-bottom: 24px; |
||||
|
} |
||||
|
|
||||
|
.markdown > table th { |
||||
|
white-space: nowrap; |
||||
|
color: #333; |
||||
|
font-weight: 600; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.markdown > table th, |
||||
|
.markdown > table td { |
||||
|
border: 1px solid #e9e9e9; |
||||
|
padding: 8px 16px; |
||||
|
text-align: left; |
||||
|
} |
||||
|
|
||||
|
.markdown > table th { |
||||
|
background: #F7F7F7; |
||||
|
} |
||||
|
|
||||
|
.markdown blockquote { |
||||
|
font-size: 90%; |
||||
|
color: #999; |
||||
|
border-left: 4px solid #e9e9e9; |
||||
|
padding-left: 0.8em; |
||||
|
margin: 1em 0; |
||||
|
font-style: italic; |
||||
|
} |
||||
|
|
||||
|
.markdown blockquote p { |
||||
|
margin: 0; |
||||
|
} |
||||
|
|
||||
|
.markdown .anchor { |
||||
|
opacity: 0; |
||||
|
transition: opacity 0.3s ease; |
||||
|
margin-left: 8px; |
||||
|
} |
||||
|
|
||||
|
.markdown .waiting { |
||||
|
color: #ccc; |
||||
|
} |
||||
|
|
||||
|
.markdown h1:hover .anchor, |
||||
|
.markdown h2:hover .anchor, |
||||
|
.markdown h3:hover .anchor, |
||||
|
.markdown h4:hover .anchor, |
||||
|
.markdown h5:hover .anchor, |
||||
|
.markdown h6:hover .anchor { |
||||
|
opacity: 1; |
||||
|
display: inline-block; |
||||
|
} |
||||
|
|
||||
|
.markdown > br, |
||||
|
.markdown > p > br { |
||||
|
clear: both; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.hljs { |
||||
|
display: block; |
||||
|
background: white; |
||||
|
padding: 0.5em; |
||||
|
color: #333333; |
||||
|
overflow-x: auto; |
||||
|
} |
||||
|
|
||||
|
.hljs-comment, |
||||
|
.hljs-meta { |
||||
|
color: #969896; |
||||
|
} |
||||
|
|
||||
|
.hljs-string, |
||||
|
.hljs-variable, |
||||
|
.hljs-template-variable, |
||||
|
.hljs-strong, |
||||
|
.hljs-emphasis, |
||||
|
.hljs-quote { |
||||
|
color: #df5000; |
||||
|
} |
||||
|
|
||||
|
.hljs-keyword, |
||||
|
.hljs-selector-tag, |
||||
|
.hljs-type { |
||||
|
color: #a71d5d; |
||||
|
} |
||||
|
|
||||
|
.hljs-literal, |
||||
|
.hljs-symbol, |
||||
|
.hljs-bullet, |
||||
|
.hljs-attribute { |
||||
|
color: #0086b3; |
||||
|
} |
||||
|
|
||||
|
.hljs-section, |
||||
|
.hljs-name { |
||||
|
color: #63a35c; |
||||
|
} |
||||
|
|
||||
|
.hljs-tag { |
||||
|
color: #333333; |
||||
|
} |
||||
|
|
||||
|
.hljs-title, |
||||
|
.hljs-attr, |
||||
|
.hljs-selector-id, |
||||
|
.hljs-selector-class, |
||||
|
.hljs-selector-attr, |
||||
|
.hljs-selector-pseudo { |
||||
|
color: #795da3; |
||||
|
} |
||||
|
|
||||
|
.hljs-addition { |
||||
|
color: #55a532; |
||||
|
background-color: #eaffea; |
||||
|
} |
||||
|
|
||||
|
.hljs-deletion { |
||||
|
color: #bd2c00; |
||||
|
background-color: #ffecec; |
||||
|
} |
||||
|
|
||||
|
.hljs-link { |
||||
|
text-decoration: underline; |
||||
|
} |
||||
|
|
||||
|
pre{ |
||||
|
background: #fff; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,514 @@ |
|||||
|
|
||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8"/> |
||||
|
<title>IconFont</title> |
||||
|
<link rel="stylesheet" href="demo.css"> |
||||
|
<link rel="stylesheet" href="iconfont.css"> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div class="main markdown"> |
||||
|
<h1>IconFont 图标</h1> |
||||
|
<ul class="icon_lists clear"> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-liuliang"></i> |
||||
|
<div class="name">流量</div> |
||||
|
<div class="fontclass">.icon-liuliang</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-iconfontditie"></i> |
||||
|
<div class="name">轻轨</div> |
||||
|
<div class="fontclass">.icon-iconfontditie</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-fengsu3"></i> |
||||
|
<div class="name">风速3</div> |
||||
|
<div class="fontclass">.icon-fengsu3</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-calendar"></i> |
||||
|
<div class="name">calendar</div> |
||||
|
<div class="fontclass">.icon-calendar</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-box"></i> |
||||
|
<div class="name">box</div> |
||||
|
<div class="fontclass">.icon-box</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shenheshibai"></i> |
||||
|
<div class="name">审核失败</div> |
||||
|
<div class="fontclass">.icon-shenheshibai</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-slope"></i> |
||||
|
<div class="name">边坡</div> |
||||
|
<div class="fontclass">.icon-slope</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-icon2"></i> |
||||
|
<div class="name">公路</div> |
||||
|
<div class="fontclass">.icon-icon2</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-gnsscaidian"></i> |
||||
|
<div class="name">GNSS采点</div> |
||||
|
<div class="fontclass">.icon-gnsscaidian</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-chuanganqishebei"></i> |
||||
|
<div class="name">传感器设备</div> |
||||
|
<div class="fontclass">.icon-chuanganqishebei</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-dianliuchuanganqi"></i> |
||||
|
<div class="name">电流传感器</div> |
||||
|
<div class="fontclass">.icon-dianliuchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-dianyachuanganqi"></i> |
||||
|
<div class="name">电压传感器</div> |
||||
|
<div class="fontclass">.icon-dianyachuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-wenduchuanganqi"></i> |
||||
|
<div class="name">温度传感器</div> |
||||
|
<div class="fontclass">.icon-wenduchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-xinjian"></i> |
||||
|
<div class="name">新建</div> |
||||
|
<div class="fontclass">.icon-xinjian</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-handong"></i> |
||||
|
<div class="name">涵洞</div> |
||||
|
<div class="fontclass">.icon-handong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-guanwanggongcheng"></i> |
||||
|
<div class="name">管网工程</div> |
||||
|
<div class="fontclass">.icon-guanwanggongcheng</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shenhe"></i> |
||||
|
<div class="name">审核</div> |
||||
|
<div class="fontclass">.icon-shenhe</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-zhihuishequ"></i> |
||||
|
<div class="name">智慧城市</div> |
||||
|
<div class="fontclass">.icon-zhihuishequ</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-bianpoweiyi"></i> |
||||
|
<div class="name">边坡位移</div> |
||||
|
<div class="fontclass">.icon-bianpoweiyi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-jianzhu"></i> |
||||
|
<div class="name">建筑</div> |
||||
|
<div class="fontclass">.icon-jianzhu</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-chuguan"></i> |
||||
|
<div class="name">储罐</div> |
||||
|
<div class="fontclass">.icon-chuguan</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-suidao"></i> |
||||
|
<div class="name">隧道</div> |
||||
|
<div class="fontclass">.icon-suidao</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-data"></i> |
||||
|
<div class="name">data</div> |
||||
|
<div class="fontclass">.icon-data</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-kuangshankaicai"></i> |
||||
|
<div class="name">矿山开采</div> |
||||
|
<div class="fontclass">.icon-kuangshankaicai</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-wangluo"></i> |
||||
|
<div class="name">网络</div> |
||||
|
<div class="fontclass">.icon-wangluo</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-jiankong"></i> |
||||
|
<div class="name">监控</div> |
||||
|
<div class="fontclass">.icon-jiankong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-dashuju"></i> |
||||
|
<div class="name">大数据</div> |
||||
|
<div class="fontclass">.icon-dashuju</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shuju"></i> |
||||
|
<div class="name">数据库</div> |
||||
|
<div class="fontclass">.icon-shuju</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shenhechenggong"></i> |
||||
|
<div class="name">审核成功</div> |
||||
|
<div class="fontclass">.icon-shenhechenggong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-jiankong1"></i> |
||||
|
<div class="name">监控</div> |
||||
|
<div class="fontclass">.icon-jiankong1</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-wangluoxitong"></i> |
||||
|
<div class="name">网络系统</div> |
||||
|
<div class="fontclass">.icon-wangluoxitong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-dingwei"></i> |
||||
|
<div class="name">定位</div> |
||||
|
<div class="fontclass">.icon-dingwei</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-xitongyunzhuanqingkuang"></i> |
||||
|
<div class="name">系统运转情况</div> |
||||
|
<div class="fontclass">.icon-xitongyunzhuanqingkuang</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-chakan"></i> |
||||
|
<div class="name">查看</div> |
||||
|
<div class="fontclass">.icon-chakan</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-lianjie"></i> |
||||
|
<div class="name">链接</div> |
||||
|
<div class="fontclass">.icon-lianjie</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shujudaochu-01"></i> |
||||
|
<div class="name">数据导出-01</div> |
||||
|
<div class="fontclass">.icon-shujudaochu-01</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-xitongzhuangtai"></i> |
||||
|
<div class="name">系统状态</div> |
||||
|
<div class="fontclass">.icon-xitongzhuangtai</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-xiaofeimingxidan"></i> |
||||
|
<div class="name">消费明细单</div> |
||||
|
<div class="fontclass">.icon-xiaofeimingxidan</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-SQLshenhe"></i> |
||||
|
<div class="name">SQL审核</div> |
||||
|
<div class="fontclass">.icon-SQLshenhe</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-aislogo"></i> |
||||
|
<div class="name">aislogo</div> |
||||
|
<div class="fontclass">.icon-aislogo</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-qiao"></i> |
||||
|
<div class="name">桥</div> |
||||
|
<div class="fontclass">.icon-qiao</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-tashiqizhongji"></i> |
||||
|
<div class="name">塔式起重机</div> |
||||
|
<div class="fontclass">.icon-tashiqizhongji</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-dwggeshi"></i> |
||||
|
<div class="name">dwg格式</div> |
||||
|
<div class="fontclass">.icon-dwggeshi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-luyouqi"></i> |
||||
|
<div class="name">路由器</div> |
||||
|
<div class="fontclass">.icon-luyouqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-anzhuangshigong-xianxing"></i> |
||||
|
<div class="name">244安装、施工-线性</div> |
||||
|
<div class="fontclass">.icon-anzhuangshigong-xianxing</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shaixuanguolv"></i> |
||||
|
<div class="name">245筛选过滤</div> |
||||
|
<div class="fontclass">.icon-shaixuanguolv</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-anzhuangshigong"></i> |
||||
|
<div class="name">244安装、施工</div> |
||||
|
<div class="fontclass">.icon-anzhuangshigong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-tiaoxingtu-xianxing"></i> |
||||
|
<div class="name">408条形图-线性</div> |
||||
|
<div class="fontclass">.icon-tiaoxingtu-xianxing</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-zhexiantu-xianxing"></i> |
||||
|
<div class="name">409折线图-线性</div> |
||||
|
<div class="fontclass">.icon-zhexiantu-xianxing</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-tieta"></i> |
||||
|
<div class="name">铁塔</div> |
||||
|
<div class="fontclass">.icon-tieta</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_wendangtxt"></i> |
||||
|
<div class="name">800格式_文档txt</div> |
||||
|
<div class="fontclass">.icon-geshi_wendangtxt</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_wendangdoc"></i> |
||||
|
<div class="name">801格式_文档doc</div> |
||||
|
<div class="fontclass">.icon-geshi_wendangdoc</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_wendangpdf"></i> |
||||
|
<div class="name">807格式_文档pdf</div> |
||||
|
<div class="fontclass">.icon-geshi_wendangpdf</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_wendangxls"></i> |
||||
|
<div class="name">803格式_文档xls</div> |
||||
|
<div class="fontclass">.icon-geshi_wendangxls</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_tongyongwendang"></i> |
||||
|
<div class="name">819格式_通用文档</div> |
||||
|
<div class="fontclass">.icon-geshi_tongyongwendang</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_shipinmp"></i> |
||||
|
<div class="name">840格式_视频mp4</div> |
||||
|
<div class="fontclass">.icon-geshi_shipinmp</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_tupianjpg"></i> |
||||
|
<div class="name">860格式_图片jpg</div> |
||||
|
<div class="fontclass">.icon-geshi_tupianjpg</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-geshi_tupianpng"></i> |
||||
|
<div class="name">865格式_图片png</div> |
||||
|
<div class="fontclass">.icon-geshi_tupianpng</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-guangzhaochuanganqi"></i> |
||||
|
<div class="name">光照传感器</div> |
||||
|
<div class="fontclass">.icon-guangzhaochuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-building"></i> |
||||
|
<div class="name">建筑</div> |
||||
|
<div class="fontclass">.icon-building</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-yanwuchuanganqi"></i> |
||||
|
<div class="name">烟雾传感器</div> |
||||
|
<div class="fontclass">.icon-yanwuchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shizheng"></i> |
||||
|
<div class="name">市政</div> |
||||
|
<div class="fontclass">.icon-shizheng</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-chuanganqi"></i> |
||||
|
<div class="name">传感器</div> |
||||
|
<div class="fontclass">.icon-chuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-WSD"></i> |
||||
|
<div class="name">温湿度传感器</div> |
||||
|
<div class="fontclass">.icon-WSD</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-yalichuanganqi"></i> |
||||
|
<div class="name">压力传感器</div> |
||||
|
<div class="fontclass">.icon-yalichuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-yinglichuanganqi"></i> |
||||
|
<div class="name">应力传感器</div> |
||||
|
<div class="fontclass">.icon-yinglichuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-chenjiangchuanganqi"></i> |
||||
|
<div class="name">沉降传感器</div> |
||||
|
<div class="fontclass">.icon-chenjiangchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-yalichuanganqi1"></i> |
||||
|
<div class="name">压力传感器</div> |
||||
|
<div class="fontclass">.icon-yalichuanganqi1</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-YWC"></i> |
||||
|
<div class="name">液位传感器</div> |
||||
|
<div class="fontclass">.icon-YWC</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-computer"></i> |
||||
|
<div class="name">computer</div> |
||||
|
<div class="fontclass">.icon-computer</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-empty"></i> |
||||
|
<div class="name">empty</div> |
||||
|
<div class="fontclass">.icon-empty</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-offline"></i> |
||||
|
<div class="name">offline</div> |
||||
|
<div class="fontclass">.icon-offline</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-daba"></i> |
||||
|
<div class="name">大坝</div> |
||||
|
<div class="fontclass">.icon-daba</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shenbuweiyi"></i> |
||||
|
<div class="name">深部位移</div> |
||||
|
<div class="fontclass">.icon-shenbuweiyi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-maosuochuanganqi"></i> |
||||
|
<div class="name">锚索传感器</div> |
||||
|
<div class="fontclass">.icon-maosuochuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-yuliangchuanganqi"></i> |
||||
|
<div class="name">雨量传感器</div> |
||||
|
<div class="fontclass">.icon-yuliangchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-weiyiji"></i> |
||||
|
<div class="name">位移计</div> |
||||
|
<div class="fontclass">.icon-weiyiji</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-qixiangzhan_"></i> |
||||
|
<div class="name">气象站_1</div> |
||||
|
<div class="fontclass">.icon-qixiangzhan_</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc icon-shenjikeng"></i> |
||||
|
<div class="name">深基坑</div> |
||||
|
<div class="fontclass">.icon-shenjikeng</div> |
||||
|
</li> |
||||
|
|
||||
|
</ul> |
||||
|
|
||||
|
<h2 id="font-class-">font-class引用</h2> |
||||
|
<hr> |
||||
|
|
||||
|
<p>font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。</p> |
||||
|
<p>与unicode使用方式相比,具有如下特点:</p> |
||||
|
<ul> |
||||
|
<li>兼容性良好,支持ie8+,及所有现代浏览器。</li> |
||||
|
<li>相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。</li> |
||||
|
<li>因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。</li> |
||||
|
<li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li> |
||||
|
</ul> |
||||
|
<p>使用步骤如下:</p> |
||||
|
<h3 id="-fontclass-">第一步:引入项目下面生成的fontclass代码:</h3> |
||||
|
|
||||
|
|
||||
|
<pre><code class="lang-js hljs javascript"><span class="hljs-comment"><link rel="stylesheet" type="text/css" href="./iconfont.css"></span></code></pre> |
||||
|
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3> |
||||
|
<pre><code class="lang-css hljs"><<span class="hljs-selector-tag">i</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">sc</span> <span class="hljs-selector-tag">icon-xxx</span>"></<span class="hljs-selector-tag">i</span>></code></pre> |
||||
|
<blockquote> |
||||
|
<p>"sc"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p> |
||||
|
</blockquote> |
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,695 @@ |
|||||
|
|
||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8"/> |
||||
|
<title>IconFont</title> |
||||
|
<link rel="stylesheet" href="demo.css"> |
||||
|
<script src="iconfont.js"></script> |
||||
|
|
||||
|
<style type="text/css"> |
||||
|
.icon { |
||||
|
/* 通过设置 font-size 来改变图标大小 */ |
||||
|
width: 1em; height: 1em; |
||||
|
/* 图标和文字相邻时,垂直对齐 */ |
||||
|
vertical-align: -0.15em; |
||||
|
/* 通过设置 color 来改变 SVG 的颜色/fill */ |
||||
|
fill: currentColor; |
||||
|
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 |
||||
|
normalize.css 中也包含这行 */ |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div class="main markdown"> |
||||
|
<h1>IconFont 图标</h1> |
||||
|
<ul class="icon_lists clear"> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-liuliang"></use> |
||||
|
</svg> |
||||
|
<div class="name">流量</div> |
||||
|
<div class="fontclass">#icon-liuliang</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-iconfontditie"></use> |
||||
|
</svg> |
||||
|
<div class="name">轻轨</div> |
||||
|
<div class="fontclass">#icon-iconfontditie</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-fengsu3"></use> |
||||
|
</svg> |
||||
|
<div class="name">风速3</div> |
||||
|
<div class="fontclass">#icon-fengsu3</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-calendar"></use> |
||||
|
</svg> |
||||
|
<div class="name">calendar</div> |
||||
|
<div class="fontclass">#icon-calendar</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-box"></use> |
||||
|
</svg> |
||||
|
<div class="name">box</div> |
||||
|
<div class="fontclass">#icon-box</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shenheshibai"></use> |
||||
|
</svg> |
||||
|
<div class="name">审核失败</div> |
||||
|
<div class="fontclass">#icon-shenheshibai</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-slope"></use> |
||||
|
</svg> |
||||
|
<div class="name">边坡</div> |
||||
|
<div class="fontclass">#icon-slope</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-icon2"></use> |
||||
|
</svg> |
||||
|
<div class="name">公路</div> |
||||
|
<div class="fontclass">#icon-icon2</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-gnsscaidian"></use> |
||||
|
</svg> |
||||
|
<div class="name">GNSS采点</div> |
||||
|
<div class="fontclass">#icon-gnsscaidian</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-chuanganqishebei"></use> |
||||
|
</svg> |
||||
|
<div class="name">传感器设备</div> |
||||
|
<div class="fontclass">#icon-chuanganqishebei</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-dianliuchuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">电流传感器</div> |
||||
|
<div class="fontclass">#icon-dianliuchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-dianyachuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">电压传感器</div> |
||||
|
<div class="fontclass">#icon-dianyachuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-wenduchuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">温度传感器</div> |
||||
|
<div class="fontclass">#icon-wenduchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-xinjian"></use> |
||||
|
</svg> |
||||
|
<div class="name">新建</div> |
||||
|
<div class="fontclass">#icon-xinjian</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-handong"></use> |
||||
|
</svg> |
||||
|
<div class="name">涵洞</div> |
||||
|
<div class="fontclass">#icon-handong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-guanwanggongcheng"></use> |
||||
|
</svg> |
||||
|
<div class="name">管网工程</div> |
||||
|
<div class="fontclass">#icon-guanwanggongcheng</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shenhe"></use> |
||||
|
</svg> |
||||
|
<div class="name">审核</div> |
||||
|
<div class="fontclass">#icon-shenhe</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-zhihuishequ"></use> |
||||
|
</svg> |
||||
|
<div class="name">智慧城市</div> |
||||
|
<div class="fontclass">#icon-zhihuishequ</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-bianpoweiyi"></use> |
||||
|
</svg> |
||||
|
<div class="name">边坡位移</div> |
||||
|
<div class="fontclass">#icon-bianpoweiyi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-jianzhu"></use> |
||||
|
</svg> |
||||
|
<div class="name">建筑</div> |
||||
|
<div class="fontclass">#icon-jianzhu</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-chuguan"></use> |
||||
|
</svg> |
||||
|
<div class="name">储罐</div> |
||||
|
<div class="fontclass">#icon-chuguan</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-suidao"></use> |
||||
|
</svg> |
||||
|
<div class="name">隧道</div> |
||||
|
<div class="fontclass">#icon-suidao</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-data"></use> |
||||
|
</svg> |
||||
|
<div class="name">data</div> |
||||
|
<div class="fontclass">#icon-data</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-kuangshankaicai"></use> |
||||
|
</svg> |
||||
|
<div class="name">矿山开采</div> |
||||
|
<div class="fontclass">#icon-kuangshankaicai</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-wangluo"></use> |
||||
|
</svg> |
||||
|
<div class="name">网络</div> |
||||
|
<div class="fontclass">#icon-wangluo</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-jiankong"></use> |
||||
|
</svg> |
||||
|
<div class="name">监控</div> |
||||
|
<div class="fontclass">#icon-jiankong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-dashuju"></use> |
||||
|
</svg> |
||||
|
<div class="name">大数据</div> |
||||
|
<div class="fontclass">#icon-dashuju</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shuju"></use> |
||||
|
</svg> |
||||
|
<div class="name">数据库</div> |
||||
|
<div class="fontclass">#icon-shuju</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shenhechenggong"></use> |
||||
|
</svg> |
||||
|
<div class="name">审核成功</div> |
||||
|
<div class="fontclass">#icon-shenhechenggong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-jiankong1"></use> |
||||
|
</svg> |
||||
|
<div class="name">监控</div> |
||||
|
<div class="fontclass">#icon-jiankong1</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-wangluoxitong"></use> |
||||
|
</svg> |
||||
|
<div class="name">网络系统</div> |
||||
|
<div class="fontclass">#icon-wangluoxitong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-dingwei"></use> |
||||
|
</svg> |
||||
|
<div class="name">定位</div> |
||||
|
<div class="fontclass">#icon-dingwei</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-xitongyunzhuanqingkuang"></use> |
||||
|
</svg> |
||||
|
<div class="name">系统运转情况</div> |
||||
|
<div class="fontclass">#icon-xitongyunzhuanqingkuang</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-chakan"></use> |
||||
|
</svg> |
||||
|
<div class="name">查看</div> |
||||
|
<div class="fontclass">#icon-chakan</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-lianjie"></use> |
||||
|
</svg> |
||||
|
<div class="name">链接</div> |
||||
|
<div class="fontclass">#icon-lianjie</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shujudaochu-01"></use> |
||||
|
</svg> |
||||
|
<div class="name">数据导出-01</div> |
||||
|
<div class="fontclass">#icon-shujudaochu-01</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-xitongzhuangtai"></use> |
||||
|
</svg> |
||||
|
<div class="name">系统状态</div> |
||||
|
<div class="fontclass">#icon-xitongzhuangtai</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-xiaofeimingxidan"></use> |
||||
|
</svg> |
||||
|
<div class="name">消费明细单</div> |
||||
|
<div class="fontclass">#icon-xiaofeimingxidan</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-SQLshenhe"></use> |
||||
|
</svg> |
||||
|
<div class="name">SQL审核</div> |
||||
|
<div class="fontclass">#icon-SQLshenhe</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-aislogo"></use> |
||||
|
</svg> |
||||
|
<div class="name">aislogo</div> |
||||
|
<div class="fontclass">#icon-aislogo</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-qiao"></use> |
||||
|
</svg> |
||||
|
<div class="name">桥</div> |
||||
|
<div class="fontclass">#icon-qiao</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-tashiqizhongji"></use> |
||||
|
</svg> |
||||
|
<div class="name">塔式起重机</div> |
||||
|
<div class="fontclass">#icon-tashiqizhongji</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-dwggeshi"></use> |
||||
|
</svg> |
||||
|
<div class="name">dwg格式</div> |
||||
|
<div class="fontclass">#icon-dwggeshi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-luyouqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">路由器</div> |
||||
|
<div class="fontclass">#icon-luyouqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-anzhuangshigong-xianxing"></use> |
||||
|
</svg> |
||||
|
<div class="name">244安装、施工-线性</div> |
||||
|
<div class="fontclass">#icon-anzhuangshigong-xianxing</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shaixuanguolv"></use> |
||||
|
</svg> |
||||
|
<div class="name">245筛选过滤</div> |
||||
|
<div class="fontclass">#icon-shaixuanguolv</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-anzhuangshigong"></use> |
||||
|
</svg> |
||||
|
<div class="name">244安装、施工</div> |
||||
|
<div class="fontclass">#icon-anzhuangshigong</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-tiaoxingtu-xianxing"></use> |
||||
|
</svg> |
||||
|
<div class="name">408条形图-线性</div> |
||||
|
<div class="fontclass">#icon-tiaoxingtu-xianxing</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-zhexiantu-xianxing"></use> |
||||
|
</svg> |
||||
|
<div class="name">409折线图-线性</div> |
||||
|
<div class="fontclass">#icon-zhexiantu-xianxing</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-tieta"></use> |
||||
|
</svg> |
||||
|
<div class="name">铁塔</div> |
||||
|
<div class="fontclass">#icon-tieta</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_wendangtxt"></use> |
||||
|
</svg> |
||||
|
<div class="name">800格式_文档txt</div> |
||||
|
<div class="fontclass">#icon-geshi_wendangtxt</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_wendangdoc"></use> |
||||
|
</svg> |
||||
|
<div class="name">801格式_文档doc</div> |
||||
|
<div class="fontclass">#icon-geshi_wendangdoc</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_wendangpdf"></use> |
||||
|
</svg> |
||||
|
<div class="name">807格式_文档pdf</div> |
||||
|
<div class="fontclass">#icon-geshi_wendangpdf</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_wendangxls"></use> |
||||
|
</svg> |
||||
|
<div class="name">803格式_文档xls</div> |
||||
|
<div class="fontclass">#icon-geshi_wendangxls</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_tongyongwendang"></use> |
||||
|
</svg> |
||||
|
<div class="name">819格式_通用文档</div> |
||||
|
<div class="fontclass">#icon-geshi_tongyongwendang</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_shipinmp"></use> |
||||
|
</svg> |
||||
|
<div class="name">840格式_视频mp4</div> |
||||
|
<div class="fontclass">#icon-geshi_shipinmp</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_tupianjpg"></use> |
||||
|
</svg> |
||||
|
<div class="name">860格式_图片jpg</div> |
||||
|
<div class="fontclass">#icon-geshi_tupianjpg</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-geshi_tupianpng"></use> |
||||
|
</svg> |
||||
|
<div class="name">865格式_图片png</div> |
||||
|
<div class="fontclass">#icon-geshi_tupianpng</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-guangzhaochuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">光照传感器</div> |
||||
|
<div class="fontclass">#icon-guangzhaochuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-building"></use> |
||||
|
</svg> |
||||
|
<div class="name">建筑</div> |
||||
|
<div class="fontclass">#icon-building</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-yanwuchuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">烟雾传感器</div> |
||||
|
<div class="fontclass">#icon-yanwuchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shizheng"></use> |
||||
|
</svg> |
||||
|
<div class="name">市政</div> |
||||
|
<div class="fontclass">#icon-shizheng</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-chuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">传感器</div> |
||||
|
<div class="fontclass">#icon-chuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-WSD"></use> |
||||
|
</svg> |
||||
|
<div class="name">温湿度传感器</div> |
||||
|
<div class="fontclass">#icon-WSD</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-yalichuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">压力传感器</div> |
||||
|
<div class="fontclass">#icon-yalichuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-yinglichuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">应力传感器</div> |
||||
|
<div class="fontclass">#icon-yinglichuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-chenjiangchuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">沉降传感器</div> |
||||
|
<div class="fontclass">#icon-chenjiangchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-yalichuanganqi1"></use> |
||||
|
</svg> |
||||
|
<div class="name">压力传感器</div> |
||||
|
<div class="fontclass">#icon-yalichuanganqi1</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-YWC"></use> |
||||
|
</svg> |
||||
|
<div class="name">液位传感器</div> |
||||
|
<div class="fontclass">#icon-YWC</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-computer"></use> |
||||
|
</svg> |
||||
|
<div class="name">computer</div> |
||||
|
<div class="fontclass">#icon-computer</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-empty"></use> |
||||
|
</svg> |
||||
|
<div class="name">empty</div> |
||||
|
<div class="fontclass">#icon-empty</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-offline"></use> |
||||
|
</svg> |
||||
|
<div class="name">offline</div> |
||||
|
<div class="fontclass">#icon-offline</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-daba"></use> |
||||
|
</svg> |
||||
|
<div class="name">大坝</div> |
||||
|
<div class="fontclass">#icon-daba</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shenbuweiyi"></use> |
||||
|
</svg> |
||||
|
<div class="name">深部位移</div> |
||||
|
<div class="fontclass">#icon-shenbuweiyi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-maosuochuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">锚索传感器</div> |
||||
|
<div class="fontclass">#icon-maosuochuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-yuliangchuanganqi"></use> |
||||
|
</svg> |
||||
|
<div class="name">雨量传感器</div> |
||||
|
<div class="fontclass">#icon-yuliangchuanganqi</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-weiyiji"></use> |
||||
|
</svg> |
||||
|
<div class="name">位移计</div> |
||||
|
<div class="fontclass">#icon-weiyiji</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-qixiangzhan_"></use> |
||||
|
</svg> |
||||
|
<div class="name">气象站_1</div> |
||||
|
<div class="fontclass">#icon-qixiangzhan_</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<svg class="icon" aria-hidden="true"> |
||||
|
<use xlink:href="#icon-shenjikeng"></use> |
||||
|
</svg> |
||||
|
<div class="name">深基坑</div> |
||||
|
<div class="fontclass">#icon-shenjikeng</div> |
||||
|
</li> |
||||
|
|
||||
|
</ul> |
||||
|
|
||||
|
|
||||
|
<h2 id="symbol-">symbol引用</h2> |
||||
|
<hr> |
||||
|
|
||||
|
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a> |
||||
|
这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:</p> |
||||
|
<ul> |
||||
|
<li>支持多色图标了,不再受单色限制。</li> |
||||
|
<li>通过一些技巧,支持像字体那样,通过<code>font-size</code>,<code>color</code>来调整样式。</li> |
||||
|
<li>兼容性较差,支持 ie9+,及现代浏览器。</li> |
||||
|
<li>浏览器渲染svg的性能一般,还不如png。</li> |
||||
|
</ul> |
||||
|
<p>使用步骤如下:</p> |
||||
|
<h3 id="-symbol-">第一步:引入项目下面生成的symbol代码:</h3> |
||||
|
<pre><code class="lang-js hljs javascript"><span class="hljs-comment"><script src="./iconfont.js"></script></span></code></pre> |
||||
|
<h3 id="-css-">第二步:加入通用css代码(引入一次就行):</h3> |
||||
|
<pre><code class="lang-js hljs javascript"><style type=<span class="hljs-string">"text/css"</span>> |
||||
|
.icon { |
||||
|
width: <span class="hljs-number">1</span>em; height: <span class="hljs-number">1</span>em; |
||||
|
vertical-align: <span class="hljs-number">-0.15</span>em; |
||||
|
fill: currentColor; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
<<span class="hljs-regexp">/style></span></code></pre> |
||||
|
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3> |
||||
|
<pre><code class="lang-js hljs javascript"><svg <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"icon"</span> aria-hidden=<span class="hljs-string">"true"</span>><span class="xml"><span class="hljs-tag"> |
||||
|
<<span class="hljs-name">use</span> <span class="hljs-attr">xlink:href</span>=<span class="hljs-string">"#icon-xxx"</span>></span><span class="hljs-tag"></<span class="hljs-name">use</span>></span> |
||||
|
</span><<span class="hljs-regexp">/svg> |
||||
|
</span></code></pre> |
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,552 @@ |
|||||
|
|
||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8"/> |
||||
|
<title>IconFont</title> |
||||
|
<link rel="stylesheet" href="demo.css"> |
||||
|
|
||||
|
<style type="text/css"> |
||||
|
|
||||
|
@font-face {font-family: "sc"; |
||||
|
src: url('iconfont.eot'); /* IE9*/ |
||||
|
src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */ |
||||
|
url('iconfont.woff') format('woff'), /* chrome, firefox */ |
||||
|
url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ |
||||
|
url('iconfont.svg#sc') format('svg'); /* iOS 4.1- */ |
||||
|
} |
||||
|
|
||||
|
.sc { |
||||
|
font-family:"sc" !important; |
||||
|
font-size:16px; |
||||
|
font-style:normal; |
||||
|
-webkit-font-smoothing: antialiased; |
||||
|
-webkit-text-stroke-width: 0.2px; |
||||
|
-moz-osx-font-smoothing: grayscale; |
||||
|
} |
||||
|
|
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div class="main markdown"> |
||||
|
<h1>IconFont 图标</h1> |
||||
|
<ul class="icon_lists clear"> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">流量</div> |
||||
|
<div class="code">&#xe602;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">轻轨</div> |
||||
|
<div class="code">&#xe66f;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">风速3</div> |
||||
|
<div class="code">&#xe635;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">calendar</div> |
||||
|
<div class="code">&#xe74a;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">box</div> |
||||
|
<div class="code">&#xe6cb;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">审核失败</div> |
||||
|
<div class="code">&#xe61d;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">边坡</div> |
||||
|
<div class="code">&#xe676;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">公路</div> |
||||
|
<div class="code">&#xe607;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">GNSS采点</div> |
||||
|
<div class="code">&#xe825;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">传感器设备</div> |
||||
|
<div class="code">&#xe612;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">电流传感器</div> |
||||
|
<div class="code">&#xe62c;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">电压传感器</div> |
||||
|
<div class="code">&#xe62f;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">温度传感器</div> |
||||
|
<div class="code">&#xe637;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">新建</div> |
||||
|
<div class="code">&#xe61f;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">涵洞</div> |
||||
|
<div class="code">&#xe89b;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">管网工程</div> |
||||
|
<div class="code">&#xe646;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">审核</div> |
||||
|
<div class="code">&#xe639;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">智慧城市</div> |
||||
|
<div class="code">&#xe600;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">边坡位移</div> |
||||
|
<div class="code">&#xe60a;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">建筑</div> |
||||
|
<div class="code">&#xe65f;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">储罐</div> |
||||
|
<div class="code">&#xe636;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">隧道</div> |
||||
|
<div class="code">&#xe61e;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">data</div> |
||||
|
<div class="code">&#xe757;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">矿山开采</div> |
||||
|
<div class="code">&#xe608;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">网络</div> |
||||
|
<div class="code">&#xe617;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">监控</div> |
||||
|
<div class="code">&#xe619;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">大数据</div> |
||||
|
<div class="code">&#xe61a;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">数据库</div> |
||||
|
<div class="code">&#xe61b;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">审核成功</div> |
||||
|
<div class="code">&#xe627;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">监控</div> |
||||
|
<div class="code">&#xe620;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">网络系统</div> |
||||
|
<div class="code">&#xe62e;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">定位</div> |
||||
|
<div class="code">&#xe630;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">系统运转情况</div> |
||||
|
<div class="code">&#xe631;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">查看</div> |
||||
|
<div class="code">&#xe63e;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">链接</div> |
||||
|
<div class="code">&#xe63f;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">数据导出-01</div> |
||||
|
<div class="code">&#xe640;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">系统状态</div> |
||||
|
<div class="code">&#xe642;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">消费明细单</div> |
||||
|
<div class="code">&#xe643;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">SQL审核</div> |
||||
|
<div class="code">&#xe645;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">aislogo</div> |
||||
|
<div class="code">&#xe648;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">桥</div> |
||||
|
<div class="code">&#xe715;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">塔式起重机</div> |
||||
|
<div class="code">&#xe615;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">dwg格式</div> |
||||
|
<div class="code">&#xe82b;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">路由器</div> |
||||
|
<div class="code">&#xe603;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">244安装、施工-线性</div> |
||||
|
<div class="code">&#xe8d6;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">245筛选过滤</div> |
||||
|
<div class="code">&#xe8d7;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">244安装、施工</div> |
||||
|
<div class="code">&#xe8d8;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">408条形图-线性</div> |
||||
|
<div class="code">&#xe904;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">409折线图-线性</div> |
||||
|
<div class="code">&#xe906;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">铁塔</div> |
||||
|
<div class="code">&#xe605;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">800格式_文档txt</div> |
||||
|
<div class="code">&#xe6b8;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">801格式_文档doc</div> |
||||
|
<div class="code">&#xe6b9;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">807格式_文档pdf</div> |
||||
|
<div class="code">&#xe6bc;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">803格式_文档xls</div> |
||||
|
<div class="code">&#xe6be;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">819格式_通用文档</div> |
||||
|
<div class="code">&#xe6c0;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">840格式_视频mp4</div> |
||||
|
<div class="code">&#xe6c8;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">860格式_图片jpg</div> |
||||
|
<div class="code">&#xe6cc;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">865格式_图片png</div> |
||||
|
<div class="code">&#xe6ce;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">光照传感器</div> |
||||
|
<div class="code">&#xe638;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">建筑</div> |
||||
|
<div class="code">&#xe61c;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">烟雾传感器</div> |
||||
|
<div class="code">&#xe610;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">市政</div> |
||||
|
<div class="code">&#xe6ca;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">传感器</div> |
||||
|
<div class="code">&#xe60f;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">温湿度传感器</div> |
||||
|
<div class="code">&#xe697;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">压力传感器</div> |
||||
|
<div class="code">&#xe60e;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">应力传感器</div> |
||||
|
<div class="code">&#xe611;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">沉降传感器</div> |
||||
|
<div class="code">&#xe601;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">压力传感器</div> |
||||
|
<div class="code">&#xe606;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">液位传感器</div> |
||||
|
<div class="code">&#xe699;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">computer</div> |
||||
|
<div class="code">&#xe6eb;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">empty</div> |
||||
|
<div class="code">&#xe6f7;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">offline</div> |
||||
|
<div class="code">&#xe712;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">大坝</div> |
||||
|
<div class="code">&#xe632;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">深部位移</div> |
||||
|
<div class="code">&#xe613;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">锚索传感器</div> |
||||
|
<div class="code">&#xe614;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">雨量传感器</div> |
||||
|
<div class="code">&#xe616;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">位移计</div> |
||||
|
<div class="code">&#xe618;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">气象站_1</div> |
||||
|
<div class="code">&#xe60d;</div> |
||||
|
</li> |
||||
|
|
||||
|
<li> |
||||
|
<i class="icon sc"></i> |
||||
|
<div class="name">深基坑</div> |
||||
|
<div class="code">&#xe62a;</div> |
||||
|
</li> |
||||
|
|
||||
|
</ul> |
||||
|
<h2 id="unicode-">unicode引用</h2> |
||||
|
<hr> |
||||
|
|
||||
|
<p>unicode是字体在网页端最原始的应用方式,特点是:</p> |
||||
|
<ul> |
||||
|
<li>兼容性最好,支持ie6+,及所有现代浏览器。</li> |
||||
|
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li> |
||||
|
<li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li> |
||||
|
</ul> |
||||
|
<blockquote> |
||||
|
<p>注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式</p> |
||||
|
</blockquote> |
||||
|
<p>unicode使用步骤如下:</p> |
||||
|
<h3 id="-font-face">第一步:拷贝项目下面生成的font-face</h3> |
||||
|
<pre><code class="lang-js hljs javascript">@font-face { |
||||
|
font-family: <span class="hljs-string">'sc'</span>; |
||||
|
src: url(<span class="hljs-string">'iconfont.eot'</span>); |
||||
|
src: url(<span class="hljs-string">'iconfont.eot?#iefix'</span>) format(<span class="hljs-string">'embedded-opentype'</span>), |
||||
|
url(<span class="hljs-string">'iconfont.woff'</span>) format(<span class="hljs-string">'woff'</span>), |
||||
|
url(<span class="hljs-string">'iconfont.ttf'</span>) format(<span class="hljs-string">'truetype'</span>), |
||||
|
url(<span class="hljs-string">'iconfont.svg#sc'</span>) format(<span class="hljs-string">'svg'</span>); |
||||
|
} |
||||
|
</code></pre> |
||||
|
<h3 id="-iconfont-">第二步:定义使用iconfont的样式</h3> |
||||
|
<pre><code class="lang-js hljs javascript">.sc{ |
||||
|
font-family:<span class="hljs-string">"sc"</span> !important; |
||||
|
font-size:<span class="hljs-number">16</span>px;font-style:normal; |
||||
|
-webkit-font-smoothing: antialiased; |
||||
|
-webkit-text-stroke-width: <span class="hljs-number">0.2</span>px; |
||||
|
-moz-osx-font-smoothing: grayscale; |
||||
|
} |
||||
|
</code></pre> |
||||
|
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3> |
||||
|
<pre><code class="lang-js hljs javascript"><i <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"sc"</span>>&#x33;<span class="xml"><span class="hljs-tag"></<span class="hljs-name">i</span>></span></span></code></pre> |
||||
|
|
||||
|
<blockquote> |
||||
|
<p>"sc"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p> |
||||
|
</blockquote> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
</body> |
||||
|
</html> |
After Width: | Height: | Size: 148 KiB |
@ -0,0 +1,521 @@ |
|||||
|
|
||||
|
@font-face {font-family: "anticon"; |
||||
|
src: url('iconfont.eot?t=1494480257283'); /* IE9*/ |
||||
|
src: url('iconfont.eot?t=1494480257283#iefix') format('embedded-opentype'), /* IE6-IE8 */ |
||||
|
url('iconfont.woff?t=1494480257283') format('woff'), /* chrome, firefox */ |
||||
|
url('iconfont.ttf?t=1494480257283') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ |
||||
|
url('iconfont.svg?t=1494480257283#anticon') format('svg'); /* iOS 4.1- */ |
||||
|
} |
||||
|
|
||||
|
.anticon { |
||||
|
font-family:"anticon" !important; |
||||
|
font-size:16px; |
||||
|
font-style:normal; |
||||
|
-webkit-font-smoothing: antialiased; |
||||
|
-moz-osx-font-smoothing: grayscale; |
||||
|
} |
||||
|
|
||||
|
.icon-stepforward:before { content: "\e600"; } |
||||
|
|
||||
|
.icon-stepbackward:before { content: "\e601"; } |
||||
|
|
||||
|
.icon-forward:before { content: "\e602"; } |
||||
|
|
||||
|
.icon-banckward:before { content: "\e603"; } |
||||
|
|
||||
|
.icon-caretright:before { content: "\e604"; } |
||||
|
|
||||
|
.icon-caretleft:before { content: "\e605"; } |
||||
|
|
||||
|
.icon-caretdown:before { content: "\e606"; } |
||||
|
|
||||
|
.icon-caretup:before { content: "\e607"; } |
||||
|
|
||||
|
.icon-rightcircle:before { content: "\e608"; } |
||||
|
|
||||
|
.icon-leftcircle:before { content: "\e609"; } |
||||
|
|
||||
|
.icon-upcircle:before { content: "\e60a"; } |
||||
|
|
||||
|
.icon-downcircle:before { content: "\e60b"; } |
||||
|
|
||||
|
.icon-rightcircleo:before { content: "\e60c"; } |
||||
|
|
||||
|
.icon-leftcircleo:before { content: "\e60d"; } |
||||
|
|
||||
|
.icon-upcircleo:before { content: "\e60e"; } |
||||
|
|
||||
|
.icon-downcircleo:before { content: "\e60f"; } |
||||
|
|
||||
|
.icon-verticleleft:before { content: "\e610"; } |
||||
|
|
||||
|
.icon-verticleright:before { content: "\e611"; } |
||||
|
|
||||
|
.icon-rollback:before { content: "\e612"; } |
||||
|
|
||||
|
.icon-retweet:before { content: "\e613"; } |
||||
|
|
||||
|
.icon-shrink:before { content: "\e614"; } |
||||
|
|
||||
|
.icon-arrowsalt:before { content: "\e615"; } |
||||
|
|
||||
|
.icon-doubleright:before { content: "\e617"; } |
||||
|
|
||||
|
.icon-doubleleft:before { content: "\e618"; } |
||||
|
|
||||
|
.icon-arrowdown:before { content: "\e619"; } |
||||
|
|
||||
|
.icon-arrowup:before { content: "\e61a"; } |
||||
|
|
||||
|
.icon-arrowright:before { content: "\e61b"; } |
||||
|
|
||||
|
.icon-arrowleft:before { content: "\e61c"; } |
||||
|
|
||||
|
.icon-down:before { content: "\e61d"; } |
||||
|
|
||||
|
.icon-up:before { content: "\e61e"; } |
||||
|
|
||||
|
.icon-right:before { content: "\e61f"; } |
||||
|
|
||||
|
.icon-left:before { content: "\e620"; } |
||||
|
|
||||
|
.icon-minussquareo:before { content: "\e621"; } |
||||
|
|
||||
|
.icon-minuscircle:before { content: "\e622"; } |
||||
|
|
||||
|
.icon-minuscircleo:before { content: "\e623"; } |
||||
|
|
||||
|
.icon-minus:before { content: "\e624"; } |
||||
|
|
||||
|
.icon-pluscircleo:before { content: "\e625"; } |
||||
|
|
||||
|
.icon-pluscircle:before { content: "\e626"; } |
||||
|
|
||||
|
.icon-plus:before { content: "\e627"; } |
||||
|
|
||||
|
.icon-infocirlce:before { content: "\e628"; } |
||||
|
|
||||
|
.icon-infocirlceo:before { content: "\e629"; } |
||||
|
|
||||
|
.icon-info:before { content: "\e62a"; } |
||||
|
|
||||
|
.icon-exclamation:before { content: "\e62b"; } |
||||
|
|
||||
|
.icon-exclamationcircle:before { content: "\e62c"; } |
||||
|
|
||||
|
.icon-exclamationcircleo:before { content: "\e62d"; } |
||||
|
|
||||
|
.icon-closecircle:before { content: "\e62e"; } |
||||
|
|
||||
|
.icon-closecircleo:before { content: "\e62f"; } |
||||
|
|
||||
|
.icon-checkcircle:before { content: "\e630"; } |
||||
|
|
||||
|
.icon-checkcircleo:before { content: "\e631"; } |
||||
|
|
||||
|
.icon-check:before { content: "\e632"; } |
||||
|
|
||||
|
.icon-close:before { content: "\e633"; } |
||||
|
|
||||
|
.icon-customerservice:before { content: "\e634"; } |
||||
|
|
||||
|
.icon-creditcard:before { content: "\e635"; } |
||||
|
|
||||
|
.icon-codesquareo:before { content: "\e636"; } |
||||
|
|
||||
|
.icon-book:before { content: "\e637"; } |
||||
|
|
||||
|
.icon-barschart:before { content: "\e638"; } |
||||
|
|
||||
|
.icon-bars:before { content: "\e639"; } |
||||
|
|
||||
|
.icon-question:before { content: "\e63a"; } |
||||
|
|
||||
|
.icon-questioncircle:before { content: "\e63b"; } |
||||
|
|
||||
|
.icon-questioncircleo:before { content: "\e63c"; } |
||||
|
|
||||
|
.icon-pause:before { content: "\e63d"; } |
||||
|
|
||||
|
.icon-pausecircle:before { content: "\e63e"; } |
||||
|
|
||||
|
.icon-pausecircleo:before { content: "\e63f"; } |
||||
|
|
||||
|
.icon-clockcircle:before { content: "\e640"; } |
||||
|
|
||||
|
.icon-clockcircleo:before { content: "\e641"; } |
||||
|
|
||||
|
.icon-swap:before { content: "\e642"; } |
||||
|
|
||||
|
.icon-swapleft:before { content: "\e643"; } |
||||
|
|
||||
|
.icon-swapright:before { content: "\e644"; } |
||||
|
|
||||
|
.icon-plussquareo:before { content: "\e645"; } |
||||
|
|
||||
|
.icon-frown:before { content: "\e646"; } |
||||
|
|
||||
|
.icon-menufold:before { content: "\e658"; } |
||||
|
|
||||
|
.icon-mail:before { content: "\e659"; } |
||||
|
|
||||
|
.icon-link:before { content: "\e65b"; } |
||||
|
|
||||
|
.icon-areachart:before { content: "\e65c"; } |
||||
|
|
||||
|
.icon-linechart:before { content: "\e65d"; } |
||||
|
|
||||
|
.icon-home:before { content: "\e65e"; } |
||||
|
|
||||
|
.icon-laptop:before { content: "\e65f"; } |
||||
|
|
||||
|
.icon-star:before { content: "\e660"; } |
||||
|
|
||||
|
.icon-staro:before { content: "\e661"; } |
||||
|
|
||||
|
.icon-filter:before { content: "\e663"; } |
||||
|
|
||||
|
.icon-meho:before { content: "\e666"; } |
||||
|
|
||||
|
.icon-meh:before { content: "\e667"; } |
||||
|
|
||||
|
.icon-shoppingcart:before { content: "\e668"; } |
||||
|
|
||||
|
.icon-save:before { content: "\e669"; } |
||||
|
|
||||
|
.icon-user:before { content: "\e66a"; } |
||||
|
|
||||
|
.icon-videocamera:before { content: "\e66b"; } |
||||
|
|
||||
|
.icon-totop:before { content: "\e66c"; } |
||||
|
|
||||
|
.icon-team:before { content: "\e66d"; } |
||||
|
|
||||
|
.icon-sharealt:before { content: "\e671"; } |
||||
|
|
||||
|
.icon-setting:before { content: "\e672"; } |
||||
|
|
||||
|
.icon-picture:before { content: "\e674"; } |
||||
|
|
||||
|
.icon-phone:before { content: "\e675"; } |
||||
|
|
||||
|
.icon-paperclip:before { content: "\e676"; } |
||||
|
|
||||
|
.icon-notification:before { content: "\e677"; } |
||||
|
|
||||
|
.icon-menuunfold:before { content: "\e679"; } |
||||
|
|
||||
|
.icon-inbox:before { content: "\e67a"; } |
||||
|
|
||||
|
.icon-lock:before { content: "\e67b"; } |
||||
|
|
||||
|
.icon-qrcode:before { content: "\e67c"; } |
||||
|
|
||||
|
.icon-tags:before { content: "\e67d"; } |
||||
|
|
||||
|
.icon-tagso:before { content: "\e67e"; } |
||||
|
|
||||
|
.icon-cloudo:before { content: "\e67f"; } |
||||
|
|
||||
|
.icon-cloud:before { content: "\e680"; } |
||||
|
|
||||
|
.icon-cloudupload:before { content: "\e681"; } |
||||
|
|
||||
|
.icon-clouddownload:before { content: "\e682"; } |
||||
|
|
||||
|
.icon-clouddownloado:before { content: "\e683"; } |
||||
|
|
||||
|
.icon-clouduploado:before { content: "\e684"; } |
||||
|
|
||||
|
.icon-enviroment:before { content: "\e685"; } |
||||
|
|
||||
|
.icon-enviromento:before { content: "\e686"; } |
||||
|
|
||||
|
.icon-eye:before { content: "\e687"; } |
||||
|
|
||||
|
.icon-eyeo:before { content: "\e688"; } |
||||
|
|
||||
|
.icon-camera:before { content: "\e689"; } |
||||
|
|
||||
|
.icon-camerao:before { content: "\e68a"; } |
||||
|
|
||||
|
.icon-windows:before { content: "\e68b"; } |
||||
|
|
||||
|
.icon-export2:before { content: "\e690"; } |
||||
|
|
||||
|
.icon-export:before { content: "\e691"; } |
||||
|
|
||||
|
.icon-circledowno:before { content: "\e693"; } |
||||
|
|
||||
|
.icon-circledown:before { content: "\e694"; } |
||||
|
|
||||
|
.icon-hdd:before { content: "\e69a"; } |
||||
|
|
||||
|
.icon-ie:before { content: "\e69b"; } |
||||
|
|
||||
|
.icon-delete:before { content: "\e69f"; } |
||||
|
|
||||
|
.icon-enter:before { content: "\e6a0"; } |
||||
|
|
||||
|
.icon-pushpino:before { content: "\e6a1"; } |
||||
|
|
||||
|
.icon-pushpin:before { content: "\e6a2"; } |
||||
|
|
||||
|
.icon-heart:before { content: "\e6a3"; } |
||||
|
|
||||
|
.icon-hearto:before { content: "\e6a4"; } |
||||
|
|
||||
|
.icon-smile-circle:before { content: "\e6a7"; } |
||||
|
|
||||
|
.icon-smileo:before { content: "\e6a8"; } |
||||
|
|
||||
|
.icon-frowno:before { content: "\e6a9"; } |
||||
|
|
||||
|
.icon-calculator:before { content: "\e6aa"; } |
||||
|
|
||||
|
.icon-chrome:before { content: "\e6ac"; } |
||||
|
|
||||
|
.icon-github:before { content: "\e6ad"; } |
||||
|
|
||||
|
.icon-iconfontdesktop:before { content: "\e6b4"; } |
||||
|
|
||||
|
.icon-caretcircleoup:before { content: "\e6b5"; } |
||||
|
|
||||
|
.icon-upload:before { content: "\e6b6"; } |
||||
|
|
||||
|
.icon-download:before { content: "\e6b7"; } |
||||
|
|
||||
|
.icon-piechart:before { content: "\e6b8"; } |
||||
|
|
||||
|
.icon-lock1:before { content: "\e6b9"; } |
||||
|
|
||||
|
.icon-unlock:before { content: "\e6ba"; } |
||||
|
|
||||
|
.icon-windowso:before { content: "\e6bc"; } |
||||
|
|
||||
|
.icon-dotchart:before { content: "\e6bd"; } |
||||
|
|
||||
|
.icon-barchart:before { content: "\e6be"; } |
||||
|
|
||||
|
.icon-codesquare:before { content: "\e6bf"; } |
||||
|
|
||||
|
.icon-plussquare:before { content: "\e6c0"; } |
||||
|
|
||||
|
.icon-minussquare:before { content: "\e6c1"; } |
||||
|
|
||||
|
.icon-closesquare:before { content: "\e6c2"; } |
||||
|
|
||||
|
.icon-closesquareo:before { content: "\e6c3"; } |
||||
|
|
||||
|
.icon-checksquare:before { content: "\e6c4"; } |
||||
|
|
||||
|
.icon-checksquareo:before { content: "\e6c5"; } |
||||
|
|
||||
|
.icon-fastbackward:before { content: "\e6c6"; } |
||||
|
|
||||
|
.icon-fastforward:before { content: "\e6c7"; } |
||||
|
|
||||
|
.icon-upsquare:before { content: "\e6c8"; } |
||||
|
|
||||
|
.icon-downsquare:before { content: "\e6c9"; } |
||||
|
|
||||
|
.icon-leftsquare:before { content: "\e6ca"; } |
||||
|
|
||||
|
.icon-rightsquare:before { content: "\e6cb"; } |
||||
|
|
||||
|
.icon-rightsquareo:before { content: "\e6cc"; } |
||||
|
|
||||
|
.icon-leftsquareo:before { content: "\e6cd"; } |
||||
|
|
||||
|
.icon-down-square-o:before { content: "\e6ce"; } |
||||
|
|
||||
|
.icon-up-square-o:before { content: "\e6cf"; } |
||||
|
|
||||
|
.icon-play:before { content: "\e6d0"; } |
||||
|
|
||||
|
.icon-playcircleo:before { content: "\e6d1"; } |
||||
|
|
||||
|
.icon-tag:before { content: "\e6d2"; } |
||||
|
|
||||
|
.icon-tago:before { content: "\e6d3"; } |
||||
|
|
||||
|
.icon-addfile:before { content: "\e910"; } |
||||
|
|
||||
|
.icon-folder1:before { content: "\e662"; } |
||||
|
|
||||
|
.icon-file1:before { content: "\e664"; } |
||||
|
|
||||
|
.icon-switcher:before { content: "\e913"; } |
||||
|
|
||||
|
.icon-addfolder:before { content: "\e914"; } |
||||
|
|
||||
|
.icon-folderopen:before { content: "\e699"; } |
||||
|
|
||||
|
.icon-search1:before { content: "\e670"; } |
||||
|
|
||||
|
.icon-ellipsis1:before { content: "\e647"; } |
||||
|
|
||||
|
.icon-calendar:before { content: "\e6bb"; } |
||||
|
|
||||
|
.icon-filetext1:before { content: "\e698"; } |
||||
|
|
||||
|
.icon-copy1:before { content: "\e648"; } |
||||
|
|
||||
|
.icon-jpgfile1:before { content: "\e69c"; } |
||||
|
|
||||
|
.icon-pdffile1:before { content: "\e6b3"; } |
||||
|
|
||||
|
.icon-exclefile1:before { content: "\e6b0"; } |
||||
|
|
||||
|
.icon-pptfile1:before { content: "\e6b1"; } |
||||
|
|
||||
|
.icon-unknowfile1:before { content: "\e6af"; } |
||||
|
|
||||
|
.icon-wordfile1:before { content: "\e6b2"; } |
||||
|
|
||||
|
.icon-dingding:before { content: "\e923"; } |
||||
|
|
||||
|
.icon-dingding-o:before { content: "\e925"; } |
||||
|
|
||||
|
.icon-mobile1:before { content: "\e678"; } |
||||
|
|
||||
|
.icon-tablet1:before { content: "\e66e"; } |
||||
|
|
||||
|
.icon-bells:before { content: "\e64e"; } |
||||
|
|
||||
|
.icon-disconnect:before { content: "\e64f"; } |
||||
|
|
||||
|
.icon-database:before { content: "\e650"; } |
||||
|
|
||||
|
.icon-barcode:before { content: "\e652"; } |
||||
|
|
||||
|
.icon-hourglass:before { content: "\e653"; } |
||||
|
|
||||
|
.icon-key:before { content: "\e654"; } |
||||
|
|
||||
|
.icon-flag:before { content: "\e655"; } |
||||
|
|
||||
|
.icon-layout:before { content: "\e656"; } |
||||
|
|
||||
|
.icon-printer:before { content: "\e673"; } |
||||
|
|
||||
|
.icon-USB:before { content: "\e6d7"; } |
||||
|
|
||||
|
.icon-skin:before { content: "\e6d8"; } |
||||
|
|
||||
|
.icon-tool:before { content: "\e6d9"; } |
||||
|
|
||||
|
.icon-car:before { content: "\e6dc"; } |
||||
|
|
||||
|
.icon-addusergroup:before { content: "\e6dd"; } |
||||
|
|
||||
|
.icon-carryout:before { content: "\e6df"; } |
||||
|
|
||||
|
.icon-deleteuser:before { content: "\e6e0"; } |
||||
|
|
||||
|
.icon-deleteusergroup:before { content: "\e6e1"; } |
||||
|
|
||||
|
.icon-man:before { content: "\e6e2"; } |
||||
|
|
||||
|
.icon-isv:before { content: "\e6e3"; } |
||||
|
|
||||
|
.icon-gift:before { content: "\e6e4"; } |
||||
|
|
||||
|
.icon-idcard:before { content: "\e6e5"; } |
||||
|
|
||||
|
.icon-medicinebox:before { content: "\e6e6"; } |
||||
|
|
||||
|
.icon-redenvelopes:before { content: "\e6e7"; } |
||||
|
|
||||
|
.icon-rest:before { content: "\e6e8"; } |
||||
|
|
||||
|
.icon-Safety:before { content: "\e6ea"; } |
||||
|
|
||||
|
.icon-wallet:before { content: "\e6eb"; } |
||||
|
|
||||
|
.icon-woman:before { content: "\e6ec"; } |
||||
|
|
||||
|
.icon-adduser:before { content: "\e6ed"; } |
||||
|
|
||||
|
.icon-bank:before { content: "\e6ee"; } |
||||
|
|
||||
|
.icon-Trophy:before { content: "\e6ef"; } |
||||
|
|
||||
|
.icon-loading1:before { content: "\e6ae"; } |
||||
|
|
||||
|
.icon-loading2:before { content: "\e64d"; } |
||||
|
|
||||
|
.icon-like2:before { content: "\e69d"; } |
||||
|
|
||||
|
.icon-dislike2:before { content: "\e69e"; } |
||||
|
|
||||
|
.icon-like1:before { content: "\e64c"; } |
||||
|
|
||||
|
.icon-dislike1:before { content: "\e64b"; } |
||||
|
|
||||
|
.icon-bulb1:before { content: "\e649"; } |
||||
|
|
||||
|
.icon-rocket1:before { content: "\e90f"; } |
||||
|
|
||||
|
.icon-select1:before { content: "\e64a"; } |
||||
|
|
||||
|
.icon-apple1:before { content: "\e68c"; } |
||||
|
|
||||
|
.icon-apple-o:before { content: "\e6d4"; } |
||||
|
|
||||
|
.icon-android1:before { content: "\e938"; } |
||||
|
|
||||
|
.icon-android:before { content: "\e68d"; } |
||||
|
|
||||
|
.icon-aliwangwang-o1:before { content: "\e68f"; } |
||||
|
|
||||
|
.icon-aliwangwang:before { content: "\e68e"; } |
||||
|
|
||||
|
.icon-pay-circle1:before { content: "\e6a5"; } |
||||
|
|
||||
|
.icon-pay-circle-o1:before { content: "\e6a6"; } |
||||
|
|
||||
|
.icon-poweroff:before { content: "\e6d5"; } |
||||
|
|
||||
|
.icon-trademark:before { content: "\e651"; } |
||||
|
|
||||
|
.icon-find:before { content: "\e6db"; } |
||||
|
|
||||
|
.icon-copyright:before { content: "\e6de"; } |
||||
|
|
||||
|
.icon-sound:before { content: "\e6e9"; } |
||||
|
|
||||
|
.icon-earth:before { content: "\e6f1"; } |
||||
|
|
||||
|
.icon-wifi:before { content: "\e6d6"; } |
||||
|
|
||||
|
.icon-sync:before { content: "\e6da"; } |
||||
|
|
||||
|
.icon-login:before { content: "\e657"; } |
||||
|
|
||||
|
.icon-logout:before { content: "\e65a"; } |
||||
|
|
||||
|
.icon-reload1:before { content: "\e616"; } |
||||
|
|
||||
|
.icon-message1:before { content: "\e6ab"; } |
||||
|
|
||||
|
.icon-shake:before { content: "\e94f"; } |
||||
|
|
||||
|
.icon-API:before { content: "\e951"; } |
||||
|
|
||||
|
.icon-appstore-o:before { content: "\e695"; } |
||||
|
|
||||
|
.icon-appstore1:before { content: "\e696"; } |
||||
|
|
||||
|
.icon-scan1:before { content: "\e697"; } |
||||
|
|
||||
|
.icon-exception1:before { content: "\e665"; } |
||||
|
|
||||
|
.icon-contacts:before { content: "\e6f0"; } |
||||
|
|
||||
|
.icon-solution1:before { content: "\e66f"; } |
||||
|
|
||||
|
.icon-fork:before { content: "\e6f2"; } |
||||
|
|
||||
|
.icon-edit1:before { content: "\e692"; } |
||||
|
|
After Width: | Height: | Size: 140 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 202 KiB |
After Width: | Height: | Size: 725 B |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 169 KiB |
After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 622 B |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 524 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 873 B |
After Width: | Height: | Size: 206 KiB |
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 950 B |
After Width: | Height: | Size: 873 B |
After Width: | Height: | Size: 815 B |
After Width: | Height: | Size: 193 B |
After Width: | Height: | Size: 147 B |
After Width: | Height: | Size: 999 B |
After Width: | Height: | Size: 648 B |
After Width: | Height: | Size: 932 B |
After Width: | Height: | Size: 646 KiB |
After Width: | Height: | Size: 8.3 KiB |
After Width: | Height: | Size: 2.9 MiB |
After Width: | Height: | Size: 200 KiB |
After Width: | Height: | Size: 7.8 KiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 577 B |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 917 B |
After Width: | Height: | Size: 992 B |
@ -0,0 +1,43 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<link rel="shortcut icon" href="/assets/images/logo.png"> |
||||
|
<link rel="stylesheet" type="text/css" href="/assets/font_sc/iconfont.css"> |
||||
|
<script type="text/javascript"> |
||||
|
window._AMapSecurityConfig = { |
||||
|
securityJsCode: 'e955cd5ddfc3a752aa27d1e1c67d182d', |
||||
|
} |
||||
|
</script> |
||||
|
<script |
||||
|
src="https://webapi.amap.com/maps?v=2.0&key=00f9a29dedcdbd8befec3dfe0cef5003&plugin=AMap.AutoComplete,AMap.PlaceSearch"></script> |
||||
|
<!-- <script src="https://webapi.amap.com/loca?v=2.0.0&key=00f9a29dedcdbd8befec3dfe0cef5003"></script> --> |
||||
|
</head> |
||||
|
<style> |
||||
|
@font-face { |
||||
|
font-family: YouSheBiaoTiHei; |
||||
|
src: url("/assets/font_sc/YouSheBiaoTiHei-2.ttf"); |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
font-family: PingFangSC-Medium; |
||||
|
src: url("/assets/font_sc/PingFang SC Medium.ttf"); |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
font-family: PingFangSC-Regular; |
||||
|
src: url("/assets/font_sc/PingFang SC Regular.ttf"); |
||||
|
} |
||||
|
|
||||
|
@font-face { |
||||
|
font-family: D-DINExp-Italic; |
||||
|
src: url("/assets/font_sc/D-DINExp-Italic.otf"); |
||||
|
} |
||||
|
</style> |
||||
|
<body style="background: transparent"> |
||||
|
<div id='App'></div> |
||||
|
|
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,50 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<title></title> |
||||
|
<link rel="shortcut icon" href="/assets/images/logo.svg"> |
||||
|
<link rel="stylesheet" type="text/css" href="/assets/font_sc/iconfont.css"> |
||||
|
<script type="text/javascript"> |
||||
|
window._AMapSecurityConfig = { |
||||
|
securityJsCode: 'e955cd5ddfc3a752aa27d1e1c67d182d', |
||||
|
} |
||||
|
</script> |
||||
|
<script |
||||
|
src="https://webapi.amap.com/maps?v=2.0&key=00f9a29dedcdbd8befec3dfe0cef5003&plugin=AMap.AutoComplete,AMap.PlaceSearch"></script> |
||||
|
<!-- <script src="https://webapi.amap.com/loca?v=2.0.0&key=00f9a29dedcdbd8befec3dfe0cef5003"></script> --> |
||||
|
</head> |
||||
|
<style> |
||||
|
@font-face { |
||||
|
font-family: YouSheBiaoTiHei; |
||||
|
src: url("/assets/font_sc/YouSheBiaoTiHei-2.ttf"); |
||||
|
} |
||||
|
@font-face { |
||||
|
font-family: PingFangSC-Medium; |
||||
|
src: url("/assets/font_sc/PingFang SC Medium.ttf"); |
||||
|
} |
||||
|
@font-face { |
||||
|
font-family: PingFangSC-Regular; |
||||
|
src: url("/assets/font_sc/PingFang SC Regular.ttf"); |
||||
|
} |
||||
|
@font-face { |
||||
|
font-family: D-DINExp-Italic; |
||||
|
src: url("/assets/font_sc/D-DINExp-Italic.otf"); |
||||
|
} |
||||
|
</style> |
||||
|
<body> |
||||
|
|
||||
|
<script> |
||||
|
window.less = { |
||||
|
async: false, |
||||
|
env: 'production' |
||||
|
}; |
||||
|
</script> |
||||
|
<div id='App'></div> |
||||
|
<script type="text/javascript" src="http://localhost:5801/client/build/vendor.js"></script> |
||||
|
<script type="text/javascript" src="http://localhost:5801/client/build/app.js"></script> |
||||
|
|
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,19 @@ |
|||||
|
/** |
||||
|
* User: liuxinyi/liu.xinyi@free-sun.com.cn |
||||
|
* Date: 2016/2/22 |
||||
|
* Time: 15:29 |
||||
|
* |
||||
|
*/ |
||||
|
'use strict'; |
||||
|
|
||||
|
const views = require('koa-view'); |
||||
|
const path = require('path'); |
||||
|
module.exports = { |
||||
|
entry: function (app, router, opt) { |
||||
|
app.use(views(__dirname)); |
||||
|
|
||||
|
router.get('(.*)', async function (ctx){ |
||||
|
await ctx.render(path.join(__dirname, './index')); |
||||
|
}); |
||||
|
} |
||||
|
}; |
@ -0,0 +1,32 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
import React, { useEffect } from 'react'; |
||||
|
import Layout from './layout'; |
||||
|
import Auth from './sections/auth'; |
||||
|
import Safetymanage from './sections/safetymanage'; |
||||
|
import ProjectRegime from './sections/projectRegime'; |
||||
|
import Organization from './sections/organization'; |
||||
|
import PatrolManage from './sections/patrolManage'; |
||||
|
import IssueHandle from './sections/issueHandle' |
||||
|
import Shouye from './sections/shouye'; |
||||
|
import DeviceManage from './sections/deviceManage'; |
||||
|
import ProjectBinding from './sections/projectBinding' |
||||
|
import AdvisoryNotice from './sections/advisoryNotice' |
||||
|
import { Func } from '$utils'; |
||||
|
const App = props => { |
||||
|
const { projectName } = props |
||||
|
|
||||
|
useEffect(() => { |
||||
|
document.title = projectName; |
||||
|
}, []) |
||||
|
|
||||
|
return ( |
||||
|
<Layout |
||||
|
title={projectName} |
||||
|
sections={[Auth, Shouye, ProjectRegime, Safetymanage, Organization, PatrolManage, IssueHandle, DeviceManage,ProjectBinding,AdvisoryNotice]} |
||||
|
/> |
||||
|
) |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export default App; |
@ -0,0 +1,316 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
import React, { Component } from 'react'; |
||||
|
import { connect } from 'react-redux'; |
||||
|
import { Spin, Upload, message, Modal, Card, Button } from 'antd'; |
||||
|
import moment from 'moment'; |
||||
|
import { PlusOutlined, UploadOutlined, CloseOutlined } from '@ant-design/icons'; |
||||
|
|
||||
|
class Uploads extends Component { |
||||
|
constructor(props) { |
||||
|
super(props); |
||||
|
this.ApiRoot = localStorage.getItem('tyApiRoot') |
||||
|
this.state = { |
||||
|
fileUploading: false, |
||||
|
fileList: [], |
||||
|
curPreviewPic: '', |
||||
|
delPicIng: false, |
||||
|
removeFilesList: [] |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
dealName = (uploaded) => { |
||||
|
let realName = uploaded.split('/')[2] |
||||
|
let x1 = realName.split('.') |
||||
|
let x2 = x1[0].split('_') |
||||
|
let showName = `${x2[0]}.${x1[1]}` |
||||
|
return showName |
||||
|
} |
||||
|
|
||||
|
// setFileList = (value) => {
|
||||
|
// let defaultFileList = [];
|
||||
|
// defaultFileList = value.map((u, index) => {
|
||||
|
// let fileUrl = `${this.ApiRoot}/${u.url}`;
|
||||
|
// return {
|
||||
|
// uid: -index - 1,
|
||||
|
// name: this.dealName(u.url),
|
||||
|
// status: 'done',
|
||||
|
// storageUrl: u.url,
|
||||
|
// url: fileUrl
|
||||
|
// };
|
||||
|
// });
|
||||
|
// onChange(defaultFileList)
|
||||
|
// this.setState({
|
||||
|
// fileList: defaultFileList
|
||||
|
// });
|
||||
|
// };
|
||||
|
|
||||
|
componentDidMount() { |
||||
|
const { value } = this.props; |
||||
|
if (value) { |
||||
|
this.setState(value); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
componentWillReceiveProps(np) { |
||||
|
const { dispatch, value: thisEditData, onChange } = this.props; |
||||
|
const { value: nextEditData } = np; |
||||
|
|
||||
|
const setFileList = () => { |
||||
|
let defaultFileList = []; |
||||
|
defaultFileList = nextEditData.map((u, index) => { |
||||
|
let fileUrl = `${this.ApiRoot}/${u.storageUrl}`; |
||||
|
return { |
||||
|
uid: -index - 1, |
||||
|
name: this.dealName(u.storageUrl), |
||||
|
status: 'done', |
||||
|
storageUrl: u.storageUrl, |
||||
|
url: fileUrl, |
||||
|
size: u.size || -1 |
||||
|
}; |
||||
|
}); |
||||
|
this.setState({ |
||||
|
fileList: defaultFileList |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
if (nextEditData && nextEditData.length) { |
||||
|
if (!thisEditData || !this.state.fileList.length) { |
||||
|
setFileList(); |
||||
|
} else if (nextEditData.length != thisEditData.length) { |
||||
|
setFileList(); |
||||
|
} else { |
||||
|
let repeat = true; |
||||
|
for (let i = 0; i < thisEditData.length; i++) { |
||||
|
if (thisEditData[i] != nextEditData[i]) { |
||||
|
repeat = false; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
if (!repeat) { |
||||
|
setFileList(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// else{
|
||||
|
// this.setState({
|
||||
|
// fileList:[],
|
||||
|
// })
|
||||
|
// }
|
||||
|
} |
||||
|
|
||||
|
render() { |
||||
|
const UploadPath = { |
||||
|
project: ['txt', 'dwg', 'doc', 'docx', 'xls', 'xlsx', 'pdf', 'png', 'jpg', 'rar', 'zip'], |
||||
|
report: ['doc', 'docx', 'xls', 'xlsx', 'pdf'], |
||||
|
data: ['txt', 'xls', 'xlsx'], |
||||
|
image: ['png', 'jpg', 'svg', 'jpeg'], |
||||
|
three: ['js'], |
||||
|
video: ['mp4'] |
||||
|
}; |
||||
|
/** |
||||
|
* uploadType 【string】 主要区别文件上传路径 以及类型 以 web/routes/attachment/index.js 中 UploadPath 的 key 值为准;默认 project; |
||||
|
* disabled 【boolean】 上传是否可用 |
||||
|
* maxFilesNum 【number】 最大上传数量 |
||||
|
* fileTypes 【array[string]】 可允许上传的文件类型; |
||||
|
* maxFileSize 【number】 单个文件最大大小 M |
||||
|
* listType 【antd】 upload 组件的属性 |
||||
|
* onChange 【function】 文件数量变化时候回调 返回文件 |
||||
|
* value 【array[obj]】 编辑数据 [{url:'xxx', [size:999]}] |
||||
|
* onStateChange 【function】 文件状态改变回调函数 上传中 return { uploading:true/false } |
||||
|
*/ |
||||
|
const { |
||||
|
uploadType, |
||||
|
disabled, |
||||
|
maxFilesNum, |
||||
|
fileTypes, |
||||
|
maxFileSize, |
||||
|
listType, |
||||
|
onChange, |
||||
|
value, |
||||
|
showUploadList, |
||||
|
onStateChange |
||||
|
} = this.props; |
||||
|
const { fileList, curPreviewPic, delPicIng, removeFilesList } = this.state; |
||||
|
const that = this; |
||||
|
let uploadType_ = uploadType || 'project'; |
||||
|
let maxFilesNum_ = maxFilesNum || 1; |
||||
|
let defaultFileTypes = fileTypes || UploadPath[uploadType_]; |
||||
|
const uploadProps = { |
||||
|
name: 'checkFile_', |
||||
|
multiple: false, |
||||
|
showUploadList: showUploadList || true, |
||||
|
action: `${this.ApiRoot}/attachments/${uploadType_}`, |
||||
|
listType: listType || 'text', |
||||
|
disabled: disabled, |
||||
|
beforeUpload: (file) => { |
||||
|
if (fileList.length >= maxFilesNum_) { |
||||
|
message.warning(`最多选择${maxFilesNum_}个文件上传`); |
||||
|
return false; |
||||
|
} |
||||
|
if (file.name.length > 60) { |
||||
|
message.warning(`文件名过长(大于60字符),请修改后上传`); |
||||
|
return false; |
||||
|
} |
||||
|
const extNames = file.name.split('.'); |
||||
|
var reg = /^[\.\s\u4e00-\u9fa5a-zA-Z0-9_-]{0,}$/; |
||||
|
if (!reg.exec(file.name)) { |
||||
|
message.warning(`文件名包含除字母、汉字、数字、中划线、下划线之外的字符,请修改后上传`); |
||||
|
return false; |
||||
|
} |
||||
|
let isDAE = false; |
||||
|
if (extNames.length > 0) { |
||||
|
let fileType = extNames[extNames.length - 1].toLowerCase(); |
||||
|
isDAE = defaultFileTypes.some((f) => f == fileType); |
||||
|
} |
||||
|
if (!isDAE) { |
||||
|
message.error(`只能上传 ${defaultFileTypes.join()} 格式的文件!`); |
||||
|
return false; |
||||
|
} |
||||
|
const isLt = file.size / 1024 / 1024 < (maxFileSize || 3); |
||||
|
if (!isLt) { |
||||
|
message.error(`文件必须小于${maxFileSize || 3}MB!`); |
||||
|
return false; |
||||
|
} |
||||
|
this.setState({ |
||||
|
fileUploading: true |
||||
|
}); |
||||
|
if (onStateChange) { |
||||
|
onStateChange({ uploading: true }); |
||||
|
} |
||||
|
}, |
||||
|
onChange(info) { |
||||
|
const status = info.file.status; |
||||
|
if (status === 'uploading') { |
||||
|
that.setState({ |
||||
|
fileList: info.fileList |
||||
|
}); |
||||
|
} |
||||
|
if (status === 'done') { |
||||
|
let { uploaded, url } = info.file.response; |
||||
|
let size = info.file.size; |
||||
|
let nextFileList = fileList; |
||||
|
nextFileList[nextFileList.length - 1] = { |
||||
|
uid: -moment().unix(), |
||||
|
name: that.dealName(uploaded), |
||||
|
status: 'done', |
||||
|
storageUrl: uploaded, |
||||
|
url: url, |
||||
|
size: size |
||||
|
}; |
||||
|
onChange(nextFileList); |
||||
|
that.setState({ |
||||
|
fileUploading: false, |
||||
|
fileList: nextFileList |
||||
|
}); |
||||
|
if (onStateChange) { |
||||
|
onStateChange({ uploading: false }); |
||||
|
} |
||||
|
} else if (status === 'error') { |
||||
|
that.setState({ |
||||
|
fileUploading: false |
||||
|
}); |
||||
|
message.error(`${info.file.name} 上传失败,请重试`); |
||||
|
if (onStateChange) { |
||||
|
onStateChange({ uploading: false }); |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
onRemove(file) { |
||||
|
let nextFileList = []; |
||||
|
fileList.map((f, i) => { |
||||
|
if (f.uid != file.uid) { |
||||
|
nextFileList.push(f); |
||||
|
} |
||||
|
}); |
||||
|
let nextRemoveFiles = removeFilesList.concat([file.storageUrl]); |
||||
|
if (curPreviewPic == file.url) { |
||||
|
that.setState({ |
||||
|
curPreviewPic: '' |
||||
|
}); |
||||
|
} |
||||
|
onChange(nextFileList); |
||||
|
that.setState({ |
||||
|
fileList: nextFileList, |
||||
|
removeFilesList: nextRemoveFiles |
||||
|
}); |
||||
|
}, |
||||
|
onPreview(file) { |
||||
|
let filePostfix = file.url.split('.').pop(); |
||||
|
filePostfix = filePostfix.toLowerCase(); |
||||
|
if (UploadPath.image.some((img) => img == filePostfix)) { |
||||
|
that.setState({ |
||||
|
curPreviewPic: file.url |
||||
|
}); |
||||
|
} else { |
||||
|
message.warn('仅支持图片预览'); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
let fileList_ = fileList |
||||
|
// .map(f => {
|
||||
|
// if (f.storageUrl) {
|
||||
|
// let realName = f.storageUrl.split('/').pop()
|
||||
|
// if (f.name != realName) {
|
||||
|
// f.name = realName
|
||||
|
// }
|
||||
|
// }
|
||||
|
// return f
|
||||
|
// })
|
||||
|
|
||||
|
return ( |
||||
|
<div> |
||||
|
<Spin spinning={delPicIng}> |
||||
|
<Upload {...uploadProps} fileList={fileList_}> |
||||
|
{ |
||||
|
disabled ? ( |
||||
|
'' |
||||
|
) : |
||||
|
listType == 'picture-card' ? |
||||
|
( |
||||
|
fileList.length >= maxFilesNum_ ? null : ( |
||||
|
<div style={{}}> |
||||
|
<PlusOutlined /> |
||||
|
<div>上传图片</div> |
||||
|
</div> |
||||
|
) |
||||
|
) : ( |
||||
|
<Button disabled={fileList.length >= maxFilesNum_} icon={<UploadOutlined />}> 文件上传 </Button> |
||||
|
) |
||||
|
} |
||||
|
</Upload> |
||||
|
{ |
||||
|
curPreviewPic ? ( |
||||
|
<Card |
||||
|
bodyStyle={{ |
||||
|
padding: 8 |
||||
|
}} |
||||
|
> |
||||
|
<div style={{ marginBottom: 8 }} > |
||||
|
<span>文件预览</span> |
||||
|
<span |
||||
|
style={{ float: 'right' }} |
||||
|
onClick={() => { this.setState({ curPreviewPic: '' }); }} |
||||
|
> |
||||
|
<CloseOutlined style={{ fontSize: 20 }} /> |
||||
|
</span> |
||||
|
</div> |
||||
|
<img style={{ width: '100%' }} src={curPreviewPic}></img> |
||||
|
</Card> |
||||
|
) : '' |
||||
|
} |
||||
|
</Spin> |
||||
|
</div> |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function mapStateToProps(state) { |
||||
|
const { auth } = state |
||||
|
return { |
||||
|
user: auth.user |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
export default connect(mapStateToProps)(Uploads); |
@ -0,0 +1,390 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
import React, { Component } from 'react'; |
||||
|
import { connect } from 'react-redux'; |
||||
|
import { Spin, Upload, message, Modal, Card, Button } from 'antd'; |
||||
|
import moment from 'moment'; |
||||
|
import { PlusOutlined, UploadOutlined, CloseOutlined } from '@ant-design/icons'; |
||||
|
|
||||
|
class Uploads extends Component { |
||||
|
constructor(props) { |
||||
|
super(props); |
||||
|
this.ApiRoot = localStorage.getItem('tyApiRoot') |
||||
|
this.qnDomain = localStorage.getItem('qnDomain'); |
||||
|
this.aliAdmin = localStorage.getItem('aliAdmin'); |
||||
|
this.state = { |
||||
|
fileUploading: false, |
||||
|
fileList: [], |
||||
|
curPreviewPic: '', |
||||
|
curPreviewVideo: '', |
||||
|
delPicIng: false, |
||||
|
removeFilesList: [] |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
dealName = (uploaded) => { |
||||
|
let realName = uploaded?.split('/')[2] |
||||
|
// let x1 = realName.split('.')
|
||||
|
// let postfix = x1.pop()
|
||||
|
// let allName = x1.join('.')
|
||||
|
// let x2 = allName.split('_')
|
||||
|
// let showName = `${x2[0]}.${postfix}`
|
||||
|
return realName |
||||
|
} |
||||
|
|
||||
|
// setFileList = (value) => {
|
||||
|
// let defaultFileList = [];
|
||||
|
// defaultFileList = value.map((u, index) => {
|
||||
|
// let fileUrl = `${this.ApiRoot}/${u.url}`;
|
||||
|
// return {
|
||||
|
// uid: -index - 1,
|
||||
|
// name: this.dealName(u.url),
|
||||
|
// status: 'done',
|
||||
|
// storageUrl: u.url,
|
||||
|
// url: fileUrl
|
||||
|
// };
|
||||
|
// });
|
||||
|
// onChange(defaultFileList)
|
||||
|
// this.setState({
|
||||
|
// fileList: defaultFileList
|
||||
|
// });
|
||||
|
// };
|
||||
|
|
||||
|
setFileList = (nextEditData, isQiniu, isAli) => { |
||||
|
let defaultFileList = []; |
||||
|
defaultFileList = nextEditData.map((u, index) => { |
||||
|
let fileUrl = |
||||
|
isQiniu ? `/_file-server/${u.storageUrl}` |
||||
|
: isAli ? `/_file-ali-server/${u.storageUrl}` |
||||
|
: `${this.ApiRoot}/${u.storageUrl}`; |
||||
|
|
||||
|
return { |
||||
|
uid: -index - 1, |
||||
|
name: this.dealName(u.storageUrl), |
||||
|
status: 'done', |
||||
|
storageUrl: u.storageUrl, |
||||
|
url: fileUrl, |
||||
|
size: u.size || -1 |
||||
|
}; |
||||
|
}); |
||||
|
this.setState({ |
||||
|
fileList: defaultFileList |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
componentDidMount() { |
||||
|
const { value, defaultValue, isQiniu, isAli } = this.props; |
||||
|
if (defaultValue) { |
||||
|
this.setFileList(defaultValue, isQiniu, isAli) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
UNSAFE_componentWillReceiveProps(np) { |
||||
|
const { dispatch, value: thisEditData, onChange } = this.props; |
||||
|
const { value: nextEditData, isQiniu, isAli } = np; |
||||
|
// this.setFileList(nextEditData, isQiniu)
|
||||
|
// const setFileList = () => {
|
||||
|
// let defaultFileList = [];
|
||||
|
// defaultFileList = nextEditData.map((u, index) => {
|
||||
|
// let fileUrl = isQiniu ? `/_file-server/${u.storageUrl}` : `${this.ApiRoot}/${u.storageUrl}`;
|
||||
|
// return {
|
||||
|
// uid: -index - 1,
|
||||
|
// name: this.dealName(u.storageUrl),
|
||||
|
// status: 'done',
|
||||
|
// storageUrl: u.storageUrl,
|
||||
|
// url: fileUrl,
|
||||
|
// size: u.size || -1
|
||||
|
// };
|
||||
|
// });
|
||||
|
// this.setState({
|
||||
|
// fileList: defaultFileList
|
||||
|
// });
|
||||
|
// };
|
||||
|
if (nextEditData && nextEditData.length) { |
||||
|
if (!thisEditData || !this.state.fileList.length) { |
||||
|
this.setFileList(nextEditData, isQiniu, isAli); |
||||
|
} else if (nextEditData.length != thisEditData.length) { |
||||
|
this.setFileList(nextEditData, isQiniu, isAli); |
||||
|
} else { |
||||
|
let repeat = true; |
||||
|
for (let i = 0; i < thisEditData.length; i++) { |
||||
|
if (thisEditData[i] != nextEditData[i]) { |
||||
|
repeat = false; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
if (!repeat) { |
||||
|
this.setFileList(nextEditData, isQiniu, isAli); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// else{
|
||||
|
// this.setState({
|
||||
|
// fileList:[],
|
||||
|
// })
|
||||
|
// }
|
||||
|
} |
||||
|
|
||||
|
render() { |
||||
|
const UploadPath = { |
||||
|
project: ['txt', 'dwg', 'doc', 'docx', 'xls', 'xlsx', 'csv', 'pdf', 'pptx', 'png', 'jpg', 'svg', 'jpeg', 'rar', 'zip', 'jpeg', 'mp4'], |
||||
|
report: ['doc', 'docx', 'xls', 'xlsx', 'csv', 'pdf'], |
||||
|
data: ['txt', 'xls', 'xlsx', 'csv'], |
||||
|
image: ['png', 'jpg', 'svg', 'jpeg'], |
||||
|
three: ['js'], |
||||
|
video: ['mp4'] |
||||
|
}; |
||||
|
/** |
||||
|
* uploadType 【string】 主要区别文件上传路径 以及类型 以 web/routes/attachment/index.js 中 UploadPath 的 key 值为准;默认 project; |
||||
|
* disabled 【boolean】 上传是否可用 |
||||
|
* maxFilesNum 【number】 最大上传数量 |
||||
|
* fileTypes 【array[string]】 可允许上传的文件类型; |
||||
|
* maxFileSize 【number】 单个文件最大大小 M |
||||
|
* listType 【antd】 upload 组件的属性 |
||||
|
* onChange 【function】 文件数量变化时候回调 返回文件 |
||||
|
* value 【array[obj]】 编辑数据 [{url:'xxx', [size:999]}] |
||||
|
* onStateChange 【function】 文件状态改变回调函数 上传中 return { uploading:true/false } |
||||
|
*/ |
||||
|
const { |
||||
|
uploadType, |
||||
|
disabled, |
||||
|
maxFilesNum, |
||||
|
fileTypes, |
||||
|
maxFileSize, |
||||
|
listType, |
||||
|
onChange = () => { }, |
||||
|
value, |
||||
|
showUploadList, |
||||
|
onStateChange, |
||||
|
isQiniu, |
||||
|
isAli, |
||||
|
} = this.props; |
||||
|
const { fileList, curPreviewPic, curPreviewVideo, delPicIng, removeFilesList } = this.state; |
||||
|
const that = this; |
||||
|
let uploadType_ = uploadType || 'project'; |
||||
|
let maxFilesNum_ = maxFilesNum || 1; |
||||
|
let defaultFileTypes = fileTypes || UploadPath[uploadType_]; |
||||
|
// debugger
|
||||
|
const uploadProps = { |
||||
|
name: 'checkFile_', |
||||
|
multiple: false, |
||||
|
showUploadList: showUploadList || true, |
||||
|
action: |
||||
|
isQiniu ? `/_upload/attachments/${uploadType_}` |
||||
|
: isAli ? `/_upload/attachments/ali/${uploadType_}` |
||||
|
: `${this.ApiRoot}/attachments/${uploadType_}`, |
||||
|
listType: listType || 'text', |
||||
|
disabled: disabled, |
||||
|
beforeUpload: (file) => { |
||||
|
if (fileList.length >= maxFilesNum_) { |
||||
|
message.warning(`最多选择${maxFilesNum_}个文件上传`); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
if (file.name.length > 60) { |
||||
|
message.warning(`文件名过长(大于60字符),请修改后上传`); |
||||
|
return false; |
||||
|
} |
||||
|
const extNames = file.name.split('.'); |
||||
|
// var reg = /^[\.\s\u4e00-\u9fa5a-zA-Z0-9_-]{0,}$/;
|
||||
|
// if (!reg.exec(file.name)) {
|
||||
|
// message.warning(`文件名包含除字母、汉字、数字、中划线、下划线之外的字符,请修改后上传`);
|
||||
|
// return false;
|
||||
|
// }
|
||||
|
let isDAE = false; |
||||
|
if (extNames.length > 0) { |
||||
|
let fileType = extNames[extNames.length - 1].toLowerCase(); |
||||
|
isDAE = defaultFileTypes.some((f) => f == fileType); |
||||
|
} |
||||
|
if (!isDAE) { |
||||
|
message.error(`只能上传 ${defaultFileTypes.join()} 格式的文件!`); |
||||
|
return false; |
||||
|
} |
||||
|
const isLt = file.size / 1024 / 1024 < (maxFileSize || 3); |
||||
|
if (!isLt) { |
||||
|
message.error(`文件必须小于${maxFileSize || 3}MB!`); |
||||
|
return false; |
||||
|
} |
||||
|
this.setState({ |
||||
|
fileUploading: true |
||||
|
}); |
||||
|
if (onStateChange) { |
||||
|
onStateChange({ uploading: true }); |
||||
|
} |
||||
|
}, |
||||
|
onChange(info) { |
||||
|
const status = info.file.status; |
||||
|
if (status === 'uploading') { |
||||
|
that.setState({ |
||||
|
fileList: info.fileList |
||||
|
}); |
||||
|
} |
||||
|
if (status === 'done') { |
||||
|
let { uploaded, url } = info.file.response; |
||||
|
let size = info.file.size; |
||||
|
let nextFileList = fileList; |
||||
|
nextFileList[nextFileList.length - 1] = { |
||||
|
uid: -moment().unix(), |
||||
|
name: that.dealName(uploaded), |
||||
|
status: 'done', |
||||
|
storageUrl: uploaded, |
||||
|
url: |
||||
|
isQiniu ? '/_file-server/' + uploaded : |
||||
|
isAli ? `/_file-ali-server/${uploaded}` : |
||||
|
url, |
||||
|
size: size |
||||
|
}; |
||||
|
onChange(nextFileList); |
||||
|
that.setState({ |
||||
|
fileUploading: false, |
||||
|
fileList: nextFileList |
||||
|
}); |
||||
|
if (onStateChange) { |
||||
|
onStateChange({ uploading: false }); |
||||
|
} |
||||
|
} else if (status === 'error') { |
||||
|
that.setState({ |
||||
|
fileUploading: false |
||||
|
}); |
||||
|
message.error(`${info.file.name} 上传失败,请重试`); |
||||
|
if (onStateChange) { |
||||
|
onStateChange({ uploading: false }); |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
onRemove(file) { |
||||
|
let nextFileList = []; |
||||
|
fileList.map((f, i) => { |
||||
|
if (f.uid != file.uid) { |
||||
|
nextFileList.push(f); |
||||
|
} |
||||
|
}); |
||||
|
let nextRemoveFiles = removeFilesList.concat([file.storageUrl]); |
||||
|
if (curPreviewPic == file.url) { |
||||
|
that.setState({ |
||||
|
curPreviewPic: '' |
||||
|
}); |
||||
|
} |
||||
|
if (curPreviewVideo == file.url) { |
||||
|
that.setState({ |
||||
|
curPreviewVideo: '' |
||||
|
}); |
||||
|
} |
||||
|
onChange(nextFileList); |
||||
|
that.setState({ |
||||
|
fileList: nextFileList, |
||||
|
removeFilesList: nextRemoveFiles |
||||
|
}); |
||||
|
}, |
||||
|
onPreview(file) { |
||||
|
let filePostfix = file.url.split('.').pop(); |
||||
|
filePostfix = filePostfix.toLowerCase(); |
||||
|
if (UploadPath.image.some((img) => img == filePostfix)) { |
||||
|
that.setState({ |
||||
|
curPreviewPic: file.url |
||||
|
}); |
||||
|
} else if (UploadPath.video.some((img) => img == filePostfix)) { |
||||
|
that.setState({ |
||||
|
curPreviewVideo: file.url |
||||
|
}); |
||||
|
} else { |
||||
|
//message.warn('仅支持图片预览');
|
||||
|
preview(file.storageUrl) |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
const preview = (url) => { |
||||
|
let link = isQiniu ? encodeURI(`${this.qnDomain}/${url}`) : |
||||
|
isAli ? encodeURI(`${this.aliAdmin}/${url}`) : '' |
||||
|
if (link) |
||||
|
if (url.indexOf("pdf") !== -1 || url.indexOf("csv") !== -1) { |
||||
|
window.open(link) |
||||
|
} else { |
||||
|
window.open(`https://view.officeapps.live.com/op/view.aspx?src=${link}`) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
let fileList_ = fileList |
||||
|
// .map(f => {
|
||||
|
// if (f.storageUrl) {
|
||||
|
// let realName = f.storageUrl.split('/').pop()
|
||||
|
// if (f.name != realName) {
|
||||
|
// f.name = realName
|
||||
|
// }
|
||||
|
// }
|
||||
|
// return f
|
||||
|
// })
|
||||
|
//下载文件
|
||||
|
const handleDownload = (file) => { |
||||
|
saveAs(file) |
||||
|
}; |
||||
|
const saveAs = (file) => { |
||||
|
const link = document.createElement('a'); |
||||
|
link.href = file.url; |
||||
|
link.download = file.name; |
||||
|
link.style.display = 'none'; |
||||
|
link.click(); |
||||
|
} |
||||
|
//自定义下载
|
||||
|
return ( |
||||
|
<div> |
||||
|
<Spin spinning={delPicIng}> |
||||
|
<Upload {...uploadProps} fileList={fileList_} showUploadList={{ showDownloadIcon: true }} onDownload={handleDownload}> |
||||
|
{ |
||||
|
disabled ? ( |
||||
|
'' |
||||
|
) : |
||||
|
listType == 'picture-card' ? |
||||
|
( |
||||
|
fileList.length >= maxFilesNum_ ? null : ( |
||||
|
<div style={{}}> |
||||
|
<PlusOutlined /> |
||||
|
<div>添加附件</div> |
||||
|
</div> |
||||
|
) |
||||
|
) : ( |
||||
|
<Button disabled={fileList.length >= maxFilesNum_} icon={<UploadOutlined />}> 文件上传 </Button> |
||||
|
) |
||||
|
} |
||||
|
</Upload> |
||||
|
{ |
||||
|
curPreviewPic ? ( |
||||
|
<Card bodyStyle={{ padding: 8 }}> |
||||
|
<div style={{ marginBottom: 8 }} > |
||||
|
<span>图片预览</span> |
||||
|
<span style={{ float: 'right' }} onClick={() => { this.setState({ curPreviewPic: '' }) }}> |
||||
|
<CloseOutlined style={{ fontSize: 20 }} /> |
||||
|
</span> |
||||
|
</div> |
||||
|
<img style={{ width: '100%' }} src={curPreviewPic} /> |
||||
|
</Card> |
||||
|
) : '' |
||||
|
} |
||||
|
{ |
||||
|
curPreviewVideo ? (<Card bodyStyle={{ padding: 8 }}> |
||||
|
<div style={{ marginBottom: 8 }} > |
||||
|
<span>视频预览</span> |
||||
|
<span style={{ float: 'right' }} onClick={() => { this.setState({ curPreviewVideo: '' }) }}> |
||||
|
<CloseOutlined style={{ fontSize: 20 }} /> |
||||
|
</span> |
||||
|
</div> |
||||
|
<video controls style={{ width: '100%' }}> |
||||
|
<source src={curPreviewVideo} type="video/mp4"></source> |
||||
|
</video> |
||||
|
</Card>) : '' |
||||
|
} |
||||
|
</Spin> |
||||
|
</div> |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function mapStateToProps(state) { |
||||
|
const { auth } = state |
||||
|
return { |
||||
|
user: auth.user |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
export default connect(mapStateToProps)(Uploads); |
@ -0,0 +1,683 @@ |
|||||
|
/** |
||||
|
* Created by Xumeng 2020/04/22. |
||||
|
*/ |
||||
|
|
||||
|
import React, { useState, useEffect } from 'react'; |
||||
|
import PropTypes from 'prop-types'; |
||||
|
import { |
||||
|
Row, Col, Space, Button, message, notification, Form, Input, Tooltip, Menu, Dropdown, |
||||
|
} from 'antd'; |
||||
|
import moment from 'moment'; |
||||
|
import XLSX from 'xlsx'; |
||||
|
import { fromJS } from 'immutable'; |
||||
|
import { Request } from '@peace/utils'; |
||||
|
import FileSaver from 'file-saver'; |
||||
|
import './index.less'; |
||||
|
|
||||
|
// 通用前端导入导出组件 使用方法查看底部propTypes
|
||||
|
function ExportAndImport(props) { |
||||
|
const [form] = Form.useForm(); |
||||
|
const [exportLoading, setExportLoading] = useState(false); |
||||
|
const [importLoading, setImportLoading] = useState(false); |
||||
|
const { |
||||
|
importDataCallback, onImportSucess, handelData, importMethod = 'post', |
||||
|
} = props; |
||||
|
|
||||
|
useEffect(() => () => { |
||||
|
// 只有unmount 时调用
|
||||
|
notification.close('import-notification'); |
||||
|
}); |
||||
|
const importExcel = (file, type) => { |
||||
|
setImportLoading(true); |
||||
|
// 获取上传的文件对象
|
||||
|
const { files } = file.target; |
||||
|
// 判断xls、xlsx格式
|
||||
|
if (files[0].type.indexOf('sheet') > -1 || files[0].type.indexOf('ms-excel') > -1) { |
||||
|
// 通过FileReader对象读取文件
|
||||
|
const fileReader = new FileReader(); |
||||
|
fileReader.onload = (event) => { |
||||
|
try { |
||||
|
const { importRequest = true, importUrl, importQuery } = props; |
||||
|
if (importRequest && !importUrl) { |
||||
|
message.error('获取导入接口失败!'); |
||||
|
form.resetFields(); |
||||
|
return; |
||||
|
} |
||||
|
const { result } = event.target; |
||||
|
// 以二进制流方式读取得到整份excel表格对象
|
||||
|
const workbook = XLSX.read(result, { type: 'binary', cellDates: true }); |
||||
|
let data = []; // 存储获取到的数据
|
||||
|
// 遍历每张工作表进行读取(这里默认只读取第一张表)
|
||||
|
for (const sheet in workbook.Sheets) { |
||||
|
if (workbook.Sheets.hasOwnProperty(sheet)) { |
||||
|
// 利用 sheet_to_json 方法将 excel 转成 json 数据
|
||||
|
data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet])); |
||||
|
break; // 如果只取第一张表,就取消注释这行
|
||||
|
} |
||||
|
} |
||||
|
if (data.length > 10000) { |
||||
|
message.error('一次最多导入10000条数据,请分批导入!'); |
||||
|
form.resetFields(); |
||||
|
setImportLoading(false); |
||||
|
return; |
||||
|
} |
||||
|
if (importRequest) { |
||||
|
message.success('获取文件数据成功,开始处理导入...'); |
||||
|
const importData = handelData ? handelData(data) : data; |
||||
|
Request[importMethod](importUrl, { data: importData }, importQuery || {}).then((res) => { |
||||
|
message.success('导入数据成功'); |
||||
|
form.resetFields(); |
||||
|
notification.close('import-notification'); |
||||
|
setImportLoading(false); |
||||
|
onImportSucess && onImportSucess(); |
||||
|
}, (err) => { |
||||
|
if (err.status === 500) { |
||||
|
message.error('数据导入出错,导入失败'); |
||||
|
} else if (err.status === 400) { |
||||
|
message.error(err.body.message || '数据验证出错,请检查数据格式是否正确'); |
||||
|
} else { |
||||
|
message.error('导入失败'); |
||||
|
} |
||||
|
form.resetFields(); |
||||
|
setImportLoading(false); |
||||
|
}); |
||||
|
} else { |
||||
|
form.resetFields(); |
||||
|
setImportLoading(false); |
||||
|
importDataCallback && importDataCallback(data, type); |
||||
|
notification.close('import-notification'); |
||||
|
} |
||||
|
} catch (e) { |
||||
|
console.log(e); |
||||
|
// 这里可以抛出文件类型错误不正确的相关提示
|
||||
|
message.error('文件格式不正确!'); |
||||
|
setImportLoading(false); |
||||
|
form.resetFields(); |
||||
|
} |
||||
|
}; |
||||
|
// fileReader.onloadend = (event) => {
|
||||
|
// console.log(event)
|
||||
|
// }
|
||||
|
// 以二进制方式打开文件
|
||||
|
fileReader.readAsBinaryString(files[0]); |
||||
|
} else { |
||||
|
message.error('文件格式不正确!'); |
||||
|
form.resetFields(); |
||||
|
setImportLoading(false); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
const loop = (data, keypath, values) => { // deal with array
|
||||
|
const dkey = keypath.slice(0, 1)[0]; |
||||
|
console.log(dkey); |
||||
|
if (dkey) { |
||||
|
const dvalue = data[dkey]; |
||||
|
const otherKeypath = keypath.slice(1); |
||||
|
if (Array.isArray(dvalue)) { |
||||
|
if (otherKeypath.length) { |
||||
|
const immutableData = fromJS(data); |
||||
|
for (let index = 0; index < dvalue.length; index++) { |
||||
|
const tmp = immutableData.getIn([dkey, index]).toJS(); |
||||
|
loop(tmp, otherKeypath, values); |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
values.push(dvalue); |
||||
|
} |
||||
|
} |
||||
|
return values; |
||||
|
}; |
||||
|
const getColumnData = (opts) => { |
||||
|
const { |
||||
|
data, keypath, render, spliter, rawdata, |
||||
|
} = opts; |
||||
|
let v = null; |
||||
|
const outer = data[keypath[0]]; |
||||
|
|
||||
|
if (Array.isArray(outer)) { |
||||
|
const values = loop(data, keypath, []); |
||||
|
v = rawdata ? values : values.join(spliter || ','); |
||||
|
} else { |
||||
|
v = fromJS(data).getIn(keypath); |
||||
|
} |
||||
|
// 处理render
|
||||
|
if (render && typeof render === 'function') { |
||||
|
v = render(outer, data); |
||||
|
} |
||||
|
return v; |
||||
|
}; |
||||
|
const getDataSource = (attrs, filterData) => { |
||||
|
// let token = JSON.parse(sessionStorage.getItem('user')).token;
|
||||
|
const dataSource = filterData.map((item) => { |
||||
|
const record = {}; |
||||
|
attrs.forEach((attr) => { |
||||
|
const { |
||||
|
key, dataIndex, render, child, |
||||
|
} = attr; |
||||
|
if (child) { |
||||
|
record[key] = getDataSource(child, item[key]); |
||||
|
} else { |
||||
|
const v = getColumnData({ |
||||
|
data: item, |
||||
|
keypath: dataIndex || [key], |
||||
|
render: render || null, |
||||
|
}); |
||||
|
record[key] = v; |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
return record; |
||||
|
}); |
||||
|
return dataSource; |
||||
|
}; |
||||
|
// 暂时只处理两层
|
||||
|
const getFlatData = (attrs, filterData, dataToAoa, deep = 0) => { |
||||
|
filterData.map((item) => { |
||||
|
let cur = dataToAoa[deep]; |
||||
|
if (!cur) { |
||||
|
cur = dataToAoa[deep] = []; |
||||
|
} |
||||
|
attrs.map((attr, index) => { |
||||
|
const { key, child } = attr; |
||||
|
if (child) { |
||||
|
if (Array.isArray(item[key])) { |
||||
|
// getFlatData(child,item[key],dataToAoa,deep)
|
||||
|
|
||||
|
item[key].map((s, i) => { |
||||
|
if (i == 0) { |
||||
|
child.map((c) => { |
||||
|
cur.push(s[c.key]); |
||||
|
}); |
||||
|
} else { |
||||
|
deep++; |
||||
|
const childCur = dataToAoa[deep] = []; |
||||
|
pushNull(childCur, index); |
||||
|
child.map((c) => { |
||||
|
childCur.push(s[c.key]); |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
} else { |
||||
|
cur.push(item[key]); |
||||
|
} |
||||
|
}); |
||||
|
deep++; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
const getHeader = (headers, excelHeader, deep, perOffset) => { |
||||
|
let offset = 0; |
||||
|
let cur = excelHeader[deep]; |
||||
|
if (!cur) { |
||||
|
cur = excelHeader[deep] = []; |
||||
|
} |
||||
|
pushNull(cur, perOffset - cur.length); |
||||
|
for (let i = 0; i < headers.length; i++) { |
||||
|
const head = headers[i]; |
||||
|
cur.push(head.name); |
||||
|
if (head.hasOwnProperty('child') && Array.isArray(head.child) && head.child.length > 0) { |
||||
|
const childOffset = getHeader(head.child, excelHeader, deep + 1, cur.length - 1); |
||||
|
pushNull(cur, childOffset - 1); |
||||
|
offset += childOffset; |
||||
|
} else { |
||||
|
offset++; |
||||
|
} |
||||
|
} |
||||
|
return offset; |
||||
|
}; |
||||
|
|
||||
|
const pushNull = (arr, count) => { |
||||
|
for (let i = 0; i < count; i++) { |
||||
|
arr.push(null); |
||||
|
} |
||||
|
}; |
||||
|
const fillNull = (arr) => { |
||||
|
const max = Math.max(...(arr.map((a) => a.length))); |
||||
|
arr.filter((e) => e.length < max).forEach((e) => pushNull(e, max - e.length)); |
||||
|
}; |
||||
|
const doMerges = (arr) => { |
||||
|
// 要么横向合并 要么纵向合并
|
||||
|
const deep = arr.length; |
||||
|
const merges = []; |
||||
|
for (let y = 0; y < deep; y++) { |
||||
|
// 先处理横向合并
|
||||
|
const row = arr[y]; |
||||
|
let colSpan = 0; |
||||
|
for (let x = 0; x < row.length; x++) { |
||||
|
if (row[x] === null) { |
||||
|
colSpan++; |
||||
|
if (((x + 1) === row.length) && (colSpan > 0 && x > colSpan)) { |
||||
|
merges.push({ s: { r: y, c: x - colSpan }, e: { r: y, c: x } }); |
||||
|
} |
||||
|
} else if (colSpan > 0 && x > colSpan) { |
||||
|
merges.push({ s: { r: y, c: x - colSpan - 1 }, e: { r: y, c: x - 1 } }); |
||||
|
colSpan = 0; |
||||
|
} else { |
||||
|
colSpan = 0; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
// 再处理纵向合并
|
||||
|
const colLength = arr[0].length; |
||||
|
for (let x = 0; x < colLength; x++) { |
||||
|
let rowSpan = 0; |
||||
|
for (let y = 0; y < deep; y++) { |
||||
|
if (arr[y][x] != null) { |
||||
|
rowSpan = 0; |
||||
|
} else { |
||||
|
rowSpan++; |
||||
|
} |
||||
|
} |
||||
|
if (rowSpan > 0) { |
||||
|
merges.push({ s: { r: deep - rowSpan - 1, c: x }, e: { r: deep - 1, c: x } }); |
||||
|
} |
||||
|
} |
||||
|
return merges; |
||||
|
}; |
||||
|
// 内容暂只出了纵向合并
|
||||
|
const doContetMerges = (arr, headerLength) => { |
||||
|
const deep = arr.length; |
||||
|
const merges = []; |
||||
|
// 处理纵向合并
|
||||
|
const colLength = arr[0].length; |
||||
|
for (let x = 0; x < colLength; x++) { |
||||
|
let rowSpan = 0; |
||||
|
const mergY = 0; |
||||
|
for (let y = 0; y < deep; y++) { |
||||
|
if (rowSpan > 0) { |
||||
|
// 如果还有null 继续加
|
||||
|
if (arr[y][x] === null) { |
||||
|
rowSpan += 1; |
||||
|
} else { |
||||
|
// 不为null 增加merge
|
||||
|
merges.push({ s: { r: headerLength + (y - rowSpan - 1), c: x }, e: { r: headerLength + y - 1, c: x } }); |
||||
|
rowSpan = 0; |
||||
|
} |
||||
|
} else if (arr[y][x] === null) { |
||||
|
rowSpan += 1; |
||||
|
} |
||||
|
} |
||||
|
if (rowSpan > 0) { |
||||
|
merges.push({ s: { r: headerLength + (deep - rowSpan - 1), c: x }, e: { r: headerLength + deep - 1, c: x } }); |
||||
|
rowSpan = 0; |
||||
|
} |
||||
|
} |
||||
|
return merges; |
||||
|
}; |
||||
|
const exportMergeExcel = async () => { |
||||
|
setExportLoading(true); |
||||
|
const { |
||||
|
column, data, fileName, exportUrl, exportQuery, exportBody, requestType, header, showYearMouth, |
||||
|
} = props || {}; |
||||
|
|
||||
|
let resultData = []; |
||||
|
if (exportUrl) { |
||||
|
resultData = requestType == 'post' ? await Request.post(exportUrl, exportBody || {}, exportQuery || {}).then((data) => { |
||||
|
// 数据接口返回的结果 如果是对象 必须把返回数组放入rows
|
||||
|
if (typeof data === 'object' && data.rows) { |
||||
|
return data.rows; |
||||
|
} |
||||
|
return data; |
||||
|
}, (err) => { |
||||
|
message.error('获取数据失败,导出失败!'); |
||||
|
}) : await Request.get(exportUrl, exportQuery || {}).then((data) => { |
||||
|
if (typeof data === 'object' && data.rows) { |
||||
|
return data.rows; |
||||
|
} |
||||
|
return data; |
||||
|
}, (err) => { |
||||
|
message.error('获取数据失败,导出失败!'); |
||||
|
}); |
||||
|
if (!resultData) { |
||||
|
return; |
||||
|
} |
||||
|
} else { |
||||
|
resultData = data; |
||||
|
} |
||||
|
const excelHeader = []; |
||||
|
getHeader(column, excelHeader, 0, 0); |
||||
|
fillNull(excelHeader); |
||||
|
|
||||
|
// console.log(excelHeader);
|
||||
|
|
||||
|
const loopData = getDataSource(column, resultData); |
||||
|
// console.log(loopData)
|
||||
|
|
||||
|
const dataToAoa = []; |
||||
|
getFlatData(column, loopData, dataToAoa, 0); |
||||
|
fillNull(dataToAoa); |
||||
|
// console.log(dataToAoa);
|
||||
|
|
||||
|
const aoa = [].concat(excelHeader, dataToAoa); |
||||
|
// console.log(aoa)
|
||||
|
|
||||
|
const headerMerges = doMerges(excelHeader); |
||||
|
const contentMerages = doContetMerges(dataToAoa, excelHeader.length); |
||||
|
const merges = [].concat(headerMerges, contentMerages); |
||||
|
// console.log(contentMerages)
|
||||
|
|
||||
|
// let opts = {
|
||||
|
// defaultCellStyle: {
|
||||
|
// font: { name: "宋体", sz: 11, color: { auto: 1 } },
|
||||
|
// border: {
|
||||
|
// color: { auto: 1 }
|
||||
|
// },
|
||||
|
// alignment: {
|
||||
|
// /// 自动换行
|
||||
|
// wrapText: 1,
|
||||
|
// // 居中
|
||||
|
// horizontal: "center",
|
||||
|
// vertical: "center",
|
||||
|
// indent: 0
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
const sheet = XLSX.utils.aoa_to_sheet(aoa); |
||||
|
// let newSheet = {};
|
||||
|
// for (let [key, value] of Object.entries(sheet)) {
|
||||
|
// if(key == '!ref'){
|
||||
|
// newSheet[key] = value
|
||||
|
// }else if(typeof value === 'object'){
|
||||
|
// newSheet[key] = {
|
||||
|
// ...value,
|
||||
|
// s: opts.defaultCellStyle
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
const wpx = column.map((c) => ({ |
||||
|
wpx: Number.parseInt(c.wpx) ? Number.parseInt(c.wpx) : 100, |
||||
|
})); |
||||
|
sheet['!cols'] = wpx; |
||||
|
sheet['!merges'] = merges; |
||||
|
|
||||
|
// 构建 workbook 对象
|
||||
|
const workbook = XLSX.utils.book_new(); |
||||
|
|
||||
|
const time = moment().format('YYYY-MM-DD'); |
||||
|
|
||||
|
XLSX.utils.book_append_sheet(workbook, sheet, 'mySheet'); |
||||
|
// 导出 Excel
|
||||
|
XLSX.writeFile(workbook, fileName ? `${fileName}-${time}.xlsx` : '导出数据.xlsx'); |
||||
|
setExportLoading(false); |
||||
|
// message.success(`成功导出了 ${loopData.length || 0} 条数据`);
|
||||
|
}; |
||||
|
|
||||
|
const exportProExcel = async () => { |
||||
|
setExportLoading(true); |
||||
|
const { |
||||
|
column, data, fileName, exportUrl, exportQuery, exportBody, requestType, showYearMouth, |
||||
|
} = props || {}; |
||||
|
let resultData = []; |
||||
|
if (exportUrl) { |
||||
|
resultData = requestType == 'post' ? await Request.post(exportUrl, exportBody || {}, exportQuery || {}).then((data) => { |
||||
|
// 数据接口返回的结果 如果是对象 必须把返回数组放入rows
|
||||
|
if (typeof data === 'object') { |
||||
|
return data.data ? data.data : data.rows; |
||||
|
} |
||||
|
return data; |
||||
|
}, (err) => { |
||||
|
message.error('获取数据失败,导出失败!'); |
||||
|
}) : await Request.get(exportUrl, exportQuery || {}).then((data) => { |
||||
|
if (showYearMouth) { |
||||
|
|
||||
|
} |
||||
|
if (typeof data === 'object' && data.rows) { |
||||
|
return data.rows; |
||||
|
} |
||||
|
return data; |
||||
|
}, (err) => { |
||||
|
message.error('获取数据失败,导出失败!'); |
||||
|
}); |
||||
|
if (!resultData) { |
||||
|
return; |
||||
|
} |
||||
|
} else { |
||||
|
resultData = data; |
||||
|
} |
||||
|
|
||||
|
const loopData = getDataSource(column, resultData); |
||||
|
|
||||
|
let content = ''; |
||||
|
let header = '<tr>'; |
||||
|
// header += `<th><div>序号</div></th>`;
|
||||
|
column.map((colum) => { |
||||
|
header += `<th><div>${colum.name}</div></th>`; |
||||
|
}); |
||||
|
header += '</tr>'; |
||||
|
loopData.map((data) => { |
||||
|
content += '<tr>'; |
||||
|
column.map((c) => { |
||||
|
if (c.style) { |
||||
|
content += `<th style="${c.style}"><div>${data[c.dataIndex || c.key]}</div></th>`; |
||||
|
} else { |
||||
|
content += `<th><div>${data[c.dataIndex || c.key]}</div></th>`; |
||||
|
} |
||||
|
}); |
||||
|
content += '</tr>'; |
||||
|
}); |
||||
|
|
||||
|
const exportTable = `\uFEFF
|
||||
|
<table style='text-alagin:center' border="1"> |
||||
|
${header} |
||||
|
${content} |
||||
|
</table> |
||||
|
`;
|
||||
|
const time = moment().format('YYYY-MM-DD'); |
||||
|
const tempStrs = new Blob([exportTable], { type: 'text/xls' }); |
||||
|
FileSaver.saveAs(tempStrs, fileName ? `${fileName}-${time}.xls` : '导出数据.xls'); |
||||
|
setExportLoading(false); |
||||
|
// message.success(`成功导出了 ${loopData.length || 0} 条数据`);
|
||||
|
}; |
||||
|
|
||||
|
const exportExcel = async () => { |
||||
|
setExportLoading(true); |
||||
|
const { |
||||
|
column, data, fileName, exportUrl, exportQuery, exportBody, requestType, |
||||
|
} = props || {}; |
||||
|
const _headers = column |
||||
|
.map((item, i) => ({ key: item.key, title: item.name, position: String.fromCharCode(65 + i) + 1 })) |
||||
|
.reduce((prev, next) => ({ ...prev, [next.position]: { key: next.key, v: next.title } }), {}); |
||||
|
let resultData = []; |
||||
|
if (exportUrl) { |
||||
|
resultData = requestType == 'post' ? await Request.post(exportUrl, exportBody || {}, exportQuery || {}).then((data) => { |
||||
|
// 数据接口返回的结果 如果是对象 必须把返回数组放入rows
|
||||
|
|
||||
|
if (typeof data === 'object' && (data.rows || data.data)) { |
||||
|
return data.data ? data.data : data.rows; |
||||
|
} |
||||
|
return data; |
||||
|
}, (err) => { |
||||
|
message.error('获取数据失败,导出失败!'); |
||||
|
}) : await Request.get(exportUrl, exportQuery || {}).then((data) => { |
||||
|
if (typeof data === 'object' && data.rows) { |
||||
|
return data.rows; |
||||
|
} |
||||
|
return data; |
||||
|
}, (err) => { |
||||
|
message.error('获取数据失败,导出失败!'); |
||||
|
}); |
||||
|
if (!resultData) { |
||||
|
return; |
||||
|
} |
||||
|
} else { |
||||
|
resultData = data; |
||||
|
} |
||||
|
|
||||
|
const loopDate = getDataSource(column, resultData); |
||||
|
|
||||
|
const wpx = column.map((c) => ({ |
||||
|
wpx: Number.parseInt(c.wpx) ? Number.parseInt(c.wpx) : 100, |
||||
|
})); |
||||
|
if (!(loopDate.length > 0)) { |
||||
|
setExportLoading(false); |
||||
|
return; |
||||
|
} |
||||
|
const _data = loopDate |
||||
|
.map((item, i) => column.map((key, j) => ({ content: item[key.key], position: String.fromCharCode(65 + j) + (i + 2) }))) |
||||
|
// 对刚才的结果进行降维处理(二维数组变成一维数组)
|
||||
|
.reduce((prev, next) => prev.concat(next)) |
||||
|
// 转换成 worksheet 需要的结构
|
||||
|
.reduce((prev, next) => ({ ...prev, [next.position]: { v: next.content } }), {}); |
||||
|
|
||||
|
// 合并 column 和 data
|
||||
|
const output = { ..._headers, ..._data }; |
||||
|
// 获取所有单元格的位置
|
||||
|
const outputPos = Object.keys(output); |
||||
|
// 计算出范围 ,["A1",..., "H2"]
|
||||
|
const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`; |
||||
|
|
||||
|
// 构建 workbook 对象
|
||||
|
const workbook = { |
||||
|
SheetNames: ['mySheet'], |
||||
|
Sheets: { |
||||
|
mySheet: { |
||||
|
|
||||
|
...output, |
||||
|
'!ref': ref, |
||||
|
'!cols': wpx, |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
const time = moment().format('YYYY-MM-DD'); |
||||
|
// 导出 Excel
|
||||
|
XLSX.writeFile(workbook, fileName ? `${fileName}-${time}.xlsx` : '导出数据.xlsx'); |
||||
|
setExportLoading(false); |
||||
|
// message.success(`成功导出了 ${loopDate.length || 0} 条数据`);
|
||||
|
}; |
||||
|
|
||||
|
const exportTemplete = async () => { |
||||
|
const { importTemColumn, importTemData, fileName } = props || {}; |
||||
|
const _headers = importTemColumn |
||||
|
.map((item, i) => { |
||||
|
let group = 0; // 用于处理Z1的时候,重计算AA1
|
||||
|
if (parseInt(i / 26) > group) { |
||||
|
group = parseInt(i / 26); |
||||
|
} |
||||
|
if (group > 0) { // AA1 BA1 CA1
|
||||
|
const position = String.fromCharCode(65 + (group - 1)); |
||||
|
return { key: item.key, title: item.name, position: position + String.fromCharCode(65 + (i % 26)) + 1 }; |
||||
|
} return { key: item.key, title: item.name, position: String.fromCharCode(65 + i) + 1 }; |
||||
|
}) |
||||
|
.reduce((prev, next) => ({ ...prev, [next.position]: { key: next.key, v: next.title } }), {}); |
||||
|
|
||||
|
const loopDate = getDataSource(importTemColumn, importTemData); |
||||
|
|
||||
|
const wpx = importTemColumn.map((c) => ({ |
||||
|
wpx: Number.parseInt(c.wpx) ? Number.parseInt(c.wpx) : 100, |
||||
|
})); |
||||
|
const _data = loopDate.length ? loopDate |
||||
|
.map((item, i) => importTemColumn.map((key, j) => ({ content: item[key.key], position: String.fromCharCode(65 + j) + (i + 2) }))) |
||||
|
// 对刚才的结果进行降维处理(二维数组变成一维数组)
|
||||
|
.reduce((prev, next) => prev.concat(next)) |
||||
|
// 转换成 worksheet 需要的结构
|
||||
|
.reduce((prev, next) => ({ ...prev, [next.position]: { v: next.content } }), {}) : []; |
||||
|
// 合并 column 和 data
|
||||
|
const output = { ..._headers, ..._data }; |
||||
|
// 获取所有单元格的位置
|
||||
|
const outputPos = Object.keys(output); |
||||
|
// 计算出范围 ,["A1",..., "H2"]
|
||||
|
const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`; |
||||
|
|
||||
|
// 构建 workbook 对象
|
||||
|
const workbook = { |
||||
|
SheetNames: ['mySheet'], |
||||
|
Sheets: { |
||||
|
mySheet: { |
||||
|
|
||||
|
...output, |
||||
|
'!ref': ref, |
||||
|
'!cols': wpx, |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
// 导出 Excel
|
||||
|
XLSX.writeFile(workbook, fileName ? `${fileName}-导入模板.xlsx` : '导入模板.xlsx'); |
||||
|
}; |
||||
|
const tips = (type) => { |
||||
|
const { tips, templeteBth = true } = props; |
||||
|
const description = ( |
||||
|
<div className="export-import"> |
||||
|
{tips && tips} |
||||
|
<Row gutter={16}> |
||||
|
<Col span={12}> |
||||
|
<Form form={form} initialValues={{}}> |
||||
|
<Form.Item name="import-file"> |
||||
|
<Input className="file-uploader" type="file" accept=".xlsx, .xls" onChange={(e) => importExcel(e, type)} /> |
||||
|
<Button style={props.btnStyle} className={props.btnClass} loading={importLoading}> |
||||
|
选择文件 |
||||
|
</Button> |
||||
|
</Form.Item> |
||||
|
</Form> |
||||
|
</Col> |
||||
|
{templeteBth && ( |
||||
|
<Col span={12}> |
||||
|
<Button style={props.btnStyle} className={props.btnClass} onClick={exportTemplete}> |
||||
|
模板下载 |
||||
|
</Button> |
||||
|
</Col> |
||||
|
)} |
||||
|
</Row> |
||||
|
</div> |
||||
|
); |
||||
|
|
||||
|
notification.info({ |
||||
|
message: '支持 .xlsx、.xls 格式的文件', |
||||
|
description, |
||||
|
key: 'import-notification', |
||||
|
duration: null, |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
return ( |
||||
|
<Space> |
||||
|
{ |
||||
|
props.import && ( |
||||
|
<Button style={props.btnStyle} className={props.btnClass} loading={importLoading} onClick={tips}> |
||||
|
{props.importBtnName || '导入'} |
||||
|
</Button> |
||||
|
) |
||||
|
} |
||||
|
{ |
||||
|
props.export && ( |
||||
|
<Tooltip placement="top" title={props.exportBtnTips || '默认导出所有数据'}> |
||||
|
<Button style={props.btnStyle} className={props.btnClass} loading={exportLoading} onClick={props.exportType === 'pro' ? exportProExcel : exportExcel}> |
||||
|
{props.exportBtnName || '导出'} |
||||
|
</Button> |
||||
|
</Tooltip> |
||||
|
) |
||||
|
} |
||||
|
</Space> |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
ExportAndImport.propTypes = { |
||||
|
export: PropTypes.bool, // 是否显示导出按钮
|
||||
|
exportBtnName: PropTypes.string, // 导出按钮文字
|
||||
|
importBtnName: PropTypes.string, // 导入按钮文字
|
||||
|
import: PropTypes.bool, // 是否显示导入按钮
|
||||
|
variedImport: PropTypes.bool, // 是否显示多样导入
|
||||
|
variedImportDisable: PropTypes.bool, // 多样导入禁用
|
||||
|
variedImportBtnName: PropTypes.string, // 多样导入文字
|
||||
|
column: PropTypes.array, // 导出显示的header数组 兼容antd column 可直接拿table的column使用 注:column每列的属性wpx设置导出的execl每列的宽度值 默认 100
|
||||
|
data: PropTypes.array, // 导出的数据 兼容antd table 数组嵌套处理
|
||||
|
exportUrl: PropTypes.string, // 导出数据从接口获取的url地址 返回的数据1、数组必须支持column的设置 ,2、如果是对象,数组需放在rows属性上
|
||||
|
exportBody: PropTypes.object, // 导出数据接口body参数
|
||||
|
exportQuery: PropTypes.object, // 导出数据从接口获取的url地址上的参数
|
||||
|
exportBtnTips: PropTypes.string, // 导出按钮tips文字提示
|
||||
|
importUrl: PropTypes.string, // 导入接口url
|
||||
|
importQuery: PropTypes.object, // 导入接口url地址上的参数
|
||||
|
btnClass: PropTypes.string, // 按钮className
|
||||
|
btnStyle: PropTypes.object, // 按钮style
|
||||
|
tips: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), // 上传文件提示的信息
|
||||
|
onImportSucess: PropTypes.func, // 上传成功后 返回处理函数
|
||||
|
importTemColumn: PropTypes.array, // 导入模板设置 头部字段数组
|
||||
|
importTemData: PropTypes.array, // 导入模板默认数据
|
||||
|
requestType: PropTypes.string, // 请求类型
|
||||
|
importDataCallback: PropTypes.func, // 上传后数据返回
|
||||
|
templeteBth: PropTypes.bool, // 模板按钮
|
||||
|
importRequest: PropTypes.bool, // 请求导入接口,false时搭配importDataCallback,
|
||||
|
exportType: PropTypes.string, // 导出执行的函数名
|
||||
|
}; |
||||
|
|
||||
|
export default ExportAndImport; |
@ -0,0 +1,13 @@ |
|||||
|
.export-import { |
||||
|
.file-uploader { |
||||
|
position: absolute; |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
outline: none; |
||||
|
opacity: 0; |
||||
|
background-color: transparent; |
||||
|
z-index: 10; |
||||
|
} |
||||
|
} |
@ -0,0 +1,74 @@ |
|||||
|
'use strict'; |
||||
|
import React, { Component } from 'react'; |
||||
|
import { Table } from 'antd'; |
||||
|
import './index.less'; |
||||
|
import moment from 'moment'; |
||||
|
|
||||
|
class FlowRecordTable extends Component { |
||||
|
constructor(props) { |
||||
|
super(props); |
||||
|
this.state = { |
||||
|
isRequesting: false, |
||||
|
pagination: { |
||||
|
showTotal: total => `共${total}条`, |
||||
|
responsive: true, |
||||
|
defaultPageSize: 10, |
||||
|
}, |
||||
|
data: [] |
||||
|
} |
||||
|
this.token = JSON.parse(sessionStorage.getItem('user')).token; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
getPagination = () => { |
||||
|
const { pagination, data } = this.state; |
||||
|
const { actiPage } = this.props; |
||||
|
pagination.total = data.length > 0 ? data.length : 0; |
||||
|
pagination.current = actiPage; |
||||
|
return pagination; |
||||
|
}; |
||||
|
|
||||
|
onTableChange = (pagination, filters, sorter) => { |
||||
|
this.props.onPageChange(pagination.current) |
||||
|
} |
||||
|
componentDidMount() { |
||||
|
} |
||||
|
render() { |
||||
|
const { flowRecord } = this.props; |
||||
|
const tableColumnAttrs = [ |
||||
|
{ |
||||
|
title: '序号', |
||||
|
dataIndex: 'id', |
||||
|
width: '12%', |
||||
|
render: (text, record, index) => { return index + 1 } |
||||
|
}, |
||||
|
{ |
||||
|
title: '操作人', |
||||
|
dataIndex: 'processBy', |
||||
|
width: '25%', |
||||
|
}, |
||||
|
{ |
||||
|
title: '操作时间', |
||||
|
dataIndex: 'processAt', |
||||
|
width: '25%', |
||||
|
render: (text, record, index) => { return moment(text).format('YYYY-MM-DD HH:mm') } |
||||
|
}, { |
||||
|
title: '操作内容', |
||||
|
dataIndex: 'processContent', |
||||
|
width: '38%', |
||||
|
}, |
||||
|
]; |
||||
|
return ( |
||||
|
<Table |
||||
|
rowKey="id" |
||||
|
className={'fs-table'} |
||||
|
dataSource={flowRecord} |
||||
|
columns={tableColumnAttrs} |
||||
|
onChange={this.onTableChange} |
||||
|
pagination={this.getPagination()} |
||||
|
/> |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export default FlowRecordTable; |
@ -0,0 +1,27 @@ |
|||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
import Upload from './Upload'; |
||||
|
import Uploads from './Uploads'; |
||||
|
import NoResource from './no-resource'; |
||||
|
import LimitTextArea from './limit-textarea'; |
||||
|
// import ProcessForm from './process_form'
|
||||
|
import FlowRecordTable from './flowRecordTable' |
||||
|
import Table from './table' |
||||
|
import Search from './search' |
||||
|
import SketchColor from './sketchColor' |
||||
|
import ExportAndImport from './export' |
||||
|
|
||||
|
export { |
||||
|
Upload, |
||||
|
Uploads, |
||||
|
NoResource, |
||||
|
LimitTextArea, |
||||
|
// ProcessForm,
|
||||
|
FlowRecordTable, |
||||
|
Table, |
||||
|
Search, |
||||
|
SketchColor, |
||||
|
ExportAndImport, |
||||
|
|
||||
|
}; |
@ -0,0 +1,70 @@ |
|||||
|
import React, { PureComponent } from 'react'; |
||||
|
import { Input } from 'antd'; |
||||
|
const { TextArea } = Input; |
||||
|
import './index.less'; |
||||
|
|
||||
|
/*** |
||||
|
* 显示最大输入字符数 |
||||
|
* maxLength:300(默认) |
||||
|
*/ |
||||
|
class LimitTextArea extends PureComponent { |
||||
|
|
||||
|
constructor(props) { |
||||
|
super(props) |
||||
|
this.state = { |
||||
|
len: 0, |
||||
|
maxLength: 300, |
||||
|
isvalid: true, // 是否显示最大字符数
|
||||
|
} |
||||
|
// 若需要覆盖onChange时,value必填
|
||||
|
if (props.onChange && !props.hasOwnProperty('value')) { |
||||
|
this.state.isvalid = false |
||||
|
console.warn('LimitTextArea:绑定onChange时,value属性必填,否则显示最大输入字符数将失效!') |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 若外部定义了onChange事件,handleChange将会被覆盖
|
||||
|
handleChange = (e) => { |
||||
|
const { sep } = this.props |
||||
|
const val = e.target.value |
||||
|
const arr = (val || '').split(sep) |
||||
|
this.setState({ |
||||
|
len: arr.length |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
render () { |
||||
|
const { maxLength: defaultMax, isvalid } = this.state |
||||
|
const { sep, maxLength, value, ...restProps } = this.props |
||||
|
const max = maxLength > 0 ? maxLength : defaultMax |
||||
|
/** form组件中,value有值 */ |
||||
|
const arr = (value || '').split(sep) |
||||
|
let len = value ? arr.length : this.state.len |
||||
|
len = len > max ? max : len |
||||
|
/**截取最大字符串 */ |
||||
|
const val = arr.slice(0, len).join(sep) |
||||
|
const n = val ? len : 0 |
||||
|
const suffix = `${n}/${max}` |
||||
|
|
||||
|
return isvalid ? ( |
||||
|
<div className={'block'}> |
||||
|
<TextArea |
||||
|
onChange={ e => this.handleChange(e) } |
||||
|
value={val} |
||||
|
{ ...restProps } |
||||
|
/> |
||||
|
<span className={'counter'}>{suffix}</span> |
||||
|
</div> |
||||
|
) : <TextArea { ...this.props } /> |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
LimitTextArea.defaultProps = { |
||||
|
/** 分割符 |
||||
|
* 可以是个字符串,如:'\n' |
||||
|
* 也可以是个正则表达式,如:/\n\r/ |
||||
|
*/ |
||||
|
sep: '' |
||||
|
} |
||||
|
|
||||
|
export default LimitTextArea; |