diff --git a/build/optimize.ts b/build/optimize.ts index 89d049c59..d7c2a696d 100644 --- a/build/optimize.ts +++ b/build/optimize.ts @@ -36,6 +36,7 @@ const include = [ "element-resize-detector", "@amap/amap-jsapi-loader", "el-table-infinite-scroll", + "vue-waterfall-plugin-next", "@wangeditor/editor-for-vue", "vuedraggable/src/vuedraggable" ]; diff --git a/locales/en.yaml b/locales/en.yaml index 213450135..3035c784a 100644 --- a/locales/en.yaml +++ b/locales/en.yaml @@ -39,6 +39,7 @@ menus: hsdialog: Dialog Components hsmessage: Message Tips Components hsvideo: Video Components + hswaterfall: Waterfall Components hsmap: Map Components hsdraggable: Draggable Components hssplitPane: Split Pane diff --git a/locales/zh-CN.yaml b/locales/zh-CN.yaml index 30fa6d9bc..9f52c29c1 100644 --- a/locales/zh-CN.yaml +++ b/locales/zh-CN.yaml @@ -39,6 +39,7 @@ menus: hsdialog: 函数式弹框组件 hsmessage: 消息提示组件 hsvideo: 视频组件 + hswaterfall: 瀑布流组件 hsmap: 地图组件 hsdraggable: 拖拽组件 hssplitPane: 切割面板 diff --git a/package.json b/package.json index 0f47fabe5..a20e88757 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "vue-router": "^4.2.0", "vue-types": "^5.0.2", "vue-virtual-scroller": "2.0.0-beta.7", + "vue-waterfall-plugin-next": "^2.2.1", "vue3-danmaku": "1.4.0-beta.1", "vuedraggable": "^4.1.0", "xgplayer": "^3.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7cb72a87d..1d695a0bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,6 +108,7 @@ specifiers: vue-tsc: ^1.6.5 vue-types: ^5.0.2 vue-virtual-scroller: 2.0.0-beta.7 + vue-waterfall-plugin-next: ^2.2.1 vue3-danmaku: 1.4.0-beta.1 vuedraggable: ^4.1.0 xgplayer: ^3.0.2 @@ -157,6 +158,7 @@ dependencies: vue-router: 4.2.0_vue@3.3.2 vue-types: 5.0.2_vue@3.3.2 vue-virtual-scroller: 2.0.0-beta.7_vue@3.3.2 + vue-waterfall-plugin-next: 2.2.1_vue@3.3.2 vue3-danmaku: 1.4.0-beta.1_vue@3.3.2 vuedraggable: 4.1.0_vue@3.3.2 xgplayer: 3.0.2 @@ -11966,6 +11968,33 @@ packages: vue-resize: 2.0.0-alpha.1_vue@3.3.2 dev: false + /vue-waterfall-plugin-next/2.2.0_vue@3.3.2: + resolution: + { + integrity: sha512-rhrTdAlBnMWWt6737L+E08A7itgK3wHTy1NsSDgR9EPiBPuHYlth8jL2/hp2gIMAS4XUxJBtitfNUyK5qynkEA== + } + dependencies: + animate.css: 4.1.1 + element-plus: 2.3.4_vue@3.3.2 + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + + /vue-waterfall-plugin-next/2.2.1_vue@3.3.2: + resolution: + { + integrity: sha512-wEPT9D9VLTPWxGKrIusBxj9JVyXyXU6RLEqKIm3mJt/DeaTUvKu0sZjLOKK9UztkcJV2LaRALwRoCDOOKbLsiw== + } + dependencies: + animate.css: 4.1.1 + element-plus: 2.3.4_vue@3.3.2 + vue-waterfall-plugin-next: 2.2.0_vue@3.3.2 + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + /vue/3.3.2: resolution: { diff --git a/src/router/modules/components.ts b/src/router/modules/components.ts index 4ce9a4a7a..5fb555b92 100644 --- a/src/router/modules/components.ts +++ b/src/router/modules/components.ts @@ -31,6 +31,15 @@ export default { title: $t("menus.hsmessage") } }, + { + path: "/components/waterfall", + name: "Waterfall", + component: () => import("@/views/components/waterfall/index.vue"), + meta: { + title: $t("menus.hswaterfall"), + extraIcon: "IF-pure-iconfont-new svg" + } + }, { path: "/components/video", name: "Video", diff --git a/src/views/components/waterfall/api.ts b/src/views/components/waterfall/api.ts new file mode 100644 index 000000000..7e3439ce1 --- /dev/null +++ b/src/views/components/waterfall/api.ts @@ -0,0 +1,38 @@ +export function randomID(length = 6) { + return Number( + Math.random().toString().substr(3, length) + Date.now() + ).toString(36); +} + +const COLORS = ["#409EFF", "#67C23A", "#E6A23C", "#F56C6C", "#909399"]; + +function getRandomNum(min: number, max: number) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function randomColor() { + return COLORS[getRandomNum(0, 4)]; +} + +const website = "https://www.getphotoblanket.com"; + +export const getList = ({ page = 1, pageSize = 20 }) => { + const url = `${website}/products.json?page=${page}&limit=${pageSize}`; + return fetch(url) + .then(res => res.json()) + .then(res => res.products) + .then(res => { + return res.map((item: any) => { + return { + id: randomID(), + star: false, + price: item.variants[0].price, + src: { + original: item.images[0].src + }, + backgroundColor: randomColor(), + name: item.title + }; + }); + }); +}; diff --git a/src/views/components/waterfall/error.png b/src/views/components/waterfall/error.png new file mode 100644 index 000000000..aabee2d57 Binary files /dev/null and b/src/views/components/waterfall/error.png differ diff --git a/src/views/components/waterfall/index.vue b/src/views/components/waterfall/index.vue new file mode 100644 index 000000000..577540fe2 --- /dev/null +++ b/src/views/components/waterfall/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/src/views/components/waterfall/loading.png b/src/views/components/waterfall/loading.png new file mode 100644 index 000000000..8f9e6649c Binary files /dev/null and b/src/views/components/waterfall/loading.png differ