feat: 初始化项目

This commit is contained in:
dengtongyu committed 2025-05-27 14:55:54 +08:00
commit 40c1dffb79
73 files changed
+11449

No files matched your search

+17
View File
@@ -0,0 +1,17 @@
<script setup lang="ts">
import zhCN from "ant-design-vue/es/locale/zh_CN";
import theme from "./styles/theme.json";
defineOptions({
name: "App"
});
</script>
<template>
<a-config-provider :locale="zhCN" :theme="theme">
<router-view />
</a-config-provider>
</template>
<style lang="less" scoped>
</style>
+38
View File
@@ -0,0 +1,38 @@
import ajax from "../lib/ajax";
const { VITE_APP_SYSTEMCODE } = import.meta.env;
const HOST = "/zuul";
// 获取用户信息
export const getUserInfo = function (param: any) {
return ajax.get(`${HOST}/admin-mgr/api/getSafeUserInfo`, param);
};
export const getUserPower = () => {
return ajax.get(`${HOST}/power/list`, { params: { systemCode: VITE_APP_SYSTEMCODE } });
};
// 获取菜单树
export const getMenuTree = (systemCode?: string) => {
return ajax.get(`${HOST}/acl/memu/tree`, { params: { systemCode: systemCode || VITE_APP_SYSTEMCODE || "" } });
};
// 用户头像
export const viewImg = (mediaId: string) => {
return `${HOST}/tog-biz-media/media/ls/get?media_id=${mediaId}`;
};
// 退出登录
export const logout = () => {
const re = new RegExp("^(http|https)://(localhost|127.0.0.1)");
if (re.test(location.href)) {
console.log("退出登录,本地调试不做响应");
} else {
const redirectUrl = `${location.href.split("#")[0].split("?")[0]
}?t=${new Date().valueOf()}`;
location.href = `/auth/ac/_tif_logout?returnUrl=${encodeURIComponent(
redirectUrl
)}`;
}
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

+33
View File
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="144px" height="129px" viewBox="0 0 144 129" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>404</title>
<defs>
<polygon id="path-1" points="0 2.001 143.9988 2.001 143.9988 126 0 126"></polygon>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="空白页" transform="translate(-1380.000000, -251.000000)">
<g id="404" transform="translate(1380.000000, 251.000000)">
<g id="编组" transform="translate(0.000000, 0.999900)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-2"></g>
<path d="M8.6148,55.539 C8.6148,57.18 6.1548,57.18 6.1548,55.539 L6.1548,50.922 C6.1548,50.244 6.7038,49.692 7.3848,49.692 L11.9988,49.692 C13.6398,49.692 13.6398,52.155 11.9988,52.155 L8.6148,52.155 L8.6148,55.539 Z M120.1548,7.386 L124.3068,7.386 C125.9478,7.386 125.9478,9.846 124.3068,9.846 L120.1548,9.846 L120.1548,14.001 C120.1548,15.642 117.6918,15.642 117.6918,14.001 L117.6918,9.846 L113.5398,9.846 C111.8988,9.846 111.8988,7.386 113.5398,7.386 L117.6918,7.386 L117.6918,3.231 C117.6918,1.59 120.1548,1.59 120.1548,3.231 L120.1548,7.386 Z M6.1548,46.308 C6.1548,44.667 8.6148,44.667 8.6148,46.308 L8.6148,50.922 C8.6148,51.603 8.0628,52.155 7.3848,52.155 L2.7678,52.155 C1.1268,52.155 1.1268,49.692 2.7678,49.692 L6.1548,49.692 L6.1548,46.308 Z M125.5398,92.463 C125.5398,94.101 123.0768,94.101 123.0768,92.463 L123.0768,87.846 C123.0768,87.165 123.6288,86.616 124.3068,86.616 L128.9238,86.616 C130.5648,86.616 130.5648,89.076 128.9238,89.076 L125.5398,89.076 L125.5398,92.463 Z M123.0768,83.229 C123.0768,81.591 125.5398,81.591 125.5398,83.229 L125.5398,87.846 C125.5398,88.527 124.9878,89.076 124.3068,89.076 L119.6928,89.076 C118.0518,89.076 118.0518,86.616 119.6928,86.616 L123.0768,86.616 L123.0768,83.229 Z M54.3078,126 C53.6268,126 53.0778,125.448 53.0778,124.77 C53.0778,124.089 53.6268,123.54 54.3078,123.54 L101.2308,123.54 C101.9118,123.54 102.4608,124.089 102.4608,124.77 C102.4608,125.448 101.9118,126 101.2308,126 L54.3078,126 Z M36.6138,126 C35.9358,126 35.3838,125.448 35.3838,124.77 C35.3838,124.089 35.9358,123.54 36.6138,123.54 L47.3838,123.54 C48.0648,123.54 48.6138,124.089 48.6138,124.77 C48.6138,125.448 48.0648,126 47.3838,126 L36.6138,126 Z M128.9238,114.462 C128.2428,114.462 127.6908,113.91 127.6908,113.229 C127.6908,112.551 128.2428,111.999 128.9238,111.999 L142.7688,111.999 C143.4498,111.999 143.9988,112.551 143.9988,113.229 C143.9988,113.91 143.4498,114.462 142.7688,114.462 L128.9238,114.462 Z M115.0758,114.462 C114.3978,114.462 113.8458,113.91 113.8458,113.229 C113.8458,112.551 114.3978,111.999 115.0758,111.999 L118.9248,111.999 C119.6028,111.999 120.1548,112.551 120.1548,113.229 C120.1548,113.91 119.6028,114.462 118.9248,114.462 L115.0758,114.462 Z M1.2318,114.462 C0.5508,114.462 -0.0012,113.91 -0.0012,113.229 C-0.0012,112.551 0.5508,111.999 1.2318,111.999 L108.9228,111.999 C109.6038,111.999 110.1528,112.551 110.1528,113.229 C110.1528,113.91 109.6038,114.462 108.9228,114.462 L1.2318,114.462 Z" id="Fill-1" fill="#C3CBD6" mask="url(#mask-2)"></path>
</g>
<path d="M33.0879,20.889 C32.3619,21.615 31.2759,20.526 31.9989,19.803 L33.6309,18.171 C33.9309,17.871 34.4199,17.871 34.7199,18.171 L36.3519,19.803 C37.0779,20.526 35.9889,21.615 35.2629,20.889 L34.1769,19.803 L33.0879,20.889 Z M35.2629,16.539 C35.9889,15.813 37.0779,16.899 36.3519,17.628 L34.7199,19.26 C34.4199,19.56 33.9309,19.56 33.6309,19.26 L31.9989,17.628 C31.2759,16.899 32.3619,15.813 33.0879,16.539 L34.1769,17.628 L35.2629,16.539 Z M19.5069,101.418 C18.7809,102.141 17.6919,101.055 18.4179,100.329 L20.0499,98.7 C20.3499,98.397 20.8389,98.397 21.1389,98.7 L22.7709,100.329 C23.4939,101.055 22.4049,102.141 21.6819,101.418 L20.5929,100.329 L19.5069,101.418 Z M21.6819,97.068 C22.4049,96.342 23.4939,97.428 22.7709,98.154 L21.1389,99.786 C20.8389,100.086 20.3499,100.086 20.0499,99.786 L18.4179,98.154 C17.6919,97.428 18.7809,96.342 19.5069,97.068 L20.5929,98.154 L21.6819,97.068 Z" id="Fill-3" fill="#C3CBD6"></path>
<path d="M94.3785,55.0125 L102.5055,58.2945 L100.7745,62.5755 C100.1385,64.1505 98.3475,64.9125 96.7695,64.2735 L69.6675,53.3265 C68.0925,52.6875 67.3305,50.8935 67.9665,49.3215 L69.6975,45.0405 L76.3965,47.7465 C70.3545,44.3685 68.3205,40.2285 70.3035,35.3295 C74.4405,25.0875 86.0955,20.1375 96.3375,24.2775 C106.5795,28.4145 111.5265,40.0725 107.3895,50.3145 C105.4095,55.2135 101.0715,56.7795 94.3785,55.0125 L85.3875,51.3795 C81.7695,50.2875 78.7725,49.0755 76.3965,47.7465 L94.3785,55.0125 Z" id="Fill-5" fill="#F5F7F9"></path>
<path d="M94.8399,53.8716 C100.7409,55.4226 104.5239,54.1236 106.2489,49.8516 C110.1249,40.2576 105.4719,29.2956 95.8779,25.4196 C91.2279,23.5386 86.1249,23.5836 81.5139,25.5456 C76.8969,27.5016 73.3209,31.1406 71.4429,35.7906 C69.7239,40.0416 71.5209,43.5906 76.9299,46.6356 L94.8399,53.8716 Z M70.3779,46.6416 L69.1089,49.7826 C68.7279,50.7246 69.1869,51.8016 70.1289,52.1856 L97.2309,63.1326 C97.6869,63.3156 98.1879,63.3126 98.6439,63.1206 C99.0969,62.9286 99.4509,62.5716 99.6339,62.1156 L100.9029,58.9746 L84.9249,52.5216 C81.3819,51.4536 78.2979,50.2116 75.8649,48.8586 L70.3779,46.6416 Z M97.9239,65.7336 C97.3779,65.7336 96.8319,65.6256 96.3099,65.4156 L69.2079,54.4656 C67.0059,53.5746 65.9379,51.0606 66.8259,48.8586 L69.0189,43.4376 L69.9249,43.8066 C67.7619,40.5816 68.1519,37.3626 69.1599,34.8696 C71.2839,29.6106 75.3309,25.4946 80.5509,23.2776 C85.7709,21.0606 91.5429,21.0126 96.7989,23.1366 C107.6529,27.5226 112.9149,39.9216 108.5289,50.7756 C107.5239,53.2656 105.5649,55.8546 101.7729,56.6736 L104.1069,57.6156 L101.9169,63.0366 C101.4849,64.1046 100.6659,64.9386 99.6069,65.3886 C99.0669,65.6166 98.4939,65.7336 97.9239,65.7336 L97.9239,65.7336 Z" id="Fill-7" fill="#C3CBD6"></path>
<polygon id="Fill-9" fill="#FFFFFF" points="60.4203 34.323 115.1943 56.454 111.5073 65.583 56.7333 43.452"></polygon>
<path d="M58.3344,42.7722 L110.8284,63.9792 L113.5914,57.1332 L61.1004,35.9262 L58.3344,42.7722 Z M112.1874,67.1862 L55.1304,44.1312 L59.7414,32.7192 L116.7984,55.7742 L112.1874,67.1862 Z" id="Fill-11" fill="#C3CAD7"></path>
<path d="M101.5035,58.7202 C100.3215,58.2432 99.7515,56.8992 100.2285,55.7172 C100.7055,54.5352 102.0525,53.9652 103.2315,54.4422 C104.4135,54.9192 104.9865,56.2632 104.5065,57.4452 C104.0295,58.6272 102.6855,59.1972 101.5035,58.7202 M91.5195,54.6852 C90.3375,54.2082 89.7645,52.8642 90.2445,51.6822 C90.7215,50.5002 92.0655,49.9302 93.2475,50.4072 C94.4295,50.8842 94.9995,52.2282 94.5225,53.4102 C94.0455,54.5922 92.6985,55.1622 91.5195,54.6852 M78.6825,49.4982 C77.5005,49.0212 76.9275,47.6772 77.4045,46.4952 C77.8815,45.3132 79.2285,44.7432 80.4105,45.2202 C81.5925,45.6972 82.1625,47.0412 81.6855,48.2232 C81.2055,49.4082 79.8615,49.9752 78.6825,49.4982 M68.6955,45.4662 C67.5135,44.9862 66.9435,43.6422 67.4205,42.4632 C67.8975,41.2812 69.2445,40.7082 70.4235,41.1852 C71.6055,41.6622 72.1785,43.0092 71.6985,44.1912 C71.2215,45.3732 69.8775,45.9432 68.6955,45.4662" id="Fill-13" fill="#C3CAD7"></path>
<path d="M39.0807,75.5643 C39.4137,75.3033 39.8967,75.3633 40.1607,75.6963 C40.4217,76.0323 40.3617,76.5153 40.0257,76.7763 L31.1397,83.7213 C30.8037,83.9823 30.3207,83.9223 30.0597,83.5863 C29.7987,83.2533 29.8587,82.7703 30.1917,82.5063 L39.0807,75.5643 Z M45.2997,70.7043 C45.6357,70.4433 46.1187,70.5033 46.3797,70.8363 C46.6437,71.1723 46.5807,71.6553 46.2477,71.9163 L43.3107,74.2113 C42.9747,74.4723 42.4917,74.4123 42.2307,74.0793 C41.9697,73.7433 42.0267,73.2603 42.3627,72.9993 L45.2997,70.7043 Z M65.1237,55.2153 C65.4567,54.9543 65.9427,55.0143 66.2037,55.3503 C66.4647,55.6833 66.4047,56.1663 66.0717,56.4303 L50.3277,68.7303 C49.9917,68.9913 49.5087,68.9313 49.2477,68.5983 C48.9837,68.2623 49.0437,67.7793 49.3797,67.5183 L65.1237,55.2153 Z" id="Fill-15" fill="#C3CAD7"></path>
<path d="M98.5869,68.7366 C98.5269,68.3166 98.1399,68.0226 97.7169,68.0826 C97.2969,68.1396 97.0059,68.5296 97.0629,68.9496 L101.3829,91.8126 C101.4429,92.2356 101.8299,92.5266 102.2529,92.4696 C102.6729,92.4096 102.9639,92.0196 102.9039,91.5996 L98.5869,68.7366 Z" id="Fill-17" fill="#C3CAD7"></path>
<path d="M59.6616,53.6943 C60.0606,53.5503 60.5016,53.7573 60.6486,54.1533 C60.7926,54.5553 60.5856,54.9963 60.1866,55.1403 L51.6846,58.8183 C51.2856,58.9653 50.8446,58.7583 50.7006,58.3593 C50.5536,57.9603 50.7606,57.5193 51.1596,57.3753 L59.6616,53.6943 Z" id="Fill-19" fill="#C3CAD7"></path>
<path d="M102.3399,73.7949 C102.1809,73.4019 102.3699,72.9519 102.7659,72.7959 C103.1589,72.6339 103.6059,72.8259 103.7679,73.2189 L107.9919,83.6769 C108.1509,84.0699 107.9619,84.5199 107.5659,84.6759 C107.1729,84.8379 106.7229,84.6459 106.5639,84.2529 L102.3399,73.7949 Z" id="Fill-21" fill="#C3CAD7"></path>
<path d="M56.3394,86.1054 L54.3084,81.3234 L52.2744,87.8304 L56.3394,86.1054 Z M57.7314,89.3814 L50.0334,92.6484 L48.5604,89.1744 L52.3734,76.7604 L56.0544,75.1974 L60.0234,84.5424 L61.9284,83.7324 L63.3204,87.0084 L61.4124,87.8184 L62.6184,90.6624 L58.9374,92.2254 L57.7314,89.3814 Z" id="Fill-23" fill="#C3CBD6"></path>
<path d="M73.5264,79.4022 C74.0364,81.4422 74.5644,82.7922 75.1104,83.4492 C75.6564,84.1062 76.2744,84.3492 76.9614,84.1782 C77.4114,84.0672 77.7624,83.8092 78.0174,83.4102 C78.2694,83.0112 78.3894,82.4502 78.3744,81.7242 C78.3594,81.0012 78.1704,79.9122 77.8104,78.4632 C77.2794,76.3332 76.7424,74.9502 76.1994,74.3052 C75.6534,73.6632 75.0234,73.4322 74.3004,73.6122 C73.5654,73.7952 73.1274,74.3022 72.9834,75.1302 C72.8424,75.9612 73.0254,77.3832 73.5264,79.4022 M69.1074,80.4942 C68.3484,77.4462 68.3634,75.1782 69.1584,73.6872 C69.9534,72.1962 71.4714,71.1702 73.7154,70.6092 C74.7954,70.3422 75.7134,70.2552 76.4724,70.3482 C77.2314,70.4412 77.8824,70.6482 78.4254,70.9632 C78.9684,71.2812 79.4244,71.6442 79.7934,72.0522 C80.1624,72.4602 80.5014,72.9582 80.8104,73.5462 C81.4074,74.6652 81.8694,75.8742 82.1934,77.1732 C82.9164,80.0802 82.9554,82.3332 82.3074,83.9262 C81.6594,85.5192 80.1324,86.6172 77.7264,87.2142 C76.3794,87.5532 75.2364,87.6072 74.2974,87.3852 C73.3584,87.1632 72.5214,86.7042 71.7804,86.0052 C71.2494,85.5102 70.7454,84.7782 70.2774,83.8062 C69.8064,82.8372 69.4164,81.7302 69.1074,80.4942" id="Fill-25" fill="#C3CBD6"></path>
<path d="M83.3409,101.4597 L86.2449,97.1517 L79.6779,98.9877 L83.3409,101.4597 Z M81.3489,104.4117 L74.4189,99.7347 L76.5279,96.6057 L89.0199,93.0417 L92.3349,95.2797 L86.6559,103.6977 L88.3749,104.8557 L86.3859,107.8077 L84.6669,106.6467 L82.9389,109.2087 L79.6239,106.9707 L81.3489,104.4117 Z" id="Fill-27" fill="#C3CBD6"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="122px" height="104px" viewBox="0 0 122 104" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
<title>服务器异常</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="空白页" transform="translate(-502.000000, -508.000000)">
<g id="服务器异常" transform="translate(502.000000, 508.000000)">
<g id="分组-2">
<g id="背景/线" fill="#C3CBD6">
<g id="-">
<g id="编组" transform="translate(14.200000, 9.200000)" fill-rule="nonzero">
<path
d="M0.8,73.1 C0.3581722,73.1 -5.68434189e-14,72.7418278 -5.68434189e-14,72.3 C-5.68434189e-14,71.8581722 0.3581722,71.5 0.8,71.5 L70.8,71.5 C71.2418278,71.5 71.6,71.8581722 71.6,72.3 C71.6,72.7418278 71.2418278,73.1 70.8,73.1 L0.8,73.1 Z M74.8,73.1 C74.3581722,73.1 74,72.7418278 74,72.3 C74,71.8581722 74.3581722,71.5 74.8,71.5 L77.3,71.5 C77.7418278,71.5 78.1,71.8581722 78.1,72.3 C78.1,72.7418278 77.7418278,73.1 77.3,73.1 L74.8,73.1 Z M83.8,73.1 C83.3581722,73.1 83,72.7418278 83,72.3 C83,71.8581722 83.3581722,71.5 83.8,71.5 L92.8,71.5 C93.2418278,71.5 93.6,71.8581722 93.6,72.3 C93.6,72.7418278 93.2418278,73.1 92.8,73.1 L83.8,73.1 Z M23.8,80.6 C23.3581722,80.6 23,80.2418278 23,79.8 C23,79.3581722 23.3581722,79 23.8,79 L30.8,79 C31.2418278,79 31.6,79.3581722 31.6,79.8 C31.6,80.2418278 31.2418278,80.6 30.8,80.6 L23.8,80.6 Z M35.3,80.6 C34.8581722,80.6 34.5,80.2418278 34.5,79.8 C34.5,79.3581722 34.8581722,79 35.3,79 L65.8,79 C66.2418278,79 66.6,79.3581722 66.6,79.8 C66.6,80.2418278 66.2418278,80.6 65.8,80.6 L35.3,80.6 Z M80,52.8 C80,51.7333333 81.6,51.7333333 81.6,52.8 L81.6,55.8 C81.6,56.2418278 81.2418278,56.6 80.8,56.6 L77.8,56.6 C76.7333333,56.6 76.7333333,55 77.8,55 L80,55 L80,52.8 Z M81.6,58.8 C81.6,59.8666667 80,59.8666667 80,58.8 L80,55.8 C80,55.3581722 80.3581722,55 80.8,55 L83.8,55 C84.8666667,55 84.8666667,56.6 83.8,56.6 L81.6,56.6 L81.6,58.8 Z M4,28.8 C4,27.7333333 5.6,27.7333333 5.6,28.8 L5.6,31.8 C5.6,32.2418278 5.2418278,32.6 4.8,32.6 L1.8,32.6 C0.733333333,32.6 0.733333333,31 1.8,31 L4,31 L4,28.8 Z M78.1,3.5 L80.8,3.5 C81.8666667,3.5 81.8666667,5.1 80.8,5.1 L78.1,5.1 L78.1,7.8 C78.1,8.86666667 76.5,8.86666667 76.5,7.8 L76.5,5.1 L73.8,5.1 C72.7333333,5.1 72.7333333,3.5 73.8,3.5 L76.5,3.5 L76.5,0.8 C76.5,-0.266666667 78.1,-0.266666667 78.1,0.8 L78.1,3.5 Z M5.6,34.8 C5.6,35.8666667 4,35.8666667 4,34.8 L4,31.8 C4,31.3581722 4.3581722,31 4.8,31 L7.8,31 C8.86666667,31 8.86666667,32.6 7.8,32.6 L5.6,32.6 L5.6,34.8 Z"
id="Path-2"></path>
<path
d="M14.0928932,61.1431458 C14.5642977,60.6717412 15.2714045,61.378848 14.8,61.8502525 L13.7393398,62.9109127 C13.5440777,63.1061748 13.2274952,63.1061748 13.032233,62.9109127 L11.9715729,61.8502525 C11.5001684,61.378848 12.2072751,60.6717412 12.6786797,61.1431458 L13.3857864,61.8502525 L14.0928932,61.1431458 Z M12.6786797,63.9715729 C12.2072751,64.4429774 11.5001684,63.7358706 11.9715729,63.2644661 L13.032233,62.2038059 C13.2274952,62.0085438 13.5440777,62.0085438 13.7393398,62.2038059 L14.8,63.2644661 C15.2714045,63.7358706 14.5642977,64.4429774 14.0928932,63.9715729 L13.3857864,63.2644661 L12.6786797,63.9715729 Z M22.9213203,8.8 C23.3927249,8.32859548 24.0998316,9.03570226 23.6284271,9.50710678 L22.567767,10.567767 C22.3725048,10.7630291 22.0559223,10.7630291 21.8606602,10.567767 L20.8,9.50710678 C20.3285955,9.03570226 21.0357023,8.32859548 21.5071068,8.8 L22.2142136,9.50710678 L22.9213203,8.8 Z M21.5071068,11.6284271 C21.0357023,12.0998316 20.3285955,11.3927249 20.8,10.9213203 L21.8606602,9.86066017 C22.0559223,9.66539803 22.3725048,9.66539803 22.567767,9.86066017 L23.6284271,10.9213203 C24.0998316,11.3927249 23.3927249,12.0998316 22.9213203,11.6284271 L22.2142136,10.9213203 L21.5071068,11.6284271 Z"
id="Path复制"></path>
</g>
</g>
</g>
<g id="分组" transform="translate(37.000000, 28.000000)">
<g id="分组-4" transform="translate(0.000000, 17.000000)" stroke="#C3CBD6">
<path
d="M9,0 L39,0 C40.6568542,-3.04359188e-16 42,1.34314575 42,3 L42,26 C42,27.6568542 40.6568542,29 39,29 L9,29 C7.34314575,29 6,27.6568542 6,26 L6,3 C6,1.34314575 7.34314575,3.04359188e-16 9,0 Z"
id="矩形" stroke-width="1.6" fill="#F5F7F9"></path>
<path
d="M3,0 L45,0 C46.6568542,-3.04359188e-16 48,1.34314575 48,3 L48,10 C48,11.6568542 46.6568542,13 45,13 L3,13 C1.34314575,13 -9.21676495e-14,11.6568542 -9.23705556e-14,10 L-9.23705556e-14,3 C-9.25734618e-14,1.34314575 1.34314575,3.04359188e-16 3,0 Z M3,17 L45,17 C46.6568542,17 48,18.3431458 48,20 L48,27 C48,28.6568542 46.6568542,30 45,30 L3,30 C1.34314575,30 -4.59823717e-14,28.6568542 -4.61852778e-14,27 L-4.61852778e-14,20 C-4.63881839e-14,18.3431458 1.34314575,17 3,17 Z"
id="矩形-copy-2" stroke-width="1.6" fill="#FFFFFF"></path>
<path
d="M15.5,9 C14.1192881,9 13,7.88071187 13,6.5 C13,5.11928813 14.1192881,4 15.5,4 C16.8807119,4 18,5.11928813 18,6.5 C18,7.88071187 16.8807119,9 15.5,9 Z M7.5,9 C6.11928813,9 5,7.88071187 5,6.5 C5,5.11928813 6.11928813,4 7.5,4 C8.88071187,4 10,5.11928813 10,6.5 C10,7.88071187 8.88071187,9 7.5,9 Z M15.5,26 C14.1192881,26 13,24.8807119 13,23.5 C13,22.1192881 14.1192881,21 15.5,21 C16.8807119,21 18,22.1192881 18,23.5 C18,24.8807119 16.8807119,26 15.5,26 Z M7.5,26 C6.11928813,26 5,24.8807119 5,23.5 C5,22.1192881 6.11928813,21 7.5,21 C8.88071187,21 10,22.1192881 10,23.5 C10,24.8807119 8.88071187,26 7.5,26 Z"
id="椭圆形-2" fill="#F5F7F9"></path>
</g>
<g id="分组-3" transform="translate(26.000000, 0.000000)">
<path
d="M9.14833827,6.45810967 L29.9558632,10.3539337 C31.5844183,10.6588505 32.6574391,12.2262392 32.3525223,13.8547943 C32.2412082,14.4493209 31.9527817,14.9963151 31.5250828,15.4240139 L14.6133819,32.3357148 C13.4418091,33.5072877 11.5423141,33.5072877 10.3707413,32.3357148 C9.94304237,31.9080159 9.65461582,31.3610217 9.54330172,30.7664952 L5.64747767,9.95897027 C5.34256086,8.33041516 6.41558171,6.76302648 8.04413682,6.45810967 C8.40903359,6.3897895 8.7834415,6.3897895 9.14833827,6.45810967 Z"
id="矩形" stroke="#C3CBD6" stroke-width="1.6" fill="#F5F7F9"
transform="translate(19.000000, 19.810632) rotate(-315.000000) translate(-19.000000, -19.810632) ">
</path>
<path
d="M21.3233535,11.0759985 L20.4899269,16.7790538 C20.4181425,17.270267 19.9968675,17.6344528 19.5004368,17.6344528 L18.94425,17.6344528 C18.4478194,17.6344528 18.0265443,17.270267 17.95476,16.7790538 L17.1213334,11.0759985 C16.9616115,9.98303798 17.718151,8.96753829 18.8111115,8.80781647 C18.9068766,8.79382166 19.0035312,8.78679656 19.1003135,8.78679656 L19.3443734,8.78679656 C20.4489429,8.78679656 21.3443734,9.68222706 21.3443734,10.7867966 C21.3443734,10.8835788 21.3373483,10.9802334 21.3233535,11.0759985 Z M19.3102341,21.4430466 L19.1930466,21.4430466 C18.4487566,21.4430466 17.8453903,20.8396803 17.8453903,20.0953903 L17.8453903,20.0953903 C17.8453903,19.3511003 18.4487566,18.7477341 19.1930466,18.7477341 L19.3102341,18.7477341 C20.0545241,18.7477341 20.6578903,19.3511003 20.6578903,20.0953903 L20.6578903,20.0953903 C20.6578903,20.8396803 20.0545241,21.4430466 19.3102341,21.4430466 Z"
id="!" fill="#C3CBD6" fill-rule="nonzero"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.2 KiB

+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.4 (67378) - http://www.bohemiancoding.com/sketch -->
<title>Avatar 1</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="72" height="72" rx="8"></rect>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="人员加选样式" transform="translate(-624.000000, -1293.000000)">
<g id="接收人" transform="translate(0.000000, 1173.000000)">
<g id="无头像" transform="translate(621.000000, 105.000000)">
<g id="Avatar-1" transform="translate(3.000000, 15.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#89A3C3" xlink:href="#path-1"></use>
<path d="M29.7887324,36.8873239 C32.4106797,41.0524165 28.0575402,42.9382866 26.2394366,43.9859155 C18.4177748,48.4357218 15,50.1023047 15,52.2676056 L15,55.2253521 C15,56.1762428 15.7112277,57 16.7746479,57 L55.2253521,57 C56.2887723,57 57,56.1762428 57,55.2253521 L57,52.2676056 C57,50.1023047 53.5822252,48.4357218 45.7605634,43.9859155 C43.9424598,42.9382866 39.5893203,41.0524165 42.2112676,36.8873239 C44.5397408,33.4294844 46.3566272,32.0209613 46.3521127,26.2394366 C46.3566272,20.7508695 42.2977463,15 36.2957746,15 C29.7022537,15 25.6433728,20.7508695 25.6478873,26.2394366 C25.6433728,32.0209613 27.4602592,33.4294844 29.7887324,36.8873239 Z" id="Fill-" fill="#E8EDEE" mask="url(#mask-2)"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+57
View File
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="122px" height="104px" viewBox="0 0 122 104" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
<title>设备异常</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="空白页" transform="translate(-194.000000, -664.000000)">
<g id="设备异常" transform="translate(194.000000, 664.000000)">
<g id="分组-10">
<g id="背景/线" fill="#C3CBD6">
<g id="-">
<g id="编组" transform="translate(14.200000, 9.200000)" fill-rule="nonzero">
<path
d="M0.8,73.1 C0.3581722,73.1 -5.68434189e-14,72.7418278 -5.68434189e-14,72.3 C-5.68434189e-14,71.8581722 0.3581722,71.5 0.8,71.5 L70.8,71.5 C71.2418278,71.5 71.6,71.8581722 71.6,72.3 C71.6,72.7418278 71.2418278,73.1 70.8,73.1 L0.8,73.1 Z M74.8,73.1 C74.3581722,73.1 74,72.7418278 74,72.3 C74,71.8581722 74.3581722,71.5 74.8,71.5 L77.3,71.5 C77.7418278,71.5 78.1,71.8581722 78.1,72.3 C78.1,72.7418278 77.7418278,73.1 77.3,73.1 L74.8,73.1 Z M83.8,73.1 C83.3581722,73.1 83,72.7418278 83,72.3 C83,71.8581722 83.3581722,71.5 83.8,71.5 L92.8,71.5 C93.2418278,71.5 93.6,71.8581722 93.6,72.3 C93.6,72.7418278 93.2418278,73.1 92.8,73.1 L83.8,73.1 Z M23.8,80.6 C23.3581722,80.6 23,80.2418278 23,79.8 C23,79.3581722 23.3581722,79 23.8,79 L30.8,79 C31.2418278,79 31.6,79.3581722 31.6,79.8 C31.6,80.2418278 31.2418278,80.6 30.8,80.6 L23.8,80.6 Z M35.3,80.6 C34.8581722,80.6 34.5,80.2418278 34.5,79.8 C34.5,79.3581722 34.8581722,79 35.3,79 L65.8,79 C66.2418278,79 66.6,79.3581722 66.6,79.8 C66.6,80.2418278 66.2418278,80.6 65.8,80.6 L35.3,80.6 Z M80,52.8 C80,51.7333333 81.6,51.7333333 81.6,52.8 L81.6,55.8 C81.6,56.2418278 81.2418278,56.6 80.8,56.6 L77.8,56.6 C76.7333333,56.6 76.7333333,55 77.8,55 L80,55 L80,52.8 Z M81.6,58.8 C81.6,59.8666667 80,59.8666667 80,58.8 L80,55.8 C80,55.3581722 80.3581722,55 80.8,55 L83.8,55 C84.8666667,55 84.8666667,56.6 83.8,56.6 L81.6,56.6 L81.6,58.8 Z M4,28.8 C4,27.7333333 5.6,27.7333333 5.6,28.8 L5.6,31.8 C5.6,32.2418278 5.2418278,32.6 4.8,32.6 L1.8,32.6 C0.733333333,32.6 0.733333333,31 1.8,31 L4,31 L4,28.8 Z M78.1,3.5 L80.8,3.5 C81.8666667,3.5 81.8666667,5.1 80.8,5.1 L78.1,5.1 L78.1,7.8 C78.1,8.86666667 76.5,8.86666667 76.5,7.8 L76.5,5.1 L73.8,5.1 C72.7333333,5.1 72.7333333,3.5 73.8,3.5 L76.5,3.5 L76.5,0.8 C76.5,-0.266666667 78.1,-0.266666667 78.1,0.8 L78.1,3.5 Z M5.6,34.8 C5.6,35.8666667 4,35.8666667 4,34.8 L4,31.8 C4,31.3581722 4.3581722,31 4.8,31 L7.8,31 C8.86666667,31 8.86666667,32.6 7.8,32.6 L5.6,32.6 L5.6,34.8 Z"
id="Path-2"></path>
<path
d="M14.0928932,61.1431458 C14.5642977,60.6717412 15.2714045,61.378848 14.8,61.8502525 L13.7393398,62.9109127 C13.5440777,63.1061748 13.2274952,63.1061748 13.032233,62.9109127 L11.9715729,61.8502525 C11.5001684,61.378848 12.2072751,60.6717412 12.6786797,61.1431458 L13.3857864,61.8502525 L14.0928932,61.1431458 Z M12.6786797,63.9715729 C12.2072751,64.4429774 11.5001684,63.7358706 11.9715729,63.2644661 L13.032233,62.2038059 C13.2274952,62.0085438 13.5440777,62.0085438 13.7393398,62.2038059 L14.8,63.2644661 C15.2714045,63.7358706 14.5642977,64.4429774 14.0928932,63.9715729 L13.3857864,63.2644661 L12.6786797,63.9715729 Z M22.9213203,8.8 C23.3927249,8.32859548 24.0998316,9.03570226 23.6284271,9.50710678 L22.567767,10.567767 C22.3725048,10.7630291 22.0559223,10.7630291 21.8606602,10.567767 L20.8,9.50710678 C20.3285955,9.03570226 21.0357023,8.32859548 21.5071068,8.8 L22.2142136,9.50710678 L22.9213203,8.8 Z M21.5071068,11.6284271 C21.0357023,12.0998316 20.3285955,11.3927249 20.8,10.9213203 L21.8606602,9.86066017 C22.0559223,9.66539803 22.3725048,9.66539803 22.567767,9.86066017 L23.6284271,10.9213203 C24.0998316,11.3927249 23.3927249,12.0998316 22.9213203,11.6284271 L22.2142136,10.9213203 L21.5071068,11.6284271 Z"
id="Path复制"></path>
</g>
</g>
</g>
<g id="分组" transform="translate(40.000000, 29.000000)">
<g id="分组-6" transform="translate(0.000000, 17.000000)" stroke="#C3CBD6">
<path
d="M1.6,33.4 L30.4,33.4 L30.4,5 C30.4,3.12223185 28.8777681,1.6 27,1.6 L5,1.6 C3.12223185,1.6 1.6,3.12223185 1.6,5 L1.6,33.4 Z"
id="路径" stroke-width="3.2" fill="#F5F7F9"></path>
<path
d="M5.6,33.4 L26.4,33.4 L26.4,10 C26.4,9.22680135 25.7731986,8.6 25,8.6 L7,8.6 C6.22680135,8.6 5.6,9.22680135 5.6,10 L5.6,33.4 Z"
id="路径" stroke-width="3.2" fill="#FFFFFF"></path>
<path d="M12,4.5 L20,4.5" id="Path-13" stroke-linecap="round" stroke-linejoin="round">
</path>
</g>
<g id="分组-4" transform="translate(11.000000, 33.000000)">
<path
d="M9,7.69933183 C8.03828322,6.56786449 6.60463859,5.85 5.00332771,5.85 C3.39831876,5.85 1.96175136,6.57118399 1,7.70717749"
id="Oval-5" stroke="#C3CBD7" stroke-width="1.6" stroke-linecap="round"
stroke-linejoin="round"></path>
<rect id="Rectangle-2" fill="#C3CBD7" x="1.13242749e-14" y="0" width="1.6" height="3">
</rect>
<rect id="Rectangle-2-Copy" fill="#C3CBD7" x="8.4" y="0" width="1.6" height="3"></rect>
</g>
<g id="分组-5" transform="translate(34.000000, 0.000000)">
<path
d="M8.09857103,21.4055708 L1.83242187,23.0667969 L3.3491463,18.6233981 C1.2750795,16.6462038 0,13.9595985 0,11 C0,4.92486775 5.372583,-3.37507799e-14 12,-3.37507799e-14 C18.627417,-3.37507799e-14 24,4.92486775 24,11 C24,17.0751322 18.627417,22 12,22 C10.634219,22 9.32172977,21.7908451 8.09857103,21.4055708 Z"
id="椭圆形-2" stroke="#C3CBD7" stroke-width="1.6" fill="#FFFFFF" stroke-linecap="round"
stroke-linejoin="round"></path>
<path
d="M14.536557,7.28920195 L13.7031303,12.9922572 C13.631346,13.4834704 13.210071,13.8476562 12.7136403,13.8476562 L12.1574535,13.8476562 C11.6610228,13.8476562 11.2397478,13.4834704 11.1679634,12.9922572 L10.3345368,7.28920195 C10.174815,6.19624142 10.9313544,5.18074173 12.0243149,5.0210199 C12.12008,5.00702509 12.2167346,5 12.3135169,5 L12.5575769,5 C13.6621464,5 14.5575769,5.8954305 14.5575769,7 C14.5575769,7.09678226 14.5505518,7.19343687 14.536557,7.28920195 Z M12.5234375,17.65625 L12.40625,17.65625 C11.66196,17.65625 11.0585938,17.0528837 11.0585938,16.3085937 L11.0585938,16.3085937 C11.0585938,15.5643038 11.66196,14.9609375 12.40625,14.9609375 L12.5234375,14.9609375 C13.2677275,14.9609375 13.8710938,15.5643038 13.8710938,16.3085937 L13.8710938,16.3085937 C13.8710938,17.0528837 13.2677275,17.65625 12.5234375,17.65625 Z"
id="!" fill="#C3CBD6" fill-rule="nonzero"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="122px" height="104px" viewBox="0 0 122 104" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
<title>加载失败</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="空白页" transform="translate(-656.000000, -196.000000)">
<g id="加载失败" transform="translate(656.000000, 196.000000)">
<g id="分组-2">
<g id="背景/线" fill="#C3CBD6">
<g id="-">
<g id="编组" transform="translate(14.200000, 9.200000)" fill-rule="nonzero">
<path
d="M0.8,73.1 C0.3581722,73.1 -5.68434189e-14,72.7418278 -5.68434189e-14,72.3 C-5.68434189e-14,71.8581722 0.3581722,71.5 0.8,71.5 L70.8,71.5 C71.2418278,71.5 71.6,71.8581722 71.6,72.3 C71.6,72.7418278 71.2418278,73.1 70.8,73.1 L0.8,73.1 Z M74.8,73.1 C74.3581722,73.1 74,72.7418278 74,72.3 C74,71.8581722 74.3581722,71.5 74.8,71.5 L77.3,71.5 C77.7418278,71.5 78.1,71.8581722 78.1,72.3 C78.1,72.7418278 77.7418278,73.1 77.3,73.1 L74.8,73.1 Z M83.8,73.1 C83.3581722,73.1 83,72.7418278 83,72.3 C83,71.8581722 83.3581722,71.5 83.8,71.5 L92.8,71.5 C93.2418278,71.5 93.6,71.8581722 93.6,72.3 C93.6,72.7418278 93.2418278,73.1 92.8,73.1 L83.8,73.1 Z M23.8,80.6 C23.3581722,80.6 23,80.2418278 23,79.8 C23,79.3581722 23.3581722,79 23.8,79 L30.8,79 C31.2418278,79 31.6,79.3581722 31.6,79.8 C31.6,80.2418278 31.2418278,80.6 30.8,80.6 L23.8,80.6 Z M35.3,80.6 C34.8581722,80.6 34.5,80.2418278 34.5,79.8 C34.5,79.3581722 34.8581722,79 35.3,79 L65.8,79 C66.2418278,79 66.6,79.3581722 66.6,79.8 C66.6,80.2418278 66.2418278,80.6 65.8,80.6 L35.3,80.6 Z M80,52.8 C80,51.7333333 81.6,51.7333333 81.6,52.8 L81.6,55.8 C81.6,56.2418278 81.2418278,56.6 80.8,56.6 L77.8,56.6 C76.7333333,56.6 76.7333333,55 77.8,55 L80,55 L80,52.8 Z M81.6,58.8 C81.6,59.8666667 80,59.8666667 80,58.8 L80,55.8 C80,55.3581722 80.3581722,55 80.8,55 L83.8,55 C84.8666667,55 84.8666667,56.6 83.8,56.6 L81.6,56.6 L81.6,58.8 Z M4,28.8 C4,27.7333333 5.6,27.7333333 5.6,28.8 L5.6,31.8 C5.6,32.2418278 5.2418278,32.6 4.8,32.6 L1.8,32.6 C0.733333333,32.6 0.733333333,31 1.8,31 L4,31 L4,28.8 Z M78.1,3.5 L80.8,3.5 C81.8666667,3.5 81.8666667,5.1 80.8,5.1 L78.1,5.1 L78.1,7.8 C78.1,8.86666667 76.5,8.86666667 76.5,7.8 L76.5,5.1 L73.8,5.1 C72.7333333,5.1 72.7333333,3.5 73.8,3.5 L76.5,3.5 L76.5,0.8 C76.5,-0.266666667 78.1,-0.266666667 78.1,0.8 L78.1,3.5 Z M5.6,34.8 C5.6,35.8666667 4,35.8666667 4,34.8 L4,31.8 C4,31.3581722 4.3581722,31 4.8,31 L7.8,31 C8.86666667,31 8.86666667,32.6 7.8,32.6 L5.6,32.6 L5.6,34.8 Z"
id="Path-2"></path>
<path
d="M14.0928932,61.1431458 C14.5642977,60.6717412 15.2714045,61.378848 14.8,61.8502525 L13.7393398,62.9109127 C13.5440777,63.1061748 13.2274952,63.1061748 13.032233,62.9109127 L11.9715729,61.8502525 C11.5001684,61.378848 12.2072751,60.6717412 12.6786797,61.1431458 L13.3857864,61.8502525 L14.0928932,61.1431458 Z M12.6786797,63.9715729 C12.2072751,64.4429774 11.5001684,63.7358706 11.9715729,63.2644661 L13.032233,62.2038059 C13.2274952,62.0085438 13.5440777,62.0085438 13.7393398,62.2038059 L14.8,63.2644661 C15.2714045,63.7358706 14.5642977,64.4429774 14.0928932,63.9715729 L13.3857864,63.2644661 L12.6786797,63.9715729 Z M22.9213203,8.8 C23.3927249,8.32859548 24.0998316,9.03570226 23.6284271,9.50710678 L22.567767,10.567767 C22.3725048,10.7630291 22.0559223,10.7630291 21.8606602,10.567767 L20.8,9.50710678 C20.3285955,9.03570226 21.0357023,8.32859548 21.5071068,8.8 L22.2142136,9.50710678 L22.9213203,8.8 Z M21.5071068,11.6284271 C21.0357023,12.0998316 20.3285955,11.3927249 20.8,10.9213203 L21.8606602,9.86066017 C22.0559223,9.66539803 22.3725048,9.66539803 22.567767,9.86066017 L23.6284271,10.9213203 C24.0998316,11.3927249 23.3927249,12.0998316 22.9213203,11.6284271 L22.2142136,10.9213203 L21.5071068,11.6284271 Z"
id="Path复制"></path>
</g>
</g>
</g>
<g id="Group-5" transform="translate(37.000000, 31.000000)">
<path
d="M3.6,-2.84217094e-14 L30.4072871,-2.84217094e-14 L27.4517754,3.85678998 L35.6344891,8.39734605 L35.7782771,17.5 L41.0920043,8.39734605 L35.7782771,3.85678998 L41.017146,-2.84217094e-14 L42.4,-2.84217094e-14 C44.3882251,-2.87869405e-14 46,1.6117749 46,3.6 L46,38.4 C46,40.3882251 44.3882251,42 42.4,42 L3.6,42 C1.6117749,42 2.01984419e-15,40.3882251 1.77635684e-15,38.4 L-4.4408921e-16,3.6 C-6.8757656e-16,1.6117749 1.6117749,-2.71683e-14 3.6,-2.7533531e-14 Z"
id="Rectangle-5-Copy" stroke="#C3CBD7" stroke-width="1.6" fill="#FFFFFF"
stroke-linejoin="round"></path>
<g id="分组" transform="translate(15.000000, 16.000000)">
<path
d="M15.9730021,16.9792648 C14.0528141,14.7201485 11.190363,13.2868421 7.99314522,13.2868421 C4.78854382,13.2868421 1.92025706,14.7267763 -8.52651283e-14,16.9949296"
id="Oval-5" stroke="#C3CBD6" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round"></path>
<rect id="Rectangle-2" fill="#C3CBD6" x="0.343145224" y="5.77315973e-15" width="2.41578947"
height="5.63684211"></rect>
<rect id="Rectangle-2-Copy" fill="#C3CBD6" x="14.0326189" y="5.77315973e-15"
width="2.41578947" height="5.63684211"></rect>
</g>
<path
d="M5.22972094,8.02029448 C4.48081619,7.51339926 4.22785484,6.39804561 4.66471594,5.52908238 C5.10157705,4.66011915 6.0628302,4.36660503 6.81173495,4.87350025 L14.3470633,9.97377755 C15.095968,10.4806728 15.3489294,11.5960264 14.9120683,12.4649897 C14.4752072,13.3339529 13.513954,13.627467 12.7650493,13.1205718 L5.22972094,8.02029448 Z"
id="Path-4" stroke="#C3CBD7" stroke-width="0.9" fill="#F5F7F9" fill-rule="nonzero"></path>
<path
d="M11.8360167,3.81761246 C12.48046,3.14463266 13.4730665,3.20525021 14.0530655,3.95300555 C14.6330645,4.70076088 14.580822,5.85249428 13.9363787,6.52547408 L7.65693847,13.0829735 C7.01249518,13.7559533 6.01988861,13.6953357 5.43988965,12.9475804 C4.85989069,12.1998251 4.91213314,11.0480917 5.55657643,10.3751119 L11.8360167,3.81761246 Z"
id="Path-4-Copy" stroke="#C3CBD7" stroke-width="0.9" fill="#F5F7F9" fill-rule="nonzero">
</path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.9 KiB

+43
View File
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="122px" height="104px" viewBox="0 0 122 104" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
<title>暂无数据</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="空白页" transform="translate(-810.000000, -352.000000)">
<g id="暂无数据" transform="translate(810.000000, 352.000000)">
<g id="分组-6">
<g id="背景/线" fill="#C3CBD6">
<g id="-">
<g id="编组" transform="translate(14.200000, 9.200000)" fill-rule="nonzero">
<path
d="M0.8,73.1 C0.3581722,73.1 -5.68434189e-14,72.7418278 -5.68434189e-14,72.3 C-5.68434189e-14,71.8581722 0.3581722,71.5 0.8,71.5 L70.8,71.5 C71.2418278,71.5 71.6,71.8581722 71.6,72.3 C71.6,72.7418278 71.2418278,73.1 70.8,73.1 L0.8,73.1 Z M74.8,73.1 C74.3581722,73.1 74,72.7418278 74,72.3 C74,71.8581722 74.3581722,71.5 74.8,71.5 L77.3,71.5 C77.7418278,71.5 78.1,71.8581722 78.1,72.3 C78.1,72.7418278 77.7418278,73.1 77.3,73.1 L74.8,73.1 Z M83.8,73.1 C83.3581722,73.1 83,72.7418278 83,72.3 C83,71.8581722 83.3581722,71.5 83.8,71.5 L92.8,71.5 C93.2418278,71.5 93.6,71.8581722 93.6,72.3 C93.6,72.7418278 93.2418278,73.1 92.8,73.1 L83.8,73.1 Z M23.8,80.6 C23.3581722,80.6 23,80.2418278 23,79.8 C23,79.3581722 23.3581722,79 23.8,79 L30.8,79 C31.2418278,79 31.6,79.3581722 31.6,79.8 C31.6,80.2418278 31.2418278,80.6 30.8,80.6 L23.8,80.6 Z M35.3,80.6 C34.8581722,80.6 34.5,80.2418278 34.5,79.8 C34.5,79.3581722 34.8581722,79 35.3,79 L65.8,79 C66.2418278,79 66.6,79.3581722 66.6,79.8 C66.6,80.2418278 66.2418278,80.6 65.8,80.6 L35.3,80.6 Z M80,52.8 C80,51.7333333 81.6,51.7333333 81.6,52.8 L81.6,55.8 C81.6,56.2418278 81.2418278,56.6 80.8,56.6 L77.8,56.6 C76.7333333,56.6 76.7333333,55 77.8,55 L80,55 L80,52.8 Z M81.6,58.8 C81.6,59.8666667 80,59.8666667 80,58.8 L80,55.8 C80,55.3581722 80.3581722,55 80.8,55 L83.8,55 C84.8666667,55 84.8666667,56.6 83.8,56.6 L81.6,56.6 L81.6,58.8 Z M4,28.8 C4,27.7333333 5.6,27.7333333 5.6,28.8 L5.6,31.8 C5.6,32.2418278 5.2418278,32.6 4.8,32.6 L1.8,32.6 C0.733333333,32.6 0.733333333,31 1.8,31 L4,31 L4,28.8 Z M78.1,3.5 L80.8,3.5 C81.8666667,3.5 81.8666667,5.1 80.8,5.1 L78.1,5.1 L78.1,7.8 C78.1,8.86666667 76.5,8.86666667 76.5,7.8 L76.5,5.1 L73.8,5.1 C72.7333333,5.1 72.7333333,3.5 73.8,3.5 L76.5,3.5 L76.5,0.8 C76.5,-0.266666667 78.1,-0.266666667 78.1,0.8 L78.1,3.5 Z M5.6,34.8 C5.6,35.8666667 4,35.8666667 4,34.8 L4,31.8 C4,31.3581722 4.3581722,31 4.8,31 L7.8,31 C8.86666667,31 8.86666667,32.6 7.8,32.6 L5.6,32.6 L5.6,34.8 Z"
id="Path-2"></path>
<path
d="M14.0928932,61.1431458 C14.5642977,60.6717412 15.2714045,61.378848 14.8,61.8502525 L13.7393398,62.9109127 C13.5440777,63.1061748 13.2274952,63.1061748 13.032233,62.9109127 L11.9715729,61.8502525 C11.5001684,61.378848 12.2072751,60.6717412 12.6786797,61.1431458 L13.3857864,61.8502525 L14.0928932,61.1431458 Z M12.6786797,63.9715729 C12.2072751,64.4429774 11.5001684,63.7358706 11.9715729,63.2644661 L13.032233,62.2038059 C13.2274952,62.0085438 13.5440777,62.0085438 13.7393398,62.2038059 L14.8,63.2644661 C15.2714045,63.7358706 14.5642977,64.4429774 14.0928932,63.9715729 L13.3857864,63.2644661 L12.6786797,63.9715729 Z M22.9213203,8.8 C23.3927249,8.32859548 24.0998316,9.03570226 23.6284271,9.50710678 L22.567767,10.567767 C22.3725048,10.7630291 22.0559223,10.7630291 21.8606602,10.567767 L20.8,9.50710678 C20.3285955,9.03570226 21.0357023,8.32859548 21.5071068,8.8 L22.2142136,9.50710678 L22.9213203,8.8 Z M21.5071068,11.6284271 C21.0357023,12.0998316 20.3285955,11.3927249 20.8,10.9213203 L21.8606602,9.86066017 C22.0559223,9.66539803 22.3725048,9.66539803 22.567767,9.86066017 L23.6284271,10.9213203 C24.0998316,11.3927249 23.3927249,12.0998316 22.9213203,11.6284271 L22.2142136,10.9213203 L21.5071068,11.6284271 Z"
id="Path复制"></path>
</g>
</g>
</g>
<g id="Group-3" transform="translate(44.000000, 33.000000)">
<path
d="M34,13 C34,14 34,36.3333333 34,38 C34,39.1045695 33.1045695,40 32,40 L2,40 C0.8954305,40 0,39.1045695 0,38 L0,2 C0,0.8954305 0.8954305,0 2,0 L22,0"
id="Rectangle-4" fill="#FFFFFF"></path>
<path
d="M32.4,13.6255741 L21.29947,1.6 L2,1.6 C1.7790861,1.6 1.6,1.7790861 1.6,2 L1.6,38 C1.6,38.2209139 1.7790861,38.4 2,38.4 L32,38.4 C32.2209139,38.4 32.4,38.2209139 32.4,38 C32.4,37.536087 32.4,37.536087 32.4,36.5248672 C32.4,35.2790874 32.4,35.2790874 32.4,33.6423742 C32.4,29.8998278 32.4,29.8998278 32.4,25.531788 C32.4,21.0228437 32.4,21.0228437 32.4,17.201898 C32.4,15.5494247 32.4,15.5494247 32.4,14.3269505 C32.4,13.9990726 32.4,13.7826584 32.4,13.6255741 Z"
id="Rectangle-4-Copy-2" stroke="#C3CBD6" stroke-width="3.2"></path>
<path
d="M22.8,2.0461204 L22.8,11 C22.8,11.6627417 23.3372583,12.2 24,12.2 L32.1728119,12.2 L22.8,2.0461204 Z"
id="Rectangle-4-Copy" stroke="#C3CBD6" stroke-width="1.6"></path>
<path
d="M11.4542125,11.4239785 L11.4542125,16.3586731 L11.4542125,11.4239785 Z M20.5805173,16.7015396 L16.650796,19.8070435 L20.5805173,16.7015396 Z M23.7751015,26.6475524 L18.8480956,25.5374876 L23.7751015,26.6475524 Z"
id="路径-7" stroke="#C3CAD7" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
transform="translate(17.000000, 20.000000) rotate(-52.000000) translate(-17.000000, -20.000000) ">
</path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="122px" height="104px" viewBox="0 0 122 104" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
<title>暂无网络</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="空白页" transform="translate(-194.000000, -352.000000)">
<g id="暂无网络" transform="translate(194.000000, 352.000000)">
<g id="分组-9">
<g id="背景/线" fill="#C3CBD6">
<g id="-">
<g id="编组" transform="translate(14.200000, 9.200000)" fill-rule="nonzero">
<path
d="M0.8,73.1 C0.3581722,73.1 -5.68434189e-14,72.7418278 -5.68434189e-14,72.3 C-5.68434189e-14,71.8581722 0.3581722,71.5 0.8,71.5 L70.8,71.5 C71.2418278,71.5 71.6,71.8581722 71.6,72.3 C71.6,72.7418278 71.2418278,73.1 70.8,73.1 L0.8,73.1 Z M74.8,73.1 C74.3581722,73.1 74,72.7418278 74,72.3 C74,71.8581722 74.3581722,71.5 74.8,71.5 L77.3,71.5 C77.7418278,71.5 78.1,71.8581722 78.1,72.3 C78.1,72.7418278 77.7418278,73.1 77.3,73.1 L74.8,73.1 Z M83.8,73.1 C83.3581722,73.1 83,72.7418278 83,72.3 C83,71.8581722 83.3581722,71.5 83.8,71.5 L92.8,71.5 C93.2418278,71.5 93.6,71.8581722 93.6,72.3 C93.6,72.7418278 93.2418278,73.1 92.8,73.1 L83.8,73.1 Z M23.8,80.6 C23.3581722,80.6 23,80.2418278 23,79.8 C23,79.3581722 23.3581722,79 23.8,79 L30.8,79 C31.2418278,79 31.6,79.3581722 31.6,79.8 C31.6,80.2418278 31.2418278,80.6 30.8,80.6 L23.8,80.6 Z M35.3,80.6 C34.8581722,80.6 34.5,80.2418278 34.5,79.8 C34.5,79.3581722 34.8581722,79 35.3,79 L65.8,79 C66.2418278,79 66.6,79.3581722 66.6,79.8 C66.6,80.2418278 66.2418278,80.6 65.8,80.6 L35.3,80.6 Z M80,52.8 C80,51.7333333 81.6,51.7333333 81.6,52.8 L81.6,55.8 C81.6,56.2418278 81.2418278,56.6 80.8,56.6 L77.8,56.6 C76.7333333,56.6 76.7333333,55 77.8,55 L80,55 L80,52.8 Z M81.6,58.8 C81.6,59.8666667 80,59.8666667 80,58.8 L80,55.8 C80,55.3581722 80.3581722,55 80.8,55 L83.8,55 C84.8666667,55 84.8666667,56.6 83.8,56.6 L81.6,56.6 L81.6,58.8 Z M4,28.8 C4,27.7333333 5.6,27.7333333 5.6,28.8 L5.6,31.8 C5.6,32.2418278 5.2418278,32.6 4.8,32.6 L1.8,32.6 C0.733333333,32.6 0.733333333,31 1.8,31 L4,31 L4,28.8 Z M78.1,3.5 L80.8,3.5 C81.8666667,3.5 81.8666667,5.1 80.8,5.1 L78.1,5.1 L78.1,7.8 C78.1,8.86666667 76.5,8.86666667 76.5,7.8 L76.5,5.1 L73.8,5.1 C72.7333333,5.1 72.7333333,3.5 73.8,3.5 L76.5,3.5 L76.5,0.8 C76.5,-0.266666667 78.1,-0.266666667 78.1,0.8 L78.1,3.5 Z M5.6,34.8 C5.6,35.8666667 4,35.8666667 4,34.8 L4,31.8 C4,31.3581722 4.3581722,31 4.8,31 L7.8,31 C8.86666667,31 8.86666667,32.6 7.8,32.6 L5.6,32.6 L5.6,34.8 Z"
id="Path-2"></path>
<path
d="M14.0928932,61.1431458 C14.5642977,60.6717412 15.2714045,61.378848 14.8,61.8502525 L13.7393398,62.9109127 C13.5440777,63.1061748 13.2274952,63.1061748 13.032233,62.9109127 L11.9715729,61.8502525 C11.5001684,61.378848 12.2072751,60.6717412 12.6786797,61.1431458 L13.3857864,61.8502525 L14.0928932,61.1431458 Z M12.6786797,63.9715729 C12.2072751,64.4429774 11.5001684,63.7358706 11.9715729,63.2644661 L13.032233,62.2038059 C13.2274952,62.0085438 13.5440777,62.0085438 13.7393398,62.2038059 L14.8,63.2644661 C15.2714045,63.7358706 14.5642977,64.4429774 14.0928932,63.9715729 L13.3857864,63.2644661 L12.6786797,63.9715729 Z M22.9213203,8.8 C23.3927249,8.32859548 24.0998316,9.03570226 23.6284271,9.50710678 L22.567767,10.567767 C22.3725048,10.7630291 22.0559223,10.7630291 21.8606602,10.567767 L20.8,9.50710678 C20.3285955,9.03570226 21.0357023,8.32859548 21.5071068,8.8 L22.2142136,9.50710678 L22.9213203,8.8 Z M21.5071068,11.6284271 C21.0357023,12.0998316 20.3285955,11.3927249 20.8,10.9213203 L21.8606602,9.86066017 C22.0559223,9.66539803 22.3725048,9.66539803 22.567767,9.86066017 L23.6284271,10.9213203 C24.0998316,11.3927249 23.3927249,12.0998316 22.9213203,11.6284271 L22.2142136,10.9213203 L21.5071068,11.6284271 Z"
id="Path复制"></path>
</g>
</g>
</g>
<g id="分组-6" transform="translate(27.500000, 15.500000)" stroke="#C3CBD6" stroke-linecap="round">
<polygon id="矩形" stroke-width="1.6" fill="#F5F7F9" points="19.5 49.5 27.5 54.5 28.5 66 16.5 66">
</polygon>
<g id="分组-5"
transform="translate(35.500000, 35.000000) rotate(-51.000000) translate(-35.500000, -35.000000) translate(12.000000, 9.000000)">
<path
d="M0.42054796,31.1181657 C2.52157938,43.6998318 11.9709042,51.960893 16.8,51.875 L16.8,51.875 C16.8,51.875 16.8,2.6897583 16.8,0.125 C12.9202424,-0.247549371 0.0138708573,10.5896135 -2.89901436e-12,26"
id="路径" stroke-width="1.792" fill="#F5F7F9"></path>
<path
d="M27.8973291,22.4816327 C27.1543301,9.85556681 22.4690335,0.125 16.8,0.125 C10.6144108,0.125 5.6,11.7096321 5.6,26 C5.6,40.2903679 10.6144108,51.875 16.8,51.875 L16.8,51.875 C22.444067,51.875 27.1130429,42.2299514 27.8872834,29.685014"
id="路径" stroke-width="1.792" fill="#FFFFFF"></path>
<path d="M17.8,26.5 L31.8,25.4599698" id="路径-2" stroke-width="1.6"></path>
<path
d="M41.4065227,35.920355 C44.7777499,33.6814529 47,29.8502436 47,25.5 C47,21.1103143 44.7372705,17.2491173 41.314543,15.0191405"
id="路径" stroke-width="1.6"></path>
<path
d="M37.7782636,32.2474861 C40.2775986,31.0309243 42,28.4666063 42,25.5 C42,22.4666448 40.1992184,19.8538847 37.6083888,18.6724534"
id="路径" stroke-width="1.6"></path>
<circle id="椭圆形" stroke-width="1.6" fill="#F5F7F9" cx="34.5" cy="25.5" r="2.5"></circle>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="122px" height="104px" viewBox="0 0 122 104" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
<title>暂无权限</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="空白页" transform="translate(-40.000000, -352.000000)">
<g id="暂无权限" transform="translate(40.000000, 352.000000)">
<g id="分组-4">
<path
d="M15,82.3 C14.5581722,82.3 14.2,81.9418278 14.2,81.5 C14.2,81.0581722 14.5581722,80.7 15,80.7 L85,80.7 C85.4418278,80.7 85.8,81.0581722 85.8,81.5 C85.8,81.9418278 85.4418278,82.3 85,82.3 L15,82.3 Z M89,82.3 C88.5581722,82.3 88.2,81.9418278 88.2,81.5 C88.2,81.0581722 88.5581722,80.7 89,80.7 L91.5,80.7 C91.9418278,80.7 92.3,81.0581722 92.3,81.5 C92.3,81.9418278 91.9418278,82.3 91.5,82.3 L89,82.3 Z M98,82.3 C97.5581722,82.3 97.2,81.9418278 97.2,81.5 C97.2,81.0581722 97.5581722,80.7 98,80.7 L107,80.7 C107.441828,80.7 107.8,81.0581722 107.8,81.5 C107.8,81.9418278 107.441828,82.3 107,82.3 L98,82.3 Z M38,89.8 C37.5581722,89.8 37.2,89.4418278 37.2,89 C37.2,88.5581722 37.5581722,88.2 38,88.2 L45,88.2 C45.4418278,88.2 45.8,88.5581722 45.8,89 C45.8,89.4418278 45.4418278,89.8 45,89.8 L38,89.8 Z M49.5,89.8 C49.0581722,89.8 48.7,89.4418278 48.7,89 C48.7,88.5581722 49.0581722,88.2 49.5,88.2 L80,88.2 C80.4418278,88.2 80.8,88.5581722 80.8,89 C80.8,89.4418278 80.4418278,89.8 80,89.8 L49.5,89.8 Z M94.2,62 C94.2,60.9333333 95.8,60.9333333 95.8,62 L95.8,65 C95.8,65.4418278 95.4418278,65.8 95,65.8 L92,65.8 C90.9333333,65.8 90.9333333,64.2 92,64.2 L94.2,64.2 L94.2,62 Z M95.8,68 C95.8,69.0666667 94.2,69.0666667 94.2,68 L94.2,65 C94.2,64.5581722 94.5581722,64.2 95,64.2 L98,64.2 C99.0666667,64.2 99.0666667,65.8 98,65.8 L95.8,65.8 L95.8,68 Z M18.2,38 C18.2,36.9333333 19.8,36.9333333 19.8,38 L19.8,41 C19.8,41.4418278 19.4418278,41.8 19,41.8 L16,41.8 C14.9333333,41.8 14.9333333,40.2 16,40.2 L18.2,40.2 L18.2,38 Z M92.3,12.7 L95,12.7 C96.0666667,12.7 96.0666667,14.3 95,14.3 L92.3,14.3 L92.3,17 C92.3,18.0666667 90.7,18.0666667 90.7,17 L90.7,14.3 L88,14.3 C86.9333333,14.3 86.9333333,12.7 88,12.7 L90.7,12.7 L90.7,10 C90.7,8.93333333 92.3,8.93333333 92.3,10 L92.3,12.7 Z M19.8,44 C19.8,45.0666667 18.2,45.0666667 18.2,44 L18.2,41 C18.2,40.5581722 18.5581722,40.2 19,40.2 L22,40.2 C23.0666667,40.2 23.0666667,41.8 22,41.8 L19.8,41.8 L19.8,44 Z M28.2928932,70.3431458 C28.7642977,69.8717412 29.4714045,70.578848 29,71.0502525 L27.9393398,72.1109127 C27.7440777,72.3061748 27.4274952,72.3061748 27.232233,72.1109127 L26.1715729,71.0502525 C25.7001684,70.578848 26.4072751,69.8717412 26.8786797,70.3431458 L27.5857864,71.0502525 L28.2928932,70.3431458 Z M26.8786797,73.1715729 C26.4072751,73.6429774 25.7001684,72.9358706 26.1715729,72.4644661 L27.232233,71.4038059 C27.4274952,71.2085438 27.7440777,71.2085438 27.9393398,71.4038059 L29,72.4644661 C29.4714045,72.9358706 28.7642977,73.6429774 28.2928932,73.1715729 L27.5857864,72.4644661 L26.8786797,73.1715729 Z M54.1213203,22 C54.5927249,21.5285955 55.2998316,22.2357023 54.8284271,22.7071068 L53.767767,23.767767 C53.5725048,23.9630291 53.2559223,23.9630291 53.0606602,23.767767 L52,22.7071068 C51.5285955,22.2357023 52.2357023,21.5285955 52.7071068,22 L53.4142136,22.7071068 L54.1213203,22 Z M52.7071068,24.8284271 C52.2357023,25.2998316 51.5285955,24.5927249 52,24.1213203 L53.0606602,23.0606602 C53.2559223,22.865398 53.5725048,22.865398 53.767767,23.0606602 L54.8284271,24.1213203 C55.2998316,24.5927249 54.5927249,25.2998316 54.1213203,24.8284271 L53.4142136,24.1213203 L52.7071068,24.8284271 Z"
id="Path" fill="#C3CBD6" fill-rule="nonzero"></path>
<g id="分组" transform="translate(35.000000, 35.000000)">
<path
d="M2,0 L50,0 C51.1045695,-2.02906125e-16 52,0.8954305 52,2 L52,36 C52,37.1045695 51.1045695,38 50,38 L2,38 C0.8954305,38 1.3527075e-16,37.1045695 0,36 L0,2 C-1.3527075e-16,0.8954305 0.8954305,2.02906125e-16 2,0 Z"
id="矩形" stroke="#C3CBD6" stroke-width="1.6" fill="#FFFFFF" stroke-linecap="round"
stroke-linejoin="round"></path>
<g id="Group-7" transform="translate(19.000000, 16.000000)">
<path
d="M11.3076923,7 L11.3076923,2.15384615 C11.3076923,0.964384615 10.3433077,0 9.15384615,0 L4.84615385,0 C3.65669231,0 2.69230769,0.964384615 2.69230769,2.15384615 L2.69230769,7"
id="Stroke-3" stroke="#C3CBD6" stroke-width="1.63333333" stroke-linecap="round"
stroke-linejoin="round"></path>
<path
d="M12.9230769,7 L1.07692308,7 C0.482461538,7 0,7.48246154 0,8.07692308 L0,12.9230769 C0,13.5175385 0.482461538,14 1.07692308,14 L12.9230769,14 C13.5175385,14 14,13.5175385 14,12.9230769 L14,8.07692308 C14,7.48246154 13.5175385,7 12.9230769,7 Z"
id="Stroke-1" stroke="#C3CBD6" stroke-width="1.16666667" fill="#F5F7F9"
stroke-linecap="round" stroke-linejoin="round"></path>
<path
d="M6.84709814,10.15 L7.15290186,10.15 C7.31868836,10.15 7.46173214,10.2663143 7.495545,10.428616 L7.78721167,11.828616 C7.82663596,12.0178526 7.7051891,12.2032189 7.51595251,12.2426431 C7.49247276,12.2475348 7.4685524,12.25 7.44456852,12.25 L6.55543148,12.25 C6.36213182,12.25 6.20543148,12.0932997 6.20543148,11.9 C6.20543148,11.8760161 6.20789672,11.8520958 6.21278833,11.828616 L6.504455,10.428616 C6.53826786,10.2663143 6.68131164,10.15 6.84709814,10.15 Z"
id="Path" fill="#C3CBD6"></path>
</g>
<path
d="M2,0 L50,0 C51.1045695,-2.02906125e-16 52,0.8954305 52,2 L52,7 L0,7 L0,2 C-1.3527075e-16,0.8954305 0.8954305,2.02906125e-16 2,0 Z"
id="矩形-copy" stroke="#C3CBD6" stroke-width="1.6" fill="#F5F7F9" stroke-linecap="round"
stroke-linejoin="round"></path>
<circle id="椭圆形" fill="#C3CBD6" cx="10.5" cy="3.5" r="1.5"></circle>
<path
d="M4.49841309,3.04333496 L4.49841309,2.04333496 C4.49841309,1.76719259 4.72227071,1.54333496 4.99841309,1.54333496 C5.27455546,1.54333496 5.49841309,1.76719259 5.49841309,2.04333496 L5.49841309,3.04333496 L6.49841309,3.04333496 C6.77455546,3.04333496 6.99841309,3.26719259 6.99841309,3.54333496 C6.99841309,3.81947734 6.77455546,4.04333496 6.49841309,4.04333496 L5.49841309,4.04333496 L5.49841309,5.04333496 C5.49841309,5.31947734 5.27455546,5.54333496 4.99841309,5.54333496 C4.72227071,5.54333496 4.49841309,5.31947734 4.49841309,5.04333496 L4.49841309,4.04333496 L3.49841309,4.04333496 C3.22227071,4.04333496 2.99841309,3.81947734 2.99841309,3.54333496 C2.99841309,3.26719259 3.22227071,3.04333496 3.49841309,3.04333496 L4.49841309,3.04333496 Z"
id="路径" fill="#C3CBD6" fill-rule="nonzero"
transform="translate(4.998413, 3.543335) rotate(-45.000000) translate(-4.998413, -3.543335) ">
</path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

+15
View File
@@ -0,0 +1,15 @@
import { toHump } from "@/lib/util";
const icon = (iconName: string) => {
if (!iconName) return;
const name = toHump(iconName, "-");
if(name === "IconInbox" || name === "IconSendDoc" || name === "IconSetting") {
const svgIcon = () => import(`./svgIcon/${name}.vue`);
return defineAsyncComponent(svgIcon);
}else{
const antdIcons = () => import(`../../node_modules/@ant-design/icons-vue/es/icons/${name}.js`);
return defineAsyncComponent(antdIcons);
}
};
export default icon;
+34
View File
@@ -0,0 +1,34 @@
<script setup lang="ts">
defineOptions({
name: "IconAndText"
});
const props = defineProps<{
icon?: string;
text?: string;
width?: number | string;
height?: number | string;
}>();
const defaultIcon = new URL("../../assets/svg/failed.svg", import.meta.url).href;
const defaultText = "抱歉,出现意外错误了";
const iconStyle = computed(() => {
let str = "";
if (props.width) str += "width:" + props.width + "px";
if (props.height) {
str += props.width ? ";" : "";
str += "height:" + props.height + "px";
}
return str;
});
</script>
<template>
<div class="xtbg-tips-page-image" :style="iconStyle">
<img :src="icon || defaultIcon">
</div>
<div class="xtbg-tips-page-text">
<p>{{ text || defaultText }}</p>
</div>
</template>
+121
View File
@@ -0,0 +1,121 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import type { ButtonType } from "ant-design-vue/es/button/buttonTypes";
import { logout } from "../../api";
import IconAndText from "./iconAndText.vue";
defineOptions({
name: "CustomAbnormal"
});
interface buttonItem {
text: string;
code: string;
type: ButtonType;
handler(): void;
}
interface buttonInfo {
logout: buttonItem;
back: buttonItem;
reload: buttonItem;
home: buttonItem;
}
const props = defineProps<{
icon?: string;
text?: string;
from?: LocationQueryValue;
buttonHidden?: boolean;
buttonList?: Array<string>;
}>();
const router = useRouter();
const defaultIcon = new URL("../../assets/svg/failed.svg", import.meta.url).href;
const defaultText = "抱歉,出现意外错误了";
const backHandler = () => {
router.back();
};
const homeHandler = () => {
router.push({
path: "/"
});
};
const logoutHandler = () => {
logout();
};
const reloadHandler = () => {
router.push({
path: props.from || "/"
});
};
const defaultButtonList = ["logout", "reload"]; // logout, back, reload, home
const renderButtonList = (props.buttonList && props.buttonList.length > 0) ? props.buttonList : defaultButtonList;
const buttonItemInfo: buttonInfo = {
"logout": {
text: "退出",
type: "default",
code: "logout",
handler: logoutHandler
},
"reload": {
text: "重试",
type: "primary",
code: "reload",
handler: reloadHandler
},
"back": {
text: "返回",
type: "default",
code: "back",
handler: backHandler
},
"home": {
text: "首页",
type: "primary",
code: "home",
handler: homeHandler
}
};
const renderItemList = computed(() => {
const arr = [];
for (let index = 0; index < renderButtonList.length; index++) {
const key = renderButtonList[index];
const item = buttonItemInfo[key as keyof typeof buttonItemInfo];
arr.push(item);
}
return arr;
});
</script>
<template>
<div class="xtbg-tips-page">
<IconAndText :icon="icon || defaultIcon" :text="text || defaultText" />
<div v-if="!buttonHidden" class="xtbg-tips-page-btn">
<template v-if="$slots.button">
<slot name="button"></slot>
</template>
<template v-else>
<a-button
v-for="item in renderItemList"
:key="item.code"
class="xtbg-tips-page-btn-class"
:type="item.type"
@click="item.handler"
>
{{ item.text }}
</a-button>
</template>
</div>
</div>
</template>
+254
View File
@@ -0,0 +1,254 @@
<script lang="ts" setup>
import type { TableProps, TableColumnsType, PaginationProps } from "ant-design-vue";
import Tooltip from "@/components/tooltip/index.vue";
import type { Columns } from "./interface";
import { getTableWidth } from "@/lib/util";
defineOptions({
name: "BaseTable"
});
interface Props {
api?: (params:any) => Promise<any>
columns: Columns
searchData?: Record<string, any> //查询参数
autoGet?: boolean //首次是否自动加载
activedAotuGet?: boolean //onActivated生命周期是否自动执行
showNumber?: boolean //是否显示序号
showSelection?: boolean //行是否可选择
customSelection?: TableProps["rowSelection"]
showTablePage?: boolean //是否使用表格内置分页
rowKey?: string
[propName: string]: any
}
type Key = number | string
const props = withDefaults(defineProps<Props>(), {
api: undefined,
columns: () => [],
searchData: () => ({}),
autoGet: true,
showSelection: false,
showNumber: false,
showTablePage: true,
customSelection: undefined,
activedAotuGet: true,
rowKey: "id"
});
interface TableState extends TableProps {
tableConfig: any[]
tableLoading: boolean
page: PaginationProps
numberObj?: {
title: string
dataIndex: string
align?: string
width?: number | string
[propName: string]: any
}
selectedRowKeys?: Key[]
rowSelection?: TableProps["rowSelection"]
[propName: string]: any
}
const state = reactive<TableState>({
tableConfig: [],
tableLoading: false,
//分页配置
page: {
total: 0,
current: 1,
pageSize: 10,
showQuickJumper: true,
showSizeChanger: true,
showTotal: (total: number) => {
return `共 ${total} 条`;
},
pageSizeOptions: ["10", "20", "30", "40", "50"]
},
numberObj: {
title: "序号",
dataIndex: "number",
align: "center",
fixed: "left",
width: 70
},
tableData: [],
selectedRowKeys: []
});
const { tableConfig, tableLoading, page, tableData } = toRefs(state);
const emit = defineEmits<{
(e: "onSelectChange", keys: Key[], row: any[]): void
}>();
const init = () => {
state.tableConfig = props.columns.slice();
if (props.showNumber) {
state.tableConfig.unshift(state.numberObj);
}
getData();
};
onMounted(() => {
init();
});
onActivated(() => {
if (props.activedAotuGet) {
init();
}
});
const getData = async () => {
state.tableLoading = true;
state.selectedRowKeys = [];
const { current: page, pageSize: limit } = state.page;
const params = {
page,
limit,
...props.searchData
};
if (props.api) {
const { data, count, errcode } = await props.api(params);
state.tableLoading = false;
if (errcode !== 0) return;
state.tableData = data || [];
state.page.total = +count || 0;
}
};
const handleTableChange = (pager: PaginationProps) => {
state.page.current = pager?.current;
state.page.pageSize = pager?.pageSize;
getData();
};
const pageChange = (page: number, pageSize: number) => {
state.page.current = page;
state.page.pageSize = pageSize;
getData();
};
const onSelectChange = (selectedRowKeys: Key[], selectedRows: TableColumnsType) => {
// console.log(selectedRowKeys, selectedRows);
state.selectedRowKeys = selectedRowKeys;
emit("onSelectChange", selectedRowKeys, selectedRows);
};
const rowSelection = computed((): TableProps["rowSelection"] => {
const defaultRows = {
fixed: true,
selectedRowKeys: state.selectedRowKeys,
onChange: onSelectChange
};
const newRows = props.customSelection ? Object.assign(defaultRows, props.customSelection) : defaultRows;
return newRows;
});
const tableScroll = computed(() => getTableWidth(props.columns, 300));
watch(
() => props.searchData,
() => {
state.page.current = 1;
getData();
},
{
deep: true
}
);
defineExpose({ getData, init, tableLoading, tableData });
</script>
<template>
<div class="base-table">
<a-table class="base-table-content"
bordered
:scroll="{ x: tableScroll }"
v-bind="$attrs"
:loading="tableLoading"
:row-key="(record:any) => record[rowKey]"
:columns="tableConfig ? tableConfig : columns"
:data-source="tableData"
:pagination="showTablePage ? page : false"
:row-selection="showSelection ? rowSelection : undefined"
:row-class-name="(_record:any, index: number) => (index % 2 === 1 ? 'table-striped' : '')"
@change="handleTableChange"
>
<template #bodyCell="{ column, record, index, text }">
<!-- {{ column }}---{{ record }}---{{ index }} -->
<template v-if="page && showNumber && column.dataIndex === 'number'">
{{ ((page.current || 1) - 1) * (page.pageSize || 10) + index + 1 }}
</template>
<template v-if="column.type === 'slot'">
<tooltip v-if="column.ellipsis">
<div class="ell">
<slot :name="column.slotName || column.key" v-bind="{ column, record, index }" />
</div>
</tooltip>
<slot v-else :name="column.slotName || column.key" v-bind="{ column, record, index, text }" />
</template>
<template v-if="column.textEllipsis">
<tooltip>
<div class="ell">{{ text }}</div>
</tooltip>
</template>
<template v-if="column.type === 'collapse-slot'">
<a-collapse v-if="record[column.dataIndex]?.length > 0"
:expand-icon-position="column.position || 'right'"
:ghost="column.ghost || true"
>
<a-collapse-panel :key="record[rowKey]"
:header="column.collapseHeader"
:show-arrow="record[column.dataIndex].length > 1 ? true : false"
>
<template #header>
<slot name="collapseHd" v-bind="{ column, record, index, text }" />
</template>
<slot name="collapseContent" v-bind="{ column, record, index, text }" />
</a-collapse-panel>
</a-collapse>
</template>
</template>
</a-table>
<a-pagination v-if="!showTablePage && (page.total || 0) > 0"
class="base-table-page"
:total="page.total"
:show-total="(total: number) => `共 ${total} 条`"
:show-quick-jumper="page.showQuickJumper"
:show-size-changer="page.showSizeChanger"
:page-size-options="page.pageSizeOptions"
@change="pageChange"
@show-size-change="pageChange"
/>
</div>
</template>
<style lang="less" scoped>
.base-table {
flex: 1;
display: flex;
flex-direction: column;
&-content {
flex: 1;
overflow-y: auto;
}
&-page {
height: 60px;
display: flex;
align-items: center;
justify-content: end;
}
}
.base-table :deep(.table-striped) td {
background-color: #fafafa;
}
</style>
+6
View File
@@ -0,0 +1,6 @@
import type { TableColumnsType } from "ant-design-vue";
export interface Columns extends TableColumnsType {
type?: string
slotName?: string
}
+158
View File
@@ -0,0 +1,158 @@
<script setup lang="ts">
import pinia from "../../store/pinia";
import { baseInfo } from "../../store";
import {
// viewImg,
logout } from "../../api";
import AsyncIcons from "@/components/AsyncIcons";
defineOptions({
name: "XtbgHeader"
});
const {VITE_APP_NAME} = import.meta.env;
const baseInfoStore = baseInfo(pinia);
const userInfo = baseInfoStore.userInfo;
const defaultAvatar = new URL("../../assets/svg/default_head.svg", import.meta.url)
.href;
// const logo = new URL("../../assets/images/logo.png", import.meta.url).href;
const userProfile = computed(() => {
// const avatar = userInfo && userInfo.avatar;
// if (avatar) return viewImg(avatar);
return defaultAvatar;
});
const clickLogoutHandler = () => {
logout();
};
</script>
<template>
<div class="xtbg-header">
<div class="xtbg-header-left">
<!-- <div class="xtbg-logo">
<img :src="logo" :alt="VITE_APP_NAME" />
</div> -->
<div class="xtbg-org">
<h1>{{ VITE_APP_NAME }}</h1>
</div>
</div>
<div class="xtbg-header-right">
<div v-if="userInfo.userId" class="xtbg-header-right-info">
<div class="xtbg-header-right-info-image">
<img
:src="userProfile"
:onerror="defaultAvatar"
:alt="userInfo.userName"
/>
</div>
<div class="xtbg-header-right-info-text">
<p>{{ userInfo.userName }}</p>
</div>
</div>
<div class="xtbg-header-right-loginout">
<component :is="AsyncIcons(`poweroff-outlined`)" style="margin-right: 6px; color: #fff" />
<span class="loginout-button" @click="clickLogoutHandler">退出</span>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.xtbg-header {
height: 56px;
padding: 0 20px;
// background-color: #3177ec;
background-color: @colorPrimary;
box-shadow: 0 1px 0 0 #e7ebf0;
display: flex;
justify-content: space-between;
&-left {
display: flex;
align-items: center;
justify-content: center;
.xtbg-logo {
width: 30px;
// height: 34px;
margin: 0 14px;
&>img {
width: 100%;
height: 100%;
display: block;
}
}
.xtbg-org {
font-family: PingFangSC-Medium;
&>h1 {
font-size: 18px;
line-height: 26px;
margin: 0;
color: #fff;
}
}
}
&-right {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
// padding-right: 18px;
&-info {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
&-image {
width: 24px;
height: 24px;
border-radius: 50%;
overflow: hidden;
&>img {
width: 100%;
height: 100%;
display: block;
}
}
&-text {
margin-left: 8px;
line-height: 16px;
font-size: 14px;
color: #fff;
font-family: PingFangSC-Regular;
padding-right: 14px;
border-right: 1px solid rgba(255, 255, 255, 0.5);
&>p {
margin: 0;
}
}
}
&-loginout {
padding-left: 14px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
&>.loginout-button {
cursor: pointer;
font-size: 14px;
color: #fff;
font-family: PingFangSC-Regular;
}
}
}
}
</style>
+58
View File
@@ -0,0 +1,58 @@
<script setup lang="ts">
defineOptions({
name: "FormWrap"
});
withDefaults(
defineProps<{
label: string
labelAlign: string
labelWidth: number
controlWidth: number
labelStyle: any
labelFormStyle: any
controlStyle: any
}>(),
{
label: "",
labelAlign: "right",
labelWidth: 100,
controlWidth: 200,
labelStyle: () => ({}),
labelFormStyle: () => ({}),
controlStyle: () => ({})
}
);
</script>
<template>
<div class="label-form" :style="labelFormStyle">
<div
class="label-form-label"
:style="{
'text-align': labelAlign,
'width': `${labelWidth}px`,
...labelStyle,
}"
>
<label>{{ label }}</label>
</div>
<div class="label-form-control" :style="{ width: `${controlWidth}px`, ...controlStyle }">
<slot></slot>
</div>
</div>
</template>
<style lang="less" scoped>
.label-form {
display: flex;
// height: 32px;
margin-bottom: 26px;
&-label {
height: 100%;
line-height: 32px;
font-size: 14px;
color: #62667a;
margin-right: 8px;
}
}
</style>
+236
View File
@@ -0,0 +1,236 @@
<script setup lang="ts">
import type { SearchFormData } from "./interface";
import AsyncIcons from "../AsyncIcons";
defineOptions({
name: "searchForm"
});
const props = withDefaults(
defineProps<{
searchForm: SearchFormData[]
showFooter?: boolean
showAdd?: boolean
addName?: string
showDelete?: boolean
showExport?: boolean
showImport?: boolean
}>(),
{
searchForm: () => [],
showFooter: false,
showAdd: false,
addName: "",
showDelete: false,
showExport: false,
showImport: false
}
);
const state = reactive<{ form: any; otherForm: any }>({
form: {},
otherForm: {}
});
const emit = defineEmits<{
(e: "search", searchParams: any): void
(e: "reset", form: any): void
(e: "exportAll"): void
(e: "batchImport"): void
(e: "muchDelete"): void
(e: "addClick"): void
}>();
const search = () => {
const searchParams = {
...state.form,
...state.otherForm
};
emit("search", searchParams);
};
const reset = () => {
state.form = {};
state.otherForm = {};
emit("reset", state.form);
};
const dateChange = (date: any, dateString: any, item: any) => {
console.log(date, dateString, item);
const { type, rows, key } = item;
if (type === "datePicker") {
state.otherForm[key] = dateString;
} else if (type === "rangePicker" && dateString?.length >= 2 && rows?.length >= 2) {
state.otherForm[rows[0]] = dateString[0];
state.otherForm[rows[1]] = dateString[1];
}
};
const exportAll = () => {
emit("exportAll");
};
const batchImport = () => {
emit("batchImport");
};
const muchDelete = () => {
emit("muchDelete");
};
const addClick = () => {
emit("addClick");
};
</script>
<template>
<div class="search-form">
<div class="search-form-top">
<div class="search-form-content">
<form-wrap
v-for="(item, index) in props.searchForm"
:key="item.key || index"
:label="item.label || ''"
:label-style="item.labelStyle"
:control-style="item.controlStyle"
:label-align="item.labelAlign || 'right'"
:label-width="item.labelWidth || 100"
:control-width="item.controlWidth || 200"
:label-form-style="item.labelFormStyle"
>
<template v-if="item.type === 'input' || !item.type">
<a-input v-model:value="state.form[item.key]" placeholder="请输入" />
</template>
<template v-if="item.type === 'inputNUmber'">
<a-input
v-model="state.form[item.key]"
type="number"
style="width: 100px; text-align: center"
placeholder="请输入"
/>
<a-input
style="width: 30px; border-left: 0; pointer-events: none; backgroundcolor: #fff"
placeholder="~"
disabled
/>
<a-input
v-model="state.form[item.key2]"
type="number"
style="width: 100px; text-align: center; border-left: 0"
placeholder="请输入"
/>
</template>
<template v-if="item.type === 'select'">
<a-select
v-model:value="state.form[item.key]"
allow-clear
style="width: 100%"
placeholder="请选择"
>
<a-select-option
v-for="(v, key) in item.options"
:key="key"
style="width: 100%; z-index: 999"
:value="v.value"
>{{ v.label }}</a-select-option>
</a-select>
</template>
<template v-if="item.type === 'treeSelect'">
<a-tree-select
v-model="state.form[item.key]"
style="width: 100%"
placeholder="请选择"
:tree-data="item.treeData ? item.treeData : []"
:replace-fields="item.replaceFields ? item.replaceFields : null"
@change="(date:any, dateString:any) => dateChange(date, dateString, item)"
></a-tree-select>
</template>
<template v-if="item.type === 'datePicker'">
<a-date-picker
v-model:value="state.form[item.key]"
style="width: 100%"
:format="item.format ? item.format : 'YY-MM-DD HH:mm'"
:show-time="item.showTime ? item.showTime : { format: 'HH:mm' }"
/>
</template>
<template v-if="item.type === 'rangePicker'">
<a-range-picker
v-model:value="state.form[item.key]"
style="width: 100%"
:format="item.format ? item.format : 'YYYY-MM-DD HH:mm'"
:show-time="item.showTime ? item.showTime : { format: 'HH:mm' }"
@change="(date:any, dateString:any) => dateChange(date, dateString, item)"
/>
</template>
<template v-if="item.type === 'slot'">
<slot :name="item.key" />
</template>
</form-wrap>
</div>
<div class="search-form-btn-wrap">
<a-button class="mr8" @click="reset">重置</a-button>
<a-button type="primary" @click="search">查询</a-button>
</div>
</div>
<div v-if="props.showFooter" class="search-form-footer">
<a-button
v-if="props.showAdd"
type="primary"
class="mr15"
@click="addClick"
>
<template #icon>
<component :is="AsyncIcons('plus-outlined')"/>
</template>
{{ addName }}
</a-button>
<a-button
v-if="props.showDelete"
class="mr15"
@click="muchDelete"
>批量删除</a-button>
<a-button
v-if="props.showExport"
class="mr15"
@click="exportAll"
>全部导出</a-button>
<a-button
v-if="props.showImport"
class="mr15"
@click="batchImport"
>批量导入</a-button>
<slot name="footer" />
</div>
</div>
</template>
<style lang="less" scoped>
.search-form {
width: 100%;
padding-bottom: 20px;
&-top {
display: flex;
padding: 20px 16px 0 16px;
background: #f8f9fa 100%;
.search-form-content {
flex: 1;
display: flex;
flex-wrap: wrap;
}
.search-form-btn-wrap {
width: 150px;
margin-bottom: 20px;
}
}
&-footer {
display: flex;
justify-content: flex-start;
margin-top: 16px;
}
}
.mr8 {
margin-right: 8px;
}
.mr15 {
margin-right: 15px;
}
</style>
+24
View File
@@ -0,0 +1,24 @@
export interface SearchFormData {
key?: any
key2?: any
label?: string
type?: "input" | "inputNUmber" | "select" | "treeSelect" | "datePicker" | "rangePicker" | "slot"
options?: {
label?: string
value?: any
}[]
rows?: any
startTime?: string
endTime?: string
controlWidth?: number
labelStyle?: any
controlStyle?: any
labelAlign?: string
deleteKey?: string
labelWidth?: number
labelFormStyle?: any
treeData?: any[]
replaceFields?: any
format?: string
showTime?: boolean
}
+60
View File
@@ -0,0 +1,60 @@
<script setup lang="ts">
import type { AsyncComponentLoader } from "vue";
import WordIcon from "./WordIcon.vue";
import { testLink, firstWord } from "@/lib/util";
defineOptions({
name: "SubMenu"
});
interface menuItem {
id: string;
name: string;
highLight: string;
icon: string;
url: string;
fullUrl: string;
iconComponent?: AsyncComponentLoader;
children?: Array<menuItem>;
}
defineProps<{
menuInfo: menuItem;
collapsed?: boolean;
}>();
</script>
<template>
<a-sub-menu v-if="menuInfo.children && menuInfo.children.length > 0" :key="`sub_menu_${menuInfo.id}`">
<template #icon>
<word-icon v-if="!menuInfo.icon && collapsed" :word="firstWord(menuInfo.name)" />
<template v-if="menuInfo.icon">
<component :is="menuInfo.iconComponent" />
</template>
</template>
<template #title>{{ menuInfo.name }}</template>
<template v-for="item in menuInfo.children" :key="item.id">
<sub-menu :menu-info="item" />
</template>
</a-sub-menu>
<a-menu-item v-else :key="`menu_item_${menuInfo.id}`">
<template #icon>
<word-icon v-if="!menuInfo.icon && collapsed" :word="firstWord(menuInfo.name)" />
<template v-if="menuInfo.icon">
<component :is="menuInfo.iconComponent" />
</template>
</template>
<a
v-if="testLink(menuInfo.url)"
target="_blank"
:href="menuInfo.url"
>
{{ menuInfo.name }}
</a>
<router-link v-else :to="menuInfo.url">
{{ menuInfo.name }}
</router-link>
</a-menu-item>
</template>
<style lang="less" scoped></style>
+26
View File
@@ -0,0 +1,26 @@
<script setup lang="ts">
defineOptions({
name: "WordIcon"
});
defineProps<{
word: string;
}>();
</script>
<template>
<i class="word-iocn">
<span>{{ word }}</span>
</i>
</template>
<style lang="less" scoped>
.word-iocn {
&>span {
border-style: solid;
border-width: 1px;
border-radius: 2px;
}
}
</style>
+100
View File
@@ -0,0 +1,100 @@
<script setup lang="ts">
import pinia from "@/store/pinia";
import { menuStore } from "@/store";
// import { testLink, firstWord } from "../lib/util";
import SubMenu from "./SubMenu.vue";
import IconAndText from "../abnormal/iconAndText.vue";
import AsyncIcons from "../AsyncIcons";
defineOptions({
name: "SideMenu"
});
const emptyIcon = new URL("@/assets/svg/no_data.svg", import.meta.url).href;
const menuStoreData = menuStore(pinia);
const { menu, loading, error, errorMsg, menuEmpty } = storeToRefs(menuStoreData);
// if (!menuComplate) {
// menuStoreData.menuTree();
// }
menuStoreData.menuTree();
const emit = defineEmits<{
(e: "updateCollapsed", collapsed: boolean): void
}>();
const collapsed = ref<boolean>(false);
const collapsedHangdler = () => {
collapsed.value = !collapsed.value;
emit("updateCollapsed", collapsed.value);
};
</script>
<template>
<div class="xtbg-side-menu">
<div v-if="loading" class="xtbg-side-menu-loading">
<a-spin tip="加载中···" />
</div>
<div v-else-if="error" class="xtbg-side-menu-error">
<IconAndText
width="130"
height="130"
:text="errorMsg"
/>
</div>
<div v-else-if="menuEmpty" class="xtbg-side-menu-empty">
<IconAndText
width="130"
height="130"
text="该系统还未配置菜单"
:icon="emptyIcon"
/>
</div>
<div v-else class="xtbg-side-menu-layout">
<a-menu mode="inline" class="xtbg-side-menu-layout-main">
<template v-for="item in menu" :key="item.id">
<sub-menu :menu-info="item" :collapsed="collapsed" />
</template>
</a-menu>
<div class="xtbg-side-menu-layout-footer" @click="collapsedHangdler">
<component :is="AsyncIcons(collapsed ? 'menu-unfold-outlined' : 'menu-fold-outlined')" />
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.xtbg-side-menu {
height: 100%;
&-error,
&-loading,
&-empty {
padding-top: 20px;
display: flex;
flex-direction: column;
align-items: center;
}
&-layout {
padding-top: 8px;
height: 100%;
display: flex;
flex-direction: column;
&-main {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
&-footer {
height: 48px;
line-height: 48px;
font-size: 18px;
padding-left: 16px;
box-shadow: 0px -1px 0px 0px rgba(232, 232, 232, 1);
cursor: pointer;
}
}
}
</style>
+88
View File
@@ -0,0 +1,88 @@
<script setup lang="ts">
defineOptions({
name: "IconInbox"
});
const props = defineProps<{
class?: string;
}>();
const className = props.class || "";
</script>
<template>
<svg
:class="className"
focusable="false"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
viewBox="0 0 26 22"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<g
id="1.-待收件"
stroke="none"
stroke-width="1"
fill="none"
fill-rule="evenodd"
>
<g
id="导航栏"
transform="translate(-42.000000, -74.000000)"
fill-rule="nonzero"
>
<g id="任务管理">
<g transform="translate(0.000000, 61.000000)">
<g id="导航一" transform="translate(40.000000, 9.000000)">
<rect
id="矩形"
x="0"
y="0"
width="30"
height="30"
></rect>
<polygon
id="路径-2"
stroke="#334254"
stroke-width="2"
points="5 5 3 8 3 25 27 25 27 9 15 9 12 5"
>
</polygon>
<polygon
id="Star"
fill="#334254"
points="19 20 16.648859 21.236068 17.097887 18.618034 15.1957739 16.763932 17.8244295 16.381966 19 14 20.1755705 16.381966 22.8042261 16.763932 20.902113 18.618034 21.351141 21.236068"
>
</polygon>
<polygon
id="Path"
fill="#334254"
points="11 14 6 14 6 16 11 16"
></polygon>
<polygon
id="Path"
fill="#334254"
points="6 19 11 19 11 17 6 17"
></polygon>
<polygon
id="Path-Copy"
fill="#334254"
points="6 22 11 22 11 20 6 20"
></polygon>
<polygon
id="Path"
fill="#334254"
points="6 13 13 13 13 11 6 11"
></polygon>
</g>
</g>
</g>
</g>
</g>
</svg>
</template>
+78
View File
@@ -0,0 +1,78 @@
<script setup lang="ts">
defineOptions({
name: "IconSendDoc"
});
const props = defineProps<{
class?: string;
}>();
const className = props.class || "";
</script>
<template>
<svg
:class="className"
focusable="false"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
viewBox="0 0 24 25"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<g
id="1.-待收件"
stroke="none"
stroke-width="1"
fill="none"
fill-rule="evenodd"
>
<g
id="导航栏"
transform="translate(-43.000000, -264.000000)"
fill-rule="nonzero"
>
<g id="分组-4">
<g transform="translate(0.000000, 253.000000)">
<g id="导航二" transform="translate(40.000000, 9.000000)">
<rect
id="矩形"
x="0"
y="0"
width="30"
height="30"
></rect>
<polygon
id="路径-4"
stroke="#334254"
stroke-width="2"
points="6 15 6 3 20 3 24 6 24 12 16 12 13 15"
>
</polygon>
<polygon
id="路径-3"
stroke="#334254"
stroke-width="2"
points="4 15 4 26 26 26 26 12 16 12 13 15"
></polygon>
<polygon
id="Shape"
fill="#334254"
points="23 20 18 20 18 18 23 18"
></polygon>
<polygon
id="Shape"
fill="#334254"
points="23 23 18 23 18 21 23 21"
></polygon>
</g>
</g>
</g>
</g>
</g>
</svg>
</template>
+95
View File
@@ -0,0 +1,95 @@
<script setup lang="ts">
defineOptions({
name: "IconSetting"
});
const props = defineProps<{
class?: string;
}>();
const className = props.class || "";
</script>
<template>
<svg
:class="className"
focusable="false"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
viewBox="0 0 24 22"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<g
id="1.-待收件"
stroke="none"
stroke-width="1"
fill="none"
fill-rule="evenodd"
>
<g
id="导航栏"
transform="translate(-43.000000, -554.000000)"
fill-rule="nonzero"
>
<g id="分组-4-copy-2">
<g transform="translate(0.000000, 541.000000)">
<g id="配置管理" transform="translate(40.000000, 9.000000)">
<rect
id="矩形"
x="0"
y="0"
width="30"
height="30"
></rect>
<rect
id="矩形"
stroke="#334254"
stroke-width="2"
x="4"
y="5"
width="22"
height="16"
></rect>
<circle
id="椭圆形"
fill="#334254"
cx="12"
cy="13"
r="1"
></circle>
<rect
id="矩形"
fill="#334254"
x="13"
y="21"
width="4"
height="4"
></rect>
<g
id="分组-2"
transform="translate(14.414214, 12.828427) rotate(-315.000000) translate(-14.414214, -12.828427) translate(11.414214, 9.828427)"
fill="#334254"
>
<polygon id="矩形-copy-4" points="4 1.87133117e-13 6 1.87133117e-13 6 5.41421356 4 5.41421356"></polygon>
<polygon id="矩形-copy" points="0.585786438 6.23501251e-13 6 -3.07753822e-13 6 2 0.585786438 2"></polygon>
</g>
<rect
id="矩形"
fill="#334254"
x="7"
y="24"
width="16"
height="2"
></rect>
</g>
</g>
</g>
</g>
</g>
</svg>
</template>
+45
View File
@@ -0,0 +1,45 @@
<script setup lang="ts">
defineOptions({
name: "CustomTooltip"
});
interface Props {
placement?: any
title?: string
}
withDefaults(defineProps<Props>(), {
placement: "top",
title: ""
});
const visible = ref(false);
const contentRef = ref();
function onVisibleChange(val: any) {
const disabled = judgeDisabled();
visible.value = disabled ? false : val;
}
const elRef = computed(() => contentRef.value?.children[0] || {});
function judgeDisabled() {
const el = elRef.value;
return el.scrollWidth === el.offsetWidth && el.scrollHeight === el.offsetHeight;
}
</script>
<template>
<a-tooltip
:visible="visible"
:placement="placement"
:title="title || elRef?.innerText"
@visible-change="onVisibleChange"
>
<div ref="contentRef" class="tooltip-content">
<slot />
</div>
</a-tooltip>
</template>
<style lang="less" scoped></style>
+26
View File
@@ -0,0 +1,26 @@
import type { App } from "vue";
import {
Button,
Layout,
Menu,
Image,
Spin,
Table,
Tooltip,
Collapse,
Pagination
} from "ant-design-vue/es";
const install = function (app: App) {
app.use(Button);
app.use(Layout);
app.use(Menu);
app.use(Image);
app.use(Spin);
app.use(Table);
app.use(Tooltip);
app.use(Collapse);
app.use(Pagination);
};
export { install };
+3
View File
@@ -0,0 +1,3 @@
import axios from "./request";
export default axios;
+34
View File
@@ -0,0 +1,34 @@
import axios from "axios";
axios.defaults.headers.common["Request-Type"] = "ajax";
axios.interceptors.response.use(
function (response) {
// 对响应数据做点什么
const { errcode } = response.data || {};
if (errcode === 401) {
const {
data: { authorizeURI }
} = response.data;
let currentURI = location.href;
currentURI = encodeURIComponent(currentURI);
currentURI = encodeURIComponent(currentURI);
let redirectURI = authorizeURI;
redirectURI = redirectURI.replace("REDIRECT_URI", currentURI);
const hostNames = ["127.0.0.1", "localhost"];
if (hostNames.includes(location.hostname)) {
console.log("当前cookie失效");
} else {
location.replace(redirectURI);
}
}
const data = response.data || JSON.parse(response.request.responseText);
return data;
},
function (error) {
return Promise.reject(error);
}
);
export default axios;
+52
View File
@@ -0,0 +1,52 @@
import type { TableColumnsType } from "ant-design-vue";
// 随机长度字符串
export const randomString = function (len: number) {
len = len || 10;
const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const maxPos = chars.length;
let str = "";
for (let i = 0; i < len; i++) {
str += chars.charAt(Math.floor(Math.random() * maxPos));
}
return str;
};
export const testLink = function (url: string) {
const re = new RegExp("^(http|https)://.*");
return re.test(url);
};
export const firstWord = function (str: string) {
str = str.trim();
const strArray = str.split("");
return strArray[0] || "";
};
export const getTableWidth = (columns: TableColumnsType, otherWidth: number) => {
let width = 0;
for (let index = 0; index < columns.length; index++) {
const element = columns[index];
if (element.width) {
width += Number(element.width) || otherWidth;
} else {
width += otherWidth;
}
}
return width;
};
/**
* @param str 字符串
* @param separator 分割符(默认"-")
* @param topIsCapital 开头是否大写(默认是)
*/
export const toHump = function (str:string, separator = "-", topIsCapital = true) {
const strAry = str.split(separator);
return strAry.map((item:string, index) => {
if(!topIsCapital && index === 0) return item;
const firstChar = item.match(/^./)?.[0];
return firstChar ? item.replace(/^./, firstChar.toLocaleUpperCase()) : item;
}).join("");
};
+15
View File
@@ -0,0 +1,15 @@
import "./styles/index.less";
import { createApp } from "vue";
import routes from "./routes";
import App from "./App.vue";
import pinia from "./store/pinia";
import { install } from "./installComponents";
const app = createApp(App);
app.use(pinia);
app.use(routes);
install(app);
app.mount("#app");
+21
View File
@@ -0,0 +1,21 @@
<script setup lang="ts">
import exTable from "./example/index.vue";
defineOptions({
name: "AppHome"
});
</script>
<template>
<div class="home">
<exTable />
</div>
</template>
<style lang="less" scoped>
.home {
height: 100%;
.ant-btn {
margin-bottom: 20px;
}
}
</style>
+62
View File
@@ -0,0 +1,62 @@
<script setup lang="ts">
import pinia from "../store/pinia";
import { baseInfo } from "../store";
defineOptions({
name: "AppIniting"
});
const route = useRoute();
const router = useRouter();
const baseInfoStore = baseInfo(pinia);
const rediret: any = route.query.rediret;
baseInfoStore
.loginUserInfo()
.then((res: any) => {
const { errcode, errmsg } = res;
if (errcode === 401) return;
if (errcode === 0) {
router.replace(rediret);
} else if (errcode === 400) {
router.replace({
path: "/noaccess",
query: {
from: rediret,
text: errmsg || "未能获取您的用户信息"
}
});
} else {
router.replace({
path: "/500",
query: {
from: rediret,
text: errmsg || "服务器发生未知错误!"
}
});
}
})
.catch(() => {
router.replace({
path: "/failed",
query: {
from: rediret,
text: "出现意外错误!"
}
});
});
</script>
<template>
<div class="xtbg-spin-box">
<div class="xtbg-spin xtbg-spin-spinning">
<span class="xtbg-spin-dot xtbg-spin-dot-spin">
<i class="xtbg-spin-dot-item"></i>
<i class="xtbg-spin-dot-item"></i>
<i class="xtbg-spin-dot-item"></i>
<i class="xtbg-spin-dot-item"></i>
</span>
</div>
</div>
</template>
<style lang="less" scoped></style>
+51
View File
@@ -0,0 +1,51 @@
<script setup lang="ts">
import XtbgHeader from "../components/header/index.vue";
import SideMenu from "../components/sideMenu/index.vue";
defineOptions({
name: "LayoutMain"
});
const collapsed = ref<boolean>(false);
const updateCollapsed = (val: boolean) => {
collapsed.value = val;
};
</script>
<template>
<a-layout class="xtbg-layout">
<a-layout-header class="xtbg-layout-header">
<xtbg-header />
</a-layout-header>
<a-layout>
<a-layout-sider
v-model:collapsed="collapsed"
class="xtbg-layout-sider"
width="232"
:trigger="null"
collapsible
collapsed-width="64"
>
<side-menu @update-collapsed="updateCollapsed" />
</a-layout-sider>
<a-layout-content>
<router-view />
</a-layout-content>
</a-layout>
</a-layout>
</template>
<style lang="less" scoped>
.xtbg-layout {
height: 100%;
&-header {
height: 56px;
padding: 0;
background-color: #3177ec;
box-shadow: 0 1px 0 0 #e7ebf0;
}
&-sider {
background-color: #fff;
}
}
</style>
+27
View File
@@ -0,0 +1,27 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import Abnormal from "../../components/abnormal/index.vue";
defineOptions({
name: "DeviceAbnormal"
});
defineProps<{
text?: string;
}>();
const route = useRoute();
const from: LocationQueryValue = route.query.from as LocationQueryValue;
const msg: LocationQueryValue = route.query.text as LocationQueryValue;
const icon = new URL("../../assets/svg/device_abnormal.svg", import.meta.url).href;
const defaultText = "您的设备好像无法打开该网页";
</script>
<template>
<Abnormal
:icon="icon"
:text="text || msg || defaultText"
:from="from"
/>
</template>
+28
View File
@@ -0,0 +1,28 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import Abnormal from "../../components/abnormal/index.vue";
defineOptions({
name: "AppError404"
});
defineProps<{
text?: string;
}>();
const route = useRoute();
const from: LocationQueryValue = route.query.from as LocationQueryValue;
const icon = new URL("../../assets/svg/404.svg", import.meta.url).href;
const defaultText = "您访问的页面飞走了";
</script>
<template>
<Abnormal
:icon="icon"
:text="text || defaultText"
:from="from"
:button-list="['back', 'home']"
/>
</template>
+28
View File
@@ -0,0 +1,28 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import Abnormal from "../../components/abnormal/index.vue";
defineOptions({
name: "AppError500"
});
defineProps<{
text?: string;
}>();
const route = useRoute();
const from: LocationQueryValue = route.query.from as LocationQueryValue;
const msg: LocationQueryValue = route.query.text as LocationQueryValue;
const icon = new URL("../../assets/svg/500.svg", import.meta.url).href;
const defaultText = "抱歉,服务器出了一点小问题";
</script>
<template>
<Abnormal
:icon="icon"
:text="text || msg || defaultText"
:from="from"
/>
</template>
+29
View File
@@ -0,0 +1,29 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import Abnormal from "../../components/abnormal/index.vue";
defineOptions({
name: "AppFailed"
});
defineProps<{
text?: string;
}>();
const route = useRoute();
const from: LocationQueryValue = route.query.from as LocationQueryValue;
const msg: LocationQueryValue = route.query.text as LocationQueryValue;
const icon = new URL("../../assets/svg/failed.svg", import.meta.url).href;
const defaultText = "发生未知错误";
</script>
<template>
<Abnormal
:icon="icon"
:text="text || msg || defaultText"
:from="from"
:button-list="['back', 'reload']"
/>
</template>
+28
View File
@@ -0,0 +1,28 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import Abnormal from "../../components/abnormal/index.vue";
defineOptions({
name: "NoAccess"
});
defineProps<{
text?: string;
}>();
const route = useRoute();
const from: LocationQueryValue = route.query.from as LocationQueryValue;
const msg: LocationQueryValue = route.query.text as LocationQueryValue;
const icon = new URL("../../assets/svg/no_permission.svg", import.meta.url).href;
const defaultText = "您尚未开通访问权限";
</script>
<template>
<Abnormal
:icon="icon"
:text="text || msg || defaultText"
:from="from"
/>
</template>
+29
View File
@@ -0,0 +1,29 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import Abnormal from "../../components/abnormal/index.vue";
defineOptions({
name: "NoData"
});
defineProps<{
text?: string;
}>();
const route = useRoute();
const from: LocationQueryValue = route.query.from as LocationQueryValue;
const msg: LocationQueryValue = route.query.text as LocationQueryValue;
const icon = new URL("../../assets/svg/no_data.svg", import.meta.url).href;
const defaultText = "暂无数据";
</script>
<template>
<Abnormal
:icon="icon"
:text="text || msg || defaultText"
:from="from"
:button-list="['back', 'home']"
/>
</template>
+29
View File
@@ -0,0 +1,29 @@
<script setup lang="ts">
import type { LocationQueryValue } from "vue-router";
import Abnormal from "../../components/abnormal/index.vue";
defineOptions({
name: "NoNetwork"
});
defineProps<{
text?: string;
}>();
const route = useRoute();
const from: LocationQueryValue = route.query.from as LocationQueryValue;
const msg: LocationQueryValue = route.query.text as LocationQueryValue;
const icon = new URL("../../assets/svg/no_network.svg", import.meta.url).href;
const defaultText = "糟糕,好像网络出现了异常";
</script>
<template>
<Abnormal
:icon="icon"
:text="text || msg || defaultText"
:from="from"
:button-list="['back', 'reload']"
/>
</template>
+130
View File
@@ -0,0 +1,130 @@
<script setup lang="ts">
import { getMenuTree } from "@/api";
import type { SearchFormData } from "@/components/searchForm/interface";
defineOptions({
name: "exTable"
});
const { push } = useRouter();
const menuTree = () => {
return getMenuTree("appmanage");
};
const searchDataForm: SearchFormData[] = [
{
key: "id",
label: "ID"
},
{
key: "name",
label: "创建人"
}
];
const columns = [
{
title: "url",
dataIndex: "url",
width: 200
},
{
title: "名称",
dataIndex: "name",
width: 200
},
{
title: "是否菜单",
dataIndex: "ismenu",
width: 200,
type: "slot",
slotName: "ismenu",
fixed: "right"
},
{
title: "操作",
dataIndex: "operation",
width: 220,
fixed: "right",
type: "slot",
slotName: "operation"
}
];
const tableRef = ref();
const selectedKeys = ref<any>([]);
const searchData = ref<any>({});
const getData = () => {
if (tableRef.value) tableRef.value.getData();
};
const onDelete = (type = "batch", id?: string) => {
const deleteIds = type === "batch" ? selectedKeys.value : id ? [id] : [];
console.log("deleteIds", deleteIds);
getData();
};
const onSelectChange = (ids: any) => {
selectedKeys.value = ids;
};
const onSearch = (data?: any) => {
searchData.value = {
...data
};
};
</script>
<template>
<div class="table">
<search-form
:search-form="searchDataForm"
add-name="新增"
show-footer
show-add
show-delete
@add-click="push({ name: 'home' })"
@much-delete="onDelete"
@search="onSearch"
@reset="onSearch"
>
</search-form>
<base-table
ref="tableRef"
:columns="columns"
:search-data="searchData"
:api="menuTree"
row-key="id"
show-selection
@on-select-change="onSelectChange"
>
<template #ismenu="{ record }">
<a-tag v-if="record.ismenu" color="success">是</a-tag>
<a-tag v-else color="default">否</a-tag>
</template>
<template #operation="{ record }">
<a-button type="link" @click="onDelete(record.id)">删除</a-button>
</template>
</base-table>
</div>
</template>
<style lang="less" scoped>
.table {
padding: 20px;
// background-color: #fff;
height: 100%;
overflow-y: auto;
}
.collapse-tag {
word-break: break-all;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
white-space: normal;
}
</style>
+31
View File
@@ -0,0 +1,31 @@
import routes from "./routes";
import pinia from "../store/pinia";
import { baseInfo } from "../store";
const baseInfoStore = baseInfo(pinia);
const history = createWebHashHistory();
const router = createRouter({
history,
routes: routes
});
router.beforeEach((to, _from, next) => {
if (to.meta && to.meta.power) {
const user = baseInfoStore.userInfo;
if (user.userId) {
next();
} else {
next({
path: "/initing",
query: {
rediret: to.fullPath
}
});
}
} else {
next();
}
});
export default router;
+39
View File
@@ -0,0 +1,39 @@
const routes = [
{ path: "/initing", name: "initing", component: () => import("../pages/Initing.vue") },
{
path: "/",
name: "main",
redirect: "/home",
component: () => import("../pages/LayoutMain.vue"),
children: [
{ path: "/home", name: "home", meta: { power: true }, component: () => import("../pages/Home.vue") },
{ path: "/inner_failed/:text?", name: "inner_failed", props: true, meta: { power: true }, component: () => import("../pages/error/Failed.vue") },
{ path: "/inner_500/:text?", name: "inner_500", props: true, meta: { power: true }, component: () => import("../pages/error/Error500.vue") },
{
path: "/inner_noaccess/:text?",
name: "inner_noaccess",
props: true,
meta: { power: true },
component: () => import("../pages/error/NoAccess.vue")
},
{
path: "/inner_empty/:text?",
name: "inner_empty",
props: true,
meta: { power: true },
component: () => import("../pages/error/NoData.vue")
}
]
},
{ path: "/nonetwork:text?", name: "network", props: true, component: () => import("../pages/error/NoNetwork.vue") },
{ path: "/noaccess/:text?", name: "noaccess", props: true, component: () => import("../pages/error/NoAccess.vue") },
{ path: "/empty/:text?", name: "empty", props: true, component: () => import("../pages/error/NoData.vue") },
{ path: "/deviceabnormal/:text?", name: "deviceabnormal", props: true, component: () => import("../pages/error/DeviceAbnormal.vue") },
{ path: "/failed/:text?", name: "failed", props: true, component: () => import("../pages/error/Failed.vue") },
{ path: "/500/:text?", name: "error500", props: true, component: () => import("../pages/error/Error500.vue") },
{ path: "/404", name: "error404", component: () => import("../pages/error/Error404.vue") },
{ path: "/:catchAll(.*)", redirect: "/404", hidden: true }
];
export default routes;
+28
View File
@@ -0,0 +1,28 @@
import { getUserInfo } from "../api";
const baseInfo = defineStore("baseInfo", () => {
const user = ref<any>({});
const loginUserInfo = () => {
return new Promise((resolve, reject) => {
getUserInfo({})
.then((res: any) => {
const { errcode, data } = res;
if (errcode === 0) {
const info = data;
user.value = info;
}
resolve(res);
})
.catch((err: any) => {
reject(err);
});
});
};
const userInfo = computed(() => {
return user.value;
});
return { loginUserInfo, userInfo };
});
export default baseInfo;
+7
View File
@@ -0,0 +1,7 @@
import baseInfo from "./baseInfo";
import menuStore from "./menuTree";
export {
baseInfo,
menuStore
};
+61
View File
@@ -0,0 +1,61 @@
import { getMenuTree } from "../api";
import AsyncIcons from "@/components/AsyncIcons";
const menuStore = defineStore("menuTree", () => {
const menuInfo = ref<any>([]);
const menuComplate = ref<boolean>(false);
const loading = ref<boolean>(true);
const error = ref<boolean>(false);
const errorMsg = ref<string>("");
const menuTree = () => {
loading.value = true;
return new Promise((resolve, reject) => {
getMenuTree()
.then((res: any) => {
loading.value = false;
menuComplate.value = true;
const { errcode, errmessage, data } = res;
if (errcode === 0) {
error.value = false;
errorMsg.value = "";
menuInfo.value = data || [];
resolve(data);
} else {
error.value = true;
errorMsg.value = errmessage;
reject(errmessage);
}
})
.catch((err: any) => {
loading.value = false;
error.value = true;
errorMsg.value = "未知错误!";
reject(err);
});
});
};
const menu = computed(() => {
const menuList = deepMenuIcons(menuInfo.value);
return menuList;
});
const deepMenuIcons = (list: Array<any>) => {
const menu = [] as any;
for (let index = 0; index < list.length; index++) {
const srcItem = list[index];
const newItem = Object.assign({}, srcItem);
if (srcItem.icon) newItem.iconComponent = AsyncIcons(srcItem.icon.replace(",", "-"));
if (srcItem && srcItem.children && srcItem.children.length > 0) newItem.children = deepMenuIcons(srcItem.children);
menu.push(newItem);
}
return menu;
};
const menuEmpty = computed(() => {
return menuComplate.value && menu.value.length === 0;
});
return { menuTree, menu, menuComplate, loading, error, errorMsg, menuEmpty };
});
export default menuStore;
+3
View File
@@ -0,0 +1,3 @@
const pinia = createPinia();
export default pinia;
+121
View File
@@ -0,0 +1,121 @@
:root {
line-height: 24px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body,
div,
dl,
dt,
dd,
ul,
ol,
li,
h1,
h2,
h3,
h4,
h5,
h6,
pre,
code,
form,
fieldset,
legend,
input,
textarea,
p,
blockquote,
th,
td,
hr,
button,
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
margin: 0;
padding: 0
}
html,body {
width: 100vw;
height: 100vh;
}
#app {
width: 100%;
height: 100%;
}
#app {
background-color: #fff;
color: #000;
font-size: 14px;
font-family: "Helvetica", "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", SimSun, sans-serif;
}
/* 滚动条样式 */
* {
&::-webkit-scrollbar {
/*滚动条整体样式*/
width: 6px;
height: 6px;
background-color: #F5F6F7;
}
&::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/
background-color: rgba(0, 0, 0, 0.12);
border-radius: 6px;
}
// firefox
scrollbar-color: rgba(0, 0, 0, 0.12) rgb(245, 246, 247);
scrollbar-width: thin;
}
.xtbg-tips-page {
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
&-image {
width: 260px;
height: 260px;
&>img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
&-text {
margin-top: 10px;
padding: 0 16px;
line-height: 26px;
color: #888;
font-size: 16px;
}
&-btn {
margin-top: 20px;
width: 100%;
display: flex;
justify-content: center;
&-class {
min-width: 100px;
margin: 0 8px;
}
}
}
+1
View File
@@ -0,0 +1 @@
@import './global.less';
+5
View File
@@ -0,0 +1,5 @@
{
"token": {
"colorPrimary": "#3177ec"
}
}