delete view
2
.gitignore
vendored
@ -1,11 +1,9 @@
|
|||||||
/.idea
|
/.idea
|
||||||
/.vscode
|
/.vscode
|
||||||
/vendor
|
/vendor
|
||||||
/database
|
|
||||||
|
|
||||||
*.log
|
*.log
|
||||||
.env
|
.env
|
||||||
|
|
||||||
# view
|
# view
|
||||||
/view/catch-admin/.DS_Store
|
/view/catch-admin/.DS_Store
|
||||||
/view/catch-admin/node_modules
|
/view/catch-admin/node_modules
|
||||||
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
1
public/dist/css/app.0763130d.css
vendored
Normal file
1
public/dist/css/chunk-417c734a.1bd0ae3c.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.head-info[data-v-432d5786]{position:relative;text-align:left;padding:0 32px 0 0;min-width:125px}.head-info.center[data-v-432d5786]{text-align:center;padding:0 32px}.head-info span[data-v-432d5786]{color:rgba(0,0,0,.45);display:inline-block;font-size:14px;line-height:22px;margin-bottom:4px}.head-info p[data-v-432d5786]{color:rgba(0,0,0,.85);font-size:24px;line-height:32px;margin:0}.head-info em[data-v-432d5786]{background-color:#e8e8e8;position:absolute;height:56px;width:1px;top:0;right:0}.project-list .card-title[data-v-160fcebf]{font-size:0}.project-list .card-title a[data-v-160fcebf]{color:rgba(0,0,0,.85);margin-left:12px;line-height:24px;height:24px;display:inline-block;vertical-align:top;font-size:14px}.project-list .card-title a[data-v-160fcebf]:hover{color:#1890ff}.project-list .card-description[data-v-160fcebf]{color:rgba(0,0,0,.45);height:44px;line-height:22px;overflow:hidden}.project-list .project-item[data-v-160fcebf]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:8px;overflow:hidden;font-size:12px;height:20px;line-height:20px}.project-list .project-item a[data-v-160fcebf]{color:rgba(0,0,0,.45);display:inline-block;-webkit-box-flex:1;-ms-flex:1 1 0px;flex:1 1 0}.project-list .project-item a[data-v-160fcebf]:hover{color:#1890ff}.project-list .project-item .datetime[data-v-160fcebf]{color:rgba(0,0,0,.25);-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;float:right}.project-list .ant-card-meta-description[data-v-160fcebf]{color:rgba(0,0,0,.45);height:44px;line-height:22px;overflow:hidden}.item-group[data-v-160fcebf]{padding:20px 0 8px 24px;font-size:0}.item-group a[data-v-160fcebf]{color:rgba(0,0,0,.65);display:inline-block;font-size:14px;margin-bottom:13px;width:25%}.members a[data-v-160fcebf]{display:block;margin:12px 0;line-height:24px;height:24px}.members a .member[data-v-160fcebf]{font-size:14px;color:rgba(0,0,0,.65);line-height:24px;max-width:100px;vertical-align:top;margin-left:12px;-webkit-transition:all .3s;transition:all .3s;display:inline-block}.members a:hover span[data-v-160fcebf]{color:#1890ff}.mobile .project-list .project-card-grid[data-v-160fcebf]{width:100%}.mobile .more-info[data-v-160fcebf]{border:0;padding-top:16px;margin:16px 0 16px}.mobile .headerContent .title .welcome-text[data-v-160fcebf]{display:none}
|
1
public/dist/css/chunk-8b217d34.f0e737d6.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.home[data-v-2a92492a]{width:900px;margin:0 auto;padding:25px 0}.home>.banner[data-v-2a92492a]{text-align:center;padding:25px 0;margin:25px 0}
|
1
public/dist/css/chunk-vendors.419657ab.css
vendored
Normal file
1
public/dist/css/user.6ba89435.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.user-layout-login label[data-v-8c8a0542]{font-size:14px}.user-layout-login .getCaptcha[data-v-8c8a0542]{display:block;width:100%;height:40px}.user-layout-login .forge-password[data-v-8c8a0542]{font-size:14px}.user-layout-login button.login-button[data-v-8c8a0542]{padding:0 15px;font-size:16px;height:40px;width:100%}.user-layout-login .user-login-other[data-v-8c8a0542]{text-align:left;margin-top:24px;line-height:22px}.user-layout-login .user-login-other .item-icon[data-v-8c8a0542]{font-size:24px;color:rgba(0,0,0,.2);margin-left:16px;vertical-align:middle;cursor:pointer;-webkit-transition:color .3s;transition:color .3s}.user-layout-login .user-login-other .item-icon[data-v-8c8a0542]:hover{color:#1890ff}.user-layout-login .user-login-other .register[data-v-8c8a0542]{float:right}.user-register.error{color:red}.user-register.warning{color:#ff7e05}.user-register.success{color:#52c41a}.user-layout-register .ant-input-group-addon:first-child{background-color:#fff}.user-layout-register>h3[data-v-54d9a6c2]{font-size:16px;margin-bottom:20px}.user-layout-register .getCaptcha[data-v-54d9a6c2]{display:block;width:100%;height:40px}.user-layout-register .register-button[data-v-54d9a6c2]{width:50%}.user-layout-register .login[data-v-54d9a6c2]{float:right;line-height:40px}
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
1
public/dist/index.html
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<!DOCTYPE html><html lang=zh-cmn-Hans><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/logo.png><title>CatchAdmin</title><style>#loading-mask{position:fixed;left:0;top:0;height:100%;width:100%;background:#fff;user-select:none;z-index:9999;overflow:hidden}.loading-wrapper{position:absolute;top:50%;left:50%;transform:translate(-50%,-100%)}.loading-dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:64px;width:64px;height:64px;box-sizing:border-box}.loading-dot i{width:22px;height:22px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.loading-dot i:nth-child(1){top:0;left:0}.loading-dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.loading-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.loading-dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style><link href=/css/chunk-417c734a.1bd0ae3c.css rel=prefetch><link href=/css/chunk-8b217d34.f0e737d6.css rel=prefetch><link href=/css/user.6ba89435.css rel=prefetch><link href=/js/chunk-0db5e511.5f28675f.js rel=prefetch><link href=/js/chunk-14e2798c.19951e30.js rel=prefetch><link href=/js/chunk-2d0a3147.444e5b93.js rel=prefetch><link href=/js/chunk-2d0a43a0.deff4d04.js rel=prefetch><link href=/js/chunk-2d0c4fb8.0c1495ee.js rel=prefetch><link href=/js/chunk-417c734a.f25abfb0.js rel=prefetch><link href=/js/chunk-770da3a4.52d43f20.js rel=prefetch><link href=/js/chunk-8b217d34.b65dd6fb.js rel=prefetch><link href=/js/fail.24b6b389.js rel=prefetch><link href=/js/user.7343145c.js rel=prefetch><link href=/css/app.0763130d.css rel=preload as=style><link href=/css/chunk-vendors.419657ab.css rel=preload as=style><link href=/js/app.f3de1cbf.js rel=preload as=script><link href=/js/chunk-vendors.b65eb361.js rel=preload as=script><link href=/css/chunk-vendors.419657ab.css rel=stylesheet><link href=/css/app.0763130d.css rel=stylesheet></head><body><noscript><strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app><div id=loading-mask><div class=loading-wrapper><span class="loading-dot loading-dot-spin"><i></i><i></i><i></i><i></i></span></div></div></div><script src=//cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.min.js></script><script src=//cdn.jsdelivr.net/npm/vue-router@3.1.3/dist/vue-router.min.js></script><script src=//cdn.jsdelivr.net/npm/vuex@3.1.1/dist/vuex.min.js></script><script src=//cdn.jsdelivr.net/npm/axios@0.19.0/dist/axios.min.js></script><script src=/js/chunk-vendors.b65eb361.js></script><script src=/js/app.f3de1cbf.js></script></body></html>
|
1
public/dist/js/app.f3de1cbf.js
vendored
Normal file
1
public/dist/js/chunk-0db5e511.5f28675f.js
vendored
Normal file
1
public/dist/js/chunk-14e2798c.19951e30.js
vendored
Normal file
1
public/dist/js/chunk-2d0a3147.444e5b93.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0a3147"],{"013c":function(e,t,a){"use strict";a.r(t);var n=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("a-card",{attrs:{bordered:!1}},[a("div",{staticClass:"table-page-search-wrapper"},[a("a-form",{attrs:{layout:"inline"}},[a("a-row",{attrs:{gutter:48}},[a("a-col",{attrs:{md:4,sm:24}},[a("a-input",{attrs:{allowClear:"",placeholder:"请输入表名"},model:{value:e.queryParam.tablename,callback:function(t){e.$set(e.queryParam,"tablename",t)},expression:"queryParam.tablename"}})],1),a("a-col",{attrs:{md:4,sm:24}},[a("a-select",{attrs:{allowClear:"",placeholder:"请选择引擎","default-value":"0"},model:{value:e.queryParam.engine,callback:function(t){e.$set(e.queryParam,"engine",t)},expression:"queryParam.engine"}},[a("a-select-option",{attrs:{value:"MyISAM"}},[e._v("MyISAM")]),a("a-select-option",{attrs:{value:"InnoDB"}},[e._v("InnoDB")])],1)],1),a("a-col",{attrs:{md:4,sm:24}},[a("span",{staticClass:"table-page-search-submitButtons"},[a("a-button",{attrs:{type:"primary"},on:{click:function(t){return e.$refs.table.refresh(!0)}}},[e._v("查询")]),a("a-button",{staticStyle:{"margin-left":"8px"},on:{click:function(t){return e.resetSearchForm()}}},[e._v("重置")])],1)])],1)],1)],1),e.selectTables.length>0?a("div",{staticClass:"table-operator"},[a("a-button",{attrs:{type:"primary",icon:"plus"},on:{click:function(t){return e.optimizeTables()}}},[e._v("优化")]),a("a-button",{attrs:{type:"primary",icon:"plus"},on:{click:e.backupTables}},[e._v("备份")])],1):e._e(),a("s-table",{ref:"table",attrs:{size:"default",rowKey:"name",bordered:!0,columns:e.columns,data:e.loadData,alert:e.options.alert,rowSelection:e.options.rowSelection,showPagination:"auto"},scopedSlots:e._u([{key:"action",fn:function(t,n){return a("span",{},[[a("a",{on:{click:function(t){return e.$refs.tableModal.add(n.name)}}},[e._v("查看")])]],2)}}])}),a("table-view",{ref:"tableModal",on:{ok:e.handleOk}})],1)},l=[],s=a("2af9"),o=a("b775");function r(e){return Object(o["b"])({url:"/tables",method:"get",params:e})}function i(e){return Object(o["b"])({url:"/table/optimize",method:"post",data:e})}function c(e){return Object(o["b"])({url:"/table/backup",method:"post",data:e})}function u(e){return Object(o["b"])({url:"/table/view/"+e,method:"get"})}var d=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("a-modal",{attrs:{bordered:"",title:"表结构",width:1200,rowKey:"field",visible:e.visible},on:{cancel:e.handleCancel}},[a("a-table",{attrs:{columns:e.columns,dataSource:e.fields,pagination:!1}})],1)},b=[],m={data:function(){return{columns:[{title:"字段名称",dataIndex:"field"},{title:"类型",dataIndex:"type"},{title:"字符集",dataIndex:"collation"},{title:"Null",dataIndex:"null"},{title:"索引",dataIndex:"key"},{title:"默认值",dataIndex:"default"},{title:"权限",dataIndex:"privileges"},{title:"注释",dataIndex:"comment"}],labelCol:{xs:{span:24},sm:{span:7}},wrapperCol:{xs:{span:24},sm:{span:13}},visible:!1,fields:[]}},methods:{add:function(e){var t=this;this.visible=!0,u(e).then((function(e){t.fields=e.data}))},handleCancel:function(){this.visible=!1}}},p=m,f=a("2877"),h=Object(f["a"])(p,d,b,!1,null,null,null),v=h.exports,w={name:"Database",components:{STable:s["f"],TableView:v},data:function(){var e=this;return{queryParam:{},columns:[{title:"表名",dataIndex:"name"},{title:"表引擎",dataIndex:"engine"},{title:"字符集",dataIndex:"collation"},{title:"数据行数",dataIndex:"rows",sorter:!0},{title:"索引大小",dataIndex:"index_length",sorter:!0},{title:"数据大小",dataIndex:"data_length",sorter:!0},{title:"表注释",dataIndex:"comment",sorter:!0},{title:"创建时间",dataIndex:"create_time",sorter:!0},{title:"操作",dataIndex:"action",width:"70px",scopedSlots:{customRender:"action"}}],loadData:function(t){return r(Object.assign(t,e.queryParam)).then((function(e){return e}))},selectTables:[],options:{alert:{show:!1,clear:function(){e.selectedRowKeys=[]}},rowSelection:{selectedRowKeys:this.selectedRowKeys,onChange:this.onSelectChange}}}},methods:{optimizeTables:function(){var e=this;i({data:this.selectTables}).then((function(t){e.$notification["success"]({message:t.message,duration:4}),e.selectTables=[]}))},backupTables:function(){var e=this;c({data:this.selectTables}).then((function(t){e.$notification["success"]({message:t.message,duration:4}),e.selectTables=[]}))},handleOk:function(){this.$refs.table.refresh(!0)},onSelectChange:function(e,t){this.selectTables=e},resetSearchForm:function(){this.queryParam={},this.handleOk()}}},y=w,x=Object(f["a"])(y,n,l,!1,null,null,null);t["default"]=x.exports}}]);
|
1
public/dist/js/chunk-2d0a43a0.deff4d04.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0a43a0"],{"0615":function(n,u,a){"use strict";a.r(u);var l,c,e=a("2877"),o={},p=Object(e["a"])(o,l,c,!1,null,null,null);u["default"]=p.exports}}]);
|
1
public/dist/js/chunk-2d0c4fb8.0c1495ee.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0c4fb8"],{"3cc5":function(n,c,u){"use strict";u.r(c);var l,e,o=u("2877"),p={},s=Object(o["a"])(p,l,e,!1,null,null,null);c["default"]=s.exports}}]);
|
1
public/dist/js/chunk-417c734a.f25abfb0.js
vendored
Normal file
1
public/dist/js/chunk-770da3a4.52d43f20.js
vendored
Normal file
1
public/dist/js/chunk-8b217d34.b65dd6fb.js
vendored
Normal file
48
public/dist/js/chunk-vendors.b65eb361.js
vendored
Normal file
1
public/dist/js/fail.24b6b389.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["fail"],{cc89:function(e,t,n){"use strict";n.r(t);var c=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("exception-page",{attrs:{type:"404"}})},a=[],o=n("2af9"),p={components:{ExceptionPage:o["c"]}},s=p,i=n("2877"),r=Object(i["a"])(s,c,a,!1,null,"1f038743",null);t["default"]=r.exports}}]);
|
1
public/dist/js/user.7343145c.js
vendored
Normal file
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
@ -1 +0,0 @@
|
|||||||
如果不使用模板,可以删除该目录
|
|
@ -1,3 +0,0 @@
|
|||||||
> 1%
|
|
||||||
last 2 versions
|
|
||||||
not ie <= 10
|
|
@ -1,39 +0,0 @@
|
|||||||
[*]
|
|
||||||
charset=utf-8
|
|
||||||
end_of_line=lf
|
|
||||||
insert_final_newline=false
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[*.svg]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[*.js.map]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[*.less]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[*.vue]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
||||||
[{.analysis_options,*.yml,*.yaml}]
|
|
||||||
indent_style=space
|
|
||||||
indent_size=2
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
NODE_ENV=development
|
|
||||||
VUE_APP_PREVIEW=true
|
|
||||||
VUE_APP_API_BASE_URL=http://127.0.0.1:9090/
|
|
@ -1,3 +0,0 @@
|
|||||||
NODE_ENV=production
|
|
||||||
VUE_APP_PREVIEW=true
|
|
||||||
VUE_APP_API_BASE_URL=http://vue.catchadmin.com/
|
|
@ -1,73 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
env: {
|
|
||||||
node: true
|
|
||||||
},
|
|
||||||
'extends': [
|
|
||||||
'plugin:vue/strongly-recommended',
|
|
||||||
'@vue/standard'
|
|
||||||
],
|
|
||||||
rules: {
|
|
||||||
'no-console': 'off',
|
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
|
||||||
'generator-star-spacing': 'off',
|
|
||||||
'no-mixed-operators': 0,
|
|
||||||
'vue/max-attributes-per-line': [
|
|
||||||
2,
|
|
||||||
{
|
|
||||||
'singleline': 5,
|
|
||||||
'multiline': {
|
|
||||||
'max': 1,
|
|
||||||
'allowFirstLine': false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'vue/attribute-hyphenation': 0,
|
|
||||||
'vue/html-self-closing': 0,
|
|
||||||
'vue/component-name-in-template-casing': 0,
|
|
||||||
'vue/html-closing-bracket-spacing': 0,
|
|
||||||
'vue/singleline-html-element-content-newline': 0,
|
|
||||||
'vue/no-unused-components': 0,
|
|
||||||
'vue/multiline-html-element-content-newline': 0,
|
|
||||||
'vue/no-use-v-if-with-v-for': 0,
|
|
||||||
'vue/html-closing-bracket-newline': 0,
|
|
||||||
'vue/no-parsing-error': 0,
|
|
||||||
'no-tabs': 0,
|
|
||||||
'quotes': [
|
|
||||||
2,
|
|
||||||
'single',
|
|
||||||
{
|
|
||||||
'avoidEscape': true,
|
|
||||||
'allowTemplateLiterals': true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'semi': [
|
|
||||||
2,
|
|
||||||
'never',
|
|
||||||
{
|
|
||||||
'beforeStatementContinuationChars': 'never'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
'no-delete-var': 2,
|
|
||||||
'prefer-const': [
|
|
||||||
2,
|
|
||||||
{
|
|
||||||
'ignoreReadBeforeAssign': false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
parserOptions: {
|
|
||||||
parser: 'babel-eslint'
|
|
||||||
},
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
files: [
|
|
||||||
'**/__tests__/*.{j,t}s?(x)',
|
|
||||||
'**/tests/unit/**/*.spec.{j,t}s?(x)'
|
|
||||||
],
|
|
||||||
env: {
|
|
||||||
jest: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
1
view/catch-admin/.gitattributes
vendored
@ -1 +0,0 @@
|
|||||||
public/* linguist-vendored
|
|
21
view/catch-admin/.gitignore
vendored
@ -1,21 +0,0 @@
|
|||||||
.DS_Store
|
|
||||||
node_modules
|
|
||||||
/dist
|
|
||||||
|
|
||||||
# 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*
|
|
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"printWidth": 120,
|
|
||||||
"semi": false,
|
|
||||||
"singleQuote": true
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
node_js:
|
|
||||||
- 10.15.0
|
|
||||||
cache: yarn
|
|
||||||
script:
|
|
||||||
- yarn
|
|
||||||
- yarn run lint --no-fix && yarn run build
|
|
@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2018 Anan Yang
|
|
||||||
|
|
||||||
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.
|
|
@ -1,132 +0,0 @@
|
|||||||
English | [简体中文](./README.zh-CN.md)
|
|
||||||
|
|
||||||
<h1 align="center">Ant Design Pro Vue</h1>
|
|
||||||
<div align="center">
|
|
||||||
An out-of-box UI solution for enterprise applications as a Vue boilerplate. based on <a href="https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/" target="_blank">Ant Design of Vue</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
[](#backers) [](#sponsors) [](https://github.com/sendya/ant-design-pro-vue/blob/master/LICENSE)
|
|
||||||
[](https://github.com/sendya/ant-design-pro-vue/releases/latest)
|
|
||||||
[](https://travis-ci.org/sendya/ant-design-pro-vue)
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
- Preview: https://preview.pro.loacg.com
|
|
||||||
- Home Page: https://pro.loacg.com
|
|
||||||
- Documentation: https://pro.loacg.com/docs/getting-started
|
|
||||||
- ChangeLog: https://pro.loacg.com/docs/changelog
|
|
||||||
- FAQ: https://pro.loacg.com/docs/faq
|
|
||||||
|
|
||||||
Overview
|
|
||||||
----
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### Env and dependencies
|
|
||||||
|
|
||||||
- node
|
|
||||||
- yarn
|
|
||||||
- webpack
|
|
||||||
- eslint
|
|
||||||
- @vue/cli ~3
|
|
||||||
- [ant-design-vue](https://github.com/vueComponent/ant-design-vue) - Ant Design Of Vue
|
|
||||||
- [vue-cropper](https://github.com/xyxiao001/vue-cropper) - Picture edit
|
|
||||||
- [@antv/g2](https://antv.alipay.com/zh-cn/index.html) - AntV G2
|
|
||||||
- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - Antv/G2 of Vue
|
|
||||||
|
|
||||||
> Note: [Yarn](https://yarnpkg.com/) package management is recommended, the exact same version loaded with the demo site of this project (yarn.lock) . but you can also use npm
|
|
||||||
|
|
||||||
|
|
||||||
### Project setup
|
|
||||||
|
|
||||||
- Clone repo
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/sendya/ant-design-pro-vue.git
|
|
||||||
cd ant-design-pro-vue
|
|
||||||
```
|
|
||||||
|
|
||||||
- Install dependencies
|
|
||||||
```
|
|
||||||
yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
- Compiles and hot-reloads for development
|
|
||||||
```
|
|
||||||
yarn run serve
|
|
||||||
```
|
|
||||||
|
|
||||||
- Compiles and minifies for production
|
|
||||||
```
|
|
||||||
yarn run build
|
|
||||||
```
|
|
||||||
|
|
||||||
- Lints and fixes files
|
|
||||||
```
|
|
||||||
yarn run lint
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Other
|
|
||||||
|
|
||||||
- **IMPORTANT : About Issue feedback !! when opening Issue read [Issue / PR Contributing](https://github.com/sendya/ant-design-pro-vue/issues/90)**
|
|
||||||
|
|
||||||
- [Vue-cli3](https://cli.vuejs.org/guide/) used by the project.
|
|
||||||
|
|
||||||
- Disable Eslint (not recommended): remove `eslintConfig` field in `package.json` and `vue.config.js` field `lintOnSave: false`
|
|
||||||
|
|
||||||
- Load on Demand: modify `/src/main.js` L14, replace to `import './core/lazy_use'` code. more [load-on-demand.md](./docs/load-on-demand.md)
|
|
||||||
|
|
||||||
- Customize Theme: [Custom Theme Config (@kokoroli)](https://github.com/kokoroli/antd-awesome/blob/master/docs/Ant_Design_%E6%A0%B7%E5%BC%8F%E8%A6%86%E7%9B%96.md)
|
|
||||||
|
|
||||||
- I18n: [locales (@musnow)](./src/locales/index.js)
|
|
||||||
|
|
||||||
- Production env `mock` is disabled. use `src/mock/index.js`
|
|
||||||
|
|
||||||
- Plz use `release` version
|
|
||||||
|
|
||||||
## Browsers support
|
|
||||||
|
|
||||||
Modern browsers and IE10.
|
|
||||||
|
|
||||||
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Opera |
|
|
||||||
| --- | --- | --- | --- | --- |
|
|
||||||
| IE10, Edge | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
|
|
||||||
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute.
|
|
||||||
<a href="https://github.com/sendya/ant-design-pro-vue/graphs/contributors"><img src="https://opencollective.com/ant-design-pro-vue/contributors.svg?width=890&button=false" /></a>
|
|
||||||
|
|
||||||
|
|
||||||
## Backers
|
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/ant-design-pro-vue#backer)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue#backers" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/backers.svg?width=890"></a>
|
|
||||||
|
|
||||||
|
|
||||||
## Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/ant-design-pro-vue#sponsor)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/0/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/1/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/2/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/3/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/4/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/5/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/6/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/7/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/8/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/9/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/9/avatar.svg"></a>
|
|
||||||
|
|
@ -1,137 +0,0 @@
|
|||||||
[English](./README.md) | 简体中文
|
|
||||||
|
|
||||||
<h1 align="center">Ant Design Pro Vue</h1>
|
|
||||||
<div align="center">
|
|
||||||
An out-of-box UI solution for enterprise applications as a Vue boilerplate. based on <a href="https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/" target="_blank">Ant Design of Vue</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
[](#backers) [](#sponsors) [](https://github.com/sendya/ant-design-pro-vue/blob/master/LICENSE)
|
|
||||||
[](https://github.com/sendya/ant-design-pro-vue/releases/latest)
|
|
||||||
[](https://travis-ci.org/sendya/ant-design-pro-vue)
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
- 预览: https://preview.pro.loacg.com
|
|
||||||
- 首页: https://pro.loacg.com
|
|
||||||
- 文档: https://pro.loacg.com/docs/getting-started
|
|
||||||
- 更新日志: https://pro.loacg.com/docs/changelog
|
|
||||||
- 常见问题: https://pro.loacg.com/docs/faq
|
|
||||||
|
|
||||||
|
|
||||||
Overview
|
|
||||||
----
|
|
||||||
|
|
||||||
基于 [Ant Design of Vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/) 实现的 [Ant Design Pro](https://pro.ant.design/)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
环境和依赖
|
|
||||||
----
|
|
||||||
|
|
||||||
- node
|
|
||||||
- yarn
|
|
||||||
- webpack
|
|
||||||
- eslint
|
|
||||||
- @vue/cli ~3
|
|
||||||
- [ant-design-vue](https://github.com/vueComponent/ant-design-vue) - Ant Design Of Vue 实现
|
|
||||||
- [vue-cropper](https://github.com/xyxiao001/vue-cropper) - 头像裁剪组件
|
|
||||||
- [@antv/g2](https://antv.alipay.com/zh-cn/index.html) - Alipay AntV 数据可视化图表
|
|
||||||
- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现
|
|
||||||
|
|
||||||
> 请注意,我们强烈建议本项目使用 [Yarn](https://yarnpkg.com/) 包管理工具,这样可以与本项目演示站所加载完全相同的依赖版本 (yarn.lock) 。由于我们没有对依赖进行强制的版本控制,采用非 yarn 包管理进行引入时,可能由于 Pro 所依赖的库已经升级版本而引入了新版本所导致的问题。作者可能会由于时间问题无法及时排查而导致您采用本项目作为基项目而出现问题。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
项目下载和运行
|
|
||||||
----
|
|
||||||
|
|
||||||
- 拉取项目代码
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/sendya/ant-design-pro-vue.git
|
|
||||||
cd ant-design-pro-vue
|
|
||||||
```
|
|
||||||
|
|
||||||
- 安装依赖
|
|
||||||
```
|
|
||||||
yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
- 开发模式运行
|
|
||||||
```
|
|
||||||
yarn run serve
|
|
||||||
```
|
|
||||||
|
|
||||||
- 编译项目
|
|
||||||
```
|
|
||||||
yarn run build
|
|
||||||
```
|
|
||||||
|
|
||||||
- Lints and fixes files
|
|
||||||
```
|
|
||||||
yarn run lint
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
其他说明
|
|
||||||
----
|
|
||||||
|
|
||||||
- **关于 Issue 反馈 (重要!重要!重要!) 请在开 *Issue* 前,先阅读该内容:[Issue / PR 编写建议](https://github.com/sendya/ant-design-pro-vue/issues/90)**
|
|
||||||
|
|
||||||
- 项目使用的 [vue-cli3](https://cli.vuejs.org/guide/), 请确保你所使用的 vue-cli 是新版,并且已经学习 cli 官方文档使用教程
|
|
||||||
|
|
||||||
- 关闭 Eslint (不推荐) 移除 `package.json` 中 `eslintConfig` 整个节点代码, `vue.config.js` 下的 `lintOnSave` 值改为 `false`
|
|
||||||
|
|
||||||
- 开启组件按需加载 `/src/main.js` L14 修改为 `import './core/lazy_use'`
|
|
||||||
|
|
||||||
- [修改 Ant Design 配色 (@kokoroli)](https://github.com/kokoroli/antd-awesome/blob/master/docs/Ant_Design_%E6%A0%B7%E5%BC%8F%E8%A6%86%E7%9B%96.md)
|
|
||||||
|
|
||||||
- I18n: [多语言支持 (@musnow)](./src/locales/index.js)
|
|
||||||
|
|
||||||
- 生成环境默认不加载 `mock`,更多详情请看 `src/mock/index.js`
|
|
||||||
|
|
||||||
- **用于生产环境,请使用 `release` 版本代码,使用 master 代码出现的任何问题需要你自行解决**
|
|
||||||
|
|
||||||
## 浏览器兼容
|
|
||||||
|
|
||||||
Modern browsers and IE10.
|
|
||||||
|
|
||||||
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Opera |
|
|
||||||
| --- | --- | --- | --- | --- |
|
|
||||||
| IE10, Edge | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
|
|
||||||
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute.
|
|
||||||
<a href="https://github.com/sendya/ant-design-pro-vue/graphs/contributors"><img src="https://opencollective.com/ant-design-pro-vue/contributors.svg?width=890&button=false" /></a>
|
|
||||||
|
|
||||||
|
|
||||||
## Backers
|
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/ant-design-pro-vue#backer)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue#backers" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/backers.svg?width=890"></a>
|
|
||||||
|
|
||||||
|
|
||||||
## Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/ant-design-pro-vue#sponsor)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/0/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/1/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/2/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/3/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/4/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/5/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/6/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/7/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/8/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/ant-design-pro-vue/sponsor/9/website" target="_blank"><img src="https://opencollective.com/ant-design-pro-vue/sponsor/9/avatar.svg"></a>
|
|
@ -1,28 +0,0 @@
|
|||||||
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
|
|
||||||
|
|
||||||
const plugins = []
|
|
||||||
if (IS_PROD) {
|
|
||||||
plugins.push('transform-remove-console')
|
|
||||||
}
|
|
||||||
|
|
||||||
// lazy load ant-design-vue
|
|
||||||
// if your use import on Demand, Use this code
|
|
||||||
plugins.push(['import', {
|
|
||||||
'libraryName': 'ant-design-vue',
|
|
||||||
'libraryDirectory': 'es',
|
|
||||||
'style': true // `style: true` 会加载 less 文件
|
|
||||||
}])
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@vue/cli-plugin-babel/preset',
|
|
||||||
[
|
|
||||||
'@babel/preset-env',
|
|
||||||
{
|
|
||||||
'useBuiltIns': 'entry',
|
|
||||||
'corejs': 3
|
|
||||||
}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
plugins
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
const ThemeColorReplacer = require('webpack-theme-color-replacer')
|
|
||||||
const generate = require('@ant-design/colors/lib/generate').default
|
|
||||||
|
|
||||||
const getAntdSerials = (color) => {
|
|
||||||
// 淡化(即less的tint)
|
|
||||||
const lightens = new Array(9).fill().map((t, i) => {
|
|
||||||
return ThemeColorReplacer.varyColor.lighten(color, i / 10)
|
|
||||||
})
|
|
||||||
const colorPalettes = generate(color)
|
|
||||||
const rgb = ThemeColorReplacer.varyColor.toNum3(color.replace('#', '')).join(',')
|
|
||||||
return lightens.concat(colorPalettes).concat(rgb)
|
|
||||||
}
|
|
||||||
|
|
||||||
const themePluginOption = {
|
|
||||||
fileName: 'css/theme-colors-[contenthash:8].css',
|
|
||||||
matchColors: getAntdSerials('#1890ff'), // 主色系列
|
|
||||||
// 改变样式选择器,解决样式覆盖问题
|
|
||||||
changeSelector (selector) {
|
|
||||||
switch (selector) {
|
|
||||||
case '.ant-calendar-today .ant-calendar-date':
|
|
||||||
return ':not(.ant-calendar-selected-date):not(.ant-calendar-selected-day)' + selector
|
|
||||||
case '.ant-btn:focus,.ant-btn:hover':
|
|
||||||
return '.ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger)'
|
|
||||||
case '.ant-btn.active,.ant-btn:active':
|
|
||||||
return '.ant-btn.active:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:active:not(.ant-btn-primary):not(.ant-btn-danger)'
|
|
||||||
case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':
|
|
||||||
case '.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon':
|
|
||||||
return ':not(.ant-steps-item-process)' + selector
|
|
||||||
case '.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover':
|
|
||||||
case '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal > .ant-menu-submenu-selected,.ant-menu-horizontal > .ant-menu-submenu:hover':
|
|
||||||
return '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover'
|
|
||||||
case '.ant-menu-horizontal > .ant-menu-item-selected > a':
|
|
||||||
case '.ant-menu-horizontal>.ant-menu-item-selected>a':
|
|
||||||
return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item-selected > a'
|
|
||||||
case '.ant-menu-horizontal > .ant-menu-item > a:hover':
|
|
||||||
case '.ant-menu-horizontal>.ant-menu-item>a:hover':
|
|
||||||
return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item > a:hover'
|
|
||||||
default :
|
|
||||||
return selector
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const createThemeColorReplacerPlugin = () => new ThemeColorReplacer(themePluginOption)
|
|
||||||
|
|
||||||
module.exports = createThemeColorReplacerPlugin
|
|
@ -1,23 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
moduleFileExtensions: [
|
|
||||||
'js',
|
|
||||||
'jsx',
|
|
||||||
'json',
|
|
||||||
'vue'
|
|
||||||
],
|
|
||||||
transform: {
|
|
||||||
'^.+\\.vue$': 'vue-jest',
|
|
||||||
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
|
|
||||||
'^.+\\.jsx?$': 'babel-jest'
|
|
||||||
},
|
|
||||||
moduleNameMapper: {
|
|
||||||
'^@/(.*)$': '<rootDir>/src/$1'
|
|
||||||
},
|
|
||||||
snapshotSerializers: [
|
|
||||||
'jest-serializer-vue'
|
|
||||||
],
|
|
||||||
testMatch: [
|
|
||||||
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
|
|
||||||
],
|
|
||||||
testURL: 'http://localhost/'
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "es6",
|
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
|
||||||
"@/*": ["src/*"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"exclude": ["node_modules", "dist"],
|
|
||||||
"include": ["src/**/*"]
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "vue-antd-pro",
|
|
||||||
"version": "2.1.0",
|
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
|
||||||
"serve": "vue-cli-service serve",
|
|
||||||
"build": "vue-cli-service build",
|
|
||||||
"test:unit": "vue-cli-service test:unit",
|
|
||||||
"lint": "vue-cli-service lint",
|
|
||||||
"build:preview": "vue-cli-service build --mode preview",
|
|
||||||
"lint:nofix": "vue-cli-service lint --no-fix",
|
|
||||||
"postinstall": "opencollective-postinstall"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@antv/data-set": "^0.10.2",
|
|
||||||
"ant-design-vue": "1.4.2",
|
|
||||||
"axios": "^0.19.0",
|
|
||||||
"core-js": "^3.1.2",
|
|
||||||
"enquire.js": "^2.1.6",
|
|
||||||
"lodash.get": "^4.4.2",
|
|
||||||
"lodash.pick": "^4.4.0",
|
|
||||||
"md5": "^2.2.1",
|
|
||||||
"mockjs2": "1.0.8",
|
|
||||||
"moment": "^2.24.0",
|
|
||||||
"nprogress": "^0.2.0",
|
|
||||||
"viser-vue": "^2.4.6",
|
|
||||||
"vue": "^2.6.10",
|
|
||||||
"vue-clipboard2": "^0.2.1",
|
|
||||||
"vue-cropper": "0.4.9",
|
|
||||||
"vue-ls": "^3.2.1",
|
|
||||||
"vue-quill-editor": "^3.0.6",
|
|
||||||
"vue-router": "^3.1.2",
|
|
||||||
"vue-svg-component-runtime": "^1.0.1",
|
|
||||||
"vuex": "^3.1.1",
|
|
||||||
"wangeditor": "^3.1.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@ant-design/colors": "^3.2.1",
|
|
||||||
"@vue/cli-plugin-babel": "^4.0.4",
|
|
||||||
"@vue/cli-plugin-eslint": "^4.0.4",
|
|
||||||
"@vue/cli-plugin-router": "^4.0.4",
|
|
||||||
"@vue/cli-plugin-unit-jest": "^4.0.4",
|
|
||||||
"@vue/cli-plugin-vuex": "^4.0.4",
|
|
||||||
"@vue/cli-service": "^4.0.4",
|
|
||||||
"@vue/eslint-config-standard": "^4.0.0",
|
|
||||||
"@vue/test-utils": "^1.0.0-beta.29",
|
|
||||||
"babel-eslint": "^10.0.1",
|
|
||||||
"babel-plugin-import": "^1.13.0",
|
|
||||||
"babel-plugin-transform-remove-console": "^6.9.4",
|
|
||||||
"eslint": "^5.16.0",
|
|
||||||
"eslint-plugin-html": "^5.0.0",
|
|
||||||
"eslint-plugin-vue": "^5.2.3",
|
|
||||||
"less": "^3.0.4",
|
|
||||||
"less-loader": "^5.0.0",
|
|
||||||
"opencollective": "^1.0.3",
|
|
||||||
"opencollective-postinstall": "^2.0.2",
|
|
||||||
"vue-svg-icon-loader": "^2.1.1",
|
|
||||||
"vue-template-compiler": "^2.6.10",
|
|
||||||
"webpack-theme-color-replacer": "^1.2.17"
|
|
||||||
},
|
|
||||||
"collective": {
|
|
||||||
"type": "opencollective",
|
|
||||||
"url": "https://opencollective.com/ant-design-pro-vue"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
plugins: {
|
|
||||||
autoprefixer: {}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="zh-cmn-Hans">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
||||||
<link rel="icon" href="<%= BASE_URL %>logo.png">
|
|
||||||
<title>CatchAdmin</title>
|
|
||||||
<style>#loading-mask{position:fixed;left:0;top:0;height:100%;width:100%;background:#fff;user-select:none;z-index:9999;overflow:hidden}.loading-wrapper{position:absolute;top:50%;left:50%;transform:translate(-50%,-100%)}.loading-dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:64px;width:64px;height:64px;box-sizing:border-box}.loading-dot i{width:22px;height:22px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.loading-dot i:nth-child(1){top:0;left:0}.loading-dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.loading-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.loading-dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style>
|
|
||||||
<!-- require cdn assets css -->
|
|
||||||
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
|
|
||||||
<link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
|
|
||||||
<% } %>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
<strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
|
||||||
</noscript>
|
|
||||||
<div id="app">
|
|
||||||
<div id="loading-mask">
|
|
||||||
<div class="loading-wrapper">
|
|
||||||
<span class="loading-dot loading-dot-spin"><i></i><i></i><i></i><i></i></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- require cdn assets js -->
|
|
||||||
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
|
|
||||||
<script type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
|
|
||||||
<% } %>
|
|
||||||
<!-- built files will be auto injected -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,29 +0,0 @@
|
|||||||
<template>
|
|
||||||
<a-locale-provider :locale="locale">
|
|
||||||
<div id="app">
|
|
||||||
<router-view/>
|
|
||||||
</div>
|
|
||||||
</a-locale-provider>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
|
|
||||||
import { AppDeviceEnquire } from '@/utils/mixin'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
mixins: [AppDeviceEnquire],
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
locale: zhCN
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
|
||||||
#app {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,37 +0,0 @@
|
|||||||
/**
|
|
||||||
* 用户管理模块
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { axios } from '@/utils/request'
|
|
||||||
|
|
||||||
export function getTables (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/tables',
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function optimize (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/table/optimize',
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function backup (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/table/backup',
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function read (table) {
|
|
||||||
return axios({
|
|
||||||
url: '/table/view/' + table,
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
const api = {
|
|
||||||
Login: '/auth/login',
|
|
||||||
Logout: '/auth/logout',
|
|
||||||
ForgePassword: '/auth/forge-password',
|
|
||||||
Register: '/auth/register',
|
|
||||||
twoStepCode: '/auth/2step-code',
|
|
||||||
SendSms: '/account/sms',
|
|
||||||
SendSmsErr: '/account/sms_err',
|
|
||||||
// get my info
|
|
||||||
UserInfo: '/user/info'
|
|
||||||
}
|
|
||||||
export default api
|
|
@ -1,65 +0,0 @@
|
|||||||
import api from './index'
|
|
||||||
import { axios } from '@/utils/request'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* login func
|
|
||||||
* parameter: {
|
|
||||||
* username: '',
|
|
||||||
* password: '',
|
|
||||||
* remember_me: true,
|
|
||||||
* captcha: '12345'
|
|
||||||
* }
|
|
||||||
* @param parameter
|
|
||||||
* @returns {*}
|
|
||||||
*/
|
|
||||||
export function login (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/login',
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getSmsCaptcha (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.SendSms,
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getInfo () {
|
|
||||||
return axios({
|
|
||||||
url: '/user/info',
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getCurrentUserNav (token) {
|
|
||||||
return axios({
|
|
||||||
url: '/user/nav',
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function logout () {
|
|
||||||
return axios({
|
|
||||||
url: '/auth/logout',
|
|
||||||
method: 'post',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json;charset=UTF-8'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get user 2step code open?
|
|
||||||
* @param parameter {*}
|
|
||||||
*/
|
|
||||||
export function get2step (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.twoStepCode,
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
import { axios } from '@/utils/request'
|
|
||||||
|
|
||||||
const api = {
|
|
||||||
user: '/user',
|
|
||||||
role: '/role',
|
|
||||||
service: '/service',
|
|
||||||
permission: '/permission',
|
|
||||||
permissionNoPager: '/permission/no-pager',
|
|
||||||
orgTree: '/org/tree'
|
|
||||||
}
|
|
||||||
|
|
||||||
export default api
|
|
||||||
|
|
||||||
export function getUserList (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.user,
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getRoleList (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.role,
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getServiceList (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.service,
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getPermissions (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.permissionNoPager,
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getOrgTree (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.orgTree,
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// id == 0 add post
|
|
||||||
// id != 0 update put
|
|
||||||
export function saveService (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: api.service,
|
|
||||||
method: parameter.id === 0 ? 'post' : 'put',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* 用户管理模块
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { axios } from '@/utils/request'
|
|
||||||
|
|
||||||
export function getPermissionList (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/permissions',
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function store (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/permissions',
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function read (id) {
|
|
||||||
return axios({
|
|
||||||
url: '/permissions/' + id,
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function update (id, parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/permissions/' + id,
|
|
||||||
method: 'put',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function del (id) {
|
|
||||||
return axios({
|
|
||||||
url: '/permissions/' + id,
|
|
||||||
method: 'delete'
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* 角色管理模块
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { axios } from '@/utils/request'
|
|
||||||
|
|
||||||
export function getRoleList (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/roles',
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function store (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/roles',
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function read (id) {
|
|
||||||
return axios({
|
|
||||||
url: '/roles/' + id,
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function update (id, parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/roles/' + id,
|
|
||||||
method: 'put',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function del (id) {
|
|
||||||
return axios({
|
|
||||||
url: '/roles/' + id,
|
|
||||||
method: 'delete'
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
/**
|
|
||||||
* 用户管理模块
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { axios } from '@/utils/request'
|
|
||||||
|
|
||||||
export function getUserList (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/users',
|
|
||||||
method: 'get',
|
|
||||||
params: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function store (parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/users',
|
|
||||||
method: 'post',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function read (id) {
|
|
||||||
return axios({
|
|
||||||
url: '/users/' + id,
|
|
||||||
method: 'get'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function update (id, parameter) {
|
|
||||||
return axios({
|
|
||||||
url: '/users/' + id,
|
|
||||||
method: 'put',
|
|
||||||
data: parameter
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function del (id) {
|
|
||||||
return axios({
|
|
||||||
url: '/users/' + id,
|
|
||||||
method: 'delete'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function swtichStatus (id) {
|
|
||||||
return axios({
|
|
||||||
url: '/users/switch/status/' + id,
|
|
||||||
method: 'put'
|
|
||||||
})
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1551058675966" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7872" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M85.333333 512h85.333334a340.736 340.736 0 0 1 99.712-241.621333 337.493333 337.493333 0 0 1 108.458666-72.96 346.453333 346.453333 0 0 1 261.546667-1.749334A106.154667 106.154667 0 0 0 746.666667 298.666667C805.802667 298.666667 853.333333 251.136 853.333333 192S805.802667 85.333333 746.666667 85.333333c-29.397333 0-55.978667 11.776-75.221334 30.933334-103.722667-41.514667-222.848-40.874667-325.76 2.517333a423.594667 423.594667 0 0 0-135.68 91.264 423.253333 423.253333 0 0 0-91.306666 135.637333A426.88 426.88 0 0 0 85.333333 512z m741.248 133.205333c-17.109333 40.618667-41.685333 77.141333-72.96 108.416s-67.797333 55.850667-108.458666 72.96a346.453333 346.453333 0 0 1-261.546667 1.749334A106.154667 106.154667 0 0 0 277.333333 725.333333C218.197333 725.333333 170.666667 772.864 170.666667 832S218.197333 938.666667 277.333333 938.666667c29.397333 0 55.978667-11.776 75.221334-30.933334A425.173333 425.173333 0 0 0 512 938.666667a425.941333 425.941333 0 0 0 393.258667-260.352A426.325333 426.325333 0 0 0 938.666667 512h-85.333334a341.034667 341.034667 0 0 1-26.752 133.205333z" p-id="7873"></path><path d="M512 318.378667c-106.752 0-193.621333 86.869333-193.621333 193.621333S405.248 705.621333 512 705.621333s193.621333-86.869333 193.621333-193.621333S618.752 318.378667 512 318.378667z m0 301.909333c-59.690667 0-108.288-48.597333-108.288-108.288S452.309333 403.712 512 403.712s108.288 48.597333 108.288 108.288-48.597333 108.288-108.288 108.288z" p-id="7874"></path></svg>
|
|
Before Width: | Height: | Size: 1.8 KiB |
@ -1,89 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="antd-pro-components-article-list-content-index-listContent">
|
|
||||||
<div class="description">
|
|
||||||
<slot>
|
|
||||||
{{ description }}
|
|
||||||
</slot>
|
|
||||||
</div>
|
|
||||||
<div class="extra">
|
|
||||||
<a-avatar :src="avatar" size="small" />
|
|
||||||
<a :href="href">{{ owner }}</a> 发布在 <a :href="href">{{ href }}</a>
|
|
||||||
<em>{{ updateAt | moment }}</em>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'ArticleListContent',
|
|
||||||
props: {
|
|
||||||
prefixCls: {
|
|
||||||
type: String,
|
|
||||||
default: 'antd-pro-components-article-list-content-index-listContent'
|
|
||||||
},
|
|
||||||
description: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
owner: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
avatar: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
href: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
updateAt: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
@import '../index.less';
|
|
||||||
|
|
||||||
.antd-pro-components-article-list-content-index-listContent {
|
|
||||||
.description {
|
|
||||||
max-width: 720px;
|
|
||||||
line-height: 22px;
|
|
||||||
}
|
|
||||||
.extra {
|
|
||||||
margin-top: 16px;
|
|
||||||
color: @text-color-secondary;
|
|
||||||
line-height: 22px;
|
|
||||||
|
|
||||||
& /deep/ .ant-avatar {
|
|
||||||
position: relative;
|
|
||||||
top: 1px;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
margin-right: 8px;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > em {
|
|
||||||
margin-left: 16px;
|
|
||||||
color: @disabled-color;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: @screen-xs) {
|
|
||||||
.antd-pro-components-article-list-content-index-listContent {
|
|
||||||
.extra {
|
|
||||||
& > em {
|
|
||||||
display: block;
|
|
||||||
margin-top: 8px;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,3 +0,0 @@
|
|||||||
import ArticleListContent from './ArticleListContent'
|
|
||||||
|
|
||||||
export default ArticleListContent
|
|
@ -1,46 +0,0 @@
|
|||||||
<template>
|
|
||||||
<tooltip v-if="tips !== ''">
|
|
||||||
<template slot="title">{{ tips }}</template>
|
|
||||||
<avatar :size="avatarSize" :src="src" />
|
|
||||||
</tooltip>
|
|
||||||
<avatar v-else :size="avatarSize" :src="src" />
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Avatar from 'ant-design-vue/es/avatar'
|
|
||||||
import Tooltip from 'ant-design-vue/es/tooltip'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'AvatarItem',
|
|
||||||
components: {
|
|
||||||
Avatar,
|
|
||||||
Tooltip
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
tips: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
src: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
size: this.$parent.size
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
avatarSize () {
|
|
||||||
return this.size !== 'mini' && this.size || 20
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
'$parent.size' (val) {
|
|
||||||
this.size = val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,99 +0,0 @@
|
|||||||
<!--
|
|
||||||
<template>
|
|
||||||
<div :class="[prefixCls]">
|
|
||||||
<ul>
|
|
||||||
<slot></slot>
|
|
||||||
<template v-for="item in filterEmpty($slots.default).slice(0, 3)"></template>
|
|
||||||
|
|
||||||
<template v-if="maxLength > 0 && filterEmpty($slots.default).length > maxLength">
|
|
||||||
<avatar-item :size="size">
|
|
||||||
<avatar :size="size !== 'mini' && size || 20" :style="excessItemsStyle">{{ `+${maxLength}` }}</avatar>
|
|
||||||
</avatar-item>
|
|
||||||
</template>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Avatar from 'ant-design-vue/es/avatar'
|
|
||||||
import AvatarItem from './Item'
|
|
||||||
import { filterEmpty } from '@/components/_util/util'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
AvatarItem,
|
|
||||||
name: 'AvatarList',
|
|
||||||
components: {
|
|
||||||
Avatar,
|
|
||||||
AvatarItem
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
prefixCls: {
|
|
||||||
type: String,
|
|
||||||
default: 'ant-pro-avatar-list'
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 头像大小 类型: large、small 、mini, default
|
|
||||||
* 默认值: default
|
|
||||||
*/
|
|
||||||
size: {
|
|
||||||
type: [String, Number],
|
|
||||||
default: 'default'
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 要显示的最大项目
|
|
||||||
*/
|
|
||||||
maxLength: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 多余的项目风格
|
|
||||||
*/
|
|
||||||
excessItemsStyle: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {
|
|
||||||
return {
|
|
||||||
color: '#f56a00',
|
|
||||||
backgroundColor: '#fde3cf'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getItems (items) {
|
|
||||||
const classString = {
|
|
||||||
[`${this.prefixCls}-item`]: true,
|
|
||||||
[`${this.size}`]: true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.maxLength > 0) {
|
|
||||||
items = items.slice(0, this.maxLength)
|
|
||||||
items.push((<Avatar size={ this.size } style={ this.excessItemsStyle }>{`+${this.maxLength}`}</Avatar>))
|
|
||||||
}
|
|
||||||
const itemList = items.map((item) => (
|
|
||||||
<li class={ classString }>{ item }</li>
|
|
||||||
))
|
|
||||||
return itemList
|
|
||||||
}
|
|
||||||
},
|
|
||||||
render () {
|
|
||||||
const { prefixCls, size } = this.$props
|
|
||||||
const classString = {
|
|
||||||
[`${prefixCls}`]: true,
|
|
||||||
[`${size}`]: true
|
|
||||||
}
|
|
||||||
const items = filterEmpty(this.$slots.default)
|
|
||||||
const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{ this.getItems(items) }</ul> : null
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div class={ classString }>
|
|
||||||
{ itemsDom }
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,4 +0,0 @@
|
|||||||
import AvatarList from './List'
|
|
||||||
import './index.less'
|
|
||||||
|
|
||||||
export default AvatarList
|
|
@ -1,60 +0,0 @@
|
|||||||
@import "../index";
|
|
||||||
|
|
||||||
@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list";
|
|
||||||
@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item";
|
|
||||||
|
|
||||||
.@{avatar-list-prefix-cls} {
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style: none;
|
|
||||||
display: inline-block;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0 0 0 8px;
|
|
||||||
font-size: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.@{avatar-list-item-prefix-cls} {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: @font-size-base;
|
|
||||||
margin-left: -8px;
|
|
||||||
width: @avatar-size-base;
|
|
||||||
height: @avatar-size-base;
|
|
||||||
|
|
||||||
:global {
|
|
||||||
.ant-avatar {
|
|
||||||
border: 1px solid #fff;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.large {
|
|
||||||
width: @avatar-size-lg;
|
|
||||||
height: @avatar-size-lg;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.small {
|
|
||||||
width: @avatar-size-sm;
|
|
||||||
height: @avatar-size-sm;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.mini {
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
|
|
||||||
:global {
|
|
||||||
.ant-avatar {
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
|
|
||||||
.ant-avatar-string {
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 18px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
|||||||
# AvatarList 用户头像列表
|
|
||||||
|
|
||||||
|
|
||||||
一组用户头像,常用在项目/团队成员列表。可通过设置 `size` 属性来指定头像大小。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
引用方式:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
import AvatarList from '@/components/AvatarList'
|
|
||||||
const AvatarListItem = AvatarList.AvatarItem
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
AvatarList,
|
|
||||||
AvatarListItem
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 代码演示 [demo](https://pro.loacg.com/test/home)
|
|
||||||
|
|
||||||
```html
|
|
||||||
<avatar-list size="mini">
|
|
||||||
<avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" />
|
|
||||||
<avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" />
|
|
||||||
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
|
|
||||||
</avatar-list>
|
|
||||||
```
|
|
||||||
或
|
|
||||||
```html
|
|
||||||
<avatar-list :max-length="3">
|
|
||||||
<avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" />
|
|
||||||
<avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" />
|
|
||||||
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
|
|
||||||
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
|
|
||||||
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
|
|
||||||
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
|
|
||||||
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
|
|
||||||
</avatar-list>
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
### AvatarList
|
|
||||||
|
|
||||||
| 参数 | 说明 | 类型 | 默认值 |
|
|
||||||
| ---------------- | -------- | ---------------------------------- | --------- |
|
|
||||||
| size | 头像大小 | `large`、`small` 、`mini`, `default` | `default` |
|
|
||||||
| maxLength | 要显示的最大项目 | number | - |
|
|
||||||
| excessItemsStyle | 多余的项目风格 | CSSProperties | - |
|
|
||||||
|
|
||||||
### AvatarList.Item
|
|
||||||
|
|
||||||
| 参数 | 说明 | 类型 | 默认值 |
|
|
||||||
| ---- | ------ | --------- | --- |
|
|
||||||
| tips | 头像展示文案 | string | - |
|
|
||||||
| src | 头像图片连接 | string | - |
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div :style="{ padding: '0 0 32px 32px' }">
|
|
||||||
<h4 :style="{ marginBottom: '20px' }">{{ title }}</h4>
|
|
||||||
<v-chart
|
|
||||||
height="254"
|
|
||||||
:data="data"
|
|
||||||
:forceFit="true"
|
|
||||||
:padding="['auto', 'auto', '40', '50']">
|
|
||||||
<v-tooltip />
|
|
||||||
<v-axis />
|
|
||||||
<v-bar position="x*y"/>
|
|
||||||
</v-chart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'Bar',
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
data: {
|
|
||||||
type: Array,
|
|
||||||
default: () => {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
scale: {
|
|
||||||
type: Array,
|
|
||||||
default: () => {
|
|
||||||
return [{
|
|
||||||
dataKey: 'x',
|
|
||||||
min: 2
|
|
||||||
}, {
|
|
||||||
dataKey: 'y',
|
|
||||||
title: '时间',
|
|
||||||
min: 1,
|
|
||||||
max: 22
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
type: Array,
|
|
||||||
default: () => {
|
|
||||||
return [
|
|
||||||
'x*y',
|
|
||||||
(x, y) => ({
|
|
||||||
name: x,
|
|
||||||
value: y
|
|
||||||
})
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,120 +0,0 @@
|
|||||||
<template>
|
|
||||||
<a-card :loading="loading" :body-style="{ padding: '20px 24px 8px' }" :bordered="false">
|
|
||||||
<div class="chart-card-header">
|
|
||||||
<div class="meta">
|
|
||||||
<span class="chart-card-title">
|
|
||||||
<slot name="title">
|
|
||||||
{{ title }}
|
|
||||||
</slot>
|
|
||||||
</span>
|
|
||||||
<span class="chart-card-action">
|
|
||||||
<slot name="action"></slot>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="total">
|
|
||||||
<slot name="total">
|
|
||||||
<span>{{ typeof total === 'function' && total() || total }}</span>
|
|
||||||
</slot>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chart-card-content">
|
|
||||||
<div class="content-fix">
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="chart-card-footer">
|
|
||||||
<div class="field">
|
|
||||||
<slot name="footer"></slot>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a-card>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'ChartCard',
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
total: {
|
|
||||||
type: [Function, Number, String],
|
|
||||||
required: false,
|
|
||||||
default: null
|
|
||||||
},
|
|
||||||
loading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.chart-card-header {
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.meta {
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 100%;
|
|
||||||
color: rgba(0, 0, 0, .45);
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 22px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chart-card-action {
|
|
||||||
cursor: pointer;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chart-card-footer {
|
|
||||||
border-top: 1px solid #e8e8e8;
|
|
||||||
padding-top: 9px;
|
|
||||||
margin-top: 8px;
|
|
||||||
|
|
||||||
> * {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.field {
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chart-card-content {
|
|
||||||
margin-bottom: 12px;
|
|
||||||
position: relative;
|
|
||||||
height: 46px;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.content-fix {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.total {
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
word-break: break-all;
|
|
||||||
white-space: nowrap;
|
|
||||||
color: #000;
|
|
||||||
margin-top: 4px;
|
|
||||||
margin-bottom: 0;
|
|
||||||
font-size: 30px;
|
|
||||||
line-height: 38px;
|
|
||||||
height: 38px;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,67 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
<v-chart
|
|
||||||
:forceFit="true"
|
|
||||||
:height="height"
|
|
||||||
:width="width"
|
|
||||||
:data="data"
|
|
||||||
:scale="scale"
|
|
||||||
:padding="0">
|
|
||||||
<v-tooltip />
|
|
||||||
<v-interval
|
|
||||||
:shape="['liquid-fill-gauge']"
|
|
||||||
position="transfer*value"
|
|
||||||
color=""
|
|
||||||
:v-style="{
|
|
||||||
lineWidth: 10,
|
|
||||||
opacity: 0.75
|
|
||||||
}"
|
|
||||||
:tooltip="[
|
|
||||||
'transfer*value',
|
|
||||||
(transfer, value) => {
|
|
||||||
return {
|
|
||||||
name: transfer,
|
|
||||||
value,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
]"
|
|
||||||
></v-interval>
|
|
||||||
<v-guide
|
|
||||||
v-for="(row, index) in data"
|
|
||||||
:key="index"
|
|
||||||
type="text"
|
|
||||||
:top="true"
|
|
||||||
:position="{
|
|
||||||
gender: row.transfer,
|
|
||||||
value: 45
|
|
||||||
}"
|
|
||||||
:content="row.value + '%'"
|
|
||||||
:v-style="{
|
|
||||||
fontSize: 100,
|
|
||||||
textAlign: 'center',
|
|
||||||
opacity: 0.75,
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
</v-chart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'Liquid',
|
|
||||||
props: {
|
|
||||||
height: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,56 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="antv-chart-mini">
|
|
||||||
<div class="chart-wrapper" :style="{ height: 46 }">
|
|
||||||
<v-chart :force-fit="true" :height="height" :data="data" :padding="[36, 0, 18, 0]">
|
|
||||||
<v-tooltip />
|
|
||||||
<v-smooth-area position="x*y" />
|
|
||||||
</v-chart>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import moment from 'moment'
|
|
||||||
const data = []
|
|
||||||
const beginDay = new Date().getTime()
|
|
||||||
|
|
||||||
for (let i = 0; i < 10; i++) {
|
|
||||||
data.push({
|
|
||||||
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
|
|
||||||
y: Math.round(Math.random() * 10)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const tooltip = [
|
|
||||||
'x*y',
|
|
||||||
(x, y) => ({
|
|
||||||
name: x,
|
|
||||||
value: y
|
|
||||||
})
|
|
||||||
]
|
|
||||||
const scale = [{
|
|
||||||
dataKey: 'x',
|
|
||||||
min: 2
|
|
||||||
}, {
|
|
||||||
dataKey: 'y',
|
|
||||||
title: '时间',
|
|
||||||
min: 1,
|
|
||||||
max: 22
|
|
||||||
}]
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'MiniArea',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
data,
|
|
||||||
tooltip,
|
|
||||||
scale,
|
|
||||||
height: 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
@import "chart";
|
|
||||||
</style>
|
|
@ -1,57 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="antv-chart-mini">
|
|
||||||
<div class="chart-wrapper" :style="{ height: 46 }">
|
|
||||||
<v-chart :force-fit="true" :height="height" :data="data" :padding="[36, 5, 18, 5]">
|
|
||||||
<v-tooltip />
|
|
||||||
<v-bar position="x*y" />
|
|
||||||
</v-chart>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import moment from 'moment'
|
|
||||||
const data = []
|
|
||||||
const beginDay = new Date().getTime()
|
|
||||||
|
|
||||||
for (let i = 0; i < 10; i++) {
|
|
||||||
data.push({
|
|
||||||
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
|
|
||||||
y: Math.round(Math.random() * 10)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const tooltip = [
|
|
||||||
'x*y',
|
|
||||||
(x, y) => ({
|
|
||||||
name: x,
|
|
||||||
value: y
|
|
||||||
})
|
|
||||||
]
|
|
||||||
|
|
||||||
const scale = [{
|
|
||||||
dataKey: 'x',
|
|
||||||
min: 2
|
|
||||||
}, {
|
|
||||||
dataKey: 'y',
|
|
||||||
title: '时间',
|
|
||||||
min: 1,
|
|
||||||
max: 30
|
|
||||||
}]
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'MiniBar',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
data,
|
|
||||||
tooltip,
|
|
||||||
scale,
|
|
||||||
height: 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
@import "chart";
|
|
||||||
</style>
|
|
@ -1,75 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="chart-mini-progress">
|
|
||||||
<div class="target" :style="{ left: target + '%'}">
|
|
||||||
<span :style="{ backgroundColor: color }" />
|
|
||||||
<span :style="{ backgroundColor: color }"/>
|
|
||||||
</div>
|
|
||||||
<div class="progress-wrapper">
|
|
||||||
<div class="progress" :style="{ backgroundColor: color, width: percentage + '%', height: height }"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'MiniProgress',
|
|
||||||
props: {
|
|
||||||
target: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: String,
|
|
||||||
default: '10px'
|
|
||||||
},
|
|
||||||
color: {
|
|
||||||
type: String,
|
|
||||||
default: '#13C2C2'
|
|
||||||
},
|
|
||||||
percentage: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.chart-mini-progress {
|
|
||||||
padding: 5px 0;
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.target {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
|
|
||||||
span {
|
|
||||||
border-radius: 100px;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
height: 4px;
|
|
||||||
width: 2px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
top: auto;
|
|
||||||
bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.progress-wrapper {
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.progress {
|
|
||||||
transition: all .4s cubic-bezier(.08,.82,.17,1) 0s;
|
|
||||||
border-radius: 1px 0 0 1px;
|
|
||||||
background-color: #1890ff;
|
|
||||||
width: 0;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,40 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div :class="prefixCls">
|
|
||||||
<div class="chart-wrapper" :style="{ height: 46 }">
|
|
||||||
<v-chart :force-fit="true" :height="100" :data="dataSource" :scale="scale" :padding="[36, 0, 18, 0]">
|
|
||||||
<v-tooltip />
|
|
||||||
<v-smooth-line position="x*y" :size="2" />
|
|
||||||
<v-smooth-area position="x*y" />
|
|
||||||
</v-chart>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'MiniSmoothArea',
|
|
||||||
props: {
|
|
||||||
prefixCls: {
|
|
||||||
type: String,
|
|
||||||
default: 'ant-pro-smooth-area'
|
|
||||||
},
|
|
||||||
scale: {
|
|
||||||
type: [Object, Array],
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
dataSource: {
|
|
||||||
type: Array,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
height: 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
@import "smooth.area.less";
|
|
||||||
</style>
|
|
@ -1,68 +0,0 @@
|
|||||||
<template>
|
|
||||||
<v-chart :forceFit="true" height="400" :data="data" :padding="[20, 20, 95, 20]" :scale="scale">
|
|
||||||
<v-tooltip></v-tooltip>
|
|
||||||
<v-axis :dataKey="axis1Opts.dataKey" :line="axis1Opts.line" :tickLine="axis1Opts.tickLine" :grid="axis1Opts.grid" />
|
|
||||||
<v-axis :dataKey="axis2Opts.dataKey" :line="axis2Opts.line" :tickLine="axis2Opts.tickLine" :grid="axis2Opts.grid" />
|
|
||||||
<v-legend dataKey="user" marker="circle" :offset="30" />
|
|
||||||
<v-coord type="polar" radius="0.8" />
|
|
||||||
<v-line position="item*score" color="user" :size="2" />
|
|
||||||
<v-point position="item*score" color="user" :size="4" shape="circle" />
|
|
||||||
</v-chart>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const axis1Opts = {
|
|
||||||
dataKey: 'item',
|
|
||||||
line: null,
|
|
||||||
tickLine: null,
|
|
||||||
grid: {
|
|
||||||
lineStyle: {
|
|
||||||
lineDash: null
|
|
||||||
},
|
|
||||||
hideFirstLine: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const axis2Opts = {
|
|
||||||
dataKey: 'score',
|
|
||||||
line: null,
|
|
||||||
tickLine: null,
|
|
||||||
grid: {
|
|
||||||
type: 'polygon',
|
|
||||||
lineStyle: {
|
|
||||||
lineDash: null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const scale = [
|
|
||||||
{
|
|
||||||
dataKey: 'score',
|
|
||||||
min: 0,
|
|
||||||
max: 80
|
|
||||||
}, {
|
|
||||||
dataKey: 'user',
|
|
||||||
alias: '类型'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Radar',
|
|
||||||
props: {
|
|
||||||
data: {
|
|
||||||
type: Array,
|
|
||||||
default: null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
axis1Opts,
|
|
||||||
axis2Opts,
|
|
||||||
scale
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,77 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="rank">
|
|
||||||
<h4 class="title">{{ title }}</h4>
|
|
||||||
<ul class="list">
|
|
||||||
<li :key="index" v-for="(item, index) in list">
|
|
||||||
<span :class="index < 3 ? 'active' : null">{{ index + 1 }}</span>
|
|
||||||
<span>{{ item.name }}</span>
|
|
||||||
<span>{{ item.total }}</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'RankList',
|
|
||||||
// ['title', 'list']
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
list: {
|
|
||||||
type: Array,
|
|
||||||
default: null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
|
|
||||||
.rank {
|
|
||||||
padding: 0 32px 32px 72px;
|
|
||||||
|
|
||||||
.list {
|
|
||||||
margin: 25px 0 0;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
|
|
||||||
li {
|
|
||||||
margin-top: 16px;
|
|
||||||
|
|
||||||
span {
|
|
||||||
color: rgba(0, 0, 0, .65);
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 22px;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
border-radius: 20px;
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 600;
|
|
||||||
margin-right: 24px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
width: 20px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
&.active {
|
|
||||||
background-color: #314659;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
&:last-child {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.mobile .rank {
|
|
||||||
padding: 0 32px 32px 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,113 +0,0 @@
|
|||||||
<template>
|
|
||||||
<v-chart :width="width" :height="height" :padding="[0]" :data="data" :scale="scale">
|
|
||||||
<v-tooltip :show-title="false" />
|
|
||||||
<v-coord type="rect" direction="TL" />
|
|
||||||
<v-point position="x*y" color="category" shape="cloud" tooltip="value*category" />
|
|
||||||
</v-chart>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { registerShape } from 'viser-vue'
|
|
||||||
const DataSet = require('@antv/data-set')
|
|
||||||
|
|
||||||
const imgUrl = 'https://gw.alipayobjects.com/zos/rmsportal/gWyeGLCdFFRavBGIDzWk.png'
|
|
||||||
|
|
||||||
const scale = [
|
|
||||||
{ dataKey: 'x', nice: false },
|
|
||||||
{ dataKey: 'y', nice: false }
|
|
||||||
]
|
|
||||||
|
|
||||||
registerShape('point', 'cloud', {
|
|
||||||
draw (cfg, container) {
|
|
||||||
return container.addShape('text', {
|
|
||||||
attrs: {
|
|
||||||
fillOpacity: cfg.opacity,
|
|
||||||
fontSize: cfg.origin._origin.size,
|
|
||||||
rotate: cfg.origin._origin.rotate,
|
|
||||||
text: cfg.origin._origin.text,
|
|
||||||
textAlign: 'center',
|
|
||||||
fontFamily: cfg.origin._origin.font,
|
|
||||||
fill: cfg.color,
|
|
||||||
textBaseline: 'Alphabetic',
|
|
||||||
...cfg.style,
|
|
||||||
x: cfg.x,
|
|
||||||
y: cfg.y
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'TagCloud',
|
|
||||||
props: {
|
|
||||||
tagList: {
|
|
||||||
type: Array,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: Number,
|
|
||||||
default: 400
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
type: Number,
|
|
||||||
default: 640
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
data: [],
|
|
||||||
scale
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
tagList: function (val) {
|
|
||||||
if (val.length > 0) {
|
|
||||||
this.initTagCloud(val)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
if (this.tagList.length > 0) {
|
|
||||||
this.initTagCloud(this.tagList)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
initTagCloud (dataSource) {
|
|
||||||
const { height, width } = this
|
|
||||||
|
|
||||||
const dv = new DataSet.View().source(dataSource)
|
|
||||||
const range = dv.range('value')
|
|
||||||
const min = range[0]
|
|
||||||
const max = range[1]
|
|
||||||
const imageMask = new Image()
|
|
||||||
imageMask.crossOrigin = ''
|
|
||||||
imageMask.src = imgUrl
|
|
||||||
imageMask.onload = () => {
|
|
||||||
dv.transform({
|
|
||||||
type: 'tag-cloud',
|
|
||||||
fields: ['name', 'value'],
|
|
||||||
size: [width, height],
|
|
||||||
imageMask,
|
|
||||||
font: 'Verdana',
|
|
||||||
padding: 0,
|
|
||||||
timeInterval: 5000, // max execute time
|
|
||||||
rotate () {
|
|
||||||
let random = ~~(Math.random() * 4) % 4
|
|
||||||
if (random === 2) {
|
|
||||||
random = 0
|
|
||||||
}
|
|
||||||
return random * 90 // 0, 90, 270
|
|
||||||
},
|
|
||||||
fontSize (d) {
|
|
||||||
if (d.value) {
|
|
||||||
return ((d.value - min) / (max - min)) * (32 - 8) + 8
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.data = dv.rows
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,64 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div :style="{ padding: '0 0 32px 32px' }">
|
|
||||||
<h4 :style="{ marginBottom: '20px' }">{{ title }}</h4>
|
|
||||||
<v-chart
|
|
||||||
height="254"
|
|
||||||
:data="data"
|
|
||||||
:scale="scale"
|
|
||||||
:forceFit="true"
|
|
||||||
:padding="['auto', 'auto', '40', '50']">
|
|
||||||
<v-tooltip />
|
|
||||||
<v-axis />
|
|
||||||
<v-bar position="x*y"/>
|
|
||||||
</v-chart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const tooltip = [
|
|
||||||
'x*y',
|
|
||||||
(x, y) => ({
|
|
||||||
name: x,
|
|
||||||
value: y
|
|
||||||
})
|
|
||||||
]
|
|
||||||
const scale = [{
|
|
||||||
dataKey: 'x',
|
|
||||||
title: '日期(天)',
|
|
||||||
alias: '日期(天)',
|
|
||||||
min: 2
|
|
||||||
}, {
|
|
||||||
dataKey: 'y',
|
|
||||||
title: '流量(Gb)',
|
|
||||||
alias: '流量(Gb)',
|
|
||||||
min: 1
|
|
||||||
}]
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Bar',
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
data: [],
|
|
||||||
scale,
|
|
||||||
tooltip
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
this.getMonthBar()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getMonthBar () {
|
|
||||||
this.$http.get('/analysis/month-bar')
|
|
||||||
.then(res => {
|
|
||||||
this.data = res.result
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,82 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="chart-trend">
|
|
||||||
{{ term }}
|
|
||||||
<span>{{ rate }}%</span>
|
|
||||||
<span :class="['trend-icon', trend]"><a-icon :type="'caret-' + trend"/></span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'Trend',
|
|
||||||
props: {
|
|
||||||
term: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
percentage: {
|
|
||||||
type: Number,
|
|
||||||
default: null
|
|
||||||
},
|
|
||||||
type: {
|
|
||||||
type: Boolean,
|
|
||||||
default: null
|
|
||||||
},
|
|
||||||
target: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
value: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
fixed: {
|
|
||||||
type: Number,
|
|
||||||
default: 2
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
trend: this.type && 'up' || 'down',
|
|
||||||
rate: this.percentage
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
const type = this.type === null ? this.value >= this.target : this.type
|
|
||||||
this.trend = type ? 'up' : 'down'
|
|
||||||
this.rate = (this.percentage === null ? Math.abs(this.value - this.target) * 100 / this.target : this.percentage).toFixed(this.fixed)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.chart-trend {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 22px;
|
|
||||||
|
|
||||||
.trend-icon {
|
|
||||||
font-size: 12px;
|
|
||||||
|
|
||||||
&.up, &.down {
|
|
||||||
margin-left: 4px;
|
|
||||||
position: relative;
|
|
||||||
top: 1px;
|
|
||||||
|
|
||||||
i {
|
|
||||||
font-size: 12px;
|
|
||||||
transform: scale(.83);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.up {
|
|
||||||
color: #f5222d;
|
|
||||||
}
|
|
||||||
&.down {
|
|
||||||
color: #52c41a;
|
|
||||||
top: -1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,13 +0,0 @@
|
|||||||
.antv-chart-mini {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.chart-wrapper {
|
|
||||||
position: absolute;
|
|
||||||
bottom: -28px;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
/* margin: 0 -5px;
|
|
||||||
overflow: hidden;*/
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
@import "../index";
|
|
||||||
|
|
||||||
@smoothArea-prefix-cls: ~"@{ant-pro-prefix}-smooth-area";
|
|
||||||
|
|
||||||
.@{smoothArea-prefix-cls} {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.chart-wrapper {
|
|
||||||
position: absolute;
|
|
||||||
bottom: -28px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,102 +0,0 @@
|
|||||||
<template>
|
|
||||||
<span>
|
|
||||||
{{ lastTime | format }}
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
function fixedZero (val) {
|
|
||||||
return val * 1 < 10 ? `0${val}` : val
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'CountDown',
|
|
||||||
props: {
|
|
||||||
format: {
|
|
||||||
type: Function,
|
|
||||||
default: undefined
|
|
||||||
},
|
|
||||||
target: {
|
|
||||||
type: [Date, Number],
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
onEnd: {
|
|
||||||
type: Function,
|
|
||||||
default: () => ({})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
dateTime: '0',
|
|
||||||
originTargetTime: 0,
|
|
||||||
lastTime: 0,
|
|
||||||
timer: 0,
|
|
||||||
interval: 1000
|
|
||||||
}
|
|
||||||
},
|
|
||||||
filters: {
|
|
||||||
format (time) {
|
|
||||||
const hours = 60 * 60 * 1000
|
|
||||||
const minutes = 60 * 1000
|
|
||||||
|
|
||||||
const h = Math.floor(time / hours)
|
|
||||||
const m = Math.floor((time - h * hours) / minutes)
|
|
||||||
const s = Math.floor((time - h * hours - m * minutes) / 1000)
|
|
||||||
return `${fixedZero(h)}:${fixedZero(m)}:${fixedZero(s)}`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
this.initTime()
|
|
||||||
this.tick()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
initTime () {
|
|
||||||
let lastTime = 0
|
|
||||||
let targetTime = 0
|
|
||||||
this.originTargetTime = this.target
|
|
||||||
try {
|
|
||||||
if (Object.prototype.toString.call(this.target) === '[object Date]') {
|
|
||||||
targetTime = this.target
|
|
||||||
} else {
|
|
||||||
targetTime = new Date(this.target).getTime()
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error('invalid target prop')
|
|
||||||
}
|
|
||||||
|
|
||||||
lastTime = targetTime - new Date().getTime()
|
|
||||||
|
|
||||||
this.lastTime = lastTime < 0 ? 0 : lastTime
|
|
||||||
},
|
|
||||||
tick () {
|
|
||||||
const { onEnd } = this
|
|
||||||
|
|
||||||
this.timer = setTimeout(() => {
|
|
||||||
if (this.lastTime < this.interval) {
|
|
||||||
clearTimeout(this.timer)
|
|
||||||
this.lastTime = 0
|
|
||||||
if (typeof onEnd === 'function') {
|
|
||||||
onEnd()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.lastTime -= this.interval
|
|
||||||
this.tick()
|
|
||||||
}
|
|
||||||
}, this.interval)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeUpdate () {
|
|
||||||
if (this.originTargetTime !== this.target) {
|
|
||||||
this.initTime()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
clearTimeout(this.timer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,3 +0,0 @@
|
|||||||
import CountDown from './CountDown'
|
|
||||||
|
|
||||||
export default CountDown
|
|
@ -1,34 +0,0 @@
|
|||||||
# CountDown 倒计时
|
|
||||||
|
|
||||||
倒计时组件。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
引用方式:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
import CountDown from '@/components/CountDown/CountDown'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
CountDown
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 代码演示 [demo](https://pro.loacg.com/test/home)
|
|
||||||
|
|
||||||
```html
|
|
||||||
<count-down :target="new Date().getTime() + 3000000" :on-end="onEndHandle" />
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
| 参数 | 说明 | 类型 | 默认值 |
|
|
||||||
|----------|------------------------------------------|-------------|-------|
|
|
||||||
| target | 目标时间 | Date | - |
|
|
||||||
| onEnd | 倒计时结束回调 | funtion | -|
|
|
@ -1,153 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div :class="['description-list', size, layout === 'vertical' ? 'vertical': 'horizontal']">
|
|
||||||
<div v-if="title" class="title">{{ title }}</div>
|
|
||||||
<a-row>
|
|
||||||
<slot></slot>
|
|
||||||
</a-row>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { Col } from 'ant-design-vue/es/grid/'
|
|
||||||
|
|
||||||
const Item = {
|
|
||||||
name: 'DetailListItem',
|
|
||||||
props: {
|
|
||||||
term: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
required: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
inject: {
|
|
||||||
col: {
|
|
||||||
type: Number
|
|
||||||
}
|
|
||||||
},
|
|
||||||
render () {
|
|
||||||
return (
|
|
||||||
<Col {...{ props: responsive[this.col] }}>
|
|
||||||
<div class="term">{this.$props.term}</div>
|
|
||||||
<div class="content">{this.$slots.default}</div>
|
|
||||||
</Col>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const responsive = {
|
|
||||||
1: { xs: 24 },
|
|
||||||
2: { xs: 24, sm: 12 },
|
|
||||||
3: { xs: 24, sm: 12, md: 8 },
|
|
||||||
4: { xs: 24, sm: 12, md: 6 }
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'DetailList',
|
|
||||||
Item: Item,
|
|
||||||
components: {
|
|
||||||
Col
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
required: false
|
|
||||||
},
|
|
||||||
col: {
|
|
||||||
type: Number,
|
|
||||||
required: false,
|
|
||||||
default: 3
|
|
||||||
},
|
|
||||||
size: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default: 'large'
|
|
||||||
},
|
|
||||||
layout: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default: 'horizontal'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
provide () {
|
|
||||||
return {
|
|
||||||
col: this.col > 4 ? 4 : this.col
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
|
|
||||||
.description-list {
|
|
||||||
|
|
||||||
.title {
|
|
||||||
color: rgba(0,0,0,.85);
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/deep/ .term {
|
|
||||||
color: rgba(0,0,0,.85);
|
|
||||||
display: table-cell;
|
|
||||||
line-height: 20px;
|
|
||||||
margin-right: 8px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
white-space: nowrap;
|
|
||||||
|
|
||||||
&:not(:empty):after {
|
|
||||||
content: ":";
|
|
||||||
margin: 0 8px 0 2px;
|
|
||||||
position: relative;
|
|
||||||
top: -.5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/deep/ .content {
|
|
||||||
color: rgba(0,0,0,.65);
|
|
||||||
display: table-cell;
|
|
||||||
min-height: 22px;
|
|
||||||
line-height: 22px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
width: 100%;
|
|
||||||
&:empty {
|
|
||||||
content: ' ';
|
|
||||||
height: 38px;
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.small {
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 14px;
|
|
||||||
color: rgba(0, 0, 0, .65);
|
|
||||||
font-weight: normal;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
/deep/ .term, .content {
|
|
||||||
padding-bottom: 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.large {
|
|
||||||
/deep/ .term, .content {
|
|
||||||
padding-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.vertical {
|
|
||||||
.term {
|
|
||||||
padding-bottom: 8px;
|
|
||||||
}
|
|
||||||
/deep/ .term, .content {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,2 +0,0 @@
|
|||||||
import DescriptionList from './DescriptionList'
|
|
||||||
export default DescriptionList
|
|
@ -1,82 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div :class="prefixCls">
|
|
||||||
<quill-editor
|
|
||||||
v-model="content"
|
|
||||||
ref="myQuillEditor"
|
|
||||||
:options="editorOption"
|
|
||||||
@blur="onEditorBlur($event)"
|
|
||||||
@focus="onEditorFocus($event)"
|
|
||||||
@ready="onEditorReady($event)"
|
|
||||||
@change="onEditorChange($event)">
|
|
||||||
</quill-editor>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import 'quill/dist/quill.core.css'
|
|
||||||
import 'quill/dist/quill.snow.css'
|
|
||||||
import 'quill/dist/quill.bubble.css'
|
|
||||||
|
|
||||||
import { quillEditor } from 'vue-quill-editor'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'QuillEditor',
|
|
||||||
components: {
|
|
||||||
quillEditor
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
prefixCls: {
|
|
||||||
type: String,
|
|
||||||
default: 'ant-editor-quill'
|
|
||||||
},
|
|
||||||
// 表单校验用字段
|
|
||||||
// eslint-disable-next-line
|
|
||||||
value: {
|
|
||||||
type: String
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
content: null,
|
|
||||||
editorOption: {
|
|
||||||
// some quill options
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
onEditorBlur (quill) {
|
|
||||||
console.log('editor blur!', quill)
|
|
||||||
},
|
|
||||||
onEditorFocus (quill) {
|
|
||||||
console.log('editor focus!', quill)
|
|
||||||
},
|
|
||||||
onEditorReady (quill) {
|
|
||||||
console.log('editor ready!', quill)
|
|
||||||
},
|
|
||||||
onEditorChange ({ quill, html, text }) {
|
|
||||||
console.log('editor change!', quill, html, text)
|
|
||||||
this.$emit('change', html)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
value (val) {
|
|
||||||
this.content = val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
@import url('../index.less');
|
|
||||||
|
|
||||||
/* 覆盖 quill 默认边框圆角为 ant 默认圆角,用于统一 ant 组件风格 */
|
|
||||||
.ant-editor-quill {
|
|
||||||
/deep/ .ql-toolbar.ql-snow {
|
|
||||||
border-radius: @border-radius-base @border-radius-base 0 0;
|
|
||||||
}
|
|
||||||
/deep/ .ql-container.ql-snow {
|
|
||||||
border-radius: 0 0 @border-radius-base @border-radius-base;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,57 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div :class="prefixCls">
|
|
||||||
<div ref="editor" class="editor-wrapper"></div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import WEditor from 'wangeditor'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'WangEditor',
|
|
||||||
props: {
|
|
||||||
prefixCls: {
|
|
||||||
type: String,
|
|
||||||
default: 'ant-editor-wang'
|
|
||||||
},
|
|
||||||
// eslint-disable-next-line
|
|
||||||
value: {
|
|
||||||
type: String
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
editor: null,
|
|
||||||
editorContent: null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
value (val) {
|
|
||||||
this.editorContent = val
|
|
||||||
this.editor.txt.html(val)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.initEditor()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
initEditor () {
|
|
||||||
this.editor = new WEditor(this.$refs.editor)
|
|
||||||
// this.editor.onchangeTimeout = 200
|
|
||||||
this.editor.customConfig.onchange = (html) => {
|
|
||||||
this.editorContent = html
|
|
||||||
this.$emit('change', this.editorContent)
|
|
||||||
}
|
|
||||||
this.editor.create()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.ant-editor-wang {
|
|
||||||
.editor-wrapper {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,64 +0,0 @@
|
|||||||
<script>
|
|
||||||
import Tooltip from 'ant-design-vue/es/tooltip'
|
|
||||||
import { cutStrByFullLength, getStrFullLength } from '@/components/_util/util'
|
|
||||||
/*
|
|
||||||
const isSupportLineClamp = document.body.style.webkitLineClamp !== undefined;
|
|
||||||
|
|
||||||
const TooltipOverlayStyle = {
|
|
||||||
overflowWrap: 'break-word',
|
|
||||||
wordWrap: 'break-word',
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Ellipsis',
|
|
||||||
components: {
|
|
||||||
Tooltip
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
prefixCls: {
|
|
||||||
type: String,
|
|
||||||
default: 'ant-pro-ellipsis'
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
type: Boolean
|
|
||||||
},
|
|
||||||
length: {
|
|
||||||
type: Number,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
lines: {
|
|
||||||
type: Number,
|
|
||||||
default: 1
|
|
||||||
},
|
|
||||||
fullWidthRecognition: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getStrDom (str, fullLength) {
|
|
||||||
return (
|
|
||||||
<span>{ cutStrByFullLength(str, this.length) + (fullLength > this.length ? '...' : '') }</span>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
getTooltip (fullStr, fullLength) {
|
|
||||||
return (
|
|
||||||
<Tooltip>
|
|
||||||
<template slot="title">{ fullStr }</template>
|
|
||||||
{ this.getStrDom(fullStr, fullLength) }
|
|
||||||
</Tooltip>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
render () {
|
|
||||||
const { tooltip, length } = this.$props
|
|
||||||
const str = this.$slots.default.map(vNode => vNode.text).join('')
|
|
||||||
const fullLength = getStrFullLength(str)
|
|
||||||
const strDom = tooltip && fullLength > length ? this.getTooltip(str, fullLength) : this.getStrDom(str, fullLength)
|
|
||||||
return (
|
|
||||||
strDom
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,3 +0,0 @@
|
|||||||
import Ellipsis from './Ellipsis'
|
|
||||||
|
|
||||||
export default Ellipsis
|
|
@ -1,38 +0,0 @@
|
|||||||
# Ellipsis 文本自动省略号
|
|
||||||
|
|
||||||
文本过长自动处理省略号,支持按照文本长度和最大行数两种方式截取。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
引用方式:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
import Ellipsis from '@/components/Ellipsis'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
Ellipsis
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 代码演示 [demo](https://pro.loacg.com/test/home)
|
|
||||||
|
|
||||||
```html
|
|
||||||
<ellipsis :length="100" tooltip>
|
|
||||||
There were injuries alleged in three cases in 2015, and a
|
|
||||||
fourth incident in September, according to the safety recall report. After meeting with US regulators in October, the firm decided to issue a voluntary recall.
|
|
||||||
</ellipsis>
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
|
|
||||||
参数 | 说明 | 类型 | 默认值
|
|
||||||
----|------|-----|------
|
|
||||||
tooltip | 移动到文本展示完整内容的提示 | boolean | -
|
|
||||||
length | 在按照长度截取下的文本最大字符数,超过则截取省略 | number | -
|
|
@ -1,130 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="exception">
|
|
||||||
<div class="imgBlock">
|
|
||||||
<div class="imgEle" :style="{backgroundImage: `url(${config[type].img})`}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="content">
|
|
||||||
<h1>{{ config[type].title }}</h1>
|
|
||||||
<div class="desc">{{ config[type].desc }}</div>
|
|
||||||
<div class="actions">
|
|
||||||
<a-button type="primary" @click="handleToHome">返回首页</a-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import types from './type'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Exception',
|
|
||||||
props: {
|
|
||||||
type: {
|
|
||||||
type: String,
|
|
||||||
default: '404'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
config: types
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleToHome () {
|
|
||||||
this.$router.push({ name: 'dashboard' })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style lang="less">
|
|
||||||
@import "~ant-design-vue/lib/style/index";
|
|
||||||
|
|
||||||
.exception {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
height: 80%;
|
|
||||||
min-height: 500px;
|
|
||||||
|
|
||||||
.imgBlock {
|
|
||||||
flex: 0 0 62.5%;
|
|
||||||
width: 62.5%;
|
|
||||||
padding-right: 152px;
|
|
||||||
zoom: 1;
|
|
||||||
&::before,
|
|
||||||
&::after {
|
|
||||||
content: ' ';
|
|
||||||
display: table;
|
|
||||||
}
|
|
||||||
&::after {
|
|
||||||
clear: both;
|
|
||||||
height: 0;
|
|
||||||
font-size: 0;
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.imgEle {
|
|
||||||
float: right;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 430px;
|
|
||||||
height: 360px;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: 50% 50%;
|
|
||||||
background-size: contain;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content {
|
|
||||||
flex: auto;
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin-bottom: 24px;
|
|
||||||
color: #434e59;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 72px;
|
|
||||||
line-height: 72px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.desc {
|
|
||||||
margin-bottom: 16px;
|
|
||||||
color: @text-color-secondary;
|
|
||||||
font-size: 20px;
|
|
||||||
line-height: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions {
|
|
||||||
button:not(:last-child) {
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: @screen-xl) {
|
|
||||||
.exception {
|
|
||||||
.imgBlock {
|
|
||||||
padding-right: 88px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: @screen-sm) {
|
|
||||||
.exception {
|
|
||||||
display: block;
|
|
||||||
text-align: center;
|
|
||||||
.imgBlock {
|
|
||||||
margin: 0 auto 24px;
|
|
||||||
padding-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: @screen-xs) {
|
|
||||||
.exception {
|
|
||||||
.imgBlock {
|
|
||||||
margin-bottom: -24px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,2 +0,0 @@
|
|||||||
import ExceptionPage from './ExceptionPage.vue'
|
|
||||||
export default ExceptionPage
|
|
@ -1,19 +0,0 @@
|
|||||||
const types = {
|
|
||||||
403: {
|
|
||||||
img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg',
|
|
||||||
title: '403',
|
|
||||||
desc: '抱歉,你无权访问该页面'
|
|
||||||
},
|
|
||||||
404: {
|
|
||||||
img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg',
|
|
||||||
title: '404',
|
|
||||||
desc: '抱歉,你访问的页面不存在或仍在开发中'
|
|
||||||
},
|
|
||||||
500: {
|
|
||||||
img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg',
|
|
||||||
title: '500',
|
|
||||||
desc: '抱歉,服务器出错了'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default types
|
|
@ -1,30 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div :class="prefixCls">
|
|
||||||
<div style="float: left">
|
|
||||||
<slot name="extra">{{ extra }}</slot>
|
|
||||||
</div>
|
|
||||||
<div style="float: right">
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'FooterToolBar',
|
|
||||||
props: {
|
|
||||||
prefixCls: {
|
|
||||||
type: String,
|
|
||||||
default: 'ant-pro-footer-toolbar'
|
|
||||||
},
|
|
||||||
extra: {
|
|
||||||
type: [String, Object],
|
|
||||||
default: ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,4 +0,0 @@
|
|||||||
import FooterToolBar from './FooterToolBar'
|
|
||||||
import './index.less'
|
|
||||||
|
|
||||||
export default FooterToolBar
|
|
@ -1,23 +0,0 @@
|
|||||||
@import "../index";
|
|
||||||
|
|
||||||
@footer-toolbar-prefix-cls: ~"@{ant-pro-prefix}-footer-toolbar";
|
|
||||||
|
|
||||||
.@{footer-toolbar-prefix-cls} {
|
|
||||||
position: fixed;
|
|
||||||
width: 100%;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 56px;
|
|
||||||
line-height: 56px;
|
|
||||||
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03);
|
|
||||||
background: #fff;
|
|
||||||
border-top: 1px solid #e8e8e8;
|
|
||||||
padding: 0 24px;
|
|
||||||
z-index: 9;
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
# FooterToolbar 底部工具栏
|
|
||||||
|
|
||||||
固定在底部的工具栏。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 何时使用
|
|
||||||
|
|
||||||
固定在内容区域的底部,不随滚动条移动,常用于长页面的数据搜集和提交工作。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
引用方式:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
import FooterToolBar from '@/components/FooterToolbar'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
FooterToolBar
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 代码演示
|
|
||||||
|
|
||||||
```html
|
|
||||||
<footer-tool-bar>
|
|
||||||
<a-button type="primary" @click="validate" :loading="loading">提交</a-button>
|
|
||||||
</footer-tool-bar>
|
|
||||||
```
|
|
||||||
或
|
|
||||||
```html
|
|
||||||
<footer-tool-bar extra="扩展信息提示">
|
|
||||||
<a-button type="primary" @click="validate" :loading="loading">提交</a-button>
|
|
||||||
</footer-tool-bar>
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
参数 | 说明 | 类型 | 默认值
|
|
||||||
----|------|-----|------
|
|
||||||
children (slot) | 工具栏内容,向右对齐 | - | -
|
|
||||||
extra | 额外信息,向左对齐 | String, Object | -
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="footer">
|
|
||||||
<div class="links">
|
|
||||||
<a
|
|
||||||
href="https://pro.loacg.com/"
|
|
||||||
target="_blank"
|
|
||||||
>Pro 首页</a>
|
|
||||||
<a
|
|
||||||
href="https://github.com/sendya/ant-design-pro-vue"
|
|
||||||
target="_blank"
|
|
||||||
>
|
|
||||||
<a-icon type="github" />
|
|
||||||
</a>
|
|
||||||
<a href="https://ant.design/">Ant Design</a>
|
|
||||||
<a href="https://vue.ant.design/">Vue Antd</a>
|
|
||||||
</div>
|
|
||||||
<div class="copyright">
|
|
||||||
Copyright
|
|
||||||
<a-icon type="copyright" /> 2018 <span>白鹭学园技术组出品</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'GlobalFooter',
|
|
||||||
data () {
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.footer {
|
|
||||||
padding: 0 16px;
|
|
||||||
margin: 48px 0 24px;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
.links {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: rgba(0, 0, 0, 0.45);
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: rgba(0, 0, 0, 0.65);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
margin-right: 40px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.copyright {
|
|
||||||
color: rgba(0, 0, 0, 0.45);
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,2 +0,0 @@
|
|||||||
import GlobalFooter from './GlobalFooter'
|
|
||||||
export default GlobalFooter
|
|
@ -1,125 +0,0 @@
|
|||||||
<template>
|
|
||||||
<transition name="showHeader">
|
|
||||||
<div v-if="visible" class="header-animat">
|
|
||||||
<a-layout-header
|
|
||||||
v-if="visible"
|
|
||||||
:class="[fixedHeader && 'ant-header-fixedHeader', sidebarOpened ? 'ant-header-side-opened' : 'ant-header-side-closed', ]"
|
|
||||||
:style="{ padding: '0' }">
|
|
||||||
<div v-if="mode === 'sidemenu'" class="header">
|
|
||||||
<a-icon v-if="device==='mobile'" class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle"/>
|
|
||||||
<a-icon v-else class="trigger" :type="collapsed ? 'menu-unfold' : 'menu-fold'" @click="toggle"/>
|
|
||||||
<user-menu></user-menu>
|
|
||||||
</div>
|
|
||||||
<div v-else :class="['top-nav-header-index', theme]">
|
|
||||||
<div class="header-index-wide">
|
|
||||||
<div class="header-index-left">
|
|
||||||
<logo class="top-nav-header" :show-title="device !== 'mobile'"/>
|
|
||||||
<s-menu v-if="device !== 'mobile'" mode="horizontal" :menu="menus" :theme="theme" />
|
|
||||||
<a-icon v-else class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle" />
|
|
||||||
</div>
|
|
||||||
<user-menu class="header-index-right"></user-menu>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a-layout-header>
|
|
||||||
</div>
|
|
||||||
</transition>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import UserMenu from '../tools/UserMenu'
|
|
||||||
import SMenu from '../Menu/'
|
|
||||||
import Logo from '../tools/Logo'
|
|
||||||
import { mixin } from '@/utils/mixin'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'GlobalHeader',
|
|
||||||
components: {
|
|
||||||
UserMenu,
|
|
||||||
SMenu,
|
|
||||||
Logo
|
|
||||||
},
|
|
||||||
mixins: [mixin],
|
|
||||||
props: {
|
|
||||||
mode: {
|
|
||||||
type: String,
|
|
||||||
// sidemenu, topmenu
|
|
||||||
default: 'sidemenu'
|
|
||||||
},
|
|
||||||
menus: {
|
|
||||||
type: Array,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
theme: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default: 'dark'
|
|
||||||
},
|
|
||||||
collapsed: {
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
device: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default: 'desktop'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
visible: true,
|
|
||||||
oldScrollTop: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
document.addEventListener('scroll', this.handleScroll, { passive: true })
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleScroll () {
|
|
||||||
if (!this.autoHideHeader) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const scrollTop = document.body.scrollTop + document.documentElement.scrollTop
|
|
||||||
if (!this.ticking) {
|
|
||||||
this.ticking = true
|
|
||||||
requestAnimationFrame(() => {
|
|
||||||
if (this.oldScrollTop > scrollTop) {
|
|
||||||
this.visible = true
|
|
||||||
} else if (scrollTop > 300 && this.visible) {
|
|
||||||
this.visible = false
|
|
||||||
} else if (scrollTop < 300 && !this.visible) {
|
|
||||||
this.visible = true
|
|
||||||
}
|
|
||||||
this.oldScrollTop = scrollTop
|
|
||||||
this.ticking = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
toggle () {
|
|
||||||
this.$emit('toggle')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
document.body.removeEventListener('scroll', this.handleScroll, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less">
|
|
||||||
@import '../index.less';
|
|
||||||
|
|
||||||
.header-animat{
|
|
||||||
position: relative;
|
|
||||||
z-index: @ant-global-header-zindex;
|
|
||||||
}
|
|
||||||
.showHeader-enter-active {
|
|
||||||
transition: all 0.25s ease;
|
|
||||||
}
|
|
||||||
.showHeader-leave-active {
|
|
||||||
transition: all 0.5s ease;
|
|
||||||
}
|
|
||||||
.showHeader-enter, .showHeader-leave-to {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,2 +0,0 @@
|
|||||||
import GlobalHeader from './GlobalHeader'
|
|
||||||
export default GlobalHeader
|
|