Merge branch 'vue-shoppingcart'

master
liwa 3 years ago
commit 47b48a561e

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -0,0 +1,29 @@
# liwa-shoppingcart
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Run your tests
```
npm run test
```
### Lints and fixes files
```
npm run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,25 @@
{
"name": "liwa-shoppingcart",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
"dependencies": {
"axios": "^0.21.1",
"better-scroll": "^2.2.0",
"core-js": "^3.6.5",
"fastclick": "^1.0.6",
"postcss-px-to-viewport": "^1.1.1",
"vue": "^2.6.11",
"vue-lazyload": "^1.3.3",
"vue-router": "^3.5.1",
"vuex": "^3.6.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.5.0",
"@vue/cli-service": "^4.5.0",
"vue-template-compiler": "^2.6.11"
}
}

@ -0,0 +1,15 @@
module.exports = {
plugins:{
autoprefixer:{},
'postcss-px-to-viewport':{
viewportWidth: 375, // ihone6视窗的宽度对应的是设计稿的宽度一般是750
viewportHeight: 667, // 视窗的高度根据750设备的宽度来指定一般指定1334也可以不配置
unitPrecision: 3, // 指定`px`转换为视窗单位值的小数位数
viewportUnit: "vw", //指定需要转换成的视窗单位建议使用vw
selectorBlackList: ['ignore','tab-bar','tab-bar-item','cart-bottom-bar'],// 指定不转换为视窗单位的类,可以自定义,可以无限添加
minPixelValue: 1, // 小于或等于`1px`不转换为视窗单位,你也可以设置为你想要的值
mediaQuery: false // 是否允许在媒体查询中转换`px`
//exclude: [/TabBar/],//必须是正则,匹配文件的,不想让其转换
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

@ -0,0 +1,26 @@
<template>
<div id="app">
<!-- 2.路由跳转页面 -->
<!-- exclude值为组件导出的name值 -->
<keep-alive exclude='Detail'>
<router-view></router-view>
</keep-alive>
<!-- 1.底部标签栏 -->
<main-tab-bar></main-tab-bar>
</div>
</template>
<script>
import MainTabBar from "components/content/tabbar/MainTabBar";
export default {
name: "App",
components: {
MainTabBar,
},
};
</script>
<style>
@import "assets/css/base.css";
</style>

@ -0,0 +1,68 @@
/*引用normalize.css*/
/*normalize.css
reset.css*/
@import "./normalize.css";
/* @import "./reset.css"; */
/*配置一些变量,用于样式引用*/
/*:root -> 伪类选择器获取根元素html*/
:root {
--color-text: #666;
--color-background: #fff;
--color-high-text: #6f90fc;
--color-tint: #8aa5fc;/*背景颜色:导航等*/
--font-size: 14px;
--line-height: 1.5;
}
/*去除默认样式其实有了reset.css可以省去这一步*/
*,
*::before,
*::after {
padding: 0;
margin: 0;
/*宽度和高度用来设置整个盒子可见框的大小(内容区+内边距+边框)*/
box-sizing: border-box;
}
body {
font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
user-select: none;/*禁止用户鼠标在页面上选中文字图片等*/
/*将默认的点击高亮设置为透明*/
/*webkit是苹果浏览器引擎tap点击highlight背景高亮color颜色用数值调节*/
-webkit-tab-hightlight-color: transparent;
color: var(--color-text);
width: 100vw;/* 100vw一个视口宽度 */
}
a {
color: var(--color-text);
text-decoration: none;/*文本修饰,去掉超链接下划线*/
}
/*
.clearfix::after {
content: '';
display: block;
clear: both;
width: 0;
height: 0;
visibility: hidden;
}*/
/*解决浮动引起的高度塌陷以及外边距重叠*/
.clearfix::before,
.clearfix::after {
content: '';
display: table;
clear: both;
}
/*针对IE低版本浏览器*/
.clearfix {
/*zoom
zoom:1IEIEhaslayout
margin*/
zoom: 1;
}

@ -0,0 +1,349 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}

@ -0,0 +1,47 @@
/* v2.0 | 20110126
http://meyerweb.com/eric/tools/css/reset/
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543629945578" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6057" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M325.048 93.511l-60.030 59.435 357.181 359.631-360.184 356.603 59.522 59.93 420.207-416.043z" p-id="6058" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 520 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1540006086139" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1898" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="22"><defs><style type="text/css"></style></defs><path d="M736 960a31.88 31.88 0 0 1-21.77-8.55l-448-416a32 32 0 0 1 0-46.9l448-416a32 32 0 1 1 43.55 46.9L335 512l422.77 392.55A32 32 0 0 1 736 960z" p-id="1899" fill="#515151"></path></svg>

After

Width:  |  Height:  |  Size: 566 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#333333" d="M953.395454 402.915559c-8.676613-24.556279-30.668487-42.291199-57.407478-46.220694l-222.3716-32.523741L576.974315 126.46632c-11.676947-24.065092-37.161365-39.672558-64.992223-39.672558-27.721365 0-53.151547 15.606443-64.828494 39.617299l-96.643084 197.759039-222.589564 32.633235c-26.629497 3.928472-48.566112 21.609157-57.297984 46.27493-8.622378 24.938995-2.182712 51.950186 16.806781 70.613244l163.271574 160.433946-37.925774 222.535329c-4.638647 26.356274 6.65763 52.440349 29.631878 68.102051 12.059664 8.130168 26.303063 12.441357 41.200354 12.441357 12.059664 0 23.955598-2.891863 34.651194-8.458649l193.666838-102.917998 194.431248 103.192244c23.355941 12.059664 53.260018 10.423397 75.578326-4.311189 22.646789-15.497972 33.887808-41.582047 29.30442-67.940368l-37.871539-222.533282 163.381068-160.653957C955.577143 454.91998 961.962573 427.963025 953.395454 402.915559zM896.587634 432.873872 722.675722 603.894943c-6.712889 6.603395-9.713222 15.989159-8.131191 25.211195l40.381709 237.377362c0.709151 4.202719-1.200338 8.18645-5.02034 10.80509-4.637624 3.166109-12.659321 3.329838-17.080004 1.037632L525.352611 768.203126c-8.404414-4.474918-18.444071-4.365424-26.848485 0L291.576263 878.160447c-5.129834 2.620687-12.605086 2.346441-17.080004-0.709151-1.963725-1.308809-6.438643-5.074575-5.402033-11.076266l40.435944-237.377362c1.582031-9.224082-1.419326-18.609847-8.131191-25.213241L127.486044 432.873872c-3.110851-3.055592-4.201695-7.148817-2.892887-10.859325 1.582031-4.529153 6.056949-7.80271 11.67797-8.676613l237.431597-34.814923c9.331529-1.364067 17.407462-7.258311 21.554922-15.715937L498.558361 151.45955c2.182712-4.474918 7.584746-7.476275 13.423731-7.476275 5.948479 0 11.405771 3.001357 13.58746 7.53051l103.299691 211.292264c4.14746 8.458649 12.223393 14.351869 21.554922 15.715937l237.213633 34.706453c5.675256 0.87288 10.258645 4.201695 11.787464 8.512884C900.736117 425.726078 899.698484 429.818279 896.587634 432.873872z" /></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543629213633" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2702" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M510.919389 63.950498c247.345388 0 447.860191 200.514803 447.86019 447.861214 0 247.348458-200.514803 447.861214-447.86019 447.861214-247.348458 0-447.863261-200.51378-447.863261-447.861214 0-247.345388 200.514803-447.861214 447.863261-447.861214z" fill="#EEEEEE" p-id="2703"></path><path d="M510.919389 515.965312c79.150688 0 143.314033-64.425312 143.314033-143.899365 0-79.473029-64.163345-143.898341-143.314033-143.898341-79.151711 0-143.317103 64.425312-143.317103 143.898341-0.001023 79.475076 64.164369 143.899364 143.317103 143.899365z m221.060744 175.867449l1.068332-0.402159c-35.032888-88.682785-121.280204-151.399175-222.129076-151.399175-99.597369 0-184.944176 61.173245-220.793662 148.112316l0.494257 0.200568a35.121915 35.121915 0 0 0-2.565429 13.20065c0 19.475564 15.798824 35.266202 35.291784 35.266201 14.758122 0 27.392884-9.05626 32.661887-21.906939l0.575099 0.233314c25.224498-60.507072 84.822874-103.028515 154.336064-103.028515 70.109778 0 130.129756 43.259246 154.97256 104.59622l0.252757-0.095168c5.65479 11.939937 17.815761 20.201088 31.912827 20.201088 19.48989 0 35.289738-15.789615 35.289738-35.266201a35.281551 35.281551 0 0 0-1.367138-9.7122z" fill="#CCCCCC" p-id="2704"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543629680273" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5299" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M511.948835 898.963239c11.256368 0 20.363793-9.107425 20.363793-20.363793s-9.107425-20.363793-20.363793-20.363793c-11.256368 0-20.363793 9.107425-20.363793 20.363793C491.585041 889.855814 500.692467 898.963239 511.948835 898.963239M532.312628 125.036761l-40.727587 0c-11.256368 0-20.363793 9.107425-20.363793 20.363793s9.107425 20.363793 20.363793 20.363793l40.727587 0c11.256368 0 20.363793-9.107425 20.363793-20.363793S543.568996 125.036761 532.312628 125.036761M674.859181 63.945381l-325.820694 0c-45.025473 0-81.455173 36.429701-81.455173 81.455173l0 733.198891c0 45.025473 36.429701 81.455173 81.455173 81.455173l325.923024 0c45.025473 0 81.455173-36.429701 81.455173-81.455173l0-733.198891C756.416685 100.375082 719.884654 63.945381 674.859181 63.945381M715.586768 878.599446c0 22.512736-18.21485 40.727587-40.727587 40.727587l-325.820694 0c-22.512736 0-40.727587-18.21485-40.727587-40.727587l0-40.727587 407.378198 0 0 40.727587L715.586768 878.599446zM715.586768 797.144272l-407.275867 0 0-570.288544 407.378198 0 0 570.288544L715.586768 797.144272zM715.586768 186.128141l-407.275867 0 0-40.727587c0-22.512736 18.21485-40.727587 40.727587-40.727587l325.923024 0c22.512736 0 40.727587 18.21485 40.727587 40.727587l0 40.727587L715.586768 186.128141z" p-id="5300" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685069587679" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3397" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M384 768a64 64 0 1 0 0.032 128.032A64 64 0 0 0 384 768M704 768a64 64 0 1 0 0.032 128.032A64 64 0 0 0 704 768M312.672 512l-51.424-192h560.96l-51.456 192H312.672z m583.36-224a32 32 0 0 0-32-32H244.064L209.792 128H96.032v64h64.64l145.728 544H800v-64H355.52l-25.696-96h490.048l12.16-45.376 64-238.88-0.768-0.192C895.424 290.336 896 289.28 896 288z" fill="#13227a" p-id="3398"></path><path d="M448 448h192v-64h-192z" fill="#13227a" p-id="3399"></path></svg>

After

Width:  |  Height:  |  Size: 785 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685069587679" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3397" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M384 768a64 64 0 1 0 0.032 128.032A64 64 0 0 0 384 768M704 768a64 64 0 1 0 0.032 128.032A64 64 0 0 0 704 768M312.672 512l-51.424-192h560.96l-51.456 192H312.672z m583.36-224a32 32 0 0 0-32-32H244.064L209.792 128H96.032v64h64.64l145.728 544H800v-64H355.52l-25.696-96h490.048l12.16-45.376 64-238.88-0.768-0.192C895.424 290.336 896 289.28 896 288z" fill="#515151" p-id="3398"></path><path d="M448 448h192v-64h-192z" fill="#515151" p-id="3399"></path></svg>

After

Width:  |  Height:  |  Size: 785 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613796465763" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6979" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M685.909333 85.333333h144.469334A108.757333 108.757333 0 0 1 938.666667 194.56v145.706667a108.757333 108.757333 0 0 1-108.288 109.226666h-144.469334a108.757333 108.757333 0 0 1-108.330666-109.226666V194.56A108.757333 108.757333 0 0 1 685.909333 85.333333z" fill="#515151" opacity=".4" p-id="6980"></path><path d="M193.664 85.333333h144.426667a108.757333 108.757333 0 0 1 108.330666 109.226667v145.706667a108.757333 108.757333 0 0 1-108.330666 109.226666H193.706667A108.757333 108.757333 0 0 1 85.333333 340.224V194.56A108.757333 108.757333 0 0 1 193.664 85.333333z m0 489.216h144.426667a108.757333 108.757333 0 0 1 108.330666 109.226667v145.664A108.8 108.8 0 0 1 338.090667 938.666667H193.706667A108.8 108.8 0 0 1 85.333333 829.44v-145.706667a108.757333 108.757333 0 0 1 108.330667-109.226666z m636.714667 0h-144.469334a108.757333 108.757333 0 0 0-108.330666 109.226667v145.664A108.8 108.8 0 0 0 685.909333 938.666667h144.469334A108.8 108.8 0 0 0 938.666667 829.44v-145.706667a108.757333 108.757333 0 0 0-108.288-109.226666z" fill="#515151" p-id="6981"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613796465763" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6979" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M685.909333 85.333333h144.469334A108.757333 108.757333 0 0 1 938.666667 194.56v145.706667a108.757333 108.757333 0 0 1-108.288 109.226666h-144.469334a108.757333 108.757333 0 0 1-108.330666-109.226666V194.56A108.757333 108.757333 0 0 1 685.909333 85.333333z" fill="#5e82f8" opacity=".4" p-id="6980"></path><path d="M193.664 85.333333h144.426667a108.757333 108.757333 0 0 1 108.330666 109.226667v145.706667a108.757333 108.757333 0 0 1-108.330666 109.226666H193.706667A108.757333 108.757333 0 0 1 85.333333 340.224V194.56A108.757333 108.757333 0 0 1 193.664 85.333333z m0 489.216h144.426667a108.757333 108.757333 0 0 1 108.330666 109.226667v145.664A108.8 108.8 0 0 1 338.090667 938.666667H193.706667A108.8 108.8 0 0 1 85.333333 829.44v-145.706667a108.757333 108.757333 0 0 1 108.330667-109.226666z m636.714667 0h-144.469334a108.757333 108.757333 0 0 0-108.330666 109.226667v145.664A108.8 108.8 0 0 0 685.909333 938.666667h144.469334A108.8 108.8 0 0 0 938.666667 829.44v-145.706667a108.757333 108.757333 0 0 0-108.288-109.226666z" fill="#5e82f8" p-id="6981"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685070403768" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5280" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M128 320v576h576V320H128z m512 512H192V384h448v448z" fill="#13227a" p-id="5281"></path><path d="M832 128H384v128h64V192h384v384h-64v64h128V128z" fill="#13227a" p-id="5282"></path></svg>

After

Width:  |  Height:  |  Size: 518 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685070403768" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5280" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M128 320v576h576V320H128z m512 512H192V384h448v448z" fill="#515151" p-id="5281"></path><path d="M832 128H384v128h64V192h384v384h-64v64h128V128z" fill="#515151" p-id="5282"></path></svg>

After

Width:  |  Height:  |  Size: 518 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613797388305" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7296" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M982.016 404.48 573.344 84c-34.944-27.648-89.696-27.616-124.576 0L43.2 404.544c-13.856 10.976-16.224 31.104-5.28 44.96s31.104 16.224 44.96 5.28L96 444.416 96 832c0 54.944 56.928 96 107.872 96l640 0C894.176 928 928 889.408 928 832L928 443.456l14.496 11.36c5.888 4.608 12.8 6.816 19.712 6.816 9.504 0 18.912-4.192 25.216-12.256C998.336 435.488 995.904 415.36 982.016 404.48zM608 797.184 608 864l-63.968 0-64 0L416 864l0-66.816 0-112.32c0-37.216 30.048-77.248 96-77.248 65.984 0 96 40.032 96 77.248L608 797.184z" p-id="7297" fill="#515151"></path></svg>

After

Width:  |  Height:  |  Size: 927 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613797388305" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7296" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M982.016 404.48 573.344 84c-34.944-27.648-89.696-27.616-124.576 0L43.2 404.544c-13.856 10.976-16.224 31.104-5.28 44.96s31.104 16.224 44.96 5.28L96 444.416 96 832c0 54.944 56.928 96 107.872 96l640 0C894.176 928 928 889.408 928 832L928 443.456l14.496 11.36c5.888 4.608 12.8 6.816 19.712 6.816 9.504 0 18.912-4.192 25.216-12.256C998.336 435.488 995.904 415.36 982.016 404.48zM608 797.184 608 864l-63.968 0-64 0L416 864l0-66.816 0-112.32c0-37.216 30.048-77.248 96-77.248 65.984 0 96 40.032 96 77.248L608 797.184z" p-id="7297" fill="#5e82f8"></path></svg>

After

Width:  |  Height:  |  Size: 927 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685070516423" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5531" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M320 480h384v-64H320zM320 608h256v-64h-256zM320 736h256v-64h-256z" fill="#13227a" p-id="5532"></path><path d="M832 160h-128V96H320v64H192c-19.2 0-32 12.8-32 32v704c0 19.2 12.8 32 32 32h640c19.2 0 32-12.8 32-32V192c0-19.2-12.8-32-32-32zM384 160h256v64h-256V160z m416 704H224V224h96v64h384V224h96v640z" fill="#13227a" p-id="5533"></path></svg>

After

Width:  |  Height:  |  Size: 674 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685070516423" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5531" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M320 480h384v-64H320zM320 608h256v-64h-256zM320 736h256v-64h-256z" fill="#515151" p-id="5532"></path><path d="M832 160h-128V96H320v64H192c-19.2 0-32 12.8-32 32v704c0 19.2 12.8 32 32 32h640c19.2 0 32-12.8 32-32V192c0-19.2-12.8-32-32-32zM384 160h256v64h-256V160z m416 704H224V224h96v64h384V224h96v640z" fill="#515151" p-id="5533"></path></svg>

After

Width:  |  Height:  |  Size: 674 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613796691661" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17468" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M482.730667 723.498667a361.130667 361.130667 0 0 1-30.72-5.333334c-2.688-0.554667-5.461333-1.024-8.149334-1.621333a400.981333 400.981333 0 0 1-32.426666-9.173333c-31.018667-10.368-65.962667-2.56-86.4 21.418666-2.56 3.114667-4.864 6.4-7.253334 9.557334-2.986667 4.010667-6.144 7.850667-8.874666 11.989333-2.432 3.541333-4.437333 7.381333-6.656 11.050667-2.474667 4.224-5.12 8.362667-7.338667 12.714666-2.005333 3.84-3.584 7.936-5.333333 11.904-2.005333 4.437333-4.096 8.832-5.802667 13.44-1.493333 4.096-2.688 8.362667-3.925333 12.544-1.450667 4.693333-2.986667 9.301333-4.181334 14.08-1.024 4.309333-1.706667 8.746667-2.432 13.098667-0.896 4.864-1.877333 9.685333-2.432 14.677333-0.469333 4.48-0.554667 9.088-0.810666 13.610667-0.256 4.650667-0.597333 9.258667-0.554667 13.994667 4.821333 133.162667 522.837333 133.162667 527.616 0 0.042667-4.693333-0.256-9.386667-0.512-13.994667-0.213333-4.522667-0.298667-9.130667-0.853333-13.610667-0.554667-4.992-1.493333-9.813333-2.389334-14.677333-0.725333-4.352-1.408-8.789333-2.432-13.098667-1.152-4.778667-2.688-9.386667-4.138666-14.08-1.28-4.181333-2.432-8.448-3.968-12.544-1.664-4.608-3.754667-8.96-5.76-13.44-1.792-3.968-3.413333-8.021333-5.376-11.904-2.218667-4.352-4.864-8.533333-7.381334-12.714666-2.176-3.669333-4.224-7.509333-6.570666-11.050667-2.816-4.138667-5.888-7.978667-8.917334-11.989333-2.432-3.2-4.693333-6.442667-7.253333-9.557334-20.437333-23.978667-55.381333-31.786667-86.4-21.418666a401.92 401.92 0 0 1-32.426667 9.173333c-2.730667 0.597333-5.461333 1.066667-8.106666 1.621333a362.069333 362.069333 0 0 1-30.762667 5.333334c-3.626667 0.469333-7.210667 0.938667-10.837333 1.322666a387.968 387.968 0 0 1-39.68 2.304c-13.44 0-26.624-0.981333-39.68-2.304-3.669333-0.384-7.253333-0.853333-10.88-1.322666M810.666667 386.005333c0 142.506667-124.202667 258.090667-277.333334 258.090667-153.173333 0-277.333333-115.541333-277.333333-258.048S380.16 128 533.333333 128C686.464 128 810.666667 243.498667 810.666667 386.048" fill="#515151" p-id="17469"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613796691661" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17468" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M482.730667 723.498667a361.130667 361.130667 0 0 1-30.72-5.333334c-2.688-0.554667-5.461333-1.024-8.149334-1.621333a400.981333 400.981333 0 0 1-32.426666-9.173333c-31.018667-10.368-65.962667-2.56-86.4 21.418666-2.56 3.114667-4.864 6.4-7.253334 9.557334-2.986667 4.010667-6.144 7.850667-8.874666 11.989333-2.432 3.541333-4.437333 7.381333-6.656 11.050667-2.474667 4.224-5.12 8.362667-7.338667 12.714666-2.005333 3.84-3.584 7.936-5.333333 11.904-2.005333 4.437333-4.096 8.832-5.802667 13.44-1.493333 4.096-2.688 8.362667-3.925333 12.544-1.450667 4.693333-2.986667 9.301333-4.181334 14.08-1.024 4.309333-1.706667 8.746667-2.432 13.098667-0.896 4.864-1.877333 9.685333-2.432 14.677333-0.469333 4.48-0.554667 9.088-0.810666 13.610667-0.256 4.650667-0.597333 9.258667-0.554667 13.994667 4.821333 133.162667 522.837333 133.162667 527.616 0 0.042667-4.693333-0.256-9.386667-0.512-13.994667-0.213333-4.522667-0.298667-9.130667-0.853333-13.610667-0.554667-4.992-1.493333-9.813333-2.389334-14.677333-0.725333-4.352-1.408-8.789333-2.432-13.098667-1.152-4.778667-2.688-9.386667-4.138666-14.08-1.28-4.181333-2.432-8.448-3.968-12.544-1.664-4.608-3.754667-8.96-5.76-13.44-1.792-3.968-3.413333-8.021333-5.376-11.904-2.218667-4.352-4.864-8.533333-7.381334-12.714666-2.176-3.669333-4.224-7.509333-6.570666-11.050667-2.816-4.138667-5.888-7.978667-8.917334-11.989333-2.432-3.2-4.693333-6.442667-7.253333-9.557334-20.437333-23.978667-55.381333-31.786667-86.4-21.418666a401.92 401.92 0 0 1-32.426667 9.173333c-2.730667 0.597333-5.461333 1.066667-8.106666 1.621333a362.069333 362.069333 0 0 1-30.762667 5.333334c-3.626667 0.469333-7.210667 0.938667-10.837333 1.322666a387.968 387.968 0 0 1-39.68 2.304c-13.44 0-26.624-0.981333-39.68-2.304-3.669333-0.384-7.253333-0.853333-10.88-1.322666M810.666667 386.005333c0 142.506667-124.202667 258.090667-277.333334 258.090667-153.173333 0-277.333333-115.541333-277.333333-258.048S380.16 128 533.333333 128C686.464 128 810.666667 243.498667 810.666667 386.048" fill="#5e82f8" p-id="17469"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613796385842" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5071" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M384.00256 927.99168c0 53.02166-42.98666 96.00832-96.00832 96.00832s-96.00832-42.98666-96.00832-96.00832c0-53.02166 42.98666-96.00832 96.00832-96.00832s96.00832 42.98666 96.00832 96.00832z" p-id="5072" fill="#515151"></path><path d="M1023.98976 927.99168c0 53.02166-42.98666 96.00832-96.00832 96.00832s-96.00832-42.98666-96.00832-96.00832c0-53.02166 42.98666-96.00832 96.00832-96.00832s96.00832 42.98666 96.00832 96.00832z" p-id="5073" fill="#515151"></path><path d="M1023.98976 511.98976l0-383.99232-767.98464 0c0-35.347773-28.650947-63.99872-63.99872-63.99872l-191.99616 0 0 63.99872 127.99744 0 48.065599 412.049359c-29.285814 23.449131-48.065599 59.49321-48.065599 99.940401 0 70.695546 57.301894 127.99744 127.99744 127.99744l767.98464 0 0-63.99872-767.98464 0c-35.347773 0-63.99872-28.650947-63.99872-63.99872 0-0.225275 0.02048-0.430071 0.02048-0.655347l831.962881-127.342093z" p-id="5074" fill="#515151"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1613796385842" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5071" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M384.00256 927.99168c0 53.02166-42.98666 96.00832-96.00832 96.00832s-96.00832-42.98666-96.00832-96.00832c0-53.02166 42.98666-96.00832 96.00832-96.00832s96.00832 42.98666 96.00832 96.00832z" p-id="5072" fill="#5e82f8"></path><path d="M1023.98976 927.99168c0 53.02166-42.98666 96.00832-96.00832 96.00832s-96.00832-42.98666-96.00832-96.00832c0-53.02166 42.98666-96.00832 96.00832-96.00832s96.00832 42.98666 96.00832 96.00832z" p-id="5073" fill="#5e82f8"></path><path d="M1023.98976 511.98976l0-383.99232-767.98464 0c0-35.347773-28.650947-63.99872-63.99872-63.99872l-191.99616 0 0 63.99872 127.99744 0 48.065599 412.049359c-29.285814 23.449131-48.065599 59.49321-48.065599 99.940401 0 70.695546 57.301894 127.99744 127.99744 127.99744l767.98464 0 0-63.99872-767.98464 0c-35.347773 0-63.99872-28.650947-63.99872-63.99872 0-0.225275 0.02048-0.430071 0.02048-0.655347l831.962881-127.342093z" p-id="5074" fill="#5e82f8"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685070627673" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5782" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 448c-35.296 0-64-28.704-64-64s28.704-64 64-64 64 28.704 64 64-28.704 64-64 64m0-192c-70.592 0-128 57.408-128 128s57.408 128 128 128 128-57.408 128-128-57.408-128-128-128" fill="#13227a" p-id="5783"></path><path d="M768 797.632v-69.92a151.904 151.904 0 0 0-151.712-151.68h-208.576A151.904 151.904 0 0 0 256 727.68v69.92C177.632 727.36 128 625.6 128 512 128 299.904 299.936 128 512 128s384 171.904 384 384c0 113.6-49.632 215.36-128 285.632m-448 46.56v-116.48a87.776 87.776 0 0 1 87.712-87.68h208.576A87.776 87.776 0 0 1 704 727.68v116.48a381.568 381.568 0 0 1-384 0m192-780.16C264.96 64 64 264.96 64 512c0 246.976 200.96 448 448 448s448-201.024 448-448c0-247.04-200.96-448-448-448" fill="#13227a" p-id="5784"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1685070627673" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5782" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 448c-35.296 0-64-28.704-64-64s28.704-64 64-64 64 28.704 64 64-28.704 64-64 64m0-192c-70.592 0-128 57.408-128 128s57.408 128 128 128 128-57.408 128-128-57.408-128-128-128" fill="#515151" p-id="5783"></path><path d="M768 797.632v-69.92a151.904 151.904 0 0 0-151.712-151.68h-208.576A151.904 151.904 0 0 0 256 727.68v69.92C177.632 727.36 128 625.6 128 512 128 299.904 299.936 128 512 128s384 171.904 384 384c0 113.6-49.632 215.36-128 285.632m-448 46.56v-116.48a87.776 87.776 0 0 1 87.712-87.68h208.576A87.776 87.776 0 0 1 704 727.68v116.48a381.568 381.568 0 0 1-384 0m192-780.16C264.96 64 64 264.96 64 512c0 246.976 200.96 448 448 448s448-201.024 448-448c0-247.04-200.96-448-448-448" fill="#515151" p-id="5784"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1,27 @@
import {debounce} from "common/utils";
export const itemListenerMixin = {
data () {
return {
//首页监听
itemImagListener: null,
refresh: null
}
},
mounted() {
//防抖动操作debounce
this.refresh = debounce(this.$refs.scroll.refresh, 50)
//对监听事件进行保存
this.itemImagListener = () => {
//当每一张图片加载完成后,刷新,重新计算可滚动区域
//scroll在created阶段可能未挂载$refs在created阶段也可能为空因为组件还未挂载因为是在mounted阶段初始化的scroll
//路由切换需要增加this.$refs.scroll存在的判断
//或者使用keep-alive缓存防止重新加载
//this.$refs.scroll && this.$refs.scroll.refresh();
this.refresh();
}
this.$bus.$on('itemImageLoad', this.itemImagListener)
}
}

@ -0,0 +1,37 @@
//防抖函数
export function debounce(func, delay) {
let timer = null
return function (...args) {
//如果下一次来的非常频繁就取消掉上一次的刷新
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
func.apply(this, args)
}, delay)
}
}
//时间
export function formatDate(date, fmt) {
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
};
for (let k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + '';
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
}
}
return fmt
}
function padLeftZero(str) {
return ('00'+str).substr(str.length);
}

@ -0,0 +1,34 @@
<template>
<div class='nav-bar' :style='{backgroundColor:"#13227a"}'>
<div class='left'><slot name='left'></slot></div>
<div class='center'><slot name='center'></slot></div>
<div class='right'><slot name='right'></slot></div>
</div>
</template>
<script>
export default {
name: 'NavBar',
props: {
},
}
</script>
<style scoped>
.nav-bar {
display: flex;
/*垂直居中*/
height: 44px;
line-height: 44px;
/*水平居中*/
text-align: center;
box-shadow: 0 1px 1px rgba(100,100,100,0.1);
}
.left, .right {
width: 60px;
}
.center {
flex: 1;/* flex: 1; -> felx: 1 1 0% */ /*占据全部剩余空间*/
}
</style>

@ -0,0 +1,89 @@
<template>
<!-- better-scroll需要有一个外部容器指定高度内容一个容器可以滚动
内容容器只能有一个但是 内容容器里可以有多个容器 -->
<div class='wrapper' ref='wrapper'>
<div class='content'>
<slot></slot>
</div>
</div>
</template>
<script>
import BScroll from 'better-scroll'
export default {
name: 'Scroll',
data() {
return {
scroll: null
}
},
props: {
probeType: {
type: Number,
default: 0
},
pullUpLoad: {
type: Boolean,
default: false
},
},
mounted() {
//1.BScroll
//
this.scroll = new BScroll(this.$refs.wrapper, {
//
observeDOM: true,
//click: truesacrollbutton
//click: truesacrolldiv
click: true,
/* probeType=0,
probeType=1 滚动时会派发scroll事件会截流
probeType=2 滚动时实时派发scroll事件不会截流
probeType=3 除了实时派发scroll事件在swipe的情况下仍然能实时派发scroll事件*/
probeType: this.probeType,
pullUpLoad: this.pullUpLoad
})
//2.
//'scroll'
if(this.probeType === 2 || this.probeType === 3) {
this.scroll && this.scroll.on('scroll', (position) => {
this.$emit('scrollpos', position)
})
}
//3.
if (this.pullUpLoad) {
this.scroll && this.scroll.on('pullingUp', () => {
this.$emit('pullingUp');
})
}
},
methods:{
//
scrollTo(x, y, time) {
this.scroll && this.scroll.scrollTo(x, y, time)
},
//
finishPullUp() {
this.scroll && this.scroll.finishPullUp();
},
//,
refresh() {
//scrollcreatedmountedscroll
this.scroll && this.scroll.refresh();
},
getScrollY() {
return this.scroll ? this.scroll.y : 0
}
}
}
</script>
<style scoped>
</style>

@ -0,0 +1,248 @@
<template>
<!-- touchstart触摸开始多点触控后面的手指同样会触发
touchmove 接触点改变滑动时
touchend 触摸结束手指离开屏幕时 -->
<div id='wrap-swiper'>
<!-- 存放图片的容器 -->
<div class='swiper' @touchstart='touchStart' @touchmove='touchMove' @touchend='touchEnd'>
<slot name='swiper'></slot>
</div>
<!-- 存放底部圆点的容器 -->
<div class='indicator'>
<slot name='indicator' v-if="showIndicator && slideCount>1">
<div v-for='(item, index) in slideCount' :key='index' class='indi-item' :class='{active: currentIndex - 1 === index}'></div>
</slot>
</div>
</div>
</template>
<script>
export default {
name: 'Swiper',
props: {
//
interval: {
type: Number,
default: 3000
},
//,
animDuration: {
type: Number,
default: 500
},
// swiperItem
moveRatio: {
type: Number,
default: 0.25
},
//
showIndicator: {
type: Boolean,
default: true
}
},
data() {
return {
slideCount: 0,//0dom
totalWidth: 0,// swiper
swiperStyle: {},// swiper
currentIndex: 1,//index
scrolling: false, //
}
},
mounted() {
//
//setTimeoutsetTimeout()
setTimeout(() => {
//1.Dom slide
this.handleDom();
//2.
this.startTimer();
}, 500)
},
methods:{
/**
* 1.操作DOM, 在DOM前后添加Slide
*/
handleDom() {
// 1.
//swiperElclassswiper nswiperItem classswiper
//slidesELsclassslide div swiperItem
let swiperEl = document.querySelector('.swiper');
// let slidesEls = document.getElementsByClassName('slide');
let slidesEls = document.getElementsByClassName('slide');
//2./
this.slideCount = slidesEls.length;
//3. slide [1,2,3,4]--[4',1,2,3,4,1']
if (this.slideCount > 1) {
//cloneNode
// true,
let cloneFirst = slidesEls[0].cloneNode(true);
let cloneLast = slidesEls[this.slideCount - 1].cloneNode(true);
//insertBefore()
//appendChild()
swiperEl.insertBefore(cloneLast, slidesEls[0]);
swiperEl.appendChild(cloneFirst);
//offsetWidth
this.totalWidth = swiperEl.offsetWidth;
this.swiperStyle = swiperEl.style;
}
// 4.swiper, ()
this.setTransform(-this.totalWidth)
},
/*设置滚动的位置*/
setTransform(position) {
//transform 2D3D,
// -webkit safari -ms IE
this.swiperStyle.transform = `translateX(${position}px)`;
this.swiperStyle['-webkit-transform'] = `translateX(${position}px)`;
this.swiperStyle['-ms-transform'] = `translateX(${position}px)`;
},
/**
* 定时器操作
*/
startTimer() {
// window.setInterval
this.playTimer = window.setInterval(() => {
this.currentIndex++;
this.scrollContent(-this.currentIndex * this.totalWidth);
},this.interval)
},
stopTimer() {
window.clearInterval(this.playTimer);
},
/**
* 滚动到正确的位置
*/
scrollContent(currentPosition) {
// 1.
this.scrolling = true;
// 2.
//transition
this.swiperStyle.transition = 'transform ' + this.animDuration + 'ms';
this.setTransform(currentPosition)
// 3.
this.checkPosition();
// 4.
this.scrolling = false
},
/**
* 校验正确的位置
*/
checkPosition() {
//
window.setTimeout(() => {
// 1.
//[1,2,3,4]--[4',1,2,3,4,1']1'14'4
this.swiperStyle.transition = '0ms';
if (this.currentIndex > this.slideCount) {
this.currentIndex = 1;
this.setTransform(-this.currentIndex * this.totalWidth)
} else if (this.currentIndex == 0) {
this.currentIndex = this.slideCount;
this.setTransform(-this.currentIndex * this.totalWidth);
}
}, this.animDuration)
},
/**
* 鼠标拖动事件的处理
*/
touchStart(e) {
// 1.,
if (this.scrolling) return;
// 2.
this.stopTimer();
// 3.
this.startX = e.touches[0].pageX;
},
touchMove(e) {
// 1.
this.currentX = e.touches[0].pageX;
this.distance = this.currentX - this.startX;
let currentPosition = -this.currentIndex * this.totalWidth;
let moveDistance = this.distance + currentPosition;
// 2.
this.setTransform(moveDistance);
},
touchEnd(e) {
// 1.
let currentMove = Math.abs(this.distance);
// 2.
if(this.distance == 0) {
return
} else {
if (currentMove > this.totalWidth * this.moveRatio){
this.distance > 0 ? this.currentIndex-- : this.currentIndex++;
}
}
// 3.
this.scrollContent(-this.currentIndex * this.totalWidth);
// 4.
this.startTimer();
},
}
}
</script>
<style scoped>
#wrap-swiper {
overflow: hidden;
position: relative;
}
.swiper{
display: flex;
}
.indicator {
display: flex;
position: absolute;
bottom: 8px;
/* 使宽度撑满屏幕,可用width:100%代替 */
left: 0;
right: 0;
/* 用于设置弹性盒子内元素在主轴(横轴)方向上的对齐方式。 */
justify-content: center;
}
.indi-item {
width: 8px;
height: 8px;
/* 画圆 */
border-radius: 4px;
background-color: #fff;
margin: 0 5px;
}
/*同一个元素的class之间不要加空格*/
.indi-item.active{
background-color: rgba(117, 171, 252, 0.8);
}
</style>

@ -0,0 +1,27 @@
<template>
<div class='slide'>
<!-- 放入超链接和图片 -->
<slot></slot>
</div>
</template>
<script>
export default {
name: 'SwiperItem'
}
</script>
<style scoped>
.slide{
width: 100%;
/* 不缩放 */
flex-shrink: 0;
}
.slide img {
width: 100%;
}
</style>

@ -0,0 +1,28 @@
<template>
<div class='tab-bar'>
<slot></slot>
</div>
</template>
<script>
export default {
name: 'TabBar',
components: {
}
}
</script>
<style scoped>
.tab-bar {
display: flex;
position: fixed;
left: 0;
right: 0;
bottom: 0;
box-shadow: 0 -2px 1px rgba(100,100,100,0.1);/*X轴偏移量、Y轴偏移量、模糊半径*/
background-color: #f6f6f6;
}
</style>

@ -0,0 +1,64 @@
<template>
<div class='tab-bar-item' @click='itemClick'>
<div v-if='!isActive'><slot name='item-icon'></slot></div>
<div v-else><slot name='item-active'></slot></div>
<!--加一层div的目的是用户添加的标签会直接替换slot,
这样在slot上添加class不会生效-->
<!-- 动态设置样式让用户使用组件时自己传入点击后的字体颜色 -->
<!-- <div :class='{active: isActive}'><slot name='item-text'></slot></div> -->
<div :style='activeStyle'><slot name='item-text'></slot></div>
</div>
</template>
<script>
export default {
name: 'TabBarItem',
props: {
path: String,
colorActive: {
type: String,
default: 'red'
}
},
data() {
return {
}
},
computed: {
isActive() {
//this.$route
//indexOf
return this.$route.path.indexOf(this.path) !== -1
},
activeStyle() {
return this.isActive ? {color: this.colorActive} : {}
}
},
methods: {
itemClick() {
this.$router.replace(this.path).catch(err => err)
}
}
}
</script>
<style scoped>
.tab-bar-item {
flex: 1;
text-align: center;
font-size: 13px;
height: 49px;
}
.tab-bar-item img {
width: 24px;
margin: 3px 0 1px;
}
.active {
color: var(--color-high-text)
}
</style>

@ -0,0 +1,43 @@
<template>
<div class="toast" v-show="isShow">
<div>{{message}}</div>
</div>
</template>
<script>
export default {
name: 'Toast',
data(){
return {
isShow: false,
message: ''
}
},
methods: {
show (message='默认文字', duration=2000) {
this.isShow = true;
this.message = message
setTimeout(() => {
this.isShow = false;
this.message = ''
}, duration)
}
}
}
</script>
<style scoped>
.toast{
position: fixed;
left:50%;
top:50%;
background-color: rgba(0,0,0,0.7);
color:#fff;
transform: translate(-50%, -50%);
font-size: 14px;
z-index: 999;
padding:8px;
}
</style>

@ -0,0 +1,24 @@
import Toast from "./Toast";
const obj = {}
obj.install = function(Vue) {
//1. 创建组件构造器
const toastContrustor = Vue.extend(Toast);
//2.new的方式根据组件构造器创建组件对象
const toast = new toastContrustor();
//3.将组建对象手动挂载到创建的dom div上
toast.$mount(document.createElement('div'));
//4.toast.$el对应的就是div,加到body
document.body.appendChild(toast.$el);
//给vue原型添加toast方法
Vue.prototype.$toast = toast
}
export default obj

@ -0,0 +1,23 @@
<template>
<div class='backtop'>
<img src="~assets/img/common/top.png" alt="">
</div>
</template>
<script>
export default {
name: 'BackTop'
}
</script>
<style scoped>
.backtop {
position: fixed;
bottom: 56px;
right: 8px;
}
.backtop img {
width: 30px;
}
</style>

@ -0,0 +1,100 @@
<template>
<div class='goods'>
<div v-for='(item, index) in goods'
:key='index'
class='goods-item' @click='itemClick(item)'>
<!-- @load监听图片加载 -->
<img v-lazy="showImg(item)" alt="" @load='imgLoad'>
<div class='goods-info'>
<p>{{item.title}}</p>
<span class='price'>{{item.price}}</span>
<span class='cfav'>{{item.cfav}}</span>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'GoodsList',
props: {
goods: {
type: Array,
default: []
}
},
computed:{
},
methods: {
imgLoad() {
//
//
//vuexvuex$store
//线$bus
this.$bus.$emit('itemImageLoad')
},
itemClick(item) {
//id
if (this.$route.path.indexOf('/home') !== -1) {
this.$router.push('/detail/'+ item.iid).catch(err => err)
}
},
showImg(item) {
return item.image || item.show.img
}
}
}
</script>
<style scoped>
.goods {
display: flex;
flex-wrap: wrap;/*规定灵活的项目在必要的时候拆行或拆列*/
justify-content: space-around;/*项目位于各行之前、之间、之后都留有空白的容器内。 */
padding: 5px;
}
.goods-item {
position: relative;
width: 48%;
padding-bottom: 40px;
}
.goods-item img {
width: 100%;
border-radius: 5px;
}
.goods-info {
font-size: 12px;
text-align: center;
position: absolute;
left: 0;
right: 0;
bottom: 5px;
}
.goods-info p {
overflow: hidden;
margin-bottom: 5px;
white-space: nowrap; /* 规定段落中的文本不进行换行 */
text-overflow: ellipsis; /*显示省略符号来代表被修剪的文本*/
}
.goods-info .price {
margin-right: 25px;
color: var(--color-high-text);
}
.goods-info .cfav {
position: relative;
}
.goods-info .cfav::before {
content: '';
/*绝对定位开启后行内会变成块元素*/
position: absolute;
left: -15px;
top: -1px;
background-image: url('~assets/img/common/collect.svg');
background-size: 14px;
width: 14px;
height: 14px;
}
</style>

@ -0,0 +1,42 @@
<template>
<div>
<tab-bar>
<tab-bar-item path='/cart' colorActive='var(--color-high-text)'>
<img slot='item-icon' src="~assets/img/tabbar/cart.svg" alt="" />
<img slot='item-active' src="~assets/img/tabbar/cart-active.svg" alt="" />
<div slot='item-text'>购物车</div>
</tab-bar-item>
<tab-bar-item path='/product' colorActive='var(--color-high-text)'>
<img slot='item-icon' src="~assets/img/tabbar/goods.svg" alt="" />
<img slot='item-active' src="~assets/img/tabbar/goods-active.svg" alt="" />
<div slot='item-text'>商品</div>
</tab-bar-item>
<tab-bar-item path='/order' colorActive='var(--color-high-text)'>
<img slot='item-icon' src="~assets/img/tabbar/order.svg" alt="" />
<img slot='item-active' src="~assets/img/tabbar/order-active.svg" alt="" />
<div slot='item-text'>订单</div>
</tab-bar-item>
<tab-bar-item path='/user' colorActive='var(--color-high-text)'>
<img slot='item-icon' src="~assets/img/tabbar/user.svg" alt="" />
<img slot='item-active' src="~assets/img/tabbar/user-active.svg" alt="" />
<div slot='item-text'>用户</div>
</tab-bar-item>
</tab-bar>
</div>
</template>
<script>
import TabBar from "components/common/tabbar/TabBar";
import TabBarItem from "components/common/tabbar/TabBarItem";
export default {
name: "MainTabBar",
components: {
TabBar,
TabBarItem,
},
};
</script>
<style>
</style>

@ -0,0 +1,56 @@
<template>
<div class='tab-control'>
<div v-for='(item, index) in titles'
:key='index'
@click='itemClick(index)'
class='tab-item'
:class='{active: index === currentIndex}'>
<span>{{item}}</span>
</div>
</div>
</template>
<script>
export default {
name: 'TabControl',
props: {
titles: {
type: Array,
default: []
}
},
data() {
return {
currentIndex: 0
}
},
methods: {
itemClick(index) {
this.currentIndex = index;
this.$emit('tabClick', index)
}
}
}
</script>
<style scoped>
.tab-control {
display:flex;
background-color: var(--color-background);
height: 40px;
line-height: 40px;
text-align: center;
font-size: 15px;
}
.tab-item {
flex: 1;
}
.tab-item span {
padding: 5px;
}
.active span{
color: var(--color-tint);
border-bottom: 2px solid var(--color-tint);
}
</style>

@ -0,0 +1,29 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import toast from 'components/common/toast'
import FastClick from 'fastclick'
import VueLazyLoad from 'vue-lazyload'
Vue.config.productionTip = false
//安装自定义toast插件
Vue.use(toast)
//用Vue实例作为事件总线
Vue.prototype.$bus = new Vue();
//解决移动端300ms延迟
FastClick.attach(document.body)
//使用懒加载插件
Vue.use(VueLazyLoad, {
loading: require('assets/img/common/lazyload.gif')
})
new Vue({
render: h => h(App),
router,
store,
}).$mount('#app')

@ -0,0 +1,15 @@
import {request} from './request'
export function getCartItems() {
return request({
url: '/cart/user/1',
params: {
userId: 1,
pageNum: 1,
pageSize: 9,
}
})
}

@ -0,0 +1,26 @@
import {request} from './request'
export function getCategory() {
return request({
url: '/category'
})
}
export function getSubCategory(maitKey) {
return request({
url: '/subcategory',
params: {
maitKey
}
})
}
// export function getCategoryDetail(miniWallkey,type) {
// return request({
// url:'/subcategory/detail',
// params:{
// miniWallkey,
// type
// }
// })
// }

@ -0,0 +1,57 @@
/* 存放详情页的相关网络请求函数*/
import {request} from './request'
//请求详情页数据
export function getDetail(iid) {
return request({
url: '/detail',
params: {
iid
}
})
}
//商品详情信息
export class GoodsInfo {
constructor(itemInfo,columns,services) {
this.title = itemInfo.title;
this.desc = itemInfo.desc;
this.newPrice = itemInfo.price;
this.oldPrice = itemInfo.oldPrice;
this.discount = itemInfo.discountDesc;
this.columns = columns;
this.services = services;
this.discountBgColor = itemInfo.discountBgColor;
this.realPrice =itemInfo.lowNowPrice;
}
}
//详情页商家信息
export class Shop{
constructor(shopInfo) {
this.logo = shopInfo.shopLogo;
this.name = shopInfo.name;
this.fans = shopInfo.cFans;
this.sells = shopInfo.cSells;
this.score = shopInfo.score;
this.goodsCount = shopInfo.cGoods;
}
}
//商品参数
export class GoodsParam{
constructor(info,rule){
this.image = info.images ? info.images[0] : '';
this.infos = info.set;
this.sizes = rule.tables;
}
}
//请求推荐信息
export function getRecommend() {
return request({
url: '/recommend'
})
}

@ -0,0 +1,18 @@
/* 存放首页的相关网络请求函数*/
import {request} from './request'
export function getHomeMultidata() {
return request({
url: '/home/multidata'
})
}
export function getHomeGoods(type, page) {
return request({
url: '/home/data',
params: {
type,
page
}
})
}

@ -0,0 +1,28 @@
import axios from 'axios'
export function request(config) {
//1.创建axios实例
const instance = axios.create({
/* 接口地址在这里更改 */
baseURL: 'http://localhost:8088',
timeout: 5000
})
//2.axios拦截器
//请求拦截
instance.interceptors.request.use(config => {
return config
}, err => {
console.log(err)
})
//相应拦截
instance.interceptors.response.use(res => {
return res.data
}, err => {
console.log(err)
})
//3.发送真正的网络请求
return instance(config)
}

@ -0,0 +1,46 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
const Cart = () => import('views/cart/Cart')
const Product = () => import('views/product/Product')
const Order = () => import('views/order/Order')
const User = () => import('views/user/User')
//通过Vue.use安装vue-router插件
Vue.use(VueRouter)
const routes = [
{
path: '',
redirect: '/product'
},
{
path: '/product',
component: Product
},
{
path: '/cart',
component: Cart
},
{
path: '/order',
component: Order
},
{
path: '/user',
component: User
},
]
//创建VueRouter对象
const router = new VueRouter({
routes,
mode: 'history'
})
//导出
export default router

@ -0,0 +1,19 @@
export default {
addCart(context, payload) {
return new Promise((resolve, reject) => {
//1.查找之前的数组里是否有该商品
let oldProduct = context.state.cartList.find(item => item.iid === payload.iid)
//2.判断oldProduct
if (oldProduct) {
context.commit('addCounter', oldProduct)
resolve('当前商品的数量+1')
} else {
payload.count = 1
context.commit('addtoCart', payload)
resolve('已添加新商品到购物车')
}
})
}
}

@ -0,0 +1,10 @@
export default {
cartLength(state) {
return state.cartList.length
},
cartList(state) {
return state.cartList
}
}

@ -0,0 +1,20 @@
import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
Vue.use(Vuex)
const state = {
cartList:[{iid: "1m70y5k", count: 1, checked: true, image: "//s11.mogucdn.com/mlcdn/c45406/180808_600abce0g8dc8i4f6ic7k27i7837l_640x960.jpg", title: "2018秋季新款韩版百搭格子长袖衬衫+前短后长针织气质开衫外套+高腰直筒九分牛仔裤三件套装", desc: "2018秋季新款韩版百搭格子长袖衬衫+前短后长针织气质开衫外套+高腰直筒九分牛仔裤三件套装", price: "59.00"},{iid: "1m745k0", count: 1, checked: true, image: "//s11.mogucdn.com/mlcdn/c45406/180811_1k5hfa6d803575df3lkb6j67l5j3c_640x960.jpg", title: "2018秋季新款韩版女装字母印花宽松连帽休闲卫衣搭配松紧腰九分牛仔裤两件套女时尚运动套装潮", desc: "你的运动套装,也可以一起承包了~棉混纺的连帽卫衣,版型虽宽松,但因为有罗纹收口,穿起来立体挺括,能遮…助攻,翻边上的亮粉字母数字,和上衣一个调调,闪闪地时尚别致.清清爽爽的运动风其实也很拉好感der~", price: "68.00"}]
}
const store = new Vuex.Store({
state,
mutations,
actions,
getters,
})
export default store;

@ -0,0 +1,14 @@
// import {
// ADD_COUNTER,
// ADD_TO_CART
// } from './mutation-types'
export default {
addCounter(state, payload) {
payload.count +=1;
},
addtoCart(state, payload) {
payload.checked = true
state.cartList.push(payload)
}
}

@ -0,0 +1,107 @@
<template>
<div id="cart">
<category-nav-bar class="navbar">
<div slot="center">购物车</div>
</category-nav-bar>
<div class="main">
<div class="empty+card" v-for="item in cart_list">
<div class="empty">
</div>
<div class="card">
<div class="content">
<div>id:{{ item.id }}</div>
<div>产品id:{{ item.productId }}</div>
<div>数量:{{ item.quantity }}</div>
<div>创建时间:{{ item.createdAt }}</div>
<div>更新时间:{{ item.updatedAt }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { getCartItems } from "network/cart.js";
import CategoryNavBar from "components/common/navbar/NavBar";
export default {
name: "Cart",
components: {
CategoryNavBar,
},
data() {
return {
cart_list: [
{
"id": 0,
"userId": 0,
"productId": 0,
"quantity": 0,
"createdAt": "",
"updatedAt": ""
},
{
"id": 0,
"userId": 0,
"productId": 0,
"quantity": 0,
"createdAt": "",
"updatedAt": ""
},
]
};
},
created() {
this.getData();
},
methods: {
getData() {
getCartItems().then((res) => {
console.log(res)
this.cart_list = res
});
},
},
};
</script>
<style scoped>
.navbar {
color: #fff;
font-weight: bold;
letter-spacing: 2px;
}
.scroll {
height: calc(100vh - 44px - 49px);
overflow: hidden;
}
.card {
width: 350px;
height: auto;
margin: auto;
padding: 10px;
border: 1.5px solid #13227a;
border-radius: 5px;
}
.main {
width: 100%;
}
.empty {
height: 10px;
}
</style>

@ -0,0 +1,106 @@
<template>
<div id="order">
<category-nav-bar class="navbar">
<div slot="center">订单</div>
</category-nav-bar>
<div class="main">
<div class="empty+card" v-for="item in records">
<div class="empty">
</div>
<div class="card">
<div class="content">
<div>id:{{ item.id }}</div>
<div>名称:{{ item.name }}</div>
<div>描述:{{ item.description }}</div>
<div>价格:{{ item.price }}</div>
<div>数量:{{ item.quantity }}</div>
<div>创建时间:{{ item.createdAt }}</div>
<div>更新时间:{{ item.updatedAt }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import CategoryNavBar from "components/common/navbar/NavBar";
export default {
name: "Order",
components: {
CategoryNavBar,
},
data() {
return {
categories: [],
categoryData: [],
currentIndex: -1,
records: [
{
"id": 1,
"name": "Apple",
"description": "Apple",
"price": 99,
"quantity": 99,
"createdAt": "2023-05-20",
"updatedAt": "2023-05-20"
},
{
"id": 2,
"name": "Apple",
"description": "Apple",
"price": 99,
"quantity": 99,
"createdAt": "2023-05-20",
"updatedAt": "2023-05-20"
},
]
};
},
created() {
this.getData();
},
methods: {
},
};
</script>
<style scoped>
.navbar {
color: #fff;
font-weight: bold;
letter-spacing: 2px;
}
.scroll {
height: calc(100vh - 44px - 49px);
overflow: hidden;
}
.card {
width: 350px;
height: auto;
margin: auto;
padding: 10px;
border: 1.5px solid #13227a;
border-radius: 5px;
}
.main {
width: 100%;
}
.empty {
height: 10px;
}
</style>

@ -0,0 +1,132 @@
<template>
<div id="product">
<category-nav-bar class="navbar">
<div slot="center">丽娃商品</div>
</category-nav-bar>
<div class="main">
<div class="empty+card" v-for="item in records">
<div class="empty">
</div>
<div class="card">
<div class="content">
<div>id:{{ item.id }}</div>
<div>名称:{{ item.name }}</div>
<div>描述:{{ item.description }}</div>
<div>价格:{{ item.price }}</div>
<div>数量:{{ item.quantity }}</div>
<div>创建时间:{{ item.createdAt }}</div>
<div>更新时间:{{ item.updatedAt }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { getCategory, getSubCategory } from "network/category.js";
import Scroll from "components/common/scroll/Scroll";
import CategoryNavBar from "components/common/navbar/NavBar";
import CategoryMenu from "./childcomps/CategoryMenu";
import CategoryMenuItem from "./childcomps/CategoryMenuItem";
export default {
name: "Product",
components: {
CategoryNavBar,
CategoryMenu,
CategoryMenuItem,
Scroll,
},
data() {
return {
categories: [],
categoryData: [],
currentIndex: -1,
records: [
{
"id": 1,
"name": "Apple",
"description": "Apple",
"price": 99,
"quantity": 99,
"createdAt": "2023-05-20",
"updatedAt": "2023-05-20"
},
{
"id": 2,
"name": "Apple",
"description": "Apple",
"price": 99,
"quantity": 99,
"createdAt": "2023-05-20",
"updatedAt": "2023-05-20"
},
]
};
},
created() {
this.getData();
},
methods: {
getData() {
getCategory().then((res) => {
this.categories = res.data.category.list;
this.getSubData(0);
});
},
getSubData(index) {
this.currentIndex = index
const maitKey = this.categories[index].maitKey;
getSubCategory(maitKey).then((res) => {
this.categoryData = res.data.list;
});
},
menuItemClick(index) {
this.getSubData(index);
},
},
};
</script>
<style scoped>
.navbar {
color: #fff;
font-weight: bold;
letter-spacing: 2px;
}
.scroll {
height: calc(100vh - 44px - 49px);
overflow: hidden;
}
.card {
width: 350px;
height: auto;
margin: auto;
padding: 10px;
border: 1.5px solid #13227a;
border-radius: 5px;
}
.main {
width: 100%;
}
.empty {
height: 10px;
}
</style>

@ -0,0 +1,52 @@
<template>
<div class='menu'>
<div class='menu-item'
:class='{active: currentIndex == index}'
v-for='(item, index) in menuList'
:key='index'
@click='itemClick(index)'>
{{item.title}}
</div>
</div>
</template>
<script>
export default {
name: 'CategoryMenu',
props: {
menuList: {
type: Array,
default: []
}
},
data() {
return {
currentIndex: 0
}
},
methods: {
itemClick(index) {
this.currentIndex = index;
this.$emit('menuItemClick',index)
}
}
}
</script>
<style scoped>
.menu {
width: 100px;
background-color: #f6f6f6;
}
.menu-item {
padding: 15px 0;
font-size: 15px;
color:#333;
text-align: center;
}
.menu-item.active {
background-color: #fff;
color:var(--color-high-text);
font-weight: bold;
}
</style>

@ -0,0 +1,69 @@
<template>
<scroll class="scroll menu-content" ref="scroll">
<div>
<div class="menu-item" v-if='categoryData'>
<div class="subitem" v-for="(item, index) in categoryData" :key="index">
<a :href="item.link">
<img @load='imgLoad' :src="item.image" alt="" />
<div>{{ item.title }}</div>
</a>
</div>
</div>
</div>
</scroll>
</template>
<script>
import Scroll from "components/common/scroll/Scroll";
import {debounce} from "common/utils";
export default {
name: "CategoryMenuItem",
props: {
categoryData: {
type: Array,
default: [],
},
},
data() {
return {
refresh: {}
}
},
mounted() {
this.refresh = debounce(this.$refs.scroll.refresh, 50)
},
components: {
Scroll,
},
methods: {
imgLoad() {
this.refresh()
}
}
};
</script>
<style scoped>
.scroll {
height: calc(100vh - 44px - 49px);
overflow: hidden;
}
.menu-content {
flex: 1;
}
.menu-item {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 15px;
}
.subitem {
padding: 10px;
font-size: 13px;
width: 80px;
}
.subitem img {
width: 50px;
}
</style>

@ -0,0 +1,74 @@
<template>
<div id="user">
<category-nav-bar class="navbar">
<div slot="center">用户</div>
</category-nav-bar>
<div class="main">
</div>
</div>
</template>
<script>
import CategoryNavBar from "components/common/navbar/NavBar";
export default {
name: "User",
components: {
CategoryNavBar,
},
data() {
return {
categories: [],
categoryData: [],
currentIndex: -1,
records: [
]
};
},
created() {
this.getData();
},
methods: {
},
};
</script>
<style scoped>
.navbar {
color: #fff;
font-weight: bold;
letter-spacing: 2px;
}
.scroll {
height: calc(100vh - 44px - 49px);
overflow: hidden;
}
.card {
width: 350px;
height: auto;
margin: auto;
padding: 10px;
border: 1.5px solid #13227a;
border-radius: 5px;
}
.main {
width: 100%;
}
.empty {
height: 10px;
}
</style>

@ -0,0 +1,13 @@
module.exports = {
configureWebpack: {
resolve: {
alias: {
'assets': '@/assets',
'common': '@/common',
'components': '@/components',
'network': '@/network',
'views': '@/views'
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -4,18 +4,18 @@ import axios from "../axios";
const CartPage = () => {
const [cart, setCart] = useState([]);
useEffect(() => {
getCart()
.then((response) => {
setCart(response.data);
})
.catch((error) => {
console.error('Failed to fetch cart', error);
});
}, []);
// useEffect(() => {
// getCart()
// .then((response) => {
// setCart(response.data);
// })
// .catch((error) => {
// console.error('Failed to fetch cart', error);
// });
// }, []);
// 在此处添加 addToCart 和 deleteFromCart 的函数实现
return (
@ -24,7 +24,7 @@ const CartPage = () => {
<div key={item.id}>
<h2>{item.product.name}</h2>
<p>{item.product.description}</p>
<button onClick={() => deleteFromCart(item.product.id)}>Remove</button>
<button>Remove</button>
</div>
))}
{/* 添加到购物车的输入和按钮在此处实现 */}

@ -6,15 +6,15 @@ const OrdersPage = () => {
const [page, setPage] = useState(1);
const size = 10;
useEffect(() => {
getOrders(page, size)
.then((response) => {
setOrders(response.data);
})
.catch((error) => {
console.error('Failed to fetch orders', error);
});
}, [page]);
// useEffect(() => {
// getOrders(page, size)
// .then((response) => {
// setOrders(response.data);
// })
// .catch((error) => {
// console.error('Failed to fetch orders', error);
// });
// }, [page]);
return (
<div>

@ -1,5 +1,6 @@
import React, { useState, useEffect } from "react";
import { getProducts } from '../utils/api';
import LoginPage from "./LoginPage";
const ProductsPage = () => {
const [products, setProducts] = useState([]);
@ -27,4 +28,6 @@ const ProductsPage = () => {
<button onClick={() => setPage(page + 1)}>Next Page</button>
</div>
);
};
};
export default ProductsPage

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save