commit
8798bb44d9
103 changed files with 21397 additions and 0 deletions
@ -0,0 +1,3 @@ |
||||
> 1% |
||||
last 2 versions |
||||
not ie <= 8 |
@ -0,0 +1,22 @@ |
||||
.DS_Store |
||||
node_modules |
||||
/dist |
||||
example.html |
||||
favicon.ico |
||||
# local env files |
||||
.env.local |
||||
.env.*.local |
||||
|
||||
# Log files |
||||
npm-debug.log* |
||||
yarn-debug.log* |
||||
yarn-error.log* |
||||
|
||||
# Editor directories and files |
||||
.idea |
||||
.vscode |
||||
*.suo |
||||
*.ntvs* |
||||
*.njsproj |
||||
*.sln |
||||
*.sw* |
@ -0,0 +1,6 @@ |
||||
{ |
||||
"tabWidth": 4, |
||||
"singleQuote": true, |
||||
"trailingComma": "none", |
||||
"printWidth": 140 |
||||
} |
@ -0,0 +1,21 @@ |
||||
MIT License |
||||
|
||||
Copyright (c) 2016-2019 vue-manage-system |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
@ -0,0 +1,5 @@ |
||||
module.exports = { |
||||
presets: [ |
||||
'@vue/app' |
||||
] |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,41 @@ |
||||
{ |
||||
"name": "vue-manage-system", |
||||
"version": "4.2.0", |
||||
"private": true, |
||||
"scripts": { |
||||
"dev": "npm run serve", |
||||
"serve": "vue-cli-service serve", |
||||
"build": "vue-cli-service build" |
||||
}, |
||||
"dependencies": { |
||||
"axios": "^0.26.1", |
||||
"babel-polyfill": "^6.26.0", |
||||
"core-js": "^2.6.10", |
||||
"echarts": "^4.9.0", |
||||
"element-theme": "^2.0.1", |
||||
"element-ui": "^2.15.6", |
||||
"html2canvas": "^1.3.2", |
||||
"js-cookie": "^2.2.1", |
||||
"jspdf": "^2.4.0", |
||||
"mavon-editor": "^2.9.1", |
||||
"vue": "^2.6.14", |
||||
"vue-cropperjs": "^3.0.0", |
||||
"vue-i18n": "^8.26.5", |
||||
"vue-pdf": "^4.3.0", |
||||
"vue-quill-editor": "^3.0.6", |
||||
"vue-router": "^3.5.3", |
||||
"vuedraggable": "^2.24.3", |
||||
"vuex": "^3.6.2", |
||||
"wow.js": "^1.2.2" |
||||
}, |
||||
"devDependencies": { |
||||
"@vue/cli-plugin-babel": "^3.9.0", |
||||
"@vue/cli-service": "^3.9.0", |
||||
"browserslist": "^4.17.5", |
||||
"caniuse-lite": "^1.0.30001271", |
||||
"element-theme-chalk": "^2.15.6", |
||||
"node-sass": "^4.14.0", |
||||
"sass-loader": "^8.0.2", |
||||
"vue-template-compiler": "^2.6.14" |
||||
} |
||||
} |
@ -0,0 +1,5 @@ |
||||
module.exports = { |
||||
plugins: { |
||||
autoprefixer: {} |
||||
} |
||||
} |
@ -0,0 +1,21 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="keywords" content="职站,教学,教育,在线编程"> |
||||
<meta name="description" content="职站是一款辅助院校教师开展虚拟仿真实验教学的智能云实践平台。平台采用了大数据,云计算等技术,为学校搭建信息化平台提供了基础,可助力院校实现教学智能化升级。职站平台设计遵循着极简、高效的理念,可帮助老师轻松开展实验教学,并支持自定义发布考核和练习,智能统计和检验学生的日常实训练习效果;老师还可以通过可视化图表报告直观查看学生实训成绩,评估教学成果。"/> |
||||
<meta name="baidu-site-verification" content="code-TRfXe8xIkJ" /> |
||||
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"> |
||||
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css"> |
||||
<title>粒子研究院</title> |
||||
</head> |
||||
<body> |
||||
<noscript> |
||||
<strong>We're sorry but vms doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
||||
</noscript> |
||||
<div id="app"></div> |
||||
<!-- built files will be auto injected --> |
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,25 @@ |
||||
<template> |
||||
<div id="app"> |
||||
<router-view></router-view> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import Setting from "@/setting"; |
||||
import util from "@/libs/util"; |
||||
|
||||
export default { |
||||
name: "App", |
||||
created() { |
||||
//在页面加载时读取localStorage里的状态信息 |
||||
if (util.local.get(Setting.storeKey)) { |
||||
this.$store.replaceState(Object.assign({}, this.$store.state, util.local.get(Setting.storeKey))); |
||||
} |
||||
|
||||
//在页面刷新时将vuex里的信息保存到localStorage里 |
||||
window.addEventListener("beforeunload", () => { |
||||
util.local.get(Setting.tokenKey) && util.local.set(Setting.storeKey, this.$store.state); |
||||
}); |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,5 @@ |
||||
export default { |
||||
getTableByCondition:`data/data/table/getTableByCondition`, |
||||
queryDatabaseInfo:`data/data/dataRecord/queryDatabaseInfo`, |
||||
previewData:`data/data/preview`, |
||||
} |
After Width: | Height: | Size: 877 B |
After Width: | Height: | Size: 562 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 527 B |
@ -0,0 +1,64 @@ |
||||
<template> |
||||
<!-- 面包屑 --> |
||||
<div class="breadcrumb"> |
||||
<el-breadcrumb separator=">"> |
||||
<template v-for="(item, index) in pages"> |
||||
<el-breadcrumb-item |
||||
v-if="index != pages.length - 1" |
||||
:key="index" |
||||
:to="{ path: route, query }"> |
||||
{{item}} |
||||
</el-breadcrumb-item> |
||||
<el-breadcrumb-item |
||||
v-else |
||||
:key="index"> |
||||
{{item}} |
||||
</el-breadcrumb-item> |
||||
</template> |
||||
</el-breadcrumb> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
props: { |
||||
data: { |
||||
type: String, |
||||
required: true |
||||
}, |
||||
route: { |
||||
type: String, |
||||
default: 'list' |
||||
}, |
||||
query: { |
||||
type: Object |
||||
} |
||||
}, |
||||
data() { |
||||
return { |
||||
pages: this.data.split('/') |
||||
}; |
||||
}, |
||||
methods: { |
||||
update(data){ |
||||
this.pages = data.split('/') |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.breadcrumb { |
||||
margin: 4px 0 16px; |
||||
/deep/.el-breadcrumb__item { |
||||
.is-link, .el-breadcrumb__separator { |
||||
font-weight: 400; |
||||
color: $main-color; |
||||
} |
||||
&:last-child { |
||||
.is-link { |
||||
color: #0B1D30; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,134 @@ |
||||
<template> |
||||
<div> |
||||
<el-dialog |
||||
custom-class="pdf-dia" |
||||
:close-on-click-modal="false" |
||||
:visible.sync="visible" |
||||
@close="closePdf" |
||||
:fullscreen="true" |
||||
:modal="false" |
||||
:append-to-body="true"> |
||||
<div> |
||||
<button type="button" aria-label="Close" class="el-dialog__headerbtn" @click="closePdf"><i |
||||
class="el-dialog__close el-icon el-icon-close"></i></button> |
||||
<div class="pdf"> |
||||
<p class="arrow"> |
||||
<span @click="changePdfPage(0)" class="turn el-icon-arrow-left" |
||||
:class="{grey: currentPage==1}"></span> |
||||
{{ currentPage }} / {{ pageCount }} |
||||
<span @click="changePdfPage(1)" class="turn el-icon-arrow-right" |
||||
:class="{grey: currentPage==pageCount}"></span> |
||||
</p> |
||||
<pdf |
||||
class="pdf-wrap" |
||||
:src="src" |
||||
:page="currentPage" |
||||
@num-pages="pageCount=$event" |
||||
@page-loaded="currentPage=$event" |
||||
@loaded="loadPdfHandler" |
||||
> |
||||
</pdf> |
||||
</div> |
||||
</div> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import pdf from "vue-pdf"; |
||||
|
||||
export default { |
||||
props: ["visible", "src"], |
||||
data() { |
||||
return { |
||||
pdfVisible: false, |
||||
pdfSrc: "", |
||||
currentPage: 0, |
||||
pageCount: 0, |
||||
fileType: "pdf" |
||||
}; |
||||
}, |
||||
components: { pdf }, |
||||
mounted() { |
||||
this.addEvent(); |
||||
}, |
||||
methods: { |
||||
closePdf() { |
||||
this.$emit("update:visible", false); |
||||
this.$emit("update:src", ""); |
||||
this.currentPage = 1; |
||||
}, |
||||
changePdfPage(val) { |
||||
if (val === 0 && this.currentPage > 1) { |
||||
this.currentPage--; |
||||
} |
||||
if (val === 1 && this.currentPage < this.pageCount) { |
||||
this.currentPage++; |
||||
} |
||||
}, |
||||
loadPdfHandler(e) { |
||||
this.currentPage = 1; |
||||
}, |
||||
addEvent() { |
||||
document.onkeydown = e => { |
||||
let key = window.event.keyCode; |
||||
if (key == 37) { |
||||
this.changePdfPage(0); |
||||
} else if (key == 39) { |
||||
this.changePdfPage(1); |
||||
} |
||||
}; |
||||
this.$once("hook:beforeDestroy", () => { |
||||
document.onkeydown = null; |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
/deep/ .pdf-dia { |
||||
border-radius: 0 !important; |
||||
|
||||
.el-dialog__header { |
||||
display: none; |
||||
} |
||||
|
||||
.el-dialog__body { |
||||
padding: 0; |
||||
} |
||||
|
||||
.el-dialog__headerbtn { |
||||
top: 10px; |
||||
|
||||
.el-dialog__close { |
||||
color: #fff; |
||||
font-size: 16px; |
||||
} |
||||
} |
||||
|
||||
.pdf { |
||||
.arrow { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
width: 100%; |
||||
padding: 10px 0; |
||||
font-size: 16px; |
||||
color: #fff; |
||||
background-color: #333; |
||||
|
||||
.turn { |
||||
margin: 0 10px; |
||||
font-size: 18px; |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
|
||||
.pdf-wrap { |
||||
height: calc(100vh - 45px); |
||||
margin: 0 auto; |
||||
overflow: auto; |
||||
} |
||||
} |
||||
} |
||||
|
||||
</style> |
@ -0,0 +1,255 @@ |
||||
<template> |
||||
<div class="quill" ref="quill" :class="classes"> |
||||
<div ref="editor" :style="styles" v-loading="loading"></div> |
||||
|
||||
<el-upload |
||||
:headers="headers" |
||||
:action="this.api.fileupload" |
||||
:before-upload="beforeUpload" |
||||
:on-success="editorUploadSuccess" |
||||
style="display: none" |
||||
> |
||||
<el-button class="editorUpload" type="primary">点击上传</el-button> |
||||
</el-upload> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import util from "@/libs/util"; |
||||
import Setting from "@/setting"; |
||||
import Quill from "quill"; |
||||
import "quill/dist/quill.core.css"; |
||||
import "quill/dist/quill.snow.css"; |
||||
import "quill/dist/quill.bubble.css"; |
||||
import toolbarOptions from "./options"; |
||||
|
||||
export default { |
||||
name: "quill", |
||||
props: { |
||||
value: { |
||||
type: String, |
||||
default: "" |
||||
}, |
||||
readonly: { |
||||
type: Boolean, |
||||
default: false |
||||
}, |
||||
toTop: { |
||||
type: Boolean, |
||||
default: true |
||||
}, |
||||
border: { |
||||
type: Boolean, |
||||
default: false |
||||
}, |
||||
height: { |
||||
type: Number |
||||
}, |
||||
minHeight: { |
||||
type: Number |
||||
}, |
||||
/* |
||||
* 原本的readOnly失效,对比其他项目,发现是quill版本不同导致, |
||||
* 使用props传入elseRead = 'true',手动隐藏工具栏 |
||||
*/ |
||||
elseRead: { |
||||
type: String, default: "false" |
||||
} |
||||
}, |
||||
data() { |
||||
return { |
||||
headers: { |
||||
token: util.local.get(Setting.tokenKey) |
||||
}, |
||||
Quill: null, |
||||
currentValue: "", |
||||
options: { |
||||
theme: "snow", |
||||
bounds: document.body, |
||||
debug: "warn", |
||||
modules: { |
||||
toolbar: { |
||||
container: toolbarOptions, |
||||
handlers: { |
||||
"image": function(value) { |
||||
if (value) { |
||||
// 调用iview图片上传 |
||||
document.querySelector(".editorUpload").click(); |
||||
} else { |
||||
this.Quill.format("image", false); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
placeholder: "", |
||||
readOnly: this.readonly |
||||
}, |
||||
loading: false |
||||
}; |
||||
}, |
||||
computed: { |
||||
classes() { |
||||
return [ |
||||
{ |
||||
"quill-no-border": !this.border |
||||
} |
||||
]; |
||||
}, |
||||
styles() { |
||||
let style = {}; |
||||
if (this.minHeight) { |
||||
style.minHeight = `${this.minHeight}px`; |
||||
} |
||||
if (this.height) { |
||||
style.height = `${this.height}px`; |
||||
} |
||||
return style; |
||||
} |
||||
|
||||
}, |
||||
watch: { |
||||
value: { |
||||
handler(val) { |
||||
if (val !== this.currentValue) { |
||||
this.currentValue = val; |
||||
if (this.Quill) { |
||||
this.Quill.pasteHTML(this.value); |
||||
} |
||||
} |
||||
}, |
||||
immediate: true |
||||
} |
||||
}, |
||||
created() { |
||||
}, |
||||
mounted() { |
||||
this.init(); |
||||
// 处理工具栏隐藏样式 |
||||
if (this.elseRead === "true") { |
||||
let children = this.$refs.quill.children[0].style; |
||||
children.padding = "0"; |
||||
children.overflow = "hidden"; |
||||
children.height = "0"; |
||||
children.borderTop = "0"; |
||||
} |
||||
}, |
||||
beforeDestroy() { |
||||
// 在组件销毁后销毁实例 |
||||
this.Quill = null; |
||||
}, |
||||
methods: { |
||||
init () { |
||||
const editor = this.$refs.editor; |
||||
// 初始化编辑器 |
||||
this.Quill = new Quill(editor, this.options); |
||||
const ins = this.Quill |
||||
// 默认值 |
||||
ins.pasteHTML(this.currentValue); |
||||
if(this.toTop){ |
||||
this.$nextTick(() => { |
||||
window.scrollTo(0,0) |
||||
}) |
||||
} |
||||
// 绑定事件 |
||||
ins.on('text-change', (delta, oldDelta, source) => { |
||||
const html = this.$refs.editor.children[0].innerHTML; |
||||
const text = ins.getText(); |
||||
const quill = this.Quill; |
||||
// 更新内部的值 |
||||
this.currentValue = html; |
||||
// 发出事件 v-model |
||||
this.$emit('input', html); |
||||
// 发出事件 |
||||
this.$emit('on-change', { html, text, quill }); |
||||
}); |
||||
// 将一些 quill 自带的事件传递出去 |
||||
ins.on('text-change', (delta, oldDelta, source) => { |
||||
this.$emit('on-text-change', delta, oldDelta, source); |
||||
}); |
||||
ins.on('selection-change', (range, oldRange, source) => { |
||||
this.$emit('on-selection-change', range, oldRange, source); |
||||
}); |
||||
ins.on('editor-change', (eventName, ...args) => { |
||||
this.$emit('on-editor-change', eventName, ...args); |
||||
}); |
||||
// 监听粘贴事件 |
||||
ins.root.addEventListener('paste', evt => { |
||||
if (evt.clipboardData && evt.clipboardData.files && evt.clipboardData.files.length) { |
||||
evt.preventDefault(); |
||||
// 检测是否粘贴的是图片 |
||||
[].forEach.call(evt.clipboardData.files, file => { |
||||
if (!file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) { |
||||
return |
||||
} |
||||
const param = new FormData() |
||||
param.append('file', file) |
||||
// 把图片上传到服务器,不然会直接把base64存到数据库 |
||||
this.$post(this.api.fileupload, param, { |
||||
headers: { "Content-Type": "multipart/form-data" } |
||||
}).then(res => { |
||||
var range = ins.getSelection() |
||||
if (range) { |
||||
// 在当前光标位置插入图片 |
||||
ins.insertEmbed(range.index, 'image', res.data.filesResult.fileUrl) |
||||
// 将光标移动到图片后面 |
||||
ins.setSelection(range.index + 1) |
||||
} |
||||
}).catch(res => {}) |
||||
}); |
||||
} |
||||
}, false) |
||||
}, |
||||
beforeUpload(file) { |
||||
this.loading = true; |
||||
}, |
||||
editorUploadSuccess(res) { |
||||
// 获取富文本组件实例 |
||||
let quill = this.Quill; |
||||
// 如果上传成功 |
||||
if (res.data.filesResult.fileUrl) { |
||||
// 获取光标所在位置 |
||||
let length = quill.getSelection().index; |
||||
// 插入图片,res为服务器返回的图片链接地址 |
||||
quill.insertEmbed(length, "image", res.data.filesResult.fileUrl); |
||||
// 调整光标到最后 |
||||
quill.setSelection(length + 1); |
||||
} else { |
||||
util.successMsg("图片插入失败"); |
||||
} |
||||
this.loading = false; |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.quill-no-border { |
||||
.ql-toolbar.ql-snow { |
||||
border: none; |
||||
border-bottom: 1px solid #e8eaec; |
||||
} |
||||
|
||||
.ql-container.ql-snow { |
||||
border: none; |
||||
} |
||||
} |
||||
|
||||
.else { |
||||
.ql-toolbar.ql-snow { |
||||
height: 0; |
||||
overflow: hidden; |
||||
padding: 0; |
||||
border-top: 0; |
||||
} |
||||
} |
||||
/deep/.ql-snow { |
||||
position: relative; |
||||
.ql-tooltip { |
||||
position: absolute !important; |
||||
top: 10px !important; |
||||
left: 10px !important; |
||||
transform: translateY(10px); |
||||
} |
||||
} |
||||
|
||||
</style> |
@ -0,0 +1,16 @@ |
||||
export default [ |
||||
["bold", "italic", "underline", "strike"], |
||||
["blockquote", "code-block"], |
||||
[{ "header": 1 }, { "header": 2 }], |
||||
[{ "list": "ordered" }, { "list": "bullet" }], |
||||
[{ "script": "sub" }, { "script": "super" }], |
||||
[{ "indent": "-1" }, { "indent": "+1" }], |
||||
[{ "direction": "rtl" }], |
||||
[{ "size": ["small", false, "large", "huge"] }], |
||||
[{ "header": [1, 2, 3, 4, 5, 6, false] }], |
||||
[{ "color": [] }, { "background": [] }], |
||||
[{ "font": [] }], |
||||
[{ "align": [] }], |
||||
["clean"], |
||||
["link", "image", "video"] |
||||
]; |
@ -0,0 +1,30 @@ |
||||
export const messages = { |
||||
"zh": { |
||||
i18n: { |
||||
breadcrumb: "国际化产品", |
||||
tips: "通过切换语言按钮,来改变当前内容的语言。", |
||||
btn: "切换英文", |
||||
title1: "常用用法", |
||||
p1: "要是你把你的秘密告诉了风,那就别怪风把它带给树。", |
||||
p2: "没有什么比信念更能支撑我们度过艰难的时光了。", |
||||
p3: "只要能把自己的事做好,并让自己快乐,你就领先于大多数人了。", |
||||
title2: "组件插值", |
||||
info: "Element组件需要国际化,请参考 {action}。", |
||||
value: "文档" |
||||
} |
||||
}, |
||||
"en": { |
||||
i18n: { |
||||
breadcrumb: "International Products", |
||||
tips: "Click on the button to change the current language. ", |
||||
btn: "Switch Chinese", |
||||
title1: "Common usage", |
||||
p1: "If you reveal your secrets to the wind you should not blame the wind for revealing them to the trees.", |
||||
p2: "Nothing can help us endure dark times better than our faith. ", |
||||
p3: "If you can do what you do best and be happy, you're further along in life than most people.", |
||||
title2: "Component interpolation", |
||||
info: "The default language of Element is Chinese. If you wish to use another language, please refer to the {action}.", |
||||
value: "documentation" |
||||
} |
||||
} |
||||
}; |
@ -0,0 +1,56 @@ |
||||
<template> |
||||
<div class="footer"> |
||||
<div class="info" v-if="isIndex"> |
||||
<span class="m-r-20">客服邮箱:service@huorantech.cn</span> |
||||
</div> |
||||
<div class="copyright"> |
||||
<span v-if="isIndex">© Copyright 2021 Occupation Lab 职站</span> |
||||
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">粤ICP备20072679号</a> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import Setting from "@/setting"; |
||||
export default { |
||||
data() { |
||||
return { |
||||
isIndex: this.$route.path !== '/login' && Setting.whiteList.some(e => e === this.$route.path) // 官网3个页面才能显示邮箱和版权号 |
||||
}; |
||||
}, |
||||
mounted(){ |
||||
|
||||
}, |
||||
methods: { |
||||
|
||||
}, |
||||
}; |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.footer{ |
||||
padding: 17px 0 9px; |
||||
text-align: center; |
||||
background-color: #0F1D2E; |
||||
.info{ |
||||
margin-bottom: 7px; |
||||
font-size: 14px; |
||||
line-height: 20px; |
||||
color: #D7DFE7; |
||||
} |
||||
.copyright{ |
||||
font-size: 12px; |
||||
text-align: center; |
||||
line-height: 17px; |
||||
span{ |
||||
margin-right: 20px; |
||||
color: #757F8A; |
||||
} |
||||
a{ |
||||
color:#757F8A; |
||||
font-size: 12px; |
||||
&:hover{ |
||||
color: #c7c7c7; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,86 @@ |
||||
<template> |
||||
<div class="header"> |
||||
<a class="logo" @click="toIndex"> |
||||
<img src="@/assets/images/logo.png" alt=""> |
||||
深圳中能高重复自由电子激光 |
||||
</a> |
||||
<navbar ref="nav"></navbar> |
||||
<div class="tools"> |
||||
<img class="search" src="@/assets/images/search.png" alt=""> |
||||
<img src="@/assets/images/cn.png" alt=""> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import { mapState, mapMutations, mapActions } from "vuex"; |
||||
import Setting from "@/setting"; |
||||
import util from "@/libs/util"; |
||||
import navbar from "../navbar"; |
||||
export default { |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
}, |
||||
components: { |
||||
navbar |
||||
}, |
||||
mounted() { |
||||
|
||||
}, |
||||
methods: { |
||||
toIndex() { |
||||
this.$refs.nav.jump({ |
||||
index: '/index/list' |
||||
}) |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
<style scoped lang="scss"> |
||||
$height: 90px; |
||||
.header { |
||||
z-index: 10; |
||||
position: fixed; |
||||
top: 0; |
||||
left: 0; |
||||
width: 100%; |
||||
min-width: $min-width; |
||||
height: $height; |
||||
background-color: #fff; |
||||
box-shadow: 0px 2px 9px 0px rgba(221,221,221,0.18); |
||||
.logo{ |
||||
position: absolute; |
||||
top: 0; |
||||
left: 167px; |
||||
font-size: 20px; |
||||
color: #333330; |
||||
line-height: $height; |
||||
cursor: pointer; |
||||
img { |
||||
margin-right: 10px; |
||||
} |
||||
} |
||||
.tools { |
||||
position: absolute; |
||||
top: 30px; |
||||
right: 240px; |
||||
img { |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
.search { |
||||
margin-right: 43px; |
||||
} |
||||
} |
||||
@media (max-width: 1430px) { |
||||
.header { |
||||
.logo { |
||||
left: 20px; |
||||
} |
||||
.inner { |
||||
padding-right: 20px; |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,62 @@ |
||||
<template> |
||||
<div class="main"> |
||||
<v-head></v-head> |
||||
<div class="layout"> |
||||
<div class="content"> |
||||
<transition name="move" mode="out-in"> |
||||
<router-view class="view"></router-view> |
||||
</transition> |
||||
<el-backtop target=".content"></el-backtop> |
||||
<!-- <v-footer ref="footer"></v-footer> --> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import util from "@/libs/util"; |
||||
import Setting from "@/setting"; |
||||
import vHead from "../header"; |
||||
import vFooter from "../footer"; |
||||
export default { |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
}, |
||||
components: { |
||||
vHead, |
||||
vFooter |
||||
}, |
||||
mounted() { |
||||
|
||||
}, |
||||
methods: { |
||||
// 长时间未操作,自动退出登录 |
||||
autoLogout() { |
||||
let lastTime = new Date().getTime(); |
||||
document.onmousedown = () => { |
||||
lastTime = new Date().getTime(); |
||||
}; |
||||
|
||||
setInterval(() => { |
||||
if (util.local.get(Setting.tokenKey) && (new Date().getTime() - lastTime) > Setting.autoLogoutTime) { |
||||
util.errorMsg("用户登录过期,请重新登录"); |
||||
setTimeout(this.logout, 1500); |
||||
} |
||||
}, 1000); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.main{ |
||||
min-height: calc(100% - 90px); |
||||
.layout{ |
||||
padding-top: 90px; |
||||
} |
||||
.index{ |
||||
padding: 0; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,85 @@ |
||||
<template> |
||||
<div> |
||||
<ul class="nav"> |
||||
<li v-for="(item, i) in menus" :key="i" :class="{active: active == item.index}" @click="jump(item)"> |
||||
{{item.title}} |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import Setting from '@/setting' |
||||
export default { |
||||
data() { |
||||
return { |
||||
active: this.$route.path, |
||||
menus: [ |
||||
{ |
||||
index: "/intro", |
||||
title: "S³FEL概况" |
||||
}, |
||||
{ |
||||
index: "occupationlab", |
||||
title: "装置介绍" |
||||
}, |
||||
{ |
||||
index: 'data', |
||||
title: "科学研究" |
||||
}, |
||||
{ |
||||
index: "/cityPartner", |
||||
title: "人才队伍" |
||||
}, |
||||
{ |
||||
index: "/devPlatform", |
||||
title: "用户共享" |
||||
}, |
||||
{ |
||||
index: "/about", |
||||
title: "科普之窗" |
||||
} |
||||
] |
||||
}; |
||||
}, |
||||
mounted() { |
||||
|
||||
}, |
||||
methods: { |
||||
// 跳转 |
||||
jump(item) { |
||||
const { index } = item |
||||
this.active = index |
||||
this.$router.push(index).catch(err => {}) |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.nav{ |
||||
position: absolute; |
||||
top: 0; |
||||
left: 50%; |
||||
display: flex; |
||||
transform: translateX(-50%); |
||||
& > li{ |
||||
position: relative; |
||||
padding: 0 15px; |
||||
margin: 0 10px; |
||||
font-size: 20px; |
||||
line-height: 90px; |
||||
color: #333; |
||||
white-space: nowrap; |
||||
cursor: pointer; |
||||
&.active{ |
||||
color: $main-color; |
||||
} |
||||
} |
||||
} |
||||
@media (max-width: 1430px) { |
||||
.nav { |
||||
left: 52%; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,26 @@ |
||||
/** |
||||
* @description 生成按钮级别权限组 |
||||
* */ |
||||
|
||||
import store from "@/store"; |
||||
|
||||
export default function(data) { |
||||
let result = []; |
||||
data.map(e => { |
||||
if (e.select) { |
||||
e.children.map(n => { |
||||
if (n.select) { |
||||
if (n.children.length) { |
||||
result.push(`${e.name}:${n.name}`); |
||||
n.children.map(j => { |
||||
j.select && (e.path ? result.push(`${e.path}:${n.name}:${j.name}`) : result.push(`${n.path}:${j.name}`)); |
||||
}); |
||||
} else { |
||||
result.push(`${e.path}:${n.name}`); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
store.dispatch("auth/addBtnAuth", result); |
||||
} |
@ -0,0 +1,6 @@ |
||||
import Vue from "vue"; |
||||
|
||||
// 使用 Event Bus
|
||||
const bus = new Vue(); |
||||
|
||||
export default bus; |
@ -0,0 +1,10 @@ |
||||
// 生成随机字符串
|
||||
export default function(len = 32) { |
||||
const $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; |
||||
const maxPos = $chars.length; |
||||
let str = ""; |
||||
for (let i = 0; i < len; i++) { |
||||
str += $chars.charAt(Math.floor(Math.random() * maxPos)); |
||||
} |
||||
return str; |
||||
} |
@ -0,0 +1,18 @@ |
||||
// rem等比适配配置文件
|
||||
// 基准大小
|
||||
const baseSize = 16; |
||||
|
||||
// 设置 rem 函数
|
||||
function setRem() { |
||||
// 当前页面宽度相对于 1920宽的缩放比例,可根据自己需要修改。
|
||||
const scale = document.documentElement.clientWidth / 1920; |
||||
// 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)
|
||||
document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + "px"; |
||||
} |
||||
|
||||
// 初始化
|
||||
setRem(); |
||||
// 改变窗口大小时重新设置 rem
|
||||
window.onresize = function() { |
||||
setRem(); |
||||
}; |
@ -0,0 +1,31 @@ |
||||
import store from "@/store"; |
||||
import router from "@/router"; |
||||
import generateBtnPermission from "../auth/generateBtnPermission"; |
||||
|
||||
const newRoutes = []; |
||||
|
||||
function createMeta(item) { |
||||
let meta = { title: item.name }; |
||||
return meta; |
||||
} |
||||
|
||||
function createRoute(data) { |
||||
data.map(e => { |
||||
if (e.select && e.path) { |
||||
let meta = createMeta(e); |
||||
newRoutes.push({ |
||||
name: e.path, |
||||
path: () => import(`@/pages/${e.path}.vue`), |
||||
meta |
||||
}); |
||||
} |
||||
e.children && e.children.length && createRoute(e.children); |
||||
}); |
||||
} |
||||
|
||||
export default function(data, path) { |
||||
generateBtnPermission(data); |
||||
createRoute(data); |
||||
store.dispatch("auth/addRoutes", newRoutes); |
||||
// router.addRoutes(routes)
|
||||
} |
@ -0,0 +1,26 @@ |
||||
import store from "@/store"; |
||||
import router from "@/router"; |
||||
|
||||
export default function() { |
||||
setTimeout(() => { |
||||
let routes = store.state.auth.routes; |
||||
routes.forEach(e => { |
||||
if (e.path == "/") { |
||||
e.component = () => import("@/layouts/home/index.vue"); |
||||
} else { |
||||
e.component = () => import(`@/pages/${e.path}.vue`); |
||||
} |
||||
|
||||
e.children && e.children.forEach(n => { |
||||
n.path && (n.component = () => import(`@/pages/${n.path}.vue`)); |
||||
}); |
||||
}); |
||||
|
||||
routes.push({ |
||||
path: "*", |
||||
redirect: "404" |
||||
}); |
||||
|
||||
router.addRoutes(routes); |
||||
}, 500); |
||||
} |
@ -0,0 +1,6 @@ |
||||
import router from "@/router"; |
||||
|
||||
export default function() { |
||||
const newRouter = createRouter(); |
||||
router.matcher = newRouter.matcher; |
||||
} |
@ -0,0 +1,43 @@ |
||||
import Cookies from "js-cookie"; |
||||
import Setting from "@/setting"; |
||||
|
||||
const cookies = {}; |
||||
|
||||
/** |
||||
* @description 存储 cookie 值 |
||||
* @param {String} name cookie name |
||||
* @param {String} value cookie value |
||||
* @param {Object} cookieSetting cookie setting |
||||
*/ |
||||
cookies.set = function(name = "default", value = "", cookieSetting = {}) { |
||||
let currentCookieSetting = { |
||||
expires: Setting.cookiesExpires |
||||
}; |
||||
Object.assign(currentCookieSetting, cookieSetting); |
||||
Cookies.set(`admin-${name}`, value, currentCookieSetting); |
||||
}; |
||||
|
||||
/** |
||||
* @description 拿到 cookie 值 |
||||
* @param {String} name cookie name |
||||
*/ |
||||
cookies.get = function(name = "default") { |
||||
return Cookies.get(`admin-${name}`); |
||||
}; |
||||
|
||||
/** |
||||
* @description 拿到 cookie 全部的值 |
||||
*/ |
||||
cookies.getAll = function() { |
||||
return Cookies.get(); |
||||
}; |
||||
|
||||
/** |
||||
* @description 删除 cookie |
||||
* @param {String} name cookie name |
||||
*/ |
||||
cookies.remove = function(name = "default") { |
||||
return Cookies.remove(`admin-${name}`); |
||||
}; |
||||
|
||||
export default cookies; |
@ -0,0 +1,83 @@ |
||||
/** |
||||
* localStorage |
||||
* @调用:_local.set('access_token', '123456', 5000); |
||||
* @调用:_local.get('access_token'); |
||||
*/ |
||||
|
||||
var _local = { |
||||
//存储,可设置过期时间
|
||||
set(key, value, expires) { |
||||
let params = { key, value, expires }; |
||||
if (expires) { |
||||
// 记录何时将值存入缓存,毫秒级
|
||||
var data = Object.assign(params, { startTime: new Date().getTime() }); |
||||
localStorage.setItem(key, JSON.stringify(data)); |
||||
} else { |
||||
if (Object.prototype.toString.call(value) == "[object Object]") { |
||||
value = JSON.stringify(value); |
||||
} |
||||
if (Object.prototype.toString.call(value) == "[object Array]") { |
||||
value = JSON.stringify(value); |
||||
} |
||||
localStorage.setItem(key, value); |
||||
} |
||||
}, |
||||
//取出
|
||||
get(key) { |
||||
let item = localStorage.getItem(key); |
||||
// 先将拿到的试着进行json转为对象的形式
|
||||
try { |
||||
item = JSON.parse(item); |
||||
} catch (error) { |
||||
// eslint-disable-next-line no-self-assign
|
||||
item = item; |
||||
} |
||||
// 如果有startTime的值,说明设置了失效时间
|
||||
if (item && item.startTime) { |
||||
let date = new Date().getTime(); |
||||
|
||||
// 如果大于就是过期了,如果小于或等于就还没过期
|
||||
if (date - item.startTime > item.expires) { |
||||
localStorage.removeItem(key); |
||||
return false; |
||||
} else { |
||||
return item.value; |
||||
} |
||||
} else { |
||||
return item; |
||||
} |
||||
}, |
||||
// 删除
|
||||
remove(key) { |
||||
localStorage.removeItem(key); |
||||
}, |
||||
// 清除全部
|
||||
clear() { |
||||
localStorage.clear(); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* sessionStorage |
||||
*/ |
||||
var _session = { |
||||
get: function(key) { |
||||
var data = sessionStorage[key]; |
||||
if (!data || data === "null") { |
||||
return null; |
||||
} |
||||
return data; |
||||
}, |
||||
set: function(key, value) { |
||||
sessionStorage[key] = value; |
||||
}, |
||||
// 删除
|
||||
remove(key) { |
||||
sessionStorage.removeItem(key); |
||||
}, |
||||
// 清除全部
|
||||
clear() { |
||||
sessionStorage.clear(); |
||||
} |
||||
}; |
||||
export { _local, _session }; |
@ -0,0 +1,187 @@ |
||||
import cookies from "./util.cookies"; |
||||
import { _local, _session } from "./util.db"; |
||||
import { Message } from "element-ui"; |
||||
import store from "@/store"; |
||||
import axios from "axios"; |
||||
import api from "@/api"; |
||||
import Setting from "@/setting"; |
||||
|
||||
let logout = false; |
||||
// 文件后缀集合
|
||||
const exts = { |
||||
video: 'mp4,3gp,mov,m4v,avi,dat,mkv,flv,vob,rmvb,rm,qlv', |
||||
audio: 'mp3,aac,ape,flac,wav,wma,amr,mid', |
||||
img: 'jpg,jpeg,png,gif,svg,psd', |
||||
doc: 'doc,docx,txt,xls,xlsx,csv,xml,ppt,pptx' |
||||
} |
||||
const util = { |
||||
cookies, |
||||
local: _local, |
||||
session: _session, |
||||
// 传入身份证获取生日
|
||||
getBirth(idCard) { |
||||
var birthday = ""; |
||||
if (idCard != null && idCard != "") { |
||||
if (idCard.length == 15) { |
||||
birthday = "19" + idCard.slice(6, 12); |
||||
} else if (idCard.length == 18) { |
||||
birthday = idCard.slice(6, 14); |
||||
} |
||||
birthday = birthday.replace(/(.{4})(.{2})/, "$1-$2-"); |
||||
//通过正则表达式来指定输出格式为:1990-01-01
|
||||
} |
||||
return birthday; |
||||
}, |
||||
// new Date('2020-11-12 00:00:00') 在IE下失效,因此把-替换成/
|
||||
dateCompatible(date) { |
||||
return date.replace(/\-/g, "/"); |
||||
}, |
||||
// 日期时间前面补零
|
||||
formateTime(num) { |
||||
return num < 10 ? `0${num}` : num; |
||||
}, |
||||
//返回格式化时间,传参例如:"yyyy-MM-dd hh:mm:ss"
|
||||
formatDate(fmt, date) { |
||||
var date = date ? date : new Date(); |
||||
var o = { |
||||
"M+": date.getMonth() + 1, //月份
|
||||
"d+": date.getDate(), //日
|
||||
"h+": date.getHours(), //小时
|
||||
"m+": date.getMinutes(), //分
|
||||
"s+": date.getSeconds(), //秒
|
||||
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
|
||||
"S": date.getMilliseconds() //毫秒
|
||||
}; |
||||
if (/(y+)/.test(fmt)) { |
||||
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); |
||||
} |
||||
for (var k in o) { |
||||
if (new RegExp("(" + k + ")").test(fmt)) { |
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); |
||||
} |
||||
} |
||||
return fmt; |
||||
}, |
||||
// 移除数组中指定值
|
||||
removeByValue(arr, val) { |
||||
for (var i = 0; i < arr.length; i++) { |
||||
if (arr[i] == val) { |
||||
arr.splice(i, 1); |
||||
break; |
||||
} |
||||
} |
||||
}, |
||||
// 传入文件后缀判断是否是视频
|
||||
isVideo(ext) { |
||||
if (exts.video.includes(ext)) return true; |
||||
return false; |
||||
}, |
||||
// 传入文件后缀判断是否是音频
|
||||
isAudio(ext) { |
||||
if (exts.audio.includes(ext)) return true; |
||||
return false; |
||||
}, |
||||
// 传入文件后缀判断是否是图片
|
||||
isImg(ext) { |
||||
if (exts.img.includes(ext)) return true; |
||||
return false; |
||||
}, |
||||
// 传入文件后缀判断是否是pdf以外的文档
|
||||
isDoc(ext) { |
||||
if (exts.doc.includes(ext)) return true; |
||||
return false; |
||||
}, |
||||
// 判断是否能够预览
|
||||
canPreview(ext) { |
||||
if (!util.isVideo(ext) && !util.isAudio(ext) && !util.isImg(ext) && !util.isDoc(ext)) return false |
||||
return true |
||||
}, |
||||
// 循环去除html标签
|
||||
removeHtmlTag(list, attr) { |
||||
list.map(n => { |
||||
n[attr] = n[attr].replace(/<\/?.+?>/gi, ""); |
||||
}); |
||||
return list; |
||||
}, |
||||
// 传入文件名获取文件后缀
|
||||
getFileExt(fileName) { |
||||
return fileName.substring(fileName.lastIndexOf(".") + 1); |
||||
}, |
||||
// 传入文件名和路径,下载图片视频,支持跨域,a标签加download不支持跨域
|
||||
downloadFile(fileName, url) { |
||||
var x = new XMLHttpRequest(); |
||||
x.open("GET", url, true); |
||||
x.responseType = "blob"; |
||||
x.onload = function(e) { |
||||
var url = window.URL.createObjectURL(x.response); |
||||
var a = document.createElement("a"); |
||||
a.href = url; |
||||
a.download = fileName; |
||||
a.click(); |
||||
}; |
||||
x.send(); |
||||
}, |
||||
// 传入文件名和数据,下载文件
|
||||
downloadFileDirect(fileName,data) { |
||||
if ('download' in document.createElement('a')) { // 非IE下载
|
||||
const elink = document.createElement('a') |
||||
elink.download = fileName |
||||
elink.style.display = 'none' |
||||
elink.href = URL.createObjectURL(data) |
||||
document.body.appendChild(elink) |
||||
elink.click() |
||||
URL.revokeObjectURL(elink.href) // 释放URL 对象
|
||||
document.body.removeChild(elink) |
||||
} else { // IE10+下载
|
||||
navigator.msSaveBlob(data, fileName) |
||||
} |
||||
}, |
||||
// 成功提示
|
||||
successMsg(message, duration = 3000) { |
||||
Message.closeAll(); |
||||
return Message.success({ |
||||
message, |
||||
showClose: true, |
||||
duration |
||||
}); |
||||
}, |
||||
// 警告提示
|
||||
warningMsg(message, duration = 3000) { |
||||
Message.closeAll(); |
||||
return Message.warning({ |
||||
message, |
||||
showClose: true, |
||||
duration |
||||
}); |
||||
}, |
||||
// 错误提示
|
||||
errorMsg(message, duration = 3000) { |
||||
Message.closeAll(); |
||||
return Message.error({ |
||||
message, |
||||
showClose: true, |
||||
duration |
||||
}); |
||||
}, |
||||
// 登录互踢
|
||||
getToken() { |
||||
if (process.env.NODE_ENV == "production") { |
||||
if (store.state.user.dataTime && !logout) { |
||||
axios.get(`${api.queryToken}?token=${_local.get(Setting.tokenKey)}`).then(res => { |
||||
if (store.state.user.dataTime && (res.data.message != store.state.user.dataTime)) { |
||||
logout || Message.error("您已在另一台设备登录,本次登录已下线!"); |
||||
logout = true; |
||||
setTimeout(() => { |
||||
_local.remove(Setting.storeKey); |
||||
_local.remove(Setting.tokenKey); |
||||
location.reload(); |
||||
}, 1500); |
||||
} |
||||
}).catch(err => { |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
|
||||
export default util; |
@ -0,0 +1,47 @@ |
||||
import Vue from "vue"; |
||||
import App from "@/App.vue"; |
||||
import router from "@/router"; |
||||
import ElementUI from "element-ui"; |
||||
import "@/styles/index.scss"; |
||||
import VueI18n from "vue-i18n"; |
||||
import mixinApp from "@/mixins/app"; |
||||
import { messages } from "@/i18n"; |
||||
import "babel-polyfill"; |
||||
import "@/libs/resize"; |
||||
import { post, get, del, put } from "@/plugins/requests/index.js"; |
||||
import core from '@/libs/core' |
||||
import api from "@/api"; |
||||
import store from "@/store"; |
||||
import Setting from "@/setting"; |
||||
import permission from "@/router/permission"; |
||||
|
||||
// 插件
|
||||
import plugins from "@/plugins"; |
||||
import filters from "@/plugins/filters"; |
||||
|
||||
Vue.use(plugins); |
||||
|
||||
Object.keys(filters).forEach(item => Vue.filter(item, filters[item])); |
||||
|
||||
Vue.prototype.api = api; |
||||
Vue.prototype.$get = get; |
||||
Vue.prototype.$post = post; |
||||
Vue.prototype.$del = del; |
||||
Vue.prototype.$put = put; |
||||
Vue.prototype.core = core |
||||
|
||||
Vue.config.productionTip = false; |
||||
Vue.use(VueI18n); |
||||
Vue.use(ElementUI, { size: "small" }); |
||||
const i18n = new VueI18n({ |
||||
locale: Setting.i18n.default, |
||||
messages |
||||
}); |
||||
|
||||
new Vue({ |
||||
mixins: [mixinApp], |
||||
router, |
||||
i18n, |
||||
store, |
||||
render: h => h(App) |
||||
}).$mount("#app"); |
@ -0,0 +1,11 @@ |
||||
/** |
||||
* 通用混合 |
||||
* */ |
||||
export default { |
||||
methods: { |
||||
// 当 $route 更新时触发
|
||||
appRouteChange(to, from) { |
||||
|
||||
} |
||||
} |
||||
}; |
@ -0,0 +1,64 @@ |
||||
<template> |
||||
<div class="error-page"> |
||||
<div class="error-code">4<span>0</span>3</div> |
||||
<div class="error-desc">啊哦~ 你没有权限访问该页面哦</div> |
||||
<div class="error-handle"> |
||||
<router-link to="/"> |
||||
<el-button type="primary" size="large" @click="toIndex">返回首页</el-button> |
||||
</router-link> |
||||
<el-button class="error-btn" type="primary" size="large" @click="goBack">返回上一页</el-button> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
methods: { |
||||
toIndex() { |
||||
this.$router.push("/"); |
||||
}, |
||||
goBack() { |
||||
this.$router.go(-1); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
|
||||
<style scoped> |
||||
.error-page { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
flex-direction: column; |
||||
width: 100%; |
||||
height: 100%; |
||||
background: #f3f3f3; |
||||
box-sizing: border-box; |
||||
} |
||||
|
||||
.error-code { |
||||
line-height: 1; |
||||
font-size: 250px; |
||||
font-weight: bolder; |
||||
color: #f02d2d; |
||||
} |
||||
|
||||
.error-code span { |
||||
color: #00a854; |
||||
} |
||||
|
||||
.error-desc { |
||||
font-size: 30px; |
||||
color: #777; |
||||
} |
||||
|
||||
.error-handle { |
||||
margin-top: 30px; |
||||
padding-bottom: 200px; |
||||
} |
||||
|
||||
.error-btn { |
||||
margin-left: 100px; |
||||
} |
||||
</style> |
@ -0,0 +1,64 @@ |
||||
<template> |
||||
<div class="error-page"> |
||||
<div class="error-code">4<span>0</span>4</div> |
||||
<div class="error-desc">啊哦~ 你所访问的页面不存在</div> |
||||
<div class="error-handle"> |
||||
<router-link to="/"> |
||||
<el-button type="primary" size="large" @click="toIndex">返回首页</el-button> |
||||
</router-link> |
||||
<el-button class="error-btn" type="primary" size="large" @click="goBack">返回上一页</el-button> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
methods: { |
||||
toIndex() { |
||||
this.$router.push("/"); |
||||
}, |
||||
goBack() { |
||||
this.$router.go(-1); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
|
||||
<style scoped> |
||||
.error-page { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
flex-direction: column; |
||||
width: 100%; |
||||
height: 100%; |
||||
background: #f3f3f3; |
||||
box-sizing: border-box; |
||||
} |
||||
|
||||
.error-code { |
||||
line-height: 1; |
||||
font-size: 250px; |
||||
font-weight: bolder; |
||||
color: #2d8cf0; |
||||
} |
||||
|
||||
.error-code span { |
||||
color: #00a854; |
||||
} |
||||
|
||||
.error-desc { |
||||
font-size: 30px; |
||||
color: #777; |
||||
} |
||||
|
||||
.error-handle { |
||||
margin-top: 30px; |
||||
padding-bottom: 200px; |
||||
} |
||||
|
||||
.error-btn { |
||||
margin-left: 100px; |
||||
} |
||||
</style> |
@ -0,0 +1,49 @@ |
||||
<template> |
||||
<section class="main"> |
||||
<div class="crumbs"> |
||||
<el-breadcrumb separator="/"> |
||||
<el-breadcrumb-item><i class="el-icon-lx-global"></i> {{ $t("i18n.breadcrumb") }}</el-breadcrumb-item> |
||||
</el-breadcrumb> |
||||
</div> |
||||
<div class="container"> |
||||
<span>{{ $t("i18n.tips") }}</span> |
||||
<el-button type="primary" @click="$i18n.locale = $i18n.locale === 'zh'?'en':'zh';">{{ $t("i18n.btn") }} |
||||
</el-button> |
||||
<div class="list"> |
||||
<h2>{{ $t("i18n.title1") }}</h2> |
||||
<p>{{ $t("i18n.p1") }}</p> |
||||
<p>{{ $t("i18n.p2") }}</p> |
||||
<p>{{ $t("i18n.p3") }}</p> |
||||
</div> |
||||
<h2>{{ $t("i18n.title2") }}</h2> |
||||
<div> |
||||
<i18n path="i18n.info" tag="p"> |
||||
<a place="action" href="https://element.eleme.cn/2.0/#/zh-CN/component/i18n">{{ $t("i18n.value") |
||||
}}</a> |
||||
</i18n> |
||||
</div> |
||||
</div> |
||||
</section> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
data() { |
||||
return {}; |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
.list { |
||||
padding: 30px 0; |
||||
} |
||||
|
||||
.list p { |
||||
margin-bottom: 20px; |
||||
} |
||||
|
||||
a { |
||||
color: #cb221c; |
||||
} |
||||
</style> |
@ -0,0 +1,232 @@ |
||||
<template> |
||||
<div> |
||||
<div class="crumbs"> |
||||
<el-breadcrumb separator="/"> |
||||
<el-breadcrumb-item><i class="el-icon-lx-emoji"></i> 自定义图标</el-breadcrumb-item> |
||||
</el-breadcrumb> |
||||
</div> |
||||
<div class="container"> |
||||
<h2>使用方法</h2> |
||||
<p style="line-height: 50px;"> |
||||
直接通过设置类名为 el-icon-lx-iconName 来使用即可。例如:(共{{ iconList.length }}个图标) |
||||
</p> |
||||
<p class="example-p"> |
||||
<i class="el-icon-lx-redpacket_fill" style="font-size: 30px;color: #ff5900"></i> |
||||
<span><i class="el-icon-lx-redpacket_fill"></i></span> |
||||
</p> |
||||
<p class="example-p"> |
||||
<i class="el-icon-lx-weibo" style="font-size: 30px;color:#fd5656"></i> |
||||
<span><i class="el-icon-lx-weibo"></i></span> |
||||
</p> |
||||
<p class="example-p"> |
||||
<i class="el-icon-lx-emojifill" style="font-size: 30px;color: #ffc300"></i> |
||||
<span><i class="el-icon-lx-emojifill"></i></span> |
||||
</p> |
||||
<br> |
||||
<h2>图标</h2> |
||||
<div class="search-box"> |
||||
<el-input class="search" size="large" v-model="keyword" clearable placeholder="请输入图标名称"></el-input> |
||||
</div> |
||||
<ul> |
||||
<li class="icon-li" v-for="(item,index) in list" :key="index"> |
||||
<div class="icon-li-content"> |
||||
<i :class="`el-icon-lx-${item}`"></i> |
||||
<span>{{ item }}</span> |
||||
</div> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
|
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
data: function() { |
||||
return { |
||||
keyword: "", |
||||
iconList: [ |
||||
"attentionforbid", |
||||
"attentionforbidfill", |
||||
"attention", |
||||
"attentionfill", |
||||
"tag", |
||||
"tagfill", |
||||
"people", |
||||
"peoplefill", |
||||
"notice", |
||||
"noticefill", |
||||
"mobile", |
||||
"mobilefill", |
||||
"voice", |
||||
"voicefill", |
||||
"unlock", |
||||
"lock", |
||||
"home", |
||||
"homefill", |
||||
"delete", |
||||
"deletefill", |
||||
"notification", |
||||
"notificationfill", |
||||
"notificationforbidfill", |
||||
"like", |
||||
"likefill", |
||||
"comment", |
||||
"commentfill", |
||||
"camera", |
||||
"camerafill", |
||||
"warn", |
||||
"warnfill", |
||||
"time", |
||||
"timefill", |
||||
"location", |
||||
"locationfill", |
||||
"favor", |
||||
"favorfill", |
||||
"skin", |
||||
"skinfill", |
||||
"news", |
||||
"newsfill", |
||||
"record", |
||||
"recordfill", |
||||
"emoji", |
||||
"emojifill", |
||||
"message", |
||||
"messagefill", |
||||
"goods", |
||||
"goodsfill", |
||||
"crown", |
||||
"crownfill", |
||||
"move", |
||||
"add", |
||||
"hot", |
||||
"hotfill", |
||||
"service", |
||||
"servicefill", |
||||
"present", |
||||
"presentfill", |
||||
"pic", |
||||
"picfill", |
||||
"rank", |
||||
"rankfill", |
||||
"male", |
||||
"female", |
||||
"down", |
||||
"top", |
||||
"recharge", |
||||
"rechargefill", |
||||
"forward", |
||||
"forwardfill", |
||||
"info", |
||||
"infofill", |
||||
"redpacket", |
||||
"redpacket_fill", |
||||
"roundadd", |
||||
"roundaddfill", |
||||
"friendadd", |
||||
"friendaddfill", |
||||
"cart", |
||||
"cartfill", |
||||
"more", |
||||
"moreandroid", |
||||
"back", |
||||
"right", |
||||
"shop", |
||||
"shopfill", |
||||
"question", |
||||
"questionfill", |
||||
"roundclose", |
||||
"roundclosefill", |
||||
"roundcheck", |
||||
"roundcheckfill", |
||||
"global", |
||||
"mail", |
||||
"punch", |
||||
"exit", |
||||
"upload", |
||||
"read", |
||||
"file", |
||||
"link", |
||||
"full", |
||||
"group", |
||||
"friend", |
||||
"profile", |
||||
"addressbook", |
||||
"calendar", |
||||
"text", |
||||
"copy", |
||||
"share", |
||||
"wifi", |
||||
"vipcard", |
||||
"weibo", |
||||
"remind", |
||||
"refresh", |
||||
"filter", |
||||
"settings", |
||||
"scan", |
||||
"qrcode", |
||||
"cascades", |
||||
"apps", |
||||
"sort", |
||||
"searchlist", |
||||
"search", |
||||
"edit" |
||||
] |
||||
}; |
||||
}, |
||||
computed: { |
||||
list() { |
||||
return this.iconList.filter((item) => { |
||||
return item.indexOf(this.keyword) !== -1; |
||||
}); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
.example-p { |
||||
height: 45px; |
||||
display: flex; |
||||
align-items: center; |
||||
} |
||||
|
||||
.search-box { |
||||
text-align: center; |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
.search { |
||||
width: 300px; |
||||
} |
||||
|
||||
ul, li { |
||||
list-style: none; |
||||
} |
||||
|
||||
.icon-li { |
||||
display: inline-block; |
||||
padding: 10px; |
||||
width: 120px; |
||||
height: 120px; |
||||
} |
||||
|
||||
.icon-li-content { |
||||
display: flex; |
||||
height: 100%; |
||||
flex-direction: column; |
||||
align-items: center; |
||||
justify-content: center; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.icon-li-content i { |
||||
font-size: 36px; |
||||
color: #606266; |
||||
} |
||||
|
||||
.icon-li-content span { |
||||
margin-top: 10px; |
||||
color: #787878; |
||||
} |
||||
</style> |
@ -0,0 +1,25 @@ |
||||
<template> |
||||
<div class="wrap"></div> |
||||
</template> |
||||
|
||||
<script> |
||||
import Setting from '@/setting' |
||||
import util from '@/libs/util' |
||||
export default { |
||||
data() { |
||||
return { |
||||
|
||||
} |
||||
}, |
||||
mounted() { |
||||
|
||||
}, |
||||
methods: { |
||||
|
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
@ -0,0 +1,23 @@ |
||||
<template> |
||||
<div class="wrap"> |
||||
|
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import Setting from '@/setting' |
||||
import util from '@/libs/util' |
||||
export default { |
||||
data() { |
||||
return { |
||||
|
||||
} |
||||
}, |
||||
mounted() {}, |
||||
methods: {} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
@ -0,0 +1,25 @@ |
||||
/** |
||||
* @description 鉴权指令 |
||||
* 当传入的权限当前用户没有时,会移除该组件 |
||||
* 用例:<Tag v-auth>text</Tag> 或者:<Tag v-auth="'user:编辑'">text</Tag> |
||||
* */ |
||||
import store from "@/store"; |
||||
|
||||
export default { |
||||
inserted(el, binding, vnode) { |
||||
let btnText = ""; |
||||
if (binding.value) { |
||||
btnText = binding.value; |
||||
} else { |
||||
btnText = `${vnode.context.$route.path}:${el.innerText}`; |
||||
} |
||||
const btnPermissions = store.state.auth.btns; |
||||
|
||||
if (btnText && btnPermissions && btnPermissions.length) { |
||||
const isPermission = btnPermissions.includes(btnText); |
||||
if (!isPermission) { |
||||
el.parentNode && el.parentNode.removeChild(el); |
||||
} |
||||
} |
||||
} |
||||
}; |
@ -0,0 +1,12 @@ |
||||
/** |
||||
* @description 返回缺省值 |
||||
* 传入的如果是null,就返回'--' |
||||
* 用例:<Tag :default="val">text</Tag> 或者:<Tag>{{val | default}}</Tag> |
||||
* */ |
||||
const defaultShow = (val) => { |
||||
return val == null ? "--" : val; |
||||
}; |
||||
|
||||
module.exports = { |
||||
defaultShow |
||||
}; |
@ -0,0 +1,14 @@ |
||||
/** |
||||
* 插件 |
||||
* */ |
||||
|
||||
import directiveAuth from "@/plugins/auth"; |
||||
import throttle from "@/plugins/throttle"; |
||||
|
||||
export default { |
||||
async install(Vue, options) { |
||||
// 指令
|
||||
Vue.directive("auth", directiveAuth); |
||||
Vue.directive("throttle", throttle); |
||||
} |
||||
}; |
@ -0,0 +1,144 @@ |
||||
import axios from "axios"; |
||||
import util from "@/libs/util"; |
||||
import router from "@/router"; |
||||
import Setting from "@/setting"; |
||||
import { Message } from "element-ui"; |
||||
|
||||
const service = axios.create({ |
||||
baseURL: Setting.apiBaseURL, |
||||
timeout: 10000000 |
||||
}); |
||||
|
||||
// post请求头
|
||||
service.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"; |
||||
|
||||
// 请求拦截器
|
||||
service.interceptors.request.use(config => { |
||||
util.getToken(); |
||||
let token = util.local.get(Setting.tokenKey); |
||||
if (token) config.headers.token = token; |
||||
return config; |
||||
}, err => { |
||||
util.errorMsg({ |
||||
message: "退出登陆", |
||||
onClose: function() { |
||||
router.push({ name: "/login" }); |
||||
} |
||||
}); |
||||
return Promise.reject(err); |
||||
}); |
||||
|
||||
// 响应拦截器
|
||||
service.interceptors.response.use( |
||||
response => { |
||||
const res = response.data; |
||||
if (res.status == 200 || res.status == 10000 || res.status == 30001) { |
||||
return Promise.resolve(res).catch(e => {}); |
||||
} else if (!res.status) { |
||||
return Promise.resolve(res).catch(e => {}); |
||||
} else if (res.status === 10008) { |
||||
Message.error({ |
||||
message: res.message, |
||||
showClose: true, |
||||
duration: 1500 |
||||
}) |
||||
return Promise.reject(res) |
||||
} else { |
||||
util.errorMsg(res.message); |
||||
return Promise.reject(res) |
||||
} |
||||
}, |
||||
// 服务器状态码不是200的情况
|
||||
error => { |
||||
if (error.response.status) { |
||||
switch (error.response.status) { |
||||
// 401: 未登录
|
||||
// 未登录则跳转登录页面,并携带当前页面的路径
|
||||
// 在登录成功后返回当前页面,这一步需要在登录页操作。
|
||||
case 401: |
||||
util.local.remove(Setting.storeKey); |
||||
util.local.remove(Setting.tokenKey); |
||||
util.errorMsg("登录过期,请重新登录"); |
||||
setTimeout(() => { |
||||
router.replace({ |
||||
path: "/login" |
||||
}); |
||||
}, 1000); |
||||
break; |
||||
case 500: |
||||
util.errorMsg("网络错误"); |
||||
break; |
||||
// 403 token过期
|
||||
// 登录过期对用户进行提示
|
||||
// 清除本地token和清空vuex中token对象
|
||||
// 跳转登录页面
|
||||
case 403: |
||||
util.local.remove(Setting.storeKey); |
||||
util.local.remove(Setting.tokenKey); |
||||
util.errorMsg("登录过期,请重新登录"); |
||||
// 清除token
|
||||
// store.commit('loginSuccess', null);
|
||||
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
|
||||
setTimeout(() => { |
||||
router.replace({ |
||||
path: "/login" |
||||
}); |
||||
}, 1000); |
||||
break; |
||||
// 404请求不存在
|
||||
case 404: |
||||
util.errorMsg("网络请求不存在!"); |
||||
break; |
||||
// 其他错误,直接抛出错误提示
|
||||
default: |
||||
util.errorMsg(error.response.data.message); |
||||
Promise.reject(res); |
||||
} |
||||
return Promise.reject(error.response); |
||||
} |
||||
} |
||||
); |
||||
|
||||
function get(url, params) { |
||||
return new Promise((resolve, reject) => { |
||||
service.get(url, { params: params }).then(res => { |
||||
resolve(res); |
||||
}).catch(err => { |
||||
reject(err); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
function post(url, params) { |
||||
return new Promise((resolve, reject) => { |
||||
service.post(url, params).then(res => { |
||||
resolve(res); |
||||
}).catch(err => { |
||||
reject(err.data); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
function del(url, params) { |
||||
return new Promise((resolve, reject) => { |
||||
service.delete(url, { |
||||
params |
||||
}).then(res => { |
||||
resolve(res); |
||||
}).catch(err => { |
||||
reject(err.data); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
function put(url, params) { |
||||
return new Promise((resolve, reject) => { |
||||
service.put(url, params).then(res => { |
||||
resolve(res); |
||||
}).catch(err => { |
||||
reject(err.data); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
export { get, post, del, put }; |
@ -0,0 +1,18 @@ |
||||
/** |
||||
* @description 节流指令 |
||||
* 限制连续快速点击按钮 |
||||
* 用例:<Tag v-throttle>text</Tag> |
||||
* */ |
||||
|
||||
export default { |
||||
inserted(el, binding, vnode) { |
||||
el.addEventListener("click", () => { |
||||
if (!el.disabled) { |
||||
el.disabled = true; |
||||
setTimeout(() => { |
||||
el.disabled = false; |
||||
}, binding.value || 1000); |
||||
} |
||||
}); |
||||
} |
||||
}; |
@ -0,0 +1,22 @@ |
||||
import Vue from "vue"; |
||||
import Router from "vue-router"; |
||||
import routes from "./routes"; |
||||
import Setting from "@/setting"; |
||||
|
||||
Vue.use(Router); |
||||
|
||||
const createRouter = () => new Router({ |
||||
mode: Setting.routerMode, |
||||
base: process.env.BASE_URL, |
||||
scrollBehavior: () => ({ y: 0 }), |
||||
routes |
||||
}); |
||||
|
||||
export function resetRouter() { |
||||
const newRouter = createRouter(); |
||||
router.matcher = newRouter.matcher; |
||||
} |
||||
|
||||
let router = createRouter(); |
||||
|
||||
export default router; |
@ -0,0 +1,14 @@ |
||||
import BasicLayout from '@/layouts/home'; |
||||
|
||||
export default { |
||||
path: '/index', |
||||
component: BasicLayout, |
||||
children: [ |
||||
{ |
||||
name: `index`, |
||||
path: `/index`, |
||||
component: () => import('@/pages/index/list'), |
||||
meta: { title: '首页' } |
||||
}, |
||||
] |
||||
}; |
@ -0,0 +1,14 @@ |
||||
import BasicLayout from '@/layouts/home' |
||||
const name = 'intro' |
||||
export default { |
||||
path: `/${name}`, |
||||
component: BasicLayout, |
||||
children: [ |
||||
{ |
||||
name, |
||||
path: `/${name}`, |
||||
component: () => import(`@/pages/${name}`), |
||||
meta: { title: 'S³FEL概况' } |
||||
} |
||||
] |
||||
}; |
@ -0,0 +1,7 @@ |
||||
import router from "./index"; |
||||
import Setting from "@/setting"; |
||||
|
||||
router.beforeEach((to, from, next) => { |
||||
document.title = Setting.titleSuffix |
||||
next() |
||||
}) |
@ -0,0 +1,55 @@ |
||||
/** |
||||
* 读取./modules下的所有js文件并注册模块 |
||||
*/ |
||||
const requireModule = require.context('./modules', false, /\.js$/) |
||||
const modules = [] |
||||
requireModule.keys().forEach(fileName => { |
||||
modules.push(requireModule(fileName).default) |
||||
}) |
||||
|
||||
const frameIn = [ |
||||
{ |
||||
path: "/", |
||||
redirect: "/index" |
||||
}, |
||||
...modules |
||||
]; |
||||
|
||||
/** |
||||
* 在主框架之外显示 |
||||
*/ |
||||
|
||||
const frameOut = []; |
||||
|
||||
/** |
||||
* 错误页面 |
||||
*/ |
||||
|
||||
const errorPage = [ |
||||
{ |
||||
path: "/403", |
||||
name: "403", |
||||
meta: { |
||||
title: "403" |
||||
}, |
||||
component: () => import("@/pages/exception/error/403") |
||||
}, |
||||
{ |
||||
path: "*", |
||||
name: "404", |
||||
meta: { |
||||
title: "404" |
||||
}, |
||||
component: () => import("@/pages/exception/error/404") |
||||
} |
||||
]; |
||||
|
||||
// 导出需要显示菜单的
|
||||
export const frameInRoutes = frameIn; |
||||
|
||||
// 重新组织后导出
|
||||
export default [ |
||||
...frameIn, |
||||
...frameOut, |
||||
...errorPage |
||||
]; |
@ -0,0 +1,21 @@ |
||||
/** |
||||
* 开发配置 |
||||
* */ |
||||
|
||||
const env = process.env.NODE_ENV; |
||||
|
||||
const Setting = { |
||||
// 是否使用 Mock 的数据,默认 开发环境为 true,生产环境为 false
|
||||
isMock: true, |
||||
// 部署应用包时的基本 URL
|
||||
publicPath: env === "development" ? "./" : "", |
||||
// 生产环境构建文件的目录名
|
||||
outputDir: "dist", |
||||
// 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
|
||||
assetsDir: "static", |
||||
// 开发环境每次保存时 lint 代码,会将 lint 错误输出为编译警告
|
||||
// true || false || error
|
||||
lintOnSave: true |
||||
}; |
||||
|
||||
module.exports = Setting; |
@ -0,0 +1,82 @@ |
||||
/** |
||||
* 业务配置 |
||||
* */ |
||||
const url = location.host; |
||||
const isDev = process.env.NODE_ENV === "development"; // 开发环境
|
||||
const isPro = url.includes("occupationlab.com"); //是否职站生产
|
||||
const isTest = url.includes('121.37.12.51'); //是否中台测试服
|
||||
|
||||
let systemPath = `${location.origin}/banksystem` |
||||
let host = `${location.origin}/` |
||||
let uploadURL = `http://121.37.12.51/` |
||||
if (isPro) { |
||||
// 职站生产
|
||||
uploadURL = `https://www.huorantech.cn/` |
||||
systemPath = `https://www.huorantech.cn/banksystem` |
||||
} else if (isDev) { |
||||
// 本地
|
||||
systemPath = `http://${location.hostname}:8093` |
||||
host = "http://121.37.12.51/"; // 中台测试服
|
||||
// host = "http://192.168.31.151:9000/"; // 榕
|
||||
// host = "http://192.168.31.137:9000/"; // 赓
|
||||
} |
||||
|
||||
const Setting = { |
||||
/** |
||||
* 基础配置 |
||||
* */ |
||||
platformId: 1, // 平台标识,1职站,2数据平台,3中台
|
||||
titleSuffix: '粒子研究院', // 网页标题的后缀
|
||||
routerMode: "hash", // 路由模式,可选值为 history 或 hash
|
||||
showProgressBar: true, // 页面切换时,是否显示模拟的进度条
|
||||
apiBaseURL: host, // 接口请求地址
|
||||
uploadURL, // 阿里云oss域名
|
||||
systemPath, // 子系统地址前缀
|
||||
autoLogoutTime: 3600000, // 长时间未操作,自动退出登录时间
|
||||
modalDuration: 3, // 接口请求返回错误时,弹窗的持续时间,单位:秒
|
||||
errorModalType: "Message", // 接口请求返回错误时,弹窗的类型,可选值为 Message 或 Notice
|
||||
cookiesExpires: 1, // Cookies 默认保存时间,单位:天
|
||||
tokenExpires: 1296000000, // token在localStorage的时间(毫秒)
|
||||
tokenKey: "official_token", // localStorage里保存的token的key
|
||||
storeKey: "official_store", // localStorage里保存的vuex的key
|
||||
initialPassword: "111aaa", // 默认密码
|
||||
isDev, |
||||
isTest, |
||||
isPro, |
||||
/** |
||||
* 路由白名单 |
||||
* */ |
||||
whiteList: ['/login', '/index/list', '/cityPartner/list', '/devPlatform/list'], |
||||
/** |
||||
* 平台列表 |
||||
* */ |
||||
platformList: [ |
||||
{ |
||||
id: 1, |
||||
name: '职站' |
||||
}, |
||||
{ |
||||
id: 2, |
||||
name: '数据平台' |
||||
}, |
||||
{ |
||||
id: 3, |
||||
name: '中台' |
||||
} |
||||
], |
||||
/** |
||||
* 多语言配置 |
||||
* */ |
||||
i18n: { |
||||
default: "zh", // 默认语言
|
||||
auto: false // 是否根据用户电脑配置自动设置语言(仅第一次有效)
|
||||
}, |
||||
layout: {}, // 布局配置
|
||||
/** |
||||
* 功能配置 |
||||
* */ |
||||
sameRouteForceUpdate: false, // 相同路由,不同参数间进行切换,是否强力更新
|
||||
dynamicRoute: false // 是否使用动态路由
|
||||
}; |
||||
|
||||
export default Setting; |
@ -0,0 +1,2 @@ |
||||
const getters = {}; |
||||
export default getters; |
@ -0,0 +1,25 @@ |
||||
import Vue from "vue"; |
||||
import Vuex from "vuex"; |
||||
import getters from "./getters"; |
||||
|
||||
Vue.use(Vuex); |
||||
|
||||
// https://webpack.js.org/guides/dependency-management/#requirecontext
|
||||
const modulesFiles = require.context("./modules", true, /\.js$/); |
||||
|
||||
// you do not need `import app from './modules/app'`
|
||||
// it will auto require all vuex module from modules file
|
||||
const modules = modulesFiles.keys().reduce((modules, modulePath) => { |
||||
// set './app.js' => 'app'
|
||||
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, "$1"); |
||||
const value = modulesFiles(modulePath); |
||||
modules[moduleName] = value.default; |
||||
return modules; |
||||
}, {}); |
||||
|
||||
const store = new Vuex.Store({ |
||||
modules, |
||||
getters |
||||
}); |
||||
|
||||
export default store; |
@ -0,0 +1,22 @@ |
||||
/** |
||||
* 布局管理 |
||||
* */ |
||||
|
||||
// 是否IE
|
||||
function isIE() { |
||||
if (!!window.ActiveXObject || "ActiveXObject" in window) return true; |
||||
return false; |
||||
} |
||||
|
||||
export default { |
||||
namespaced: true, |
||||
state: { |
||||
isIE: isIE() |
||||
}, |
||||
mutations: { |
||||
SET_IE: (state, val) => { |
||||
state.isIE = val; |
||||
} |
||||
}, |
||||
actions: {} |
||||
}; |
@ -0,0 +1,107 @@ |
||||
import Setting from "@/setting"; |
||||
import util from "@/libs/util"; |
||||
import { post, get, del, put } from "@/plugins/requests/index.js"; |
||||
import api from "@/api"; |
||||
/** |
||||
* 用户信息 |
||||
* */ |
||||
export default { |
||||
namespaced: true, |
||||
state: { |
||||
activeTab: "/station/list", // 当前激活菜单
|
||||
title: '', |
||||
logoUrl: '', |
||||
avatar: "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png", |
||||
userId: '', |
||||
studentId: '', |
||||
userName: '', |
||||
customerName: '', |
||||
schoolId: '', |
||||
roleId: '', |
||||
dataTime: '', |
||||
logView: false // 是否查询过日志状态,如果有,则不再调接口
|
||||
}, |
||||
mutations: { |
||||
SET_INFO: (state, info) => { |
||||
if (info.avatar) state.avatar = info.avatar; |
||||
state.userId = info.userId; |
||||
state.studentId = info.studentId; |
||||
state.schoolId = info.schoolId; |
||||
state.userName = info.userName; |
||||
state.roleId = info.roleId; |
||||
state.dataTime = info.dataTime; |
||||
}, |
||||
SET_TITLE: (state, title) => { |
||||
state.title = title; |
||||
}, |
||||
SET_LOGO_URL: (state, logoUrl) => { |
||||
state.logoUrl = logoUrl; |
||||
}, |
||||
SET_AVATAR: (state, avatar) => { |
||||
state.avatar = avatar; |
||||
}, |
||||
SET_USERNAME: (state, userName) => { |
||||
state.userName = userName; |
||||
}, |
||||
SET_CUSTOMERNAME: (state, customerName) => { |
||||
state.customerName = customerName; |
||||
}, |
||||
SET_ACTIVE_TAB: (state, activeTab) => { |
||||
state.activeTab = activeTab; |
||||
}, |
||||
SET_LOG: (state) => { |
||||
state.logView = true |
||||
}, |
||||
}, |
||||
actions: { |
||||
login({ state, commit }, userInfo) { |
||||
return new Promise((resolve, reject) => { |
||||
post(api.logins, userInfo).then(res => { |
||||
if (res.status == 200) { |
||||
let { data } = res; |
||||
// 生成路由权限
|
||||
// 每个系统都是用这套角色权限代码的,后端也是基本一样,除了个别字段可能会不一样
|
||||
// 总体来说就两个步骤: 1是生成能够访问的路由的数组集合,2是生成能看到的按钮的数组集合
|
||||
//res.message.listValue && Setting.dynamicRoute && addRoutes(res.message.listValue)
|
||||
util.local.set(Setting.tokenKey, data.token, Setting.tokenExpires); |
||||
util.successMsg("登录成功"); |
||||
// console.log(data, "登录保存的数据");
|
||||
commit("SET_INFO", data); |
||||
resolve(); |
||||
} else { |
||||
util.errorMsg(res.message); |
||||
reject(res); |
||||
} |
||||
}).catch(error => { |
||||
reject(error); |
||||
}); |
||||
}); |
||||
}, |
||||
logout({ commit, state, dispatch }) { |
||||
return new Promise((resolve, reject) => { |
||||
util.local.remove(Setting.storeKey); |
||||
util.local.remove(Setting.tokenKey); |
||||
location.reload(); |
||||
resolve(); |
||||
}); |
||||
}, |
||||
setInfo({ state, commit }, info) { |
||||
commit("SET_INFO", info); |
||||
}, |
||||
setTitle({ state, commit }, title) { |
||||
commit("SET_TITLE", title); |
||||
}, |
||||
setLogoUrl({ state, commit }, logoUrl) { |
||||
commit("SET_LOGO_URL", logoUrl); |
||||
}, |
||||
setAvatar({ state, commit }, avatar) { |
||||
commit("SET_AVATAR", avatar); |
||||
}, |
||||
setUserName({ state, commit }, userName) { |
||||
commit("SET_USERNAME", userName); |
||||
}, |
||||
setActiveTab({ state, commit }, activeTab) { |
||||
commit("SET_ACTIVE_TAB", activeTab); |
||||
} |
||||
} |
||||
}; |
@ -0,0 +1,391 @@ |
||||
@import "./default/index.scss"; |
||||
@import "./var.scss"; |
||||
|
||||
@font-face { |
||||
font-family: youshe; |
||||
src: url('font/YouSheBiaoTiHei.ttf'); |
||||
} |
||||
@font-face { |
||||
font-family: din; |
||||
src: url('font/din.otf'); |
||||
} |
||||
|
||||
[v-cloak] { |
||||
display: none; |
||||
} |
||||
|
||||
.flex-between { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
.l-title { |
||||
margin-bottom: 0; |
||||
} |
||||
} |
||||
|
||||
::-webkit-scrollbar { |
||||
width: 8px; |
||||
height: 8px; |
||||
} |
||||
|
||||
::-webkit-scrollbar-thumb { |
||||
width: 5px; |
||||
border-radius: 6px; |
||||
background: #d7d7d7; |
||||
} |
||||
.main { |
||||
.view { |
||||
min-width: $min-width; |
||||
min-height: calc(100vh - 90px); |
||||
padding: 12px 200px 20px; |
||||
margin: 0 auto; |
||||
background-color: #F3F6FA; |
||||
&.no-pd { |
||||
padding-top: 0; |
||||
} |
||||
&.pb { |
||||
padding-bottom: 20px; |
||||
} |
||||
} |
||||
.wrap-inner { |
||||
min-width: $min-width; |
||||
width: 100%; |
||||
padding: 0 200px 20px; |
||||
margin: 0 auto; |
||||
} |
||||
.center-wrap { |
||||
width: 1000px; |
||||
padding-bottom: 20px; |
||||
margin: 40px auto 0; |
||||
} |
||||
} |
||||
.l-title{ |
||||
display: flex; |
||||
align-items: center; |
||||
margin-bottom: 12px; |
||||
font-size: 14px; |
||||
color: #333; |
||||
img{ |
||||
margin-right: 5px; |
||||
} |
||||
} |
||||
.p-title { |
||||
padding-left: 5px; |
||||
margin-bottom: 24px; |
||||
line-height: 1; |
||||
font-size: 14px; |
||||
color: #585858; |
||||
border-left: 3px solid $--color-primary; |
||||
} |
||||
|
||||
.el-input { |
||||
.el-input__inner { |
||||
border-color: rgba(0, 0, 0, 0.15); |
||||
} |
||||
} |
||||
|
||||
.filter { |
||||
width: 100vw; |
||||
display: inline-flex; |
||||
align-items: center; |
||||
flex: 1; |
||||
|
||||
li { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
margin-right: 30px; |
||||
|
||||
label { |
||||
margin-right: 6px; |
||||
font-size: 14px; |
||||
line-height: 14px; |
||||
color: rgba(0, 0, 0, .65); |
||||
white-space: nowrap; |
||||
} |
||||
|
||||
.el-radio { |
||||
margin-right: 10px !important; |
||||
|
||||
.el-radio__input { |
||||
display: none !important; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.page { |
||||
position: relative; |
||||
padding: 24px 16px; |
||||
background-color: #fff; |
||||
|
||||
.tool { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
margin-bottom: 24px; |
||||
|
||||
.single-choice { |
||||
dl { |
||||
display: flex; |
||||
line-height: 30px; |
||||
|
||||
dt { |
||||
color: rgba(0, 0, 0, .65); |
||||
font-size: 14px; |
||||
white-space: nowrap; |
||||
} |
||||
|
||||
dd { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
flex-wrap: wrap; |
||||
|
||||
span { |
||||
padding: 0 10px; |
||||
margin: 0 10px; |
||||
color: #333; |
||||
font-size: 14px; |
||||
line-height: 1.8; |
||||
white-space: nowrap; |
||||
|
||||
cursor: pointer; |
||||
|
||||
&:hover { |
||||
color: $--color-primary; |
||||
} |
||||
|
||||
&.active { |
||||
border-radius: 4px; |
||||
color: #fff; |
||||
background-color: $--color-primary; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.pagination { |
||||
margin-top: 20px; |
||||
text-align: center; |
||||
button,.number,.more,.el-input__inner{ |
||||
min-width: 32px !important; |
||||
height: 32px !important; |
||||
line-height: 32px; |
||||
color: #333 !important; |
||||
background-color: transparent !important; |
||||
border: 1px solid #ccc !important; |
||||
border-radius: 2px !important; |
||||
} |
||||
button i{ |
||||
color: #333; |
||||
} |
||||
.active{ |
||||
color: #fff !important; |
||||
background-color: $--color-primary !important; |
||||
} |
||||
} |
||||
|
||||
.el-table{ |
||||
border-radius: 4px; |
||||
th{ |
||||
background: #E8F0FF !important; |
||||
.cell{ |
||||
color: #222326; |
||||
font-size: 12px; |
||||
font-weight: normal; |
||||
.el-checkbox{ |
||||
&:before{ |
||||
opacity: 1; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
th, td{ |
||||
padding: 10px 0; |
||||
border-bottom-color: #E1E6F2; |
||||
} |
||||
&.el-table--striped .el-table__body tr.el-table__row--striped td{ |
||||
background-color: #FAFBFF; |
||||
} |
||||
.el-checkbox__inner{ |
||||
border-radius: 4px; |
||||
transition: none !important; |
||||
} |
||||
.el-checkbox__input.is-indeterminate .el-checkbox__inner{ |
||||
background-color: #FFFFFF; |
||||
border-color: #DCDFE6; |
||||
} |
||||
.el-switch__core{ |
||||
background-color: #bfbfbf; |
||||
} |
||||
.el-switch__label--right{ |
||||
z-index: 2; |
||||
position: absolute; |
||||
right: 8px; |
||||
margin-left: 0; |
||||
color: #fff !important; |
||||
} |
||||
.el-switch__label--right.is-active{ |
||||
left: 8px; |
||||
right: auto; |
||||
} |
||||
.el-switch__label--right span{ |
||||
font-size: 12px; |
||||
} |
||||
.el-button--text{ |
||||
padding: 0; |
||||
} |
||||
} |
||||
|
||||
.el-message { |
||||
padding: 11px 20px; |
||||
|
||||
.el-message__icon { |
||||
font-size: 16px; |
||||
} |
||||
|
||||
.el-message__content { |
||||
font-size: 14px; |
||||
color: rgba(0, 0, 0, 0.65); |
||||
} |
||||
|
||||
.el-icon-close { |
||||
font-size: 14px; |
||||
color: #92998d; |
||||
} |
||||
|
||||
.el-message--success { |
||||
border: 1px solid #B7EB8F; |
||||
background: #F6FFED; |
||||
|
||||
.el-message__icon { |
||||
color: #00c700; |
||||
} |
||||
} |
||||
|
||||
.el-message--warning { |
||||
border: 1px solid #FFE58F; |
||||
background: #FFFBE6; |
||||
|
||||
.el-message__icon { |
||||
color: #ffa900; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.el-message-box { |
||||
padding-bottom: 24px; |
||||
|
||||
.el-message-box__header { |
||||
padding: 32px 32px 12px 50px; |
||||
|
||||
span { |
||||
font-size: 16px; |
||||
color: rgba(0, 0, 0, 0.85); |
||||
font-weight: 500; |
||||
} |
||||
} |
||||
|
||||
.el-message-box__status { |
||||
top: -30px; |
||||
} |
||||
|
||||
.el-message-box__status + .el-message-box__message { |
||||
font-size: 14px; |
||||
color: rgba(0, 0, 0, 0.65); |
||||
} |
||||
|
||||
.el-message-box__btns { |
||||
padding-right: 32px; |
||||
|
||||
&.el-icon-warning { |
||||
color: #ffa900; |
||||
} |
||||
} |
||||
|
||||
&:not(.normal) { |
||||
.el-button--primary { |
||||
color: #606266; |
||||
background: #fff; |
||||
border-color: #DCDFE6; |
||||
|
||||
&:hover { |
||||
color: $--color-primary; |
||||
border-color: #efbdbb; |
||||
background-color: #fae9e8; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.el-dialog__wrapper { |
||||
.el-dialog { |
||||
border-radius: 4px; |
||||
|
||||
.el-dialog__header { |
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.06); |
||||
|
||||
.el-dialog__title { |
||||
font-size: 16px; |
||||
color: rgba(0, 0, 0, 0.85); |
||||
} |
||||
} |
||||
|
||||
.el-dialog__footer { |
||||
padding: 10px 16px; |
||||
border-top: 1px solid rgba(0, 0, 0, 0.06); |
||||
|
||||
.el-button { |
||||
font-size: 14px; |
||||
border-radius: 4px; |
||||
border-color: rgba(0, 0, 0, 0.15); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.el-tooltip__popper { |
||||
width: 300px; |
||||
} |
||||
.el-tooltip__popper.is-dark { |
||||
padding: 18px 20px; |
||||
color: #606266; |
||||
line-height: 1.8; |
||||
background-color: #fff; |
||||
border: .0625rem solid #ebeef5; |
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
||||
border-radius: 4px; |
||||
} |
||||
.el-tooltip__popper[x-placement^="top"] { |
||||
.popper__arrow { |
||||
border-top-color: #fff; |
||||
&:after { |
||||
border-top-color: #fff; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@media(max-width: 1600px) { |
||||
.el-table { |
||||
.el-switch__label--right.is-active { |
||||
left: 8px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.empty{ |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
padding: 50px 0; |
||||
text-align: center; |
||||
img{ |
||||
width: 471px; |
||||
} |
||||
p{ |
||||
margin-top: 40px; |
||||
font-size: 18px; |
||||
color: rgba(0, 0, 0, 0.25); |
||||
} |
||||
} |
@ -0,0 +1,7 @@ |
||||
/* 改变主题色变量 */ |
||||
|
||||
$--color-primary: #1583FF; |
||||
|
||||
/* 改变 icon 字体路径变量,必需 */ |
||||
$--font-path: '~element-ui/lib/theme-chalk/fonts'; |
||||
@import "~element-ui/packages/theme-chalk/src/index"; |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,539 @@ |
||||
/* Logo 字体 */ |
||||
@font-face { |
||||
font-family: "iconfont logo"; |
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); |
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), |
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), |
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), |
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); |
||||
} |
||||
|
||||
.logo { |
||||
font-family: "iconfont logo"; |
||||
font-size: 160px; |
||||
font-style: normal; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
|
||||
/* tabs */ |
||||
.nav-tabs { |
||||
position: relative; |
||||
} |
||||
|
||||
.nav-tabs .nav-more { |
||||
position: absolute; |
||||
right: 0; |
||||
bottom: 0; |
||||
height: 42px; |
||||
line-height: 42px; |
||||
color: #666; |
||||
} |
||||
|
||||
#tabs { |
||||
border-bottom: 1px solid #eee; |
||||
} |
||||
|
||||
#tabs li { |
||||
cursor: pointer; |
||||
width: 100px; |
||||
height: 40px; |
||||
line-height: 40px; |
||||
text-align: center; |
||||
font-size: 16px; |
||||
border-bottom: 2px solid transparent; |
||||
position: relative; |
||||
z-index: 1; |
||||
margin-bottom: -1px; |
||||
color: #666; |
||||
} |
||||
|
||||
|
||||
#tabs .active { |
||||
border-bottom-color: #f00; |
||||
color: #222; |
||||
} |
||||
|
||||
.tab-container .content { |
||||
display: none; |
||||
} |
||||
|
||||
/* 页面布局 */ |
||||
.main { |
||||
padding: 30px 100px; |
||||
width: 960px; |
||||
margin: 0 auto; |
||||
} |
||||
|
||||
.main .logo { |
||||
color: #333; |
||||
text-align: left; |
||||
margin-bottom: 30px; |
||||
line-height: 1; |
||||
height: 110px; |
||||
margin-top: -50px; |
||||
overflow: hidden; |
||||
*zoom: 1; |
||||
} |
||||
|
||||
.main .logo a { |
||||
font-size: 160px; |
||||
color: #333; |
||||
} |
||||
|
||||
.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; |
||||
overflow: hidden; |
||||
*zoom: 1; |
||||
} |
||||
|
||||
.icon_lists li { |
||||
width: 100px; |
||||
margin-bottom: 10px; |
||||
margin-right: 20px; |
||||
text-align: center; |
||||
list-style: none !important; |
||||
cursor: default; |
||||
} |
||||
|
||||
.icon_lists li .code-name { |
||||
line-height: 1.2; |
||||
} |
||||
|
||||
.icon_lists .icon { |
||||
display: block; |
||||
height: 100px; |
||||
line-height: 100px; |
||||
font-size: 42px; |
||||
margin: 10px auto; |
||||
color: #333; |
||||
-webkit-transition: font-size 0.25s linear, width 0.25s linear; |
||||
-moz-transition: font-size 0.25s linear, width 0.25s linear; |
||||
transition: font-size 0.25s linear, width 0.25s linear; |
||||
} |
||||
|
||||
.icon_lists .icon:hover { |
||||
font-size: 100px; |
||||
} |
||||
|
||||
.icon_lists .svg-icon { |
||||
/* 通过设置 font-size 来改变图标大小 */ |
||||
width: 1em; |
||||
/* 图标和文字相邻时,垂直对齐 */ |
||||
vertical-align: -0.15em; |
||||
/* 通过设置 color 来改变 SVG 的颜色/fill */ |
||||
fill: currentColor; |
||||
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 |
||||
normalize.css 中也包含这行 */ |
||||
overflow: hidden; |
||||
} |
||||
|
||||
.icon_lists li .name, |
||||
.icon_lists li .code-name { |
||||
color: #666; |
||||
} |
||||
|
||||
/* markdown 样式 */ |
||||
.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 { |
||||
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 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; |
||||
} |
||||
|
||||
.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; |
||||
} |
||||
|
||||
/* 代码高亮 */ |
||||
/* PrismJS 1.15.0 |
||||
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ |
||||
/** |
||||
* prism.js default theme for JavaScript, CSS and HTML |
||||
* Based on dabblet (http://dabblet.com) |
||||
* @author Lea Verou |
||||
*/ |
||||
code[class*="language-"], |
||||
pre[class*="language-"] { |
||||
color: black; |
||||
background: none; |
||||
text-shadow: 0 1px white; |
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; |
||||
text-align: left; |
||||
white-space: pre; |
||||
word-spacing: normal; |
||||
word-break: normal; |
||||
word-wrap: normal; |
||||
line-height: 1.5; |
||||
|
||||
-moz-tab-size: 4; |
||||
-o-tab-size: 4; |
||||
tab-size: 4; |
||||
|
||||
-webkit-hyphens: none; |
||||
-moz-hyphens: none; |
||||
-ms-hyphens: none; |
||||
hyphens: none; |
||||
} |
||||
|
||||
pre[class*="language-"]::-moz-selection, |
||||
pre[class*="language-"] ::-moz-selection, |
||||
code[class*="language-"]::-moz-selection, |
||||
code[class*="language-"] ::-moz-selection { |
||||
text-shadow: none; |
||||
background: #b3d4fc; |
||||
} |
||||
|
||||
pre[class*="language-"]::selection, |
||||
pre[class*="language-"] ::selection, |
||||
code[class*="language-"]::selection, |
||||
code[class*="language-"] ::selection { |
||||
text-shadow: none; |
||||
background: #b3d4fc; |
||||
} |
||||
|
||||
@media print { |
||||
|
||||
code[class*="language-"], |
||||
pre[class*="language-"] { |
||||
text-shadow: none; |
||||
} |
||||
} |
||||
|
||||
/* Code blocks */ |
||||
pre[class*="language-"] { |
||||
padding: 1em; |
||||
margin: .5em 0; |
||||
overflow: auto; |
||||
} |
||||
|
||||
:not(pre) > code[class*="language-"], |
||||
pre[class*="language-"] { |
||||
background: #f5f2f0; |
||||
} |
||||
|
||||
/* Inline code */ |
||||
:not(pre) > code[class*="language-"] { |
||||
padding: .1em; |
||||
border-radius: .3em; |
||||
white-space: normal; |
||||
} |
||||
|
||||
.token.comment, |
||||
.token.prolog, |
||||
.token.doctype, |
||||
.token.cdata { |
||||
color: slategray; |
||||
} |
||||
|
||||
.token.punctuation { |
||||
color: #999; |
||||
} |
||||
|
||||
.namespace { |
||||
opacity: .7; |
||||
} |
||||
|
||||
.token.property, |
||||
.token.tag, |
||||
.token.boolean, |
||||
.token.number, |
||||
.token.constant, |
||||
.token.symbol, |
||||
.token.deleted { |
||||
color: #905; |
||||
} |
||||
|
||||
.token.selector, |
||||
.token.attr-name, |
||||
.token.string, |
||||
.token.char, |
||||
.token.builtin, |
||||
.token.inserted { |
||||
color: #690; |
||||
} |
||||
|
||||
.token.operator, |
||||
.token.entity, |
||||
.token.url, |
||||
.language-css .token.string, |
||||
.style .token.string { |
||||
color: #9a6e3a; |
||||
background: hsla(0, 0%, 100%, .5); |
||||
} |
||||
|
||||
.token.atrule, |
||||
.token.attr-value, |
||||
.token.keyword { |
||||
color: #07a; |
||||
} |
||||
|
||||
.token.function, |
||||
.token.class-name { |
||||
color: #DD4A68; |
||||
} |
||||
|
||||
.token.regex, |
||||
.token.important, |
||||
.token.variable { |
||||
color: #e90; |
||||
} |
||||
|
||||
.token.important, |
||||
.token.bold { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.token.italic { |
||||
font-style: italic; |
||||
} |
||||
|
||||
.token.entity { |
||||
cursor: help; |
||||
} |
@ -0,0 +1,448 @@ |
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8" /> |
||||
<title>IconFont Demo</title> |
||||
<link rel="shortcut icon" href="https://img.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico" |
||||
type="image/x-icon" /> |
||||
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css"> |
||||
<link rel="stylesheet" href="demo.css"> |
||||
<link rel="stylesheet" href="iconfont.css"> |
||||
<script src="iconfont.js"></script> |
||||
<!-- jQuery --> |
||||
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script> |
||||
<!-- 代码高亮 --> |
||||
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script> |
||||
</head> |
||||
<body> |
||||
<div class="main"> |
||||
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank"></a></h1> |
||||
<div class="nav-tabs"> |
||||
<ul id="tabs" class="dib-box"> |
||||
<li class="dib active"><span>Unicode</span></li> |
||||
<li class="dib"><span>Font class</span></li> |
||||
<li class="dib"><span>Symbol</span></li> |
||||
</ul> |
||||
|
||||
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=1540265" target="_blank" |
||||
class="nav-more">查看项目</a> |
||||
|
||||
</div> |
||||
<div class="tab-container"> |
||||
<div class="content unicode" style="display: block;"> |
||||
<ul class="icon_lists dib-box"> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">已勾选32</div> |
||||
<div class="code-name">&#xe63d;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">未勾选32</div> |
||||
<div class="code-name">&#xe63e;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">未勾选40</div> |
||||
<div class="code-name">&#xe64a;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">已勾选40</div> |
||||
<div class="code-name">&#xe64b;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">实 向右箭头-01</div> |
||||
<div class="code-name">&#xe626;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">实 向下箭头-01</div> |
||||
<div class="code-name">&#xe625;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">加号-填充</div> |
||||
<div class="code-name">&#xe72d;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">42指向上、上箭头</div> |
||||
<div class="code-name">&#xe769;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">44指向下、下箭头</div> |
||||
<div class="code-name">&#xe76b;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">群蜂删除-充</div> |
||||
<div class="code-name">&#xe6e9;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">qq</div> |
||||
<div class="code-name">&#xe614;</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont"></span> |
||||
<div class="name">微信-36</div> |
||||
<div class="code-name">&#xe68a;</div> |
||||
</li> |
||||
|
||||
</ul> |
||||
<div class="article markdown"> |
||||
<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">第一步:拷贝项目下面生成的 <code>@font-face</code></h3> |
||||
<pre><code class="language-css" |
||||
>@font-face { |
||||
font-family: 'iconfont'; |
||||
src: url('iconfont.eot'); |
||||
src: url('iconfont.eot?#iefix') format('embedded-opentype'), |
||||
url('iconfont.woff2') format('woff2'), |
||||
url('iconfont.woff') format('woff'), |
||||
url('iconfont.ttf') format('truetype'), |
||||
url('iconfont.svg#iconfont') format('svg'); |
||||
} |
||||
</code></pre> |
||||
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3> |
||||
<pre><code class="language-css" |
||||
>.iconfont { |
||||
font-family: "iconfont" !important; |
||||
font-size: 16px; |
||||
font-style: normal; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
</code></pre> |
||||
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3> |
||||
<pre> |
||||
<code class="language-html" |
||||
><span class="iconfont">&#x33;</span> |
||||
</code></pre> |
||||
<blockquote> |
||||
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p> |
||||
</blockquote> |
||||
</div> |
||||
</div> |
||||
<div class="content font-class"> |
||||
<ul class="icon_lists dib-box"> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-yigouxuan"></span> |
||||
<div class="name"> |
||||
已勾选32 |
||||
</div> |
||||
<div class="code-name">.icon-yigouxuan |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-weigouxuan"></span> |
||||
<div class="name"> |
||||
未勾选32 |
||||
</div> |
||||
<div class="code-name">.icon-weigouxuan |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-weigouxuan1"></span> |
||||
<div class="name"> |
||||
未勾选40 |
||||
</div> |
||||
<div class="code-name">.icon-weigouxuan1 |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-yigouxuan1"></span> |
||||
<div class="name"> |
||||
已勾选40 |
||||
</div> |
||||
<div class="code-name">.icon-yigouxuan1 |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-shixiangyoujiantou-"></span> |
||||
<div class="name"> |
||||
实 向右箭头-01 |
||||
</div> |
||||
<div class="code-name">.icon-shixiangyoujiantou- |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-shixiangxiajiantou-"></span> |
||||
<div class="name"> |
||||
实 向下箭头-01 |
||||
</div> |
||||
<div class="code-name">.icon-shixiangxiajiantou- |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-jiahao"></span> |
||||
<div class="name"> |
||||
加号-填充 |
||||
</div> |
||||
<div class="code-name">.icon-jiahao |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-up"></span> |
||||
<div class="name"> |
||||
42指向上、上箭头 |
||||
</div> |
||||
<div class="code-name">.icon-up |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-down"></span> |
||||
<div class="name"> |
||||
44指向下、下箭头 |
||||
</div> |
||||
<div class="code-name">.icon-down |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-delete"></span> |
||||
<div class="name"> |
||||
群蜂删除-充 |
||||
</div> |
||||
<div class="code-name">.icon-delete |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-qq"></span> |
||||
<div class="name"> |
||||
qq |
||||
</div> |
||||
<div class="code-name">.icon-qq |
||||
</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<span class="icon iconfont icon-weixin"></span> |
||||
<div class="name"> |
||||
微信-36 |
||||
</div> |
||||
<div class="code-name">.icon-weixin |
||||
</div> |
||||
</li> |
||||
|
||||
</ul> |
||||
<div class="article markdown"> |
||||
<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="language-html"><link rel="stylesheet" href="./iconfont.css"> |
||||
</code></pre> |
||||
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3> |
||||
<pre><code class="language-html"><span class="iconfont icon-xxx"></span> |
||||
</code></pre> |
||||
<blockquote> |
||||
<p>" |
||||
iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p> |
||||
</blockquote> |
||||
</div> |
||||
</div> |
||||
<div class="content symbol"> |
||||
<ul class="icon_lists dib-box"> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-yigouxuan"></use> |
||||
</svg> |
||||
<div class="name">已勾选32</div> |
||||
<div class="code-name">#icon-yigouxuan</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-weigouxuan"></use> |
||||
</svg> |
||||
<div class="name">未勾选32</div> |
||||
<div class="code-name">#icon-weigouxuan</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-weigouxuan1"></use> |
||||
</svg> |
||||
<div class="name">未勾选40</div> |
||||
<div class="code-name">#icon-weigouxuan1</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-yigouxuan1"></use> |
||||
</svg> |
||||
<div class="name">已勾选40</div> |
||||
<div class="code-name">#icon-yigouxuan1</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-shixiangyoujiantou-"></use> |
||||
</svg> |
||||
<div class="name">实 向右箭头-01</div> |
||||
<div class="code-name">#icon-shixiangyoujiantou-</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-shixiangxiajiantou-"></use> |
||||
</svg> |
||||
<div class="name">实 向下箭头-01</div> |
||||
<div class="code-name">#icon-shixiangxiajiantou-</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-jiahao"></use> |
||||
</svg> |
||||
<div class="name">加号-填充</div> |
||||
<div class="code-name">#icon-jiahao</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-up"></use> |
||||
</svg> |
||||
<div class="name">42指向上、上箭头</div> |
||||
<div class="code-name">#icon-up</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-down"></use> |
||||
</svg> |
||||
<div class="name">44指向下、下箭头</div> |
||||
<div class="code-name">#icon-down</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-delete"></use> |
||||
</svg> |
||||
<div class="name">群蜂删除-充</div> |
||||
<div class="code-name">#icon-delete</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-qq"></use> |
||||
</svg> |
||||
<div class="name">qq</div> |
||||
<div class="code-name">#icon-qq</div> |
||||
</li> |
||||
|
||||
<li class="dib"> |
||||
<svg class="icon svg-icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-weixin"></use> |
||||
</svg> |
||||
<div class="name">微信-36</div> |
||||
<div class="code-name">#icon-weixin</div> |
||||
</li> |
||||
|
||||
</ul> |
||||
<div class="article markdown"> |
||||
<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="language-html"><script src="./iconfont.js"></script> |
||||
</code></pre> |
||||
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3> |
||||
<pre><code class="language-html"><style> |
||||
.icon { |
||||
width: 1em; |
||||
height: 1em; |
||||
vertical-align: -0.15em; |
||||
fill: currentColor; |
||||
overflow: hidden; |
||||
} |
||||
</style> |
||||
</code></pre> |
||||
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3> |
||||
<pre><code class="language-html"><svg class="icon" aria-hidden="true"> |
||||
<use xlink:href="#icon-xxx"></use> |
||||
</svg> |
||||
</code></pre> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
<script> |
||||
$(document).ready(function() { |
||||
$(".tab-container .content:first").show(); |
||||
|
||||
$("#tabs li").click(function(e) { |
||||
var tabContent = $(".tab-container .content"); |
||||
var index = $(this).index(); |
||||
|
||||
if ($(this).hasClass("active")) { |
||||
return; |
||||
} else { |
||||
$("#tabs li").removeClass("active"); |
||||
$(this).addClass("active"); |
||||
|
||||
tabContent.hide().eq(index).fadeIn(); |
||||
} |
||||
}); |
||||
}); |
||||
</script> |
||||
</body> |
||||
</html> |
@ -0,0 +1,70 @@ |
||||
@font-face { |
||||
font-family: "iconfont"; |
||||
src: url('iconfont.eot?t=1589437921018'); /* IE9 */ |
||||
src: url('iconfont.eot?t=1589437921018#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAdgAAsAAAAADwwAAAcTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCESgqOeIt2ATYCJAM0CxwABCAFhG0HgTMbpQxRlHBSFNlX2JThXqSJ4cz0aLyxzNkVgYOP2N97wQhUeQbPDZA1QByDeHha+9+5M7PrD1FpdI8mCSqJLulDJPFDxCQTvUQS6Qtka3ukU0/kuK8wfBBwMr1kmeTIb8hUohVh6lTeCHDCrRPPf5v6f+sQfS+QqgmpiZLNw+ZI6zMXZGL3nXY47elJFnjALaE4zjzyjJN773yuzM/7H4oZ9NV+v/q1g1ddvP1QmE5JlPRM7uAv5klMk0vWTBWTLpoJEUIja6hWSkNhOklN/ds4n0BvhyLMuZ6hKdArLC1Q4a4iG0Gfi1JaHEMbXtfsW8S8SpsepzuAJ+HLx28hoSepMmvby3e6LdC2EN2eV0ykW36MR/MlQFiJjGNAEej7WvtLgB6aM6evXtwH1glnTloW1snRYnBhky+LxyuL9glaGNmaDbRsJYR1tl+seImrgUGtEtLc//GMeo1WR9QYfUSrp7nohWgXDRrJBqpBcoAqkGagAGkBSiADQBlkEKiAbAI/N/mCYHoWi1HDEgWoBbGjlg7M/OpbgEMgnUf0fxab8kjK0tvq8cZ6/dpKwk4bNsXFx4bHR4RHcty4LVnR4xp/2TFxDN42tgefhUpEMeeqppXCU50JyT/gkVCD+EiEgl56LOkMN+6cAfyKs3dvomHU7fvnq96Uc/duIXMMqWmhNRoax1m8jNWfPorp2jlqumvHrolfe/2TcuIPCt3K589dhUNiT5OSEh4KoM9Jp1vK2GMnFjDdyaeFMrd06ki1gn9CmEz3OErpebmp+GzyAN+lMLw6dwkKh6Ve5dOnzp4W0+Y25TTfhHB10isXpxIB5GHDKcggnof+NCpCD+okAFyTPNGuRVgahmhLjZo1rnqnMlpD0ORJSluuY6jT+gPWHtaIeDKOaoradNDPruOQzulPGcBtz0C2YdbLrSFPIMGTrcNRDGC3YnJOm1JLceYK2sCWY5lqxICXIEU0gki2nkPFUteBwoqLMyTdKE7ZlOzE3yHfdSyOU2shl8RoxPJlx1bQ6C0Li3DLg+Sdi+c5evEkhtF3rBdfXpe0IiNcfW27+x6u5U4vs8zZZdu1R7Gblyc6AV9OB4Xp65HRDqcvw0Pi1DGbddntOKzYgkbhXJq+Y4bRVqszl746KdRPFV5FxSUb6XmKomd1yCb0nJbpz+aOIZskx0phXx8sHfNKyRjPsM8LGU/xJ9Qrv2JugdVBkBg/ZpUIDvpN0jfHD550XPKNDgkKEZ46l4dwq0sOxIecJlX2pxxA8GTwkCGMFqxVFf5PRZplCky9uCIQL/s/RFabTYZNkhtkQXFR28vKXwKUP5rZbFg+s3VAFTu5dBZG4G07t5tHuM2cFirh2BisrHKYoE8lzO1h/LkwjSD+VZF0qs1hQVK+d0xHOLN80q4B/P9utxQDmGt4DaEKE6Lc5lnI6VxDf/35owQHCAuKw95VG6l1bvXPY3J1slpepPBXdCx8EM+ubbd2tV48b2UtWLtYb89PZhvg2jsq5+zkBdIVVTFHfhEwNv0CxNiT02LKVxGSus1dt9VsXDZulogOJB1AkGQVg4e833uzaWatx7bPrLKyhBeBqlC3xGqNoe3MVQHmDmBs4jm+xFjW/sjcAgOiPOFawwe3bUeTa20vGNZgbV6tCtL/qEL/fmiFLjqCCDpZdQpkdKgx6tSuzlCdqnrMFsLMhWn9sKH4ezmjmvpp9Selw9oCS0Vtcbox4f967yYpc1lNwUzPAUT3N0R32yz0bof5Wblw2jzkuw4VkWFptzoKckHRUwszvHJS8IgkAfys2IvKr/LtZBa1LzvfHBmFD6/V9enLD7LLJD2tz7n3E8BkFcwVyA/DL8P0fCpXAdLntBfy9tQCpuUP2QBAWkwyYccYGYFWWc/HS8Of6pVNf1r8p8n48bn+wPLzm5gyWoneAh3ivzATiiRKljoz8hQTN3S0itSojpnbgvjFod7uBf2Rtsa7dej63gKVRdenkDS2Q9baZyzWY1AZnIBa6yT0juo9eLCWhhOlwxFrCYRVjkKywhfIVrlrLNa3UNngB9RWBQe9mxF1zMGBUFCnRoyUWLBpCStm1SU5sRRFFSeI7HUYtawUeswQzaNk4PKSsmJBL3ERbY4dPD65glIJS5rqxD3kYsThULFbU23ETEuslLobSkuluh1LzKoTkLM0hBH1A1pgJku2CjOVizQ+hUrPP4GQeTkYaS0tarYzCI2HMnusXImyHsZe3dWrxb1U9/CRVaBMggS79TUqJ6yHSSAcdq4Kc9evZUOYUSWsI7LdGpQy7Ul99ZL1qfObT4CedX+zSJGjRBV1NNFGF30MMcYsVugeKLLqDXiNLuQnSQjRvRwtrRzlsSoBxeiSl1SvLVQoF1FcZj0Jqi46odWosl43b1H9Lp2FOAgl7OKibs6cgOICAA==') format('woff2'), |
||||
url('iconfont.woff?t=1589437921018') format('woff'), |
||||
url('iconfont.ttf?t=1589437921018') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url('iconfont.svg?t=1589437921018#iconfont') format('svg'); /* iOS 4.1- */ |
||||
} |
||||
|
||||
.iconfont { |
||||
font-family: "iconfont" !important; |
||||
font-size: 16px; |
||||
font-style: normal; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
|
||||
.icon-yigouxuan:before { |
||||
content: "\e63d"; |
||||
} |
||||
|
||||
.icon-weigouxuan:before { |
||||
content: "\e63e"; |
||||
} |
||||
|
||||
.icon-weigouxuan1:before { |
||||
content: "\e64a"; |
||||
} |
||||
|
||||
.icon-yigouxuan1:before { |
||||
content: "\e64b"; |
||||
} |
||||
|
||||
.icon-shixiangyoujiantou-:before { |
||||
content: "\e626"; |
||||
} |
||||
|
||||
.icon-shixiangxiajiantou-:before { |
||||
content: "\e625"; |
||||
} |
||||
|
||||
.icon-jiahao:before { |
||||
content: "\e72d"; |
||||
} |
||||
|
||||
.icon-up:before { |
||||
content: "\e769"; |
||||
} |
||||
|
||||
.icon-down:before { |
||||
content: "\e76b"; |
||||
} |
||||
|
||||
.icon-delete:before { |
||||
content: "\e6e9"; |
||||
} |
||||
|
||||
.icon-qq:before { |
||||
content: "\e614"; |
||||
font-size: 60px; |
||||
color: #22aaf8; |
||||
margin-left: 32px; |
||||
} |
||||
|
||||
.icon-weixin:before { |
||||
content: "\e68a"; |
||||
font-size: 60px; |
||||
color: #10b747; |
||||
margin-right: 32px; |
||||
} |
||||
|
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -0,0 +1,93 @@ |
||||
{ |
||||
"id": "1540265", |
||||
"name": "education", |
||||
"font_family": "iconfont", |
||||
"css_prefix_text": "icon-", |
||||
"description": "", |
||||
"glyphs": [ |
||||
{ |
||||
"icon_id": "2716513", |
||||
"name": "已勾选32", |
||||
"font_class": "yigouxuan", |
||||
"unicode": "e63d", |
||||
"unicode_decimal": 58941 |
||||
}, |
||||
{ |
||||
"icon_id": "2716516", |
||||
"name": "未勾选32", |
||||
"font_class": "weigouxuan", |
||||
"unicode": "e63e", |
||||
"unicode_decimal": 58942 |
||||
}, |
||||
{ |
||||
"icon_id": "2892929", |
||||
"name": "未勾选40", |
||||
"font_class": "weigouxuan1", |
||||
"unicode": "e64a", |
||||
"unicode_decimal": 58954 |
||||
}, |
||||
{ |
||||
"icon_id": "2892954", |
||||
"name": "已勾选40", |
||||
"font_class": "yigouxuan1", |
||||
"unicode": "e64b", |
||||
"unicode_decimal": 58955 |
||||
}, |
||||
{ |
||||
"icon_id": "5979965", |
||||
"name": "实 向右箭头-01", |
||||
"font_class": "shixiangyoujiantou-", |
||||
"unicode": "e626", |
||||
"unicode_decimal": 58918 |
||||
}, |
||||
{ |
||||
"icon_id": "5979966", |
||||
"name": "实 向下箭头-01", |
||||
"font_class": "shixiangxiajiantou-", |
||||
"unicode": "e625", |
||||
"unicode_decimal": 58917 |
||||
}, |
||||
{ |
||||
"icon_id": "8349103", |
||||
"name": "加号-填充", |
||||
"font_class": "jiahao", |
||||
"unicode": "e72d", |
||||
"unicode_decimal": 59181 |
||||
}, |
||||
{ |
||||
"icon_id": "6129078", |
||||
"name": "42指向上、上箭头", |
||||
"font_class": "up", |
||||
"unicode": "e769", |
||||
"unicode_decimal": 59241 |
||||
}, |
||||
{ |
||||
"icon_id": "6129081", |
||||
"name": "44指向下、下箭头", |
||||
"font_class": "down", |
||||
"unicode": "e76b", |
||||
"unicode_decimal": 59243 |
||||
}, |
||||
{ |
||||
"icon_id": "410692", |
||||
"name": "群蜂删除-充", |
||||
"font_class": "delete", |
||||
"unicode": "e6e9", |
||||
"unicode_decimal": 59113 |
||||
}, |
||||
{ |
||||
"icon_id": "468193", |
||||
"name": "qq", |
||||
"font_class": "qq", |
||||
"unicode": "e614", |
||||
"unicode_decimal": 58900 |
||||
}, |
||||
{ |
||||
"icon_id": "7009153", |
||||
"name": "微信-36", |
||||
"font_class": "weixin", |
||||
"unicode": "e68a", |
||||
"unicode_decimal": 59018 |
||||
} |
||||
] |
||||
} |
After Width: | Height: | Size: 11 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,3 @@ |
||||
[class*=" icon-"], [class^=icon-] { |
||||
font-family: iconfont !important; |
||||
} |
@ -0,0 +1,6 @@ |
||||
@import "./default/index.scss"; |
||||
@import "./font/iconfont.css"; |
||||
@import "./font/icon/iconfont.css"; |
||||
@import "./lib/index.scss"; |
||||
@import "./layout/index.scss"; |
||||
@import "./common.scss"; |
@ -0,0 +1,17 @@ |
||||
@import "lib/var"; |
||||
@import "var"; |
||||
|
||||
html, |
||||
body, |
||||
#app, |
||||
.wrapper { |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
|
||||
body { |
||||
min-width: 1280px; |
||||
font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif; |
||||
font-size: 14px; |
||||
background: rgba(0, 0, 0, 0.02); |
||||
} |
@ -0,0 +1,7 @@ |
||||
@import "var"; |
||||
|
||||
@each $name, $color in $bg-colors { |
||||
.bg-#{$name} { |
||||
background-color: $color; |
||||
} |
||||
} |
@ -0,0 +1,78 @@ |
||||
@import "var"; |
||||
|
||||
.border { |
||||
border: 1px solid $color-border; |
||||
} |
||||
|
||||
// vertical |
||||
.b-v { |
||||
border-top: 1px solid $color-border; |
||||
border-bottom: 1px solid $color-border; |
||||
} |
||||
|
||||
// horizontal |
||||
.b-h { |
||||
border-left: 1px solid $color-border; |
||||
border-right: 1px solid $color-border; |
||||
} |
||||
|
||||
// border double |
||||
.b-double { |
||||
border: double $color-border; |
||||
} |
||||
|
||||
.b-w-thin { |
||||
border-width: 0.55px; |
||||
} |
||||
|
||||
.b-round { |
||||
border-radius: 50%; |
||||
} |
||||
|
||||
.b-none { |
||||
border: none; |
||||
} |
||||
|
||||
@each $side in left, right, top, bottom { |
||||
.b-#{str-slice($side, 0, 1)} { |
||||
border-#{$side}: 1px solid $color-border; |
||||
} |
||||
} |
||||
|
||||
// border-style |
||||
@each $style in dotted, dashed { |
||||
.border-#{$style} { |
||||
border: 1px $style $color-border |
||||
} |
||||
.b-v-#{$style} { |
||||
border-top: 1px $style $color-border; |
||||
border-bottom: 1px $style $color-border; |
||||
} |
||||
.b-h-#{$style} { |
||||
border-left: 1px $style $color-border; |
||||
border-right: 1px $style $color-border; |
||||
} |
||||
@each $side in left, right, top, bottom { |
||||
.b-#{str-slice($side, 0, 1)}-#{$style} { |
||||
border-#{$side}: 1px $style $color-border; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@for $size from 0 through $border-width-through { |
||||
.b-#{$size} { |
||||
border-width: #{$size}px; |
||||
} |
||||
} |
||||
|
||||
@for $size from 0 through $border-radius-through { |
||||
.b-radius-#{$size}, .b-r-#{$size} { |
||||
border-radius: #{$size}px; |
||||
} |
||||
} |
||||
|
||||
@each $name, $color in $border-colors { |
||||
.b-#{$name} { |
||||
border-color: $color; |
||||
} |
||||
} |
@ -0,0 +1,56 @@ |
||||
@import "var"; |
||||
|
||||
/** |
||||
* margin padding |
||||
* @each 循环多次保证优先级 |
||||
*/ |
||||
|
||||
.m-auto { |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
@each $size in $box-sizes { |
||||
.m-#{$size}, .margin-#{$size} { |
||||
margin: #{$size}px; |
||||
} |
||||
@if $size >= 0 { |
||||
.p-#{$size}, .padding-#{$size} { |
||||
padding: #{$size}px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@each $size in $box-sizes { |
||||
.m-h-#{$size} { |
||||
margin-left: #{$size}px; |
||||
margin-right: #{$size}px; |
||||
} |
||||
.m-v-#{$size} { |
||||
margin-top: #{$size}px; |
||||
margin-bottom: #{$size}px; |
||||
} |
||||
@if $size >= 0 { |
||||
.p-h-#{$size} { |
||||
padding-left: #{$size}px; |
||||
padding-right: #{$size}px; |
||||
} |
||||
.p-v-#{$size} { |
||||
padding-top: #{$size}px; |
||||
padding-bottom: #{$size}px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@each $size in $box-sizes { |
||||
@each $side in top right bottom left { |
||||
.m-#{str-slice($side, 0, 1)}-#{$size} { |
||||
margin-#{$side}: #{$size}px; |
||||
} |
||||
@if $size >= 0 { |
||||
.p-#{str-slice($side, 0, 1)}-#{$size} { |
||||
padding-#{$side}: #{$size}px; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,5 @@ |
||||
@each $type in default, auto, crosshair, pointer, move, text, wait, help { |
||||
.cursor-#{$type} { |
||||
cursor: $type; |
||||
} |
||||
} |
@ -0,0 +1,15 @@ |
||||
@import "var"; |
||||
|
||||
@each $type in inherit, none, inline, inline-block, block, table, inline-table, table-cell { |
||||
.d-#{$type} { |
||||
display: #{$type}; |
||||
} |
||||
} |
||||
|
||||
.hide { |
||||
display: none; |
||||
} |
||||
|
||||
.show { |
||||
display: block |
||||
} |
@ -0,0 +1,58 @@ |
||||
.flex { |
||||
display: flex; |
||||
} |
||||
|
||||
.flex-column { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
.j-start { |
||||
justify-content: flex-start; |
||||
} |
||||
|
||||
.j-end { |
||||
justify-content: flex-end; |
||||
} |
||||
|
||||
.j-center { |
||||
justify-content: center; |
||||
} |
||||
|
||||
.j-between { |
||||
justify-content: space-between; |
||||
} |
||||
|
||||
.j-around { |
||||
justify-content: space-around; |
||||
} |
||||
|
||||
.a-start { |
||||
align-items: flex-start; |
||||
} |
||||
|
||||
.a-center { |
||||
align-items: center; |
||||
} |
||||
|
||||
.a-end { |
||||
align-items: flex-end; |
||||
} |
||||
|
||||
@each $type in nowrap, wrap, wrap-reverse { |
||||
.flex-#{$type} { |
||||
flex-wrap: $type; |
||||
} |
||||
} |
||||
|
||||
@each $size in 1, 2, 3 { |
||||
.flex-#{$size} { |
||||
flex: $size; |
||||
} |
||||
} |
||||
|
||||
@for $i from 0 through 3 { |
||||
.flex-s-#{$i} { |
||||
flex-shrink: $i; |
||||
} |
||||
} |
@ -0,0 +1,18 @@ |
||||
.cl { |
||||
&:before, &:after { |
||||
content: ' '; |
||||
display: table; |
||||
} |
||||
|
||||
&:after { |
||||
clear: both; |
||||
} |
||||
} |
||||
|
||||
.fl { |
||||
float: left; |
||||
} |
||||
|
||||
.fr { |
||||
float: right; |
||||
} |
@ -0,0 +1,41 @@ |
||||
@import "var"; |
||||
|
||||
@for $size from 0 through $font-size-em-through { |
||||
.fs-em-#{$size} { |
||||
font-size: #{$size}em; |
||||
} |
||||
@if $size <= $font-size-em-decimal-through { |
||||
@for $i from 0 to 10 { |
||||
.fs-em-#{$size}_#{$i} { |
||||
font-size: #{$size}#{'.'}#{$i}em; |
||||
} |
||||
} |
||||
} @else { |
||||
.fs-em-#{$size}_5 { |
||||
font-size: #{$size}#{'.5'}em; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@for $size from 0 through $font-size-rem-through { |
||||
.fs-rem-#{$size} { |
||||
font-size: #{$size}rem; |
||||
} |
||||
@if $size <= $font-size-rem-decimal-through { |
||||
@for $i from 0 to 10 { |
||||
.fs-rem-#{$size}_#{$i} { |
||||
font-size: #{$size}#{'.'}#{$i}rem; |
||||
} |
||||
} |
||||
} @else { |
||||
.fs-rem-#{$size}_5 { |
||||
font-size: #{$size}#{'.5'}rem; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@for $size from 12 through $font-size-px-through { |
||||
.fs-#{$size} { |
||||
font-size: #{$size}px; |
||||
} |
||||
} |
@ -0,0 +1,17 @@ |
||||
.bold { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.normal { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
.lighter { |
||||
font-weight: lighter; |
||||
} |
||||
|
||||
@each $weight in 100, 200, 300, 400, 500, 600, 700, 800, 900 { |
||||
.fw-#{$weight} { |
||||
font-weight: $weight; |
||||
} |
||||
} |
@ -0,0 +1,24 @@ |
||||
@import "var"; |
||||
|
||||
@for $size from 0 through $line-height-through { |
||||
.l-h-#{$size} { |
||||
line-height: #{$size}em; |
||||
} |
||||
@if $size <= $line-height-decimal-through { |
||||
@for $i from 0 to 10 { |
||||
.l-h-#{$size}_#{$i} { |
||||
line-height: #{$size}#{'.'}#{$i}em; |
||||
} |
||||
} |
||||
} @else { |
||||
.l-h-#{$size}_5 { |
||||
line-height: #{$size}#{'.5'}em; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@for $size from 0 through $line-height-px-through { |
||||
.lh-#{$size} { |
||||
line-height: #{$size}px; |
||||
} |
||||
} |
@ -0,0 +1,14 @@ |
||||
@import "var"; |
||||
|
||||
@each $name, $color in $text-colors { |
||||
.link-#{$name} { |
||||
color: $color; |
||||
text-decoration: none; |
||||
cursor: pointer; |
||||
|
||||
&:hover, &:active, &:focus { |
||||
color: darken($color, 10%); |
||||
text-decoration: underline; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,11 @@ |
||||
@each $type in visible, hidden, scroll, auto, inherit { |
||||
.o-#{$type} { |
||||
overflow: $type; |
||||
} |
||||
.o-x-#{$type} { |
||||
overflow-x: $type; |
||||
} |
||||
.o-y-#{$type} { |
||||
overflow-y: $type; |
||||
} |
||||
} |
@ -0,0 +1,15 @@ |
||||
@import "var"; |
||||
|
||||
@each $type in static, relative, absolute, fixed, sticky { |
||||
.#{$type} { |
||||
position: $type; |
||||
} |
||||
} |
||||
|
||||
@each $size in $box-sizes { |
||||
@each $side in top, right, bottom, left { |
||||
.#{$side}-#{$size} { |
||||
#{$side}: #{$size}px; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,380 @@ |
||||
@import "var"; |
||||
// reset 初始化浏览器样式 |
||||
* { |
||||
box-sizing: border-box; |
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); |
||||
} |
||||
|
||||
*:before, |
||||
*:after { |
||||
box-sizing: border-box; |
||||
} |
||||
|
||||
html { |
||||
-ms-text-size-adjust: 100%; |
||||
-webkit-text-size-adjust: 100%; |
||||
} |
||||
|
||||
body, |
||||
div, |
||||
dl, |
||||
dt, |
||||
dd, |
||||
ul, |
||||
ol, |
||||
li, |
||||
h1, |
||||
h2, |
||||
h3, |
||||
h4, |
||||
h5, |
||||
h6, |
||||
form, |
||||
fieldset, |
||||
legend, |
||||
input, |
||||
textarea, |
||||
p, |
||||
blockquote, |
||||
th, |
||||
td, |
||||
hr, |
||||
button, |
||||
article, |
||||
aside, |
||||
details, |
||||
figcaption, |
||||
figure, |
||||
footer, |
||||
header, |
||||
hgroup, |
||||
menu, |
||||
nav, |
||||
section { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
button, |
||||
input, |
||||
select, |
||||
textarea { |
||||
font-family: inherit; |
||||
font-size: inherit; |
||||
line-height: inherit; |
||||
} |
||||
|
||||
input::-ms-clear, |
||||
input::-ms-reveal { |
||||
display: none; |
||||
} |
||||
|
||||
ol, ul { |
||||
li { |
||||
list-style: none; |
||||
} |
||||
} |
||||
|
||||
h1 { |
||||
font-size: 2em; |
||||
margin: 0.67em 0; |
||||
} |
||||
|
||||
article, |
||||
aside, |
||||
footer, |
||||
header, |
||||
nav, |
||||
section { |
||||
display: block; |
||||
} |
||||
|
||||
figcaption, |
||||
figure, |
||||
main { |
||||
display: block; |
||||
} |
||||
|
||||
figure { |
||||
margin: 1em 40px; |
||||
} |
||||
|
||||
li:focus { |
||||
outline-width: 0; |
||||
} |
||||
|
||||
i { |
||||
font-style: normal; |
||||
} |
||||
|
||||
/** |
||||
* 1. Remove the gray background on active links in IE 10. |
||||
* 2. Remove gaps in links underline in iOS 8+ and Safari 8+. |
||||
*/ |
||||
|
||||
a { |
||||
background-color: transparent; |
||||
-webkit-text-decoration-skip: objects; |
||||
text-decoration: none; |
||||
color: inherit; |
||||
} |
||||
|
||||
a:active { |
||||
color: inherit; |
||||
} |
||||
|
||||
a:active, |
||||
a:hover, |
||||
a:focus { |
||||
outline-width: 0; |
||||
} |
||||
|
||||
abbr[title] { |
||||
border-bottom: none; |
||||
text-decoration: underline; |
||||
text-decoration: underline dotted; |
||||
} |
||||
|
||||
/** |
||||
* Prevent the duplicate application of `bolder` by the next rule in Safari 6. |
||||
*/ |
||||
|
||||
b, |
||||
strong { |
||||
font-weight: inherit; |
||||
} |
||||
|
||||
/** |
||||
* Add the correct font weight in Chrome, Edge, and Safari. |
||||
*/ |
||||
|
||||
b, |
||||
strong { |
||||
font-weight: bolder; |
||||
} |
||||
|
||||
pre, |
||||
code, |
||||
kbd, |
||||
samp { |
||||
font-family: monospace, monospace; |
||||
font-size: 1em; |
||||
} |
||||
|
||||
dfn { |
||||
font-style: italic; |
||||
} |
||||
|
||||
mark { |
||||
background-color: #ff0; |
||||
color: #000; |
||||
} |
||||
|
||||
small { |
||||
font-size: 80%; |
||||
} |
||||
|
||||
sub, |
||||
sup { |
||||
font-size: 75%; |
||||
line-height: 0; |
||||
position: relative; |
||||
vertical-align: baseline; |
||||
} |
||||
|
||||
sub { |
||||
bottom: -0.25em; |
||||
} |
||||
|
||||
sup { |
||||
top: -0.5em; |
||||
} |
||||
|
||||
audio, |
||||
video { |
||||
display: inline-block; |
||||
} |
||||
|
||||
audio:not([controls]) { |
||||
display: none; |
||||
height: 0; |
||||
} |
||||
|
||||
img { |
||||
border-style: none; |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
svg:not(:root) { |
||||
overflow: hidden; |
||||
} |
||||
|
||||
button, |
||||
input, |
||||
optgroup, |
||||
select, |
||||
textarea { |
||||
font-size: 100%; |
||||
line-height: 1.15; |
||||
margin: 0; |
||||
} |
||||
|
||||
button, |
||||
input { |
||||
overflow: visible; |
||||
} |
||||
|
||||
button, |
||||
select { |
||||
text-transform: none; |
||||
} |
||||
|
||||
button:focus { |
||||
outline: none; |
||||
} |
||||
|
||||
button, |
||||
html [type="button"], |
||||
[type="reset"], |
||||
[type="submit"] { |
||||
-webkit-appearance: button; |
||||
} |
||||
|
||||
button::-moz-focus-inner, |
||||
[type="button"]::-moz-focus-inner, |
||||
[type="reset"]::-moz-focus-inner, |
||||
[type="submit"]::-moz-focus-inner { |
||||
border-style: none; |
||||
padding: 0; |
||||
} |
||||
|
||||
/** |
||||
* Restore the focus styles unset by the previous rule. |
||||
*/ |
||||
|
||||
button:-moz-focusring, |
||||
[type="button"]:-moz-focusring, |
||||
[type="reset"]:-moz-focusring, |
||||
[type="submit"]:-moz-focusring { |
||||
outline: 1px dotted ButtonText; |
||||
} |
||||
|
||||
/** |
||||
* Change the border, margin, and padding in all browsers (opinionated). |
||||
*/ |
||||
|
||||
fieldset { |
||||
border: 1px solid #c0c0c0; |
||||
margin: 0 2px; |
||||
padding: 0.35em 0.625em 0.75em; |
||||
} |
||||
|
||||
/** |
||||
* 1. Correct the text wrapping in Edge and IE. |
||||
* 2. Correct the color inheritance from `fieldset` elements in IE. |
||||
* 3. Remove the padding so developers are not caught out when they zero out |
||||
* `fieldset` elements in all browsers. |
||||
*/ |
||||
|
||||
legend { |
||||
box-sizing: border-box; /* 1 */ |
||||
color: inherit; /* 2 */ |
||||
display: table; /* 1 */ |
||||
max-width: 100%; /* 1 */ |
||||
padding: 0; /* 3 */ |
||||
white-space: normal; /* 1 */ |
||||
} |
||||
|
||||
/** |
||||
* 1. Add the correct display in IE 9-. |
||||
* 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. |
||||
*/ |
||||
|
||||
progress { |
||||
display: inline-block; /* 1 */ |
||||
vertical-align: baseline; /* 2 */ |
||||
} |
||||
|
||||
/** |
||||
* Remove the default vertical scrollbar in IE. |
||||
*/ |
||||
|
||||
textarea { |
||||
overflow: auto; |
||||
resize: vertical; |
||||
} |
||||
|
||||
/** |
||||
* 1. Add the correct box sizing in IE 10-. |
||||
* 2. Remove the padding in IE 10-. |
||||
*/ |
||||
|
||||
[type="checkbox"], |
||||
[type="radio"] { |
||||
box-sizing: border-box; /* 1 */ |
||||
padding: 0; /* 2 */ |
||||
} |
||||
|
||||
/** |
||||
* Correct the cursor style of increment and decrement buttons in Chrome. |
||||
*/ |
||||
|
||||
[type="number"]::-webkit-inner-spin-button, |
||||
[type="number"]::-webkit-outer-spin-button { |
||||
height: auto; |
||||
} |
||||
|
||||
/** |
||||
* 1. Correct the odd appearance in Chrome and Safari. |
||||
* 2. Correct the outline style in Safari. |
||||
*/ |
||||
|
||||
[type="search"] { |
||||
-webkit-appearance: textfield; /* 1 */ |
||||
outline-offset: -2px; /* 2 */ |
||||
} |
||||
|
||||
/** |
||||
* Remove the inner padding and cancel buttons in Chrome and Safari on macOS. |
||||
*/ |
||||
|
||||
[type="search"]::-webkit-search-cancel-button, |
||||
[type="search"]::-webkit-search-decoration { |
||||
-webkit-appearance: none; |
||||
} |
||||
|
||||
/** |
||||
* 1. Correct the inability to style clickable types in iOS and Safari. |
||||
* 2. Change font properties to `inherit` in Safari. |
||||
*/ |
||||
|
||||
::-webkit-file-upload-button { |
||||
-webkit-appearance: button; /* 1 */ |
||||
font: inherit; /* 2 */ |
||||
} |
||||
|
||||
/* |
||||
* Add the correct display in IE 9-. |
||||
* 1. Add the correct display in Edge, IE, and Firefox. |
||||
*/ |
||||
|
||||
details, /* 1 */ |
||||
menu { |
||||
display: block; |
||||
} |
||||
|
||||
/* |
||||
* Add the correct display in all browsers. |
||||
*/ |
||||
|
||||
summary { |
||||
display: list-item; |
||||
} |
||||
|
||||
/** |
||||
* Add the correct display in IE 9-. |
||||
*/ |
||||
|
||||
canvas { |
||||
display: inline-block; |
||||
} |
@ -0,0 +1,53 @@ |
||||
@import "var"; |
||||
|
||||
.w-full { |
||||
width: 100%; |
||||
} |
||||
|
||||
.h-full { |
||||
height: 100%; |
||||
} |
||||
|
||||
@for $percent from 0 to 100 { |
||||
.w-p-#{$percent} { |
||||
width: #{$percent}#{'%'}; |
||||
} |
||||
.h-p-#{$percent} { |
||||
height: #{$percent}#{'%'}; |
||||
} |
||||
} |
||||
|
||||
|
||||
@for $i from 1 through 30 { |
||||
.h-#{$i} { |
||||
height: #{$i}px; |
||||
} |
||||
} |
||||
|
||||
@for $i from 1 through 30 { |
||||
.w-#{$i} { |
||||
width: #{$i}px; |
||||
} |
||||
} |
||||
|
||||
|
||||
@each $i in $sizes { |
||||
.w-#{$i} { |
||||
width: #{$i}px; |
||||
} |
||||
.h-#{$i} { |
||||
height: #{$i}px; |
||||
} |
||||
.max-w-#{$i} { |
||||
max-width: #{$i}px; |
||||
} |
||||
.max-h-#{$i} { |
||||
max-height: #{$i}px; |
||||
} |
||||
.min-w-#{$i} { |
||||
min-width: #{$i}px; |
||||
} |
||||
.min-h-#{$i} { |
||||
min-height: #{$i}px; |
||||
} |
||||
} |
@ -0,0 +1,3 @@ |
||||
html { |
||||
font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif; |
||||
} |
@ -0,0 +1,8 @@ |
||||
/** |
||||
* 任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit" |
||||
*/ |
||||
@each $type in left, right, center, justify, inherit { |
||||
.text-#{$type} { |
||||
text-align: #{$type}; |
||||
} |
||||
} |
@ -0,0 +1,7 @@ |
||||
@import "var"; |
||||
|
||||
@each $name, $color in $text-colors { |
||||
.text-#{$name} { |
||||
color: $color; |
||||
} |
||||
} |
@ -0,0 +1,80 @@ |
||||
// 颜色 size范围 |
||||
$color-black: #333 !default; |
||||
$color-white: #ffffff !default; |
||||
$color-grey: #888 !default; |
||||
$color-green: #19be6b !default; |
||||
$color-blue: #61c3ff !default; |
||||
$color-yellow: #ff9900 !default; |
||||
$color-red: #f35958 !default; |
||||
|
||||
$color-title: #17233d !default; |
||||
$color-content: #515a6e !default; |
||||
$color-disabled: #c5c8ce !default; |
||||
|
||||
$bg-grey: #f0f0f0 !default; |
||||
$bg-white: #ffffff !default; |
||||
$bg-black: #393D49 !default; |
||||
|
||||
$color-border: #dcdfe6 !default; |
||||
|
||||
// 主题背景色 |
||||
$bg-colors: ( |
||||
'white': $bg-white, |
||||
'black': $bg-black, |
||||
'grey': $bg-grey, |
||||
'green': $color-green, |
||||
'blue': $color-blue, |
||||
'yellow': $color-yellow, |
||||
'red': $color-red, |
||||
) !default; |
||||
|
||||
// 文本颜色 |
||||
$text-colors: ( |
||||
'white': $color-white, |
||||
'black': $color-black, |
||||
'grey': $color-grey, |
||||
'green': $color-green, |
||||
'blue': $color-blue, |
||||
'yellow': $color-yellow, |
||||
'red': $color-red, |
||||
'title': $color-title, |
||||
'content': $color-content, |
||||
'disabled': $color-disabled |
||||
) !default; |
||||
|
||||
// 边框颜色 |
||||
$border-colors: ( |
||||
'white': $color-white, |
||||
'black': $color-black, |
||||
'grey': $color-border, |
||||
'green': $color-green, |
||||
'blue': $color-blue, |
||||
'yellow': $color-yellow, |
||||
'red': $color-red |
||||
) !default; |
||||
|
||||
// border |
||||
$border-width-through: 20 !default; |
||||
$border-radius-through: 20 !default; |
||||
|
||||
// margin padding left right top bottom |
||||
$box-sizes: ( |
||||
-20, -15, -12, -10, -8, -6, -5, -4, -3, -2, -1, |
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100) !default; |
||||
|
||||
// width height |
||||
$sizes: ( |
||||
40, 50, 60, 70, 80, 90, 100, |
||||
120, 150, 200, 250, 300, 400, 500, 600, 800, 1000, 1200) !default; |
||||
|
||||
// font-size |
||||
$font-size-em-through: 10 !default; |
||||
$font-size-em-decimal-through: 5 !default; |
||||
$font-size-rem-through: 10 !default; |
||||
$font-size-rem-decimal-through: 5 !default; |
||||
$font-size-px-through: 80 !default; |
||||
|
||||
// line-height |
||||
$line-height-through: 20 !default; |
||||
$line-height-decimal-through: 5 !default; |
||||
$line-height-px-through: 100 !default; |
@ -0,0 +1,7 @@ |
||||
$types: (baseline, sub, super, top, text-top, middle, bottom, text-bottom, inherit); |
||||
|
||||
@each $type in $types { |
||||
.v-a-#{$type} { |
||||
vertical-align: $type; |
||||
} |
||||
} |
@ -0,0 +1,7 @@ |
||||
.visible { |
||||
visibility: visible; |
||||
} |
||||
|
||||
.hidden { |
||||
visibility: hidden; |
||||
} |
@ -0,0 +1,5 @@ |
||||
@each $type in normal, nowrap, pre, pre-wrap, pre-line { |
||||
.text-#{$type} { |
||||
white-space: $type; |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue