Commit 3f4df8e7 by yuyang

fix: 组件整理

parent 0101b742
......@@ -13,10 +13,17 @@
"deploy:production": "npm run lint && npm run build && node scripts/deploy.js"
},
"dependencies": {
"@fullcalendar/core": "^5.5.1",
"@fullcalendar/daygrid": "^5.5.0",
"@fullcalendar/interaction": "^5.5.0",
"@fullcalendar/resource-timeline": "^5.5.0",
"@fullcalendar/timegrid": "^5.5.1",
"@fullcalendar/vue": "^5.5.0",
"ant-design-vue": "^1.7.4",
"axios": "^0.19.2",
"change-case": "^4.1.1",
"core-js": "^3.6.5",
"fullcalendar": "^5.5.1",
"lodash-es": "^4.17.15",
"moment": "^2.27.0",
"normalize.css": "^8.0.1",
......
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="16px" viewBox="0 0 12 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>bookmark_tag_solid</title>
<g id="控件" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="iconkit/teambition/bookmark_tag_solid#8591A2FF" transform="translate(-4.000000, -2.000000)" fill="#479CC6" fill-rule="nonzero">
<path d="M13.7205,1.9995 C14.8725,1.9995 15.8095,2.9375 15.8095,4.0885 L15.8095,17.4005 C15.8095,17.6025 15.7075,17.7905 15.5395,17.9015 C15.4405,17.9665 15.3245,17.9995 15.2095,17.9995 C15.1295,17.9995 15.0485,17.9845 14.9725,17.9525 L10.0005,15.8205 L5.0275,17.9525 C4.8415,18.0315 4.6285,18.0125 4.4615,17.9015 C4.2925,17.7905 4.1915,17.6025 4.1915,17.4005 L4.1915,4.0885 C4.1915,2.9375 5.1285,1.9995 6.2795,1.9995 L13.7205,1.9995 Z M13.3395,8.6245 C13.3945,8.5715 13.4135,8.4925 13.3905,8.4195 C13.3665,8.3475 13.3035,8.2945 13.2285,8.2835 L11.1215,7.9775 L10.1795,6.0685 C10.1115,5.9315 9.8885,5.9315 9.8205,6.0685 L8.8785,7.9775 L6.7715,8.2835 C6.6955,8.2945 6.6335,8.3475 6.6095,8.4195 C6.5865,8.4925 6.6055,8.5715 6.6605,8.6245 L8.1855,10.1105 L7.8245,12.2095 C7.8125,12.2845 7.8425,12.3605 7.9045,12.4045 C7.9665,12.4495 8.0475,12.4555 8.1155,12.4205 L10.0005,11.4295 L11.8845,12.4205 C11.9135,12.4355 11.9455,12.4435 11.9775,12.4435 C12.0195,12.4435 12.0605,12.4305 12.0955,12.4045 C12.1565,12.3605 12.1875,12.2845 12.1745,12.2095 L11.8155,10.1105 L13.3395,8.6245 Z" id="bookmark_tag_solid"></path>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>icon/file/attachment_32</title>
<desc>Created with Sketch.</desc>
<defs>
<polygon id="path-1" points="0 16 16 16 16 0 0 0"></polygon>
</defs>
<g id="icon/file/attachment_32" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<rect id="boxIcon" fill-opacity="0" fill="#FFFFFF" x="0" y="0" width="32" height="32"></rect>
<g id="icon_file" transform="translate(3.000000, 0.000000)">
<path d="M3,-5.62410556e-16 L17,-3.18699315e-15 L26,9 L26,29 C26,30.6568542 24.6568542,32 23,32 L3,32 C1.34314575,32 2.02906125e-16,30.6568542 0,29 L4.4408921e-16,3 C2.41183085e-16,1.34314575 1.34314575,3.04359188e-16 3,0 Z" id="Rectangle" fill="#58A8EF"></path>
<path d="M17,0 L26,9 L19,9 C17.8954305,9 17,8.1045695 17,7 L17,0 Z" id="Rectangle" fill-opacity="0.23" fill="#000000"></path>
</g>
<g id="icon" transform="translate(16.000000, 18.000000) scale(1, -1) rotate(90.000000) translate(-16.000000, -18.000000) translate(8.000000, 10.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="boxIcon"></g>
<path d="M11.2,3.32000031 C13.0752569,3.32000031 14.6,4.84474336 14.6,6.72000031 C14.6,8.59525726 13.0752569,10.1200003 11.2,10.1200003 L6.2504,10.1200003 C5.08166948,10.1200003 4.1312,9.16898379 4.1312,8.00000031 C4.1312,6.83101682 5.08166948,5.88000031 6.2504,5.88000031 L10.3968,5.88000031 C10.7720569,5.88000031 11.0768,6.18474336 11.0768,6.56000031 C11.0768,6.93583266 10.7722819,7.24000031 10.3968,7.24000031 L6.2504,7.24000031 C5.83195891,7.24000031 5.4912,7.58095539 5.4912,8.00000031 C5.4912,8.41904522 5.83195891,8.76000031 6.2504,8.76000031 L11.2,8.76000031 C12.3247431,8.76000031 13.24,7.84474336 13.24,6.72000031 C13.24,5.59525726 12.3247431,4.68000031 11.2,4.68000031 L6.08,4.68000031 C4.24965695,4.68000031 2.76,6.16965726 2.76,8.00000031 C2.76,9.83034336 4.24965695,11.3200003 6.08,11.3200003 L10.3968,11.3200003 C10.7720569,11.3200003 11.0768,11.6247434 11.0768,12.0000003 C11.0768,12.3752573 10.7720569,12.6800003 10.3968,12.6800003 L6.08,12.6800003 C3.49914305,12.6800003 1.4,10.5808573 1.4,8.00000031 C1.4,5.41914336 3.49914305,3.32000031 6.08,3.32000031 L11.2,3.32000031 Z" id="fill" fill-opacity="0.850000024" fill="#FFFFFF" fill-rule="nonzero" mask="url(#mask-2)"></path>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>icon/file/sound_32</title>
<desc>Created with Sketch.</desc>
<g id="icon/file/sound_32" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<rect id="boxIcon" fill-opacity="0" fill="#FFFFFF" x="0" y="0" width="32" height="32"></rect>
<g id="icon_file" transform="translate(3.000000, 0.000000)">
<path d="M3,-5.62410556e-16 L17,-3.18699315e-15 L26,9 L26,29 C26,30.6568542 24.6568542,32 23,32 L3,32 C1.34314575,32 2.02906125e-16,30.6568542 0,29 L4.4408921e-16,3 C2.41183085e-16,1.34314575 1.34314575,3.04359188e-16 3,0 Z" id="Rectangle" fill="#58A8EF"></path>
<path d="M17,0 L26,9 L19,9 C17.8954305,9 17,8.1045695 17,7 L17,0 Z" id="Rectangle" fill-opacity="0.23" fill="#383838"></path>
</g>
<path d="M14.2311319,13.8020434 L19.7311319,12.3353767 C20.2647687,12.1930736 20.8127263,12.5103122 20.9550295,13.043949 C20.9774437,13.1280023 20.9887945,13.2146211 20.9887945,13.3016116 L20.9887945,22 C20.9910812,22.1320812 20.9910812,22.2260384 20.9887945,22.2818717 C20.9534808,23.1441264 20.1056169,23.9212003 18.9823475,24.0790655 C17.7518001,24.2520077 16.6452019,23.6163283 16.5106914,22.6592359 C16.3761808,21.7021435 17.2646942,20.7860694 18.4952416,20.6131273 C18.8426691,20.5642995 19.1802161,20.5799298 19.4887945,20.649053 L19.4887945,15.4 L14.9887945,16.6 L14.9887945,23.2692479 C14.9888355,23.4655209 14.9888355,23.5639485 14.9887945,23.5645309 C14.9283,24.4243812 13.973516,25.2093041 12.7313557,25.3838783 C11.3640808,25.5760363 10.1466432,24.9559344 10.0121326,23.9988419 C9.87762205,23.0417495 10.876975,22.110098 12.2442499,21.9179401 C12.6851012,21.8559825 13.1103753,21.8784686 13.4887945,21.9694674 L13.4887945,14.7682783 C13.4887945,14.3152276 13.7933785,13.9187776 14.2311319,13.8020434 Z" id="Combined-Shape" fill-opacity="0.89" fill="#FFFFFF"></path>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="84px" height="43px" viewBox="0 0 84 43" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>icons</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="88" height="48"></rect>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="uploadbox/image/.normal/drag" transform="translate(-105.000000, -50.000000)">
<g id="instruction" transform="translate(70.000000, 50.000000)">
<g id="icons" transform="translate(34.000000, 0.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="icon_scale" fill-opacity="0" fill="#FFFFFF" xlink:href="#path-1"></use>
<g id="icon_file_picture_right" mask="url(#mask-2)">
<g transform="translate(68.970039, 22.763057) rotate(20.000000) translate(-68.970039, -22.763057) translate(54.970039, 5.763057)">
<path d="M4,0 L18.41,0 L28,9.59 L28,30 C28,32.21 26.21,34 24,34 L4,34 C1.79,34 0,32.21 0,30 L0,4 C0,1.79 1.79,0 4,0 Z" id="Rectangle-5" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M18.41,0 L4,0 C1.79,0 0,1.79 0,4 L0,30 C0,32.21 1.79,34 4,34 L24,34 C26.21,34 28,32.21 28,30 L28,9.59 L18.41,0 Z M19,2 L26,9 L20,9 C19.45,9 19,8.55 19,8 L19,2 Z M27,30 C27,31.66 25.66,33 24,33 L4,33 C2.34,33 1,31.66 1,30 L1,4 C1,2.34 2.34,1 4,1 L18,1 L18,8 C18,9.1 18.9,10 20,10 L27,10 L27,30 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
<path d="M11.89,19.93 C11.97,19.86 12.09,19.87 12.17,19.95 L13.78,21.7 L17.62,18.03 C17.7,17.95 17.83,17.96 17.9,18.04 C17.9,18.04 17.9,18.04 17.9,18.04 L20.5,20.78 L20.5,14 C20.5,13.45 20.05,13 19.5,13 L8.5,13 C7.95,13 7.5,13.45 7.5,14 L7.5,23.65 L11.89,19.93 Z M10.5,16 C11.05,16 11.5,16.45 11.5,17 C11.5,17.55 11.05,18 10.5,18 C9.95,18 9.5,17.55 9.5,17 C9.5,16.45 9.95,16 10.5,16 Z" id="Shape" fill="#F9F3EB" fill-rule="nonzero"></path>
<g id="Group" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(7.000000, 12.000000)">
<path d="M3.5,3.5 C2.67,3.5 2,4.17 2,5 C2,5.83 2.67,6.5 3.5,6.5 C4.33,6.5 5,5.83 5,5 C5,4.17 4.33,3.5 3.5,3.5 Z M3.5,5.5 C3.22,5.5 3,5.28 3,5 C3,4.72 3.22,4.5 3.5,4.5 C3.78,4.5 4,4.72 4,5 C4,5.28 3.78,5.5 3.5,5.5 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
<path d="M12.5,0.5 L1.5,0.5 C0.67,0.5 0,1.17 0,2 L0,13 L0,13 C0,13.83 0.67,14.5 1.5,14.5 L12.5,14.5 C13.33,14.5 14,13.83 14,13 L14,13 L14,2 C14,1.17 13.33,0.5 12.5,0.5 Z M13,13 C13,13.28 12.78,13.5 12.5,13.5 L1.5,13.5 C1.22,13.5 1,13.28 1,13 L1,12.53 L4.95,9.19 L6.59,10.98 C6.59,10.98 6.59,10.98 6.59,10.98 C6.67,11.06 6.79,11.06 6.87,10.99 L10.72,7.31 L13,9.7 L13,13 Z M10.9,6.03 C10.9,6.03 10.9,6.03 10.9,6.03 C10.82,5.95 10.7,5.95 10.62,6.02 L6.78,9.69 L5.17,7.94 C5.1,7.86 4.98,7.85 4.89,7.92 L1,11.22 L1,2 C1,1.72 1.22,1.5 1.5,1.5 L12.5,1.5 C12.78,1.5 13,1.72 13,2 L13,8.24 L10.9,6.03 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
</g>
</g>
</g>
<g id="icon_file_picture_left" mask="url(#mask-2)">
<g transform="translate(18.970039, 22.763057) rotate(-20.000000) translate(-18.970039, -22.763057) translate(4.970039, 5.763057)">
<path d="M4,0 L18.41,0 L28,9.59 L28,30 C28,32.21 26.21,34 24,34 L4,34 C1.79,34 0,32.21 0,30 L0,4 C0,1.79 1.79,0 4,0 Z" id="Rectangle-5" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M18.41,0 L4,0 C1.79,0 0,1.79 0,4 L0,30 C0,32.21 1.79,34 4,34 L24,34 C26.21,34 28,32.21 28,30 L28,9.59 L18.41,0 Z M19,2 L26,9 L20,9 C19.45,9 19,8.55 19,8 L19,2 Z M27,30 C27,31.66 25.66,33 24,33 L4,33 C2.34,33 1,31.66 1,30 L1,4 C1,2.34 2.34,1 4,1 L18,1 L18,8 C18,9.1 18.9,10 20,10 L27,10 L27,30 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
<path d="M11.89,19.93 C11.97,19.86 12.09,19.87 12.17,19.95 L13.78,21.7 L17.62,18.03 C17.7,17.95 17.83,17.96 17.9,18.04 C17.9,18.04 17.9,18.04 17.9,18.04 L20.5,20.78 L20.5,14 C20.5,13.45 20.05,13 19.5,13 L8.5,13 C7.95,13 7.5,13.45 7.5,14 L7.5,23.65 L11.89,19.93 Z M10.5,16 C11.05,16 11.5,16.45 11.5,17 C11.5,17.55 11.05,18 10.5,18 C9.95,18 9.5,17.55 9.5,17 C9.5,16.45 9.95,16 10.5,16 Z" id="Shape" fill="#F9F3EB" fill-rule="nonzero"></path>
<g id="Group" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(7.000000, 12.000000)">
<path d="M3.5,3.5 C2.67,3.5 2,4.17 2,5 C2,5.83 2.67,6.5 3.5,6.5 C4.33,6.5 5,5.83 5,5 C5,4.17 4.33,3.5 3.5,3.5 Z M3.5,5.5 C3.22,5.5 3,5.28 3,5 C3,4.72 3.22,4.5 3.5,4.5 C3.78,4.5 4,4.72 4,5 C4,5.28 3.78,5.5 3.5,5.5 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
<path d="M12.5,0.5 L1.5,0.5 C0.67,0.5 0,1.17 0,2 L0,13 L0,13 C0,13.83 0.67,14.5 1.5,14.5 L12.5,14.5 C13.33,14.5 14,13.83 14,13 L14,13 L14,2 C14,1.17 13.33,0.5 12.5,0.5 Z M13,13 C13,13.28 12.78,13.5 12.5,13.5 L1.5,13.5 C1.22,13.5 1,13.28 1,13 L1,12.53 L4.95,9.19 L6.59,10.98 C6.59,10.98 6.59,10.98 6.59,10.98 C6.67,11.06 6.79,11.06 6.87,10.99 L10.72,7.31 L13,9.7 L13,13 Z M10.9,6.03 C10.9,6.03 10.9,6.03 10.9,6.03 C10.82,5.95 10.7,5.95 10.62,6.02 L6.78,9.69 L5.17,7.94 C5.1,7.86 4.98,7.85 4.89,7.92 L1,11.22 L1,2 C1,1.72 1.22,1.5 1.5,1.5 L12.5,1.5 C12.78,1.5 13,1.72 13,2 L13,8.24 L10.9,6.03 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
</g>
</g>
</g>
<g id="icon_file_picture" mask="url(#mask-2)">
<g transform="translate(30.000000, 0.000000)">
<path d="M4,0 L18.41,0 L28,9.59 L28,30 C28,32.21 26.21,34 24,34 L4,34 C1.79,34 0,32.21 0,30 L0,4 C0,1.79 1.79,0 4,0 Z" id="Rectangle-5" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M18.41,0 L4,0 C1.79,0 0,1.79 0,4 L0,30 C0,32.21 1.79,34 4,34 L24,34 C26.21,34 28,32.21 28,30 L28,9.59 L18.41,0 Z M19,2 L26,9 L20,9 C19.45,9 19,8.55 19,8 L19,2 Z M27,30 C27,31.66 25.66,33 24,33 L4,33 C2.34,33 1,31.66 1,30 L1,4 C1,2.34 2.34,1 4,1 L18,1 L18,8 C18,9.1 18.9,10 20,10 L27,10 L27,30 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
<path d="M11.89,19.93 C11.97,19.86 12.09,19.87 12.17,19.95 L13.78,21.7 L17.62,18.03 C17.7,17.95 17.83,17.96 17.9,18.04 C17.9,18.04 17.9,18.04 17.9,18.04 L20.5,20.78 L20.5,14 C20.5,13.45 20.05,13 19.5,13 L8.5,13 C7.95,13 7.5,13.45 7.5,14 L7.5,23.65 L11.89,19.93 Z M10.5,16 C11.05,16 11.5,16.45 11.5,17 C11.5,17.55 11.05,18 10.5,18 C9.95,18 9.5,17.55 9.5,17 C9.5,16.45 9.95,16 10.5,16 Z" id="Shape" fill="#F9F3EB" fill-rule="nonzero"></path>
<g id="Group" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(7.000000, 12.000000)">
<path d="M3.5,3.5 C2.67,3.5 2,4.17 2,5 C2,5.83 2.67,6.5 3.5,6.5 C4.33,6.5 5,5.83 5,5 C5,4.17 4.33,3.5 3.5,3.5 Z M3.5,5.5 C3.22,5.5 3,5.28 3,5 C3,4.72 3.22,4.5 3.5,4.5 C3.78,4.5 4,4.72 4,5 C4,5.28 3.78,5.5 3.5,5.5 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
<path d="M12.5,0.5 L1.5,0.5 C0.67,0.5 0,1.17 0,2 L0,13 L0,13 C0,13.83 0.67,14.5 1.5,14.5 L12.5,14.5 C13.33,14.5 14,13.83 14,13 L14,13 L14,2 C14,1.17 13.33,0.5 12.5,0.5 Z M13,13 C13,13.28 12.78,13.5 12.5,13.5 L1.5,13.5 C1.22,13.5 1,13.28 1,13 L1,12.53 L4.95,9.19 L6.59,10.98 C6.59,10.98 6.59,10.98 6.59,10.98 C6.67,11.06 6.79,11.06 6.87,10.99 L10.72,7.31 L13,9.7 L13,13 Z M10.9,6.03 C10.9,6.03 10.9,6.03 10.9,6.03 C10.82,5.95 10.7,5.95 10.62,6.02 L6.78,9.69 L5.17,7.94 C5.1,7.86 4.98,7.85 4.89,7.92 L1,11.22 L1,2 C1,1.72 1.22,1.5 1.5,1.5 L12.5,1.5 C12.78,1.5 13,1.72 13,2 L13,8.24 L10.9,6.03 Z" id="Shape" fill="#D3AB78" fill-rule="nonzero"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>icon/file/video_32</title>
<desc>Created with Sketch.</desc>
<g id="icon/file/video_32" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<rect id="boxIcon" fill-opacity="0" fill="#FFFFFF" x="0" y="0" width="32" height="32"></rect>
<g id="icon_file" transform="translate(3.000000, 0.000000)">
<path d="M3,-5.62410556e-16 L17,-3.18699315e-15 L26,9 L26,29 C26,30.6568542 24.6568542,32 23,32 L3,32 C1.34314575,32 2.02906125e-16,30.6568542 0,29 L4.4408921e-16,3 C2.41183085e-16,1.34314575 1.34314575,3.04359188e-16 3,0 Z" id="Rectangle" fill="#58A8EF"></path>
<path d="M17,0 L26,9 L19,9 C17.8954305,9 17,8.1045695 17,7 L17,0 Z" id="Rectangle" fill-opacity="0.23" fill="#383838"></path>
</g>
<path d="M19.1757359,15.5742641 L21.9757359,12.7742641 C22.2100505,12.5399495 22.5899495,12.5399495 22.8242641,12.7742641 C22.9367859,12.8867859 23,13.0393982 23,13.1985281 L23,23.8014719 C23,24.1328427 22.7313708,24.4014719 22.4,24.4014719 C22.2408701,24.4014719 22.0882578,24.3382578 21.9757359,24.2257359 L19.1757359,21.4257359 C19.0632141,21.3132141 19,21.1606018 19,21.0014719 L19,15.9985281 C19,15.8393982 19.0632141,15.6867859 19.1757359,15.5742641 Z M10,13.5 L16.8000002,13.5 C17.3522849,13.5 17.8000002,13.9477153 17.8000002,14.5 L17.8000002,22.5 C17.8000002,23.0522847 17.3522849,23.5 16.8000002,23.5 L10,23.5 C9.44771525,23.5 9,23.0522847 9,22.5 L9,14.5 C9,13.9477153 9.44771525,13.5 10,13.5 Z" id="Combined-Shape" fill-opacity="0.850000024" fill="#FFFFFF"></path>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
<title>icon/matrix/tertiary</title>
<desc>Created with Sketch.</desc>
<g id="icon/matrix/tertiary" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M5,6.5 C4.17157288,6.5 3.5,5.82842712 3.5,5 C3.5,4.17157288 4.17157288,3.5 5,3.5 C5.82842712,3.5 6.5,4.17157288 6.5,5 C6.5,5.82842712 5.82842712,6.5 5,6.5 Z M10,6.5 C9.17157288,6.5 8.5,5.82842712 8.5,5 C8.5,4.17157288 9.17157288,3.5 10,3.5 C10.8284271,3.5 11.5,4.17157288 11.5,5 C11.5,5.82842712 10.8284271,6.5 10,6.5 Z M15,6.5 C14.1715729,6.5 13.5,5.82842712 13.5,5 C13.5,4.17157288 14.1715729,3.5 15,3.5 C15.8284271,3.5 16.5,4.17157288 16.5,5 C16.5,5.82842712 15.8284271,6.5 15,6.5 Z M5,16.5 C4.17157288,16.5 3.5,15.8284271 3.5,15 C3.5,14.1715729 4.17157288,13.5 5,13.5 C5.82842712,13.5 6.5,14.1715729 6.5,15 C6.5,15.8284271 5.82842712,16.5 5,16.5 Z M10,16.5 C9.17157288,16.5 8.5,15.8284271 8.5,15 C8.5,14.1715729 9.17157288,13.5 10,13.5 C10.8284271,13.5 11.5,14.1715729 11.5,15 C11.5,15.8284271 10.8284271,16.5 10,16.5 Z M15,16.5 C14.1715729,16.5 13.5,15.8284271 13.5,15 C13.5,14.1715729 14.1715729,13.5 15,13.5 C15.8284271,13.5 16.5,14.1715729 16.5,15 C16.5,15.8284271 15.8284271,16.5 15,16.5 Z M5,11.5 C4.17157288,11.5 3.5,10.8284271 3.5,10 C3.5,9.17157288 4.17157288,8.5 5,8.5 C5.82842712,8.5 6.5,9.17157288 6.5,10 C6.5,10.8284271 5.82842712,11.5 5,11.5 Z M10,11.5 C9.17157288,11.5 8.5,10.8284271 8.5,10 C8.5,9.17157288 9.17157288,8.5 10,8.5 C10.8284271,8.5 11.5,9.17157288 11.5,10 C11.5,10.8284271 10.8284271,11.5 10,11.5 Z M15,11.5 C14.1715729,11.5 13.5,10.8284271 13.5,10 C13.5,9.17157288 14.1715729,8.5 15,8.5 C15.8284271,8.5 16.5,9.17157288 16.5,10 C16.5,10.8284271 15.8284271,11.5 15,11.5 Z" id="Combined-Shape" fill="#A6A6A6" fill-rule="nonzero"></path>
</g>
</svg>
<script lang="ts">
import { Component, Vue, Prop, Watch } from 'vue-property-decorator';
import audio from '@/assets/icons/file/sound_32.svg';
import video from '@/assets/icons/file/video_32.svg';
import attachment from '@/assets/icons/file/attachment_32.svg';
@Component({
components: {},
})
export default class ComFileItem extends Vue {
fileName = '';
contentType = '';
path: any = attachment;
iconPath: IObject = {
audio,
video,
attachment,
};
typeMap: IObject = {
image: ['gif', 'jpg', 'jpeg', 'png', 'bmp', 'webp', 'svg'],
video: ['mp4', 'm3u8', 'rmvb', 'avi', 'swf', '3gp', 'mkv', 'flv'],
audio: ['mp3', 'wav', 'wma', 'ogg', 'aac', 'flac'],
};
@Prop({ type: String }) url!: string;
@Watch('url', { immediate: true })
onUrlChange() {
this.handleUrl();
}
handleUrl() {
this.fileName = this.getFileName();
const subfix = this.fileName.split('.')[1];
if (this.typeMap.image.includes(subfix)) {
this.path = this.url;
} else if (this.typeMap.video.includes(subfix)) {
this.path = this.iconPath.video;
} else if (this.typeMap.audio.includes(subfix)) {
this.path = this.iconPath.audio;
} else {
this.path = this.iconPath.attachment;
}
}
getFileName() {
const temp = this.url ? this.url.split('?')[0].split('/') : ['图片'];
return decodeURIComponent(temp[temp.length - 1]);
}
showFile() {
window.open(this.url, '_blank');
}
}
</script>
<template lang="pug">
.file-item.hover-border(@click="showFile")
img.file-icon(:src="path" height="32" width="32")
.name {{ fileName }}
</template>
<style lang="stylus" scoped>
.file-item
position relative
display block
overflow hidden
padding 6px
max-width 100%
border-radius 4px
text-overflow ellipsis
white-space nowrap
cursor pointer
.file-icon
display inline-block
vertical-align middle
object-fit cover
.name
display inline-block
overflow hidden
margin-left 8px
height 32px
color #383838
vertical-align middle
text-overflow ellipsis
font-size 14px
line-height 32px
</style>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
import FullCalendar, { CalendarOptions, EventApi, DateSelectArg, EventClickArg, EventInput } from '@fullcalendar/vue';
import dayGridPlugin from '@fullcalendar/daygrid';
import timeGridPlugin from '@fullcalendar/timegrid';
import interactionPlugin from '@fullcalendar/interaction';
import { INITIAL_EVENTS, createEventId } from './fullcalendar-event-utils';
import zhLocale from '@fullcalendar/core/locales/zh-cn'; // 中文语言包
import resourceTimelinePlugin from '@fullcalendar/resource-timeline';
import { IActivity } from '@/models/access/activity';
@Component({
components: {
FullCalendar,
},
})
export default class ComFullCalendarComponent extends Vue {
@Prop({ type: Object, default: {} }) private data!: EventInput[];
@Prop({
type: Object,
default: () => {
return {};
},
})
private store!: IObject;
private activities: Array<IActivity> = [];
calendarOptions: CalendarOptions = {
plugins: [
dayGridPlugin,
timeGridPlugin,
interactionPlugin, // 日期点击
resourceTimelinePlugin, // 资源时间线
],
headerToolbar: {
left: 'today prev,next',
center: 'title',
right: '',
},
buttonText: {
prev: '‹',
next: '›',
prevYear: '«',
nextYear: '»',
today: '今天',
month: '月',
week: '星期',
day: '天',
},
locale: zhLocale,
initialView: 'dayGridMonth',
initialEvents: INITIAL_EVENTS, // alternatively, use the `events` setting to fetch from a feed
editable: false,
selectable: false,
selectMirror: true,
dayMaxEvents: true,
weekends: true,
select: this.handleDateSelect,
eventClick: this.handleEventClick,
eventsSet: this.handleEvents,
/* you can update a remote database when these fire:
eventAdd:
eventChange:
eventRemove:
*/
};
mounted() {
// this.getActive();
}
private async getActive(): Promise<void> {
this.store.init();
const { data } = await this.store.index();
this.activities = data.activities;
}
private currentEvents: EventApi[] = [];
get fullcalendarOptions() {
return Object.assign(this.calendarOptions, this.data);
}
private handleDateSelect(selectInfo: DateSelectArg) {
const title = prompt('请为你的事件输入一个新的标题');
const calendarApi = selectInfo.view.calendar;
calendarApi.unselect(); // clear date selection
if (title) {
calendarApi.addEvent({
id: createEventId(),
title,
start: selectInfo.startStr,
end: selectInfo.endStr,
allDay: selectInfo.allDay,
});
}
}
handleEventClick(clickInfo: EventClickArg) {
if (confirm(`你确定要删除吗? '${clickInfo.event.title}'`)) {
clickInfo.event.remove();
}
}
handleEvents(events: EventApi[]) {
this.currentEvents = events;
}
}
</script>
<template lang="pug">
FullCalendar(:options='fullcalendarOptions')
template(v-slot:eventContent='arg')
b {{ arg.timeText }}
i {{ arg.event.title }}
</template>
<style lang="stylus">
b
/* used for event dates/times */
margin-right 3px
</style>
......@@ -9,6 +9,33 @@ export default class ComGlobal extends Vue {
state = '';
number = 8;
value = '';
arrNumber = [1, 2, 3];
arrStr = ['a', 'b', 'c'];
arrObj = [
{ value: 'A', label: 'a' },
{ value: 'B', label: 'b' },
{ value: 'C', label: 'c' },
];
ComMainModalVisible = false;
ComPopoverVisible = false;
comLogCellAudit = {
icon: 'check-circle',
username: '张三',
role: '会员',
type: 'update',
auditable_type: 'Department',
created_at: '2020-01-02',
};
comMenuListArr = [
{
icon: 'check-circle',
path: 'activeColor',
label: 'label',
tag: { text: '标题', type: 'success' },
slot: 'name',
},
];
}
</script>
......@@ -38,16 +65,131 @@ export default class ComGlobal extends Vue {
ComGlobalTable(name="ComFileInput")
ComFileInput(
accept="副标题",
:multiple="false",
:disabled="false",
:loading="false",
)
ComFileInput(
accept="副标题",
:multiple="true",
:disabled="true",
:loading="true",
)
ComFileInput(
accept="副标题",
:multiple="false",
:disabled="false",
:loading="false",
ComGlobalTable(name="ComFileItem")
ComFileItem(
url='文件地址'
)
//- ComGlobalTable(name="ComFullCalendarComponent")
//- ComFullCalendarComponent(
//- )
ComGlobalTable(name="ComIconCell")
ComIconCell(
icon='check-circle'
label='名称'
value='value'
:required='false'
:valueSlot="true"
)
ComGlobalTable(name="ComIconTooltip")
ComIconTooltip(
icon='check-circle'
tips='名称'
theme='outlined'
type='false'
:disabled="false"
)
.solt(name="title") 标题
ComGlobalTable(name="ComKvCell")
ComKvCell(
icon='check-circle'
name='名称'
size='small'
nameWidth="1111"
)
.solt(name="title") 标题
ComKvCell(
icon='check-circle'
name='名称'
value='跳转链接'
to='www.baidu.com'
size='small'
nameWidth="1111"
)
ComGlobalTable(name="ComListView")
ComListView(
:data="[{name:'张三'},{name:'李四'}]"
:store="{name:'12'}"
:totalPages="2"
:localPageSize="1"
:currentPage="1"
:totalCount="1"
:loading="false"
:showSizeChanger="false"
:hideOnSinglePage="false"
)
div(slot-scope="scope") {{scope.record}}
ComGlobalTable(name="Loading")
Loading(:loading="true")
Loading(:loading="true", tip="正在加载")
ComGlobalTable(name="ComLogCell")
ComLogCell(:audit="comLogCellAudit"
)
ComGlobalTable(name="ComMainModal")
ComMainModal(
v-model="ComMainModalVisible"
title="标题",
:maskClosable="true"
:closable="true"
:destroyOnClose="true"
)
.slot(slot="title") title
.slot 内容
.slot(slot="right") right
.slot(slot="footer") footer
a-button(type="primary" @click="ComMainModalVisible=true") 点击查看弹窗组件
ComGlobalTable(name="ComMenuList")
ComMenuList(
activeKey='activeColor'
:menus="comMenuListArr"
)
.slot(slot="name") 插槽
ComGlobalTable(name="ComMenuSelect")
ComMenuSelect(
v-model="value"
:options="arrObj"
)
ComGlobalTable.height_100(name="ComNoScrollBarContainer")
ComNoScrollBarContainer.div
.slot 溢出隐藏不能滚动组件
ComGlobalTable(name="ComPanel")
ComPanel(
title="标题",
:bordered="true"
:center="true"
:fullHeadLine="true"
)
.header(slot="header") header
.actions(slot="actions") actions
.main main
.footer(slot="footer") footer
ComGlobalTable(name="ComPopover")
ComPopover(
v-model="ComPopoverVisible"
title="标题",
desc="desc"
)
.main(slot="main") main
.footer(slot="footer") footer
div 点击有气泡
</template>
<style lang="stylus" scoped></style>
<style lang="stylus" scoped>
.div
width 50%
margin 0 auto
border 1px solid #4e4e4e
.height_100
text-align center
height 100px !important
</style>
......@@ -19,18 +19,25 @@ export default class ComGlobalTable extends Vue {
<style lang="stylus" scoped>
.table
display flex
align-items center
border-bottom 1px solid #e3e3e3
line-height 40px
display flex
align-items center
border-bottom 1px solid #e3e3e3
line-height 40px
width 100%
height 100%
.name
text-align center
width 200px
.components
width 100%
height 100%
display flex
align-items center
justify-content center
flex-direction column
width 100px
flex 1
border-left 1px solid #e3e3e3
.components>*
margin 5px 0
</style>
<template lang="pug">
.cell-box
.key(:style="{ minWidth: labelWidth + 'px' }")
label.text-danger(v-if="required") *
a-icon(:type="icon")
span {{ label }}
.value
slot(name="scope")
span(v-if="leftUnit") {{ leftUnit }}
span {{ value }}
span(v-if="rightUnit") {{ rightUnit }}
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch, Emit } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComIconCell extends Vue {
@Prop({ type: String, default: '' }) private icon!: string;
@Prop({ type: String, default: '' }) private label!: string;
@Prop({ type: [String, Number], default: '' }) private value!: string;
@Prop({ type: String, default: '' }) private leftUnit!: string;
@Prop({ type: String, default: '' }) private rightUnit!: string;
@Prop({ type: Boolean, default: false }) private required!: boolean;
@Prop({ type: Number, default: 152 }) private labelWidth!: number;
@Prop({ type: Boolean, default: false }) private valueSlot!: boolean;
}
</script>
<style lang="stylus" scoped>
.cell-box
display flex
align-items center
padding 12px 0px
line-height 20px
.key
height 20px
label
padding 0px 1px
vertical-align middle
span
margin-left 12px
color #808080
vertical-align middle
font-size 14
.value
display flex
flex-wrap wrap
align-items center
width 100%
</style>
<template lang="pug">
a-tooltip
template(slot='title' v-if="tips") {{ tips }}
slot(name="custom")
a-button.icon-button(:type="type" :disabled="disabled" @click.stop="onClick")
a-icon.icon(:type="icon" :theme="theme" style="font-size: 16px;")
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch, Emit } from 'vue-property-decorator';
@Component
export default class ComIconTooltip extends Vue {
@Prop({ type: String, default: 'copy' }) private icon!: string;
@Prop({ type: String, default: '' }) private tips!: string;
@Prop({ type: String, default: 'outlined' }) private theme!: string; // outlined, filled, twoTone
@Prop({ type: String, default: 'default' }) private type!: string;
@Prop({ type: Boolean, default: false }) private disabled!: boolean;
public onClick(...args: any) {
this.$emit('click', ...args);
}
}
</script>
<style lang="stylus" scoped>
.icon-button
display inline-flex
justify-content center
align-items center
overflow hidden
margin-left 20px
padding 0px
height unset
border none
background none
color #A6A6A6
vertical-align -2px
vertical-align sub
font-size 16px
line-height 16px
&:first-child
margin-left 0
&:hover
background none
color #3DA8F5
</style>
<template lang="pug">
.kv-cell(:class="`size-${size}`")
.key(:style="`width: ${nameWidth}`")
a-icon.icon(:type="icon" v-if="icon")
slot(name="name")
span {{ name }}
.value
slot
span(v-if="value") {{ value }}
a.link(:href="to" target="_blank" v-if="to")
| {{ to }}
</template>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComKvCell extends Vue {
@Prop({ type: String, default: '' }) name!: string;
@Prop({ type: String, default: '' }) icon!: string;
@Prop() value!: any;
@Prop({ type: String }) to!: any;
@Prop({ type: String, default: 'default' }) size!: any;
@Prop({ type: String, default: '' }) nameWidth!: string;
}
</script>
<style lang="stylus" scoped>
.kv-cell
display flex
margin 10px 0px
font-size 14px
line-height 22px
font-weight 400
align-items flex-start
.key
color rgba(128,128,128,1)
width 96px
flex-shrink 0
padding-right 12px
display flex
align-items center
.icon
margin-right 4px
font-size 16px
.value
color rgba(56,56,56,1)
.link
color rgba(56,56,56,1)
&:hover
color #3DA8F5
.size-small
margin 6px 0
.key
width 68px
</style>
<template lang="pug">
a-skeleton(:loading="tableLoading" active)
.list-view-component
Empty(v-if="records.length === 0" :desc="emptyText")
slot(v-for="(record, index) in records" :record="record" :index="index")
.list-view__pagination(v-if="total > 0")
a-pagination(
v-bind="pagination"
@showSizeChange="onPaginationChange"
@change="onPaginationChange")
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch, Emit } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComListView extends Vue {
// props
@Prop({ type: Array }) private data!: IObject[];
@Prop({ type: Object, default: () => ({}) }) private store!: any;
@Prop({ type: Number, default: 1 }) private totalPages!: number;
@Prop({ type: Number, default: 0 }) private totalCount!: number;
@Prop({ type: Number, default: 1 }) private currentPage!: number;
@Prop({ type: Number, default: 10 }) private perPage!: number;
@Prop({ type: String, default: '暂无数据' }) private emptyText!: string;
@Prop({ type: Boolean, default: null }) private loading!: boolean;
@Prop({ type: Boolean, default: true }) private showSizeChanger!: boolean;
@Prop({ type: String, default: 'middle' }) private paginationSize!: string;
@Prop({ type: Boolean, default: false }) private hideOnSinglePage?: boolean;
// data
private localPageSize: number | null = null;
private sorter: IObject = {};
get records() {
return this.data || this.store.records || [];
}
// pagination
get current() {
return this.store.currentPage || this.currentPage;
}
get pageSize() {
return this.localPageSize || this.store.perPage || this.perPage;
}
get total() {
return this.store.totalCount || this.totalCount;
}
get pages() {
return this.store.totalPages || this.totalPages;
}
get pagination() {
const totalPages: number = this.store.totalPages || this.totalPages;
return {
total: this.total,
pageSize: this.pageSize,
current: this.current,
hideOnSinglePage: this.hideOnSinglePage,
showSizeChanger: this.showSizeChanger,
showQuickJumper: totalPages > 1,
size: this.paginationSize,
};
}
get tableLoading() {
return typeof this.loading === 'boolean' ? this.loading : this.store.loading;
}
onPaginationChange(page: number, pageSize: number): void {
this.$emit('change', page, pageSize);
}
}
</script>
<style lang="stylus">
.list-view-component
padding 12px 0
min-height 100px
.list-view__pagination
margin-top 12px
text-align right
</style>
<template lang="pug">
.log-item
.info-box
.logo
a-icon(:type="formatIcon(audit.icon)")
span.desc {{audit.role}} {{audit.username}} {{formatType(audit.type)}}
span.title {{audit.name}}
span(v-if="audit.auditable_type").source (来源:{{formatSource(audit.auditable_type)}})
.date
span {{audit.created_at}}
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch, Emit } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComLogCell extends Vue {
// props
@Prop({ type: Object, default: () => ({}) }) audit!: object;
public formatIcon(val: string): string {
const obj: any = {
create: 'plus-square',
update: 'form',
delete: 'delete',
};
return obj[val];
}
public formatType(val: string) {
const obj: any = {
create: '创建',
update: '更新',
delete: '删除',
};
return obj[val];
}
public formatSource(val: string) {
const obj: any = {
Department: '组织结构',
Duty: '职务',
Title: '职称',
Teacher: '花名册',
};
return obj[val];
}
}
</script>
<style lang="stylus" scoped>
.log-item
display flex
justify-content space-between
align-items center
margin-bottom 16px
padding 5px 0px
font-size 12px
line-height 20px
.info-box
display flex
align-items center
.logo
width 18px
height 18px
color #A6A6A6
.desc
margin 0px 8px 0px 16px
color #A6A6A6
.source
margin-left 8px
color #A6A6A6
.date
color #A6A6A6
</style>
<script lang="ts">
import { Component, Vue, Prop, Model } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComMainModal extends Vue {
@Model('change', { type: Boolean, default: false }) private value!: boolean;
@Prop({ type: String, default: '' }) private title!: string;
@Prop({ type: [String, Number], default: '960px' }) private width!: string;
@Prop({ type: Boolean, default: false }) private maskClosable!: boolean;
@Prop({ type: Boolean, default: true }) private closable!: boolean;
@Prop({ type: Boolean, default: true }) private destroyOnClose!: boolean;
@Prop({ type: [String, Number], default: '0px' }) private bottom!: string;
get hasRight() {
return !!this.$slots.right;
}
get visible() {
console.log(this.value);
return this.value;
}
set visible(visible) {
this.$emit('change', visible);
}
get bottomGap() {
return typeof this.bottom === 'string' ? this.bottom : `${this.bottom}px`;
}
change(visible: boolean) {
this.$emit('change', visible);
}
}
</script>
<template lang="pug">
a-modal.main-modal-component(
v-model="visible"
:footer="false"
:maskClosable="maskClosable"
:width="width"
:bodyStyle="{ padding: '0px' }"
:style="{ 'padding-bottom': bottomGap }"
:closable="closable"
:destroyOnClose="destroyOnClose"
@change="change")
template(slot="title")
slot(name="title")
span {{ title }}
.main-modal__body
.main-modal__content(:class="{ 'has-footer': !!$slots.footer }")
.main-content
slot
.side(v-if="hasRight")
slot(name="right")
.main-modal__footer(v-if="$slots.footer")
slot(name="footer")
</template>
<style lang="stylus">
.main-modal-component
top 0px !important
bottom 0px
padding-bottom 0px
height 100%
overflow hidden
.ant-modal
padding-bottom 0 !important
.ant-modal-content
height calc(100vh - 50px)
top 50px
.ant-modal-body
height calc(100% - 55px)
.main-modal__body
display flex
flex-direction column
height 100%
background #fff
.main-modal__content
display flex
height 100%
.main-content
flex auto
overflow auto
height 100%
.side
flex none
overflow auto
height 100%
border-left 1px solid #e6e6e6
.has-footer
height calc(100% - 58px)
.main-modal__footer
flex-shrink 0
padding 8px 16px
border-top 1px solid #E5E5E5
background #fff
</style>
<template lang="pug">
a-timeline
a-timeline-item(
v-for="(item, index) in menus"
:key="index"
:color="inactiveColor"
@click.native="onMenu(item)")
a-icon(
:type="item.icon"
:style="{ fontSize: iconSize, color: activeKey === item.path ? activeColor : inactiveColor }"
slot="dot")
.module
.module-top(:class="{ 'is-path': item.path }")
.title(:style="{ color: activeKey === item.path ? activeColor : inactiveColor }")
| {{ item.label }}
.right
template(v-if="item.tag && item.tag.text")
.ta-tag(:class="`ta-tag-${item.tag.type}`")
| {{ item.tag.text }}
a-icon(type="right" :color="inactiveColor" v-if="item.path")
.module-middle(v-if="$slots[item.slot]")
slot(:name="item.slot")
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch, Emit } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComMenuList extends Vue {
@Prop({ type: Array, default: () => [] }) private menus?: any;
@Prop({ type: String, default: '' }) private activeKey?: string;
@Prop({ type: String, default: '#383838' }) private activeColor?: string;
@Prop({ type: String, default: '#A6A6A6' }) private inactiveColor?: string;
@Prop({ type: String, default: '18px' }) private iconSize?: string;
public onMenu(val: any) {
this.$emit('click', val);
}
public tagStyle(type = 'info') {
return ({
info: {
color: '#f5f5f5',
textColor: '#808080',
},
primary: {
color: '#EDF7FF',
textColor: '#3DA8F5',
},
success: {
color: '#F0F9F2',
textColor: '#6DC37D',
},
warning: {
color: '#ffe1e1',
textColor: '#f2826a',
},
danger: {
color: '#ffe1e1',
textColor: '#ad0000',
},
} as any)[type];
}
}
</script>
<style lang="stylus" scoped>
.ant-timeline
overflow auto
margin-right 16px
padding 20px
min-width 300px
width 300px
height 100%
background #fff
.module
padding 3px 0px 8px 4px
width 100%
.is-path
cursor pointer
.module-top
display flex
justify-content space-between
align-items center
margin-top -4px
min-height 26px
width 100%
.title
white-space nowrap
.right
display flex
flex-wrap nowrap
justify-content flex-end
align-items center
.ta-tag
padding 5px 6px
font-size 12px
line-height 16px
.module-middle
margin-top 12px
padding 12px 16px
background #FAFAFA
</style>
<template lang="pug">
a-select.menu-select(
:options="options"
v-model="currentValue"
:mode="mode"
:placeholder="placeholder")
slot
</template>
<script lang="ts">
import { Component, Vue, Prop, Model } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComMenuSelect extends Vue {
@Model('change', { type: [String, Array] }) private value!: string | string[];
@Prop({ type: Array, default: () => [] }) private options!: object[];
@Prop({ type: String, default: '请选择' }) private placeholder!: string;
@Prop({ type: String, default: 'default' }) private mode!: string;
get currentValue() {
return this.value;
}
set currentValue(value: string | string[]) {
this.$emit('change', value);
}
}
</script>
<style lang="stylus">
.menu-select
min-width 80px
margin 0 10px
*
background transparent
background-color transparent
.ant-select-selection
border none
</style>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
@Component
export default class ComNoScrollBarContainer extends Vue {}
</script>
<template lang="pug">
.no-scroll-bar-container
.no-scroll-bar-inner-container
slot
</template>
<style lang="stylus" scoped>
.no-scroll-bar-container
height 100%
position relative
overflow hidden
.no-scroll-bar-inner-container
position absolute
left 0
right -18px
top 0
height 100%
overflow auto
padding-right 18px
</style>
<template lang="pug">
.component-panel
.header(
v-if="title || $slots.header || $slots.actions"
:class="{ 'full-head-line': fullHeadLine, bordered: bordered }")
slot(name="header")
.component-panel__title(v-if="title" :class="{ 'title-center': center }")
| {{ title }}
.component-panel__actions
slot(name="actions")
.content(:class="{ 'content-panel': notCard }")
slot
.footer(v-if="$slots.footer")
slot(name="footer")
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch, Emit } from 'vue-property-decorator';
@Component({
components: {},
})
export default class ComPanel extends Vue {
@Prop({ type: String, default: '' }) title!: string;
@Prop({ type: Boolean, default: true }) bordered!: boolean;
@Prop({ type: Boolean, default: false }) center!: boolean;
@Prop({ type: Boolean, default: false }) fullHeadLine!: boolean;
get notCard() {
return this.title || this.$slots.header || this.$slots.footer;
}
}
</script>
<style lang="stylus" scoped>
.component-panel
display flex
flex-direction column
width 100%
border-radius 3px
background #FFFFFF
box-shadow 0 2px 3px 0 rgba(0, 0, 0, 0.1)
&:last-child
margin-bottom 0 !important
.header
position relative
display flex
flex-shrink 0
justify-content space-between
align-items center
padding 0 20px
min-height 48px
z-index 1
&:after
position absolute
right 20px
bottom 0px
left 20px
height 0px
background #E5E5E5
content ''
.component-panel__title
flex-grow 1
color #383838
font-weight 500
font-size 16px
.title-center
text-align center
.component-panel__actions
display inline-flex
align-items center
.bordered:after
height 1px
.full-head-line
&:after
right 0
left 0
.content
width 100%
height 100%
.content-panel
position relative
overflow-x hidden
overflow-y auto
padding 0 20px
height 100%
.footer
position relative
display flex
flex-shrink 0
align-items center
padding 0 20px
height 56px
&:after
position absolute
top 0px
right 0px
left 0px
height 1px
background #E5E5E5
content ''
</style>
<template lang="pug">
a-popover(
v-model="localVisible"
trigger="click"
:placement="placement"
@visibleChange="visibleChange")
template(slot="content")
.popover-card(:style="{width: width + 'px'}")
slot(name="content")
.popover-header(v-if="title")
a-button.back(shape="circle" icon="left" size="small" @click.stop="onBack" v-if="back")
span {{ title }}
a-button.close(shape="circle" icon="close" size="small" @click="cancel()")
.popover-main
slot(name="main")
span {{ desc }}
.popover-footer(v-if="$slots.footer")
slot(name="footer")
slot
</template>
<script lang="ts">
import { Component, Vue, Prop, Model, Watch, Emit } from 'vue-property-decorator';
@Component
export default class ComPopover extends Vue {
@Model('change', { type: Boolean, default: false }) visible!: boolean;
@Prop({ type: String, default: '' }) title!: string;
@Prop({ type: String, default: '' }) desc!: string;
@Prop({ type: String, default: 'click' }) trigger!: string;
@Prop({ type: String, default: 'bottom' }) placement!: string;
@Prop({ type: Number, default: 248 }) width!: number;
@Prop({ type: Function, default: null }) back!: () => void;
localVisible = false;
@Watch('visible', { immediate: true })
onValueChange() {
this.localVisible = this.visible;
}
@Emit('change')
visibleChange(visible: boolean) {
this.$emit('onCancel');
return visible;
}
cancel() {
this.localVisible = false;
this.visibleChange(false);
this.$emit('onCancel');
}
onBack() {
if (this.back) {
this.back();
}
}
}
</script>
<style lang="stylus" scoped>
.popover-card
margin -12px -16px
width 100%
.popover-header
position relative
padding 15px 0px
width 100%
height 50px
border-bottom 1px #E5E5E5 solid
text-align center
font-weight 500
font-size 16px
line-height 20px
.back
position absolute
top 15px
left 12px
width 20px
height 20px
border none
color #a6a6a6
line-height 20px
&:hover
color #3da8f5
.close
position absolute
top 15px
right 12px
width 20px
height 20px
border none
color #a6a6a6
line-height 20px
&:hover
color #3da8f5
.popover-main
padding 16px
width 100%
.popover-footer
padding 12px 16px
width 100%
border-top 1px #E5E5E5 solid
</style>
<template lang="pug">
.loading-page(v-if="loading")
a-spin(:spinning="loading" :tip="tip")
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch, Emit } from 'vue-property-decorator';
@Component({
components: {},
})
export default class Loading extends Vue {
@Prop({ type: String, default: '加载中' }) private tip!: string;
@Prop({ type: Boolean, default: false }) private loading!: boolean;
}
</script>
<style lang="stylus" scoped>
.loading-page
display flex
justify-content center
padding 30px 0px
width 100%
</style>
import { EventInput } from '@fullcalendar/vue';
let eventGuid = 0;
export const INITIAL_EVENTS: EventInput[] = [
{
// id: createEventId(),
title: '德国交流',
start: new Date('2020-11-01').toISOString().replace(/T.*$/, ''), // YYYY-MM-DD of today,
end: new Date('2021-11-01').toISOString().replace(/T.*$/, ''), // YYYY-MM-DD of today,
},
{
// id: createEventId(),
title: '泰国交流',
start: new Date('2020-11-01').toISOString().replace(/T.*$/, ''), // YYYY-MM-DD of today,
end: new Date('2021-11-01').toISOString().replace(/T.*$/, ''), // YYYY-MM-DD of today,
},
];
export function createEventId() {
return String(eventGuid++);
}
......@@ -986,6 +986,104 @@
resolved "https://r.cnpmjs.org/@commitlint/types/download/@commitlint/types-9.1.1.tgz#d97ebc35d20eed6d8458361cbca5c7cb85d45184"
integrity sha1-2X68NdIO7W2EWDYcvKXHy4XUUYQ=
"@fullcalendar/common@~5.5.0":
version "5.5.1"
resolved "https://registry.npm.taobao.org/@fullcalendar/common/download/@fullcalendar/common-5.5.1.tgz#cc3679408b625b35d6f3f05bdca73f3700d0d370"
integrity sha1-zDZ5QItiWzXW8/Bb3Kc/NwDQ03A=
dependencies:
ical.js "^1.4.0"
tslib "^2.0.3"
"@fullcalendar/core@^5.5.1", "@fullcalendar/core@~5.5.0":
version "5.5.1"
resolved "https://registry.npm.taobao.org/@fullcalendar/core/download/@fullcalendar/core-5.5.1.tgz#310adf23d5323b435a00f7df6f68eaf2f6087f39"
integrity sha1-MQrfI9UyO0NaAPffb2jq8vYIfzk=
dependencies:
"@fullcalendar/common" "~5.5.0"
preact "^10.0.5"
tslib "^2.0.3"
"@fullcalendar/daygrid@^5.5.0", "@fullcalendar/daygrid@~5.5.0":
version "5.5.0"
resolved "https://registry.npm.taobao.org/@fullcalendar/daygrid/download/@fullcalendar/daygrid-5.5.0.tgz#48f943d070a07f88cd6f8170fb757d3038239bd6"
integrity sha1-SPlD0HCgf4jNb4Fw+3V9MDgjm9Y=
dependencies:
"@fullcalendar/common" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/interaction@^5.5.0":
version "5.5.0"
resolved "https://registry.npm.taobao.org/@fullcalendar/interaction/download/@fullcalendar/interaction-5.5.0.tgz#8fe3f2b89c55fad5835a9c74f7a95a7d97419afe"
integrity sha1-j+PyuJxV+tWDWpx096lafZdBmv4=
dependencies:
"@fullcalendar/common" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/premium-common@~5.5.0":
version "5.5.1"
resolved "https://registry.npm.taobao.org/@fullcalendar/premium-common/download/@fullcalendar/premium-common-5.5.1.tgz#f175763045a1d1be93f3b5a481550b476a940ec0"
integrity sha1-8XV2MEWh0b6T87WkgVULR2qUDsA=
dependencies:
"@fullcalendar/common" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/resource-common@~5.5.0":
version "5.5.0"
resolved "https://registry.npm.taobao.org/@fullcalendar/resource-common/download/@fullcalendar/resource-common-5.5.0.tgz#0739426064985844fb0a8263e20314796ec45f47"
integrity sha1-BzlCYGSYWET7CoJj4gMUeW7EX0c=
dependencies:
"@fullcalendar/common" "~5.5.0"
"@fullcalendar/premium-common" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/resource-timeline@^5.5.0":
version "5.5.0"
resolved "https://registry.npm.taobao.org/@fullcalendar/resource-timeline/download/@fullcalendar/resource-timeline-5.5.0.tgz#c19eaabe067739d37b69d23f321620f394ee363c"
integrity sha1-wZ6qvgZ3OdN7adI/MhYg85TuNjw=
dependencies:
"@fullcalendar/common" "~5.5.0"
"@fullcalendar/premium-common" "~5.5.0"
"@fullcalendar/resource-common" "~5.5.0"
"@fullcalendar/scrollgrid" "~5.5.0"
"@fullcalendar/timeline" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/scrollgrid@~5.5.0":
version "5.5.1"
resolved "https://registry.npm.taobao.org/@fullcalendar/scrollgrid/download/@fullcalendar/scrollgrid-5.5.1.tgz#cec60ef142ead88f288efdbce6546bdaf9377275"
integrity sha1-zsYO8ULq2I8ojv285lRr2vk3cnU=
dependencies:
"@fullcalendar/common" "~5.5.0"
"@fullcalendar/premium-common" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/timegrid@^5.5.1":
version "5.5.1"
resolved "https://registry.npm.taobao.org/@fullcalendar/timegrid/download/@fullcalendar/timegrid-5.5.1.tgz#b73eb9e454808313e7146dc5df6105e9b3aa80cb"
integrity sha1-tz655FSAgxPnFG3F32EF6bOqgMs=
dependencies:
"@fullcalendar/common" "~5.5.0"
"@fullcalendar/daygrid" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/timeline@~5.5.0":
version "5.5.0"
resolved "https://registry.npm.taobao.org/@fullcalendar/timeline/download/@fullcalendar/timeline-5.5.0.tgz#24e57ae1f38cd4bd0595e7342990bfd27d481abd"
integrity sha1-JOV64fOM1L0Flec0KZC/0n1IGr0=
dependencies:
"@fullcalendar/common" "~5.5.0"
"@fullcalendar/premium-common" "~5.5.0"
"@fullcalendar/scrollgrid" "~5.5.0"
tslib "^2.0.3"
"@fullcalendar/vue@^5.5.0":
version "5.5.0"
resolved "https://registry.npm.taobao.org/@fullcalendar/vue/download/@fullcalendar/vue-5.5.0.tgz#4677cf4b770a84b977397ed4b8a8326f82f191dc"
integrity sha1-RnfPS3cKhLl3OX7UuKgyb4Lxkdw=
dependencies:
"@fullcalendar/core" "~5.5.0"
tslib "^2.0.3"
"@hapi/address@2.x.x":
version "2.1.4"
resolved "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&sync_timestamp=1593993745797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
......@@ -5181,6 +5279,11 @@ fsevents@~2.1.2:
resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1588787369955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
integrity sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=
fullcalendar@^5.5.1:
version "5.5.1"
resolved "https://registry.npm.taobao.org/fullcalendar/download/fullcalendar-5.5.1.tgz#f72a5828473b012d80b558ff80ccb606d07e4baf"
integrity sha1-9ypYKEc7AS2AtVj/gMy2BtB+S68=
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
......@@ -5697,6 +5800,11 @@ husky@^4.2.5:
slash "^3.0.0"
which-pm-runs "^1.0.0"
ical.js@^1.4.0:
version "1.4.0"
resolved "https://registry.npm.taobao.org/ical.js/download/ical.js-1.4.0.tgz#fc5619dc55fe03d909bf04362aa0677f4541b9d7"
integrity sha1-/FYZ3FX+A9kJvwQ2KqBnf0VBudc=
iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184250387&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
......@@ -8793,6 +8901,11 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2
source-map "^0.6.1"
supports-color "^6.1.0"
preact@^10.0.5:
version "10.5.13"
resolved "https://registry.npm.taobao.org/preact/download/preact-10.5.13.tgz#85f6c9197ecd736ce8e3bec044d08fd1330fa019"
integrity sha1-hfbJGX7Nc2zo477ARNCP0TMPoBk=
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
......@@ -10715,6 +10828,11 @@ tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.npm.taobao.org/tslib/download/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
integrity sha1-yIHhPMcBWJTtkUhi0nZDb6mkcEM=
tslib@^2.0.3:
version "2.1.0"
resolved "https://registry.npm.taobao.org/tslib/download/tslib-2.1.0.tgz?cache=0&sync_timestamp=1609887581211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
integrity sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo=
tslint@^5.20.1:
version "5.20.1"
resolved "https://registry.npm.taobao.org/tslint/download/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment