feat: 删除pc副本
parent
b0602c1e10
commit
2b6df7cc62
|
@ -1,13 +0,0 @@
|
|||
# editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
|
@ -1,90 +0,0 @@
|
|||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### Node template
|
||||
# Logs
|
||||
/logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
|
||||
# next.js build output
|
||||
.next
|
||||
|
||||
# nuxt.js build output
|
||||
.nuxt
|
||||
|
||||
# Nuxt generate
|
||||
dist
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless
|
||||
|
||||
# IDE / Editor
|
||||
.idea
|
||||
|
||||
# Service worker
|
||||
sw.*
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# Vim swap files
|
||||
*.swp
|
|
@ -1,69 +0,0 @@
|
|||
# LikeSopb2b2c
|
||||
|
||||
## Build Setup
|
||||
|
||||
```bash
|
||||
# install dependencies
|
||||
$ npm install
|
||||
|
||||
# serve with hot reload at localhost:3000
|
||||
$ npm run dev
|
||||
|
||||
# build for production and launch server
|
||||
$ npm run build
|
||||
$ npm run start
|
||||
|
||||
# generate static project
|
||||
$ npm run generate
|
||||
```
|
||||
|
||||
For detailed explanation on how things work, check out the [documentation](https://nuxtjs.org).
|
||||
|
||||
## Special Directories
|
||||
|
||||
You can create the following extra directories, some of which have special behaviors. Only `pages` is required; you can delete them if you don't want to use their functionality.
|
||||
|
||||
### `assets`
|
||||
|
||||
The assets directory contains your uncompiled assets such as Stylus or Sass files, images, or fonts.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/assets).
|
||||
|
||||
### `components`
|
||||
|
||||
The components directory contains your Vue.js components. Components make up the different parts of your page and can be reused and imported into your pages, layouts and even other components.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/components).
|
||||
|
||||
### `layouts`
|
||||
|
||||
Layouts are a great help when you want to change the look and feel of your Nuxt app, whether you want to include a sidebar or have distinct layouts for mobile and desktop.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/layouts).
|
||||
|
||||
|
||||
### `pages`
|
||||
|
||||
This directory contains your application views and routes. Nuxt will read all the `*.vue` files inside this directory and setup Vue Router automatically.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/get-started/routing).
|
||||
|
||||
### `plugins`
|
||||
|
||||
The plugins directory contains JavaScript plugins that you want to run before instantiating the root Vue.js Application. This is the place to add Vue plugins and to inject functions or constants. Every time you need to use `Vue.use()`, you should create a file in `plugins/` and add its path to plugins in `nuxt.config.js`.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/plugins).
|
||||
|
||||
### `static`
|
||||
|
||||
This directory contains your static files. Each file inside this directory is mapped to `/`.
|
||||
|
||||
Example: `/static/robots.txt` is mapped as `/robots.txt`.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/static).
|
||||
|
||||
### `store`
|
||||
|
||||
This directory contains your Vuex store files. Creating a file in this directory automatically activates Vuex.
|
||||
|
||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/store).
|
|
@ -1,223 +0,0 @@
|
|||
|
||||
|
||||
/** S 背景颜色 **/
|
||||
.bg-primary { background-color: $--color-primary; }
|
||||
|
||||
.bg-white { background-color: $--color-white; }
|
||||
|
||||
.bg-body { background-color: $--background-color-base; }
|
||||
/** E 背景颜色 **/
|
||||
|
||||
|
||||
/** S 字体颜色 **/
|
||||
.primary { color: $--color-primary; }
|
||||
|
||||
.black { color: $--color-black; }
|
||||
|
||||
.white { color: $--color-white; }
|
||||
|
||||
.normal { color: $--color-text-primary; }
|
||||
|
||||
.lighter { color: $--color-text-regular; }
|
||||
|
||||
.muted { color: $--color-text-secondary; }
|
||||
/** E 字体颜色 **/
|
||||
|
||||
|
||||
.border-bottom {
|
||||
border-bottom: $--border-base;
|
||||
}
|
||||
.border-top {
|
||||
border-top: $--border-base;
|
||||
}
|
||||
|
||||
.border-left {
|
||||
border-left: $--border-base;
|
||||
}
|
||||
.border-right {
|
||||
border-right: $--border-base;
|
||||
}
|
||||
|
||||
.border {
|
||||
border: $--border-base;
|
||||
}
|
||||
|
||||
// 字体字重
|
||||
@for $i from 100 through 900 {
|
||||
@if $i % 100 == 0 {
|
||||
.weight-#{$i} {
|
||||
font-weight: $i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** S 字体大小 **/
|
||||
.xxl { font-size: 18px; }
|
||||
|
||||
.xl { font-size: 17px; }
|
||||
|
||||
.lg { font-size: 16px; }
|
||||
|
||||
.md { font-size: 15px; }
|
||||
|
||||
.nr { font-size: 14px; }
|
||||
|
||||
.sm { font-size: 13px; }
|
||||
|
||||
.xs { font-size: 12px; }
|
||||
|
||||
.xxs { font-size: 11px; }
|
||||
|
||||
// 字体大小[19-40]
|
||||
@for $i from 19 through 50 {
|
||||
.font-size-#{$i} {
|
||||
font-size: $i + px;
|
||||
}
|
||||
}
|
||||
/** E 字体大小 **/
|
||||
|
||||
|
||||
// 内、外边距[1-60]
|
||||
@for $i from 0 through 60 {
|
||||
// 只要偶数和能被5整除的数
|
||||
@if $i % 2 == 0 or $i % 5 == 0 {
|
||||
// 如:m-30
|
||||
.m-#{$i} {
|
||||
margin: $i + px;
|
||||
}
|
||||
|
||||
// 如:p-30
|
||||
.p-#{$i} {
|
||||
padding: $i + px;
|
||||
}
|
||||
|
||||
@each $short, $long in l left, t top, r right, b bottom {
|
||||
//如: m-l-6
|
||||
// 外边距
|
||||
.m-#{$short}-#{$i} {
|
||||
margin-#{$long}: $i + px;
|
||||
}
|
||||
|
||||
//如: p-l-30
|
||||
// 内边距
|
||||
.p-#{$short}-#{$i} {
|
||||
padding-#{$long}: $i + px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 行内块元素
|
||||
.inline { display: inline-block; }
|
||||
|
||||
// 块元素
|
||||
.block { display: block; }
|
||||
|
||||
// 触手
|
||||
.pointer { cursor: pointer }
|
||||
|
||||
|
||||
/** S 弹性布局 **/
|
||||
.flex {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.flex-col {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
// 定义flex等分
|
||||
@for $i from 0 through 5 {
|
||||
.flex-#{$i} {
|
||||
flex: $i;
|
||||
}
|
||||
}
|
||||
|
||||
.flex-none { flex: none; }
|
||||
|
||||
.flex-wrap { flex-wrap: wrap; }
|
||||
|
||||
.flex-nowrap { flex-wrap: nowrap; }
|
||||
|
||||
.col-baseline { align-items: baseline; }
|
||||
|
||||
.col-center { align-items: center; }
|
||||
|
||||
.col-top { align-items: flex-start; }
|
||||
|
||||
.col-bottom { align-items: flex-end; }
|
||||
|
||||
.col-stretch { align-items:stretch; }
|
||||
|
||||
.row-center { justify-content: center; }
|
||||
|
||||
.row-left { justify-content: flex-start; }
|
||||
|
||||
.row-right { justify-content: flex-end; }
|
||||
|
||||
.row-between { justify-content: space-between; }
|
||||
|
||||
.row-around { justify-content: space-around; }
|
||||
|
||||
/** E 弹性布局 **/
|
||||
|
||||
|
||||
/** S 内容排序方式 **/
|
||||
.text-left { text-align: left; }
|
||||
|
||||
.text-center { text-align: center; }
|
||||
|
||||
.text-right { text-align: right; }
|
||||
/** E 内容排序方式 **/
|
||||
|
||||
|
||||
/** S 文本行数限制 **/
|
||||
.line-1 {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.line-2 { -webkit-line-clamp: 2; }
|
||||
|
||||
.line-3 { -webkit-line-clamp: 3; }
|
||||
|
||||
.line-4 { -webkit-line-clamp: 4; }
|
||||
|
||||
.line-5 { -webkit-line-clamp: 5; }
|
||||
|
||||
.line-2, .line-3, .line-4, .line-5 {
|
||||
overflow: hidden;
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box; // 弹性伸缩盒
|
||||
-webkit-box-orient: vertical; // 设置伸缩盒子元素排列方式
|
||||
}
|
||||
/** E 文本行数限制 **/
|
||||
|
||||
|
||||
|
||||
/* 中划线 */
|
||||
.line-through {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.clearfix:after{
|
||||
content: "";
|
||||
display: block;
|
||||
clear: both;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.wrapper1180 {
|
||||
width: 1180px;
|
||||
margin: 0 auto;
|
||||
}
|
|
@ -1,985 +0,0 @@
|
|||
|
||||
|
||||
/* Transition
|
||||
-------------------------- */
|
||||
$--all-transition: all .3s cubic-bezier(.645,.045,.355,1) !default;
|
||||
$--fade-transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1) !default;
|
||||
$--fade-linear-transition: opacity 200ms linear !default;
|
||||
$--md-fade-transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1) !default;
|
||||
$--border-transition-base: border-color .2s cubic-bezier(.645,.045,.355,1) !default;
|
||||
$--color-transition-base: color .2s cubic-bezier(.645,.045,.355,1) !default;
|
||||
|
||||
/* Color
|
||||
-------------------------- */
|
||||
/// color|1|Brand Color|0
|
||||
$--color-primary: #FF2C3C !default;
|
||||
/// color|1|Background Color|4
|
||||
$--color-white: #FFFFFF !default;
|
||||
/// color|1|Background Color|4
|
||||
$--color-black: #333333 !default;
|
||||
$--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */
|
||||
$--color-primary-light-2: mix($--color-white, $--color-primary, 20%) !default; /* 66b1ff */
|
||||
$--color-primary-light-3: mix($--color-white, $--color-primary, 30%) !default; /* 79bbff */
|
||||
$--color-primary-light-4: mix($--color-white, $--color-primary, 40%) !default; /* 8cc5ff */
|
||||
$--color-primary-light-5: mix($--color-white, $--color-primary, 50%) !default; /* a0cfff */
|
||||
$--color-primary-light-6: mix($--color-white, $--color-primary, 60%) !default; /* b3d8ff */
|
||||
$--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; /* c6e2ff */
|
||||
$--color-primary-light-8: mix($--color-white, $--color-primary, 80%) !default; /* d9ecff */
|
||||
$--color-primary-light-9: mix($--color-white, $--color-primary, 90%) !default; /* ecf5ff */
|
||||
/// color|1|Functional Color|1
|
||||
$--color-success: #67c23a !default;
|
||||
/// color|1|Functional Color|1
|
||||
$--color-warning: #FB9400 !default;
|
||||
/// color|1|Functional Color|1
|
||||
$--color-danger: #F56C6C !default;
|
||||
/// color|1|Functional Color|1
|
||||
$--color-info: #909399 !default;
|
||||
|
||||
$--color-success-light: mix($--color-white, $--color-success, 80%) !default;
|
||||
$--color-warning-light: mix($--color-white, $--color-warning, 80%) !default;
|
||||
$--color-danger-light: mix($--color-white, $--color-danger, 80%) !default;
|
||||
$--color-info-light: mix($--color-white, $--color-info, 80%) !default;
|
||||
|
||||
$--color-success-lighter: mix($--color-white, $--color-success, 90%) !default;
|
||||
$--color-warning-lighter: mix($--color-white, $--color-warning, 90%) !default;
|
||||
$--color-danger-lighter: mix($--color-white, $--color-danger, 90%) !default;
|
||||
$--color-info-lighter: mix($--color-white, $--color-info, 90%) !default;
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-primary: #333333 !default;
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-regular: #666666 !default;
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-secondary: #999999 !default;
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-placeholder: #999999 !default;
|
||||
/// color|1|Border Color|3
|
||||
$--border-color-base: #E5E5E5E5 !default;
|
||||
/// color|1|Border Color|3
|
||||
$--border-color-light: #f2f2f2f2!default;
|
||||
/// color|1|Border Color|3
|
||||
$--border-color-lighter: #f5f5f5 !default;
|
||||
/// color|1|Border Color|3
|
||||
$--border-color-extra-light: #f5f5f5 !default;
|
||||
|
||||
// Background
|
||||
/// color|1|Background Color|4
|
||||
$--background-color-base: #F5F7F9 !default;
|
||||
|
||||
/* Link
|
||||
-------------------------- */
|
||||
$--link-color: $--color-primary-light-2 !default;
|
||||
$--link-hover-color: $--color-primary !default;
|
||||
|
||||
/* Border
|
||||
-------------------------- */
|
||||
$--border-width-base: 1px !default;
|
||||
$--border-style-base: solid !default;
|
||||
$--border-color-hover: $--color-primary!default;
|
||||
$--border-base: $--border-width-base $--border-style-base $--border-color-base !default;
|
||||
/// borderRadius|1|Radius|0
|
||||
$--border-radius-base: 4px !default;
|
||||
/// borderRadius|1|Radius|0
|
||||
$--border-radius-small: 2px !default;
|
||||
/// borderRadius|1|Radius|0
|
||||
$--border-radius-circle: 100% !default;
|
||||
/// borderRadius|1|Radius|0
|
||||
$--border-radius-zero: 0 !default;
|
||||
|
||||
// Box-shadow
|
||||
/// boxShadow|1|Shadow|1
|
||||
$--box-shadow-base: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04) !default;
|
||||
// boxShadow|1|Shadow|1
|
||||
$--box-shadow-dark: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .12) !default;
|
||||
/// boxShadow|1|Shadow|1
|
||||
$--box-shadow-light: 0 2px 12px 0 rgba(0, 0, 0, 0.1) !default;
|
||||
|
||||
/* Fill
|
||||
-------------------------- */
|
||||
$--fill-base: $--color-white !default;
|
||||
|
||||
/* Typography
|
||||
-------------------------- */
|
||||
$--font-path: 'fonts' !default;
|
||||
$--font-display: 'auto' !default;
|
||||
/// fontSize|1|Font Size|0
|
||||
$--font-size-extra-large: 17px !default;
|
||||
/// fontSize|1|Font Size|0
|
||||
$--font-size-large: 16px !default;
|
||||
/// fontSize|1|Font Size|0
|
||||
$--font-size-medium: 15px !default;
|
||||
/// fontSize|1|Font Size|0
|
||||
$--font-size-base: 14px !default;
|
||||
/// fontSize|1|Font Size|0
|
||||
$--font-size-small: 12px !default;
|
||||
/// fontSize|1|Font Size|0
|
||||
$--font-size-extra-small: 12px !default;
|
||||
/// fontWeight|1|Font Weight|1
|
||||
$--font-weight-primary: 500 !default;
|
||||
/// fontWeight|1|Font Weight|1
|
||||
$--font-weight-secondary: 100 !default;
|
||||
/// fontLineHeight|1|Line Height|2
|
||||
$--font-line-height-primary: 24px !default;
|
||||
/// fontLineHeight|1|Line Height|2
|
||||
$--font-line-height-secondary: 16px !default;
|
||||
$--font-color-disabled-base: #bbb !default;
|
||||
/* Size
|
||||
-------------------------- */
|
||||
$--size-base: 12px !default;
|
||||
|
||||
/* z-index
|
||||
-------------------------- */
|
||||
$--index-normal: 1 !default;
|
||||
$--index-top: 1000 !default;
|
||||
$--index-popper: 2000 !default;
|
||||
|
||||
/* Disable base
|
||||
-------------------------- */
|
||||
$--disabled-fill-base: $--background-color-base !default;
|
||||
$--disabled-color-base: $--color-text-placeholder !default;
|
||||
$--disabled-border-base: $--border-color-light !default;
|
||||
|
||||
/* Icon
|
||||
-------------------------- */
|
||||
$--icon-color: #666 !default;
|
||||
$--icon-color-base: $--color-info !default;
|
||||
|
||||
/* Checkbox
|
||||
-------------------------- */
|
||||
/// fontSize||Font|1
|
||||
$--checkbox-font-size: $--font-size-base !default;
|
||||
/// fontWeight||Font|1
|
||||
$--checkbox-font-weight: 400 !default;
|
||||
/// color||Color|0
|
||||
$--checkbox-font-color: $--color-text-primary !default;
|
||||
$--checkbox-input-height: 14px !default;
|
||||
$--checkbox-input-width: 14px !default;
|
||||
/// borderRadius||Border|2
|
||||
$--checkbox-border-radius: $--border-radius-small !default;
|
||||
/// color||Color|0
|
||||
$--checkbox-background-color: $--color-white !default;
|
||||
$--checkbox-input-border: $--border-base !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--checkbox-disabled-border-color: $--border-color-base !default;
|
||||
$--checkbox-disabled-input-fill: #edf2fc !default;
|
||||
$--checkbox-disabled-icon-color: $--color-text-placeholder !default;
|
||||
|
||||
$--checkbox-disabled-checked-input-fill: $--border-color-extra-light !default;
|
||||
$--checkbox-disabled-checked-input-border-color: $--border-color-base !default;
|
||||
$--checkbox-disabled-checked-icon-color: $--color-text-placeholder !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--checkbox-checked-font-color: $--color-primary !default;
|
||||
$--checkbox-checked-input-border-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--checkbox-checked-background-color: $--color-primary !default;
|
||||
$--checkbox-checked-icon-color: $--fill-base !default;
|
||||
|
||||
$--checkbox-input-border-color-hover: $--color-primary !default;
|
||||
/// height||Other|4
|
||||
$--checkbox-bordered-height: 40px !default;
|
||||
/// padding||Spacing|3
|
||||
$--checkbox-bordered-padding: 9px 20px 9px 10px !default;
|
||||
/// padding||Spacing|3
|
||||
$--checkbox-bordered-medium-padding: 7px 20px 7px 10px !default;
|
||||
/// padding||Spacing|3
|
||||
$--checkbox-bordered-small-padding: 5px 15px 5px 10px !default;
|
||||
/// padding||Spacing|3
|
||||
$--checkbox-bordered-mini-padding: 3px 15px 3px 10px !default;
|
||||
$--checkbox-bordered-medium-input-height: 14px !default;
|
||||
$--checkbox-bordered-medium-input-width: 14px !default;
|
||||
/// height||Other|4
|
||||
$--checkbox-bordered-medium-height: 36px !default;
|
||||
$--checkbox-bordered-small-input-height: 12px !default;
|
||||
$--checkbox-bordered-small-input-width: 12px !default;
|
||||
/// height||Other|4
|
||||
$--checkbox-bordered-small-height: 32px !default;
|
||||
$--checkbox-bordered-mini-input-height: 12px !default;
|
||||
$--checkbox-bordered-mini-input-width: 12px !default;
|
||||
/// height||Other|4
|
||||
$--checkbox-bordered-mini-height: 28px !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--checkbox-button-checked-background-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--checkbox-button-checked-font-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--checkbox-button-checked-border-color: $--color-primary !default;
|
||||
|
||||
|
||||
|
||||
/* Radio
|
||||
-------------------------- */
|
||||
/// fontSize||Font|1
|
||||
$--radio-font-size: $--font-size-base !default;
|
||||
/// fontWeight||Font|1
|
||||
$--radio-font-weight: 400 !default;
|
||||
/// color||Color|0
|
||||
$--radio-font-color: $--color-text-primary !default;
|
||||
$--radio-input-height: 14px !default;
|
||||
$--radio-input-width: 14px !default;
|
||||
/// borderRadius||Border|2
|
||||
$--radio-input-border-radius: $--border-radius-circle !default;
|
||||
/// color||Color|0
|
||||
$--radio-input-background-color: $--color-white !default;
|
||||
$--radio-input-border: $--border-base !default;
|
||||
/// color||Color|0
|
||||
$--radio-input-border-color: $--border-color-base !default;
|
||||
/// color||Color|0
|
||||
$--radio-icon-color: $--color-white !default;
|
||||
|
||||
$--radio-disabled-input-border-color: $--disabled-border-base !default;
|
||||
$--radio-disabled-input-fill: $--disabled-fill-base !default;
|
||||
$--radio-disabled-icon-color: $--disabled-fill-base !default;
|
||||
|
||||
$--radio-disabled-checked-input-border-color: $--disabled-border-base !default;
|
||||
$--radio-disabled-checked-input-fill: $--disabled-fill-base !default;
|
||||
$--radio-disabled-checked-icon-color: $--color-text-placeholder !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--radio-checked-font-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--radio-checked-input-border-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--radio-checked-input-background-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--radio-checked-icon-color: $--color-primary !default;
|
||||
|
||||
$--radio-input-border-color-hover: $--color-primary !default;
|
||||
|
||||
$--radio-bordered-height: 40px !default;
|
||||
$--radio-bordered-padding: 12px 20px 0 10px !default;
|
||||
$--radio-bordered-medium-padding: 10px 20px 0 10px !default;
|
||||
$--radio-bordered-small-padding: 8px 15px 0 10px !default;
|
||||
$--radio-bordered-mini-padding: 6px 15px 0 10px !default;
|
||||
$--radio-bordered-medium-input-height: 14px !default;
|
||||
$--radio-bordered-medium-input-width: 14px !default;
|
||||
$--radio-bordered-medium-height: 36px !default;
|
||||
$--radio-bordered-small-input-height: 12px !default;
|
||||
$--radio-bordered-small-input-width: 12px !default;
|
||||
$--radio-bordered-small-height: 32px !default;
|
||||
$--radio-bordered-mini-input-height: 12px !default;
|
||||
$--radio-bordered-mini-input-width: 12px !default;
|
||||
$--radio-bordered-mini-height: 28px !default;
|
||||
|
||||
/// fontSize||Font|1
|
||||
$--radio-button-font-size: $--font-size-base !default;
|
||||
/// color||Color|0
|
||||
$--radio-button-checked-background-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--radio-button-checked-font-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--radio-button-checked-border-color: $--color-primary !default;
|
||||
$--radio-button-disabled-checked-fill: $--border-color-extra-light !default;
|
||||
|
||||
/* Select
|
||||
-------------------------- */
|
||||
$--select-border-color-hover: $--border-color-hover !default;
|
||||
$--select-disabled-border: $--disabled-border-base !default;
|
||||
/// fontSize||Font|1
|
||||
$--select-font-size: $--font-size-base !default;
|
||||
$--select-close-hover-color: $--color-text-secondary !default;
|
||||
|
||||
$--select-input-color: $--color-text-placeholder !default;
|
||||
$--select-multiple-input-color: #666 !default;
|
||||
/// color||Color|0
|
||||
$--select-input-focus-border-color: $--color-primary !default;
|
||||
/// fontSize||Font|1
|
||||
$--select-input-font-size: $--font-size-base !default;
|
||||
|
||||
$--select-option-color: $--color-text-regular !default;
|
||||
$--select-option-disabled-color: $--color-text-placeholder !default;
|
||||
$--select-option-disabled-background: $--color-white !default;
|
||||
/// height||Other|4
|
||||
$--select-option-height: 34px !default;
|
||||
$--select-option-hover-background: $--background-color-base !default;
|
||||
/// color||Color|0
|
||||
$--select-option-selected-font-color: $--color-primary !default;
|
||||
$--select-option-selected-hover: $--background-color-base !default;
|
||||
|
||||
$--select-group-color: $--color-info !default;
|
||||
$--select-group-height: 30px !default;
|
||||
$--select-group-font-size: $--font-size-base !default;
|
||||
|
||||
$--select-dropdown-background: $--color-white !default;
|
||||
$--select-dropdown-shadow: $--box-shadow-light !default;
|
||||
$--select-dropdown-empty-color: #999 !default;
|
||||
/// height||Other|4
|
||||
$--select-dropdown-max-height: 274px !default;
|
||||
$--select-dropdown-padding: 6px 0 !default;
|
||||
$--select-dropdown-empty-padding: 10px 0 !default;
|
||||
$--select-dropdown-border: solid 1px $--border-color-light !default;
|
||||
|
||||
/* Alert
|
||||
-------------------------- */
|
||||
$--alert-padding: 8px 16px !default;
|
||||
/// borderRadius||Border|2
|
||||
$--alert-border-radius: $--border-radius-base !default;
|
||||
/// fontSize||Font|1
|
||||
$--alert-title-font-size: $--font-size-base !default;
|
||||
/// fontSize||Font|1
|
||||
$--alert-description-font-size: $--font-size-base !default;
|
||||
/// fontSize||Font|1
|
||||
$--alert-close-font-size: $--font-size-base !default;
|
||||
/// fontSize||Font|1
|
||||
$--alert-close-customed-font-size: $--font-size-base !default;
|
||||
|
||||
$--alert-success-color: $--color-success-lighter !default;
|
||||
$--alert-info-color: $--color-info-lighter !default;
|
||||
$--alert-warning-color: $--color-warning-lighter !default;
|
||||
$--alert-danger-color: $--color-danger-lighter !default;
|
||||
|
||||
/// height||Other|4
|
||||
$--alert-icon-size: 16px !default;
|
||||
/// height||Other|4
|
||||
$--alert-icon-large-size: 28px !default;
|
||||
|
||||
/* MessageBox
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--messagebox-title-color: $--color-text-primary !default;
|
||||
$--msgbox-width: 420px !default;
|
||||
$--msgbox-border-radius: 4px !default;
|
||||
/// fontSize||Font|1
|
||||
$--messagebox-font-size: $--font-size-large !default;
|
||||
/// fontSize||Font|1
|
||||
$--messagebox-content-font-size: $--font-size-base !default;
|
||||
/// color||Color|0
|
||||
$--messagebox-content-color: $--color-text-regular !default;
|
||||
/// fontSize||Font|1
|
||||
$--messagebox-error-font-size: 12px !default;
|
||||
$--msgbox-padding-primary: 15px !default;
|
||||
/// color||Color|0
|
||||
$--messagebox-success-color: $--color-success !default;
|
||||
/// color||Color|0
|
||||
$--messagebox-info-color: $--color-info !default;
|
||||
/// color||Color|0
|
||||
$--messagebox-warning-color: $--color-warning !default;
|
||||
/// color||Color|0
|
||||
$--messagebox-danger-color: $--color-danger !default;
|
||||
|
||||
/* Message
|
||||
-------------------------- */
|
||||
$--message-shadow: $--box-shadow-base !default;
|
||||
$--message-min-width: 380px !default;
|
||||
$--message-background-color: #edf2fc !default;
|
||||
$--message-padding: 15px 15px 15px 20px !default;
|
||||
/// color||Color|0
|
||||
$--message-close-icon-color: $--color-text-placeholder !default;
|
||||
/// height||Other|4
|
||||
$--message-close-size: 16px !default;
|
||||
/// color||Color|0
|
||||
$--message-close-hover-color: $--color-text-secondary !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--message-success-font-color: $--color-success !default;
|
||||
/// color||Color|0
|
||||
$--message-info-font-color: $--color-info !default;
|
||||
/// color||Color|0
|
||||
$--message-warning-font-color: $--color-warning !default;
|
||||
/// color||Color|0
|
||||
$--message-danger-font-color: $--color-danger !default;
|
||||
|
||||
/* Notification
|
||||
-------------------------- */
|
||||
$--notification-width: 330px !default;
|
||||
/// padding||Spacing|3
|
||||
$--notification-padding: 14px 26px 14px 13px !default;
|
||||
$--notification-radius: 8px !default;
|
||||
$--notification-shadow: $--box-shadow-light !default;
|
||||
/// color||Color|0
|
||||
$--notification-border-color: $--border-color-lighter !default;
|
||||
$--notification-icon-size: 24px !default;
|
||||
$--notification-close-font-size: $--message-close-size !default;
|
||||
$--notification-group-margin-left: 13px !default;
|
||||
$--notification-group-margin-right: 8px !default;
|
||||
/// fontSize||Font|1
|
||||
$--notification-content-font-size: $--font-size-base !default;
|
||||
/// color||Color|0
|
||||
$--notification-content-color: $--color-text-regular !default;
|
||||
/// fontSize||Font|1
|
||||
$--notification-title-font-size: 16px !default;
|
||||
/// color||Color|0
|
||||
$--notification-title-color: $--color-text-primary !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--notification-close-color: $--color-text-secondary !default;
|
||||
/// color||Color|0
|
||||
$--notification-close-hover-color: $--color-text-regular !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--notification-success-icon-color: $--color-success !default;
|
||||
/// color||Color|0
|
||||
$--notification-info-icon-color: $--color-info !default;
|
||||
/// color||Color|0
|
||||
$--notification-warning-icon-color: $--color-warning !default;
|
||||
/// color||Color|0
|
||||
$--notification-danger-icon-color: $--color-danger !default;
|
||||
|
||||
/* Input
|
||||
-------------------------- */
|
||||
$--input-font-size: $--font-size-base !default;
|
||||
/// color||Color|0
|
||||
$--input-font-color: $--color-text-regular !default;
|
||||
/// height||Other|4
|
||||
$--input-width: 140px !default;
|
||||
/// height||Other|4
|
||||
$--input-height: 40px !default;
|
||||
$--input-border: $--border-base !default;
|
||||
$--input-border-color: $--border-color-base !default;
|
||||
/// borderRadius||Border|2
|
||||
$--input-border-radius: $--border-radius-base !default;
|
||||
$--input-border-color-hover: $--border-color-hover !default;
|
||||
/// color||Color|0
|
||||
$--input-background-color: $--color-white !default;
|
||||
$--input-fill-disabled: $--disabled-fill-base !default;
|
||||
$--input-color-disabled: $--font-color-disabled-base !default;
|
||||
/// color||Color|0
|
||||
$--input-icon-color: $--color-text-placeholder !default;
|
||||
/// color||Color|0
|
||||
$--input-placeholder-color: $--color-text-placeholder !default;
|
||||
$--input-max-width: 314px !default;
|
||||
|
||||
$--input-hover-border: $--border-color-hover !default;
|
||||
$--input-clear-hover-color: $--color-text-secondary !default;
|
||||
|
||||
$--input-focus-border: $--color-primary !default;
|
||||
$--input-focus-fill: $--color-white !default;
|
||||
|
||||
$--input-disabled-fill: $--disabled-fill-base !default;
|
||||
$--input-disabled-border: $--disabled-border-base !default;
|
||||
$--input-disabled-color: $--disabled-color-base !default;
|
||||
$--input-disabled-placeholder-color: $--color-text-placeholder !default;
|
||||
|
||||
/// fontSize||Font|1
|
||||
$--input-medium-font-size: 14px !default;
|
||||
/// height||Other|4
|
||||
$--input-medium-height: 36px !default;
|
||||
/// fontSize||Font|1
|
||||
$--input-small-font-size: $--font-size-small !default;
|
||||
/// height||Other|4
|
||||
$--input-small-height: 32px !default;
|
||||
/// fontSize||Font|1
|
||||
$--input-mini-font-size: 12px !default;
|
||||
/// height||Other|4
|
||||
$--input-mini-height: 28px !default;
|
||||
|
||||
/* Cascader
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--cascader-menu-font-color: $--color-text-regular !default;
|
||||
/// color||Color|0
|
||||
$--cascader-menu-selected-font-color: $--color-primary !default;
|
||||
$--cascader-menu-fill: $--fill-base !default;
|
||||
$--cascader-menu-font-size: $--font-size-base !default;
|
||||
$--cascader-menu-radius: $--border-radius-base !default;
|
||||
$--cascader-menu-border: solid 1px $--border-color-light !default;
|
||||
$--cascader-menu-shadow: $--box-shadow-light !default;
|
||||
$--cascader-node-background-hover: $--background-color-base !default;
|
||||
$--cascader-node-color-disabled:$--color-text-placeholder !default;
|
||||
$--cascader-color-empty:$--color-text-placeholder !default;
|
||||
$--cascader-tag-background: #f0f2f5;
|
||||
|
||||
/* Group
|
||||
-------------------------- */
|
||||
$--group-option-flex: 0 0 (1/5) * 100% !default;
|
||||
$--group-option-offset-bottom: 12px !default;
|
||||
$--group-option-fill-hover: rgba($--color-black, 0.06) !default;
|
||||
$--group-title-color: $--color-black !default;
|
||||
$--group-title-font-size: $--font-size-base !default;
|
||||
$--group-title-width: 66px !default;
|
||||
|
||||
/* Tab
|
||||
-------------------------- */
|
||||
$--tab-font-size: $--font-size-medium !default;
|
||||
$--tab-border-line: 1px solid #e4e4e4 !default;
|
||||
$--tab-header-color-active: $--color-text-secondary !default;
|
||||
$--tab-header-color-hover: $--color-text-regular !default;
|
||||
$--tab-header-color: $--color-text-regular !default;
|
||||
$--tab-header-fill-active: rgba($--color-black, 0.06) !default;
|
||||
$--tab-header-fill-hover: rgba($--color-black, 0.06) !default;
|
||||
$--tab-vertical-header-width: 90px !default;
|
||||
$--tab-vertical-header-count-color: $--color-white !default;
|
||||
$--tab-vertical-header-count-fill: $--color-text-secondary !default;
|
||||
|
||||
/* Button
|
||||
-------------------------- */
|
||||
/// fontSize||Font|1
|
||||
$--button-font-size: 14px !default;
|
||||
/// fontWeight||Font|1
|
||||
$--button-font-weight: 400 !default;
|
||||
/// borderRadius||Border|2
|
||||
$--button-border-radius: $--border-radius-base !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-padding-vertical: 12px !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-padding-horizontal: 20px !default;
|
||||
|
||||
/// fontSize||Font|1
|
||||
$--button-medium-font-size: 13px !default;
|
||||
/// borderRadius||Border|2
|
||||
$--button-medium-border-radius: $--border-radius-base !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-medium-padding-vertical: 10px !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-medium-padding-horizontal: 20px !default;
|
||||
|
||||
/// fontSize||Font|1
|
||||
$--button-small-font-size: 12px !default;
|
||||
$--button-small-border-radius: #{$--border-radius-base - 1} !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-small-padding-vertical: 9px !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-small-padding-horizontal: 15px !default;
|
||||
/// fontSize||Font|1
|
||||
$--button-mini-font-size: 12px !default;
|
||||
$--button-mini-border-radius: #{$--border-radius-base - 1} !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-mini-padding-vertical: 7px !default;
|
||||
/// padding||Spacing|3
|
||||
$--button-mini-padding-horizontal: 12px !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--button-default-font-color: $--color-text-regular !default;
|
||||
/// color||Color|0
|
||||
$--button-default-background-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--button-default-border-color: $--border-color-base !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--button-disabled-font-color: $--color-text-placeholder !default;
|
||||
/// color||Color|0
|
||||
$--button-disabled-background-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--button-disabled-border-color: $--border-color-lighter !default;
|
||||
|
||||
/// color||Color|0
|
||||
$--button-primary-border-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--button-primary-font-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--button-primary-background-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--button-success-border-color: $--color-success !default;
|
||||
/// color||Color|0
|
||||
$--button-success-font-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--button-success-background-color: $--color-success !default;
|
||||
/// color||Color|0
|
||||
$--button-warning-border-color: $--color-warning !default;
|
||||
/// color||Color|0
|
||||
$--button-warning-font-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--button-warning-background-color: $--color-warning !default;
|
||||
/// color||Color|0
|
||||
$--button-danger-border-color: $--color-danger !default;
|
||||
/// color||Color|0
|
||||
$--button-danger-font-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--button-danger-background-color: $--color-danger !default;
|
||||
/// color||Color|0
|
||||
$--button-info-border-color: $--color-info !default;
|
||||
/// color||Color|0
|
||||
$--button-info-font-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--button-info-background-color: $--color-info !default;
|
||||
|
||||
$--button-hover-tint-percent: 20% !default;
|
||||
$--button-active-shade-percent: 10% !default;
|
||||
|
||||
|
||||
/* cascader
|
||||
-------------------------- */
|
||||
$--cascader-height: 200px !default;
|
||||
|
||||
/* Switch
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--switch-on-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--switch-off-color: $--border-color-base !default;
|
||||
/// fontSize||Font|1
|
||||
$--switch-font-size: $--font-size-base !default;
|
||||
$--switch-core-border-radius: 10px !default;
|
||||
// height||Other|4 TODO: width 代码写死的40px 所以下面这三个属性都没意义
|
||||
$--switch-width: 36px !default;
|
||||
// height||Other|4
|
||||
$--switch-height: 18px !default;
|
||||
// height||Other|4
|
||||
$--switch-button-size: 14px !default;
|
||||
|
||||
/* Dialog
|
||||
-------------------------- */
|
||||
$--dialog-background-color: $--color-white !default;
|
||||
$--dialog-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3) !default;
|
||||
/// fontSize||Font|1
|
||||
$--dialog-title-font-size: $--font-size-large !default;
|
||||
/// fontSize||Font|1
|
||||
$--dialog-content-font-size: $--font-size-base !default;
|
||||
/// fontLineHeight||LineHeight|2
|
||||
$--dialog-font-line-height: $--font-line-height-primary !default;
|
||||
/// padding||Spacing|3
|
||||
$--dialog-padding-primary: 20px !default;
|
||||
|
||||
/* Table
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--table-border-color: $--border-color-light !default;
|
||||
$--table-border: 1px solid $--table-border-color !default;
|
||||
/// color||Color|0
|
||||
$--table-font-color: $--color-text-primary !default;
|
||||
/// color||Color|0
|
||||
$--table-header-font-color: $--color-text-primary !default;
|
||||
/// color||Color|0
|
||||
$--table-row-hover-background-color: #F5F8FF !default;
|
||||
$--table-current-row-background-color: $--color-primary-light-9 !default;
|
||||
/// color||Color|0
|
||||
$--table-header-background-color: $--color-white !default;
|
||||
$--table-fixed-box-shadow: 0 0 10px rgba(0, 0, 0, .12) !default;
|
||||
|
||||
/* Pagination
|
||||
-------------------------- */
|
||||
/// fontSize||Font|1
|
||||
$--pagination-font-size: $--font-size-base !default;
|
||||
/// color||Color|0
|
||||
$--pagination-background-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--pagination-font-color: $--color-text-primary !default;
|
||||
$--pagination-border-radius: 3px !default;
|
||||
/// color||Color|0
|
||||
$--pagination-button-color: $--color-text-primary !default;
|
||||
/// height||Other|4
|
||||
$--pagination-button-width: 35.5px !default;
|
||||
/// height||Other|4
|
||||
$--pagination-button-height: 28px !default;
|
||||
/// color||Color|0
|
||||
$--pagination-button-disabled-color: $--color-text-placeholder !default;
|
||||
/// color||Color|0
|
||||
$--pagination-button-disabled-background-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--pagination-hover-color: $--color-primary !default;
|
||||
|
||||
/* Popup
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--popup-modal-background-color: $--color-black !default;
|
||||
/// opacity||Other|1
|
||||
$--popup-modal-opacity: 0.5 !default;
|
||||
|
||||
/* Popover
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--popover-background-color: $--color-white !default;
|
||||
/// fontSize||Font|1
|
||||
$--popover-font-size: $--font-size-base !default;
|
||||
/// color||Color|0
|
||||
$--popover-border-color: $--border-color-lighter !default;
|
||||
$--popover-arrow-size: 6px !default;
|
||||
/// padding||Spacing|3
|
||||
$--popover-padding: 12px !default;
|
||||
$--popover-padding-large: 18px 20px !default;
|
||||
/// fontSize||Font|1
|
||||
$--popover-title-font-size: $--font-size-medium !default;
|
||||
/// color||Color|0
|
||||
$--popover-title-font-color: $--color-text-primary !default;
|
||||
|
||||
/* Tooltip
|
||||
-------------------------- */
|
||||
/// color|1|Color|0
|
||||
$--tooltip-fill: $--color-text-primary !default;
|
||||
/// color|1|Color|0
|
||||
$--tooltip-color: $--color-white !default;
|
||||
/// fontSize||Font|1
|
||||
$--tooltip-font-size: 12px !default;
|
||||
/// color||Color|0
|
||||
$--tooltip-border-color: $--color-text-primary !default;
|
||||
$--tooltip-arrow-size: 6px !default;
|
||||
/// padding||Spacing|3
|
||||
$--tooltip-padding: 10px !default;
|
||||
|
||||
/* Tag
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--tag-info-color: $--color-info !default;
|
||||
/// color||Color|0
|
||||
$--tag-primary-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--tag-success-color: $--color-success !default;
|
||||
/// color||Color|0
|
||||
$--tag-warning-color: $--color-warning !default;
|
||||
/// color||Color|0
|
||||
$--tag-danger-color: $--color-danger !default;
|
||||
/// fontSize||Font|1
|
||||
$--tag-font-size: 12px !default;
|
||||
$--tag-border-radius: 4px !default;
|
||||
$--tag-padding: 0 10px !default;
|
||||
|
||||
/* Tree
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--tree-node-hover-background-color: $--background-color-base !default;
|
||||
/// color||Color|0
|
||||
$--tree-font-color: $--color-text-regular !default;
|
||||
/// color||Color|0
|
||||
$--tree-expand-icon-color: $--color-text-placeholder !default;
|
||||
|
||||
/* Dropdown
|
||||
-------------------------- */
|
||||
$--dropdown-menu-box-shadow: $--box-shadow-light !default;
|
||||
$--dropdown-menuItem-hover-fill: $--color-primary-light-9 !default;
|
||||
$--dropdown-menuItem-hover-color: $--link-color !default;
|
||||
|
||||
/* Badge
|
||||
-------------------------- */
|
||||
/// color||Color|0
|
||||
$--badge-background-color: $--color-danger !default;
|
||||
$--badge-radius: 10px !default;
|
||||
/// fontSize||Font|1
|
||||
$--badge-font-size: 12px !default;
|
||||
/// padding||Spacing|3
|
||||
$--badge-padding: 6px !default;
|
||||
/// height||Other|4
|
||||
$--badge-size: 18px !default;
|
||||
|
||||
/* Card
|
||||
--------------------------*/
|
||||
/// color||Color|0
|
||||
$--card-border-color: $--border-color-light !default;
|
||||
$--card-border-radius: 4px !default;
|
||||
/// padding||Spacing|3
|
||||
$--card-padding: 20px !default;
|
||||
|
||||
/* Slider
|
||||
--------------------------*/
|
||||
/// color||Color|0
|
||||
$--slider-main-background-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--slider-runway-background-color: $--border-color-light !default;
|
||||
$--slider-button-hover-color: mix($--color-primary, black, 97%) !default;
|
||||
$--slider-stop-background-color: $--color-white !default;
|
||||
$--slider-disable-color: $--color-text-placeholder !default;
|
||||
$--slider-margin: 16px 0 !default;
|
||||
$--slider-border-radius: 3px !default;
|
||||
/// height|1|Other|4
|
||||
$--slider-height: 6px !default;
|
||||
/// height||Other|4
|
||||
$--slider-button-size: 10px !default;
|
||||
$--slider-button-wrapper-size: 36px !default;
|
||||
$--slider-button-wrapper-offset: -15px !default;
|
||||
|
||||
/* Steps
|
||||
--------------------------*/
|
||||
$--steps-border-color: $--disabled-border-base !default;
|
||||
$--steps-border-radius: 4px !default;
|
||||
$--steps-padding: 20px !default;
|
||||
|
||||
/* Menu
|
||||
--------------------------*/
|
||||
/// fontSize||Font|1
|
||||
$--menu-item-font-size: $--font-size-base !default;
|
||||
/// color||Color|0
|
||||
$--menu-item-font-color: $--color-text-primary !default;
|
||||
/// color||Color|0
|
||||
$--menu-background-color: $--color-white !default;
|
||||
$--menu-item-hover-fill: $--color-primary-light-9 !default;
|
||||
|
||||
/* Rate
|
||||
--------------------------*/
|
||||
$--rate-height: 20px !default;
|
||||
/// fontSize||Font|1
|
||||
$--rate-font-size: $--font-size-base !default;
|
||||
/// height||Other|3
|
||||
$--rate-icon-size: 18px !default;
|
||||
/// margin||Spacing|2
|
||||
$--rate-icon-margin: 6px !default;
|
||||
$--rate-icon-color: $--color-text-placeholder !default;
|
||||
|
||||
/* DatePicker
|
||||
--------------------------*/
|
||||
$--datepicker-font-color: $--color-text-regular !default;
|
||||
/// color|1|Color|0
|
||||
$--datepicker-off-font-color: $--color-text-placeholder !default;
|
||||
/// color||Color|0
|
||||
$--datepicker-header-font-color: $--color-text-regular !default;
|
||||
$--datepicker-icon-color: $--color-text-primary !default;
|
||||
$--datepicker-border-color: $--disabled-border-base !default;
|
||||
$--datepicker-inner-border-color: #e4e4e4 !default;
|
||||
/// color||Color|0
|
||||
$--datepicker-inrange-background-color: $--border-color-extra-light !default;
|
||||
/// color||Color|0
|
||||
$--datepicker-inrange-hover-background-color: $--border-color-extra-light !default;
|
||||
/// color||Color|0
|
||||
$--datepicker-active-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--datepicker-hover-font-color: $--color-primary !default;
|
||||
$--datepicker-cell-hover-color: #fff !default;
|
||||
|
||||
/* Loading
|
||||
--------------------------*/
|
||||
/// height||Other|4
|
||||
$--loading-spinner-size: 42px !default;
|
||||
/// height||Other|4
|
||||
$--loading-fullscreen-spinner-size: 50px !default;
|
||||
|
||||
/* Scrollbar
|
||||
--------------------------*/
|
||||
$--scrollbar-background-color: rgba($--color-text-secondary, .3) !default;
|
||||
$--scrollbar-hover-background-color: rgba($--color-text-secondary, .5) !default;
|
||||
|
||||
/* Carousel
|
||||
--------------------------*/
|
||||
/// fontSize||Font|1
|
||||
$--carousel-arrow-font-size: 12px !default;
|
||||
$--carousel-arrow-size: 36px !default;
|
||||
$--carousel-arrow-background: rgba(31, 45, 61, 0.11) !default;
|
||||
$--carousel-arrow-hover-background: rgba(31, 45, 61, 0.23) !default;
|
||||
/// width||Other|4
|
||||
$--carousel-indicator-width: 30px !default;
|
||||
/// height||Other|4
|
||||
$--carousel-indicator-height: 2px !default;
|
||||
$--carousel-indicator-padding-horizontal: 4px !default;
|
||||
$--carousel-indicator-padding-vertical: 12px !default;
|
||||
$--carousel-indicator-out-color: $--border-color-hover !default;
|
||||
|
||||
/* Collapse
|
||||
--------------------------*/
|
||||
/// color||Color|0
|
||||
$--collapse-border-color: $--border-color-lighter !default;
|
||||
/// height||Other|4
|
||||
$--collapse-header-height: 48px !default;
|
||||
/// color||Color|0
|
||||
$--collapse-header-background-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--collapse-header-font-color: $--color-text-primary !default;
|
||||
/// fontSize||Font|1
|
||||
$--collapse-header-font-size: 12px !default;
|
||||
/// color||Color|0
|
||||
$--collapse-content-background-color: $--color-white !default;
|
||||
/// fontSize||Font|1
|
||||
$--collapse-content-font-size: 12px !default;
|
||||
/// color||Color|0
|
||||
$--collapse-content-font-color: $--color-text-primary !default;
|
||||
|
||||
/* Transfer
|
||||
--------------------------*/
|
||||
$--transfer-border-color: $--border-color-lighter !default;
|
||||
$--transfer-border-radius: $--border-radius-base !default;
|
||||
/// height||Other|4
|
||||
$--transfer-panel-width: 200px !default;
|
||||
/// height||Other|4
|
||||
$--transfer-panel-header-height: 40px !default;
|
||||
/// color||Color|0
|
||||
$--transfer-panel-header-background-color: $--background-color-base !default;
|
||||
/// height||Other|4
|
||||
$--transfer-panel-footer-height: 40px !default;
|
||||
/// height||Other|4
|
||||
$--transfer-panel-body-height: 246px !default;
|
||||
/// height||Other|4
|
||||
$--transfer-item-height: 30px !default;
|
||||
/// height||Other|4
|
||||
$--transfer-filter-height: 32px !default;
|
||||
|
||||
/* Header
|
||||
--------------------------*/
|
||||
$--header-padding: 0 20px !default;
|
||||
|
||||
/* Footer
|
||||
--------------------------*/
|
||||
$--footer-padding: 0 20px !default;
|
||||
|
||||
/* Main
|
||||
--------------------------*/
|
||||
$--main-padding: 20px !default;
|
||||
|
||||
/* Timeline
|
||||
--------------------------*/
|
||||
$--timeline-node-size-normal: 12px !default;
|
||||
$--timeline-node-size-large: 14px !default;
|
||||
$--timeline-node-color: $--border-color-light !default;
|
||||
|
||||
/* Backtop
|
||||
--------------------------*/
|
||||
/// color||Color|0
|
||||
$--backtop-background-color: $--color-white !default;
|
||||
/// color||Color|0
|
||||
$--backtop-font-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--backtop-hover-background-color: $--border-color-extra-light !default;
|
||||
|
||||
/* Link
|
||||
--------------------------*/
|
||||
/// fontSize||Font|1
|
||||
$--link-font-size: $--font-size-base !default;
|
||||
/// fontWeight||Font|1
|
||||
$--link-font-weight: $--font-weight-primary !default;
|
||||
/// color||Color|0
|
||||
$--link-default-font-color: $--color-text-regular !default;
|
||||
/// color||Color|0
|
||||
$--link-default-active-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--link-disabled-font-color: $--color-text-placeholder !default;
|
||||
/// color||Color|0
|
||||
$--link-primary-font-color: $--color-primary !default;
|
||||
/// color||Color|0
|
||||
$--link-success-font-color: $--color-success !default;
|
||||
/// color||Color|0
|
||||
$--link-warning-font-color: $--color-warning !default;
|
||||
/// color||Color|0
|
||||
$--link-danger-font-color: $--color-danger !default;
|
||||
/// color||Color|0
|
||||
$--link-info-font-color: $--color-info !default;
|
||||
/* Calendar
|
||||
--------------------------*/
|
||||
/// border||Other|4
|
||||
$--calendar-border: $--table-border !default;
|
||||
/// color||Other|4
|
||||
$--calendar-selected-background-color: #F2F8FE !default;
|
||||
$--calendar-cell-width: 85px !default;
|
||||
|
||||
/* Form
|
||||
-------------------------- */
|
||||
/// fontSize||Font|1
|
||||
$--form-label-font-size: $--font-size-base !default;
|
||||
|
||||
/* Avatar
|
||||
--------------------------*/
|
||||
/// color||Color|0
|
||||
$--avatar-font-color: #fff !default;
|
||||
/// color||Color|0
|
||||
$--avatar-background-color: #C0C4CC !default;
|
||||
/// fontSize||Font Size|1
|
||||
$--avatar-text-font-size: 12px !default;
|
||||
/// fontSize||Font Size|1
|
||||
$--avatar-icon-font-size: 14px !default;
|
||||
/// borderRadius||Border|2
|
||||
$--avatar-border-radius: $--border-radius-base !default;
|
||||
/// size|1|Avatar Size|3
|
||||
$--avatar-large-size: 40px !default;
|
||||
/// size|1|Avatar Size|3
|
||||
$--avatar-medium-size: 36px !default;
|
||||
/// size|1|Avatar Size|3
|
||||
$--avatar-small-size: 28px !default;
|
||||
|
||||
/* Empty
|
||||
-------------------------- */
|
||||
$--empty-padding: 40px 0 !default;
|
||||
$--empty-image-width: 160px !default;
|
||||
$--empty-description-margin-top: 20px !default;
|
||||
$--empty-bottom-margin-top: 20px !default;
|
||||
|
||||
/* Skeleton
|
||||
--------------------------*/
|
||||
$--skeleton-color: #f2f2f2 !default;
|
||||
$--skeleton-to-color: #e6e6e6 !default;
|
||||
|
||||
/* Svg
|
||||
--------------- */
|
||||
$--svg-monochrome-grey: #DCDDE0 !default;
|
||||
|
||||
|
||||
|
||||
/* icon font path, required */
|
||||
$--font-path: '~element-ui/lib/theme-chalk/fonts';
|
||||
|
||||
|
||||
@import "~element-ui/packages/theme-chalk/src/index";
|
|
@ -1,45 +0,0 @@
|
|||
.el-tabs {
|
||||
.el-tabs__nav-wrap::after {
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
.el-tabs__nav-scroll {
|
||||
padding-left: 20px;
|
||||
|
||||
.el-tabs__item {
|
||||
font-weight: normal;
|
||||
font-size: 16px;
|
||||
line-height: 45px;
|
||||
height: 45px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.el-message-box__message {
|
||||
white-space: pre-line;
|
||||
}
|
||||
|
||||
body .el-tabs__content {
|
||||
overflow: inherit;
|
||||
}
|
||||
|
||||
body .el-popover {
|
||||
min-width: 80px;
|
||||
}
|
||||
|
||||
.pagination .el-pagination.is-background .btn-prev,
|
||||
.pagination .el-pagination.is-background .btn-next,
|
||||
.pagination .el-pagination.is-background .el-pager li {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.el-carousel {
|
||||
.el-carousel__arrow {
|
||||
width: 40 px;
|
||||
height: 40 px;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
font-size: 22px;
|
||||
}
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
body {
|
||||
/* 定义一些主题色及基础样式 */
|
||||
font-family: PingFang SC, Arial, Hiragino Sans GB, Microsoft YaHei, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 14px;
|
||||
background-color: $--background-color-base;
|
||||
font-weight: 400;
|
||||
color: $--color-text-primary;
|
||||
line-height: 1.3;
|
||||
}
|
||||
*, :after, :before {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
button, input {
|
||||
font-family: PingFang SC, Arial, Hiragino Sans GB, Microsoft YaHei, sans-serif;
|
||||
font-size: 14px;
|
||||
outline: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
ul,li,ol {
|
||||
margin:0;
|
||||
padding:0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
// 去除number类型input框加减号
|
||||
/* 谷歌 */
|
||||
input::-webkit-outer-spin-button,
|
||||
input::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
/* 火狐 */
|
||||
input{
|
||||
-moz-appearance:textfield;
|
||||
}
|
||||
|
||||
|
||||
a {
|
||||
color: unset;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
/* Color
|
||||
-------------------------- */
|
||||
/// color|1|Brand Color|0
|
||||
$--color-primary: #FF2C3C !default;
|
||||
/// color|1|Background Color|4
|
||||
$--color-white: #FFFFFF !default;
|
||||
/// color|1|Background Color|4
|
||||
$--color-black: #333333 !default;
|
||||
$--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */
|
||||
$--color-primary-light-2: mix($--color-white, $--color-primary, 20%) !default; /* 66b1ff */
|
||||
$--color-primary-light-3: mix($--color-white, $--color-primary, 30%) !default; /* 79bbff */
|
||||
$--color-primary-light-4: mix($--color-white, $--color-primary, 40%) !default; /* 8cc5ff */
|
||||
$--color-primary-light-5: mix($--color-white, $--color-primary, 50%) !default; /* a0cfff */
|
||||
$--color-primary-light-6: mix($--color-white, $--color-primary, 60%) !default; /* b3d8ff */
|
||||
$--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; /* c6e2ff */
|
||||
$--color-primary-light-8: mix($--color-white, $--color-primary, 80%) !default; /* d9ecff */
|
||||
$--color-primary-light-9: mix($--color-white, $--color-primary, 90%) !default; /* ecf5ff */
|
||||
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-primary: #333333 !default;
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-regular: #666666 !default;
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-secondary: #999999 !default;
|
||||
/// color|1|Font Color|2
|
||||
$--color-text-placeholder: #999999 !default;
|
||||
/// color|1|Border Color|3
|
||||
$--border-color-base: #E5E5E5E5 !default;
|
||||
/// color|1|Border Color|3
|
||||
$--border-color-light: #f2f2f2f2!default;
|
||||
/// color|1|Functional Color|1
|
||||
$--color-success: #67c23a !default;
|
||||
/// color|1|Functional Color|1
|
||||
$--color-warning: #FB9400 !default;
|
||||
/// color|1|Functional Color|1
|
||||
$--color-danger: #F56C6C !default;
|
||||
/// color|1|Functional Color|1
|
||||
$--color-info: #909399 !default;
|
||||
// Background
|
||||
/// color|1|Background Color|4
|
||||
$--background-color-base: #F5F7F9 !default;
|
||||
|
||||
/* Border
|
||||
-------------------------- */
|
||||
$--border-width-base: 1px !default;
|
||||
$--border-style-base: solid !default;
|
||||
$--border-color-hover: $--color-primary!default;
|
||||
$--border-base: $--border-width-base $--border-style-base $--border-color-base !default;
|
||||
|
||||
$--font-size-base: 14px !default;
|
|
@ -1,539 +0,0 @@
|
|||
/* Logo 字体 */
|
||||
@font-face {
|
||||
font-family: "iconfont logo";
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-family: "iconfont logo";
|
||||
font-size: 160px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
/* tabs */
|
||||
.nav-tabs {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-more {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
#tabs {
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
#tabs li {
|
||||
cursor: pointer;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
border-bottom: 2px solid transparent;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
margin-bottom: -1px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
|
||||
#tabs .active {
|
||||
border-bottom-color: #f00;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.tab-container .content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* 页面布局 */
|
||||
.main {
|
||||
padding: 30px 100px;
|
||||
width: 960px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.main .logo {
|
||||
color: #333;
|
||||
text-align: left;
|
||||
margin-bottom: 30px;
|
||||
line-height: 1;
|
||||
height: 110px;
|
||||
margin-top: -50px;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.main .logo a {
|
||||
font-size: 160px;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.helps {
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.helps pre {
|
||||
padding: 20px;
|
||||
margin: 10px 0;
|
||||
border: solid 1px #e7e1cd;
|
||||
background-color: #fffdef;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.icon_lists {
|
||||
width: 100% !important;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.icon_lists li {
|
||||
width: 100px;
|
||||
margin-bottom: 10px;
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
list-style: none !important;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.icon_lists li .code-name {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.icon_lists .icon {
|
||||
display: block;
|
||||
height: 100px;
|
||||
line-height: 100px;
|
||||
font-size: 42px;
|
||||
margin: 10px auto;
|
||||
color: #333;
|
||||
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
-moz-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
transition: font-size 0.25s linear, width 0.25s linear;
|
||||
}
|
||||
|
||||
.icon_lists .icon:hover {
|
||||
font-size: 100px;
|
||||
}
|
||||
|
||||
.icon_lists .svg-icon {
|
||||
/* 通过设置 font-size 来改变图标大小 */
|
||||
width: 1em;
|
||||
/* 图标和文字相邻时,垂直对齐 */
|
||||
vertical-align: -0.15em;
|
||||
/* 通过设置 color 来改变 SVG 的颜色/fill */
|
||||
fill: currentColor;
|
||||
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
|
||||
normalize.css 中也包含这行 */
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.icon_lists li .name,
|
||||
.icon_lists li .code-name {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* markdown 样式 */
|
||||
.markdown {
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.markdown img {
|
||||
vertical-align: middle;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
color: #404040;
|
||||
font-weight: 500;
|
||||
line-height: 40px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown h2,
|
||||
.markdown h3,
|
||||
.markdown h4,
|
||||
.markdown h5,
|
||||
.markdown h6 {
|
||||
color: #404040;
|
||||
margin: 1.6em 0 0.6em 0;
|
||||
font-weight: 500;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
.markdown h2 {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.markdown h3 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.markdown h4 {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.markdown h5 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown h6 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown hr {
|
||||
height: 1px;
|
||||
border: 0;
|
||||
background: #e9e9e9;
|
||||
margin: 16px 0;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown>p,
|
||||
.markdown>blockquote,
|
||||
.markdown>.highlight,
|
||||
.markdown>ol,
|
||||
.markdown>ul {
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.markdown ul>li {
|
||||
list-style: circle;
|
||||
}
|
||||
|
||||
.markdown>ul li,
|
||||
.markdown blockquote ul>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown>ul li p,
|
||||
.markdown>ol li p {
|
||||
margin: 0.6em 0;
|
||||
}
|
||||
|
||||
.markdown ol>li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.markdown>ol li,
|
||||
.markdown blockquote ol>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown code {
|
||||
margin: 0 3px;
|
||||
padding: 0 5px;
|
||||
background: #eee;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.markdown strong,
|
||||
.markdown b {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0px;
|
||||
empty-cells: show;
|
||||
border: 1px solid #e9e9e9;
|
||||
width: 95%;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
white-space: nowrap;
|
||||
color: #333;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table th,
|
||||
.markdown>table td {
|
||||
border: 1px solid #e9e9e9;
|
||||
padding: 8px 16px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
background: #F7F7F7;
|
||||
}
|
||||
|
||||
.markdown blockquote {
|
||||
font-size: 90%;
|
||||
color: #999;
|
||||
border-left: 4px solid #e9e9e9;
|
||||
padding-left: 0.8em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown blockquote p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.markdown .anchor {
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.markdown .waiting {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.markdown h1:hover .anchor,
|
||||
.markdown h2:hover .anchor,
|
||||
.markdown h3:hover .anchor,
|
||||
.markdown h4:hover .anchor,
|
||||
.markdown h5:hover .anchor,
|
||||
.markdown h6:hover .anchor {
|
||||
opacity: 1;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.markdown>br,
|
||||
.markdown>p>br {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
background: white;
|
||||
padding: 0.5em;
|
||||
color: #333333;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-meta {
|
||||
color: #969896;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-strong,
|
||||
.hljs-emphasis,
|
||||
.hljs-quote {
|
||||
color: #df5000;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-type {
|
||||
color: #a71d5d;
|
||||
}
|
||||
|
||||
.hljs-literal,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-attribute {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.hljs-section,
|
||||
.hljs-name {
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.hljs-tag {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-attr,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo {
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.hljs-addition {
|
||||
color: #55a532;
|
||||
background-color: #eaffea;
|
||||
}
|
||||
|
||||
.hljs-deletion {
|
||||
color: #bd2c00;
|
||||
background-color: #ffecec;
|
||||
}
|
||||
|
||||
.hljs-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* 代码高亮 */
|
||||
/* PrismJS 1.15.0
|
||||
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
|
||||
/**
|
||||
* prism.js default theme for JavaScript, CSS and HTML
|
||||
* Based on dabblet (http://dabblet.com)
|
||||
* @author Lea Verou
|
||||
*/
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: black;
|
||||
background: none;
|
||||
text-shadow: 0 1px white;
|
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
line-height: 1.5;
|
||||
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::-moz-selection,
|
||||
pre[class*="language-"] ::-moz-selection,
|
||||
code[class*="language-"]::-moz-selection,
|
||||
code[class*="language-"] ::-moz-selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection,
|
||||
pre[class*="language-"] ::selection,
|
||||
code[class*="language-"]::selection,
|
||||
code[class*="language-"] ::selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*="language-"] {
|
||||
padding: 1em;
|
||||
margin: .5em 0;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
:not(pre)>code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
background: #f5f2f0;
|
||||
}
|
||||
|
||||
/* Inline code */
|
||||
:not(pre)>code[class*="language-"] {
|
||||
padding: .1em;
|
||||
border-radius: .3em;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: slategray;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.namespace {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.tag,
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.deleted {
|
||||
color: #905;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.attr-name,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin,
|
||||
.token.inserted {
|
||||
color: #690;
|
||||
}
|
||||
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string {
|
||||
color: #9a6e3a;
|
||||
background: hsla(0, 0%, 100%, .5);
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value,
|
||||
.token.keyword {
|
||||
color: #07a;
|
||||
}
|
||||
|
||||
.token.function,
|
||||
.token.class-name {
|
||||
color: #DD4A68;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important,
|
||||
.token.variable {
|
||||
color: #e90;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
|
@ -1,579 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>iconfont Demo</title>
|
||||
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i2/O1CN01ZyAlrn1MwaMhqz36G_!!6000000001499-73-tps-64-64.ico" type="image/x-icon"/>
|
||||
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01EYTRnJ297D6vehehJ_!!6000000008020-55-tps-64-64.svg"/>
|
||||
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
|
||||
<link rel="stylesheet" href="demo.css">
|
||||
<link rel="stylesheet" href="iconfont.css">
|
||||
<script src="iconfont.js"></script>
|
||||
<!-- jQuery -->
|
||||
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
|
||||
<!-- 代码高亮 -->
|
||||
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
|
||||
<style>
|
||||
.main .logo {
|
||||
margin-top: 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.main .logo a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.main .logo .sub-title {
|
||||
margin-left: 0.5em;
|
||||
font-size: 22px;
|
||||
color: #fff;
|
||||
background: linear-gradient(-45deg, #3967FF, #B500FE);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="main">
|
||||
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
|
||||
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
|
||||
|
||||
</a></h1>
|
||||
<div class="nav-tabs">
|
||||
<ul id="tabs" class="dib-box">
|
||||
<li class="dib active"><span>Unicode</span></li>
|
||||
<li class="dib"><span>Font class</span></li>
|
||||
<li class="dib"><span>Symbol</span></li>
|
||||
</ul>
|
||||
|
||||
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=2399990" target="_blank" class="nav-more">查看项目</a>
|
||||
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<div class="content unicode" style="display: block;">
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">微信</div>
|
||||
<div class="code-name">&#xe637;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">微信</div>
|
||||
<div class="code-name">&#xe607;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">YUAN</div>
|
||||
<div class="code-name">&#xe785;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">comment</div>
|
||||
<div class="code-name">&#xe8e8;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">微信</div>
|
||||
<div class="code-name">&#xe8bb;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">icon_order</div>
|
||||
<div class="code-name">&#xe64e;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">shouhou</div>
|
||||
<div class="code-name">&#xe64b;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">peisong</div>
|
||||
<div class="code-name">&#xe64c;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">fuwu</div>
|
||||
<div class="code-name">&#xe64d;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">自营</div>
|
||||
<div class="code-name">&#xe64a;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">正品</div>
|
||||
<div class="code-name">&#xe648;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">top</div>
|
||||
<div class="code-name">&#xe646;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">coupons</div>
|
||||
<div class="code-name">&#xe74a;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">service</div>
|
||||
<div class="code-name">&#xe764;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">survey</div>
|
||||
<div class="code-name">&#xe767;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">collection</div>
|
||||
<div class="code-name">&#xe79d;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">cart-Empty</div>
|
||||
<div class="code-name">&#xe7b2;</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="article markdown">
|
||||
<h2 id="unicode-">Unicode 引用</h2>
|
||||
<hr>
|
||||
|
||||
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
|
||||
<ul>
|
||||
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
|
||||
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
|
||||
</ul>
|
||||
<blockquote>
|
||||
<p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
|
||||
</blockquote>
|
||||
<p>Unicode 使用步骤如下:</p>
|
||||
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
|
||||
<pre><code class="language-css"
|
||||
>@font-face {
|
||||
font-family: 'iconfont';
|
||||
src: url('iconfont.woff2?t=1635478222086') format('woff2'),
|
||||
url('iconfont.woff?t=1635478222086') format('woff'),
|
||||
url('iconfont.ttf?t=1635478222086') format('truetype');
|
||||
}
|
||||
</code></pre>
|
||||
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
|
||||
<pre><code class="language-css"
|
||||
>.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
</code></pre>
|
||||
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
|
||||
<pre>
|
||||
<code class="language-html"
|
||||
><span class="iconfont">&#x33;</span>
|
||||
</code></pre>
|
||||
<blockquote>
|
||||
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content font-class">
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-weixin1"></span>
|
||||
<div class="name">
|
||||
微信
|
||||
</div>
|
||||
<div class="code-name">.icon-weixin1
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-weixin2"></span>
|
||||
<div class="name">
|
||||
微信
|
||||
</div>
|
||||
<div class="code-name">.icon-weixin2
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-YUAN"></span>
|
||||
<div class="name">
|
||||
YUAN
|
||||
</div>
|
||||
<div class="code-name">.icon-YUAN
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-comment"></span>
|
||||
<div class="name">
|
||||
comment
|
||||
</div>
|
||||
<div class="code-name">.icon-comment
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-weixin"></span>
|
||||
<div class="name">
|
||||
微信
|
||||
</div>
|
||||
<div class="code-name">.icon-weixin
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-icon_order"></span>
|
||||
<div class="name">
|
||||
icon_order
|
||||
</div>
|
||||
<div class="code-name">.icon-icon_order
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-shouhou"></span>
|
||||
<div class="name">
|
||||
shouhou
|
||||
</div>
|
||||
<div class="code-name">.icon-shouhou
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-peisong"></span>
|
||||
<div class="name">
|
||||
peisong
|
||||
</div>
|
||||
<div class="code-name">.icon-peisong
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-fuwu"></span>
|
||||
<div class="name">
|
||||
fuwu
|
||||
</div>
|
||||
<div class="code-name">.icon-fuwu
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-ziying"></span>
|
||||
<div class="name">
|
||||
自营
|
||||
</div>
|
||||
<div class="code-name">.icon-ziying
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-zhengpin"></span>
|
||||
<div class="name">
|
||||
正品
|
||||
</div>
|
||||
<div class="code-name">.icon-zhengpin
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-top"></span>
|
||||
<div class="name">
|
||||
top
|
||||
</div>
|
||||
<div class="code-name">.icon-top
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-coupons"></span>
|
||||
<div class="name">
|
||||
coupons
|
||||
</div>
|
||||
<div class="code-name">.icon-coupons
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-service"></span>
|
||||
<div class="name">
|
||||
service
|
||||
</div>
|
||||
<div class="code-name">.icon-service
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-survey"></span>
|
||||
<div class="name">
|
||||
survey
|
||||
</div>
|
||||
<div class="code-name">.icon-survey
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-collection"></span>
|
||||
<div class="name">
|
||||
collection
|
||||
</div>
|
||||
<div class="code-name">.icon-collection
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-cart-Empty"></span>
|
||||
<div class="name">
|
||||
cart-Empty
|
||||
</div>
|
||||
<div class="code-name">.icon-cart-Empty
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="article markdown">
|
||||
<h2 id="font-class-">font-class 引用</h2>
|
||||
<hr>
|
||||
|
||||
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
|
||||
<p>与 Unicode 使用方式相比,具有如下特点:</p>
|
||||
<ul>
|
||||
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
|
||||
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
|
||||
</ul>
|
||||
<p>使用步骤如下:</p>
|
||||
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
|
||||
<pre><code class="language-html"><link rel="stylesheet" href="./iconfont.css">
|
||||
</code></pre>
|
||||
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
|
||||
<pre><code class="language-html"><span class="iconfont icon-xxx"></span>
|
||||
</code></pre>
|
||||
<blockquote>
|
||||
<p>"
|
||||
iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content symbol">
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-weixin1"></use>
|
||||
</svg>
|
||||
<div class="name">微信</div>
|
||||
<div class="code-name">#icon-weixin1</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-weixin2"></use>
|
||||
</svg>
|
||||
<div class="name">微信</div>
|
||||
<div class="code-name">#icon-weixin2</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-YUAN"></use>
|
||||
</svg>
|
||||
<div class="name">YUAN</div>
|
||||
<div class="code-name">#icon-YUAN</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-comment"></use>
|
||||
</svg>
|
||||
<div class="name">comment</div>
|
||||
<div class="code-name">#icon-comment</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-weixin"></use>
|
||||
</svg>
|
||||
<div class="name">微信</div>
|
||||
<div class="code-name">#icon-weixin</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-icon_order"></use>
|
||||
</svg>
|
||||
<div class="name">icon_order</div>
|
||||
<div class="code-name">#icon-icon_order</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-shouhou"></use>
|
||||
</svg>
|
||||
<div class="name">shouhou</div>
|
||||
<div class="code-name">#icon-shouhou</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-peisong"></use>
|
||||
</svg>
|
||||
<div class="name">peisong</div>
|
||||
<div class="code-name">#icon-peisong</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-fuwu"></use>
|
||||
</svg>
|
||||
<div class="name">fuwu</div>
|
||||
<div class="code-name">#icon-fuwu</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-ziying"></use>
|
||||
</svg>
|
||||
<div class="name">自营</div>
|
||||
<div class="code-name">#icon-ziying</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-zhengpin"></use>
|
||||
</svg>
|
||||
<div class="name">正品</div>
|
||||
<div class="code-name">#icon-zhengpin</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-top"></use>
|
||||
</svg>
|
||||
<div class="name">top</div>
|
||||
<div class="code-name">#icon-top</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-coupons"></use>
|
||||
</svg>
|
||||
<div class="name">coupons</div>
|
||||
<div class="code-name">#icon-coupons</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-service"></use>
|
||||
</svg>
|
||||
<div class="name">service</div>
|
||||
<div class="code-name">#icon-service</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-survey"></use>
|
||||
</svg>
|
||||
<div class="name">survey</div>
|
||||
<div class="code-name">#icon-survey</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-collection"></use>
|
||||
</svg>
|
||||
<div class="name">collection</div>
|
||||
<div class="code-name">#icon-collection</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-cart-Empty"></use>
|
||||
</svg>
|
||||
<div class="name">cart-Empty</div>
|
||||
<div class="code-name">#icon-cart-Empty</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="article markdown">
|
||||
<h2 id="symbol-">Symbol 引用</h2>
|
||||
<hr>
|
||||
|
||||
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
|
||||
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
|
||||
<ul>
|
||||
<li>支持多色图标了,不再受单色限制。</li>
|
||||
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
|
||||
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
|
||||
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
|
||||
</ul>
|
||||
<p>使用步骤如下:</p>
|
||||
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
|
||||
<pre><code class="language-html"><script src="./iconfont.js"></script>
|
||||
</code></pre>
|
||||
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
|
||||
<pre><code class="language-html"><style>
|
||||
.icon {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
vertical-align: -0.15em;
|
||||
fill: currentColor;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
</code></pre>
|
||||
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
|
||||
<pre><code class="language-html"><svg class="icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-xxx"></use>
|
||||
</svg>
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.tab-container .content:first').show()
|
||||
|
||||
$('#tabs li').click(function (e) {
|
||||
var tabContent = $('.tab-container .content')
|
||||
var index = $(this).index()
|
||||
|
||||
if ($(this).hasClass('active')) {
|
||||
return
|
||||
} else {
|
||||
$('#tabs li').removeClass('active')
|
||||
$(this).addClass('active')
|
||||
|
||||
tabContent.hide().eq(index).fadeIn()
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,83 +0,0 @@
|
|||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 2399990 */
|
||||
src: url('iconfont.woff2?t=1635478222086') format('woff2'),
|
||||
url('iconfont.woff?t=1635478222086') format('woff'),
|
||||
url('iconfont.ttf?t=1635478222086') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-weixin1:before {
|
||||
content: "\e637";
|
||||
}
|
||||
|
||||
.icon-weixin2:before {
|
||||
content: "\e607";
|
||||
}
|
||||
|
||||
.icon-YUAN:before {
|
||||
content: "\e785";
|
||||
}
|
||||
|
||||
.icon-comment:before {
|
||||
content: "\e8e8";
|
||||
}
|
||||
|
||||
.icon-weixin:before {
|
||||
content: "\e8bb";
|
||||
}
|
||||
|
||||
.icon-icon_order:before {
|
||||
content: "\e64e";
|
||||
}
|
||||
|
||||
.icon-shouhou:before {
|
||||
content: "\e64b";
|
||||
}
|
||||
|
||||
.icon-peisong:before {
|
||||
content: "\e64c";
|
||||
}
|
||||
|
||||
.icon-fuwu:before {
|
||||
content: "\e64d";
|
||||
}
|
||||
|
||||
.icon-ziying:before {
|
||||
content: "\e64a";
|
||||
}
|
||||
|
||||
.icon-zhengpin:before {
|
||||
content: "\e648";
|
||||
}
|
||||
|
||||
.icon-top:before {
|
||||
content: "\e646";
|
||||
}
|
||||
|
||||
.icon-coupons:before {
|
||||
content: "\e74a";
|
||||
}
|
||||
|
||||
.icon-service:before {
|
||||
content: "\e764";
|
||||
}
|
||||
|
||||
.icon-survey:before {
|
||||
content: "\e767";
|
||||
}
|
||||
|
||||
.icon-collection:before {
|
||||
content: "\e79d";
|
||||
}
|
||||
|
||||
.icon-cart-Empty:before {
|
||||
content: "\e7b2";
|
||||
}
|
||||
|
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -1,128 +0,0 @@
|
|||
{
|
||||
"id": "2399990",
|
||||
"name": "likeshop_pc_shop",
|
||||
"font_family": "iconfont",
|
||||
"css_prefix_text": "icon-",
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "6684308",
|
||||
"name": "微信",
|
||||
"font_class": "weixin1",
|
||||
"unicode": "e637",
|
||||
"unicode_decimal": 58935
|
||||
},
|
||||
{
|
||||
"icon_id": "15933094",
|
||||
"name": "微信",
|
||||
"font_class": "weixin2",
|
||||
"unicode": "e607",
|
||||
"unicode_decimal": 58887
|
||||
},
|
||||
{
|
||||
"icon_id": "4765744",
|
||||
"name": "YUAN",
|
||||
"font_class": "YUAN",
|
||||
"unicode": "e785",
|
||||
"unicode_decimal": 59269
|
||||
},
|
||||
{
|
||||
"icon_id": "6598316",
|
||||
"name": "comment",
|
||||
"font_class": "comment",
|
||||
"unicode": "e8e8",
|
||||
"unicode_decimal": 59624
|
||||
},
|
||||
{
|
||||
"icon_id": "11372717",
|
||||
"name": "微信",
|
||||
"font_class": "weixin",
|
||||
"unicode": "e8bb",
|
||||
"unicode_decimal": 59579
|
||||
},
|
||||
{
|
||||
"icon_id": "20318900",
|
||||
"name": "icon_order",
|
||||
"font_class": "icon_order",
|
||||
"unicode": "e64e",
|
||||
"unicode_decimal": 58958
|
||||
},
|
||||
{
|
||||
"icon_id": "20215028",
|
||||
"name": "shouhou",
|
||||
"font_class": "shouhou",
|
||||
"unicode": "e64b",
|
||||
"unicode_decimal": 58955
|
||||
},
|
||||
{
|
||||
"icon_id": "20215029",
|
||||
"name": "peisong",
|
||||
"font_class": "peisong",
|
||||
"unicode": "e64c",
|
||||
"unicode_decimal": 58956
|
||||
},
|
||||
{
|
||||
"icon_id": "20215030",
|
||||
"name": "fuwu",
|
||||
"font_class": "fuwu",
|
||||
"unicode": "e64d",
|
||||
"unicode_decimal": 58957
|
||||
},
|
||||
{
|
||||
"icon_id": "20179589",
|
||||
"name": "自营",
|
||||
"font_class": "ziying",
|
||||
"unicode": "e64a",
|
||||
"unicode_decimal": 58954
|
||||
},
|
||||
{
|
||||
"icon_id": "20179548",
|
||||
"name": "正品",
|
||||
"font_class": "zhengpin",
|
||||
"unicode": "e648",
|
||||
"unicode_decimal": 58952
|
||||
},
|
||||
{
|
||||
"icon_id": "20179252",
|
||||
"name": "top",
|
||||
"font_class": "top",
|
||||
"unicode": "e646",
|
||||
"unicode_decimal": 58950
|
||||
},
|
||||
{
|
||||
"icon_id": "11488015",
|
||||
"name": "coupons",
|
||||
"font_class": "coupons",
|
||||
"unicode": "e74a",
|
||||
"unicode_decimal": 59210
|
||||
},
|
||||
{
|
||||
"icon_id": "11488128",
|
||||
"name": "service",
|
||||
"font_class": "service",
|
||||
"unicode": "e764",
|
||||
"unicode_decimal": 59236
|
||||
},
|
||||
{
|
||||
"icon_id": "11488143",
|
||||
"name": "survey",
|
||||
"font_class": "survey",
|
||||
"unicode": "e767",
|
||||
"unicode_decimal": 59239
|
||||
},
|
||||
{
|
||||
"icon_id": "11494511",
|
||||
"name": "collection",
|
||||
"font_class": "collection",
|
||||
"unicode": "e79d",
|
||||
"unicode_decimal": 59293
|
||||
},
|
||||
{
|
||||
"icon_id": "12011694",
|
||||
"name": "cart-Empty",
|
||||
"font_class": "cart-Empty",
|
||||
"unicode": "e7b2",
|
||||
"unicode_decimal": 59314
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<!--
|
||||
2013-9-30: Created.
|
||||
-->
|
||||
<svg>
|
||||
<metadata>
|
||||
Created by iconfont
|
||||
</metadata>
|
||||
<defs>
|
||||
|
||||
<font id="iconfont" horiz-adv-x="1024" >
|
||||
<font-face
|
||||
font-family="iconfont"
|
||||
font-weight="500"
|
||||
font-stretch="normal"
|
||||
units-per-em="1024"
|
||||
ascent="896"
|
||||
descent="-128"
|
||||
/>
|
||||
<missing-glyph />
|
||||
|
||||
<glyph glyph-name="icon_order" unicode="" d="M810.666667-42.666667H213.333333a85.333333 85.333333 0 0 0-85.333333 85.333334V725.333333a85.333333 85.333333 0 0 0 85.333333 85.333334h597.333334a85.333333 85.333333 0 0 0 85.333333-85.333334v-682.666666a85.333333 85.333333 0 0 0-85.333333-85.333334zM234.666667 746.666667a42.666667 42.666667 0 0 1-42.666667-42.666667v-640a42.666667 42.666667 0 0 1 42.666667-42.666667h554.666666a42.666667 42.666667 0 0 1 42.666667 42.666667v640a42.666667 42.666667 0 0 1-42.666667 42.666667zM298.666667 597.333333h426.666666v-64H298.666667zM298.666667 426.666667h426.666666v-64H298.666667zM298.666667 256h426.666666v-64H298.666667z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="shouhou" unicode="" d="M511.969692-127.958633a508.733026 508.733026 0 0 0-199.258206 40.220259 509.449782 509.449782 0 0 0-162.703642 109.704646 508.343929 508.343929 0 0 0-109.704646 162.7446A508.180099 508.180099 0 0 0 0.001024 384.010035a507.872918 507.872918 0 0 0 40.281695 199.237726 508.323451 508.323451 0 0 0 109.704646 162.703643 509.449782 509.449782 0 0 0 162.703642 109.704646A508.773983 508.773983 0 0 0 511.969692 895.978702a508.773983 508.773983 0 0 0 199.258205-40.220258 510.698985 510.698985 0 0 0 162.7446-109.704646 509.593133 509.593133 0 0 0 109.704646-162.703643A507.872918 507.872918 0 0 0 1023.938359 384.010035a508.180099 508.180099 0 0 0-40.281695-199.299163 509.695527 509.695527 0 0 0-109.704646-162.7446 510.596591 510.596591 0 0 0-162.7446-109.704646A508.733026 508.733026 0 0 0 511.969692-127.958633z m0 1003.458588a488.356673 488.356673 0 0 1-191.312452-38.622916 490.302154 490.302154 0 0 1-156.273316-105.322194 490.896037 490.896037 0 0 1-105.363152-156.21188A488.766248 488.766248 0 0 1 20.479771 384.010035a488.991514 488.991514 0 0 1 38.602437-191.312452 490.957473 490.957473 0 0 1 105.363152-156.232359 490.322632 490.322632 0 0 1 156.273316-105.342673A488.336194 488.336194 0 0 1 511.969692-107.479886a488.336194 488.336194 0 0 1 191.312451 38.622916 489.54444 489.54444 0 0 1 156.232359 105.342673 490.404547 490.404547 0 0 1 105.322194 156.232359A488.971035 488.971035 0 0 1 1003.459612 384.010035a488.72529 488.72529 0 0 1-38.602437 191.271494 490.404547 490.404547 0 0 1-105.322194 156.21188 490.138324 490.138324 0 0 1-156.232359 105.322194A488.356673 488.356673 0 0 1 511.969692 875.499955zM511.99017 670.671531a291.207778 291.207778 0 1 1 286.702454-291.187299 291.207778 291.207778 0 0 1-286.702454 291.187299z m75.566576-336.035755c13.946027 0 25.188858-7.5157 25.188858-16.813051s-11.263311-16.83353-25.188858-16.83353h-53.244742v-57.34049a17.243105 17.243105 0 1 0-33.667059 0v57.34049H436.403116c-13.925548 0-25.188858 7.556658-25.188858 16.854009s11.263311 16.813051 25.188858 16.813051h64.241829v33.523708H436.403116c-13.925548 0-25.188858 7.5157-25.188858 16.854009s11.263311 16.813051 25.188858 16.813051h64.241829v13.413579a33.912805 33.912805 0 0 0-9.911714 7.003731l-70.201143 70.549283c-9.604532 9.604532-12.123418 22.526621-5.713571 28.956948s19.372894 3.809047 28.875033-5.795486l70.221623-70.549282 0.757713-0.757714a30.431418 30.431418 0 0 0 2.764631 3.051334l62.071081 62.050602c9.788841 9.850277 23.140984 12.512514 29.694183 5.959315s3.952398-19.864384-5.959315-29.714661l-62.050603-62.050603a37.168925 37.168925 0 0 0-7.106125-5.570219 22.669973 22.669973 0 0 0 0.348139-3.952398v-12.594429h53.244741c13.946027 0 25.188858-7.5157 25.188859-16.813051s-11.263311-16.854009-25.188859-16.854009h-53.244741v-33.523708h53.244741z m0 0" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="peisong" unicode="" d="M512.050592-127.958633a508.733026 508.733026 0 0 0-199.258205 40.220259 509.449782 509.449782 0 0 0-162.703643 109.704646 508.343929 508.343929 0 0 0-109.704646 162.7446A508.180099 508.180099 0 0 0 0.081925 384.010035a507.872918 507.872918 0 0 0 40.281695 199.237726 508.323451 508.323451 0 0 0 109.704646 162.703643 509.449782 509.449782 0 0 0 162.703642 109.704646A508.773983 508.773983 0 0 0 512.050592 895.978702a508.773983 508.773983 0 0 0 199.258206-40.220258 510.698985 510.698985 0 0 0 162.7446-109.704646 509.593133 509.593133 0 0 0 109.704646-162.703643A507.872918 507.872918 0 0 0 1024.01926 384.010035a508.180099 508.180099 0 0 0-40.281695-199.299163 509.695527 509.695527 0 0 0-109.704646-162.7446 510.596591 510.596591 0 0 0-162.7446-109.704646A508.733026 508.733026 0 0 0 512.050592-127.958633z m0 1003.458588a488.356673 488.356673 0 0 1-191.312451-38.622916 490.302154 490.302154 0 0 1-156.273316-105.322194 490.896037 490.896037 0 0 1-105.363152-156.21188A488.766248 488.766248 0 0 1 20.560672 384.010035a488.991514 488.991514 0 0 1 38.602437-191.312452 490.957473 490.957473 0 0 1 105.363152-156.232359 490.322632 490.322632 0 0 1 156.273316-105.342673A488.336194 488.336194 0 0 1 512.050592-107.479886a488.336194 488.336194 0 0 1 191.312452 38.622916 489.54444 489.54444 0 0 1 156.232359 105.342673 490.404547 490.404547 0 0 1 105.322194 156.232359A488.971035 488.971035 0 0 1 1003.540513 384.010035a488.72529 488.72529 0 0 1-38.602437 191.271494 490.404547 490.404547 0 0 1-105.322195 156.21188 490.138324 490.138324 0 0 1-156.232358 105.322194A488.356673 488.356673 0 0 1 512.050592 875.499955zM838.481815 392.549672a17.468371 17.468371 0 0 1-2.887503 9.113042l-97.540271 146.382082a17.447892 17.447892 0 0 1-14.335123 7.659051h-131.86265a17.32502 17.32502 0 0 1-17.304541-17.32502v-282.258566a17.345498 17.345498 0 0 1 17.345499-17.325019h35.469189a79.232271 79.232271 0 0 1 158.444063 0h35.407753a17.365977 17.365977 0 0 1 17.32502 17.325019v136.388453z m-184.80021 4.710112V502.909638h66.82215l70.42641-105.649854z m52.814687-198.009002a39.605896 39.605896 0 1 0 39.585418 39.605896 39.646854 39.646854 0 0 0-39.585418-39.605896zM525.054597 608.518535H227.785109A22.997633 22.997633 0 0 1 204.807956 585.520902v-323.666591a22.997633 22.997633 0 0 1 22.977153-23.018112h56.193681a79.232271 79.232271 0 0 1 158.444064 0h82.611264a22.997633 22.997633 0 0 1 22.997632 22.997633V585.541381A22.997633 22.997633 0 0 1 525.034118 608.539013z m-161.782099-409.267753a39.605896 39.605896 0 1 0 39.626375 39.605896 39.646854 39.646854 0 0 0-39.626375-39.605896z m0 0" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="fuwu" unicode="" d="M511.977065-127.958633a508.733026 508.733026 0 0 0-199.258206 40.220259 509.449782 509.449782 0 0 0-162.703642 109.704646 508.343929 508.343929 0 0 0-109.704646 162.7446A508.180099 508.180099 0 0 0 0.008397 384.010035a507.872918 507.872918 0 0 0 40.281695 199.237726 508.323451 508.323451 0 0 0 109.704646 162.703643 509.449782 509.449782 0 0 0 162.703643 109.704646A508.773983 508.773983 0 0 0 511.977065 895.978702a508.773983 508.773983 0 0 0 199.258205-40.220258 510.698985 510.698985 0 0 0 162.7446-109.704646 509.593133 509.593133 0 0 0 109.704646-162.703643A507.872918 507.872918 0 0 0 1023.945732 384.010035a508.180099 508.180099 0 0 0-40.281694-199.299163 509.695527 509.695527 0 0 0-109.704646-162.7446 510.596591 510.596591 0 0 0-162.744601-109.704646A508.733026 508.733026 0 0 0 511.977065-127.958633z m0 1003.458588a488.356673 488.356673 0 0 1-191.312452-38.622916 490.302154 490.302154 0 0 1-156.273316-105.322194 490.896037 490.896037 0 0 1-105.363152-156.21188A488.766248 488.766248 0 0 1 20.487144 384.010035a488.991514 488.991514 0 0 1 38.602438-191.312452 490.957473 490.957473 0 0 1 105.363151-156.232359 490.322632 490.322632 0 0 1 156.273316-105.342673A488.336194 488.336194 0 0 1 511.977065-107.479886a488.336194 488.336194 0 0 1 191.312451 38.622916 489.54444 489.54444 0 0 1 156.232359 105.342673 490.404547 490.404547 0 0 1 105.322194 156.232359A488.971035 488.971035 0 0 1 1003.466986 384.010035a488.72529 488.72529 0 0 1-38.602438 191.271494 490.404547 490.404547 0 0 1-105.322194 156.21188 490.138324 490.138324 0 0 1-156.232359 105.322194A488.356673 488.356673 0 0 1 511.977065 875.499955zM517.649678 98.290561H304.322573c-33.380357 0-39.892599 7.372349-37.721851 41.182759a187.564841 187.564841 0 0 0 163.829973 167.802851 918.267002 918.267002 0 0 0 176.117222 0 187.360054 187.360054 0 0 0 163.461356-171.263759c1.31064-29.919449-5.201602-37.291798-35.551104-37.291798-72.412848-0.860107-144.395643-0.430054-216.788013-0.430053z m150.457352 402.796468a153.5906 153.5906 0 0 0-153.058153-151.747513 150.191128 150.191128 0 0 0-146.545912 153.918261 153.119589 153.119589 0 0 0 159.549916 146.975965 144.272771 144.272771 0 0 0 140.054149-149.146713z m0 0M694.524613 481.816529c2.150268 108.107304-80.358602 196.595968-179.74196 192.868836a173.454985 173.454985 0 0 1-127.459719-63.115497 195.449159 195.449159 0 0 1-44.070263-141.651491 119.104391 119.104391 0 0 0-4.751069-29.776098 103.171926 103.171926 0 0 0-31.53727 7.802403 56.910437 56.910437 0 0 0-7.761445 85.662597 118.776731 118.776731 0 0 1 23.755346 35.284881 205.995713 205.995713 0 0 0 391.000711 2.744152c5.201602-12.819695 17.734595-21.994174 23.775824-34.363337a107.267675 107.267675 0 0 0 18.14417-52.691815 68.439971 68.439971 0 0 0-30.71812-41.694729c-21.175024-13.290707-32.765995-2.744152-31.53727 23.36625 0.430054 5.508783 0.430054 10.546555 0.880586 15.584327z m0 0" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="ziying" unicode="" d="M512.012907-127.958633a508.733026 508.733026 0 0 0-199.258205 40.220259 509.449782 509.449782 0 0 0-162.703643 109.704646 508.343929 508.343929 0 0 0-109.704646 162.7446A508.180099 508.180099 0 0 0 0.044239 384.010035a507.872918 507.872918 0 0 0 40.281695 199.237726 508.323451 508.323451 0 0 0 109.704646 162.703643 509.449782 509.449782 0 0 0 162.703643 109.704646A508.773983 508.773983 0 0 0 512.012907 895.978702a508.773983 508.773983 0 0 0 199.258205-40.220258 510.698985 510.698985 0 0 0 162.7446-109.704646 509.593133 509.593133 0 0 0 109.704646-162.703643A507.872918 507.872918 0 0 0 1023.981574 384.010035a508.180099 508.180099 0 0 0-40.281694-199.299163 509.695527 509.695527 0 0 0-109.704646-162.7446 510.596591 510.596591 0 0 0-162.7446-109.704646A508.733026 508.733026 0 0 0 512.012907-127.958633z m0 1003.458588a488.356673 488.356673 0 0 1-191.312452-38.622916 490.302154 490.302154 0 0 1-156.273316-105.322194 490.896037 490.896037 0 0 1-105.363152-156.21188A488.766248 488.766248 0 0 1 20.522986 384.010035a488.991514 488.991514 0 0 1 38.602438-191.312452 490.957473 490.957473 0 0 1 105.363151-156.232359 490.322632 490.322632 0 0 1 156.273317-105.342673A488.336194 488.336194 0 0 1 512.012907-107.479886a488.336194 488.336194 0 0 1 191.312452 38.622916 489.54444 489.54444 0 0 1 156.232358 105.342673 490.404547 490.404547 0 0 1 105.322195 156.232359A488.971035 488.971035 0 0 1 1003.502828 384.010035a488.72529 488.72529 0 0 1-38.602438 191.271494 490.404547 490.404547 0 0 1-105.322194 156.21188 490.138324 490.138324 0 0 1-156.232359 105.322194A488.356673 488.356673 0 0 1 512.012907 875.499955zM754.174087 471.351889v1.044416a8.191499 8.191499 0 0 1-1.003459 3.297079l-33.400836 115.479652A55.026392 55.026392 0 0 1 665.316805 629.652601H361.227895a52.302719 52.302719 0 0 1-52.405113-37.394191L271.838166 473.993648a24.103485 24.103485 0 0 1-0.511969-2.744152 110.585232 110.585232 0 0 1-5.140165-34.097114c0-40.138344 10.771821-72.597157 44.152177-91.294253a95.656226 95.656226 0 0 1 47.797395-12.102939 98.605165 98.605165 0 0 1 77.553014 38.479565 97.663143 97.663143 0 0 1 77.061524-38.479565 96.680163 96.680163 0 0 1 76.549555 38.479565 98.543729 98.543729 0 0 1 77.553014-38.479565 99.485751 99.485751 0 0 1 48.800853 12.102939c32.909346 19.802948 43.660688 51.688357 43.660688 91.847179a103.663416 103.663416 0 0 1-5.160644 33.564666z m-17.263584-175.523338a19.229543 19.229543 0 0 1-18.738053 19.843906 14.53991 14.53991 0 0 1-5.22208-1.126331 110.585232 110.585232 0 0 0-44.766541-8.191499 108.742145 108.742145 0 0 0-73.928275 27.482478 118.30572 118.30572 0 0 0-77.553014-30.861471 113.923268 113.923268 0 0 0-78.085461 27.564393 117.670879 117.670879 0 0 0-78.638388-29.202693 110.810498 110.810498 0 0 0-44.254571 9.911714c-0.511969 0-1.044416 0.552926-1.576864 0.552926-1.023937 0.532447-2.047875 0.532447-2.6008 1.105852a27.113861 27.113861 0 0 1-4.09575 0.532447 19.229543 19.229543 0 0 1-18.738053-19.823426v-106.366611a49.148992 49.148992 0 0 1 47.797395-50.705377h352.500667a49.558567 49.558567 0 0 1 47.899788 50.684899z m0 0" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="zhengpin" unicode="" d="M512.030111-127.958633a508.733026 508.733026 0 0 0-199.258205 40.220259 509.449782 509.449782 0 0 0-162.703643 109.704646 508.343929 508.343929 0 0 0-109.704646 162.7446A508.180099 508.180099 0 0 0 0.061444 384.010035a507.872918 507.872918 0 0 0 40.281694 199.237726 508.323451 508.323451 0 0 0 109.704647 162.703643 509.449782 509.449782 0 0 0 162.703642 109.704646A508.773983 508.773983 0 0 0 512.030111 895.978702a508.773983 508.773983 0 0 0 199.258206-40.220258 510.698985 510.698985 0 0 0 162.7446-109.704646 509.593133 509.593133 0 0 0 109.704646-162.703643A507.872918 507.872918 0 0 0 1023.998779 384.010035a508.180099 508.180099 0 0 0-40.281695-199.299163 509.695527 509.695527 0 0 0-109.704646-162.7446 510.596591 510.596591 0 0 0-162.7446-109.704646A508.733026 508.733026 0 0 0 512.030111-127.958633z m0 1003.458588a488.356673 488.356673 0 0 1-191.312451-38.622916 490.302154 490.302154 0 0 1-156.273317-105.322194 490.896037 490.896037 0 0 1-105.363151-156.21188A488.766248 488.766248 0 0 1 20.54019 384.010035a488.991514 488.991514 0 0 1 38.602438-191.312452 490.957473 490.957473 0 0 1 105.363152-156.232359 490.322632 490.322632 0 0 1 156.273316-105.342673A488.336194 488.336194 0 0 1 512.030111-107.479886a488.336194 488.336194 0 0 1 191.312452 38.622916 489.54444 489.54444 0 0 1 156.232358 105.342673 490.404547 490.404547 0 0 1 105.322195 156.232359A488.971035 488.971035 0 0 1 1003.520032 384.010035a488.72529 488.72529 0 0 1-38.602438 191.271494 490.404547 490.404547 0 0 1-105.322194 156.21188 490.138324 490.138324 0 0 1-156.232358 105.322194A488.356673 488.356673 0 0 1 512.030111 875.499955zM723.903225 348.45893a219.716473 219.716473 0 0 1 23.284335 98.420857A225.266214 225.266214 0 0 1 520.54927 670.302913a225.020469 225.020469 0 0 1-226.699726-223.423126 220.740411 220.740411 0 0 1 23.284335-98.420857l-91.867658-156.826242s58.405386-11.816237 117.445612-23.939655l78.740782-87.915259 84.63866 144.354685c4.914899 0 9.522617-0.65532 14.335122-0.65532s9.502138 0.32766 14.335123 0.65532l84.63866-144.354685 78.740781 87.915259c59.060705 12.143897 117.445612 23.939655 117.445613 23.939655z m-203.353955-84.311a184.615902 184.615902 0 0 0-184.30872 184.697817 184.615902 184.615902 0 0 0 184.30872 184.697816 184.595423 184.595423 0 0 0 184.30872-184.697816 184.595423 184.595423 0 0 0-184.30872-184.697817z m-147.303625 184.697817a147.446976 147.446976 0 0 1 147.303625-147.610807 147.446976 147.446976 0 0 1 147.303625 147.631285 147.446976 147.446976 0 0 1-147.303625 147.631285 147.446976 147.446976 0 0 1-147.303625-147.631285z m0 0" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="top" unicode="" d="M349.793933-127.947165a52.835251 52.835251 0 0 0-52.835251 52.835251v325.940664H140.196492a52.835251 52.835251 0 0 0-36.984676 90.718126l372.013003 360.811929a52.835251 52.835251 0 0 0 73.388163 0l371.907332-360.811929a52.835251 52.835251 0 0 0-36.984675-90.718126h-156.65652v-325.940664a52.835251 52.835251 0 0 0-52.835251-52.835251zM87.308406 896m52.835251 0l739.693514 0q52.835251 0 52.835251-52.835251l0 0q0-52.835251-52.835251-52.835251l-739.693514 0q-52.835251 0-52.835251 52.835251l0 0q0 52.835251 52.835251 52.835251Z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="coupons" unicode="" d="M148.010667 290.709333c50.069333 0 90.666667 40.874667 90.666666 91.285334 0 49.962667-39.893333 90.538667-89.344 91.264V618.666667a64 64 0 0 0 64 64h597.333334a64 64 0 0 0 64-64l-0.021334-145.450667-3.050666-0.064c-48.021333-2.304-86.272-42.24-86.272-91.157333 0-49.962667 39.872-90.56 89.322666-91.285334V149.333333a64 64 0 0 0-64-64H213.333333a64 64 0 0 0-64 64v141.397334l-1.322666-0.021334zM213.333333 241.216V149.333333h597.333334v91.861334a155.370667 155.370667 0 0 0-89.344 140.8A154.837333 154.837333 0 0 0 810.666667 522.432V618.666667H213.333333v-95.893334a155.370667 155.370667 0 0 0 89.322667-140.8 155.370667 155.370667 0 0 0-84.266667-138.282666l-5.056-2.496zM384 298.666667h68.010667v-85.333334H384v85.333334z m0 128h68.010667v-85.333334H384v85.333334z m0 128h68.010667v-85.333334H384v85.333334z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="service" unicode="" d="M673.194667 482.026667h78.72c-14.890667 116.053333-116.629333 205.824-239.914667 205.824-123.306667 0-225.024-89.792-239.914667-205.824h78.72v-264.661334H234.666667a85.333333 85.333333 0 0 0-85.333334 85.333334v93.994666a85.376 85.376 0 0 0 60.693334 81.706667l0.917333 0.256C224.490667 628.842667 354.090667 746.666667 512 746.666667c157.888 0 287.509333-117.802667 301.056-268.010667l0.917333-0.256A85.376 85.376 0 0 0 874.666667 396.693333v-93.994666a85.333333 85.333333 0 0 0-85.333334-85.333334l-55.722666 0.021334v-40.384a106.709333 106.709333 0 0 0-74.368-101.696A78.506667 78.506667 0 0 0 584.704 21.333333h-115.178667a78.421333 78.421333 0 0 0 0 156.821334h115.178667c27.050667 0 50.901333-13.696 64.981333-34.517334a63.744 63.744 0 0 1 23.381334 45.76l0.128 3.754667v288.853333zM584.704 114.133333h-115.178667a14.421333 14.421333 0 0 1 0-28.821333h115.178667a14.421333 14.421333 0 0 1 0 28.821333zM286.805333 418.026667H234.666667a21.333333 21.333333 0 0 1-21.333334-21.333334v-93.994666a21.333333 21.333333 0 0 1 21.333334-21.333334h52.138666v136.661334z m502.528 0h-52.138666v-136.661334H789.333333a21.333333 21.333333 0 0 1 21.333334 21.333334v93.994666a21.333333 21.333333 0 0 1-21.333334 21.333334z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="survey" unicode="" d="M830.784 406.698667l45.098667-45.397334-322.282667-320-14.656 14.762667 14.741333-14.890667h-45.013333v45.376l-0.149333 0.149334 322.261333 320zM746.666667 725.333333a64 64 0 0 0 64-64v-192l-64-64V661.333333H277.333333v-554.666666h170.666667l-64-64h-106.666667a64 64 0 0 0-64 64V661.333333a64 64 0 0 0 64 64h469.333334z m-198.058667-448v-64h-67.434667l-0.021333 64h67.456z m-3.968 316.330667c43.562667-8.768 95.36-50.304 95.36-110.741333 0-60.437333-49.365333-83.328-67.050667-94.634667-16.426667-10.517333-23.317333-22.506667-24.234666-35.306667l-0.106667-2.965333V320h-67.456v54.592c0 21.248 6.848 36.117333 25.941333 49.28l3.989334 2.624 37.888 25.216c24.170667 16.277333 23.829333 48.917333 8.874666 63.36a67.925333 67.925333 0 0 1-59.434666 15.232c-42.154667-8.277333-46.933333-38.08-47.189334-66.922667v-16.085333H384c0 56.064 6.421333 81.472 36.352 113.578667 33.493333 35.882667 80.704 41.621333 124.288 32.789333z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="collection" unicode="" d="M490.261333 722.56a49.066667 49.066667 0 0 0 64.064-19.178667l1.664-3.093333 87.850667-177.813333 196.352-28.501334a49.066667 49.066667 0 0 0 29.717333-81.066666l-2.538666-2.645334L725.333333 272l33.536-195.349333a49.066667 49.066667 0 0 0-68.010666-53.269334l-3.157334 1.514667L512 117.141333l-175.701333-92.266666a49.066667 49.066667 0 0 0-71.637334 48.426666l0.469334 3.328L298.666667 271.978667 156.629333 410.24a49.066667 49.066667 0 0 0 23.893334 83.114667l3.285333 0.597333 196.352 28.501333 87.850667 177.813334a49.066667 49.066667 0 0 0 22.250666 22.272z m-67.626666-258.581333l-199.658667-28.992 144.469333-140.650667-34.133333-198.741333L512 189.44l178.688-93.845333-34.133333 198.741333 144.469333 140.650667-199.658667 28.992L512 644.842667l-89.386667-180.864z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
<glyph glyph-name="cart-Empty" unicode="" d="M330.667 128a53.333 53.333 0 1 0 0-106.667 53.333 53.333 0 0 0 0 106.667z m384 0a53.333 53.333 0 1 0 0-106.667 53.333 53.333 0 0 0 0 106.667zM94.763 736h54.741a96 96 0 0 0 92.907-71.787l1.024-4.394 13.205-62.486h0.213L299.733 392l32.491-157.333h402.219l61.653 298.666H313.813l-13.376 64h495.68a64 64 0 0 0 62.678-76.949L797.14 221.717a64 64 0 0 0-62.698-51.05H332.224a64 64 0 0 0-62.677 51.05L208.96 515.136l-0.405-0.085-27.734 131.562a32 32 0 0 1-28.309 25.238l-2.987 0.149H94.741v64h54.742z" horiz-adv-x="1024" />
|
||||
|
||||
|
||||
|
||||
|
||||
</font>
|
||||
</defs></svg>
|
Before Width: | Height: | Size: 20 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,16 +0,0 @@
|
|||
#!/bin/bash
|
||||
# 文件原路径
|
||||
srcPath="./dist"
|
||||
# 发布路径文件夹
|
||||
releasePath="../server/public/pc"
|
||||
|
||||
|
||||
#删除发布目录下的PC文件
|
||||
rm -r $releasePath
|
||||
echo "已删除 ==> $releasePath 下的目录文件"
|
||||
mkdir $releasePath
|
||||
echo "已新建 ==> $releasePath 目录"
|
||||
|
||||
# 复制打包目录内的文件到发布目录
|
||||
cp -r $srcPath/* $releasePath
|
||||
echo "已复制 $srcPath/* ==> $releasePath"
|
|
@ -1,133 +0,0 @@
|
|||
<template>
|
||||
<div class="activity-area m-t-16" v-if="list.length">
|
||||
<div class="title flex row-between">
|
||||
<div class="font-size-20">{{ title }}</div>
|
||||
<nuxt-link :to="url" class="more lighter"
|
||||
>更多 <i class="el-icon-arrow-right"></i
|
||||
></nuxt-link>
|
||||
</div>
|
||||
<div class="activity-goods m-t-16">
|
||||
<client-only>
|
||||
<swiper ref="headerSwiper" :options="swiperOptions">
|
||||
<swiper-slide
|
||||
class="swiper-item"
|
||||
v-for="(item, index) in swiperSize"
|
||||
:key="index"
|
||||
>
|
||||
<div class="goods-list flex row-between">
|
||||
<nuxt-link
|
||||
class="goods-item"
|
||||
:to="`/goods_details/${gitem.id}`"
|
||||
v-for="(gitem, gindex) in getSwiperList(index)"
|
||||
:key="gindex"
|
||||
>
|
||||
<div class="goods-img">
|
||||
<el-image
|
||||
lazy
|
||||
:src="gitem.image"
|
||||
fit="cover"
|
||||
alt=""
|
||||
></el-image>
|
||||
</div>
|
||||
<div class="name line-2 m-t-10">{{ gitem.name }}</div>
|
||||
<div class="price flex col-baseline m-t-10">
|
||||
<div class="primary m-r-8">
|
||||
<price-formate
|
||||
:price="gitem.min_price"
|
||||
:first-size="16"
|
||||
/>
|
||||
</div>
|
||||
<div class="muted sm line-through ">
|
||||
<price-formate
|
||||
:price="gitem.market_price"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="muted xs m-t-10">
|
||||
{{ gitem.sales_total }}人购买
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
url: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
},
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
swiperOptions: {
|
||||
direction: 'vertical',
|
||||
initialSlide: 0,
|
||||
height: 280,
|
||||
autoplay: true,
|
||||
},
|
||||
pageSize: 3,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
swiperSize() {
|
||||
return Math.ceil(this.list.length / this.pageSize)
|
||||
},
|
||||
getSwiperList() {
|
||||
return (index) => {
|
||||
return this.list.slice(
|
||||
index * this.pageSize,
|
||||
(index + 1) * this.pageSize
|
||||
)
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.activity-area {
|
||||
padding: 16px;
|
||||
border-radius: 6px;
|
||||
background-color: #fff;
|
||||
::v-deep .swiper-container {
|
||||
width: 100%;
|
||||
height: 280px;
|
||||
}
|
||||
.goods-list {
|
||||
.goods-item {
|
||||
width: 31.5%;
|
||||
.goods-img {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
padding-top: 100%;
|
||||
position: relative;
|
||||
.el-image {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
.name {
|
||||
line-height: 20px;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,45 +0,0 @@
|
|||
<template>
|
||||
<div class="ad-item" @click.stop="goPage(item)">
|
||||
<el-image :src="item.image" fit="cover" style="width: 100%; height: 100%"></el-image>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { paramsToStr } from "~/utils/tools";
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
goPage(item) {
|
||||
let { link_type, link, params } = item;
|
||||
switch (link_type) {
|
||||
case 3:
|
||||
window.open(item.link);
|
||||
break;
|
||||
default:
|
||||
if (["/goods_details"].includes(link)) {
|
||||
link += `/${params.id}`;
|
||||
} else {
|
||||
link += paramsToStr(params);
|
||||
}
|
||||
this.$router.push({
|
||||
path: link,
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.ad-item {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
|
@ -1,181 +0,0 @@
|
|||
<template>
|
||||
<div class="address-add">
|
||||
<el-dialog :title="aid ? '修改地址' : '添加地址'" top="30vh" :visible.sync="showDialog" width="700px" @closed="onClosed">
|
||||
<el-form inline ref="form" :model="address" label-width="100px" :rules="rules">
|
||||
<el-form-item label="收货人:" prop="contact">
|
||||
<el-input size="small" v-model="address.contact" />
|
||||
</el-form-item>
|
||||
<el-form-item label="联系方式:" prop="telephone">
|
||||
<el-input size="small" v-model="address.telephone" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="所在地区:" prop="region">
|
||||
<el-cascader :options="options" v-model="address.region" @change="handleChange" placeholder="请选择省市区"
|
||||
clearable size="small">
|
||||
</el-cascader>
|
||||
</el-form-item>
|
||||
<el-form-item label="详细地址:" prop="address">
|
||||
<el-input type="textarea" placeholder="请输入详细地址,如街道、门牌号等" v-model="address.address" :rows="3"
|
||||
resize="none">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<div>
|
||||
<el-form-item label=" ">
|
||||
<el-checkbox :true-label="1" :false-label="0" v-model="address.is_default">设为默认</el-checkbox>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-form>
|
||||
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">保存地址</el-button>
|
||||
<el-button @click="showDialog = false">取消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import regionData from "~/utils/area";
|
||||
// @event success 修改/添加成功
|
||||
// @event change 详细地址更改
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
aid: {
|
||||
type: [Number, String],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showDialog: false,
|
||||
options: regionData,
|
||||
address: {
|
||||
is_default: true,
|
||||
},
|
||||
rules: {
|
||||
contact: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入收货人",
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
telephone: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入联系方式",
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
address: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入详细地址",
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
region: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (!value || !value.length > 0) {
|
||||
return callback(new Error("请选择省市区"));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
onClosed() {
|
||||
this.address = {
|
||||
region: [],
|
||||
};
|
||||
this.$refs.form.resetFields();
|
||||
},
|
||||
async getOneAddress() {
|
||||
const { data, code } = await this.$get("user_address/detail", {
|
||||
params: { id: this.aid },
|
||||
});
|
||||
if (code == 1) {
|
||||
const { province_id, city_id, district_id, is_default } = data;
|
||||
data.region = [province_id, city_id, district_id];
|
||||
data.is_default = Boolean(is_default);
|
||||
this.address = data;
|
||||
}
|
||||
},
|
||||
handleChange(val) {
|
||||
console.log(val);
|
||||
this.address.province_id = val[0];
|
||||
this.address.city_id = val[1];
|
||||
this.address.district_id = val[2];
|
||||
},
|
||||
submitForm() {
|
||||
this.$refs.form.validate(async (valid) => {
|
||||
if (valid) {
|
||||
let address = JSON.parse(JSON.stringify(this.address));
|
||||
delete address.region;
|
||||
const { code, msg } = this.aid
|
||||
? await this.$post("user_address/update", {
|
||||
...address,
|
||||
id: this.aid,
|
||||
})
|
||||
: await this.$post("user_address/add", address);
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: "success",
|
||||
});
|
||||
this.showDialog = false;
|
||||
this.$emit("success");
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
value(val) {
|
||||
this.showDialog = val;
|
||||
},
|
||||
showDialog(val) {
|
||||
if (val) {
|
||||
if (this.aid) {
|
||||
this.getOneAddress();
|
||||
}
|
||||
}
|
||||
this.$emit("input", val);
|
||||
},
|
||||
aid(val) {
|
||||
if (val) {
|
||||
this.getOneAddress();
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.address-add {
|
||||
.el-cascader {
|
||||
width: 468px;
|
||||
}
|
||||
.el-textarea {
|
||||
width: 468px;
|
||||
}
|
||||
.dialog-footer {
|
||||
text-align: center;
|
||||
.el-button {
|
||||
width: 160px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,147 +0,0 @@
|
|||
<template>
|
||||
<div class="address-list">
|
||||
<el-dialog title="更换地址" :visible.sync="showDialog" width="900px">
|
||||
<div class="list black">
|
||||
<div
|
||||
:class="['item m-b-16', { active: item.id == selectId }]"
|
||||
v-for="(item, index) in addressList"
|
||||
:key="index"
|
||||
@click="selectId = item.id"
|
||||
>
|
||||
<div>
|
||||
<span class="weigth-500">{{ item.contact }}</span>
|
||||
{{ item.telephone }}
|
||||
<el-tag
|
||||
size="mini"
|
||||
type="warning"
|
||||
effect="dark"
|
||||
v-if="item.is_default"
|
||||
>默认</el-tag
|
||||
>
|
||||
</div>
|
||||
<div class="lighter m-t-8">
|
||||
{{ item.province }} {{ item.city }} {{ item.district }}
|
||||
{{ item.address }}
|
||||
</div>
|
||||
<div class="oprate lighter flex">
|
||||
<div
|
||||
class="m-r-16"
|
||||
@click.stop="
|
||||
editId = item.id
|
||||
showAddressAdd = true
|
||||
"
|
||||
>
|
||||
修改
|
||||
</div>
|
||||
<div @click.stop="setDefault(item.id)">设为默认</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="onConfirm">确认</el-button>
|
||||
<el-button @click="showDialog = false">取消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<address-add
|
||||
v-model="showAddressAdd"
|
||||
:aid="editId"
|
||||
@success="getAddress"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showDialog: false,
|
||||
showAddressAdd: false,
|
||||
addressList: [],
|
||||
selectId: 0,
|
||||
editId: '',
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
async getAddress() {
|
||||
const { code, data } = await this.$get('user_address/lists')
|
||||
if (code == 1) {
|
||||
this.addressList = data
|
||||
}
|
||||
},
|
||||
async setDefault(id) {
|
||||
const { code, data, msg } = await this.$post(
|
||||
'user_address/setDefault',
|
||||
{
|
||||
id,
|
||||
}
|
||||
)
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: 'success',
|
||||
})
|
||||
this.getAddress()
|
||||
}
|
||||
},
|
||||
onConfirm() {
|
||||
this.$emit('confirm', this.selectId)
|
||||
this.showDialog = false
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
value(val) {
|
||||
this.showDialog = val
|
||||
if (val == true) {
|
||||
this.getAddress()
|
||||
}
|
||||
},
|
||||
showDialog(val) {
|
||||
this.$emit('input', val)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.address-list {
|
||||
::v-deep .el-dialog__body {
|
||||
height: 460px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.list {
|
||||
margin: 0 auto;
|
||||
width: 800px;
|
||||
.item {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
padding: 16px 20px;
|
||||
height: 100px;
|
||||
padding-right: 150px;
|
||||
border: 1px solid $--border-color-base;
|
||||
border-radius: 2px;
|
||||
&.active {
|
||||
border-color: $--color-primary;
|
||||
}
|
||||
.oprate {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 9px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.dialog-footer {
|
||||
text-align: center;
|
||||
.el-button {
|
||||
width: 160px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,160 +0,0 @@
|
|||
<template>
|
||||
<div class="after-sales-list">
|
||||
<div class="m-b-20" v-for="(items) in lists" :key="items.order_id">
|
||||
|
||||
<div class="after-sales-header m-t-30 flex row-between" style="border:0">
|
||||
<div class="flex row-around">
|
||||
<div class="lighter sm flex" style="margin-right:100px">
|
||||
<img style="width:20px;height: 20px" class="m-r-5" :src="items.shop_logo" alt="">
|
||||
{{items.shop_name}}
|
||||
</div>
|
||||
<div class="lighter sm" v-if="type == 'normal'">
|
||||
申请时间:{{items.create_time}}
|
||||
</div>
|
||||
<div class="lighter sm" style="margin-left: 110px" v-else>
|
||||
下单时间:{{items.after_sale.status_text}}
|
||||
</div>
|
||||
<div class="lighter sm" style="margin-left: 110px" v-if="type == 'normal'">
|
||||
订单编号:{{items.after_sale.sn}}
|
||||
</div>
|
||||
<div class="lighter sm" style="margin-left: 110px" v-else>
|
||||
退款编号:{{items.after_sale.sn}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="primary sm" style="margin-right: 12px">
|
||||
{{items.after_sale.type_text}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="after-sales-content" :class="{shadow: type != 'normal', border: type == 'normal'}">
|
||||
<div class="goods-item flex row-between" v-for="(item, index) in items.order_goods" :key="index">
|
||||
<div class="flex">
|
||||
<el-image style="width: 72px;height: 72px" :src="item.image" />
|
||||
<div class="goods-info">
|
||||
<div class="goods-name noraml line1">
|
||||
{{item.goods_name}}
|
||||
</div>
|
||||
<div class="muted sm m-t-8 m-b-8">
|
||||
{{item.spec_value_str}}
|
||||
</div>
|
||||
<price-formate :price="item.goods_price" showSubscript color="#FF2C3C" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex row-right" :style="{width: type != 'apply' ? null : '340px'}">
|
||||
<el-button class="apply-btn row-center mr20 sm"
|
||||
|
||||
@click.stop="goPage(items.order_id, item.item_id)" v-if="type == 'normal'" size="small">申请售后
|
||||
</el-button>
|
||||
<el-button class="apply-btn row-center mr20 sm" v-if="type != 'normal'" size="small"
|
||||
@click="goToDetail(items.after_sale.after_sale_id)">查看详情</el-button>
|
||||
|
||||
<el-button class="apply-btn row-center mr20 sm" v-if="type == 'apply'" size="small"
|
||||
@click.stop="cancelApply(items.after_sale.after_sale_id)">撤销申请</el-button>
|
||||
|
||||
<el-button class="apply-btn row-center mr20 sm" v-if="items.after_sale.status==2" size="small"
|
||||
@click.stop="showInput(items.after_sale.after_sale_id)">填写快递单号</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { AfterSaleType } from "@/utils/type";
|
||||
export default {
|
||||
props: {
|
||||
type: {
|
||||
type: String,
|
||||
default: AfterSaleType.NORMAL,
|
||||
},
|
||||
lists: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
methods: {
|
||||
goToDetail(id) {
|
||||
switch (this.type) {
|
||||
case AfterSaleType.NORMAL:
|
||||
this.$router.push("/goods_details/" + id);
|
||||
break;
|
||||
case AfterSaleType.HANDLING:
|
||||
case AfterSaleType.FINISH:
|
||||
this.$router.push(
|
||||
"/user/after_sales/after_sale_details?afterSaleId=" + id
|
||||
);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
goPage(orderId, itemId) {
|
||||
this.$router.push(
|
||||
"/user/after_sales/apply_sale?order_id=" +
|
||||
orderId +
|
||||
"&item_id=" +
|
||||
itemId
|
||||
);
|
||||
},
|
||||
|
||||
showInput(e) {
|
||||
this.$emit("show", e);
|
||||
},
|
||||
|
||||
async cancelApply(afterSaleId) {
|
||||
let res = await this.$post("after_sale/cancel", {
|
||||
id: afterSaleId,
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: "success",
|
||||
});
|
||||
this.$emit("refresh");
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.after-sales-list {
|
||||
.after-sales-header {
|
||||
border: 1px solid #e5e5e5;
|
||||
background-color: #f2f2f2;
|
||||
padding: 13px 16px;
|
||||
}
|
||||
.after-sales-content {
|
||||
.goods-item {
|
||||
padding: 10px 20px;
|
||||
.goods-info {
|
||||
margin-left: 10px;
|
||||
width: 500px;
|
||||
}
|
||||
.apply-btn {
|
||||
border: 1px solid #cccccc;
|
||||
border-radius: 2px;
|
||||
width: 100px;
|
||||
height: 32px;
|
||||
align-self: flex-start;
|
||||
&:nth-of-type(2n) {
|
||||
margin-left: 10px;
|
||||
}
|
||||
&:nth-of-type(3) {
|
||||
margin-left: 10px;
|
||||
}
|
||||
&:nth-of-type(4) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.shadow {
|
||||
box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
.border {
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,144 +0,0 @@
|
|||
<template>
|
||||
<div class="comment-list">
|
||||
<div class="comment-con">
|
||||
<template v-if="commentList.length">
|
||||
<div
|
||||
class="item flex"
|
||||
v-for="(item, index) in commentList"
|
||||
:key="index"
|
||||
>
|
||||
<div class="avatar m-r-8">
|
||||
<img :src="item.avatar" alt="" />
|
||||
</div>
|
||||
<div class="content flex-1">
|
||||
<div>{{ item.nickname }}</div>
|
||||
<div class="lighter" style="margin: 5px 0 10px">
|
||||
<span>{{ item.create_time }}</span>
|
||||
<span>|</span>
|
||||
<span>规格:{{ item.spec_value_str }}</span>
|
||||
</div>
|
||||
<div>
|
||||
{{ item.comment }}
|
||||
</div>
|
||||
<div class="comment-imglist flex">
|
||||
<div
|
||||
class="item"
|
||||
v-for="(img, index) in item.image"
|
||||
:key="index"
|
||||
>
|
||||
<el-image
|
||||
:preview-src-list="item.image"
|
||||
:src="img"
|
||||
style="height: 100%; width: 100%"
|
||||
fit="contain"
|
||||
></el-image>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex reply m-t-16" v-if="item.reply">
|
||||
<div class="primary flex-none">商家回复:</div>
|
||||
<div class="lighter">
|
||||
{{ item.reply }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="pagination flex row-center"
|
||||
style="padding: 38px 0"
|
||||
v-if="count"
|
||||
>
|
||||
<el-pagination
|
||||
background
|
||||
hide-on-single-page
|
||||
layout="prev, pager, next"
|
||||
:total="count"
|
||||
:page-size="10"
|
||||
@current-change="changePage"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<null-data
|
||||
v-else
|
||||
:img="require('~/static/images/news_null.png')"
|
||||
text="暂无评价~"
|
||||
></null-data>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
type: Number,
|
||||
goodsId: [String, Number],
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
commentList: [],
|
||||
count: 0,
|
||||
page: 1,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getCommentList()
|
||||
},
|
||||
methods: {
|
||||
async getCommentList() {
|
||||
const { data, code } = await this.$get('goods_comment/lists', {
|
||||
params: {
|
||||
type: this.type,
|
||||
goods_id: this.goodsId,
|
||||
page_size: 10,
|
||||
page_no: this.page,
|
||||
},
|
||||
})
|
||||
if (code == 1) {
|
||||
this.commentList = data.lists
|
||||
this.count = data.count
|
||||
}
|
||||
},
|
||||
changePage(current) {
|
||||
this.page = current
|
||||
this.getCommentList()
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.comment-list {
|
||||
.comment-con {
|
||||
& > .item {
|
||||
padding: 20px;
|
||||
border-bottom: 1px dashed #e5e5e5;
|
||||
align-items: flex-start;
|
||||
.avatar {
|
||||
img {
|
||||
border-radius: 50%;
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
}
|
||||
}
|
||||
.comment-imglist {
|
||||
margin-top: 10px;
|
||||
.item {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
.reply {
|
||||
background-color: #f2f2f2;
|
||||
align-items: flex-start;
|
||||
padding: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,107 +0,0 @@
|
|||
<template>
|
||||
<div v-if="time >= 0">
|
||||
<client-only>
|
||||
<slot v-if="isSlot"></slot>
|
||||
<span v-else>{{ formateTime }}</span>
|
||||
</client-only>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { parseTimeData, parseFormat } from '~/utils/parseTime'
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
isSlot: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
time: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
format: {
|
||||
type: String,
|
||||
default: 'hh:mm:ss',
|
||||
},
|
||||
autoStart: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
time: {
|
||||
immediate: true,
|
||||
handler(value) {
|
||||
if (value) {
|
||||
this.reset()
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
timeObj: {},
|
||||
formateTime: 0,
|
||||
}
|
||||
},
|
||||
created() {},
|
||||
computed: {},
|
||||
methods: {
|
||||
createTimer(fn) {
|
||||
return setTimeout(fn, 100)
|
||||
},
|
||||
isSameSecond(time1, time2) {
|
||||
return Math.floor(time1) === Math.floor(time2)
|
||||
},
|
||||
start() {
|
||||
if (this.counting) {
|
||||
return
|
||||
}
|
||||
this.counting = true
|
||||
this.endTime = Date.now() + this.remain * 1000
|
||||
this.setTimer()
|
||||
},
|
||||
setTimer() {
|
||||
this.tid = this.createTimer(() => {
|
||||
let remain = this.getRemain()
|
||||
if (!this.isSameSecond(remain, this.remain) || remain === 0) {
|
||||
this.setRemain(remain)
|
||||
}
|
||||
if (this.remain !== 0) {
|
||||
this.setTimer()
|
||||
}
|
||||
})
|
||||
},
|
||||
getRemain() {
|
||||
return Math.max(this.endTime - Date.now(), 0)
|
||||
},
|
||||
pause() {
|
||||
this.counting = false
|
||||
clearTimeout(this.tid)
|
||||
},
|
||||
reset() {
|
||||
this.pause()
|
||||
this.remain = this.time
|
||||
this.setRemain(this.remain)
|
||||
if (this.autoStart) {
|
||||
this.start()
|
||||
}
|
||||
},
|
||||
setRemain(remain) {
|
||||
const { format } = this
|
||||
this.remain = remain
|
||||
const timeData = parseTimeData(remain)
|
||||
this.formateTime = parseFormat(format, timeData)
|
||||
this.$emit('change', timeData)
|
||||
if (remain === 0) {
|
||||
this.pause()
|
||||
this.$emit('finish')
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
</style>
|
|
@ -1,243 +0,0 @@
|
|||
<template>
|
||||
<div class="coupons-list flex">
|
||||
<template v-for="(item, index) in couponsList">
|
||||
<div v-show="item.isShow" class="item" :key="index" @click.capture="onHandle(item.id, item.is_get)">
|
||||
<div :class="[
|
||||
'info white',
|
||||
{ gray: type == 2 || type == 1 || item.is_get },
|
||||
]">
|
||||
<div class="info-hd flex">
|
||||
<div>
|
||||
<price-formate :price="item.money" :first-size="38" :second-size="38" />
|
||||
</div>
|
||||
<div class="m-l-8 flex1">
|
||||
<div class="line1">{{ item.name }}</div>
|
||||
<div class="xs line1">{{ item.condition_type_desc }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-time xs">{{ item.user_time_desc }}</div>
|
||||
</div>
|
||||
<div class="tips flex row-between" @click.stop="onShowTips(index)">
|
||||
<div class="muted xs">{{ item.use_scene_desc }}</div>
|
||||
<div v-if="item.use_goods_type != 1 && (type == 1 || type == 2 || type == 0)">
|
||||
<i :class="
|
||||
showTips[index] ? 'el-icon-arrow-up' : 'el-icon-arrow-down'
|
||||
"></i>
|
||||
<div class="tips-con xs lighter" v-if="item.use_scene_desc != '全场通用' && showTips[index]">
|
||||
{{ item.use_goods_desc }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="primary sm" v-if="type == 3 && !item.is_get">
|
||||
立即领取
|
||||
</div>
|
||||
</div>
|
||||
<img v-if="item.is_get" class="receice" src="~/static/images/coupons_img_receive.png" alt="" />
|
||||
<div class="choose xs" v-if="type == 4 && id == item.id">已选择</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="more muted" v-if="showMore && list.length > 4" @click="changeShow">
|
||||
{{ isMore ? '收起' : '更多' }}
|
||||
<i :class="isMore ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
mapActions
|
||||
} from "vuex";
|
||||
export default {
|
||||
props: {
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
type: {
|
||||
type: Number,
|
||||
},
|
||||
showMore: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showTips: [],
|
||||
couponsList: [],
|
||||
id: "",
|
||||
isMore: false,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
...mapActions(["getPublicData"]),
|
||||
onHandle(id, isGet) {
|
||||
this.id = id;
|
||||
const {
|
||||
type
|
||||
} = this;
|
||||
switch (type) {
|
||||
case 0:
|
||||
// 可使用
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
// 使用
|
||||
case 2:
|
||||
break;
|
||||
//不可以用
|
||||
case 3:
|
||||
// 领券
|
||||
if(!isGet) {
|
||||
this.getCoupon();
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
//使用
|
||||
if (this.selectId == id) {
|
||||
this.id = "";
|
||||
}
|
||||
this.$emit("use", this.id);
|
||||
this.selectId = this.id;
|
||||
break;
|
||||
}
|
||||
},
|
||||
async getCoupon() {
|
||||
const {
|
||||
msg,
|
||||
code
|
||||
} = await this.$post("coupon/getCoupon", {
|
||||
coupon_id: this.id,
|
||||
});
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: "success",
|
||||
});
|
||||
this.getPublicData();
|
||||
this.$emit("reflash");
|
||||
}
|
||||
},
|
||||
onShowTips(index) {
|
||||
const {
|
||||
showTips
|
||||
} = this;
|
||||
|
||||
this.showTips[index] = showTips[index] ? 0 : 1;
|
||||
// 拷贝数组
|
||||
this.showTips = Object.assign([], this.showTips);
|
||||
},
|
||||
changeShow() {
|
||||
this.isMore = !this.isMore;
|
||||
this.list.forEach((item, index) => {
|
||||
item.isShow = true;
|
||||
if (!this.isMore && index >= 4) {
|
||||
item.isShow = false;
|
||||
}
|
||||
});
|
||||
this.couponsList = [...this.list];
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
list: {
|
||||
handler: function(val) {
|
||||
if (val.length) {
|
||||
// 默认选中第一张
|
||||
if (this.type == 4) {
|
||||
this.id = val[0].id;
|
||||
this.selectId = this.id;
|
||||
this.$emit("use", this.id);
|
||||
}
|
||||
}
|
||||
let arr = val.map((item) => {
|
||||
return 0;
|
||||
});
|
||||
this.showTips = arr;
|
||||
this.list.forEach((item, index) => {
|
||||
item.isShow = true;
|
||||
if (this.showMore) {
|
||||
if (index >= 4) {
|
||||
item.isShow = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
this.couponsList = this.list;
|
||||
},
|
||||
immediate: true,
|
||||
deep: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.coupons-list {
|
||||
padding: 0 18px;
|
||||
flex-wrap: wrap;
|
||||
position: relative;
|
||||
|
||||
.item {
|
||||
margin-bottom: 20px;
|
||||
margin-right: 16px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
|
||||
.info {
|
||||
padding: 0 10px;
|
||||
background: url("~/static/images/bg_coupon_s.png") no-repeat;
|
||||
width: 240px;
|
||||
height: 80px;
|
||||
background-size: 100%;
|
||||
|
||||
&.gray {
|
||||
background-image: url("~/static/images/bg_coupon.png");
|
||||
}
|
||||
|
||||
.info-hd {
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.tips {
|
||||
position: relative;
|
||||
background-color: #f2f2f2;
|
||||
height: 30px;
|
||||
padding: 0 8px;
|
||||
|
||||
.tips-con {
|
||||
width: 100%;
|
||||
left: 0;
|
||||
background-color: #f2f2f2;
|
||||
position: absolute;
|
||||
top: 30px;
|
||||
padding: 10px;
|
||||
z-index: 99;
|
||||
}
|
||||
}
|
||||
|
||||
.receice {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 58px;
|
||||
height: 45px;
|
||||
}
|
||||
|
||||
.choose {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
background-color: #ffe72c;
|
||||
color: $--color-primary;
|
||||
padding: 1px 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.more {
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
cursor: pointer;
|
||||
right: 30px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,209 +0,0 @@
|
|||
<template>
|
||||
<div class="deliver-search-container">
|
||||
<el-dialog :visible.sync="showDialog" top="30vh" width="900px" title="物流查询">
|
||||
<div class="deliver-box">
|
||||
<div class="deliver-recode-box flex">
|
||||
<div class="recode-img">
|
||||
<el-image style="width: 100%; height: 100%" fit="cover" :src="deliverOrder.image" />
|
||||
<div class="float-count flex row-center">共{{deliverOrder.count}}件商品</div>
|
||||
</div>
|
||||
<div class="recode-info-container m-l-10">
|
||||
<div class="flex">
|
||||
<div class="recode-label">物流状态:</div>
|
||||
<div class="primary lg" style="font-weight: 500">{{deliverOrder.tips}}</div>
|
||||
</div>
|
||||
<div class="flex" style="margin: 6px 0;">
|
||||
<div class="recode-label">快递公司:</div>
|
||||
<div >{{deliverOrder.shipping_name}}</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="recode-label">快递单号:</div>
|
||||
<div>{{deliverOrder.invoice_no}}</div>
|
||||
<div class="copy-btn primary flex row-center" @click="onCopy">复制</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="deliver-flow-box m-t-16">
|
||||
<el-timeline>
|
||||
<!-- 收货 -->
|
||||
<el-timeline-item
|
||||
v-if="deliverFinish.tips"
|
||||
>
|
||||
<div>
|
||||
<div class="flex lg">
|
||||
<div class="m-r-8" style="font-weight: 500">
|
||||
{{deliverTake.contacts}}
|
||||
</div>
|
||||
<div style="font-weight: 500">{{deliverTake.mobile}}</div>
|
||||
</div>
|
||||
<div class="lighter m-t-8">{{deliverTake.address}}</div>
|
||||
</div>
|
||||
</el-timeline-item>
|
||||
<!-- 交易状态 -->
|
||||
<el-timeline-item
|
||||
v-if="deliverFinish.tips"
|
||||
:timestamp="deliverFinish.time"
|
||||
>
|
||||
<div class="time-line-title">{{deliverFinish.title}}</div>
|
||||
<div>{{deliverFinish.tips}}</div>
|
||||
</el-timeline-item>
|
||||
<!-- 跟踪物流 -->
|
||||
<el-timeline-item
|
||||
v-if="delivery.traces && delivery.traces.length"
|
||||
:timestamp="delivery.time"
|
||||
>
|
||||
<div class="time-line-title m-b-8">{{delivery.title}}</div>
|
||||
<el-timeline-item
|
||||
v-for="(item, index) in delivery.traces"
|
||||
:key="index"
|
||||
:timestamp="item[0]"
|
||||
>
|
||||
<div class="muted">{{item[1]}}</div>
|
||||
</el-timeline-item>
|
||||
</el-timeline-item>
|
||||
<!-- 完成 -->
|
||||
<el-timeline-item
|
||||
v-if="deliverShipment.tips"
|
||||
:timestamp="deliverShipment.time"
|
||||
>
|
||||
<div class="time-line-title">{{deliverShipment.title}}</div>
|
||||
<div>{{deliverShipment.tips}}</div>
|
||||
</el-timeline-item>
|
||||
<!-- 下单 -->
|
||||
<el-timeline-item
|
||||
v-if="deliverBuy.tips"
|
||||
:timestamp="deliverBuy.time"
|
||||
>
|
||||
<div class="time-line-title">{{deliverBuy.title}}</div>
|
||||
<div>{{deliverBuy.tips}}</div>
|
||||
</el-timeline-item>
|
||||
</el-timeline>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
aid: {
|
||||
type: Number | String
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showDialog: false,
|
||||
deliverBuy: {},
|
||||
delivery: {},
|
||||
deliverFinish: {},
|
||||
deliverOrder: {},
|
||||
deliverShipment: {},
|
||||
deliverTake: {},
|
||||
timeLineArray: []
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
value(val) {
|
||||
console.log(val, 'val')
|
||||
this.showDialog = val;
|
||||
},
|
||||
showDialog(val) {
|
||||
if(val) {
|
||||
if(this.aid) {
|
||||
this.timeLineArray = []
|
||||
this.getDeliverTraces();
|
||||
}
|
||||
}
|
||||
this.$emit("input", val);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async getDeliverTraces() {
|
||||
let data = {
|
||||
id: this.aid
|
||||
}
|
||||
let res = await this.$get("order/orderTraces", {params: data});
|
||||
if(res.code == 1) {
|
||||
let {buy, delivery, finish, order, shipment, take} = res.data
|
||||
this.deliverBuy = buy;
|
||||
this.delivery = delivery;
|
||||
this.deliverFinish = finish;
|
||||
this.deliverOrder = order;
|
||||
this.deliverShipment = shipment;
|
||||
this.deliverTake = take;
|
||||
this.timeLineArray.push(this.deliverFinish);
|
||||
this.timeLineArray.push(this.delivery);
|
||||
this.timeLineArray.push(this.deliverShipment);
|
||||
this.timeLineArray.push(this.deliverBuy);
|
||||
console.log(this.timeLineArray)
|
||||
}
|
||||
},
|
||||
onCopy() {
|
||||
// this.deliverOrder.invoice_no;
|
||||
let oInput = document.createElement('input');
|
||||
oInput.value = this.deliverOrder.invoice_no;
|
||||
document.body.appendChild(oInput);
|
||||
oInput.select();
|
||||
document.execCommand("Copy");
|
||||
this.$message.success("复制成功");
|
||||
oInput.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.deliver-search-container {
|
||||
.deliver-box {
|
||||
.deliver-recode-box {
|
||||
padding: 10px 20px;
|
||||
background-color: #F2F2F2;
|
||||
.recode-img {
|
||||
position: relative;
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
.float-count {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
height: 20px;
|
||||
width: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
color: white;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
.recode-info-container {
|
||||
flex: 1;
|
||||
.recode-label {
|
||||
width: 70px;
|
||||
}
|
||||
.copy-btn {
|
||||
height: 20px;
|
||||
min-width: 42px;
|
||||
border: 1px solid $--color-primary;
|
||||
font-size: 12px;
|
||||
margin-left: 8px;
|
||||
border-radius: 60px;
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
background-color: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.deliver-flow-box {
|
||||
padding-left: 15px;
|
||||
}
|
||||
.time-line-title {
|
||||
font-weight: 500px;
|
||||
font-size: 16px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,257 +0,0 @@
|
|||
<template>
|
||||
<div class="evaluation-list">
|
||||
<div class="list1" v-if="type == 1">
|
||||
<div class="item flex" v-for="(item, index) in list" :key="index">
|
||||
<div class="goods">
|
||||
<!-- 店铺信息 -->
|
||||
<div class="flex shop-info">
|
||||
<div class="flex" style="margin-right: 100px;">
|
||||
|
||||
<div class="m-r-8" style="width: 16px; height: 16px;">
|
||||
<el-image :src="item.shop.logo" style="height: 100%; width: 100%" fit="contain">
|
||||
</el-image>
|
||||
</div>
|
||||
<div class="xs">
|
||||
{{item.shop.name}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="xs muted" style="margin-right: 100px;">
|
||||
下单时间:{{item.create_time}}
|
||||
</div>
|
||||
<div class="xs muted">
|
||||
订单编号:{{item.order_sn}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="goods-all">
|
||||
<div class="goods-item flex" v-for="(zitem, zindex) in item.order_goods_un_comment">
|
||||
<nuxt-link :to="`/goods_details/${zitem.goods_id}`">
|
||||
<el-image class="goods-img" :src="zitem.goods_item.image" alt="" />
|
||||
</nuxt-link>
|
||||
<div class="goods-info flex-col flex-1">
|
||||
<div class="goods-name flex row-between" style="align-items: flex-start;">
|
||||
<div class="line1" style="width: 600px">
|
||||
{{ zitem.goods_name }}
|
||||
</div>
|
||||
<div class="operate flex row-end">
|
||||
<nuxt-link :to="`/user/evaluation/evaluate?id=${zitem.id}`"
|
||||
class="btn sm flex row-center white">去评价</nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sm lighter m-b-8">{{zitem.goods_item.spec_value_str}}</div>
|
||||
<!-- 价格 -->
|
||||
<div class="primary">
|
||||
<price-formate :price="zitem.goods_price" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="list2 flex-col" v-if="type == 2">
|
||||
<div class="item flex" v-for="(item, index) in list" :key="index">
|
||||
<div class="user">
|
||||
<el-image :src="userInfo.avatar" style="height: 44px; width: 44px; border-radius: 50%;"></el-image>
|
||||
</div>
|
||||
<div class="">
|
||||
<div class="user_name m-b-5" style="font-size: 14px; color: #101010;">
|
||||
{{ userInfo.nickname }}
|
||||
</div>
|
||||
<div class="muted sm">评价时间:{{ item.create_time }}</div>
|
||||
<!-- 用户评价 -->
|
||||
<div class="m-t-10">
|
||||
{{ item.comment }}
|
||||
</div>
|
||||
<!-- 用户展示商品图片 -->
|
||||
<div class="comment-imglist flex">
|
||||
<div class="item" v-for="(img, index) in item.goods_comment_image_arr" :key="index">
|
||||
<el-image :preview-src-list="item.goods_comment_image_arr" :src="img"
|
||||
style="height: 100%; width: 100%" fit="contain">
|
||||
</el-image>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 商家回复 -->
|
||||
<div class="flex reply mt16" v-if="item.reply">
|
||||
<div class="primary">商家回复:</div>
|
||||
<div class="lighter">
|
||||
{{ item.reply }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 商品信息 -->
|
||||
<nuxt-link :to="`/goods_details/${item.goods.id}`">
|
||||
<div class="goods flex m-t-16">
|
||||
<el-image class="goods-img" :src="item.goods.image" alt="" />
|
||||
<div class="goods-info m-l-10">
|
||||
<div class="flex m-b-8">
|
||||
<div class="flex" style="width: 451px;">
|
||||
<div class="xs line-1 m-r-5">{{item.goods.name}}</div>
|
||||
<div class="xs">{{item.goods_item.spec_value_str}}</div>
|
||||
</div>
|
||||
|
||||
<div class="flex">
|
||||
<el-image :src="item.shop_logo" style="height: 16px; width: 16px" fit="contain">
|
||||
</el-image>
|
||||
<div class="m-l-5 xs">
|
||||
{{item.shop_name}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="m-t-8 primary">
|
||||
<price-formate :price="item.order_goods.total_pay_price" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
},
|
||||
|
||||
userInfo: {
|
||||
type: Object,
|
||||
default: () => {},
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
lists: [{
|
||||
image: "fdasf",
|
||||
goods_name: "hsdfsafsa",
|
||||
id: " ",
|
||||
spec_value_str: " spec_value_str",
|
||||
goods_price: '100',
|
||||
}]
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.evaluation-list {
|
||||
padding: 0 10px;
|
||||
|
||||
.list1 {
|
||||
.shop-info {
|
||||
padding: 10px 16px;
|
||||
background-color: #F6F6F6;
|
||||
}
|
||||
|
||||
.item {
|
||||
|
||||
|
||||
.item-hd {
|
||||
height: 40px;
|
||||
background: #f2f2f2;
|
||||
padding: 0 20px;
|
||||
|
||||
.status {
|
||||
width: 300px;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
align-items: stretch;
|
||||
|
||||
.goods {
|
||||
padding-bottom: 16px;
|
||||
|
||||
.goods-all {
|
||||
border: 1px solid #e5e5e5;
|
||||
padding-top: 16px;
|
||||
}
|
||||
|
||||
.goods-item {
|
||||
padding: 0 16px 16px 16px;
|
||||
|
||||
.goods-img {
|
||||
margin-right: 10px;
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.operate {
|
||||
width: 200px;
|
||||
|
||||
.btn {
|
||||
background-color: $--color-primary;
|
||||
width: 104px;
|
||||
height: 32px;
|
||||
border: 1px solid $--border-base;
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.list2 {
|
||||
.user {
|
||||
margin-right: 14px;
|
||||
}
|
||||
|
||||
&>.item {
|
||||
width: 920px;
|
||||
padding: 15px 0px;
|
||||
border-bottom: 1px dashed #e5e5e5;
|
||||
align-items: flex-start;
|
||||
|
||||
.avatar {
|
||||
img {
|
||||
border-radius: 50%;
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
}
|
||||
}
|
||||
|
||||
.comment-imglist {
|
||||
margin-top: 10px;
|
||||
|
||||
.item {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
.reply {
|
||||
background-color: #F6F6F6;
|
||||
align-items: flex-start;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.goods {
|
||||
width: 922px;
|
||||
background-color: #F6F6F6;
|
||||
padding: 14px;
|
||||
|
||||
.goods-img {
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,113 +0,0 @@
|
|||
<template>
|
||||
<div class="goods-list flex flex-wrap">
|
||||
<nuxt-link :to="`/goods_details/${item.id||item.goods_id}`" class="goods-item bg-white"
|
||||
:style="{ marginRight: (index + 1) % num == 0 ? 0 : '14px' }" v-for="(item, index) in list" :key="index">
|
||||
<el-image class="goods-img" lazy :src="item.image||item.goods_image" alt=""></el-image>
|
||||
<div class="name line-2">{{ item.name||item.goods_name }}</div>
|
||||
<div class="seckill flex row-between" v-if="type == 'seckill'">
|
||||
<div class="primary flex">
|
||||
秒杀价
|
||||
<price-formate :price="item.seckill_price" :first-size="18" />
|
||||
</div>
|
||||
<div :class="['btn bg-primary white', {'not-start' : status == 0, end: status == 2}]">{{getSeckillText}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex row-between flex-wrap" v-else>
|
||||
|
||||
<div class="price flex col-baseline">
|
||||
<div class="primary m-r-8">
|
||||
<price-formate :price="item.min_price || item.price" :first-size="16" />
|
||||
</div>
|
||||
<div class="muted sm line-through">
|
||||
<price-formate :price="item.market_price" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="muted xs">{{ item.sales_total || item.sales_sum || 0}}人购买</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
num: {
|
||||
type: Number,
|
||||
default: 5,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
},
|
||||
status: {
|
||||
type: Number,
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
list: {
|
||||
immediate: true,
|
||||
handler: function (val) {},
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
getSeckillText() {
|
||||
switch (this.status) {
|
||||
case 0:
|
||||
return "未开始";
|
||||
case 1:
|
||||
return "立即抢购";
|
||||
case 2:
|
||||
return "已结束";
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.goods-list {
|
||||
align-items: stretch;
|
||||
.goods-item {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
width: 224px;
|
||||
height: 310px;
|
||||
margin-bottom: 16px;
|
||||
padding: 12px 12px 16px;
|
||||
border-radius: 4px;
|
||||
transition: all 0.2s;
|
||||
&:hover {
|
||||
transform: translateY(-8px);
|
||||
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.goods-img {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
.name {
|
||||
margin-bottom: 10px;
|
||||
height: 40px;
|
||||
line-height: 20px;
|
||||
}
|
||||
.seckill {
|
||||
.btn {
|
||||
padding: 4px 12px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid transparent;
|
||||
&.not-start {
|
||||
border-color: $--color-primary;
|
||||
color: $--color-primary;
|
||||
background-color: transparent;
|
||||
}
|
||||
&.end {
|
||||
background-color: #e5e5e5;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,197 +0,0 @@
|
|||
<template>
|
||||
<div class="seckill card" v-if="goodsList.length">
|
||||
<div class="seckill-header flex">
|
||||
<div class="title font-size-20">限时秒杀</div>
|
||||
<div class="flex-1 flex">
|
||||
<i
|
||||
class="
|
||||
el-icon-alarm-clock
|
||||
primary
|
||||
font-size-24
|
||||
m-l-20 m-r-10
|
||||
"
|
||||
></i>
|
||||
<count-down
|
||||
:time="countTime"
|
||||
:is-slot="true"
|
||||
@change="onChangeDate"
|
||||
@finish="refresh"
|
||||
>
|
||||
<div class="flex row-center count-down xs">
|
||||
<div class="item white">{{ timeData.hours }}时</div>
|
||||
<div class="white" style="margin: 0 4px">:</div>
|
||||
<div class="item white">{{ timeData.minutes }}分</div>
|
||||
<div class="white" style="margin: 0 4px">:</div>
|
||||
<div class="item white">{{ timeData.seconds }}秒</div>
|
||||
</div>
|
||||
</count-down>
|
||||
</div>
|
||||
|
||||
<nuxt-link to="/seckill" class="more lighter"
|
||||
>更多 <i class="el-icon-arrow-right"></i
|
||||
></nuxt-link>
|
||||
</div>
|
||||
<div class="seckill-list m-t-16">
|
||||
<el-carousel :interval="3000" arrow="never" height="320px" indicator-position="outside">
|
||||
<el-carousel-item
|
||||
v-for="(item, index) in swiperSize"
|
||||
:key="index"
|
||||
>
|
||||
<div class="goods-list flex">
|
||||
<nuxt-link
|
||||
class="goods-item"
|
||||
:to="`/goods_details/${gitem.goods_id}`"
|
||||
v-for="(gitem, gindex) in getSwiperList(index)"
|
||||
:key="gindex"
|
||||
>
|
||||
<div class="goods-img">
|
||||
<el-image
|
||||
:src="gitem.goods_image"
|
||||
fit="cover"
|
||||
alt=""
|
||||
></el-image>
|
||||
</div>
|
||||
<div class="name line-2 m-t-10">
|
||||
{{ gitem.goods_name }}
|
||||
</div>
|
||||
<div class="price flex col-baseline">
|
||||
<div class="primary m-r-8">
|
||||
<price-formate
|
||||
:price="gitem.seckill_price"
|
||||
:first-size="16"
|
||||
/>
|
||||
</div>
|
||||
<div class="muted sm line-through">
|
||||
<price-formate
|
||||
:price="gitem.seckill_total"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="muted xs m-t-10">
|
||||
{{ gitem.seckill_total }}人购买
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
active: -1,
|
||||
goodsList: [],
|
||||
countTime: 0,
|
||||
timeData: {},
|
||||
pageSize: 5,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
refresh() {
|
||||
this.$emit('refreshhome')
|
||||
},
|
||||
onChangeDate(e) {
|
||||
let timeData = {}
|
||||
for (let prop in e) {
|
||||
if (prop !== 'milliseconds')
|
||||
timeData[prop] = ('0' + e[prop]).slice(-2)
|
||||
}
|
||||
this.timeData = timeData
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
list: {
|
||||
handler(val) {
|
||||
// 抢购中
|
||||
let index = val.findIndex((item) => item.status == 1)
|
||||
if (index == -1) {
|
||||
// 未开始
|
||||
index = val.findIndex((item) => item.status == 0)
|
||||
}
|
||||
if (index == -1) {
|
||||
// 全部结束选中最后一个
|
||||
index = val.length - 1
|
||||
}
|
||||
this.active = index
|
||||
this.goodsList = val[index].goods
|
||||
this.countTime = val[index].end_time_int - Date.now() / 1000
|
||||
},
|
||||
immediate: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
swiperSize() {
|
||||
console.log(Math.ceil(this.goodsList.length / this.pageSize))
|
||||
return Math.ceil(this.goodsList.length / this.pageSize)
|
||||
},
|
||||
getSwiperList() {
|
||||
return (index) => {
|
||||
return this.goodsList.slice(
|
||||
index * this.pageSize,
|
||||
(index + 1) * this.pageSize
|
||||
)
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.seckill {
|
||||
.seckill-header {
|
||||
.count-down {
|
||||
.item {
|
||||
width: 38px;
|
||||
height: 20px;
|
||||
background: $--color-primary;
|
||||
text-align: center;
|
||||
line-height: 20px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
::v-deep .el-carousel__indicator {
|
||||
& .el-carousel__button {
|
||||
background-color: #E5E5E5;
|
||||
}
|
||||
&.is-active .el-carousel__button{
|
||||
background-color: $--color-primary;
|
||||
}
|
||||
}
|
||||
.goods-list {
|
||||
.goods-item {
|
||||
width: 216px;
|
||||
& ~ .goods-item {
|
||||
margin-left: 16px;
|
||||
}
|
||||
.goods-img {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
padding-top: 100%;
|
||||
position: relative;
|
||||
::v-deep .el-image {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
.name {
|
||||
line-height: 20px;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,120 +0,0 @@
|
|||
<template>
|
||||
<div class="input-express">
|
||||
<el-dialog title="填写快递单号" :visible.sync="showDialog" width="926px">
|
||||
<el-form inline ref="inputForm" label-width="100px" :model="form" :rules="rules">
|
||||
<el-form-item label="物流公司:" prop="business">
|
||||
<el-input size="small" v-model="form.business" placeholder="请输入物流公司名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="快递单号:" prop="number">
|
||||
<el-input size="small" v-model="form.number" placeholder="请输入快递单号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注说明:" prop="desc">
|
||||
<el-input style="width: 632px" type="textarea" v-model="form.desc" placeholder="请输入详细内容,选填"
|
||||
resize="none" rows="5" />
|
||||
</el-form-item>
|
||||
<el-form-item label="上传凭证:" prop="upload">
|
||||
<div class="xs muted">请上传快递单号凭证,选填</div>
|
||||
<upload isSlot :file-list="fileList" @success="uploadSuccess" :limit="3">
|
||||
<div class="column-center" style="height: 100%">
|
||||
<i class="el-icon-camera xs" style="font-size: 24px" />
|
||||
</div>
|
||||
</upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确定</el-button>
|
||||
<el-button @click="showDialog = false">取消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showDialog: false,
|
||||
form: {
|
||||
// 物流公司
|
||||
business: "",
|
||||
// 快递单号
|
||||
number: "",
|
||||
// 详细内容
|
||||
desc: "",
|
||||
},
|
||||
rules: {
|
||||
business: [{ required: true, message: "请输入物流公司" }],
|
||||
number: [{ required: true, message: "请输入快递单号" }],
|
||||
},
|
||||
fileList: [],
|
||||
};
|
||||
},
|
||||
props: {
|
||||
value: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
aid: {
|
||||
type: [String, Number],
|
||||
default: -1,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
submitForm() {
|
||||
console.log(this.$refs);
|
||||
this.$refs["inputForm"].validate(async (valid) => {
|
||||
if (valid) {
|
||||
let fileList = [];
|
||||
this.fileList.forEach((item) => {
|
||||
fileList.push(item.response.data);
|
||||
});
|
||||
let data = {
|
||||
id: this.aid,
|
||||
express_name: this.form.business,
|
||||
invoice_no: this.form.number,
|
||||
express_remark: this.form.desc,
|
||||
express_image:
|
||||
fileList.length <= 0 ? "" : fileList[0].base_url,
|
||||
};
|
||||
let res = await this.$post("after_sale/express", data);
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: "提交成功",
|
||||
type: "success",
|
||||
});
|
||||
this.showDialog = false;
|
||||
this.$emit("success");
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
uploadSuccess(e) {
|
||||
let fileList = Object.assign([], e);
|
||||
this.fileList = fileList;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
value(val) {
|
||||
this.showDialog = val;
|
||||
},
|
||||
showDialog(val) {
|
||||
this.$emit("input", val);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.input-express {
|
||||
.dialog-footer {
|
||||
text-align: center;
|
||||
.el-button {
|
||||
width: 160px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,96 +0,0 @@
|
|||
<template>
|
||||
<aside class="aside-nav bg-white">
|
||||
<div class="nav">
|
||||
<div class="title lg">订单中心</div>
|
||||
<ul>
|
||||
<li>
|
||||
<nuxt-link to="/user/order">我的订单</nuxt-link>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/user/evaluation">评价中心</nuxt-link>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/user/after_sales">退款/售后</nuxt-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="nav">
|
||||
<div class="title lg">我的资产</div>
|
||||
<ul>
|
||||
<li>
|
||||
<nuxt-link to="/user/coupons"
|
||||
>优惠券 ({{ publicData.coupon_num }})</nuxt-link
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/user/user_wallet">我的钱包</nuxt-link>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="nav">
|
||||
<div class="title lg">我的服务</div>
|
||||
<ul>
|
||||
<li>
|
||||
<nuxt-link to="/user/collection">我的收藏</nuxt-link>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/user/address">地址管理</nuxt-link>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/user/profile">个人资料</nuxt-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
export default {
|
||||
created() {},
|
||||
computed: {
|
||||
...mapState(['publicData']),
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.aside-nav {
|
||||
width: 160px;
|
||||
min-height: 680px;
|
||||
padding: 20px 0;
|
||||
margin-right: 16px;
|
||||
box-sizing: border-box;
|
||||
.nav {
|
||||
.title {
|
||||
padding: 14px 32px;
|
||||
font-weight:bold;
|
||||
}
|
||||
ul {
|
||||
li {
|
||||
a {
|
||||
display: block;
|
||||
padding: 10px 32px;
|
||||
font-weight:bold;
|
||||
&.nuxt-link-active {
|
||||
position: relative;
|
||||
color: $--color-primary;
|
||||
background-color: #ffeeef;
|
||||
&::before {
|
||||
position: absolute;
|
||||
content: '';
|
||||
display: block;
|
||||
width: 2px;
|
||||
height: 30px;
|
||||
left: 0;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
background-color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,178 +0,0 @@
|
|||
<template>
|
||||
<div class="category" @mouseenter="showCate = true" @mouseleave="leaveCate">
|
||||
<el-button @click="$router.push('/category')" type="primary" class="title">
|
||||
<div class="flex lg">
|
||||
<i class="el-icon-s-fold"></i>
|
||||
<div class="m-l-8">全部商品分类</div>
|
||||
</div>
|
||||
</el-button>
|
||||
<div class="category-con bg-white" v-show="category.length && showCate">
|
||||
<ul class="category-one">
|
||||
<li
|
||||
v-for="(item, index) in category"
|
||||
:key="index"
|
||||
:class="{ active: index === selectIndex }"
|
||||
@mouseenter="enterCate(index)"
|
||||
>
|
||||
<nuxt-link
|
||||
class="flex row-between"
|
||||
:to="`/category?id=${item.id}`"
|
||||
>
|
||||
<span class="line-1">{{ item.name }}</span>
|
||||
<i
|
||||
v-if="item.sons.length"
|
||||
class="el-icon-arrow-right"
|
||||
></i
|
||||
></nuxt-link>
|
||||
</li>
|
||||
|
||||
<div
|
||||
class="category-float bg-white"
|
||||
v-show="showCateFloat && cateTwo.length"
|
||||
>
|
||||
<div class="float-con">
|
||||
<div
|
||||
class="m-t-16"
|
||||
v-for="(item, index) in cateTwo"
|
||||
:key="index"
|
||||
>
|
||||
<div class="category-two weight-500 m-b-15">
|
||||
<nuxt-link :to="`/category?id=${item.id}`">{{
|
||||
item.name
|
||||
}}</nuxt-link>
|
||||
</div>
|
||||
<div class="category-three flex flex-wrap">
|
||||
<div
|
||||
class="item"
|
||||
v-for="(titem, idx) in item.sons"
|
||||
:key="idx"
|
||||
>
|
||||
<nuxt-link
|
||||
:to="`/category?id=${titem.id}`"
|
||||
class="flex"
|
||||
>
|
||||
<el-image
|
||||
style="width: 48px; height: 48px;display:none"
|
||||
:src="titem.image"
|
||||
fit="contain"
|
||||
></el-image>
|
||||
<span class="m-l-8">{{
|
||||
titem.name
|
||||
}}</span>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
cateTwo: [],
|
||||
showCateFloat: false,
|
||||
showCate: false,
|
||||
selectIndex: '',
|
||||
}
|
||||
},
|
||||
created() {
|
||||
console.log(this.category)
|
||||
},
|
||||
methods: {
|
||||
enterCate(index) {
|
||||
this.cateTwo = this.category[index].sons
|
||||
this.showCateFloat = true
|
||||
this.selectIndex = index
|
||||
},
|
||||
leaveCate() {
|
||||
this.$route.path != '/' && (this.showCate = false)
|
||||
this.selectIndex = ''
|
||||
this.showCateFloat = false
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
$route: {
|
||||
immediate: true,
|
||||
handler: function (val) {
|
||||
this.showCate = val.path == '/' ? true : false
|
||||
},
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(['category']),
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.category {
|
||||
position: relative;
|
||||
.title {
|
||||
padding: 12px 20px;
|
||||
flex: none;
|
||||
width: 160px;
|
||||
box-sizing: border-box;
|
||||
border-radius: 0;
|
||||
}
|
||||
.category-con {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 999;
|
||||
height: 440px;
|
||||
padding: 10px 0;
|
||||
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
|
||||
|
||||
.category-one {
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
&::-webkit-scrollbar {
|
||||
display: none; /*隐藏滚动条*/
|
||||
}
|
||||
li {
|
||||
& > a {
|
||||
height: 42px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
&.active {
|
||||
background-color: #ffeeef;
|
||||
a {
|
||||
color: #ff2c3c;
|
||||
}
|
||||
}
|
||||
}
|
||||
.category-float {
|
||||
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
|
||||
position: absolute;
|
||||
left: 160px;
|
||||
top: 0;
|
||||
width: 880px;
|
||||
height: 440px;
|
||||
padding: 0 24px;
|
||||
overflow-y: auto;
|
||||
&::-webkit-scrollbar {
|
||||
display: none; /*隐藏滚动条*/
|
||||
}
|
||||
a:hover {
|
||||
color: #ff2c3c;
|
||||
}
|
||||
.float-con {
|
||||
.category-three {
|
||||
border-bottom: 1px dashed $--border-color-base;
|
||||
.item {
|
||||
width: 20%;
|
||||
margin-bottom: 20px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,144 +0,0 @@
|
|||
<template>
|
||||
<div class="float-nav bg-white flex-col col-center">
|
||||
<div class="nav-list">
|
||||
<nuxt-link to="/shop_cart" class="item flex-col col-center lighter">
|
||||
<el-badge :value="publicData.cart_num" type="primary">
|
||||
<span class="iconfont icon-cart-Empty"></span>
|
||||
</el-badge>
|
||||
<div class="sm">购物车</div>
|
||||
</nuxt-link>
|
||||
<nuxt-link
|
||||
class="item flex-col col-center lighter"
|
||||
to="/user/coupons"
|
||||
>
|
||||
<el-badge :value="publicData.coupon_num" type="primary">
|
||||
<span class="iconfont icon-coupons"></span>
|
||||
</el-badge>
|
||||
<div class="sm">优惠券</div>
|
||||
</nuxt-link>
|
||||
<nuxt-link
|
||||
class="item flex-col col-center lighter"
|
||||
to="/user/order"
|
||||
>
|
||||
<span class="iconfont icon-icon_order"></span>
|
||||
<div class="sm">订单</div>
|
||||
</nuxt-link>
|
||||
<nuxt-link
|
||||
class="item flex-col col-center lighter"
|
||||
to="/user/collection"
|
||||
>
|
||||
<span class="iconfont icon-collection"></span>
|
||||
<div class="sm">收藏</div>
|
||||
</nuxt-link>
|
||||
<nuxt-link
|
||||
class="item flex-col col-center lighter"
|
||||
to="/help_center"
|
||||
>
|
||||
<span class="iconfont icon-survey"></span>
|
||||
<div class="sm">帮助</div>
|
||||
</nuxt-link>
|
||||
<el-popover placement="left" width="165" trigger="hover">
|
||||
<div
|
||||
style="text-align: center; margin: 0"
|
||||
class="flex-col col-center"
|
||||
>
|
||||
<img
|
||||
style="width: 100px; height: 100px"
|
||||
:src="server.image"
|
||||
alt=""
|
||||
/>
|
||||
<div class="sm m-t-8">{{ server.phone }}</div>
|
||||
<div class="sm m-t-10">
|
||||
在线时间:{{ server.business_time }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item flex-col col-center lighter" slot="reference">
|
||||
<span class="iconfont icon-service"></span>
|
||||
<div class="sm">客服</div>
|
||||
</div>
|
||||
</el-popover>
|
||||
</div>
|
||||
<div class="back-top">
|
||||
<span class="iconfont icon-top" @click="scrollTop"></span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
server: {},
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getService()
|
||||
},
|
||||
methods: {
|
||||
async getService() {
|
||||
const { data, code } = await this.$get(
|
||||
'setting/getPlatformCustomerService'
|
||||
)
|
||||
if (code == 1) {
|
||||
this.server = data
|
||||
}
|
||||
},
|
||||
scrollTop() {
|
||||
cancelAnimationFrame(this.timer)
|
||||
const self = this
|
||||
this.timer = requestAnimationFrame(function fn() {
|
||||
var oTop =
|
||||
document.body.scrollTop ||
|
||||
document.documentElement.scrollTop
|
||||
if (oTop > 0) {
|
||||
scrollTo(0, oTop - 250)
|
||||
self.timer = requestAnimationFrame(fn)
|
||||
} else {
|
||||
cancelAnimationFrame(self.timer)
|
||||
}
|
||||
})
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(['publicData']),
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.float-nav {
|
||||
height: 100vh;
|
||||
position: fixed;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: 60px;
|
||||
z-index: 999;
|
||||
box-shadow: -3px 1px 2px rgba(0, 0, 0, 0.04);
|
||||
.nav-list {
|
||||
position: absolute;
|
||||
bottom: 120px;
|
||||
.item {
|
||||
padding: 10px 4px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
color: $--color-primary;
|
||||
}
|
||||
.iconfont {
|
||||
font-size: 24px;
|
||||
}
|
||||
::v-deep .el-badge__content {
|
||||
height: 16px;
|
||||
line-height: 16px;
|
||||
padding: 0 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.back-top {
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,80 +0,0 @@
|
|||
<template>
|
||||
<div class="footer-container">
|
||||
<div class="footer-box flex row-center">
|
||||
<div class="server-box flex row-between">
|
||||
<div class="flex" v-for="(item, index) in lists" :key="index">
|
||||
<i
|
||||
:class="`white iconfont ${item.icon}`"
|
||||
style="font-size: 50px"
|
||||
/>
|
||||
<div class="m-l-8 xxl name">{{ item.name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="footer-wrap flex row-center">
|
||||
<a class="white" target="_blank" :href="config.icp_link"
|
||||
>{{ config.copyright_info }} {{ config.icp_number }}</a
|
||||
>
|
||||
</footer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
lists: [
|
||||
{
|
||||
name: '自营商城',
|
||||
icon: 'icon-ziying',
|
||||
},
|
||||
{
|
||||
name: '正品保障',
|
||||
icon: 'icon-zhengpin',
|
||||
},
|
||||
{
|
||||
name: '专属服务',
|
||||
icon: 'icon-fuwu',
|
||||
},
|
||||
{
|
||||
name: '售后无忧',
|
||||
icon: 'icon-peisong',
|
||||
},
|
||||
{
|
||||
name: '极速配送',
|
||||
icon: 'icon-shouhou',
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState(['config']),
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.footer-container {
|
||||
margin-top: 38px;
|
||||
.footer-box {
|
||||
height: 120px;
|
||||
background-color: #222;
|
||||
min-width: 1180px;
|
||||
.server-box {
|
||||
width: 1180px;
|
||||
padding: 36px 40px;
|
||||
border-bottom: 1px solid #707070;
|
||||
.name {
|
||||
color: #e5e5e5;
|
||||
}
|
||||
}
|
||||
}
|
||||
.footer-wrap {
|
||||
min-width: 1180px;
|
||||
background-color: #222;
|
||||
height: 60px;
|
||||
color: #ccc;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,368 +0,0 @@
|
|||
<template>
|
||||
<header>
|
||||
<div class="header-wrap">
|
||||
<div class="header-con xs">
|
||||
<div class="wrapper1180 flex row-between">
|
||||
<div class="flex" style="height: 100%">
|
||||
<template
|
||||
v-if="
|
||||
publicData.article && publicData.article.length
|
||||
"
|
||||
>
|
||||
<img
|
||||
style="
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-right: 10px;
|
||||
"
|
||||
src="~/static/images/header_notice.png"
|
||||
/>
|
||||
<client-only>
|
||||
<swiper
|
||||
ref="headerSwiper"
|
||||
:options="swiperOptions"
|
||||
>
|
||||
<swiper-slide
|
||||
class="swiper-item"
|
||||
v-for="(
|
||||
item, index
|
||||
) in publicData.article"
|
||||
:key="index"
|
||||
>
|
||||
<nuxt-link
|
||||
class="flex-col row-center"
|
||||
style="height: 100%"
|
||||
:to="
|
||||
'/news_list/news_list_detail?id=' +
|
||||
item.id
|
||||
"
|
||||
>
|
||||
<div class="line1">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</template>
|
||||
</div>
|
||||
<div class="user flex flex-none">
|
||||
<div v-if="publicData.name">
|
||||
您好,欢迎来到 {{ publicData.name }}!
|
||||
</div>
|
||||
<ul class="flex flex-none">
|
||||
<li v-if="publicData.nickname">
|
||||
<el-popover placement="bottom" trigger="hover">
|
||||
<div class="user-nav">
|
||||
<nuxt-link
|
||||
class="lighter xs item"
|
||||
to="/user/user_wallet"
|
||||
>我的钱包</nuxt-link
|
||||
>
|
||||
<nuxt-link
|
||||
class="lighter xs item"
|
||||
to="/user/coupons"
|
||||
>优惠券({{
|
||||
publicData.coupon_num
|
||||
}})</nuxt-link
|
||||
>
|
||||
<nuxt-link
|
||||
class="lighter xs item"
|
||||
to="/user/collection"
|
||||
>我的收藏</nuxt-link
|
||||
>
|
||||
<div
|
||||
class="lighter xs item"
|
||||
@click="onLogout"
|
||||
>
|
||||
退出登录
|
||||
</div>
|
||||
</div>
|
||||
<nuxt-link
|
||||
slot="reference"
|
||||
to="/user/profile"
|
||||
>
|
||||
{{ publicData.nickname }}
|
||||
<i class="el-icon-arrow-down"></i>
|
||||
</nuxt-link>
|
||||
</el-popover>
|
||||
</li>
|
||||
<li v-else>
|
||||
<nuxt-link to="/account/login">登录</nuxt-link>
|
||||
|
|
||||
<nuxt-link to="/account/register"
|
||||
>注册</nuxt-link
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/user/order">我的订单</nuxt-link>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/user/profile"
|
||||
>个人中心</nuxt-link
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/help_center"
|
||||
>帮助中心</nuxt-link
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/store_settled"
|
||||
>商家入驻</nuxt-link
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<nuxt-link to="/about_us"
|
||||
>关于我们</nuxt-link
|
||||
>
|
||||
</li>
|
||||
<!-- <li
|
||||
id="tel-phone-block"
|
||||
v-if="
|
||||
publicData.mnp_qr_code ||
|
||||
publicData.oa_qr_code
|
||||
"
|
||||
>
|
||||
<nuxt-link to="/"
|
||||
>手机端
|
||||
<i class="el-icon-arrow-down"></i>
|
||||
</nuxt-link>
|
||||
<div class="float-code flex bg-white">
|
||||
<div
|
||||
class="flex-col col-center bg-white"
|
||||
v-if="publicData.mnp_qr_code"
|
||||
>
|
||||
<img
|
||||
style="width: 100px; height: 100px"
|
||||
:src="publicData.mnp_qr_code"
|
||||
alt=""
|
||||
/>
|
||||
<div class="lighter m-t-10">
|
||||
官方小程序
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li> -->
|
||||
<li>
|
||||
<nuxt-link to="/">返回官网</nuxt-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-main bg-white">
|
||||
<div class="wrapper1180">
|
||||
<div class="search-wrap flex row-between">
|
||||
<nuxt-link to="/" class="flex row-center">
|
||||
<img
|
||||
:src="config.shop_login_logo"
|
||||
class="logo"
|
||||
alt="logo"
|
||||
/>
|
||||
</nuxt-link>
|
||||
<div class="flex">
|
||||
<div class="search flex">
|
||||
<input
|
||||
type="text"
|
||||
v-model="name"
|
||||
placeholder="请输入要搜索的商品名称"
|
||||
@keyup.enter="toSearch"
|
||||
/>
|
||||
<el-button
|
||||
class="search-btn"
|
||||
type="primary"
|
||||
@click="toSearch"
|
||||
>
|
||||
搜索
|
||||
</el-button>
|
||||
</div>
|
||||
<el-button type="primary" plain class="cart">
|
||||
<nuxt-link to="/shop_cart"
|
||||
>购物车({{
|
||||
publicData.cart_num
|
||||
}})</nuxt-link
|
||||
>
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { directive } from 'vue-awesome-swiper'
|
||||
import { mapState, mapMutations, mapActions } from 'vuex'
|
||||
export default {
|
||||
directives: {
|
||||
swiper: directive,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
name: '',
|
||||
swiperOptions: {
|
||||
direction: 'vertical',
|
||||
// autoHeight: true,
|
||||
height: 40,
|
||||
initialSlide: 0,
|
||||
autoplay: true,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
...mapMutations(['logout']),
|
||||
...mapActions(['getPublicData']),
|
||||
toSearch() {
|
||||
if (!this.name) return this.$message.error('请输入商品名称')
|
||||
this.$router.push({
|
||||
path: '/search_goodsList',
|
||||
query: {
|
||||
name: this.name,
|
||||
},
|
||||
})
|
||||
},
|
||||
onLogout() {
|
||||
this.logout()
|
||||
this.$message({
|
||||
message: '退出成功',
|
||||
type: 'success',
|
||||
})
|
||||
setTimeout(() => location.reload(), 1500)
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
$route: {
|
||||
immediate: true,
|
||||
handler: function (val) {
|
||||
console.log(val)
|
||||
if (val.path == '/goods_list') {
|
||||
this.name = val.query.name
|
||||
} else {
|
||||
this.name = ''
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState(['publicData', 'config']),
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.header-wrap {
|
||||
min-width: 1180px;
|
||||
position: relative;
|
||||
z-index: 1000;
|
||||
::v-deep .swiper-container {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
height: 100%;
|
||||
width: 400px;
|
||||
}
|
||||
.swiper-item {
|
||||
color: #ccc;
|
||||
height: 17px;
|
||||
}
|
||||
.header-con {
|
||||
background-color: #101010;
|
||||
height: 40px;
|
||||
color: #f2f2f2;
|
||||
> div {
|
||||
height: 100%;
|
||||
color: #cccccc;
|
||||
a {
|
||||
color: #cccccc;
|
||||
&:hover {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
ul {
|
||||
li {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
#tel-phone-block {
|
||||
position: relative;
|
||||
&:hover .float-code {
|
||||
display: flex;
|
||||
box-shadow: 0 2px 8px 0 rgb(0 0 0 / 10%);
|
||||
}
|
||||
.float-code {
|
||||
display: none;
|
||||
position: absolute;
|
||||
padding: 22px 16px;
|
||||
background-color: white;
|
||||
top: 24px;
|
||||
right: -20px;
|
||||
&::after {
|
||||
content: '';
|
||||
width: 8px;
|
||||
box-shadow: 0 2px 8px 0 rgb(0 0 0 / 10%);
|
||||
transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);
|
||||
right: 35px;
|
||||
top: -4px;
|
||||
height: 8px;
|
||||
background-color: #fff;
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.header-main {
|
||||
.search-wrap {
|
||||
height: 80px;
|
||||
.logo {
|
||||
height: 48px;
|
||||
width: auto;
|
||||
}
|
||||
.search {
|
||||
width: 460px;
|
||||
height: 42px;
|
||||
overflow: hidden;
|
||||
input {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
border-radius: 4px 0 0 4px;
|
||||
border: 1px solid $--color-primary;
|
||||
border-right-width: 0;
|
||||
padding: 0 10px;
|
||||
}
|
||||
.search-btn {
|
||||
width: 82px;
|
||||
height: 42px;
|
||||
cursor: pointer;
|
||||
border-radius: 0 4px 4px 0;
|
||||
}
|
||||
}
|
||||
.cart {
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
width: 108px;
|
||||
height: 42px;
|
||||
margin-left: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
.user-nav {
|
||||
.item {
|
||||
text-align: center;
|
||||
line-height: 34px;
|
||||
display: block;
|
||||
cursor: pointer;
|
||||
&:not(:last-child) {
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
&:hover {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,82 +0,0 @@
|
|||
<template>
|
||||
<nav>
|
||||
<div class="header-nav bg-white">
|
||||
<div class="nav-wrap flex">
|
||||
<category />
|
||||
<ul class="nav flex">
|
||||
<li class="item">
|
||||
<nuxt-link to="/">首页</nuxt-link>
|
||||
</li>
|
||||
<!-- <li class="item">
|
||||
<nuxt-link to="/demand_list">我的需求</nuxt-link>
|
||||
</li>
|
||||
<li class="item">
|
||||
<nuxt-link to="/seckill">限时秒杀</nuxt-link>
|
||||
</li> -->
|
||||
<li class="item">
|
||||
<nuxt-link to="/goods_list/1">热销榜单</nuxt-link>
|
||||
</li>
|
||||
<!-- <li class="item">
|
||||
<nuxt-link to="/goods_list/2">新品推荐</nuxt-link>
|
||||
</li>
|
||||
<li class="item">
|
||||
<nuxt-link to="/shop_street">店铺街</nuxt-link>
|
||||
</li>
|
||||
|
||||
<li class="item">
|
||||
<nuxt-link to="/get_coupons">领券中心</nuxt-link>
|
||||
</li>
|
||||
<li class="item">
|
||||
<nuxt-link to="/news_list">商城资讯</nuxt-link>
|
||||
</li>
|
||||
<li class="item">
|
||||
<nuxt-link to="/help_center">帮助中心</nuxt-link>
|
||||
</li> -->
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
import Category from './category'
|
||||
export default {
|
||||
components: {
|
||||
Category,
|
||||
},
|
||||
created() {},
|
||||
computed: {
|
||||
...mapState(['publicData']),
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.header-nav {
|
||||
border-top: 1px solid $--background-color-base;
|
||||
.nav-wrap {
|
||||
width: 1180px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.nav {
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
.item {
|
||||
a {
|
||||
padding: 12px 15px;
|
||||
margin: 0 10px;
|
||||
color: #101010;
|
||||
font-size: 16px;
|
||||
white-space: nowrap;
|
||||
&:hover {
|
||||
color: $--color-primary;
|
||||
}
|
||||
&.nuxt-link-exact-active {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,36 +0,0 @@
|
|||
<template>
|
||||
<div class="bg-white flex-col col-center null-data">
|
||||
<img :style="imgStyle" class="img-null" :src="img" alt="" />
|
||||
<div class="muted mt8">{{ text }}</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
img: {
|
||||
type: String,
|
||||
},
|
||||
text: {
|
||||
type: String,
|
||||
default: '暂无数据',
|
||||
},
|
||||
imgStyle: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
methods: {},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.null-data {
|
||||
padding: 100px;
|
||||
.img-null {
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,309 +0,0 @@
|
|||
<template>
|
||||
<div class="number-box">
|
||||
<div
|
||||
@click.stop.prevent="btnTouchStart('minus')"
|
||||
:class="{ minus: true, disabled: disabled || inputVal <= min }"
|
||||
:style="{
|
||||
background: bgColor,
|
||||
height: inputHeight + 'px',
|
||||
color: color,
|
||||
}"
|
||||
>
|
||||
<div :style="{ fontSize: size + 'px' }">-</div>
|
||||
</div>
|
||||
<input
|
||||
:disabled="disabledInput || disabled"
|
||||
:class="{ 'number-input': true, 'input-disabled': disabled }"
|
||||
v-model="inputVal"
|
||||
@blur="onBlur"
|
||||
@focus="onFocus"
|
||||
type="text"
|
||||
:style="{
|
||||
color: color,
|
||||
fontSize: size + 'px',
|
||||
background: bgColor,
|
||||
height: inputHeight + 'px',
|
||||
width: inputWidth + 'px',
|
||||
}"
|
||||
/>
|
||||
<div
|
||||
class="plus"
|
||||
@click.stop.prevent="btnTouchStart('plus')"
|
||||
:class="{ disabled: disabled || inputVal >= max }"
|
||||
:style="{
|
||||
background: bgColor,
|
||||
height: inputHeight + 'px',
|
||||
color: color,
|
||||
}"
|
||||
>
|
||||
<div :style="{ fontSize: size + 'px' }">+</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
// 预显示的数字
|
||||
value: {
|
||||
type: Number,
|
||||
default: 1,
|
||||
},
|
||||
// 背景颜色
|
||||
bgColor: {
|
||||
type: String,
|
||||
default: ' #F2F3F5',
|
||||
},
|
||||
// 最小值
|
||||
min: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
// 最大值
|
||||
max: {
|
||||
type: Number,
|
||||
default: 99999,
|
||||
},
|
||||
// 步进值,每次加或减的值
|
||||
step: {
|
||||
type: Number,
|
||||
default: 1,
|
||||
},
|
||||
// 是否禁用加减操作
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
// input的字体大小,单位px
|
||||
size: {
|
||||
type: [Number, String],
|
||||
default: 14,
|
||||
},
|
||||
// input宽度,单位px
|
||||
inputWidth: {
|
||||
type: [Number, String],
|
||||
default: 64,
|
||||
},
|
||||
//字体颜色
|
||||
color: {
|
||||
type: String,
|
||||
default: '#333',
|
||||
},
|
||||
// input高度,单位px
|
||||
inputHeight: {
|
||||
type: [Number, String],
|
||||
default: 32,
|
||||
},
|
||||
// index索引,用于列表中使用,让用户知道是哪个numberbox发生了变化,一般使用for循环出来的index值即可
|
||||
index: {
|
||||
type: [Number, String],
|
||||
default: '',
|
||||
},
|
||||
// 是否禁用输入框,与disabled作用于输入框时,为OR的关系,即想要禁用输入框,又可以加减的话
|
||||
// 设置disabled为false,disabledInput为true即可
|
||||
disabledInput: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
|
||||
// 是否只能输入大于或等于0的整数(正整数)
|
||||
positiveInteger: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
asyncChange: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
value(v1, v2) {
|
||||
if (!this.changeFromInner) {
|
||||
this.inputVal = v1
|
||||
this.$nextTick(function () {
|
||||
this.changeFromInner = false
|
||||
})
|
||||
}
|
||||
},
|
||||
inputVal(v1, v2) {
|
||||
if (v1 == '') return
|
||||
let value = 0
|
||||
let tmp = /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(v1)
|
||||
if (tmp && v1 >= this.min && v1 <= this.max) value = v1
|
||||
else value = v2
|
||||
if (this.positiveInteger) {
|
||||
if (v1 < 0 || String(v1).indexOf('.') !== -1) {
|
||||
value = v2
|
||||
this.$nextTick(() => {
|
||||
this.inputVal = v2
|
||||
})
|
||||
}
|
||||
}
|
||||
if (this.asyncChange) {
|
||||
return
|
||||
}
|
||||
// 发出change事件
|
||||
this.handleChange(value, 'change')
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
inputVal: 1, // 输入框中的值,不能直接使用props中的value,因为应该改变props的状态
|
||||
timer: null, // 用作长按的定时器
|
||||
changeFromInner: false, // 值发生变化,是来自内部还是外部
|
||||
innerChangeTimer: null, // 内部定时器
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.inputVal = Number(this.value)
|
||||
},
|
||||
computed: {},
|
||||
methods: {
|
||||
btnTouchStart(callback) {
|
||||
this[callback]()
|
||||
},
|
||||
minus() {
|
||||
this.computeVal('minus')
|
||||
},
|
||||
plus() {
|
||||
this.computeVal('plus')
|
||||
},
|
||||
calcPlus(num1, num2) {
|
||||
let baseNum, baseNum1, baseNum2
|
||||
try {
|
||||
baseNum1 = num1.toString().split('.')[1].length
|
||||
} catch (e) {
|
||||
baseNum1 = 0
|
||||
}
|
||||
try {
|
||||
baseNum2 = num2.toString().split('.')[1].length
|
||||
} catch (e) {
|
||||
baseNum2 = 0
|
||||
}
|
||||
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2))
|
||||
let precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2
|
||||
return ((num1 * baseNum + num2 * baseNum) / baseNum).toFixed(
|
||||
precision
|
||||
)
|
||||
},
|
||||
calcMinus(num1, num2) {
|
||||
let baseNum, baseNum1, baseNum2
|
||||
try {
|
||||
baseNum1 = num1.toString().split('.')[1].length
|
||||
} catch (e) {
|
||||
baseNum1 = 0
|
||||
}
|
||||
try {
|
||||
baseNum2 = num2.toString().split('.')[1].length
|
||||
} catch (e) {
|
||||
baseNum2 = 0
|
||||
}
|
||||
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2))
|
||||
let precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2
|
||||
return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(
|
||||
precision
|
||||
)
|
||||
},
|
||||
computeVal(type) {
|
||||
if (this.disabled) return
|
||||
let value = 0
|
||||
// 减
|
||||
if (type === 'minus') {
|
||||
value = this.calcMinus(this.inputVal, this.step)
|
||||
} else if (type === 'plus') {
|
||||
value = this.calcPlus(this.inputVal, this.step)
|
||||
}
|
||||
// 判断是否小于最小值和大于最大值
|
||||
if (value < this.min || value > this.max) {
|
||||
return
|
||||
}
|
||||
if (this.asyncChange) {
|
||||
this.$emit('change', value)
|
||||
} else {
|
||||
this.inputVal = value
|
||||
this.handleChange(value, type)
|
||||
}
|
||||
},
|
||||
// 处理用户手动输入的情况
|
||||
onBlur(event) {
|
||||
let val = 0
|
||||
let value = event.target.value
|
||||
|
||||
console.log(value)
|
||||
if (!/(^\d+$)/.test(value)) {
|
||||
val = this.min
|
||||
} else {
|
||||
val = +value
|
||||
}
|
||||
if (val > this.max) {
|
||||
val = this.max
|
||||
} else if (val < this.min) {
|
||||
val = this.min
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.inputVal = val
|
||||
})
|
||||
this.handleChange(val, 'blur')
|
||||
},
|
||||
// 输入框获得焦点事件
|
||||
onFocus() {
|
||||
this.$emit('focus')
|
||||
},
|
||||
handleChange(value, type) {
|
||||
if (this.disabled) return
|
||||
// 清除定时器,避免造成混乱
|
||||
if (this.innerChangeTimer) {
|
||||
clearTimeout(this.innerChangeTimer)
|
||||
this.innerChangeTimer = null
|
||||
}
|
||||
this.changeFromInner = true
|
||||
this.innerChangeTimer = setTimeout(() => {
|
||||
this.changeFromInner = false
|
||||
}, 150)
|
||||
this.$emit('input', Number(value))
|
||||
this.$emit(type, {
|
||||
value: Number(value),
|
||||
index: this.index,
|
||||
})
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.number-box {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
.number-input {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
margin: 0 6px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.plus,
|
||||
.minus {
|
||||
width: 32px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.plus {
|
||||
border-radius: 0 2px 2px 0;
|
||||
}
|
||||
.minus {
|
||||
border-radius: 2px 0 0 2px;
|
||||
}
|
||||
.disabled {
|
||||
color: #c8c9cc !important;
|
||||
background: #f7f8fa !important;
|
||||
}
|
||||
.input-disabled {
|
||||
color: #c8c9cc !important;
|
||||
background-color: #f2f3f5 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,366 +0,0 @@
|
|||
<template>
|
||||
<div class="order-list">
|
||||
<div class="item m-b-16" v-for="item in list" :key="item.id">
|
||||
<div class="item-hd flex">
|
||||
<nuxt-link
|
||||
class="flex-1 lighter sm line-1 m-r-20"
|
||||
style="min-width: 0"
|
||||
:to="`/shop_street_detail?id=${item.shop.id}`"
|
||||
>
|
||||
{{ item.shop.name }}
|
||||
</nuxt-link>
|
||||
<div class="flex-1 lighter sm">
|
||||
下单时间:{{ item.create_time }}
|
||||
</div>
|
||||
<div class="flex-1 lighter sm">
|
||||
订单编号:{{ item.order_sn }}
|
||||
</div>
|
||||
<div
|
||||
:class="['status sm', { primary: item.order_status == 0 }]"
|
||||
>
|
||||
{{ getOrderStatus(item.order_status) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item-con">
|
||||
<div class="flex" style="align-items: stretch;">
|
||||
<div class="goods">
|
||||
<nuxt-link
|
||||
class="goods-item flex"
|
||||
:to="`/goods_details/${goods.goods_id}`"
|
||||
v-for="(goods, index) in item.order_goods"
|
||||
:key="index"
|
||||
>
|
||||
<el-image class="goods-img" :src="goods.image" alt="" />
|
||||
<div class="goods-info flex-1">
|
||||
<div class="goods-name m-b-8 flex row-between">
|
||||
<div class="line1" style="width: 350px">
|
||||
<el-tag
|
||||
size="mini"
|
||||
effect="plain"
|
||||
v-if="goods.is_seckill"
|
||||
>秒杀</el-tag
|
||||
>
|
||||
{{ goods.goods_name }}
|
||||
</div>
|
||||
<div class="num">x{{ goods.goods_num }}</div>
|
||||
</div>
|
||||
<div class="sm muted m-b-8">
|
||||
{{ goods.spec_value }}
|
||||
</div>
|
||||
<div class="primary">
|
||||
<price-formate :price="goods.goods_price" />
|
||||
</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
<div
|
||||
class="pay-price flex-col col-center row-center"
|
||||
style="padding-left: 30px"
|
||||
>
|
||||
<div class="lighter">共{{ item.goods_count }}件商品</div>
|
||||
<div class="lighter m-t-8 flex">
|
||||
付款金额:
|
||||
<span class="primary">
|
||||
<price-formate
|
||||
:price="item.order_amount"
|
||||
:subscript-size="12"
|
||||
:first-size="16"
|
||||
:second-size="12"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="operate flex-col col-center row-center sm">
|
||||
<nuxt-link
|
||||
:to="`/payment?id=${item.id}&from=order`"
|
||||
class="btn m-b-16 bg-primary flex row-center white sm"
|
||||
v-if="item.pay_btn"
|
||||
>
|
||||
<span class="m-r-8">去付款</span>
|
||||
<count-down
|
||||
v-if="getCancelTime(item.order_cancel_time) > 0"
|
||||
:time="getCancelTime(item.order_cancel_time)"
|
||||
format="hh:mm:ss"
|
||||
@finish="$emit('refresh')"
|
||||
/>
|
||||
</nuxt-link>
|
||||
<div
|
||||
class="btn m-b-10 primary flex row-center sm plain"
|
||||
v-if="item.take_btn"
|
||||
@click="handleOrder(2, item.id)"
|
||||
>
|
||||
确认收货
|
||||
</div>
|
||||
<div
|
||||
class="m-b-10 muted flex row-center sm"
|
||||
v-if="item.delivery_btn"
|
||||
@click="showDeliverDialog(item.id)"
|
||||
>
|
||||
物流查询
|
||||
</div>
|
||||
<div
|
||||
class="m-b-10 muted row-center sm"
|
||||
v-if="item.cancel_btn"
|
||||
@click="handleOrder(0, item.id)"
|
||||
>
|
||||
取消订单
|
||||
</div>
|
||||
<div
|
||||
class="m-b-10 muted row-center sm"
|
||||
v-if="item.del_btn"
|
||||
@click="handleOrder(1, item.id)"
|
||||
>
|
||||
删除订单
|
||||
</div>
|
||||
<nuxt-link
|
||||
class="lighter"
|
||||
:to="`/user/order/detail?id=${item.id}`"
|
||||
>
|
||||
<span>查看详情</span>
|
||||
<!-- <i class="el-icon-arrow-right"></i> -->
|
||||
</nuxt-link>
|
||||
|
||||
<el-upload
|
||||
class="upload-demo"
|
||||
:action="action"
|
||||
:multiple="true"
|
||||
:limit="10"
|
||||
:headers="{token: $store.state.token}"
|
||||
:show-file-list="false"
|
||||
:on-success="onSuccess"
|
||||
>
|
||||
<el-button type="primary" size="mini" class="m-t-10 muted row-center sm uploadBtn"
|
||||
v-if="item.pay_btn == 0 && item.del_btn != 1" @click="uploadContract(item.id)"
|
||||
>上传合同</el-button>
|
||||
</el-upload>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<deliver-search v-model="showDeliver" :aid="aid" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import config from "~/config/app";
|
||||
export default {
|
||||
props: {
|
||||
list: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showDeliver: false,
|
||||
aid: -1,
|
||||
action: config.baseUrl + "/api/file/formimage",
|
||||
baseUrl:config.baseUrl + '/',
|
||||
uploadId:'',//上传的id
|
||||
}
|
||||
},
|
||||
created() {
|
||||
console.log(this.list)
|
||||
},
|
||||
methods: {
|
||||
handleOrder(type, id) {
|
||||
this.type = type
|
||||
this.orderId = id
|
||||
this.$confirm(this.getTipsText(type), {
|
||||
title: '温馨提示',
|
||||
center: true,
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
callback: (action) => {
|
||||
if (action == 'confirm') {
|
||||
this.postOrder()
|
||||
}
|
||||
},
|
||||
})
|
||||
},
|
||||
async postOrder() {
|
||||
const { type, orderId } = this
|
||||
let url = ''
|
||||
switch (type) {
|
||||
case 0:
|
||||
url = 'order/cancel'
|
||||
break
|
||||
case 1:
|
||||
url = 'order/del'
|
||||
break
|
||||
case 2:
|
||||
url = 'order/confirm'
|
||||
break
|
||||
}
|
||||
let { code, data, msg } = await this.$post(url, { id: orderId })
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: 'success',
|
||||
})
|
||||
this.$emit('refresh')
|
||||
}
|
||||
},
|
||||
getTipsText(type) {
|
||||
switch (type) {
|
||||
case 0:
|
||||
return '确认取消订单吗?'
|
||||
case 1:
|
||||
return '确认删除订单吗?'
|
||||
case 2:
|
||||
return '确认收货吗?'
|
||||
}
|
||||
},
|
||||
showDeliverDialog(id) {
|
||||
console.log('showDeliverDialog')
|
||||
this.aid = id
|
||||
this.showDeliver = true
|
||||
},
|
||||
// 上传合同选中的id
|
||||
uploadContract(id) {
|
||||
this.uploadId = id;
|
||||
console.log(this.uploadId)
|
||||
},
|
||||
|
||||
async onSuccess(response, file, fileList) {
|
||||
console.log(response, file, fileList)
|
||||
let that = this;
|
||||
if(fileList) {
|
||||
let result = fileList.map(item => item.response.data.base_uri).join(',');
|
||||
let params = {
|
||||
order_id:that.uploadId,
|
||||
path:result
|
||||
}
|
||||
let respond = await that.$post("order/contractUpload", params);
|
||||
if (respond.code == 1) {
|
||||
this.$message({
|
||||
message: '上传成功,可进入详情查看',
|
||||
type: "success",
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
getOrderStatus() {
|
||||
return (status) => {
|
||||
let text = ''
|
||||
switch (status) {
|
||||
case 0:
|
||||
text = '待支付'
|
||||
break
|
||||
case 1:
|
||||
text = '待发货'
|
||||
break
|
||||
case 2:
|
||||
text = '待收货'
|
||||
break
|
||||
case 3:
|
||||
text = '已完成'
|
||||
break
|
||||
case 4:
|
||||
text = '订单已关闭'
|
||||
break
|
||||
}
|
||||
return text
|
||||
}
|
||||
},
|
||||
getCancelTime() {
|
||||
return (time) => time - Date.now() / 1000
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.order-list {
|
||||
padding: 0 16px;
|
||||
.item {
|
||||
margin-bottom: 20px;
|
||||
.item-hd {
|
||||
height: 40px;
|
||||
border: 1px solid #e5e5e5;
|
||||
background: #f2f2f2;
|
||||
padding: 0 20px;
|
||||
.status {
|
||||
width: 100px;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
.item-con {
|
||||
box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.08);
|
||||
align-items: stretch;
|
||||
.goods {
|
||||
padding: 17px 0;
|
||||
width: 560px;
|
||||
.goods-item {
|
||||
padding: 10px 20px;
|
||||
.goods-img {
|
||||
flex: none;
|
||||
margin-right: 10px;
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
}
|
||||
.goods-name {
|
||||
width: 100%;
|
||||
.num {
|
||||
padding: 0 42px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.pay-price {
|
||||
width: 200px;
|
||||
border-left: 1px solid #e5e5e5;
|
||||
border-right: 1px solid #e5e5e5;
|
||||
}
|
||||
.operate {
|
||||
width: 185px;
|
||||
& > div {
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn {
|
||||
width: 120px;
|
||||
height: 32px;
|
||||
border-radius: 2px;
|
||||
&.plain {
|
||||
border: 1px solid $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.uploadBtn {
|
||||
color: #fff;
|
||||
}
|
||||
.pre-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
border-top: 1px solid #e5e5e5;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.pre-item {
|
||||
width: 120rpx;
|
||||
border-radius: 6rpx;
|
||||
height: 120rpx;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
margin-bottom: 20rpx;
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
|
||||
.pre-item-image {
|
||||
width: 100%;
|
||||
height: 120rpx;
|
||||
}
|
||||
|
||||
// .item-con .el-upload-list {
|
||||
// display: none;
|
||||
// }
|
||||
</style>
|
|
@ -1,94 +0,0 @@
|
|||
<template>
|
||||
<span
|
||||
:style="{ color, 'font-weight': weight }"
|
||||
:class="(lineThrough ? 'line-through' : '') + 'price-format'"
|
||||
>
|
||||
<span
|
||||
v-if="showSubscript"
|
||||
:style="{
|
||||
'font-size': subscriptSize + 'px',
|
||||
'margin-right': '1px',
|
||||
}"
|
||||
>¥</span
|
||||
>
|
||||
<span
|
||||
:style="{ 'font-size': firstSize + 'px', 'margin-right': '1px' }"
|
||||
>{{ priceSlice.first }}</span
|
||||
>
|
||||
<span
|
||||
v-if="priceSlice.second"
|
||||
:style="{ 'font-size': secondSize + 'px' }"
|
||||
>.{{ priceSlice.second }}</span
|
||||
>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
priceSlice: {},
|
||||
}
|
||||
},
|
||||
components: {},
|
||||
props: {
|
||||
firstSize: {
|
||||
type: Number,
|
||||
default: 14,
|
||||
},
|
||||
secondSize: {
|
||||
type: Number,
|
||||
default: 14,
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
},
|
||||
weight: {
|
||||
type: [String, Number],
|
||||
default: 400,
|
||||
},
|
||||
price: {
|
||||
type: [String, Number],
|
||||
default: '',
|
||||
},
|
||||
showSubscript: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
subscriptSize: {
|
||||
type: Number,
|
||||
default: 14,
|
||||
},
|
||||
lineThrough: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.priceFormat()
|
||||
},
|
||||
watch: {
|
||||
price(val) {
|
||||
this.priceFormat()
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
priceFormat() {
|
||||
let { price } = this
|
||||
let priceSlice = {}
|
||||
if (price !== null) {
|
||||
price = String(price).split('.')
|
||||
priceSlice.first = price[0]
|
||||
priceSlice.second = price[1]
|
||||
this.priceSlice = priceSlice
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.price-format {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
}
|
||||
</style>
|
|
@ -1,77 +0,0 @@
|
|||
<template>
|
||||
<nuxt-link
|
||||
class="shop-item flex-col row-right"
|
||||
:style="{
|
||||
'background-image': `url(${cover})`,
|
||||
}"
|
||||
:to="`/shop_street_detail?id=${shopId}`"
|
||||
>
|
||||
<div class="bg-white shop-info text-center">
|
||||
<el-image class="logo" :src="logo"></el-image>
|
||||
<div class="m-t-12 line-1 lg">
|
||||
<el-tag size="mini" v-if="type == 1">自营</el-tag> {{ name }}
|
||||
</div>
|
||||
<span class="xs muted sales"
|
||||
>共{{ sales }}件商品</span
|
||||
>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
cover: {
|
||||
type: String,
|
||||
},
|
||||
shopId: {
|
||||
type: [String, Number],
|
||||
},
|
||||
logo: {
|
||||
type: String,
|
||||
},
|
||||
type: {
|
||||
type: [String, Number],
|
||||
},
|
||||
name: {
|
||||
type: String,
|
||||
},
|
||||
sales: {
|
||||
type: [String, Number],
|
||||
}
|
||||
},
|
||||
methods: {},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.shop-item {
|
||||
width: 270px;
|
||||
height: 400px;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
padding: 10px;
|
||||
border-radius: 6px;
|
||||
|
||||
.shop-info {
|
||||
border-radius: 6px;
|
||||
padding: 18px 15px;
|
||||
.logo {
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
border-radius: 16px;
|
||||
margin-top: -45px;
|
||||
}
|
||||
.sales {
|
||||
display: inline-block;
|
||||
padding: 4px 10px;
|
||||
background-color: #f2f2f2;
|
||||
margin-top: 6px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
|
@ -1,108 +0,0 @@
|
|||
<template>
|
||||
<div class="v-upload">
|
||||
<el-upload
|
||||
list-type="picture-card"
|
||||
:action="url + '/api/file/formimage'"
|
||||
:limit="limit"
|
||||
:on-success="success"
|
||||
:on-error="error"
|
||||
:on-remove="remove"
|
||||
:on-change="onChange"
|
||||
:headers="{ token: $store.state.token }"
|
||||
:auto-upload="autoUpload"
|
||||
accept="image/jpg,image/jpeg,image/png"
|
||||
:before-upload="beforeAvatarUpload"
|
||||
>
|
||||
<slot v-if="isSlot"></slot>
|
||||
<div v-else>
|
||||
<div class="muted xs">上传图片</div>
|
||||
</div>
|
||||
</el-upload>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import config from '~/config/app'
|
||||
export default {
|
||||
components: {},
|
||||
props: {
|
||||
limit: {
|
||||
type: Number,
|
||||
default: 1,
|
||||
},
|
||||
isSlot: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
autoUpload: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
onChange: {
|
||||
type: Function,
|
||||
default: () => {},
|
||||
},
|
||||
},
|
||||
watch: {},
|
||||
data() {
|
||||
return {
|
||||
url: config.baseUrl,
|
||||
}
|
||||
},
|
||||
created() {},
|
||||
computed: {},
|
||||
methods: {
|
||||
success(res, file, fileList) {
|
||||
if (!this.autoUpload) {
|
||||
return
|
||||
}
|
||||
this.$message({
|
||||
message: '上传成功',
|
||||
type: 'success',
|
||||
})
|
||||
this.$emit('success', fileList)
|
||||
},
|
||||
remove(file, fileList) {
|
||||
this.$emit('remove', fileList)
|
||||
},
|
||||
error(res) {
|
||||
this.$message({
|
||||
message: '上传失败,请重新上传',
|
||||
type: 'error',
|
||||
})
|
||||
},
|
||||
|
||||
beforeAvatarUpload(file) {
|
||||
var testmsg = file.name.substring(file.name.lastIndexOf('.') + 1)
|
||||
console.log('fdsadsf')
|
||||
const extension = testmsg === 'jpg'
|
||||
const extension2 = testmsg === 'png'
|
||||
const extension4 = testmsg === 'jpeg'
|
||||
if (!extension && !extension2) {
|
||||
this.$message({
|
||||
message: '上传文件只能是 jpg, jpeg, png格式!',
|
||||
type: 'warning'
|
||||
})
|
||||
return false
|
||||
}
|
||||
return extension || extension2 || extension4
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.v-upload {
|
||||
.el-upload--picture-card {
|
||||
width: 76px;
|
||||
height: 76px;
|
||||
line-height: 76px;
|
||||
}
|
||||
.el-upload-list--picture-card {
|
||||
.el-upload-list__item {
|
||||
width: 76px;
|
||||
height: 76px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,11 +0,0 @@
|
|||
|
||||
// 本地访问域名
|
||||
// const testUrl = "https://glh.dev.scdxtc.cn"
|
||||
const testUrl = "https://www.gonglehui.com"
|
||||
//线上域名
|
||||
const productUrl = 'https://www.gonglehui.com'
|
||||
const config = {
|
||||
baseUrl: process.env.NODE_ENV == 'production' ? productUrl : testUrl
|
||||
}
|
||||
|
||||
export default config
|
|
@ -1,30 +0,0 @@
|
|||
<template>
|
||||
<div class="default-layout flex-col">
|
||||
<ls-header></ls-header>
|
||||
<main-nav />
|
||||
<main class="content-container wrapper1180 flex-1">
|
||||
<nuxt />
|
||||
</main>
|
||||
<ls-footer></ls-footer>
|
||||
<float-nav></float-nav>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import LsHeader from '~/components/layout/header'
|
||||
import LsFooter from '~/components/layout/footer'
|
||||
import FloatNav from '~/components/layout/float-nav'
|
||||
import MainNav from '~/components/layout/main-nav'
|
||||
export default {
|
||||
components: {
|
||||
LsHeader,
|
||||
LsFooter,
|
||||
FloatNav,
|
||||
MainNav,
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.default-layout {
|
||||
min-height: 100vh;
|
||||
}
|
||||
</style>
|
|
@ -1,25 +0,0 @@
|
|||
<template>
|
||||
<div class="error flex-col col-center">
|
||||
<h1 class="mb16">抱歉,您访问的页面出错了</h1>
|
||||
<div class="muted">您可能输错了网址,或该网页已被删除、不存在等</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
components: {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.error {
|
||||
padding-top: 200px;
|
||||
}
|
||||
</style>
|
|
@ -1,56 +0,0 @@
|
|||
<template>
|
||||
<div class="default-layout flex-col">
|
||||
<div class="default-header">
|
||||
<div class="haeder-con">
|
||||
<nuxt-link to="/" v-if="config.shop_login_logo">
|
||||
<img class="header-logo" :src="config.shop_login_logo" />
|
||||
</nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
<div class="default-main flex-1">
|
||||
<nuxt />
|
||||
</div>
|
||||
<ls-footer></ls-footer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LsFooter from '~/components/layout/footer'
|
||||
import { mapState } from 'vuex'
|
||||
export default {
|
||||
components: {
|
||||
LsFooter,
|
||||
},
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
created() {},
|
||||
computed: {
|
||||
...mapState(['config']),
|
||||
},
|
||||
methods: {},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.default-layout {
|
||||
min-height: 100vh;
|
||||
.default-header {
|
||||
padding: 22px 0;
|
||||
background-color: white;
|
||||
min-width: 1180px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
.haeder-con {
|
||||
width: 1180px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.header-logo {
|
||||
height: 56px;
|
||||
}
|
||||
}
|
||||
.default-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,29 +0,0 @@
|
|||
<template>
|
||||
<div class="default-layout flex-col">
|
||||
<ls-header></ls-header>
|
||||
<main class="content-container">
|
||||
<nuxt />
|
||||
</main>
|
||||
<ls-footer></ls-footer>
|
||||
<float-nav></float-nav>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import LsHeader from '~/components/layout/header'
|
||||
import LsFooter from '~/components/layout/footer'
|
||||
import FloatNav from '~/components/layout/float-nav'
|
||||
import MainNav from '~/components/layout/main-nav'
|
||||
export default {
|
||||
components: {
|
||||
LsHeader,
|
||||
LsFooter,
|
||||
FloatNav,
|
||||
MainNav,
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.default-layout {
|
||||
min-height: 100vh;
|
||||
}
|
||||
</style>
|
|
@ -1,42 +0,0 @@
|
|||
<template>
|
||||
<div class="default-layout flex-col">
|
||||
<ls-header></ls-header>
|
||||
<main-nav />
|
||||
<main class="content-container wrapper1180 flex flex-1">
|
||||
<aslide-nav />
|
||||
<div class="content bg-white flex-1">
|
||||
<nuxt />
|
||||
</div>
|
||||
</main>
|
||||
<ls-footer></ls-footer>
|
||||
<float-nav></float-nav>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import LsHeader from "~/components/layout/header";
|
||||
import LsFooter from "~/components/layout/footer";
|
||||
import AslideNav from "~/components/layout/aslide-nav";
|
||||
import MainNav from '~/components/layout/main-nav'
|
||||
import FloatNav from "~/components/layout/float-nav";
|
||||
export default {
|
||||
components: {
|
||||
LsHeader,
|
||||
LsFooter,
|
||||
AslideNav,
|
||||
FloatNav,
|
||||
MainNav
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style scoped>
|
||||
.default-layout {
|
||||
min-height: 100vh;
|
||||
}
|
||||
.content-container {
|
||||
padding: 24px 0;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.content-container > .content {
|
||||
min-height: 680px;
|
||||
}
|
||||
</style>
|
|
@ -1,12 +0,0 @@
|
|||
import Cookies from 'js-cookie'
|
||||
|
||||
const account = ['login', 'register', 'forget_pwd', "error"]
|
||||
|
||||
export default function({route, app, store}) {
|
||||
const { fullPath } = route
|
||||
const isAccount = account.some((item) => fullPath.includes(item))
|
||||
const {isLogin} = store.getters
|
||||
if(!isAccount && !isLogin) {
|
||||
process.server ? app.$cookies.set('back_url', fullPath) : Cookies.set('back_url', fullPath)
|
||||
}
|
||||
}
|
|
@ -1,69 +0,0 @@
|
|||
export default {
|
||||
// Global page headers: https://go.nuxtjs.dev/config-head
|
||||
head: {
|
||||
title: '',
|
||||
htmlAttrs: {
|
||||
lang: 'zh'
|
||||
},
|
||||
meta: [
|
||||
{charset: 'utf-8'},
|
||||
{name: 'viewport', content: 'width=device-width, initial-scale=1'},
|
||||
{hid: 'description', name: 'description', content: ''},
|
||||
{name: 'format-detection', content: 'telephone=no'}
|
||||
],
|
||||
link: [
|
||||
{rel: 'icon', type: 'image/x-icon', href: '/favicon.ico'}
|
||||
]
|
||||
},
|
||||
ssr: false,
|
||||
// Global CSS: https://go.nuxtjs.dev/config-css
|
||||
css: [
|
||||
'@/assets/css/element-variables.scss',
|
||||
'@/assets/css/common.scss',
|
||||
'@/assets/css/reset.scss',
|
||||
'swiper/css/swiper.css',
|
||||
'@/assets/css/element.scss',
|
||||
'@/assets/fonts/iconfont.css'
|
||||
],
|
||||
|
||||
// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
|
||||
plugins: [
|
||||
'@/plugins/element-ui',
|
||||
{src: '@/plugins/vue-awesome-swiper', mode: 'client'},
|
||||
'@/plugins/axios',
|
||||
'@/plugins/init',
|
||||
],
|
||||
|
||||
// Auto import components: https://go.nuxtjs.dev/config-components
|
||||
components: true,
|
||||
|
||||
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
|
||||
buildModules: [],
|
||||
|
||||
// Modules: https://go.nuxtjs.dev/config-modules
|
||||
modules: [
|
||||
// https://go.nuxtjs.dev/axios
|
||||
'@nuxtjs/axios',
|
||||
'@nuxtjs/style-resources',
|
||||
['cookie-universal-nuxt', { parseJSON: true }]
|
||||
],
|
||||
|
||||
// Axios module configuration: https://go.nuxtjs.dev/config-axios
|
||||
axios: {},
|
||||
|
||||
// Build Configuration: https://go.nuxtjs.dev/config-build
|
||||
build: {
|
||||
transpile: [/^element-ui/],
|
||||
},
|
||||
|
||||
router: {
|
||||
middleware: 'route', // 即每次路由跳转会调用该中间件
|
||||
base: '/'
|
||||
//多个中间件写法
|
||||
// middleware: ['route']
|
||||
},
|
||||
|
||||
styleResources: {
|
||||
scss: "./assets/css/variables.scss"
|
||||
},
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
"name": "LikeSopb2b2c",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "nuxt",
|
||||
"build": "nuxt build",
|
||||
"start": "nuxt start",
|
||||
"generate": "nuxt generate"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nuxtjs/axios": "^5.13.6",
|
||||
"@nuxtjs/style-resources": "^1.0.0",
|
||||
"cookie-universal-nuxt": "^2.1.4",
|
||||
"cookieparser": "^0.1.0",
|
||||
"core-js": "^3.15.1",
|
||||
"element-ui": "^2.15.2",
|
||||
"js-cookie": "^2.2.1",
|
||||
"nuxt": "latest",
|
||||
"swiper": "^5.2.0",
|
||||
"vue-awesome-swiper": "^4.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nuxtjs/proxy": "^2.1.0",
|
||||
"sass": "~1.32.8",
|
||||
"sass-loader": "10"
|
||||
},
|
||||
"config": {
|
||||
"nuxt": {
|
||||
"host": "0.0.0.0",
|
||||
"port": 8000
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,140 +0,0 @@
|
|||
<template>
|
||||
<div class="news-details-container mt16">
|
||||
<div class="nav-container flex">
|
||||
<div class="nr" style="width: 70px">当前位置:</div>
|
||||
<el-breadcrumb style="flex: 1;" separator="/">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item class="line1">关于我们</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div class="news-detail-box">
|
||||
<div class="content-header bg-white">
|
||||
<div class="news-detail-title">
|
||||
关于我们
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-html-box bg-white">
|
||||
<div v-html="detailsObj.content"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
$post,
|
||||
query
|
||||
}) {
|
||||
let detailsObj = {};
|
||||
|
||||
let res = await $get("policy/aboutUs", {});
|
||||
if (res.code == 1) {
|
||||
detailsObj = res.data;
|
||||
|
||||
}
|
||||
return {
|
||||
detailsObj,
|
||||
|
||||
};
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log('route', this.$route)
|
||||
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.news-details-container {
|
||||
.nav-container {
|
||||
padding: 15px 16px;
|
||||
}
|
||||
|
||||
.content-box {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.news-detail-box {
|
||||
background-color: #FFFFFF;
|
||||
width: 100%;
|
||||
|
||||
.content-header {
|
||||
margin: 0px 20px;
|
||||
padding: 20px 0px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.news-detail-title {
|
||||
color: #222;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
|
||||
.content-html-box {
|
||||
padding: 24px 20px;
|
||||
|
||||
&>div {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
|
||||
::v-deep img {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box {
|
||||
width: 264px;
|
||||
|
||||
.recommend-box-header {
|
||||
padding: 15px 10px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.primary-line {
|
||||
margin-right: 10px;
|
||||
background-color: $--color-primary;
|
||||
width: 4px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box-content {
|
||||
.recommend-list-container {
|
||||
.recommend-list-item {
|
||||
padding: 10px;
|
||||
cursor: pointer;
|
||||
|
||||
.goods-info {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,209 +0,0 @@
|
|||
<template>
|
||||
<div class="forget-pwd-container flex-col row-center col-center">
|
||||
<div class="forget-pwd-box flex-col col-center bg-white">
|
||||
<div class="forget-pwd-title">忘记密码</div>
|
||||
<el-form class="form-box flex-col">
|
||||
<div class="forget-form-item">
|
||||
<el-input
|
||||
class="form-input"
|
||||
v-model="telephone"
|
||||
placeholder="请输入手机号码"
|
||||
>
|
||||
<i
|
||||
class="el-icon-user"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="forget-form-item flex">
|
||||
<el-input
|
||||
v-model="smsCode"
|
||||
class="form-input"
|
||||
placeholder="短信验证码"
|
||||
style="width: 264px"
|
||||
>
|
||||
<i
|
||||
class="el-icon-lock"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
<el-button class="sms-btn" @click="sendSMSCode">
|
||||
<div v-if="canSend">获取验证码</div>
|
||||
<count-down
|
||||
v-else
|
||||
:time="60"
|
||||
format="ss秒"
|
||||
autoStart
|
||||
@finish="canSend = true"
|
||||
/>
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="forget-form-item">
|
||||
<el-input
|
||||
v-model="password"
|
||||
placeholder="请输入密码 (数字与字母自由组合)"
|
||||
show-password
|
||||
>
|
||||
<i
|
||||
class="el-icon-more-outline"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="forget-form-item">
|
||||
<el-input
|
||||
v-model="againPwd"
|
||||
placeholder="再次输入密码"
|
||||
show-password
|
||||
>
|
||||
<i
|
||||
class="el-icon-key"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="flex-col" style="margin-top: 46px">
|
||||
<el-button type="primary" @click="forgetFun"
|
||||
>确定</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { SMSType, client } from '@/utils/type'
|
||||
import CountDown from '~/components/count-down'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
layout: 'main',
|
||||
components: {
|
||||
CountDown,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
telephone: '',
|
||||
smsCode: '',
|
||||
canSend: true,
|
||||
password: '',
|
||||
againPwd: '',
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async forgetFun() {
|
||||
if (!this.telephone) {
|
||||
this.$message({
|
||||
message: '请输入手机号码',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
} else if (!this.smsCode) {
|
||||
this.$message({
|
||||
message: '请输入验证码',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
} else if (!this.password) {
|
||||
this.$message({
|
||||
message: '请输入密码信息',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
} else if (this.password != this.againPwd) {
|
||||
this.$message({
|
||||
message: '两次输入密码不一致',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
let res = await this.$post('login_password/forget', {
|
||||
mobile: this.telephone,
|
||||
code: this.smsCode,
|
||||
password: this.password,
|
||||
repassword: this.againPwd,
|
||||
client: client,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: '修改成功',
|
||||
type: 'success',
|
||||
})
|
||||
let time = setTimeout(() => {
|
||||
this.$router.replace('/account/login')
|
||||
clearTimeout(time)
|
||||
}, 1000)
|
||||
}
|
||||
},
|
||||
async sendSMSCode() {
|
||||
if (!this.telephone) {
|
||||
this.$message({
|
||||
message: '请输入手机号码',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
let res = await this.$post('sms/send', {
|
||||
mobile: this.telephone,
|
||||
key: SMSType.FINDPWD,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.canSend = false
|
||||
this.$message({
|
||||
message: '发送成功',
|
||||
type: 'success',
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.forget-pwd-container {
|
||||
flex: 1;
|
||||
.forget-pwd-box {
|
||||
padding-top: 40px;
|
||||
padding-bottom: 55px;
|
||||
width: 880px;
|
||||
border: 1px solid #e5e5e5;
|
||||
.forget-pwd-title {
|
||||
font-size: 24px;
|
||||
}
|
||||
.form-box {
|
||||
.forget-form-item {
|
||||
margin-top: 24px;
|
||||
}
|
||||
.form-input {
|
||||
width: 400px;
|
||||
}
|
||||
.verify-code-img {
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
margin-left: 26px;
|
||||
background-color: red;
|
||||
}
|
||||
.sms-btn {
|
||||
margin-left: 16px;
|
||||
height: 40px;
|
||||
width: 120px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,448 +0,0 @@
|
|||
<template>
|
||||
<div class="login flex col-center">
|
||||
<div class="login-container flex col-stretch">
|
||||
<div class="login-banner">
|
||||
<!-- <el-image-->
|
||||
<!-- fit="cover"-->
|
||||
<!-- style="width: 100%; height: 100%"-->
|
||||
<!-- :src="config.pc_login_logo"-->
|
||||
<!-- ></el-image>-->
|
||||
<img :src="config.pc_login_logo" height="100%" />
|
||||
</div>
|
||||
<div class="login-float-form-wrap">
|
||||
<div class="login-box">
|
||||
<div class="login-header-box">
|
||||
<div class="header-tabs flex row-center">
|
||||
<div
|
||||
class="header-tab xxl"
|
||||
:class="{ 'active-tab': loginStatus == 0 }"
|
||||
@click="changeLoginType(0)"
|
||||
>验证码登录</div>
|
||||
<div
|
||||
class="header-tab xxl"
|
||||
:class="{ 'active-tab': loginStatus == 1 }"
|
||||
@click="changeLoginType(1)"
|
||||
>账号密码登录</div>
|
||||
</div>
|
||||
<div v-show="loginStatus == 0" @keyup.enter="smsLogin">
|
||||
<div class="login-form-box">
|
||||
<div class="login-form-item">
|
||||
<el-input
|
||||
placeholder="请输入手机号码"
|
||||
v-model="telephone"
|
||||
class="input-phone-num"
|
||||
>
|
||||
<el-select
|
||||
style="width: 100px"
|
||||
v-model="selectNumberType"
|
||||
slot="prepend"
|
||||
placeholder="请选择"
|
||||
>
|
||||
<el-option label="中国+86" value="1"></el-option>
|
||||
</el-select>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="login-form-item flex">
|
||||
<el-input
|
||||
v-model="smsCode"
|
||||
placeholder="短信验证码"
|
||||
style="width: 210px"
|
||||
/>
|
||||
<el-button class="sms-btn" @click="sendSMSCode">
|
||||
<div v-if="canSend">获取验证码</div>
|
||||
<count-down
|
||||
v-else
|
||||
:time="60"
|
||||
format="ss秒"
|
||||
:autoStart="true"
|
||||
@finish="canSend = true"
|
||||
/>
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="option-box flex-col">
|
||||
<el-checkbox v-model="isRemember" class="muted">记住账号</el-checkbox>
|
||||
<div class="m-t-20 flex-col">
|
||||
<el-button type="primary" @click="smsLogin">立即登录</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-show="loginStatus == 1" @keyup.enter="accountLogin">
|
||||
<div class="login-form-box">
|
||||
<div class="login-form-item">
|
||||
<el-input
|
||||
placeholder="请输入账号/手机号码"
|
||||
v-model="account"
|
||||
class="input-phone-num"
|
||||
>
|
||||
<i
|
||||
class="el-icon-user"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
></i>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="login-form-item flex">
|
||||
<el-input v-model="password" placeholder="请输入密码" show-password>
|
||||
<i
|
||||
class="el-icon-more-outline"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="option-box flex-col">
|
||||
<div class="flex row-between">
|
||||
<el-checkbox v-model="isRemember" class="muted">记住账号</el-checkbox>
|
||||
<nuxt-link class="muted" to="/account/forget_pwd">忘记密码?</nuxt-link>
|
||||
</div>
|
||||
<div class="m-t-20 flex-col">
|
||||
<el-button type="primary" @click="accountLogin">立即登录</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="login-footer-box flex row-between">
|
||||
<!-- <div class="flex">
|
||||
<div class="flex login__other-item" @click="goWechatLogin">
|
||||
<i class="iconfont icon-weixin1 login__weixin-icon"></i>
|
||||
<div class="m-l-4 muted">微信</div>
|
||||
</div>
|
||||
</div> -->
|
||||
<div></div>
|
||||
<nuxt-link class="primary" to="/account/register">注册账号</nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { loginType, client, SMSType } from '@/utils/type'
|
||||
import Cookies from 'js-cookie'
|
||||
import { mapMutations, mapActions, mapState } from 'vuex'
|
||||
import CountDown from '@/components/count-down'
|
||||
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
|
||||
layout: 'main',
|
||||
|
||||
components: {
|
||||
CountDown,
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
// 选择电话类型
|
||||
selectNumberType: '中国+86',
|
||||
// 账号
|
||||
account: '',
|
||||
// 密码
|
||||
password: '',
|
||||
// 电话号码
|
||||
telephone: '',
|
||||
// 图形验证码
|
||||
verifyCode: '',
|
||||
// 短信验证码
|
||||
smsCode: '',
|
||||
isRemember: true,
|
||||
// 短信登陆或账号登陆 0 ==》 短信 1 ==》账号
|
||||
loginStatus: loginType.SMS,
|
||||
canSend: true,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState(['config']),
|
||||
},
|
||||
methods: {
|
||||
...mapMutations(['setToken']),
|
||||
...mapActions(['getPublicData']),
|
||||
|
||||
changeLoginType(type) {
|
||||
this.loginStatus = type
|
||||
this.telephone = ''
|
||||
this.verifyCode = ''
|
||||
this.smsCode = ''
|
||||
let jsonPaser = JSON.parse(localStorage.getItem('ACCOUNT'))
|
||||
let telJson = JSON.parse(localStorage.getItem('TEL'))
|
||||
if (jsonPaser && jsonPaser.account) {
|
||||
this.account = jsonPaser.account
|
||||
}
|
||||
if (telJson && telJson.telephone) {
|
||||
this.telephone = telJson.telephone
|
||||
}
|
||||
},
|
||||
|
||||
// 前往微信登录
|
||||
goWechatLogin() {
|
||||
this.$get('account/scanCode')
|
||||
.then(({ code, msg, data }) => {
|
||||
if (code !== 1) throw new Error(msg)
|
||||
window.open(data.url, '_self')
|
||||
})
|
||||
.catch((err) => {
|
||||
this.$message.error(err.message)
|
||||
})
|
||||
},
|
||||
|
||||
// 微信授权登录处理
|
||||
handleWechatLogin(params) {
|
||||
this.$post('account/scanLogin', params)
|
||||
.then(({ code, msg, data }) => {
|
||||
if (code !== 1) throw new Error(msg)
|
||||
|
||||
Cookies.set('token', data.token, { expires: 60 })
|
||||
this.setToken(data.token)
|
||||
this.$router.replace({
|
||||
path: Cookies.get('back_url') || '/',
|
||||
})
|
||||
Cookies.remove('back_url')
|
||||
this.getPublicData()
|
||||
})
|
||||
.catch((err) => {
|
||||
this.$message.error(err.message)
|
||||
})
|
||||
},
|
||||
|
||||
async sendSMSCode() {
|
||||
if (!this.canSend) {
|
||||
return
|
||||
}
|
||||
let res = await this.$post('sms/send', {
|
||||
mobile: this.telephone,
|
||||
key: SMSType.LOGIN,
|
||||
client,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success',
|
||||
})
|
||||
this.canSend = false
|
||||
}
|
||||
},
|
||||
|
||||
async smsLogin() {
|
||||
let res = await this.$post('account/smsLogin', {
|
||||
mobile: this.telephone,
|
||||
code: this.smsCode,
|
||||
client,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
const token = res.data.token
|
||||
Cookies.set('token', token, { expires: 60 })
|
||||
this.setToken(token)
|
||||
this.$router.replace({
|
||||
path: Cookies.get('back_url') || '/',
|
||||
})
|
||||
Cookies.remove('back_url')
|
||||
this.getPublicData()
|
||||
if (this.isRemember) {
|
||||
localStorage.setItem(
|
||||
'TEL',
|
||||
JSON.stringify({
|
||||
telephone: this.telephone,
|
||||
})
|
||||
)
|
||||
} else {
|
||||
localStorage.setItem(
|
||||
'TEL',
|
||||
JSON.stringify({
|
||||
telephone: '',
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async accountLogin() {
|
||||
let res = await this.$post('account/login', {
|
||||
mobile: this.account,
|
||||
password: this.password,
|
||||
client,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
const token = res.data.token
|
||||
Cookies.set('token', token, { expires: 60 })
|
||||
this.setToken(token)
|
||||
this.$router.replace({
|
||||
path: Cookies.get('back_url') || '/',
|
||||
})
|
||||
Cookies.remove('back_url')
|
||||
this.getPublicData()
|
||||
if (this.isRemember) {
|
||||
localStorage.setItem(
|
||||
'ACCOUNT',
|
||||
JSON.stringify({
|
||||
account: this.account,
|
||||
})
|
||||
)
|
||||
} else {
|
||||
localStorage.setItem(
|
||||
'ACCOUNT',
|
||||
JSON.stringify({
|
||||
account: '',
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
created() {
|
||||
|
||||
try {
|
||||
// 获取URL Query参数
|
||||
const query = this.$route.query
|
||||
|
||||
// 如果存在code和state值,即为微信扫码授权后重定向至此
|
||||
query.code &&
|
||||
query.state &&
|
||||
this.handleWechatLogin({ code: query.code, state: query.state })
|
||||
|
||||
// 获取缓存数据
|
||||
const jsonPaser = JSON.parse(localStorage.getItem('ACCOUNT')) ?? {}
|
||||
const telJson = JSON.parse(localStorage.getItem('TEL')) ?? {}
|
||||
// 利用缓存数据初始化表单值
|
||||
this.account = jsonPaser?.account ?? ''
|
||||
this.telephone = telJson?.telephone ?? ''
|
||||
} catch (error) {
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.login {
|
||||
flex: 1;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 50%;
|
||||
min-width: 1180px;
|
||||
.login-container {
|
||||
margin: 0 auto;
|
||||
width: 1180px;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
.login-banner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 750px;
|
||||
margin-right: 30px;
|
||||
height: 440px;
|
||||
overflow: hidden;
|
||||
animation: loadimg 2s infinite;
|
||||
transition: background-color 2s;
|
||||
}
|
||||
|
||||
@keyframes loadimg {
|
||||
0% {
|
||||
background-color: #e4e4e4;
|
||||
}
|
||||
50% {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
100% {
|
||||
background-color: #e4e4e4;
|
||||
}
|
||||
}
|
||||
|
||||
.login-float-form-wrap {
|
||||
width: 400px;
|
||||
height: 440px;
|
||||
.login-box {
|
||||
background-color: white;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
.login-header-box {
|
||||
padding-top: 20px;
|
||||
.header-tabs {
|
||||
.header-tab {
|
||||
width: 160px;
|
||||
height: 35px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.active-tab {
|
||||
color: $--color-primary;
|
||||
text-align: center;
|
||||
&::after {
|
||||
content: "";
|
||||
height: 2px;
|
||||
width: 72px;
|
||||
margin-top: 8px;
|
||||
background-color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
.login-form-box {
|
||||
padding: 0 30px;
|
||||
.login-form-item {
|
||||
margin-top: 24px;
|
||||
.input-phone-num {
|
||||
width: 340px;
|
||||
}
|
||||
.verify-code-img {
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
margin-left: 20px;
|
||||
background-color: red;
|
||||
}
|
||||
.sms-btn {
|
||||
margin-left: 20px;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.option-box {
|
||||
padding: 0 30px;
|
||||
margin-top: 60px;
|
||||
::v-deep .el-checkbox {
|
||||
color: #888;
|
||||
}
|
||||
}
|
||||
}
|
||||
.login-footer-box {
|
||||
height: 50px;
|
||||
padding: 15px;
|
||||
|
||||
.login__other-item {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.login__weixin-icon {
|
||||
width: 1.5em;
|
||||
height: 1.5em;
|
||||
text-align: center;
|
||||
line-height: 1.5em;
|
||||
border-radius: 50%;
|
||||
background-color: #0abd5d;
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,212 +0,0 @@
|
|||
<template>
|
||||
<div class="register-container flex-col row-center col-center">
|
||||
<div class="register-box flex-col col-center bg-white">
|
||||
<div class="register-title">注册账号</div>
|
||||
<el-form class="form-box flex-col">
|
||||
<div class="register-form-item">
|
||||
<el-input
|
||||
class="form-input"
|
||||
v-model="telephone"
|
||||
placeholder="请输入手机号码"
|
||||
>
|
||||
<i
|
||||
class="el-icon-user"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="register-form-item flex" v-if="registerSetting">
|
||||
<el-input
|
||||
v-model="smsCode"
|
||||
class="form-input"
|
||||
placeholder="短信验证码"
|
||||
style="width: 264px"
|
||||
>
|
||||
<i
|
||||
class="el-icon-lock"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
<el-button class="sms-btn" @click="sendSMSCode">
|
||||
<div v-if="canSend">获取验证码</div>
|
||||
<count-down
|
||||
v-else
|
||||
:time="60"
|
||||
format="ss秒"
|
||||
autoStart
|
||||
@finish="canSend = true"
|
||||
/>
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="register-form-item">
|
||||
<el-input
|
||||
v-model="password"
|
||||
placeholder="请输入密码 (数字与字母自由组合)"
|
||||
show-password
|
||||
>
|
||||
<i
|
||||
class="el-icon-more-outline"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="register-form-item">
|
||||
<el-input
|
||||
v-model="againPwd"
|
||||
placeholder="再次输入密码"
|
||||
show-password
|
||||
>
|
||||
<i
|
||||
class="el-icon-key"
|
||||
style="font-size: 18px"
|
||||
slot="prepend"
|
||||
/>
|
||||
</el-input>
|
||||
</div>
|
||||
<div class="flex row-between" style="margin-top: 36px">
|
||||
<nuxt-link to="/account/login">已有账号,去登录</nuxt-link>
|
||||
</div>
|
||||
<div class="m-t-20 flex-col">
|
||||
<el-button type="primary" @click="registerFun"
|
||||
>立即注册</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { client, SMSType } from '@/utils/type'
|
||||
import CountDown from '@/components/count-down'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
layout: 'main',
|
||||
components: {
|
||||
CountDown,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
telephone: '',
|
||||
smsCode: '',
|
||||
password: '',
|
||||
againPwd: '',
|
||||
canSend: true,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
registerSetting() {
|
||||
return this.$store.state.config.register_setting
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async sendSMSCode() {
|
||||
if (!this.canSend) {
|
||||
return
|
||||
}
|
||||
let res = await this.$post('sms/send', {
|
||||
mobile: this.telephone,
|
||||
key: SMSType.REGISTER,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success',
|
||||
})
|
||||
this.canSend = false
|
||||
}
|
||||
},
|
||||
async registerFun() {
|
||||
if (!this.telephone) {
|
||||
this.$message({
|
||||
message: '请输入手机号',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
if (this.registerSetting && !this.smsCode) {
|
||||
this.$message({
|
||||
message: '请输入短信验证码',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
if (!this.password) {
|
||||
this.$message({
|
||||
message: '请输入密码',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
if (this.password != this.againPwd) {
|
||||
this.$message({
|
||||
message: '两次密码输入不一致',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
let res = await this.$post('account/register', {
|
||||
mobile: this.telephone,
|
||||
password: this.password,
|
||||
code: this.smsCode,
|
||||
client: client,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: '注册成功',
|
||||
type: 'success',
|
||||
})
|
||||
this.$router.replace('/account/login')
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.register-container {
|
||||
flex: 1;
|
||||
.register-box {
|
||||
padding-top: 40px;
|
||||
padding-bottom: 55px;
|
||||
width: 880px;
|
||||
border: 1px solid #e5e5e5;
|
||||
.register-title {
|
||||
font-size: 24px;
|
||||
}
|
||||
.form-box {
|
||||
.register-form-item {
|
||||
margin-top: 24px;
|
||||
.form-input {
|
||||
width: 400px;
|
||||
}
|
||||
.verify-code-img {
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
margin-left: 26px;
|
||||
background-color: red;
|
||||
}
|
||||
.sms-btn {
|
||||
margin-left: 16px;
|
||||
height: 40px;
|
||||
width: 120px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,437 +0,0 @@
|
|||
<template>
|
||||
<div class="category">
|
||||
<div class="category-hd bg-white">
|
||||
<div class="category-wrap">
|
||||
<div class="category-con flex">
|
||||
<div class="name muted">一级分类:</div>
|
||||
<div class="category-list flex flex-wrap lighter">
|
||||
<div
|
||||
:class="[
|
||||
'item line1',
|
||||
{ active: oneIndex == index },
|
||||
]"
|
||||
v-for="(item, index) in categoryOne"
|
||||
:key="index"
|
||||
@click="changeData(item.id)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="category-con flex">
|
||||
<div class="name muted">二级分类:</div>
|
||||
<div class="category-list flex flex-wrap lighter">
|
||||
<div
|
||||
:class="['item line1', { active: twoIndex === '' }]"
|
||||
@click="clickAllTwo"
|
||||
>
|
||||
全部
|
||||
</div>
|
||||
<div
|
||||
:class="[
|
||||
'item line1',
|
||||
{ active: twoIndex === index },
|
||||
]"
|
||||
v-for="(item, index) in categoryTwo"
|
||||
:key="index"
|
||||
@click="changeData(item.id)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="category-con flex">
|
||||
<div class="name muted">三级分类:</div>
|
||||
<div class="category-list flex flex-wrap lighter">
|
||||
<div
|
||||
:class="[
|
||||
'item line1',
|
||||
{ active: threeIndex === '' },
|
||||
]"
|
||||
@click="clickAll"
|
||||
>
|
||||
全部
|
||||
</div>
|
||||
<div
|
||||
:class="[
|
||||
'item line1',
|
||||
{ active: threeIndex === index },
|
||||
]"
|
||||
v-for="(item, index) in categoryThree"
|
||||
:key="index"
|
||||
@click="changeData(item.id)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sort flex bg-white">
|
||||
<div class="title muted">排序方式:</div>
|
||||
<div class="sort-name m-l-16 flex lighter">
|
||||
<div
|
||||
:class="['item', { active: sortType == '' }]"
|
||||
@click="changeSortType('')"
|
||||
>
|
||||
综合
|
||||
</div>
|
||||
<div
|
||||
:class="['item', { active: sortType == 'price' }]"
|
||||
@click="changeSortType('price')"
|
||||
>
|
||||
价格
|
||||
<i
|
||||
v-show="priceSort == 'desc'"
|
||||
class="el-icon-arrow-down"
|
||||
></i>
|
||||
<i
|
||||
v-show="priceSort == 'asc'"
|
||||
class="el-icon-arrow-up"
|
||||
></i>
|
||||
</div>
|
||||
<div
|
||||
:class="['item', { active: sortType == 'sales_sum' }]"
|
||||
@click="changeSortType('sales_sum')"
|
||||
>
|
||||
销量
|
||||
<i
|
||||
v-show="saleSort == 'desc'"
|
||||
class="el-icon-arrow-down"
|
||||
></i>
|
||||
<i
|
||||
v-show="saleSort == 'asc'"
|
||||
class="el-icon-arrow-up"
|
||||
></i>
|
||||
</div>
|
||||
|
||||
|
||||
<div
|
||||
:class="['item', { active: sortType == 'brand' && brandList.length}]"
|
||||
@click="changeSortType('brand')"
|
||||
>
|
||||
品牌
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 品牌 -->
|
||||
<div class="sort flex bg-white" v-show="sortType == 'brand' && brandList.length > 0">
|
||||
<div class="category-con flex" style="padding-top: 0;">
|
||||
<div class="name muted">品牌:</div>
|
||||
<div class="category-list flex flex-wrap lighter">
|
||||
<div
|
||||
:class="['item', { active: brandIndex == index }]"
|
||||
@click="getBrandGoods(index)" v-for="(item,index) in brandList" :key="index"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div v-if="isHasGoods" class="goods-list">
|
||||
<goods-list :list="goodsList" />
|
||||
<div
|
||||
class="pagination flex row-center"
|
||||
style="padding-bottom: 38px"
|
||||
v-if="count"
|
||||
>
|
||||
<el-pagination
|
||||
background
|
||||
hide-on-single-page
|
||||
layout="prev, pager, next"
|
||||
:total="count"
|
||||
prev-text="上一页"
|
||||
next-text="下一页"
|
||||
:page-size="20"
|
||||
@current-change="changePage"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
<null-data
|
||||
v-else
|
||||
:img="require('@/static/images/goods_null.png')"
|
||||
text="暂无商品~"
|
||||
></null-data>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { trottle } from '~/utils/tools'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
watchQuery: true,
|
||||
async asyncData({ query, $get }) {
|
||||
let { data } = await $get('pc/category')
|
||||
return {
|
||||
categoryList: data,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
count: 0,
|
||||
oneIndex: 0,
|
||||
twoIndex: '',
|
||||
threeIndex: '',
|
||||
brandIndex:-1,
|
||||
categoryOne: [],
|
||||
categoryTwo: [],
|
||||
categoryThree: [],
|
||||
sortType: '',
|
||||
saleSort: 'desc',
|
||||
priceSort: 'desc',
|
||||
brandSort:'desc',
|
||||
page: '',
|
||||
goodsList: [],
|
||||
cateId: 0,
|
||||
isHasGoods: true,
|
||||
brandList:[],//品牌列表
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.changeSortType = trottle(this.changeSortType, 500, this)
|
||||
},
|
||||
methods: {
|
||||
changeData(id) {
|
||||
const { categoryList } = this
|
||||
this.setIndex(id)
|
||||
this.categoryOne = categoryList
|
||||
this.categoryTwo = categoryList[this.oneIndex]
|
||||
? categoryList[this.oneIndex].sons
|
||||
: []
|
||||
|
||||
this.categoryThree = this.categoryTwo[this.twoIndex]
|
||||
? this.categoryTwo[this.twoIndex].sons
|
||||
: []
|
||||
|
||||
this.setCateId(id);
|
||||
this.getGoods();
|
||||
this.brandIndex = '-1';
|
||||
this.sortType = '';
|
||||
this.brandList = [];
|
||||
},
|
||||
setCateId(id) {
|
||||
if (
|
||||
this.twoIndex == '' &&
|
||||
this.threeIndex == '' &&
|
||||
this.oneIndex !== ''
|
||||
) {
|
||||
this.cateId = this.categoryOne[this.oneIndex].id
|
||||
}
|
||||
if (this.threeIndex == '' && this.twoIndex !== '') {
|
||||
this.cateId = this.categoryTwo[this.twoIndex].id
|
||||
}
|
||||
if (id) {
|
||||
this.cateId = id
|
||||
}
|
||||
},
|
||||
setIndex(id) {
|
||||
const { categoryList } = this
|
||||
categoryList.some((oitem, oindex) => {
|
||||
if (oitem.id === id) {
|
||||
this.oneIndex = oindex
|
||||
this.twoIndex = ''
|
||||
this.threeIndex = ''
|
||||
return true
|
||||
}
|
||||
return (
|
||||
oitem.sons &&
|
||||
oitem.sons.some((witem, windex) => {
|
||||
if (witem.id === id) {
|
||||
this.oneIndex = oindex
|
||||
this.twoIndex = windex
|
||||
this.threeIndex = ''
|
||||
return true
|
||||
}
|
||||
return (
|
||||
witem.sons &&
|
||||
witem.sons.some((titem, tindex) => {
|
||||
if (titem.id === id) {
|
||||
this.oneIndex = oindex
|
||||
this.twoIndex = windex
|
||||
this.threeIndex = tindex
|
||||
return true
|
||||
}
|
||||
})
|
||||
)
|
||||
})
|
||||
)
|
||||
})
|
||||
},
|
||||
clickAllTwo() {
|
||||
this.twoIndex = ''
|
||||
this.threeIndex = ''
|
||||
this.changeData()
|
||||
},
|
||||
clickAll() {
|
||||
this.threeIndex = ''
|
||||
this.changeData()
|
||||
},
|
||||
changeSortType(type) {
|
||||
this.sortType = type
|
||||
switch (type) {
|
||||
case 'price':
|
||||
if (this.priceSort == 'asc') {
|
||||
this.priceSort = 'desc'
|
||||
} else if (this.priceSort == 'desc') {
|
||||
this.priceSort = 'asc'
|
||||
}
|
||||
break
|
||||
case 'sales_sum':
|
||||
if (this.saleSort == 'asc') {
|
||||
this.saleSort = 'desc'
|
||||
} else if (this.saleSort == 'desc') {
|
||||
this.saleSort = 'asc'
|
||||
}
|
||||
break
|
||||
case 'brand':
|
||||
if (this.brandSort == 'asc') {
|
||||
this.brandSort = 'desc'
|
||||
} else if (this.brandSort == 'desc') {
|
||||
this.brandSort = 'asc'
|
||||
}
|
||||
break
|
||||
default:
|
||||
}
|
||||
if(this.sortType == 'brand') {
|
||||
this.getBrand() //获取品牌
|
||||
}else {
|
||||
this.getGoods()
|
||||
}
|
||||
|
||||
},
|
||||
changePage(current) {
|
||||
this.page = current
|
||||
this.getGoods()
|
||||
},
|
||||
async getGoods() {
|
||||
const { priceSort, sortType, saleSort } = this
|
||||
const params = {
|
||||
page_size: 20,
|
||||
page_no: this.page,
|
||||
platform_cate_id: this.cateId,
|
||||
}
|
||||
switch (sortType) {
|
||||
case 'price':
|
||||
params.sort_by_price = priceSort
|
||||
break
|
||||
case 'sales_sum':
|
||||
params.sort_by_sales = saleSort
|
||||
break
|
||||
}
|
||||
if(this.brandIndex >= 0) {
|
||||
params.brand_id = this.brandList[this.brandIndex].brand_id;
|
||||
}
|
||||
const {
|
||||
data: { lists, count },
|
||||
} = await this.$get('goods/getGoodsList', {
|
||||
params,
|
||||
})
|
||||
this.goodsList = lists
|
||||
if (!lists.length) {
|
||||
this.isHasGoods = false
|
||||
} else {
|
||||
this.isHasGoods = true
|
||||
}
|
||||
this.count = count
|
||||
},
|
||||
// 获取品牌
|
||||
async getBrand() {
|
||||
const params = {
|
||||
page_size: 20,
|
||||
page_no: this.page,
|
||||
cate_id: this.cateId,
|
||||
}
|
||||
|
||||
const {
|
||||
data
|
||||
} = await this.$get('goods/getBrandListByCateId', {
|
||||
params,
|
||||
})
|
||||
this.brandList = data
|
||||
},
|
||||
|
||||
// 获取品牌商品列表
|
||||
getBrandGoods(index) {
|
||||
this.brandIndex = index;
|
||||
this.getGoods();
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
categoryList: {
|
||||
immediate: true,
|
||||
handler(value) {
|
||||
const { id } = this.$route.query
|
||||
this.changeData(Number(id))
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.category {
|
||||
padding: 16px 0;
|
||||
.category-hd {
|
||||
.category-wrap {
|
||||
padding: 0 16px;
|
||||
}
|
||||
.category-con {
|
||||
border-bottom: 1px dashed #e5e5e5;
|
||||
align-items: flex-start;
|
||||
padding-top: 16px;
|
||||
word-wrap: break-word;
|
||||
.name {
|
||||
flex: none;
|
||||
}
|
||||
.item {
|
||||
margin-bottom: 16px;
|
||||
width: 140px;
|
||||
margin-left: 14px;
|
||||
cursor: pointer;
|
||||
&.active {
|
||||
color: $--color-primary;
|
||||
}
|
||||
&:hover {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
.sort {
|
||||
padding: 15px 16px;
|
||||
.sort-name {
|
||||
.item {
|
||||
margin-right: 30px;
|
||||
cursor: pointer;
|
||||
&.active {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.brand-list {
|
||||
border-top: 1px dashed #e5e5e5;
|
||||
}
|
||||
}
|
||||
|
||||
.goods-list {
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
|
@ -1,486 +0,0 @@
|
|||
<template>
|
||||
<div class="confirm-order">
|
||||
<!-- 配送方式 -->
|
||||
<div class="order-hd bg-white m-b-16">
|
||||
<!-- 快递配送 -->
|
||||
<div>
|
||||
<div class="title lg">收货地址</div>
|
||||
<div class="address flex row-between">
|
||||
<div class="address-con" v-show="address.contact">
|
||||
<div>
|
||||
<span class="weight-500">{{ address.contact }}</span>
|
||||
{{ address.telephone }}
|
||||
<el-tag size="mini" type="warning" effect="dark" v-if="address.is_default">默认</el-tag>
|
||||
</div>
|
||||
<div class="lighter m-t-8">
|
||||
{{ address.province }} {{ address.city }}
|
||||
{{ address.district }}
|
||||
{{ address.address }}
|
||||
</div>
|
||||
<div class="oprate primary flex">
|
||||
<div class="m-r-16" @click="editAddress(address.id)">
|
||||
修改
|
||||
</div>
|
||||
<div @click="showAddress = true">更换地址</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="address-add flex row-center" @click="editAddress('')">
|
||||
+ 添加地址
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="order-con bg-white">
|
||||
<div class="goods m-b-16">
|
||||
<div class="title lg">商品明细</div>
|
||||
<div class="goods-hd flex lighter">
|
||||
<div class="info text-center">商品信息</div>
|
||||
<div class="price text-center">商品价格</div>
|
||||
<div class="num text-center">数量</div>
|
||||
<div class="money text-center">合计</div>
|
||||
</div>
|
||||
<div class="shop">
|
||||
<div class="shop-item flex-col flex-1" v-for="(item, index) in orderInfo.shop" :key="index">
|
||||
<div class="shop-name p-l-10 m-b-10 flex flex-1" style="width: 1140px;">
|
||||
{{ item.shop_name }}
|
||||
</div>
|
||||
<div class="goods-list flex flex-wrap flex-1" style="width: 1140px;">
|
||||
<div :class="['flex', 'item']" v-for="(gitem, gindex) in item.goods" :key="gindex">
|
||||
<div class="info flex">
|
||||
<div class="pictrue flex-none">
|
||||
<el-image :src="gitem.image"></el-image>
|
||||
</div>
|
||||
<div>
|
||||
<div class="name line-2">
|
||||
{{ gitem.name }}
|
||||
</div>
|
||||
<div class="muted m-t-10 xs">
|
||||
{{ gitem.spec_value }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="price" style="padding-left: 70px;">
|
||||
<price-formate :price="gitem.price" />
|
||||
<div class="flex m-t-6" v-if="gitem.member_amount">
|
||||
<span class="xs primary">会员价:</span>
|
||||
<price-formate :price="gitem.member_amount" color="#FF0808" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="num text-center">
|
||||
{{ gitem.num }}
|
||||
</div>
|
||||
<div class="money flex row-center">
|
||||
<price-formate :price="gitem.sum_price" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-1 col-top m-t-20 row-between" style="width: 1140px;">
|
||||
<div class="flex flex-1">
|
||||
<div class="remark flex flex-1 m-r-40">
|
||||
<div style="width: 70px;">买家备注:</div>
|
||||
<div class="textarea" style="width: 280px">
|
||||
<el-input size="small" v-model="userRemark[index].remark"
|
||||
placeholder="选填,给商家备注留言,100字以内" resize="none">
|
||||
</el-input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="coupon flex flex-1 m-r-10" v-if="orderInfo.order_type == 0">
|
||||
<div>店铺优惠:</div>
|
||||
<el-select size="small" v-model="selecteCoupon[index]" placeholder="请选择"
|
||||
@change="orderBuy">
|
||||
<el-option label="不使用" :value="0">
|
||||
</el-option>
|
||||
<el-option v-for="item in item.coupon_list" :key="item.value"
|
||||
:label="item.coupon_name" :value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="remark flex flex-1">
|
||||
<div>配送方式:</div>
|
||||
<span>{{ item.delivery_type_text }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-col">
|
||||
<div class="flex coupon m-b-10 flex-1 row-right" v-if="item.discount_amount">
|
||||
<div>优惠:</div>
|
||||
<div>-¥{{ item.discount_amount }}</div>
|
||||
</div>
|
||||
<div class="flex remark m-b-10 flex-1 row-right">
|
||||
<div>运费:</div>
|
||||
<div>¥{{ item.shipping_price }}</div>
|
||||
</div>
|
||||
|
||||
<div class="flex m-b-10 flex-1 row-right">
|
||||
<span class="m-r-10">店铺合计</span>
|
||||
<price-formate color="#FF2C3C" :price="item.total_amount" :firstSize="17"
|
||||
:subscriptSize="12" :secondSize="12" />
|
||||
</div>
|
||||
<div class="flex m-b-20 flex-1 row-right">
|
||||
<a target="_blank" :href="download_contract.domain + '/' + download_contract.path"><el-button type="success" icon="el-icon-download">点击下载合同</el-button></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="order-footer flex bg-white" style="justify-content: space-between;">
|
||||
<div class="front flex">
|
||||
<span>开启订单前置:</span>
|
||||
<el-switch v-model="front" @change="front_change"></el-switch>
|
||||
</div>
|
||||
<div class="flex col-center">
|
||||
<div class="money flex m-r-16">
|
||||
<div class="lighter">实付金额:</div>
|
||||
<div class="primary" style="font-size: 20px">
|
||||
<span class="xxs">¥</span>{{ orderInfo.total_amount }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="white bg-primary lg btn flex row-center" @click="submitOrder">
|
||||
去结算
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<address-add v-model="showAddressAdd" :aid="editId" @success="orderBuy" />
|
||||
<address-list v-model="showAddress" @confirm="changeAddress" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapActions } from 'vuex'
|
||||
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
|
||||
async asyncData({ query, $post, $get }) {
|
||||
let { goods, carts } = JSON.parse(decodeURIComponent(query.data))
|
||||
carts = carts || []
|
||||
const asyncData = {}
|
||||
await $post('order/settlement', {
|
||||
goods: JSON.stringify(goods),
|
||||
cart_id: carts.join(),
|
||||
}).then(({ code, data, msg }) => {
|
||||
if (code == 1) {
|
||||
asyncData.orderInfo = data
|
||||
asyncData.address = data?.address
|
||||
asyncData.userRemark = data.shop.map((item) => ({
|
||||
shop_id: item.shop_id,
|
||||
remark: '',
|
||||
}))
|
||||
asyncData.selecteCoupon = data.shop.map(() => '')
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
await $post('order/contractDownload', {}).then(({ code, data, msg }) => {
|
||||
if (code == 1) {
|
||||
asyncData.download_contract = data;
|
||||
}
|
||||
})
|
||||
return asyncData
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
orderInfo: {},
|
||||
address: {},
|
||||
carts: [],
|
||||
active: 0,
|
||||
userRemark: [],
|
||||
selecteCoupon: [],
|
||||
showAddress: false,
|
||||
showAddressAdd: false,
|
||||
addressId: '',
|
||||
editId: '',
|
||||
isEdit: false,
|
||||
shopPage: 1,
|
||||
front:false,
|
||||
is_frontend:0,
|
||||
download_contract:{} //下载合同地址
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
address: {
|
||||
handler(val) {
|
||||
this.addressId = val.id
|
||||
},
|
||||
immediate: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['getPublicData']),
|
||||
|
||||
editAddress(id) {
|
||||
this.editId = id
|
||||
this.showAddressAdd = true
|
||||
},
|
||||
|
||||
changeAddress(val) {
|
||||
this.addressId = val
|
||||
this.orderBuy()
|
||||
},
|
||||
|
||||
front_change(e) {
|
||||
if(e) {
|
||||
this.is_frontend = 1
|
||||
}else {
|
||||
this.is_frontend = 0
|
||||
}
|
||||
},
|
||||
async submitOrder() {
|
||||
const { carts, goods, selecteCoupon } = this
|
||||
const { orderInfo: { shop } } = this
|
||||
const delivery_type = shop[0]?.delivery_type
|
||||
const submitObj = {
|
||||
goods: JSON.stringify(goods),
|
||||
address_id: this.addressId,
|
||||
is_frontend:this.is_frontend,
|
||||
cart_id: carts.join(),
|
||||
coupon_id: selecteCoupon.filter((item) => item),
|
||||
delivery_type,
|
||||
remark: this.userRemark.length
|
||||
? JSON.stringify(this.userRemark)
|
||||
: '',
|
||||
}
|
||||
const { data, code } = await this.$post(
|
||||
'order/submit_order',
|
||||
submitObj
|
||||
)
|
||||
if (code == 1) {
|
||||
if(this.is_frontend == 1) {
|
||||
this.$router.replace({
|
||||
path: '/user/order',
|
||||
query: {
|
||||
is_frontend: this.is_frontend
|
||||
},
|
||||
})
|
||||
}else {
|
||||
this.getPublicData()
|
||||
this.$router.replace({
|
||||
path: '/payment',
|
||||
query: {
|
||||
id: data.trade_id,
|
||||
from: data.type,
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async orderBuy() {
|
||||
console.log(this.selecteCoupon)
|
||||
const { data, code } = await this.$post('order/settlement', {
|
||||
goods: JSON.stringify(this.goods),
|
||||
address_id: this.addressId,
|
||||
cart_id: this.carts.join(),
|
||||
coupon_id: this.selecteCoupon.filter((item) => item),
|
||||
})
|
||||
|
||||
if (code == 1) {
|
||||
let { address } = data
|
||||
this.orderInfo = data
|
||||
this.address = address
|
||||
}
|
||||
},
|
||||
},
|
||||
created() {
|
||||
const { goods, type, carts } = JSON.parse(
|
||||
decodeURIComponent(this.$route.query.data)
|
||||
)
|
||||
|
||||
this.goods = goods
|
||||
this.type = type
|
||||
this.carts = carts || []
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.confirm-order {
|
||||
padding: 16px 0;
|
||||
|
||||
.title {
|
||||
padding: 12px 20px;
|
||||
font-weight: bold;
|
||||
|
||||
>i {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.contact {
|
||||
padding: 10px 20px 22px;
|
||||
|
||||
&-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 36px;
|
||||
|
||||
&-label {
|
||||
width: 72px;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.order-hd {
|
||||
.address {
|
||||
padding: 10px 20px 22px;
|
||||
|
||||
.address-con {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
padding: 16px 20px;
|
||||
width: 800px;
|
||||
height: 100px;
|
||||
padding-right: 150px;
|
||||
border: 1px solid $--color-primary;
|
||||
border-radius: 2px;
|
||||
|
||||
&:hover {
|
||||
.oprate {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
.oprate {
|
||||
display: none;
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 9px;
|
||||
}
|
||||
}
|
||||
|
||||
.address-add {
|
||||
cursor: pointer;
|
||||
width: 320px;
|
||||
height: 100px;
|
||||
border: 1px dashed $--border-color-base;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.order-con {
|
||||
.shop {
|
||||
padding: 0 20px;
|
||||
|
||||
.shop-name {
|
||||
height: 40px;
|
||||
background-color: #f6f6f6;
|
||||
line-height: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
.goods {
|
||||
border-bottom: 1px dashed $--border-color-base;
|
||||
|
||||
.goods-hd {
|
||||
height: 40px;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.goods-list {
|
||||
.item {
|
||||
padding: 10px 0;
|
||||
|
||||
&-disabled {
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
z-index: 9;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
height: 100%;
|
||||
display: block;
|
||||
content: '';
|
||||
background-color: rgba($color: #ffffff,
|
||||
$alpha: 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.info {
|
||||
width: 500px;
|
||||
|
||||
.pictrue {
|
||||
margin-right: 10px;
|
||||
|
||||
.el-image {
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
}
|
||||
}
|
||||
|
||||
.name {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.delivery-support {
|
||||
font-size: 12px;
|
||||
padding: 4px 15px;
|
||||
border-radius: 60px;
|
||||
margin-left: 20px;
|
||||
background-color: #f4f4f4;
|
||||
color: #666666;
|
||||
}
|
||||
}
|
||||
|
||||
.price {
|
||||
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.num {
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
.money {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.input {
|
||||
.textarea {
|
||||
margin: 0 20px;
|
||||
width: 1000px;
|
||||
}
|
||||
}
|
||||
|
||||
.integral {
|
||||
.check-box {
|
||||
padding: 0 20px 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.order-footer {
|
||||
margin-top: 2px;
|
||||
padding: 25px 20px;
|
||||
justify-content: flex-end;
|
||||
|
||||
.btn {
|
||||
width: 152px;
|
||||
height: 44px;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,255 +0,0 @@
|
|||
<template>
|
||||
<div class="news-details-container mt16">
|
||||
<div class="nav-container flex">
|
||||
<div class="nr" style="width: 70px">当前位置:</div>
|
||||
<el-breadcrumb style="flex: 1;" separator="/" class="flex">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>
|
||||
<nuxt-link to="/demand_list">我的需求</nuxt-link>
|
||||
</el-breadcrumb-item>
|
||||
<el-breadcrumb-item class="line1 demand-title">{{detailsObj.name}}</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div class="news-detail-box m-r-16">
|
||||
<div class="content-header bg-white">
|
||||
<div class="news-detail-title">
|
||||
{{detailsObj.name}}
|
||||
</div>
|
||||
<div class="sign"><el-button type="primary" icon="el-icon-s-promotion" @click="dialogFormVisible = true">立即报名</el-button></div>
|
||||
<div class="flex">
|
||||
<div class="sm muted">
|
||||
发布时间:{{detailsObj.create_time}}
|
||||
</div>
|
||||
<div class="flex" style="margin-left: 40px">
|
||||
<i class="el-icon-s-promotion muted"></i>
|
||||
<div class="muted" style="margin-left: 3px;">已报名<span style="margin:0 5px;color: #f00;">{{detailsObj.reports_count}}</span>人</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-html-box bg-white">
|
||||
<div v-html="detailsObj.content"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 填写表单 -->
|
||||
<el-dialog title="立即报名" :visible.sync="dialogFormVisible">
|
||||
<el-form :model="form" :rules="rules" ref="form">
|
||||
<el-form-item label="姓名" prop="name" :label-width="formLabelWidth">
|
||||
<el-input v-model="form.name" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone" :label-width="formLabelWidth">
|
||||
<el-input v-model="form.phone" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司名称" prop="company" :label-width="formLabelWidth">
|
||||
<el-input v-model="form.company" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="报价" prop="price" :label-width="formLabelWidth">
|
||||
<el-input v-model="form.price" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="其他" :label-width="formLabelWidth">
|
||||
<el-input type="textarea" v-model="form.remarks" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="submitForm('form')">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
$post,
|
||||
query
|
||||
}) {
|
||||
let detailsObj = {};
|
||||
let demand_id = '';
|
||||
let recommend_list = [];
|
||||
demand_id = query.id
|
||||
let res = await $get("demand/detail", {
|
||||
params: {
|
||||
id: query.id,
|
||||
}
|
||||
});
|
||||
if (res.code == 1) {
|
||||
detailsObj = res.data;
|
||||
}
|
||||
return {
|
||||
detailsObj,
|
||||
demand_id
|
||||
};
|
||||
},
|
||||
watchQuery: ['id'],
|
||||
data() {
|
||||
return {
|
||||
demand_id:'',
|
||||
dialogFormVisible: false,
|
||||
form: {
|
||||
name: '',
|
||||
phone: '',
|
||||
company: '',
|
||||
price: '',
|
||||
remarks: '',
|
||||
},
|
||||
formLabelWidth: '120px',
|
||||
rules: {
|
||||
name: [
|
||||
{ required: true, message: '请输入姓名', trigger: 'blur' },
|
||||
],
|
||||
phone: [
|
||||
{ required: true, message: '请输入电话', trigger: 'blur' },
|
||||
],
|
||||
company: [
|
||||
{ required: true, message: '请输入公司名称', trigger: 'blur' },
|
||||
],
|
||||
price: [
|
||||
{ required: true, message: '请输入报价', trigger: 'blur' },
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log('route', this.$route)
|
||||
// this.getNewsDetails(this.$route.query.id);
|
||||
},
|
||||
methods: {
|
||||
async getNewsDetails(id) {
|
||||
let res = await this.$get("help/detail", {params: {id: id, client: 2}});
|
||||
if(res.code == 1) {
|
||||
this.detailsObj = res.data;
|
||||
}
|
||||
},
|
||||
toOther(id) {
|
||||
this.$router.push('/help_center/help_center_detail?id=' + id)
|
||||
},
|
||||
// 表单提交
|
||||
submitForm(form) {
|
||||
console.log(this.demand_id)
|
||||
this.$refs[form].validate((valid) => {
|
||||
if (valid) {
|
||||
console.log(this.form)
|
||||
let params = this.form;
|
||||
params.demand_id = this.demand_id;
|
||||
this.$post("demand/report", params).then(res=>{
|
||||
if(res.code == 1) {
|
||||
this.dialogFormVisible = false,
|
||||
this.$message({
|
||||
message: '报名成功',
|
||||
type: 'success'
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.news-details-container {
|
||||
.nav-container {
|
||||
padding: 15px 16px;
|
||||
}
|
||||
|
||||
.content-box {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.news-detail-box {
|
||||
background-color: #FFFFFF;
|
||||
width: 100%;
|
||||
|
||||
.content-header {
|
||||
margin: 0px 20px;
|
||||
padding: 20px 0px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
position: relative;
|
||||
.news-detail-title {
|
||||
color: #222;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
margin-bottom: 30px;
|
||||
max-width: 860px;
|
||||
}
|
||||
}
|
||||
|
||||
.content-html-box {
|
||||
padding: 24px 20px;
|
||||
|
||||
&>div {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
|
||||
::v-deep img {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box {
|
||||
width: 264px;
|
||||
|
||||
.recommend-box-header {
|
||||
padding: 15px 10px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.primary-line {
|
||||
margin-right: 10px;
|
||||
background-color: $--color-primary;
|
||||
width: 4px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box-content {
|
||||
.recommend-list-container {
|
||||
.recommend-list-item {
|
||||
padding: 10px;
|
||||
cursor: pointer;
|
||||
|
||||
.goods-info {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.demand-title {
|
||||
max-width: 900px;
|
||||
line-height: 30px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 1;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
|
||||
.sign {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 30px;
|
||||
}
|
||||
</style>
|
|
@ -1,207 +0,0 @@
|
|||
<template>
|
||||
<div class="help-center-container">
|
||||
<div class="help-center-box">
|
||||
<div class="article-lists-container m-l-16 bg-white" style="width: 100%;">
|
||||
<div v-show="!dataNull">
|
||||
<div>
|
||||
<nuxt-link :to="'/demand_list/demand_detail?id=' + item.id"
|
||||
class="article-item flex-col bg-white" v-for="(item) in articleList" :key="item.id">
|
||||
<div class="lg article-name line2" style="font-weight: bold;">{{item.name}}</div>
|
||||
<div class="lighter article-content" v-html="item.content"></div>
|
||||
<div class="flex row-between" style="margin-top:16px;">
|
||||
<div class="sm muted">发布时间:{{item.create_time}}</div>
|
||||
<div class="flex m-l-16">
|
||||
<i class="el-icon-s-promotion muted"></i>
|
||||
<div class="muted" style="margin-left: 3px;">已报名<span style="margin:0 5px;color: #f00;">{{item.reports_count}}</span>人</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sign"><el-button type="primary" icon="el-icon-s-promotion">查看报名</el-button></div>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
<div class="help-center-pagination row-center">
|
||||
<el-pagination background hide-on-single-page layout="prev, pager, next" :total="count"
|
||||
prev-text="上一页" next-text="下一页" :page-size="10" @current-change="changePage" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-null column-center" v-show="dataNull">
|
||||
<img style="width: 150px;height: 150px;" src="~/static/images/news_null.png" />
|
||||
<div class="xs muted">
|
||||
暂无消息记录~
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
$post
|
||||
}) {
|
||||
let currentId = 0;
|
||||
let articleList = [];
|
||||
let count = 0;
|
||||
let dataNull = true;
|
||||
let listsRes = await $get("demand/lists", {
|
||||
params: {
|
||||
page_size: 1,
|
||||
}
|
||||
});
|
||||
if (listsRes.code == 1) {
|
||||
articleList = listsRes.data.list;
|
||||
count = listsRes.data.count
|
||||
if (count <= 0) {
|
||||
dataNull = true;
|
||||
} else {
|
||||
dataNull = false
|
||||
}
|
||||
}
|
||||
return {
|
||||
articleList,
|
||||
count,
|
||||
dataNull,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
articleList: [],
|
||||
count: 0,
|
||||
swiperOptions: {
|
||||
width: 1180,
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log(this.articleList, 'articleList')
|
||||
},
|
||||
methods: {
|
||||
async changePage(current) {
|
||||
let res = await this.$get("demand/lists", {
|
||||
params: {
|
||||
cid: this.currentId,
|
||||
page_no: current,
|
||||
page_size: 10
|
||||
}
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.articleList = res.data.list;
|
||||
if (this.articleList.length <= 0) {
|
||||
dataNull = true;
|
||||
} else {
|
||||
dataNull = false
|
||||
}
|
||||
}
|
||||
},
|
||||
changeList(id) {
|
||||
this.currentId = id;
|
||||
this.changePage(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.help-center-container {
|
||||
.help-center-banner {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.help-center-box {
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.help-center-aside {
|
||||
width: 160px;
|
||||
// min-height: 635px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
padding: 20px 30px;
|
||||
|
||||
.nav {
|
||||
li {
|
||||
margin: 10px 0px;
|
||||
padding: 0px 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.active-item {
|
||||
padding-left: 27px;
|
||||
color: $--color-primary;
|
||||
border-left: 3px solid $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.article-lists-container {
|
||||
width: 1004px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
|
||||
.article-item {
|
||||
margin: 0px 20px;
|
||||
padding: 15px 0px;
|
||||
border-bottom: 1px solid #E5E5E5;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
.article-name {
|
||||
margin-bottom: 11px;
|
||||
margin-top: 13px;
|
||||
max-width: 720px;
|
||||
}
|
||||
}
|
||||
|
||||
.help-center-pagination {
|
||||
padding-top: 38px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.data-null {
|
||||
padding-top: 150px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .btn-prev {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .btn-next {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .el-pager li {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.article-content {
|
||||
min-height: 50px;
|
||||
max-height: 140px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.sign {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 30px;
|
||||
}
|
||||
</style>
|
|
@ -1,86 +0,0 @@
|
|||
<template>
|
||||
<div class="get-coupons">
|
||||
<div class="help-center-banner">
|
||||
<client-only>
|
||||
<swiper ref="mySwiper" :options="swiperOptions">
|
||||
<swiper-slide class="swiper-item" v-for="(item, index) in bannerList" :key="index">
|
||||
<ad-item :item="item"></ad-item>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
<div class="coupons bg-white">
|
||||
<div class="title weight-500">每日领券</div>
|
||||
<div class="list">
|
||||
<coupons-list v-if="couponList.length" :list="couponList" :type="3" @reflash="getCouponsList" />
|
||||
<null-data v-else :img="require('~/static/images/coupon_null.png')" text="暂无优惠券~"></null-data>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
query,
|
||||
$get
|
||||
}) {
|
||||
const {
|
||||
data
|
||||
} = await $get("coupon/getCouponList");
|
||||
console.log('datafadadaasd', data)
|
||||
|
||||
const { data: banner }= await $get("ad_content/lists", { params: { pid: 27, terminal: 2 } });
|
||||
|
||||
return {
|
||||
couponList: data.lists,
|
||||
bannerList: banner,
|
||||
};
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
swiperOptions: {
|
||||
width: 1180,
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
async getCouponsList() {
|
||||
const {
|
||||
data,
|
||||
code
|
||||
} = await this.$get("coupon/getCouponList");
|
||||
if (code == 1) {
|
||||
this.couponList = data.lists;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.get-coupons {
|
||||
padding: 16px 0;
|
||||
|
||||
.coupons {
|
||||
padding: 0 14px;
|
||||
|
||||
.title {
|
||||
padding: 16px 18px;
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,867 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="goods-details" v-if="goodsDetails.id">
|
||||
|
||||
<div class="goods-info flex col-stretch">
|
||||
<div class="goods-swiper m-r-16 bg-white flex-col" v-if="goodsImage != ''">
|
||||
<el-image class="current-img" :preview-src-list="goodsImage.map((item) => item.uri)"
|
||||
:src="goodsImage[swiperIndex].uri"></el-image>
|
||||
<client-only>
|
||||
<swiper class="swiper" ref="mySwiper" :options="swiperOptions">
|
||||
<swiper-slide :class="{
|
||||
'swiper-item': true,
|
||||
active: index === swiperIndex,
|
||||
}" v-for="(item, index) in goodsImage" :key="index">
|
||||
<div style="width: 100%; height: 100%" @mouseover="swiperIndex = index">
|
||||
<el-image style="width: 100%; height: 100%" :src="item.uri"></el-image>
|
||||
</div>
|
||||
</swiper-slide>
|
||||
<div class="swiper-button-prev" slot="button-prev"></div>
|
||||
<div class="swiper-button-next" slot="button-next"></div>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
|
||||
<!-- 右侧商品信息 -->
|
||||
<div class="info-wrap bg-white flex-1">
|
||||
<div class="name weight-500 m-b-16">
|
||||
{{ goodsDetails.name }}
|
||||
</div>
|
||||
<!-- -->
|
||||
<div class="seckill flex white" v-if="activity.type == 1">
|
||||
<div class="xxl">限时秒杀</div>
|
||||
<div class="flex">
|
||||
<div class="white m-r-16">距离结束还有</div>
|
||||
<count-down :time="countTime" :is-slot="true" @change="onChangeDate">
|
||||
<div class="flex row-center count-down xxl">
|
||||
<div class="item white">{{ timeData.hours }}</div>
|
||||
<div class="white" style="margin: 0 4px">:</div>
|
||||
<div class="item white">{{ timeData.minutes }}</div>
|
||||
<div class="white" style="margin: 0 4px">:</div>
|
||||
<div class="item white">{{ timeData.seconds }}</div>
|
||||
</div>
|
||||
</count-down>
|
||||
</div>
|
||||
</div>
|
||||
<!-- -->
|
||||
<!-- -->
|
||||
<div class="price-wrap lighter">
|
||||
<div class="flex row-between">
|
||||
<div class="price">
|
||||
<div class="flex" v-if="Number(checkedGoods.market_price || goodsDetails.market_price)">
|
||||
{{ activity.type == 1 ? '日常价' : '原价' }}
|
||||
<span class="m-l-20">
|
||||
<price-formate :price="checkedGoods.market_price || goodsDetails.market_price" :weight="400" />
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex m-t-10">
|
||||
{{ activity.type == 1 ? '秒杀价' : '价格' }}
|
||||
<div class="primary m-l-20">
|
||||
<price-formate :price="checkedGoods.price || goodsDetails.min_price"
|
||||
:subscript-size="16" :first-size="26" :second-size="16" />
|
||||
</div>
|
||||
<div class="member-price m-l-10 flex xs"
|
||||
v-if="activity.type != 1 && (checkedGoods.member_price || goodsDetails.member_price)">
|
||||
会员价
|
||||
<price-formate :price="checkedGoods.member_price || goodsDetails.member_price"
|
||||
:weight="400" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rate flex-col row-right">
|
||||
<div class="primary" style="font-size: 20px">{{ comment.percent }}</div>
|
||||
<div class="lighter">好评率</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- -->
|
||||
|
||||
<div class="sales-click flex">
|
||||
<div class="flex-1">销量:{{ goodsDetails.sales_sum }}件</div>
|
||||
<div class="flex-1">浏览量:{{ goodsDetails.clicks }}次</div>
|
||||
</div>
|
||||
|
||||
<div class="spec-wrap">
|
||||
<div class="spec flex m-b-16" v-for="(item, index) in goodsSpec" :key="index">
|
||||
<div class="lighter spec-name">{{ item.name }}</div>
|
||||
<div class="spec-list flex flex-wrap">
|
||||
<div :class="[
|
||||
'spec-item lighter',
|
||||
{ active: specitem.checked },
|
||||
]" v-for="(specitem, sindex) in item.spec_value" :key="sindex"
|
||||
@click="onChoseSpecItem(item.id, specitem.id)">
|
||||
{{ specitem.value }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="goods-num flex">
|
||||
<div class="num lighter">数量</div>
|
||||
<number-box v-model="goodsNum" :min="1" :max="checkedGoods.stock" />
|
||||
<div class="m-l-10">
|
||||
库存: {{ checkedGoods.stock }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="goods-btns flex lg">
|
||||
<el-button type="primary" class="btn white" @click="onBuyNow">
|
||||
立即购买
|
||||
</el-button>
|
||||
<el-button type="primary" plain class="btn addcart" @click="onAddCart"
|
||||
v-if="goodsDetails.type == 0 && activity.type != 1">
|
||||
加入购物车
|
||||
</el-button>
|
||||
<div class="btn collection flex row-center" @click="onCollectionGoods">
|
||||
<img class="start-icon m-r-8" :src="
|
||||
goodsDetails.is_collect
|
||||
? require('~/static/images/icon_star_s.png')
|
||||
: require('~/static/images/icon_star.png')
|
||||
" />
|
||||
<span>{{ goodsDetails.is_collect ? '取消收藏' : '收藏商品' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="shop m-l-16 bg-white">
|
||||
<div class="shop-logo flex-col col-center">
|
||||
<el-image class="logo-img" :src="shop.logo"></el-image>
|
||||
<nuxt-link class="m-t-10" :to="`/shop_street_detail?id=${shop.id}`">
|
||||
<el-tag size="mini" v-if="shop.type == 1">自营</el-tag>
|
||||
<span class="weight-500">{{ shop.name }}</span>
|
||||
</nuxt-link>
|
||||
<div class="xs muted m-t-10 line-5">
|
||||
{{ shop.intro }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex m-t-20">
|
||||
<div class="flex-1 text-center">
|
||||
<div class="xxl m-b-10">{{ shop.goods_on_sale }}</div>
|
||||
<div>全部商品</div>
|
||||
</div>
|
||||
<div class="flex-1 text-center">
|
||||
<div class="xxl m-b-10">{{ shop.follow_num }}</div>
|
||||
<div>关注人数</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-divider></el-divider>
|
||||
<div class="flex xs m-b-16">
|
||||
<div class="m-r-12">店铺星级</div>
|
||||
<div class="m-t-5">
|
||||
<el-rate v-model="shop.star" disabled> </el-rate>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex xs m-b-16">
|
||||
<div class="m-r-12">店铺评分</div>
|
||||
<div class="">{{ shop.score }}分</div>
|
||||
</div>
|
||||
<div>
|
||||
<el-button type="primary" size="mini" @click="
|
||||
$router.push(`/shop_street_detail?id=${shop.id}`)
|
||||
">进入店铺</el-button>
|
||||
<el-button size="mini" @click="changeShopFollow">{{
|
||||
shop.shop_follow_status == 1 ? '已关注' : '关注店铺'
|
||||
}}</el-button>
|
||||
</div>
|
||||
<el-popover placement="bottom" width="200" trigger="hover">
|
||||
<div>
|
||||
<el-image style="width: 100%" :src="shop.customer_image"></el-image>
|
||||
</div>
|
||||
|
||||
<div slot="reference" class="xs lighter text-center m-t-30">
|
||||
<i class="el-icon-chat-dot-round nr"></i>
|
||||
<span>联系客服</span>
|
||||
</div>
|
||||
</el-popover>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="details-wrap flex m-t-16">
|
||||
<div class="details bg-white flex-1">
|
||||
<el-tabs v-model="active">
|
||||
<el-tab-pane label="商品详情">
|
||||
<div class="details-tips" v-if="goodsDetails.custom_params.length">
|
||||
<h2>产品参数</h2>
|
||||
<div class="boxs">
|
||||
<div class="tit" v-for="(items,index) in goodsDetails.custom_params" :key="index">
|
||||
<span class="st">{{items.key}}:</span>{{items.value}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rich-text" v-html="goodsDetails.content"></div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="商品评价">
|
||||
<div class="evaluation">
|
||||
<div class="evaluation-hd flex">
|
||||
<div class="rate flex">
|
||||
<div class="lighter m-r-8">好评率</div>
|
||||
<div class="primary" style="font-size: 30px">
|
||||
{{ goodsDetails.comment.percent }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="score flex">
|
||||
<span class="m-r-8 lighter">评分</span>
|
||||
<el-rate :value="goodsDetails.comment.goods_comment" disabled allow-half></el-rate>
|
||||
</div>
|
||||
</div>
|
||||
<div class="evaluation-tab flex">
|
||||
<div :class="[
|
||||
'item',
|
||||
{ active: commentActive == item.id },
|
||||
]" v-for="(item, index) in comment.comment" :key="index"
|
||||
@click="commentActive = item.id">
|
||||
{{ item.name }}({{ item.count }})
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<template v-for="(item, index) in comment.comment">
|
||||
<comment-list v-if="commentActive == item.id" :goods-id="id" :type="item.id"
|
||||
:key="index"></comment-list>
|
||||
</template>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
<div class="goods-like m-l-16" v-if="shop.goods_list.length">
|
||||
<div class="title bg-white flex p-l-15">店铺推荐</div>
|
||||
<div class="goods-list">
|
||||
<template v-for="(item, index) in shop.goods_list">
|
||||
<nuxt-link :to="`/goods_details/${item.id}`" class="item bg-white m-b-16" v-if="index < 5"
|
||||
:key="index">
|
||||
<el-image class="goods-img" :src="item.image"></el-image>
|
||||
<div class="goods-name line-2">
|
||||
{{ item.name }}
|
||||
</div>
|
||||
<div class="price flex m-t-8">
|
||||
<div class="primary m-r-8">
|
||||
<price-formate :price="item.min_price" :first-size="16" />
|
||||
</div>
|
||||
<div class="muted sm line-through">
|
||||
<price-formate :price="item.market_price" />
|
||||
</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 推荐 -->
|
||||
<div class="activity-area m-t-16">
|
||||
<div class="title flex row-between">
|
||||
<div class="font-size-20">推荐商品</div>
|
||||
</div>
|
||||
<div class="active-goods flex">
|
||||
<div class="goods-list flex">
|
||||
<nuxt-link
|
||||
class="goods-item"
|
||||
:to="`/goods_details/${gitem.id}`"
|
||||
v-for="(gitem, gindex) in dataRecommend"
|
||||
:key="gindex"
|
||||
>
|
||||
<div class="goods-img">
|
||||
<el-image
|
||||
lazy
|
||||
:src="gitem.image"
|
||||
fit="cover"
|
||||
alt=""
|
||||
></el-image>
|
||||
</div>
|
||||
<div class="name line-2 m-t-10">{{ gitem.name }}</div>
|
||||
<div class="price flex col-baseline m-t-10">
|
||||
<div class="primary m-r-8">
|
||||
<price-formate
|
||||
:price="gitem.min_price"
|
||||
:first-size="16"
|
||||
/>
|
||||
</div>
|
||||
<div class="muted sm line-through ">
|
||||
<price-formate
|
||||
:price="gitem.market_price"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="muted xs m-t-10">
|
||||
{{ gitem.sales_total }}人购买
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapActions } from 'vuex'
|
||||
import { Message } from 'element-ui'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
async asyncData({ params, $get, app }) {
|
||||
const { data: dataRecommend } = await $get('goods/getRecommendGoods',{params: {goods_id: params.id}})
|
||||
const { data, code, msg } = await $get('goods/getGoodsDetail', {
|
||||
params: { goods_id: params.id },
|
||||
})
|
||||
if (code == 0) {
|
||||
setTimeout(() => app.router.back(), 1500)
|
||||
}
|
||||
return {
|
||||
dataRecommend: dataRecommend,
|
||||
goodsDetails: data,
|
||||
goodsImage: data.goods_image,
|
||||
activity: data.activity,
|
||||
shop: data.shop,
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
goodsDetails: {},
|
||||
goodsImage: [],
|
||||
activity: {},
|
||||
shop: {
|
||||
goods_list: [],
|
||||
},
|
||||
swiperOptions: {
|
||||
pagination: {
|
||||
el: '.swiper-pagination',
|
||||
clickable: true,
|
||||
},
|
||||
navigation: {
|
||||
nextEl: '.swiper-button-next',
|
||||
prevEl: '.swiper-button-prev',
|
||||
},
|
||||
preventClicks: true,
|
||||
slidesPerView: 'auto',
|
||||
},
|
||||
active: '0',
|
||||
commentActive: 0,
|
||||
swiperIndex: 0,
|
||||
checkedGoods: {},
|
||||
comment: {},
|
||||
goodsNum: 1,
|
||||
goodsSpec: [],
|
||||
id: '',
|
||||
timeData: {},
|
||||
dataRecommend: [], //推荐
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.id = this.$route.params.id
|
||||
this.getComment(this.id)
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['getPublicData']),
|
||||
onClickSlide(e) {
|
||||
this.swiperIndex = e
|
||||
},
|
||||
onChoseSpecItem(id, specid) {
|
||||
const { goodsSpec } = this
|
||||
goodsSpec.forEach((item) => {
|
||||
if (item.spec_value && item.id == id) {
|
||||
item.spec_value.forEach((specitem) => {
|
||||
specitem.checked = 0
|
||||
if (specitem.id == specid) {
|
||||
specitem.checked = 1
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
this.goodsSpec = [...goodsSpec]
|
||||
},
|
||||
async onAddCart() {
|
||||
const {
|
||||
goodsNum,
|
||||
checkedGoods: { id },
|
||||
} = this
|
||||
const { code, data, msg } = await this.$post('cart/add', {
|
||||
item_id: id,
|
||||
goods_num: goodsNum,
|
||||
})
|
||||
if (code == 1) {
|
||||
this.getPublicData()
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: 'success',
|
||||
})
|
||||
}
|
||||
},
|
||||
async changeShopFollow() {
|
||||
const { code, msg } = await this.$post('shop_follow/changeStatus', {
|
||||
shop_id: this.shop.id,
|
||||
})
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: 'success',
|
||||
})
|
||||
this.getGoodsDetail()
|
||||
}
|
||||
},
|
||||
onBuyNow() {
|
||||
const {
|
||||
goodsNum,
|
||||
checkedGoods: { id },
|
||||
} = this
|
||||
const goods = [
|
||||
{
|
||||
item_id: id,
|
||||
num: goodsNum,
|
||||
goods_id: this.id,
|
||||
shop_id: this.shop.id,
|
||||
},
|
||||
]
|
||||
this.$router.push({
|
||||
path: '/confirm_order',
|
||||
query: {
|
||||
data: encodeURIComponent(
|
||||
JSON.stringify({
|
||||
goods,
|
||||
type: 'buy',
|
||||
})
|
||||
),
|
||||
},
|
||||
})
|
||||
},
|
||||
async getGoodsDetail() {
|
||||
const { data, code } = await this.$get('goods/getGoodsDetail', {
|
||||
params: { goods_id: this.id },
|
||||
})
|
||||
if (code == 1) {
|
||||
this.goodsDetails = data
|
||||
this.shop = data.shop
|
||||
}
|
||||
},
|
||||
async onCollectionGoods() {
|
||||
const { data, code, msg } = await this.$post(
|
||||
'goods_collect/changeStatus',
|
||||
{
|
||||
goods_id: this.id,
|
||||
}
|
||||
)
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: 'success',
|
||||
})
|
||||
this.getGoodsDetail()
|
||||
}
|
||||
},
|
||||
async getComment() {
|
||||
const { data, code } = await this.$get('/goods_comment/category', {
|
||||
params: { goods_id: this.id },
|
||||
})
|
||||
if (code == 1) {
|
||||
this.comment = data
|
||||
this.commentActive = data.comment[0].id
|
||||
}
|
||||
},
|
||||
onChangeDate(e) {
|
||||
let timeData = {}
|
||||
for (let prop in e) {
|
||||
if (prop !== 'milliseconds')
|
||||
timeData[prop] = ('0' + e[prop]).slice(-2)
|
||||
}
|
||||
this.timeData = timeData
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
goodsSpec: {
|
||||
immediate: true,
|
||||
handler(value) {
|
||||
const { goods_item } = this.goodsDetails
|
||||
let keyArr = []
|
||||
value.forEach((item) => {
|
||||
if (item.spec_value) {
|
||||
item.spec_value.forEach((specitem) => {
|
||||
if (specitem.checked) {
|
||||
keyArr.push(specitem.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
if (!keyArr.length) return
|
||||
let key = keyArr.join(',')
|
||||
let index = goods_item.findIndex((item) => {
|
||||
return item.spec_value_ids == key
|
||||
})
|
||||
if (index == -1) {
|
||||
index = 0
|
||||
}
|
||||
this.checkedGoods = goods_item[index]
|
||||
console.log(this.checkedGoods)
|
||||
},
|
||||
},
|
||||
goodsDetails: {
|
||||
immediate: true,
|
||||
handler(value) {
|
||||
if (!value.goods_spec) return
|
||||
value.goods_spec.forEach((item) => {
|
||||
item.spec_value.forEach((specitem, specindex) => {
|
||||
if (specindex == 0) {
|
||||
specitem.checked = 1
|
||||
} else {
|
||||
specitem.checked = 0
|
||||
}
|
||||
})
|
||||
})
|
||||
this.goodsSpec = [...value.goods_spec]
|
||||
},
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
countTime() {
|
||||
const end_time = this.activity.end_time
|
||||
return end_time ? end_time - Date.now() / 1000 : 0
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.goods-details {
|
||||
padding: 16px 0 44px;
|
||||
|
||||
.goods-info {
|
||||
.goods-swiper {
|
||||
width: 400px;
|
||||
border-radius: 4px;
|
||||
|
||||
.swiper {
|
||||
margin: 10px 0;
|
||||
padding: 0 25px;
|
||||
--swiper-navigation-size: 15px;
|
||||
--swiper-navigation-color: #888;
|
||||
|
||||
.swiper-button-next,
|
||||
.swiper-button-prev {
|
||||
top: 0;
|
||||
width: 25px;
|
||||
height: 100%;
|
||||
margin-top: 0;
|
||||
background-size: 12px 22px;
|
||||
}
|
||||
|
||||
.swiper-button-prev {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.swiper-button-next {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.swiper-item {
|
||||
cursor: pointer;
|
||||
height: 66px;
|
||||
width: 66px;
|
||||
border: 2px solid transparent;
|
||||
|
||||
&~.swiper-item {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
&.active {
|
||||
border-color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.current-img {
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
.info-wrap {
|
||||
min-height: 486px;
|
||||
min-width: 504px;
|
||||
border-radius: 4px;
|
||||
padding: 20px;
|
||||
|
||||
.name {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.seckill {
|
||||
background-color: $--color-primary;
|
||||
padding: 6px 10px;
|
||||
|
||||
.count-down {
|
||||
.item {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.price-wrap {
|
||||
background: #f6f6f6;
|
||||
background-size: 100%;
|
||||
padding: 16px 16px;
|
||||
|
||||
.member-price {
|
||||
background-color: #482406;
|
||||
color: #fdebd5;
|
||||
border-radius: 100px 100px 100px 0px;
|
||||
padding: 0 6px;
|
||||
}
|
||||
}
|
||||
|
||||
.sales-click {
|
||||
border-bottom: 1px dashed $--border-color-base;
|
||||
line-height: 28px;
|
||||
text-align: center;
|
||||
padding: 6px;
|
||||
|
||||
&>div:first-of-type {
|
||||
border-right: 1px solid $--border-color-base;
|
||||
}
|
||||
}
|
||||
|
||||
.spec-wrap {
|
||||
margin-top: 20px;
|
||||
|
||||
.spec {
|
||||
align-items: flex-start;
|
||||
|
||||
.spec-name {
|
||||
margin-right: 20px;
|
||||
margin-top: 6px;
|
||||
flex: none;
|
||||
}
|
||||
|
||||
.spec-item {
|
||||
padding: 0 20px;
|
||||
line-height: 32px;
|
||||
border: $--border-base;
|
||||
border-radius: 2px;
|
||||
margin-right: 10px;
|
||||
margin-bottom: 10px;
|
||||
cursor: pointer;
|
||||
|
||||
&.active {
|
||||
color: $--color-primary;
|
||||
background-color: #ffeeef;
|
||||
border-color: currentColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.goods-num {
|
||||
margin-bottom: 30px;
|
||||
|
||||
.num {
|
||||
margin-right: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.goods-btns {
|
||||
.btn {
|
||||
margin-right: 14px;
|
||||
text-align: center;
|
||||
width: 120px;
|
||||
font-size: 16px;
|
||||
|
||||
&.collection {
|
||||
width: 146px;
|
||||
line-height: 42px;
|
||||
border: 1px solid rgba(229, 229, 229, 0.89804);
|
||||
background-color: #fff;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
color: #666;
|
||||
|
||||
&:hover {
|
||||
color: $--color-primary;
|
||||
}
|
||||
|
||||
.start-icon {
|
||||
width: 18.5px;
|
||||
height: 18px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.shop {
|
||||
width: 210px;
|
||||
padding: 16px;
|
||||
|
||||
.logo-img {
|
||||
width: 62px;
|
||||
height: 62px;
|
||||
border-radius: 50%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.el-rate__icon {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.rich-text img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
.details-wrap {
|
||||
align-items: stretch;
|
||||
|
||||
.details {
|
||||
padding: 10px 0;
|
||||
overflow: hidden;
|
||||
|
||||
.rich-text {
|
||||
padding: 0 10px;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.evaluation {
|
||||
.evaluation-hd {
|
||||
height: 80px;
|
||||
margin: 0 10px;
|
||||
|
||||
.rate {
|
||||
height: 60px;
|
||||
width: 220px;
|
||||
border-right: 1px solid #e5e5e5;
|
||||
padding-left: 10px;
|
||||
margin-right: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
.evaluation-tab {
|
||||
margin: 16px 20px;
|
||||
|
||||
.item {
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
height: 32px;
|
||||
padding: 6px 20px;
|
||||
color: #666;
|
||||
background-color: #f2f2f2;
|
||||
margin-right: 10px;
|
||||
|
||||
&.active {
|
||||
color: #fff;
|
||||
background-color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.goods-like {
|
||||
width: 210px;
|
||||
|
||||
.title {
|
||||
border-bottom: $--border-base;
|
||||
height: 45px;
|
||||
}
|
||||
|
||||
.goods-list {
|
||||
.item {
|
||||
padding: 10px;
|
||||
display: block;
|
||||
|
||||
.goods-img {
|
||||
width: 190px;
|
||||
height: 190px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.details-tips {
|
||||
padding:20px;
|
||||
h2 {
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
.boxs {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
column-gap: 10px;
|
||||
row-gap: 10px;
|
||||
overflow-wrap: break-word;
|
||||
word-wrap: break-word;
|
||||
word-break: keep-all; /* 长单词换行 */
|
||||
word-break: break-all; /* 单词内换行 */
|
||||
.tit {
|
||||
font-size: 14px;
|
||||
.st {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.activity-area {
|
||||
padding: 16px;
|
||||
border-radius: 6px;
|
||||
background-color: #fff;
|
||||
.title {
|
||||
font-size: 36px;
|
||||
font-weight: bold;
|
||||
margin-top: 10px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.goods-list {
|
||||
flex-wrap: wrap;
|
||||
.goods-item {
|
||||
width: 14.6%;
|
||||
margin: 20px 1% 0 1%;
|
||||
.goods-img {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
padding-top: 100%;
|
||||
position: relative;
|
||||
.el-image {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
.name {
|
||||
line-height: 20px;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,182 +0,0 @@
|
|||
<template>
|
||||
<div class="goods-list">
|
||||
<div class="banner m-t-16">
|
||||
<!-- <ad-item :item="ad" v-if="ad.image"></ad-item> -->
|
||||
<client-only>
|
||||
<swiper ref="mySwiper" :options="swiperOptions">
|
||||
<swiper-slide class="swiper-item" v-for="(item, index) in ad" :key="index">
|
||||
<ad-item :item="item"></ad-item>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
<div class="sort m-b-16 flex bg-white">
|
||||
<div class="sort-title">排序方式:</div>
|
||||
<div class="sort-name m-l-16 flex">
|
||||
<div :class="['item', { active: sortType == '' }]" @click="changeSortType('')">
|
||||
综合
|
||||
</div>
|
||||
<div :class="['item', { active: sortType == 'price' }]" @click="changeSortType('price')">
|
||||
价格
|
||||
<i v-show="priceSort == 'desc'" class="el-icon-arrow-down"></i>
|
||||
<i v-show="priceSort == 'asc'" class="el-icon-arrow-up"></i>
|
||||
</div>
|
||||
<div :class="['item', { active: sortType == 'sales_sum' }]" @click="changeSortType('sales_sum')">
|
||||
销量
|
||||
<i v-show="saleSort == 'desc'" class="el-icon-arrow-down"></i>
|
||||
<i v-show="saleSort == 'asc'" class="el-icon-arrow-up"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="goodsList.length">
|
||||
<goods-list :list="goodsList" />
|
||||
<div class="pagination flex m-t-30 row-center" style="padding-bottom: 38px" v-if="count">
|
||||
<el-pagination background layout="prev, pager, next" :total="count" prev-text="上一页" next-text="下一页"
|
||||
hide-on-single-page :page-size="20" @current-change="changePage">
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<null-data v-else :img="require('~/static/images/goods_null.png')" text="暂无商品~"></null-data>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { trottle } from "~/utils/tools";
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
async asyncData({ $get, params, query }) {
|
||||
const { type } = params;
|
||||
let pid = 0;
|
||||
let ad = [];
|
||||
switch (type) {
|
||||
case "1":
|
||||
pid = 25;
|
||||
break;
|
||||
case "2":
|
||||
pid = 26;
|
||||
break;
|
||||
}
|
||||
const { data } = await $get("ad_content/lists", {
|
||||
params: {
|
||||
pid: pid,
|
||||
terminal: 2,
|
||||
},
|
||||
});
|
||||
|
||||
if (!data.length) return;
|
||||
ad = data
|
||||
return { ad };
|
||||
},
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
sortType: "",
|
||||
swiperOptions: {
|
||||
width: 1180,
|
||||
},
|
||||
saleSort: "desc",
|
||||
priceSort: "desc",
|
||||
page: "",
|
||||
count: 0,
|
||||
ad: "",
|
||||
goodsList: [],
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getGoods();
|
||||
this.changeSortType = trottle(this.changeSortType, 500, this);
|
||||
},
|
||||
methods: {
|
||||
changeSortType(type) {
|
||||
this.sortType = type;
|
||||
switch (type) {
|
||||
case "price":
|
||||
if (this.priceSort == "asc") {
|
||||
this.priceSort = "desc";
|
||||
} else if (this.priceSort == "desc") {
|
||||
this.priceSort = "asc";
|
||||
}
|
||||
break;
|
||||
case "sales_sum":
|
||||
if (this.saleSort == "asc") {
|
||||
this.saleSort = "desc";
|
||||
} else if (this.saleSort == "desc") {
|
||||
this.saleSort = "asc";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
}
|
||||
this.getGoods();
|
||||
},
|
||||
changePage(current) {
|
||||
this.page = current;
|
||||
this.getGoods();
|
||||
},
|
||||
async getGoods() {
|
||||
const { name } = this.$route.query;
|
||||
const { priceSort, sortType, saleSort } = this;
|
||||
let sort = "";
|
||||
switch (sortType) {
|
||||
case "price":
|
||||
sort = priceSort;
|
||||
break;
|
||||
case "sales_sum":
|
||||
sort = saleSort;
|
||||
break;
|
||||
}
|
||||
const {
|
||||
data: { list, count },
|
||||
} = await this.$get("pc/goodsList", {
|
||||
params: {
|
||||
page_size: 20,
|
||||
page_no: this.page,
|
||||
sort_type: sortType,
|
||||
sort,
|
||||
name,
|
||||
},
|
||||
});
|
||||
this.count = count;
|
||||
this.goodsList = list;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
'$route.query.name' () {
|
||||
this.getGoods();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.goods-list {
|
||||
.banner {
|
||||
img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
.sort {
|
||||
padding: 15px 16px;
|
||||
.sort-name {
|
||||
.item {
|
||||
margin-right: 30px;
|
||||
cursor: pointer;
|
||||
&.active {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,189 +0,0 @@
|
|||
<template>
|
||||
<div class="news-details-container mt16">
|
||||
<div class="nav-container flex">
|
||||
<div class="nr" style="width: 70px">当前位置:</div>
|
||||
<el-breadcrumb style="flex: 1;" separator="/">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>
|
||||
<nuxt-link to="/help_center">帮助中心</nuxt-link>
|
||||
</el-breadcrumb-item>
|
||||
<el-breadcrumb-item class="line1" style="max-width: 800px;">{{detailsObj.title}}</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div class="news-detail-box m-r-16">
|
||||
<div class="content-header bg-white">
|
||||
<div class="news-detail-title">
|
||||
{{detailsObj.title}}
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="sm muted">
|
||||
发布时间:{{detailsObj.create_time}}
|
||||
</div>
|
||||
<div class="flex" style="margin-left: 40px">
|
||||
<i class="el-icon-view muted"></i>
|
||||
<div class="muted" style="margin-left: 3px;">{{detailsObj.visit}} 人浏览</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-html-box bg-white">
|
||||
<div v-html="detailsObj.content"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="recommend-box">
|
||||
<div class="recommend-box-header flex bg-white">
|
||||
<div class="primary-line"></div>
|
||||
<div class="xxl" style="font-weight: 500">为您推荐</div>
|
||||
</div>
|
||||
<div class="recommend-box-content bg-white">
|
||||
<div class="recommend-list-container">
|
||||
<div class="recommend-list-item" v-for="(item) in recommend_list" :key="item.id"
|
||||
@click="toOther(item.id)">
|
||||
<el-image style="width: 244px; height:183px;border-radius: 6px" fit="cover"
|
||||
:src="item.image" />
|
||||
<div class="goods-info">
|
||||
<div class="line2 goods-name">{{item.title}}</div>
|
||||
<div class="flex" style="margin-top: 10px">
|
||||
<i class="el-icon-view muted"></i>
|
||||
<div class="muted xs" style="margin-left: 4px;">{{item.visit}} 人浏览</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
$post,
|
||||
query
|
||||
}) {
|
||||
let detailsObj = {};
|
||||
let recommend_list = [];
|
||||
let res = await $get("help/detail", {
|
||||
params: {
|
||||
id: query.id,
|
||||
client: 2
|
||||
}
|
||||
});
|
||||
if (res.code == 1) {
|
||||
detailsObj = res.data;
|
||||
recommend_list = res.data.recommend_list
|
||||
}
|
||||
return {
|
||||
detailsObj,
|
||||
recommend_list,
|
||||
};
|
||||
},
|
||||
watchQuery: ['id'],
|
||||
data() {
|
||||
return {
|
||||
recommend_list: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log('route', this.$route)
|
||||
// this.getNewsDetails(this.$route.query.id);
|
||||
},
|
||||
methods: {
|
||||
async getNewsDetails(id) {
|
||||
let res = await this.$get("help/detail", {params: {id: id, client: 2}});
|
||||
if(res.code == 1) {
|
||||
this.detailsObj = res.data;
|
||||
this.recommend_list = res.data.recommend_list
|
||||
}
|
||||
},
|
||||
toOther(id) {
|
||||
this.$router.push('/help_center/help_center_detail?id=' + id)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.news-details-container {
|
||||
.nav-container {
|
||||
padding: 15px 16px;
|
||||
}
|
||||
|
||||
.content-box {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.news-detail-box {
|
||||
background-color: #FFFFFF;
|
||||
width: 900px;
|
||||
|
||||
.content-header {
|
||||
margin: 0px 20px;
|
||||
padding: 20px 0px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.news-detail-title {
|
||||
color: #222;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
margin-bottom: 43px;
|
||||
}
|
||||
}
|
||||
|
||||
.content-html-box {
|
||||
padding: 24px 20px;
|
||||
|
||||
&>div {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
|
||||
::v-deep img {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box {
|
||||
width: 264px;
|
||||
|
||||
.recommend-box-header {
|
||||
padding: 15px 10px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.primary-line {
|
||||
margin-right: 10px;
|
||||
background-color: $--color-primary;
|
||||
width: 4px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box-content {
|
||||
.recommend-list-container {
|
||||
.recommend-list-item {
|
||||
padding: 10px;
|
||||
cursor: pointer;
|
||||
|
||||
.goods-info {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,233 +0,0 @@
|
|||
<template>
|
||||
<div class="help-center-container">
|
||||
<div class="help-center-banner">
|
||||
<client-only>
|
||||
<swiper ref="mySwiper" :options="swiperOptions">
|
||||
<swiper-slide class="swiper-item" v-for="(item, index) in bannerList" :key="index">
|
||||
<ad-item :item="item"></ad-item>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
<div class="help-center-box">
|
||||
<div class="help-center-aside bg-white">
|
||||
<ul class="nav flex-col col-center">
|
||||
<li class="flex" :class="{'active-item': currentId <= 0}" @click="changeList(0)">全部</li>
|
||||
<li class="flex" v-for="(item) in categoryList" :key="item.id"
|
||||
:class="{'active-item': item.id == currentId}" @click="changeList(item.id)">{{item.name}}</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="article-lists-container m-l-16 bg-white">
|
||||
<div v-show="!dataNull">
|
||||
<div>
|
||||
<nuxt-link :to="'/help_center/help_center_detail?id=' + item.id"
|
||||
class="article-item flex row-between bg-white" v-for="(item) in articleList" :key="item.id">
|
||||
<div>
|
||||
<div class="lg article-name line2">{{item.title}}</div>
|
||||
<div class="lighter">{{item.intro}}</div>
|
||||
<div class="flex" style="margin-top: 56px;">
|
||||
<div class="sm muted">发布时间:{{item.create_time}}</div>
|
||||
<div class="flex m-l-16">
|
||||
<i class="el-icon-view muted"></i>
|
||||
<div class="muted" style="margin-left: 3px;">{{item.visit}} 人浏览</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-image style="width: 200px; height: 150px;border-radius: 6px;" fit="cover"
|
||||
:src="item.image" />
|
||||
</nuxt-link>
|
||||
</div>
|
||||
<div class="help-center-pagination row-center">
|
||||
<el-pagination background hide-on-single-page layout="prev, pager, next" :total="count"
|
||||
prev-text="上一页" next-text="下一页" :page-size="10" @current-change="changePage" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-null column-center" v-show="dataNull">
|
||||
<img style="width: 150px;height: 150px;" src="~/static/images/news_null.png" />
|
||||
<div class="xs muted">
|
||||
暂无消息记录~
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
$post
|
||||
}) {
|
||||
let categoryList = [];
|
||||
let currentId = 0;
|
||||
let articleList = [];
|
||||
let count = 0;
|
||||
let dataNull = true;
|
||||
const banner = $get("ad_content/lists", {
|
||||
params: {
|
||||
pid: 29,
|
||||
terminal: 2
|
||||
}
|
||||
});
|
||||
let res = await $get("help/category");
|
||||
const {
|
||||
data: bannerList
|
||||
} = await banner;
|
||||
if (res.code == 1) {
|
||||
categoryList = res.data;
|
||||
currentId = 0
|
||||
let listsRes = await $get("help/lists", {
|
||||
params: {
|
||||
cid: currentId,
|
||||
page_size: 10
|
||||
}
|
||||
});
|
||||
if (listsRes.code == 1) {
|
||||
articleList = listsRes.data.list;
|
||||
count = listsRes.data.count
|
||||
if (count <= 0) {
|
||||
dataNull = true;
|
||||
} else {
|
||||
dataNull = false
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
categoryList,
|
||||
articleList,
|
||||
count,
|
||||
currentId,
|
||||
bannerList,
|
||||
dataNull,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
categoryList: [],
|
||||
articleList: [],
|
||||
currentId: -1,
|
||||
count: 0,
|
||||
swiperOptions: {
|
||||
width: 1180,
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log(this.articleList, 'articleList')
|
||||
},
|
||||
methods: {
|
||||
async changePage(current) {
|
||||
let res = await this.$get("help/lists", {
|
||||
params: {
|
||||
cid: this.currentId,
|
||||
page_no: current,
|
||||
page_size: 10
|
||||
}
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.articleList = res.data.list;
|
||||
if (this.articleList.length <= 0) {
|
||||
dataNull = true;
|
||||
} else {
|
||||
dataNull = false
|
||||
}
|
||||
}
|
||||
},
|
||||
changeList(id) {
|
||||
this.currentId = id;
|
||||
this.changePage(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.help-center-container {
|
||||
.help-center-banner {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.help-center-box {
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.help-center-aside {
|
||||
width: 160px;
|
||||
// min-height: 635px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
padding: 20px 30px;
|
||||
|
||||
.nav {
|
||||
li {
|
||||
margin: 10px 0px;
|
||||
padding: 0px 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.active-item {
|
||||
padding-left: 27px;
|
||||
color: $--color-primary;
|
||||
border-left: 3px solid $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.article-lists-container {
|
||||
width: 1004px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
|
||||
.article-item {
|
||||
margin: 0px 20px;
|
||||
padding: 15px 0px;
|
||||
border-bottom: 1px solid #E5E5E5;
|
||||
cursor: pointer;
|
||||
|
||||
.article-name {
|
||||
margin-bottom: 11px;
|
||||
margin-top: 13px;
|
||||
max-width: 720px;
|
||||
}
|
||||
}
|
||||
|
||||
.help-center-pagination {
|
||||
padding-top: 38px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.data-null {
|
||||
padding-top: 150px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .btn-prev {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .btn-next {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .el-pager li {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
</style>
|
|
@ -1,348 +0,0 @@
|
|||
<template>
|
||||
<div class="index">
|
||||
<!-- 广告位 -->
|
||||
<div class="banner">
|
||||
<client-only>
|
||||
<el-carousel height="440px" autoplay>
|
||||
<el-carousel-item
|
||||
v-for="(item, index) in bannerList"
|
||||
:key="index"
|
||||
class="swiper-item"
|
||||
>
|
||||
<ad-item :item="item" />
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
</client-only>
|
||||
</div>
|
||||
<!-- 活动专区 -->
|
||||
<div
|
||||
class="activity-area flex flex-wrap"
|
||||
v-if="indexData.activity_area && indexData.activity_area.length"
|
||||
>
|
||||
<nuxt-link
|
||||
class="activity-item flex"
|
||||
v-for="(item, index) in indexData.activity_area"
|
||||
:key="index"
|
||||
:to="`/special_area?id=${item.id}&name=${item.name}&title=${item.title}`"
|
||||
>
|
||||
<div class="flex-1 m-r-16" style="min-width: 0">
|
||||
<div class="xxl m-b-10 line-1">{{ item.name }}</div>
|
||||
<div class="m-b-6 line-2">{{ item.title }}</div>
|
||||
|
||||
<el-button size="mini">前往查看</el-button>
|
||||
</div>
|
||||
<el-image
|
||||
class="activity-img"
|
||||
lazy
|
||||
:src="item.image"
|
||||
alt=""
|
||||
></el-image>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
<home-seckill :list="indexData.seckill_goods" @refreshhome="getIndex" />
|
||||
<div class="active-goods flex">
|
||||
<activity-area
|
||||
class="flex-1 m-r-16"
|
||||
:list="indexData.hots"
|
||||
title="热销榜单"
|
||||
url="/goods_list/1"
|
||||
/>
|
||||
<activity-area
|
||||
class="flex-1"
|
||||
:list="indexData.news"
|
||||
title="新品推荐"
|
||||
url="/goods_list/2"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="shop-recommend card m-t-16"
|
||||
v-if="indexData.shop_lists.length"
|
||||
>
|
||||
<div class="title flex row-between">
|
||||
<div class="font-size-20">店铺推荐</div>
|
||||
</div>
|
||||
|
||||
<div class="shop-list m-t-16">
|
||||
<client-only>
|
||||
<swiper
|
||||
class="swiper"
|
||||
ref="mySwiper"
|
||||
:options="swiperOptions"
|
||||
>
|
||||
<swiper-slide
|
||||
class="swiper-item"
|
||||
v-for="(item, index) in indexData.shop_lists"
|
||||
:key="index"
|
||||
>
|
||||
<shop-item
|
||||
:cover="item.cover"
|
||||
:shopId="item.id"
|
||||
:logo="item.logo"
|
||||
:type="item.type"
|
||||
:name="item.name"
|
||||
:sales="item.on_sales_count"
|
||||
/>
|
||||
</swiper-slide>
|
||||
<div
|
||||
class="swiper-button-prev"
|
||||
slot="button-prev"
|
||||
></div>
|
||||
<div
|
||||
class="swiper-button-next"
|
||||
slot="button-next"
|
||||
></div>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
</div>
|
||||
<div class="goods-column bg-white" v-if="columnList.length">
|
||||
<div class="column-wrap flex">
|
||||
<div
|
||||
class="item flex-col col-center muted flex-none"
|
||||
v-for="(item, index) in columnList"
|
||||
:key="index"
|
||||
@click="changeTab(index)"
|
||||
>
|
||||
<div class="item-con flex-col col-center">
|
||||
<div
|
||||
class="xxl normal title line-1"
|
||||
:class="{ 'weight-500': active == index }"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
<div
|
||||
class="m-t-8 xs line-1"
|
||||
:class="{ normal: active == index }"
|
||||
>
|
||||
{{ item.remark }}
|
||||
</div>
|
||||
|
||||
<div v-if="active == index" class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="hasData" class="m-t-16">
|
||||
<goods-list :list="goodsList" />
|
||||
<div
|
||||
class="pagination flex m-t-30 row-center"
|
||||
style="padding-bottom: 38px"
|
||||
>
|
||||
<el-pagination
|
||||
background
|
||||
layout="prev, pager, next"
|
||||
:total="count"
|
||||
prev-text="上一页"
|
||||
next-text="下一页"
|
||||
hide-on-single-page
|
||||
:page-size="20"
|
||||
@current-change="changePage"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
<null-data
|
||||
v-else
|
||||
:img="require('~/static/images/goods_null.png')"
|
||||
text="暂无商品~"
|
||||
></null-data>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import HomeSeckill from '../components/home-seckill.vue'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
components: { HomeSeckill },
|
||||
async asyncData({ $get }) {
|
||||
const { data } = await $get('index/index',{params: {terminal:'pc'}})
|
||||
const { data: banner } = await $get('ad_content/lists', {
|
||||
params: { pid: 23, terminal: 2 },
|
||||
})
|
||||
const { data: columnList } = await $get(
|
||||
'goods_column/getGoodsColumnList'
|
||||
)
|
||||
|
||||
return {
|
||||
indexData: data,
|
||||
columnList,
|
||||
bannerList: banner,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
page: 1,
|
||||
count: 0,
|
||||
goodsList: [],
|
||||
active: 0,
|
||||
bannerList: [],
|
||||
columnList: [],
|
||||
hasData: true,
|
||||
indexData: {
|
||||
activity_area: [],
|
||||
shop_recommend: [],
|
||||
hots: [],
|
||||
news: [],
|
||||
shop_lists: [],
|
||||
},
|
||||
swiperOptions: {
|
||||
pagination: {
|
||||
el: '.swiper-pagination',
|
||||
clickable: true,
|
||||
},
|
||||
navigation: {
|
||||
nextEl: '.swiper-button-next',
|
||||
prevEl: '.swiper-button-prev',
|
||||
},
|
||||
// loopedSlides: 5,
|
||||
preventClicks: true,
|
||||
slidesPerView: 'auto',
|
||||
autoplay: false
|
||||
},
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
columnList: {
|
||||
immediate: true,
|
||||
handler() {
|
||||
this.getGoodsLists()
|
||||
},
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async getGoodsLists() {
|
||||
const { columnList, active, page } = this
|
||||
if (!columnList.length) return
|
||||
const columnId = columnList[active].id
|
||||
const { data } = await this.$get('goods/getGoodsListByColumnId', {
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: page,
|
||||
column_id: columnId,
|
||||
},
|
||||
})
|
||||
if (!data.lists.length) {
|
||||
this.hasData = false
|
||||
} else {
|
||||
this.hasData = true
|
||||
}
|
||||
this.goodsList = data.lists
|
||||
},
|
||||
changePage(page) {
|
||||
this.page = page
|
||||
this.getGoodsLists()
|
||||
},
|
||||
changeTab(index) {
|
||||
this.active = index
|
||||
this.getGoodsLists()
|
||||
},
|
||||
async getIndex() {
|
||||
const { data } = await $get('index/index',{
|
||||
params: {
|
||||
terminal: 'pc'
|
||||
}
|
||||
})
|
||||
this.indexData = data
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.index {
|
||||
.banner {
|
||||
margin-left: 160px;
|
||||
margin-bottom: 16px;
|
||||
height: 440px;
|
||||
}
|
||||
.activity-area {
|
||||
.activity-item {
|
||||
border-radius: 6px;
|
||||
padding: 28px 16px;
|
||||
background-color: #fff;
|
||||
width: 280px;
|
||||
margin-bottom: 20px;
|
||||
&:not(:nth-of-type(4n)) {
|
||||
margin-right: 20px;
|
||||
}
|
||||
.activity-img {
|
||||
width: 104px;
|
||||
height: 104px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.card {
|
||||
padding: 16px;
|
||||
border-radius: 6px;
|
||||
background-color: #fff;
|
||||
}
|
||||
.shop-recommend {
|
||||
padding: 16px 20px;
|
||||
}
|
||||
.shop-list {
|
||||
.swiper {
|
||||
--swiper-navigation-size: 18px;
|
||||
--swiper-navigation-color: #fff;
|
||||
.swiper-button-next,
|
||||
.swiper-button-prev {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
.swiper-item {
|
||||
width: 270px;
|
||||
height: 400px;
|
||||
padding-right: 20px;
|
||||
box-sizing: content-box;
|
||||
&:last-of-type {
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.goods-column {
|
||||
overflow-y: auto;
|
||||
.column-wrap {
|
||||
height: 100px;
|
||||
.item {
|
||||
padding: 0 25px;
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
.item-con {
|
||||
position: relative;
|
||||
.title {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
.line {
|
||||
position: absolute;
|
||||
top: 16px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
#{$--color-primary} 0%,
|
||||
rgba(255, 44, 60, 0) 100%
|
||||
);
|
||||
border-radius: 60px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
margin-top: 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,233 +0,0 @@
|
|||
<template>
|
||||
<div class="help-center-container">
|
||||
<div class="help-center-banner">
|
||||
<client-only>
|
||||
<swiper ref="mySwiper" :options="swiperOptions">
|
||||
<swiper-slide class="swiper-item" v-for="(item, index) in bannerList" :key="index">
|
||||
<ad-item :item="item"></ad-item>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
<div class="help-center-box">
|
||||
<div class="help-center-aside bg-white">
|
||||
<ul class="nav flex-col col-center">
|
||||
<li class="flex" :class="{'active-item': currentId <= 0}" @click="changeList(0)">全部</li>
|
||||
<li class="flex" v-for="(item) in categoryList" :key="item.id"
|
||||
:class="{'active-item': item.id == currentId}" @click="changeList(item.id)">{{item.name}}</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="article-lists-container m-l-16 bg-white">
|
||||
<div v-show="!dataNull">
|
||||
<div>
|
||||
<nuxt-link :to="'/news_list/news_list_detail?id=' + item.id"
|
||||
class="article-item flex row-between bg-white" v-for="(item) in articleList" :key="item.id">
|
||||
<div>
|
||||
<div class="lg article-name line2">{{item.title}}</div>
|
||||
<div class="lighter">{{item.intro}}</div>
|
||||
<div class="flex" style="margin-top: 56px;">
|
||||
<div class="sm muted">发布时间:{{item.create_time}}</div>
|
||||
<div class="flex m-l-16">
|
||||
<i class="el-icon-view muted"></i>
|
||||
<div class="muted" style="margin-left: 3px;">{{item.visit}} 人浏览</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-image style="width: 200px; height: 150px;border-radius: 6px;" fit="cover"
|
||||
:src="item.image" />
|
||||
</nuxt-link>
|
||||
</div>
|
||||
<div class="help-center-pagination row-center">
|
||||
<el-pagination background hide-on-single-page layout="prev, pager, next" :total="count"
|
||||
prev-text="上一页" next-text="下一页" :page-size="10" @current-change="changePage" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-null column-center" v-show="dataNull">
|
||||
<img style="width: 150px;height: 150px;" src="~/static/images/news_null.png" />
|
||||
<div class="xs muted">
|
||||
暂无消息记录~
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
$post
|
||||
}) {
|
||||
let categoryList = [];
|
||||
let currentId = 0;
|
||||
let articleList = [];
|
||||
let count = 0;
|
||||
let dataNull = true;
|
||||
const banner = $get("ad_content/lists", {
|
||||
params: {
|
||||
pid: 28,
|
||||
terminal: 2
|
||||
}
|
||||
});
|
||||
let res = await $get("article/category");
|
||||
const {
|
||||
data: bannerList
|
||||
} = await banner;
|
||||
if (res.code == 1) {
|
||||
categoryList = res.data;
|
||||
currentId = 0
|
||||
let listsRes = await $get("article/lists", {
|
||||
params: {
|
||||
cid: currentId,
|
||||
page_size: 10
|
||||
}
|
||||
});
|
||||
if (listsRes.code == 1) {
|
||||
articleList = listsRes.data.list;
|
||||
count = listsRes.data.count
|
||||
if (count <= 0) {
|
||||
dataNull = true;
|
||||
} else {
|
||||
dataNull = false
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
categoryList,
|
||||
articleList,
|
||||
count,
|
||||
currentId,
|
||||
bannerList,
|
||||
dataNull,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
categoryList: [],
|
||||
articleList: [],
|
||||
currentId: -1,
|
||||
count: 0,
|
||||
swiperOptions: {
|
||||
width: 1180,
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log(this.articleList, 'articleList')
|
||||
},
|
||||
methods: {
|
||||
async changePage(current) {
|
||||
let res = await this.$get("article/lists", {
|
||||
params: {
|
||||
cid: this.currentId,
|
||||
page_no: current,
|
||||
page_size: 10
|
||||
}
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.articleList = res.data.list;
|
||||
if (this.articleList.length <= 0) {
|
||||
dataNull = true;
|
||||
} else {
|
||||
dataNull = false
|
||||
}
|
||||
}
|
||||
},
|
||||
changeList(id) {
|
||||
this.currentId = id;
|
||||
this.changePage(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.help-center-container {
|
||||
.help-center-banner {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.help-center-box {
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.help-center-aside {
|
||||
width: 160px;
|
||||
// min-height: 635px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
padding: 20px 30px;
|
||||
|
||||
.nav {
|
||||
li {
|
||||
margin: 10px 0px;
|
||||
padding: 0px 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.active-item {
|
||||
padding-left: 27px;
|
||||
color: $--color-primary;
|
||||
border-left: 3px solid $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.article-lists-container {
|
||||
width: 1004px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
|
||||
.article-item {
|
||||
margin: 0px 20px;
|
||||
padding: 15px 0px;
|
||||
border-bottom: 1px solid #E5E5E5;
|
||||
cursor: pointer;
|
||||
|
||||
.article-name {
|
||||
margin-bottom: 11px;
|
||||
margin-top: 13px;
|
||||
max-width: 720px;
|
||||
}
|
||||
}
|
||||
|
||||
.help-center-pagination {
|
||||
padding-top: 38px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.data-null {
|
||||
padding-top: 150px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .btn-prev {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .btn-next {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-pagination.is-background .el-pager li {
|
||||
background: #fff;
|
||||
padding: 0 10px;
|
||||
}
|
||||
</style>
|
|
@ -1,189 +0,0 @@
|
|||
<template>
|
||||
<div class="news-details-container mt16">
|
||||
<div class="nav-container flex">
|
||||
<div class="nr" style="width: 70px">当前位置:</div>
|
||||
<el-breadcrumb style="flex: 1;" separator="/">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>
|
||||
<nuxt-link to="/news_list">商城资讯</nuxt-link>
|
||||
</el-breadcrumb-item>
|
||||
<el-breadcrumb-item class="line1" style="max-width: 800px;">{{detailsObj.title}}</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div class="news-detail-box m-r-16">
|
||||
<div class="content-header bg-white">
|
||||
<div class="news-detail-title">
|
||||
{{detailsObj.title}}
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="sm muted">
|
||||
发布时间:{{detailsObj.create_time}}
|
||||
</div>
|
||||
<div class="flex" style="margin-left: 40px">
|
||||
<i class="el-icon-view muted"></i>
|
||||
<div class="muted" style="margin-left: 3px;">{{detailsObj.visit}} 人浏览</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-html-box bg-white">
|
||||
<div v-html="detailsObj.content"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="recommend-box">
|
||||
<div class="recommend-box-header flex bg-white">
|
||||
<div class="primary-line"></div>
|
||||
<div class="xxl" style="font-weight: 500">为您推荐</div>
|
||||
</div>
|
||||
<div class="recommend-box-content bg-white">
|
||||
<div class="recommend-list-container">
|
||||
<div class="recommend-list-item" v-for="(item) in recommend_list" :key="item.id"
|
||||
@click="toOther(item.id)">
|
||||
<el-image style="width: 244px; height:183px;border-radius: 6px" fit="cover"
|
||||
:src="item.image" />
|
||||
<div class="goods-info">
|
||||
<div class="line2 goods-name">{{item.title}}</div>
|
||||
<div class="flex" style="margin-top: 10px">
|
||||
<i class="el-icon-view muted"></i>
|
||||
<div class="muted xs" style="margin-left: 4px;">{{item.visit}} 人浏览</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon
|
||||
}],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
$post,
|
||||
query
|
||||
}) {
|
||||
let detailsObj = {};
|
||||
let recommend_list = [];
|
||||
let res = await $get("pc/articleDetail", {
|
||||
params: {
|
||||
id: query.id,
|
||||
client: 2
|
||||
}
|
||||
});
|
||||
if (res.code == 1) {
|
||||
detailsObj = res.data;
|
||||
recommend_list = res.data.recommend_list
|
||||
}
|
||||
return {
|
||||
detailsObj,
|
||||
recommend_list,
|
||||
};
|
||||
},
|
||||
watchQuery: ['id'],
|
||||
data() {
|
||||
return {
|
||||
recommend_list: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log('route', this.$route)
|
||||
// this.getNewsDetails(this.$route.query.id);
|
||||
},
|
||||
methods: {
|
||||
// async getNewsDetails(id) {
|
||||
// let res = await this.$get("article/detail", {params: {id: id, client: 2}});
|
||||
// if(res.code == 1) {
|
||||
// this.detailsObj = res.data;
|
||||
// this.recommend_list = res.data.recommend_list
|
||||
// }
|
||||
// },
|
||||
toOther(id) {
|
||||
this.$router.push('/news_list/news_list_detail?id=' + id)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.news-details-container {
|
||||
.nav-container {
|
||||
padding: 15px 16px;
|
||||
}
|
||||
|
||||
.content-box {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.news-detail-box {
|
||||
background-color: #FFFFFF;
|
||||
width: 900px;
|
||||
|
||||
.content-header {
|
||||
margin: 0px 20px;
|
||||
padding: 20px 0px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.news-detail-title {
|
||||
color: #222;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
margin-bottom: 43px;
|
||||
}
|
||||
}
|
||||
|
||||
.content-html-box {
|
||||
padding: 24px 20px;
|
||||
|
||||
&>div {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
|
||||
::v-deep img {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box {
|
||||
width: 264px;
|
||||
|
||||
.recommend-box-header {
|
||||
padding: 15px 10px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.primary-line {
|
||||
margin-right: 10px;
|
||||
background-color: $--color-primary;
|
||||
width: 4px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.recommend-box-content {
|
||||
.recommend-list-container {
|
||||
.recommend-list-item {
|
||||
padding: 10px;
|
||||
cursor: pointer;
|
||||
|
||||
.goods-info {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,303 +0,0 @@
|
|||
<template>
|
||||
<div class="payment bg-white">
|
||||
<div class="payment-hd flex">
|
||||
<template v-if="order.pay_status == 0">
|
||||
<img src="~/static/images/pay_wait.png" alt="" />
|
||||
<div class="status m-l-8 m-r-16 weight-500">
|
||||
{{ getOrderStatus(order.order_status) }}
|
||||
</div>
|
||||
<div
|
||||
v-if="getCancelTime(order.cancel_time) > 0"
|
||||
class="flex"
|
||||
>
|
||||
请在
|
||||
<count-down
|
||||
:time="getCancelTime(order.cancel_time)"
|
||||
format="hh时mm分ss秒"
|
||||
:style="{ color: '#FF2C3C' }"
|
||||
@finish="getOrder"
|
||||
/>
|
||||
完成支付, 超时后将取消订单
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="order.pay_status == 1">
|
||||
<img src="~/static/images/pay_success.png" alt="" />
|
||||
<div class="status m-l-8 m-r-16 weight-500">支付成功</div>
|
||||
</template>
|
||||
</div>
|
||||
<div class="payment-con">
|
||||
<div class="item flex m-b-16">订单编号:{{ order.order_sn }}</div>
|
||||
<div class="item flex m-b-16">
|
||||
订单价格:<span class="primary"
|
||||
>¥{{ order.total_amount }}</span
|
||||
>
|
||||
</div>
|
||||
<div class="item flex m-b-16">
|
||||
收货地址:
|
||||
<div>
|
||||
{{ address.contact }} {{ address.mobile }}
|
||||
<span class="m-l-16">{{ address.delivery_address }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item flex m-b-16">
|
||||
商品名称:
|
||||
<div>
|
||||
<div
|
||||
v-for="(item, index) in order.order_goods"
|
||||
:key="index"
|
||||
>
|
||||
<div class="flex lin-1">
|
||||
【商品{{index + 1}}】- {{ item.goods_name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="payment-footer">
|
||||
<template v-if="order.pay_status == 0 && order.order_status == 0">
|
||||
<div class="title lg weight-500">请选择支付方式</div>
|
||||
<div class="flex m-t-16">
|
||||
<div
|
||||
class="pay-way flex row-center"
|
||||
v-for="(item, index) in payWayArr"
|
||||
:key="index"
|
||||
@click="orderPay(item.pay_way)"
|
||||
>
|
||||
<img :src="item.image" alt="" />
|
||||
<div class="m-l-16">
|
||||
<span class="md">{{ item.name }}</span>
|
||||
<div class="muted m-t-2 sm">{{item.extra}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<nuxt-link v-else class="btn flex row-center" to="/user/order"
|
||||
>查看订单</nuxt-link
|
||||
>
|
||||
</div>
|
||||
<el-dialog
|
||||
title="微信支付"
|
||||
:visible.sync="showWxpay"
|
||||
width="700px"
|
||||
center
|
||||
@close="clearTimer"
|
||||
>
|
||||
<div class="flex-col col-center black">
|
||||
<img class="pay-code" :src="payInfo" alt="" />
|
||||
<div class="m-t-8" style="font-size: 18px">
|
||||
微信扫一扫,完成支付
|
||||
</div>
|
||||
<div class="pay-money flex">
|
||||
<span>需支付金额:</span>
|
||||
<span class="primary">
|
||||
<price-formate
|
||||
:price="order.total_amount"
|
||||
:subscript-size="18"
|
||||
:first-size="28"
|
||||
:second-size="28"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { client } from '@/utils/type'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
async asyncData({ query, $get }) {
|
||||
const { data } = await $get('order/getPayStatus', {
|
||||
params: {
|
||||
id: query.id,
|
||||
from: query.from
|
||||
},
|
||||
})
|
||||
return { order: data, address: data.address }
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showWxpay: false,
|
||||
showAlipay: false,
|
||||
payWayArr: [],
|
||||
payInfo: {},
|
||||
cancelTime: 0,
|
||||
alipayHtml: '',
|
||||
address: {}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.id = this.$route.query.id
|
||||
this.from = this.$route.query.from
|
||||
this.getPayway()
|
||||
},
|
||||
beforeDestroy() {
|
||||
clearInterval(this.timer)
|
||||
},
|
||||
methods: {
|
||||
async getPayway() {
|
||||
const { code, data } = await this.$get('order/getPayWay', {
|
||||
params: { from: 'order', order_id: this.id },
|
||||
})
|
||||
if (code == 1) {
|
||||
this.payWayArr = data.pay_way
|
||||
if (!this.payWayArr.length)
|
||||
this.$message({
|
||||
message: '请联系管理员配置支付方式',
|
||||
type: 'error',
|
||||
})
|
||||
}
|
||||
},
|
||||
async orderPay(payWay) {
|
||||
const { data, code, msg } = await this.$post('pay/unifiedpay', {
|
||||
order_id: this.id,
|
||||
pay_way: payWay,
|
||||
from: this.from,
|
||||
})
|
||||
if (code == 1) {
|
||||
this.payInfo = data
|
||||
this.showWxpay = true
|
||||
this.createTimer()
|
||||
} else if (code == 10001) {
|
||||
let divForm = document.getElementsByTagName('divform')
|
||||
if (divForm.length) {
|
||||
document.body.removeChild(divForm[0])
|
||||
}
|
||||
const div = document.createElement('divform')
|
||||
div.innerHTML = data // data就是接口返回的form 表单字符串
|
||||
document.body.appendChild(div)
|
||||
document.forms[0].submit()
|
||||
} else if (code == 20001) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: 'success',
|
||||
})
|
||||
this.getOrder()
|
||||
}
|
||||
},
|
||||
clearTimer() {
|
||||
clearInterval(this.timer)
|
||||
},
|
||||
createTimer() {
|
||||
if (this.timer) clearInterval(this.timer)
|
||||
this.timer = setInterval(() => {
|
||||
this.getOrder()
|
||||
}, 2000)
|
||||
},
|
||||
async getOrder() {
|
||||
const { data, code, msg } = await this.$get('order/getPayStatus', {
|
||||
params: {
|
||||
id: this.id,
|
||||
from: this.from,
|
||||
},
|
||||
})
|
||||
if (code == 1) {
|
||||
this.order = data
|
||||
if (data.pay_status == 1) {
|
||||
clearInterval(this.timer)
|
||||
this.showWxpay = false
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
getOrderStatus() {
|
||||
return (status) => {
|
||||
let text = ''
|
||||
switch (status) {
|
||||
case 0:
|
||||
text = '待支付'
|
||||
break
|
||||
case 1:
|
||||
text = '待发货'
|
||||
break
|
||||
case 2:
|
||||
text = '待收货'
|
||||
break
|
||||
case 3:
|
||||
text = '已完成'
|
||||
break
|
||||
case 4:
|
||||
text = '订单已关闭'
|
||||
break
|
||||
}
|
||||
return text
|
||||
}
|
||||
},
|
||||
getCancelTime() {
|
||||
return (time) => time - Date.now() / 1000
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.payment {
|
||||
margin: 16px 0;
|
||||
padding: 0 40px;
|
||||
|
||||
.payment-hd {
|
||||
> img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
.status {
|
||||
font-size: 24px;
|
||||
}
|
||||
}
|
||||
.payment-con,
|
||||
.payment-hd {
|
||||
padding: 32px 0;
|
||||
border-bottom: 1px dashed $--border-color-base;
|
||||
}
|
||||
.payment-con {
|
||||
.item {
|
||||
align-items: flex-start;
|
||||
}
|
||||
}
|
||||
.payment-footer {
|
||||
padding: 32px 0;
|
||||
.pay-way {
|
||||
min-width: 200px;
|
||||
padding: 0 20px;
|
||||
height: 68px;
|
||||
cursor: pointer;
|
||||
margin-right: 32px;
|
||||
border: 1px dashed $--border-color-base;
|
||||
img {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
.btn {
|
||||
width: 134px;
|
||||
height: 40px;
|
||||
border: 1px solid $--border-color-base;
|
||||
}
|
||||
}
|
||||
.el-dialog {
|
||||
.pay-code {
|
||||
width: 270px;
|
||||
height: 270px;
|
||||
}
|
||||
.pay-money {
|
||||
font-size: 18px;
|
||||
margin-top: 24px;
|
||||
align-items: baseline;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,326 +0,0 @@
|
|||
<template>
|
||||
<div class="category">
|
||||
<div class="category-hd bg-white">
|
||||
<div class="category-wrap">
|
||||
<div class="category-con flex">
|
||||
<div class="name muted">全部分类:</div>
|
||||
<div class="category-list flex flex-wrap lighter">
|
||||
<div
|
||||
:class="[
|
||||
'item line1',
|
||||
{ active: threeIndex === index },
|
||||
]"
|
||||
v-for="(item, index) in categoryThree"
|
||||
:key="index"
|
||||
@click="changeData(item.id,index)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sort flex bg-white">
|
||||
<div class="title muted">排序方式:</div>
|
||||
<div class="sort-name m-l-16 flex lighter">
|
||||
<div
|
||||
:class="['item', { active: sortType == '' }]"
|
||||
@click="changeSortType('')"
|
||||
>
|
||||
综合
|
||||
</div>
|
||||
<div
|
||||
:class="['item', { active: sortType == 'price' }]"
|
||||
@click="changeSortType('price')"
|
||||
>
|
||||
价格
|
||||
<i
|
||||
v-show="priceSort == 'desc'"
|
||||
class="el-icon-arrow-down"
|
||||
></i>
|
||||
<i
|
||||
v-show="priceSort == 'asc'"
|
||||
class="el-icon-arrow-up"
|
||||
></i>
|
||||
</div>
|
||||
<div
|
||||
:class="['item', { active: sortType == 'sales_sum' }]"
|
||||
@click="changeSortType('sales_sum')"
|
||||
>
|
||||
销量
|
||||
<i
|
||||
v-show="saleSort == 'desc'"
|
||||
class="el-icon-arrow-down"
|
||||
></i>
|
||||
<i
|
||||
v-show="saleSort == 'asc'"
|
||||
class="el-icon-arrow-up"
|
||||
></i>
|
||||
</div>
|
||||
|
||||
|
||||
<div
|
||||
:class="['item', { active: sortType == 'brand' && brandList.length}]"
|
||||
@click="changeSortType('brand')"
|
||||
>
|
||||
品牌
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 品牌 -->
|
||||
<div class="sort flex bg-white" v-show="sortType == 'brand' && brandList.length > 0">
|
||||
<div class="category-con flex" style="padding-top: 0;">
|
||||
<div class="name muted">品牌:</div>
|
||||
<div class="category-list flex flex-wrap lighter">
|
||||
<div
|
||||
:class="['item', { active: brandIndex == index }]"
|
||||
@click="getBrandGoods(index)" v-for="(item,index) in brandList" :key="index"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div v-if="isHasGoods" class="goods-list">
|
||||
<goods-list :list="goodsList" />
|
||||
<div
|
||||
class="pagination flex row-center"
|
||||
style="padding-bottom: 38px"
|
||||
v-if="count"
|
||||
>
|
||||
<el-pagination
|
||||
background
|
||||
hide-on-single-page
|
||||
layout="prev, pager, next"
|
||||
:total="count"
|
||||
prev-text="上一页"
|
||||
next-text="下一页"
|
||||
:page-size="20"
|
||||
@current-change="changePage"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
<null-data
|
||||
v-else
|
||||
:img="require('@/static/images/goods_null.png')"
|
||||
text="暂无商品~"
|
||||
></null-data>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { trottle } from '~/utils/tools'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
watchQuery: true,
|
||||
async asyncData({ query, $get }) {
|
||||
let { data } = await $get('goodsCategory/getThirdListByKeyword',{
|
||||
params: {
|
||||
keyword:query.name,
|
||||
},
|
||||
})
|
||||
return {
|
||||
categoryList: data,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
count: 0,
|
||||
threeIndex: 0,
|
||||
brandIndex:-1,
|
||||
categoryThree: [],
|
||||
sortType: '',
|
||||
saleSort: 'desc',
|
||||
priceSort: 'desc',
|
||||
brandSort:'desc',
|
||||
page: '',
|
||||
goodsList: [],
|
||||
cateId: 0,
|
||||
isHasGoods: true,
|
||||
brandList:[],//品牌列表
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.changeSortType = trottle(this.changeSortType, 500, this)
|
||||
},
|
||||
methods: {
|
||||
changeData(id,index) {
|
||||
const { categoryList } = this
|
||||
this.categoryThree = categoryList;
|
||||
this.threeIndex = index || 0;
|
||||
this.cateId = id || categoryList[this.threeIndex].id;
|
||||
this.getGoods();
|
||||
this.brandIndex = '-1';
|
||||
this.sortType = '';
|
||||
this.brandList = [];
|
||||
},
|
||||
|
||||
changeSortType(type) {
|
||||
this.sortType = type
|
||||
switch (type) {
|
||||
case 'price':
|
||||
if (this.priceSort == 'asc') {
|
||||
this.priceSort = 'desc'
|
||||
} else if (this.priceSort == 'desc') {
|
||||
this.priceSort = 'asc'
|
||||
}
|
||||
break
|
||||
case 'sales_sum':
|
||||
if (this.saleSort == 'asc') {
|
||||
this.saleSort = 'desc'
|
||||
} else if (this.saleSort == 'desc') {
|
||||
this.saleSort = 'asc'
|
||||
}
|
||||
break
|
||||
case 'brand':
|
||||
if (this.brandSort == 'asc') {
|
||||
this.brandSort = 'desc'
|
||||
} else if (this.brandSort == 'desc') {
|
||||
this.brandSort = 'asc'
|
||||
}
|
||||
break
|
||||
default:
|
||||
}
|
||||
if(this.sortType == 'brand') {
|
||||
this.getBrand() //获取品牌
|
||||
}else {
|
||||
this.getGoods()
|
||||
}
|
||||
|
||||
},
|
||||
changePage(current) {
|
||||
this.page = current
|
||||
this.getGoods()
|
||||
},
|
||||
async getGoods() {
|
||||
const { priceSort, sortType, saleSort } = this
|
||||
const params = {
|
||||
page_size: 20,
|
||||
page_no: this.page,
|
||||
platform_cate_id: this.cateId,
|
||||
}
|
||||
switch (sortType) {
|
||||
case 'price':
|
||||
params.sort_by_price = priceSort
|
||||
break
|
||||
case 'sales_sum':
|
||||
params.sort_by_sales = saleSort
|
||||
break
|
||||
}
|
||||
if(this.brandIndex >= 0) {
|
||||
params.brand_id = this.brandList[this.brandIndex].brand_id;
|
||||
}
|
||||
const {
|
||||
data: { lists, count },
|
||||
} = await this.$get('goods/getGoodsList', {
|
||||
params,
|
||||
})
|
||||
this.goodsList = lists
|
||||
if (!lists.length) {
|
||||
this.isHasGoods = false
|
||||
} else {
|
||||
this.isHasGoods = true
|
||||
}
|
||||
this.count = count
|
||||
},
|
||||
// 获取品牌
|
||||
async getBrand() {
|
||||
const params = {
|
||||
page_size: 20,
|
||||
page_no: this.page,
|
||||
cate_id: this.cateId,
|
||||
}
|
||||
const {
|
||||
data
|
||||
} = await this.$get('goods/getBrandListByCateId', {
|
||||
params,
|
||||
})
|
||||
this.brandList = data
|
||||
},
|
||||
|
||||
// 获取品牌商品列表
|
||||
getBrandGoods(index) {
|
||||
this.brandIndex = index;
|
||||
this.getGoods();
|
||||
},
|
||||
},
|
||||
|
||||
watch: {
|
||||
categoryList: {
|
||||
immediate: true,
|
||||
handler(value) {
|
||||
const { id } = this.$route.query
|
||||
this.changeData(Number(id));
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.category {
|
||||
padding: 16px 0;
|
||||
.category-hd {
|
||||
.category-wrap {
|
||||
padding: 0 16px;
|
||||
}
|
||||
.category-con {
|
||||
border-bottom: 1px dashed #e5e5e5;
|
||||
align-items: flex-start;
|
||||
padding-top: 16px;
|
||||
word-wrap: break-word;
|
||||
.name {
|
||||
flex: none;
|
||||
}
|
||||
.item {
|
||||
margin-bottom: 16px;
|
||||
width: 140px;
|
||||
margin-left: 14px;
|
||||
cursor: pointer;
|
||||
&.active {
|
||||
color: $--color-primary;
|
||||
}
|
||||
&:hover {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
.sort {
|
||||
padding: 15px 16px;
|
||||
.sort-name {
|
||||
.item {
|
||||
margin-right: 30px;
|
||||
cursor: pointer;
|
||||
&.active {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.brand-list {
|
||||
border-top: 1px dashed #e5e5e5;
|
||||
}
|
||||
}
|
||||
|
||||
.goods-list {
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
|
@ -1,195 +0,0 @@
|
|||
<template>
|
||||
<div class="seckill">
|
||||
<div class="banner mt16 column">
|
||||
<ad-item :item="ad" v-if="ad.image"></ad-item>
|
||||
<el-image v-else :src="require('~/static/images/seckill_banner.png')"></el-image>
|
||||
</div>
|
||||
<div class="time-list">
|
||||
<client-only>
|
||||
<swiper class="swiper" ref="mySwiper" :options="swiperOptions">
|
||||
<swiper-slide :class="{ 'swiper-item': true, active: index === swiperIndex }"
|
||||
v-for="(item, index) in timeList" :key="index">
|
||||
<div class=" white" style="width: 100%; height: 100%" @click="changeTime(index)">
|
||||
<div class="weight-500 xxl flex row-center">{{ item.start_time }}</div>
|
||||
<div class="xs time-status flex row-center">{{ item.tips }}</div>
|
||||
</div>
|
||||
</swiper-slide>
|
||||
<div class="swiper-button-prev" slot="button-prev"></div>
|
||||
<div class="swiper-button-next" slot="button-next"></div>
|
||||
</swiper>
|
||||
</client-only>
|
||||
</div>
|
||||
<div class="goods m-t-16">
|
||||
<template v-if="hasData">
|
||||
<goods-list type="seckill" :list="goodsList" :status="status" />
|
||||
<div class="pagination row-center" style="padding-bottom: 38px" v-if="count">
|
||||
<el-pagination background layout="prev, pager, next" :total="count" prev-text="上一页" next-text="下一页"
|
||||
hide-on-single-page :page-size="10" @current-change="changePage">
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<null-data v-else :img="require('~/static/images/goods_null.png')" text="暂无秒杀~"></null-data>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import goodsList from "../components/goods-list.vue"
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
components: {
|
||||
goodsList
|
||||
},
|
||||
watchQuery: true,
|
||||
async asyncData({ $get }) {
|
||||
let ad = {}
|
||||
const banner = await $get("ad_content/lists",{params: {
|
||||
pid: 24,
|
||||
terminal: 2
|
||||
}});
|
||||
if(banner.data.length) {
|
||||
ad = {
|
||||
image: banner.data[0].image
|
||||
}
|
||||
}
|
||||
|
||||
const { data } = await $get("seckill_goods/getSeckillTime");
|
||||
console.log(data)
|
||||
let swiperIndex = data.findIndex((item) => item.status == 1);
|
||||
if (swiperIndex == -1) {
|
||||
swiperIndex = data.findIndex((item) => item.status == 2);
|
||||
}
|
||||
return { timeList: data, swiperIndex, ad };
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
ad: {
|
||||
image: 0
|
||||
},
|
||||
page: 1,
|
||||
swiperIndex: 0,
|
||||
count: 0,
|
||||
goodsList: [],
|
||||
timeList: [],
|
||||
hasData: true,
|
||||
swiperOptions: {
|
||||
initialSlide: 0,
|
||||
pagination: {
|
||||
el: ".swiper-pagination",
|
||||
clickable: true,
|
||||
},
|
||||
navigation: {
|
||||
nextEl: ".swiper-button-next",
|
||||
prevEl: ".swiper-button-prev",
|
||||
},
|
||||
preventClicks: true,
|
||||
slidesPerView: "auto",
|
||||
},
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.swiperOptions.initialSlide = this.swiperIndex;
|
||||
this.getGoods();
|
||||
},
|
||||
methods: {
|
||||
changeTime(index) {
|
||||
this.swiperIndex = index;
|
||||
this.getGoods();
|
||||
this.page = 1;
|
||||
this.goodsList = [];
|
||||
},
|
||||
changePage(current) {
|
||||
this.page = current;
|
||||
this.getGoods();
|
||||
},
|
||||
async getGoods() {
|
||||
const { swiperIndex, timeList, page } = this;
|
||||
const id = timeList[swiperIndex] ? timeList[swiperIndex].id : -1;
|
||||
const {
|
||||
data: { lists, count },
|
||||
code,
|
||||
} = await this.$get("seckill_goods/getSeckillGoods", {
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: page,
|
||||
seckill_id: id,
|
||||
},
|
||||
});
|
||||
if (code == 1) {
|
||||
this.goodsList = lists;
|
||||
this.hasData = !!lists.length;
|
||||
this.count = count;
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
status() {
|
||||
const { swiperIndex, timeList } = this;
|
||||
return timeList[swiperIndex] ? timeList[swiperIndex].status : -1;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.seckill {
|
||||
.banner {
|
||||
img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
.time-list {
|
||||
background-color: #414141;
|
||||
.swiper {
|
||||
padding: 0 40px;
|
||||
--swiper-navigation-size: 20px;
|
||||
--swiper-navigation-color: #fff;
|
||||
.swiper-button-next,
|
||||
.swiper-button-prev {
|
||||
top: 0;
|
||||
width: 25px;
|
||||
height: 100%;
|
||||
margin-top: 0;
|
||||
background-size: 12px 22px;
|
||||
}
|
||||
.swiper-button-prev {
|
||||
left: 0;
|
||||
}
|
||||
.swiper-button-next {
|
||||
right: 0;
|
||||
}
|
||||
.swiper-item {
|
||||
cursor: pointer;
|
||||
height: 60px;
|
||||
width: 120px;
|
||||
padding: 10px 0;
|
||||
display: inline-block;
|
||||
&.active {
|
||||
color: #fff;
|
||||
background-color: $--color-primary;
|
||||
.time-status {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
.time-status {
|
||||
color: #ccc;
|
||||
border-radius: 60px;
|
||||
padding: 1px 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,479 +0,0 @@
|
|||
<template>
|
||||
<div class="shop-cart">
|
||||
<div class="cart-list">
|
||||
<div v-show="!isDataNull">
|
||||
<div class="cart-hd flex bg-white">
|
||||
<div class="check-box">
|
||||
<!-- 更改选中状态 type为1选中店铺/2选中商品/3全选 -->
|
||||
<el-checkbox
|
||||
v-model="isSelectedAll"
|
||||
@change="onBoxClick($event, 3, '')"
|
||||
>全选</el-checkbox
|
||||
>
|
||||
</div>
|
||||
<div class="info flex row-center">商品信息</div>
|
||||
<div class="price flex row-center">单价</div>
|
||||
<div class="num flex row-center">数量</div>
|
||||
<div class="money flex row-center">合计</div>
|
||||
<div class="operate flex row-center">操作</div>
|
||||
</div>
|
||||
|
||||
<div class="cart-con bg-white">
|
||||
<div
|
||||
class="m-b-10 bg-white"
|
||||
v-for="(item, index) in shopCartList"
|
||||
:key="index"
|
||||
>
|
||||
<div class="flex shop">
|
||||
<!-- 更改选中状态 type为1选中店铺/2选中商品/3全选 -->
|
||||
<el-checkbox
|
||||
:value="item.is_selected == 1"
|
||||
@change="onBoxClick($event, 1, index)"
|
||||
>
|
||||
</el-checkbox>
|
||||
|
||||
<div class="xs normal m-l-10">
|
||||
{{ item.shop.shop_name }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="item flex"
|
||||
v-for="(item2, index2) in item.cart"
|
||||
:key="index2"
|
||||
>
|
||||
<div class="check-box">
|
||||
<!-- 更改选中状态 type为1选中店铺/2选中商品/3全选 -->
|
||||
<el-checkbox
|
||||
:value="item2.selected == 1"
|
||||
@change="
|
||||
onBoxClick($event, 2, item2.cart_id)
|
||||
"
|
||||
>
|
||||
</el-checkbox>
|
||||
</div>
|
||||
<nuxt-link
|
||||
class="info flex"
|
||||
:to="'/goods_details/' + item2.goods_id"
|
||||
>
|
||||
<div class="pictrue flexnone">
|
||||
<img :src="item2.image" alt="" />
|
||||
</div>
|
||||
<div>
|
||||
<div class="name line2">
|
||||
{{ item2.goods_name }}
|
||||
</div>
|
||||
<div class="muted">
|
||||
{{ item2.spec_value_str }}
|
||||
</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
<div class="price flex row-center">
|
||||
¥{{ item2.price }}
|
||||
</div>
|
||||
<div class="num flex row-center">
|
||||
<number-box
|
||||
:min="1"
|
||||
v-model="item2.goods_num"
|
||||
@change="
|
||||
changeShopCartCount(
|
||||
$event,
|
||||
item2.cart_id
|
||||
)
|
||||
"
|
||||
async-change
|
||||
/>
|
||||
</div>
|
||||
<div class="money flex row-center">
|
||||
¥{{ item2.sub_price }}
|
||||
</div>
|
||||
<el-popconfirm
|
||||
title="确定删除该商品吗?"
|
||||
confirm-button-text="确定"
|
||||
cancel-button-text="取消"
|
||||
icon="el-icon-info"
|
||||
icon-color="red"
|
||||
@confirm="goodsDelete(item2.cart_id)"
|
||||
>
|
||||
<div
|
||||
class="operate flex row-center delete-btn"
|
||||
slot="reference"
|
||||
>
|
||||
<img
|
||||
src="~/static/images/icon_cart_del.png"
|
||||
/>
|
||||
</div>
|
||||
</el-popconfirm>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cart-footer flex row-between bg-white">
|
||||
<div class="lighter flex">
|
||||
<div class="check-box">
|
||||
<el-checkbox
|
||||
v-model="isSelectedAll"
|
||||
@change="onBoxClick($event, 3, '')"
|
||||
>全选</el-checkbox
|
||||
>
|
||||
</div>
|
||||
<div style="margin: 0 24px"></div>
|
||||
<el-popconfirm
|
||||
title="确定删除选中商品吗?"
|
||||
confirm-button-text="确定"
|
||||
cancel-button-text="取消"
|
||||
icon="el-icon-info"
|
||||
icon-color="red"
|
||||
@confirm="deleteSelectedGoods"
|
||||
>
|
||||
<div
|
||||
class="xs normal"
|
||||
style="cursor: pointer"
|
||||
slot="reference"
|
||||
>
|
||||
删除选中商品
|
||||
</div>
|
||||
</el-popconfirm>
|
||||
<el-popconfirm
|
||||
title="确定清空吗?"
|
||||
confirm-button-text="确定"
|
||||
cancel-button-text="取消"
|
||||
icon="el-icon-info"
|
||||
icon-color="red"
|
||||
@confirm="deleteAlldGoods"
|
||||
>
|
||||
<div
|
||||
class="m-l-14 xs muted"
|
||||
style="cursor: pointer"
|
||||
slot="reference"
|
||||
>
|
||||
清空购物车
|
||||
</div>
|
||||
</el-popconfirm>
|
||||
</div>
|
||||
<div class="total flex">
|
||||
<div class="flex m-r-14">
|
||||
<div class="xs">已选{{ selected }}件商品</div>
|
||||
<div class="primary m-l-20" style="font-size: 22px">
|
||||
¥{{ totalAmount }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="white lg btn flex row-center"
|
||||
:style="{
|
||||
background:
|
||||
selected == 0 ? '#A4ADB3' : '#FF2C3C',
|
||||
}"
|
||||
@click="toOrderBuy"
|
||||
>
|
||||
去结算
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column-center data-null" v-show="isDataNull">
|
||||
<img
|
||||
src="@/static/images/cart_null.png"
|
||||
style="width: 150px; height: 150px"
|
||||
/>
|
||||
<div class="muted xs m-t-10">购物车是空的~</div>
|
||||
<div class="m-t-30">
|
||||
<el-button
|
||||
round
|
||||
type="primary"
|
||||
size="medium"
|
||||
@click="toIndex"
|
||||
>去逛逛~</el-button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapActions } from 'vuex'
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
shopCartList: [],
|
||||
totalAmount: 0,
|
||||
totalNum: 0,
|
||||
isDataNull: false,
|
||||
}
|
||||
},
|
||||
mounted() {},
|
||||
computed: {
|
||||
// 是否全选
|
||||
isSelectedAll: {
|
||||
get() {
|
||||
if (!this.shopCartList.length) return false
|
||||
if (this.allInvalid()) return false
|
||||
let index = this.shopCartList.findIndex(
|
||||
(item) => item.is_selected == 0
|
||||
)
|
||||
return index == -1 ? true : false
|
||||
},
|
||||
set(val) {
|
||||
return val
|
||||
},
|
||||
},
|
||||
// 已经选择的数量
|
||||
selected: {
|
||||
get() {
|
||||
return this.shopCartList.reduce((pre, item) => {
|
||||
return pre.concat(item.cart.filter((i) => i.selected == 1))
|
||||
}, []).length
|
||||
},
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['getPublicData']),
|
||||
async getCartList() {
|
||||
let res = await this.$get('cart/lists')
|
||||
if (res.code == 1) {
|
||||
this.shopCartList = Object.assign([], res.data.lists)
|
||||
this.totalAmount = res.data.total_amount
|
||||
this.totalNum = res.data.total_num
|
||||
|
||||
if (this.shopCartList.length > 0) {
|
||||
this.isDataNull = false
|
||||
} else {
|
||||
this.isDataNull = true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 更改选中状态 type为1选中店铺/2选中商品/3全选
|
||||
onBoxClick(e, type, number) {
|
||||
let cartId = []
|
||||
switch (type) {
|
||||
case 1:
|
||||
cartId = this.shopCartList[number].cart.map(
|
||||
(item) => item.cart_id
|
||||
)
|
||||
break
|
||||
case 2:
|
||||
cartId.push(number)
|
||||
break
|
||||
case 3:
|
||||
cartId = this.shopCartList.reduce((pre, item) => {
|
||||
return pre.concat(item.cart.map((i) => i.cart_id))
|
||||
}, cartId)
|
||||
break
|
||||
}
|
||||
this.changeSelected(cartId, e)
|
||||
},
|
||||
cartInvalid(item) {
|
||||
return item.goods_status == 0 || item.goods_del != 0 ? true : false
|
||||
},
|
||||
shopInvalid(item) {
|
||||
return item.cart.every((citem) => this.cartInvalid(citem))
|
||||
},
|
||||
allInvalid() {
|
||||
return this.shopCartList.every((item) => this.shopInvalid(item))
|
||||
},
|
||||
|
||||
// 选中/取消选中购物车
|
||||
async changeSelected(id, selected) {
|
||||
let res = await this.$post('cart/selected', {
|
||||
cart_id: id,
|
||||
selected: selected,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.getCartList()
|
||||
}
|
||||
},
|
||||
|
||||
// 修改购物车商品数量
|
||||
async changeShopCartCount(number, cartId) {
|
||||
let res = await this.$post('cart/change', {
|
||||
cart_id: cartId,
|
||||
goods_num: number,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.getCartList()
|
||||
this.getPublicData()
|
||||
}
|
||||
},
|
||||
// 删除购物车商品
|
||||
async goodsDelete(cartId) {
|
||||
let res = await this.$post('cart/del', {
|
||||
cart_id: cartId,
|
||||
})
|
||||
if (res.code == 1) {
|
||||
this.getPublicData()
|
||||
this.getCartList()
|
||||
this.$message({
|
||||
message: '删除商品成功',
|
||||
type: 'success',
|
||||
})
|
||||
}
|
||||
},
|
||||
// 删除选中购物车
|
||||
deleteSelectedGoods() {
|
||||
let selectedGoodsArr = this.shopCartList.reduce((pre, item) => {
|
||||
return pre.concat(item.cart.filter((i) => i.selected == 1))
|
||||
}, [])
|
||||
if (selectedGoodsArr.length <= 0) {
|
||||
this.$message({
|
||||
message: '没有选择商品',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
let cartIdArr = selectedGoodsArr.map((item) => item.cart_id)
|
||||
this.goodsDelete(cartIdArr)
|
||||
},
|
||||
// 清空购物车
|
||||
deleteAlldGoods() {
|
||||
let allGoodsArr = this.shopCartList.reduce((pre, item) => {
|
||||
return pre.concat(item.cart.filter((i) => i.cart_id))
|
||||
}, [])
|
||||
if (allGoodsArr.length <= 0) {
|
||||
this.$message({
|
||||
message: '没有商品',
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
let cartIdArr = allGoodsArr.map((item) => item.cart_id)
|
||||
this.goodsDelete(cartIdArr)
|
||||
},
|
||||
getSelectCart() {
|
||||
const { shopCartList } = this
|
||||
return shopCartList.reduce((pre, item) => {
|
||||
return pre.concat(
|
||||
item.cart
|
||||
.filter((i) => i.selected && !this.cartInvalid(i))
|
||||
.map((i) => i.cart_id)
|
||||
)
|
||||
}, [])
|
||||
},
|
||||
// 去购买商品
|
||||
toOrderBuy() {
|
||||
let { shopCartList } = this
|
||||
let goods = []
|
||||
let carts = this.getSelectCart()
|
||||
if (carts.length == 0) return this.$message.err('您还没有选择商品哦')
|
||||
// 处理出商品数组数据
|
||||
shopCartList.forEach((item) => {
|
||||
if (item.cart.length != 0) {
|
||||
item.cart.forEach((el, i) => {
|
||||
// 选中的商品才能进入
|
||||
if (el.selected == 1) {
|
||||
goods.push({
|
||||
item_id: el.item_id,
|
||||
num: el.goods_num,
|
||||
goods_id: el.goods_id,
|
||||
shop_id: item.shop.shop_id,
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
const params = {
|
||||
carts: carts,
|
||||
goods: goods,
|
||||
type: 'cart',
|
||||
}
|
||||
this.$router.push({
|
||||
path: '/confirm_order',
|
||||
query: {
|
||||
data: encodeURIComponent(JSON.stringify(params)),
|
||||
},
|
||||
})
|
||||
},
|
||||
toIndex() {
|
||||
this.$router.push('/')
|
||||
},
|
||||
},
|
||||
|
||||
created() {
|
||||
this.getCartList()
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.shop-cart {
|
||||
padding: 24px 0;
|
||||
.cart-list {
|
||||
min-height: 600px;
|
||||
.cart-hd {
|
||||
height: 50px;
|
||||
color: #101010;
|
||||
padding: 10px 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.cart-con {
|
||||
padding: 0 10px;
|
||||
.shop {
|
||||
padding: 20px 10px;
|
||||
border-bottom: 1px solid #d7d7d7;
|
||||
}
|
||||
.item {
|
||||
padding: 20px 10px;
|
||||
border-bottom: 1px dashed #e5e5e5;
|
||||
}
|
||||
.item:last-child {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
.check-box {
|
||||
padding-left: 10px;
|
||||
width: 40px;
|
||||
}
|
||||
.info {
|
||||
width: 450px;
|
||||
.pictrue {
|
||||
margin-right: 10px;
|
||||
img {
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
}
|
||||
}
|
||||
.name {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
.price {
|
||||
width: 150px;
|
||||
}
|
||||
.num {
|
||||
width: 250px;
|
||||
}
|
||||
.money {
|
||||
width: 150px;
|
||||
}
|
||||
.delete-btn {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.cart-footer {
|
||||
padding: 20px;
|
||||
.total {
|
||||
.btn {
|
||||
width: 152px;
|
||||
height: 50px;
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.data-null {
|
||||
text-align: center;
|
||||
padding-top: 170px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,160 +0,0 @@
|
|||
<!-- 店铺街 -->
|
||||
<template>
|
||||
<div class="street">
|
||||
<!-- 店铺卡片 -->
|
||||
<div class="shop-street flex flex-wrap flex-center">
|
||||
<div v-for="(item, index) in shopList" :key="index">
|
||||
<!-- 店铺卡片 -->
|
||||
<div class="shop-cart">
|
||||
<shop-item
|
||||
:cover="item.cover"
|
||||
:shopId="item.id"
|
||||
:logo="item.logo"
|
||||
:type="item.type"
|
||||
:name="item.name"
|
||||
:sales="item.on_sale_goods"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 分页栏 -->
|
||||
<div
|
||||
class=""
|
||||
style="padding-bottom: 38px; text-align: center"
|
||||
v-if="count"
|
||||
>
|
||||
<el-pagination
|
||||
background
|
||||
layout="prev, pager, next"
|
||||
:total="count"
|
||||
prev-text="上一页"
|
||||
next-text="下一页"
|
||||
hide-on-single-page
|
||||
:page-size="pageSize"
|
||||
@current-change="changePage"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
|
||||
async asyncData({ query, $get }) {
|
||||
const {
|
||||
data: { list, count },
|
||||
} = await $get('shop/getShopList', {
|
||||
params: {
|
||||
page_size: 8,
|
||||
page_no: 1,
|
||||
},
|
||||
})
|
||||
return {
|
||||
shopList: list,
|
||||
count: count,
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
shopList: [],
|
||||
count: 0,
|
||||
page: 1,
|
||||
pageSize: 8,
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
changePage(current) {
|
||||
this.page = current
|
||||
this.getShopList()
|
||||
},
|
||||
|
||||
async getShopList() {
|
||||
const { page, pageSize } = this
|
||||
const {
|
||||
data: { list, count },
|
||||
code,
|
||||
} = await this.$get('shop/getShopList', {
|
||||
params: {
|
||||
page_size: pageSize,
|
||||
page_no: page,
|
||||
},
|
||||
})
|
||||
if (code == 1) {
|
||||
this.shopList = list
|
||||
this.count = count
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.shop-street {
|
||||
width: 1180px;
|
||||
padding: 20px 0;
|
||||
|
||||
.shop-cart {
|
||||
width: 270px;
|
||||
height: 400px;
|
||||
// background-color: lightcoral;
|
||||
margin-bottom: 20px;
|
||||
|
||||
&:not(:nth-of-type(4n)) {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.shop-desc {
|
||||
width: 249px;
|
||||
height: 124px;
|
||||
background-color: #ffffff;
|
||||
margin-top: 247px;
|
||||
margin-bottom: 9px;
|
||||
border-radius: 6px;
|
||||
position: relative;
|
||||
|
||||
.shop-logo {
|
||||
position: absolute;
|
||||
top: -26px;
|
||||
left: 89px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.shop-name {
|
||||
margin-top: 52px;
|
||||
padding: 0 10px;
|
||||
margin-bottom: 4px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
color: #101010;
|
||||
}
|
||||
|
||||
.goods-num {
|
||||
width: 82px;
|
||||
height: 24px;
|
||||
text-align: center;
|
||||
background: #e5e5e5;
|
||||
padding-top: 4px;
|
||||
margin-bottom: 20px;
|
||||
font-size: 12px;
|
||||
border-radius: 4px;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,780 +0,0 @@
|
|||
<template>
|
||||
<div class="">
|
||||
<!-- 顶部 -->
|
||||
<div class="bg-white">
|
||||
<div class="flex flex-1 row-center col-center" style="width: 100%; height: 150px;" v-if="shopInfo.banner">
|
||||
<el-image :src="shopInfo.banner" fit="cover" style="height: 100%; width: 100%; max-width: 1920px;">
|
||||
</el-image>
|
||||
</div>
|
||||
<div class="wrapper1180 flex flex-1 col-center row-between" style="height: 40px">
|
||||
<div class="h-item flex row-center" :class="xuanIndex =='' ? 'h-item-x':''" @click="changeXuan('')">
|
||||
店铺首页
|
||||
</div>
|
||||
|
||||
<div class="flex row-left flex-1">
|
||||
<div class="h-item flex row-center" :class="xuanIndex =='all' ? 'h-item-x':''"
|
||||
@click="changeXuan('all')">
|
||||
全部商品
|
||||
</div>
|
||||
<!-- <div class="" v-for="(item, index) in goodsClassList" :key="index">
|
||||
<div class="h-item flex row-center" :class="xuanIndex == item.id ? 'h-item-x':''"
|
||||
@click="changeXuan(item.id)">
|
||||
{{item.name}}
|
||||
</div>
|
||||
</div> -->
|
||||
<!-- 商品分类 -->
|
||||
<swiper class="swiper flex row-left" ref="mySwiper" :options="swiperOptions"
|
||||
style="width: 672px; display: flex; justify-content: flex-start;margin: 0;">
|
||||
<swiper-slide class="swiper-item flex row-left" v-for="(itemd, indexd) in goodsClassListGroup"
|
||||
:key="indexd">
|
||||
<div class="flex">
|
||||
<div class="" v-for="(item, index) in itemd" :key="index">
|
||||
<div class="h-item flex row-center" :class="xuanIndex == item.id ? 'h-item-x':''"
|
||||
@click="changeXuan(item.id)">
|
||||
{{item.name}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</div>
|
||||
|
||||
<div class="search">
|
||||
<el-input v-model="keyword" placeholder="店铺搜索" @change="search" size="mini"></el-input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="shop-details flex col-top wrapper1180 flex-1">
|
||||
<!-- left -->
|
||||
<div class="left">
|
||||
<!-- 店铺介绍 -->
|
||||
<div class="shop bg-white">
|
||||
<div class="shop-logo flex-col col-center">
|
||||
<el-image class="logo-img" :src="shopInfo.logo"></el-image>
|
||||
<div class="m-t-10">
|
||||
<el-tag size="mini" v-if="shopInfo.type == 1">自营</el-tag>
|
||||
<span class="weight-500">{{ shopInfo.name }}</span>
|
||||
</div>
|
||||
<div class="xs muted m-t-10 line-5">
|
||||
{{shopInfo.intro}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex m-t-30">
|
||||
<div class="flex-1 text-center">
|
||||
<div class="xxl m-b-10">{{ shopInfo.on_sale_count }}</div>
|
||||
<div>全部商品</div>
|
||||
</div>
|
||||
<div class="flex-1 text-center">
|
||||
<div class="xxl m-b-10">{{ shopInfo.follow_num }}</div>
|
||||
<div>关注人数</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-divider></el-divider>
|
||||
<div class="flex xs m-b-16">
|
||||
<div class="m-r-12">店铺星级</div>
|
||||
<div class="m-t-5">
|
||||
<el-rate v-model="shopInfo.star" disabled> </el-rate>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex xs m-b-16">
|
||||
<div class="m-r-12">店铺评分</div>
|
||||
<div class="">{{ shopInfo.score }}分</div>
|
||||
</div>
|
||||
<div class="flex row-center row-between">
|
||||
<div class="flex row-center">
|
||||
<el-button size="mini" @click="shopFollow">{{
|
||||
shopInfo.shop_follow_status == 1 ? '已关注' : '关注店铺'
|
||||
}}</el-button>
|
||||
</div>
|
||||
<el-popover placement="bottom" width="200" trigger="hover">
|
||||
<div>
|
||||
<el-image style="width: 100%" :src="shopInfo.customer_image"></el-image>
|
||||
</div>
|
||||
|
||||
<div slot="reference" class="xs lighter text-center">
|
||||
<i class="el-icon-chat-dot-round nr"></i>
|
||||
<span>联系客服</span>
|
||||
</div>
|
||||
</el-popover>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 商品分类 -->
|
||||
<div class="m-t-10 bg-white">
|
||||
<div class="l-fen flex row-center" @click="getClassGoods('')"
|
||||
:class="gClassId == ''?'l-fen-select':''">
|
||||
全部商品
|
||||
</div>
|
||||
<div class="" v-for="(item, index) in goodsClassList" :key="index" @click="getClassGoods(item.id)">
|
||||
<div class="l-fen flex row-center" v-show="index < 4"
|
||||
:class="gClassId == item.id?'l-fen-select':''">
|
||||
{{item.name}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- right -->
|
||||
<div class="right m-l-15">
|
||||
<!-- 领券 -->
|
||||
<div class="bg-white" v-if="couponsList.length && xuanIndex == ''">
|
||||
<div class="coupon-list">
|
||||
<div class="m-b-10 flex row-between">
|
||||
<div class="">
|
||||
领券
|
||||
</div>
|
||||
<div class="flex row-center coupons-more" @click="more=!more" v-if="couponsList.length > 3">
|
||||
<div class="m-r-5">
|
||||
更多
|
||||
</div>
|
||||
<i :class="more?'el-icon-arrow-up':'el-icon-arrow-down'"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex" :class="more? 'swiper-item-zk':'swiper-item-c'">
|
||||
<div class="item" v-for="(item, index) in couponsList" :key="index">
|
||||
<div :class="[
|
||||
'info white',
|
||||
{ gray: item.is_get },
|
||||
]">
|
||||
<div class="info-hd flex">
|
||||
<div>
|
||||
<price-formate :price="item.money" :first-size="38" :second-size="38" />
|
||||
</div>
|
||||
<div class="m-l-8 flex1">
|
||||
<div class="line1">{{ item.name }}</div>
|
||||
<div class="xs line1">{{ item.condition_type_desc }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-time xs">{{ item.user_time_desc }}</div>
|
||||
</div>
|
||||
<div class="flex row-between coupon-button">
|
||||
<div class="tips-con xs lighter">
|
||||
{{ item.use_scene_desc }}
|
||||
</div>
|
||||
<div class="primary sm" @click="hqCoupon(item.id)" v-if="!item.is_get">
|
||||
立即领取
|
||||
</div>
|
||||
</div>
|
||||
<img v-if="item.is_get" class="receice" src="~/static/images/coupons_img_receive.png"
|
||||
alt="" />
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 店铺推荐 -->
|
||||
<div class="shop-list" v-if="recommend && xuanIndex == ''">
|
||||
<div class="m-b-10">
|
||||
店铺推荐
|
||||
</div>
|
||||
<el-carousel arrow="never" indicator-position="outside" trigger="click" height="300px"
|
||||
:autoplay="false">
|
||||
<el-carousel-item v-for="(itemd, indexd) in recommend" :key="indexd">
|
||||
<div class="flex">
|
||||
|
||||
<div class="shop-item" v-for="(itemg, indexg) in itemd" :key="indexg">
|
||||
<nuxt-link :to="`/goods_details/${itemg.id}`">
|
||||
<div class="">
|
||||
<div class="">
|
||||
<el-image :src="itemg.image" style="height: 200px; width: 200px;">
|
||||
</el-image>
|
||||
</div>
|
||||
<div class="name m-l-10 line-1">
|
||||
{{itemg.name}}
|
||||
</div>
|
||||
<div class="m-l-10 flex">
|
||||
<div class="primary m-r-8">
|
||||
<price-formate :price="itemg.min_price" :first-size="16" />
|
||||
</div>
|
||||
<div class="muted sm line-through">
|
||||
<price-formate :price="itemg.market_price" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
</div>
|
||||
<!-- 分类商品 -->
|
||||
<div :class="xuanIndex == ''? 'm-t-10':''">
|
||||
<div class="sort m-b-16 flex bg-white col-top" id="goods-sort">
|
||||
<div class="sort-title">排序方式:</div>
|
||||
<div class="sort-name m-l-16 flex">
|
||||
<div :class="['item', { active: sortType == '' }]" @click="changeSortType('')">
|
||||
综合
|
||||
</div>
|
||||
<div :class="['item', { active: sortType == 'price' }]" @click="changeSortType('price')">
|
||||
价格
|
||||
<i v-show="priceSort == 'desc'" class="el-icon-arrow-down"></i>
|
||||
<i v-show="priceSort == 'asc'" class="el-icon-arrow-up"></i>
|
||||
</div>
|
||||
<div :class="['item', { active: sortType == 'sales_sum' }]"
|
||||
@click="changeSortType('sales_sum')">
|
||||
销量
|
||||
<i v-show="saleSort == 'desc'" class="el-icon-arrow-down"></i>
|
||||
<i v-show="saleSort == 'asc'" class="el-icon-arrow-up"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="goodsList.length">
|
||||
<goods-list :list="goodsList" :num="4" />
|
||||
<div class="pagination flex m-t-30 row-center" style="padding-bottom: 38px" v-if="count">
|
||||
<el-pagination background layout="prev, pager, next" :total="count" prev-text="上一页"
|
||||
next-text="下一页" hide-on-single-page :page-size="20" @current-change="changePage">
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<null-data v-else :img="require('~/static/images/goods_null.png')" text="暂无商品~"></null-data>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
trottle
|
||||
} from "~/utils/tools";
|
||||
import {
|
||||
Message
|
||||
} from 'element-ui';
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
}, ],
|
||||
}
|
||||
},
|
||||
|
||||
layout: "street",
|
||||
|
||||
components: {},
|
||||
async asyncData({
|
||||
$get,
|
||||
query,
|
||||
}) {
|
||||
// 店铺信息
|
||||
const
|
||||
shopData = await $get("shop/getShopInfo", {
|
||||
params: {
|
||||
shop_id: query.id
|
||||
},
|
||||
});
|
||||
if (shopData.code == 1) {
|
||||
if (shopData.data.goods_list.length > 0) {
|
||||
var num = [];
|
||||
for (var i = 0; i < Math.ceil(shopData.data.goods_list.length / 4); i++) {
|
||||
var start = i * 4;
|
||||
var end = start + 4;
|
||||
num.push(shopData.data.goods_list.slice(start, end));
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('num', num)
|
||||
|
||||
// 获取优惠券
|
||||
const
|
||||
coupon = await $get("coupon/getCouponList", {
|
||||
params: {
|
||||
shop_id: query.id
|
||||
},
|
||||
});
|
||||
|
||||
// 商品分类
|
||||
const
|
||||
goodsClass = await $get("shop_goods_category/getShopGoodsCategory", {
|
||||
params: {
|
||||
shop_id: query.id
|
||||
},
|
||||
});
|
||||
|
||||
if (goodsClass.code == 1) {
|
||||
if (goodsClass.data.length > 0) {
|
||||
var group = [];
|
||||
for (var i = 0; i < Math.ceil(goodsClass.data.length / 6); i++) {
|
||||
var start = i * 6;
|
||||
var end = start + 6;
|
||||
group.push(goodsClass.data.slice(start, end));
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('group', group)
|
||||
|
||||
return {
|
||||
recommend: num, // 推荐列表
|
||||
shopInfo: shopData.data, // 商家信息
|
||||
goodsClassList: goodsClass.data, // 商品分类列表
|
||||
goodsClassListGroup: group, // 商品分类切割列表
|
||||
couponsList: coupon.data.lists, // 优惠券列表
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
goodsClassListGroup: [],
|
||||
recommend: [],
|
||||
couponsList: [],
|
||||
gClassId: '',
|
||||
shopInfo: [],
|
||||
goodsClassList: [],
|
||||
swiperOptions: {
|
||||
pagination: {
|
||||
el: '.swiper-pagination',
|
||||
clickable: true,
|
||||
},
|
||||
navigation: {
|
||||
nextEl: '.swiper-button-next',
|
||||
prevEl: '.swiper-button-prev',
|
||||
},
|
||||
preventClicks: true,
|
||||
slidesPerView: 'auto',
|
||||
autoplay: true,
|
||||
},
|
||||
|
||||
sortType: "",
|
||||
saleSort: "desc",
|
||||
priceSort: "desc",
|
||||
page: 1,
|
||||
count: 0,
|
||||
goodsList: [],
|
||||
|
||||
more: false,
|
||||
|
||||
keyword: '',
|
||||
xuanIndex: '',
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.getGoods();
|
||||
this.changeSortType = trottle(this.changeSortType, 500, this);
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 搜索商品
|
||||
search() {
|
||||
this.getGoods()
|
||||
|
||||
// 搜索后跳转到商品列表位置
|
||||
if(this.xuanIndex == '') {
|
||||
setTimeout(() => {
|
||||
document.getElementById('goods-sort').scrollIntoView()
|
||||
}, 500)
|
||||
}
|
||||
},
|
||||
|
||||
// 顶部商品分类选择事件
|
||||
changeXuan(id) {
|
||||
this.xuanIndex = id
|
||||
if (id == 'all') {
|
||||
this.gClassId = ''
|
||||
this.getGoods()
|
||||
} else {
|
||||
this.gClassId = id
|
||||
this.getGoods()
|
||||
}
|
||||
},
|
||||
|
||||
// 店铺信息
|
||||
async getShopData() {
|
||||
const
|
||||
shopData = await this.$get("shop/getShopInfo", {
|
||||
params: {
|
||||
shop_id: this.$route.query.id
|
||||
},
|
||||
});
|
||||
|
||||
if (shopData.code == 1) {
|
||||
|
||||
this.shopInfo = shopData.data
|
||||
// 切割推荐列表
|
||||
if (shopData.data.goods_list.length > 0) {
|
||||
var num = [];
|
||||
for (var i = 0; i < Math.ceil(shopData.data.goods_list.length / 4); i++) {
|
||||
var start = i * 4;
|
||||
var end = start + 4;
|
||||
num.push(shopData.data.goods_list.slice(start, end));
|
||||
}
|
||||
}
|
||||
|
||||
console.log('num', num)
|
||||
this.recommend = num
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// 关注店铺
|
||||
shopFollow() {
|
||||
const a = this.$post("shop_follow/changeStatus", {
|
||||
shop_id: this.$route.query.id
|
||||
});
|
||||
this.getShopData()
|
||||
},
|
||||
|
||||
// 领取优惠券
|
||||
async hqCoupon(id) {
|
||||
const {
|
||||
msg,
|
||||
code
|
||||
} = await this.$post("coupon/getCoupon", {
|
||||
coupon_id: id,
|
||||
});
|
||||
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: "success",
|
||||
});
|
||||
}
|
||||
this.getCouponList()
|
||||
},
|
||||
|
||||
// 获取优惠券列表
|
||||
async getCouponList() {
|
||||
const
|
||||
coupon = await this.$get("coupon/getCouponList", {
|
||||
params: {
|
||||
shop_id: this.$route.query.id
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
// 点击商品分类
|
||||
getClassGoods(id) {
|
||||
this.gClassId = id
|
||||
|
||||
if (id == '') {
|
||||
this.xuanIndex = 'all'
|
||||
} else {
|
||||
this.xuanIndex = id
|
||||
}
|
||||
|
||||
this.getGoods()
|
||||
},
|
||||
|
||||
changeSortType(type) {
|
||||
this.sortType = type;
|
||||
switch (type) {
|
||||
case "price":
|
||||
if (this.priceSort == "asc") {
|
||||
this.priceSort = "desc";
|
||||
} else if (this.priceSort == "desc") {
|
||||
this.priceSort = "asc";
|
||||
}
|
||||
break;
|
||||
case "sales_sum":
|
||||
if (this.saleSort == "asc") {
|
||||
this.saleSort = "desc";
|
||||
} else if (this.saleSort == "desc") {
|
||||
this.saleSort = "asc";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
}
|
||||
this.getGoods();
|
||||
},
|
||||
changePage(current) {
|
||||
this.page = current;
|
||||
this.getGoods();
|
||||
},
|
||||
async getGoods() {
|
||||
const {
|
||||
name
|
||||
} = this.$route.query;
|
||||
const {
|
||||
priceSort,
|
||||
sortType,
|
||||
saleSort
|
||||
} = this;
|
||||
let sort = "";
|
||||
switch (sortType) {
|
||||
case "price":
|
||||
sort = priceSort;
|
||||
break;
|
||||
case "sales_sum":
|
||||
sort = saleSort;
|
||||
break;
|
||||
}
|
||||
const {
|
||||
data: {
|
||||
list,
|
||||
count
|
||||
},
|
||||
} = await this.$get("pc/goodsList", {
|
||||
params: {
|
||||
page_size: 20,
|
||||
page_no: this.page,
|
||||
sort_type: sortType,
|
||||
sort,
|
||||
category_id: this.gClassId,
|
||||
shop_id: this.$route.query.id,
|
||||
name: this.keyword,
|
||||
},
|
||||
});
|
||||
this.count = count
|
||||
this.goodsList = list;
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.shop {
|
||||
width: 227px;
|
||||
padding: 15px;
|
||||
|
||||
.logo-img {
|
||||
width: 62px;
|
||||
height: 62px;
|
||||
border-radius: 50%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.el-rate__icon {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.h-item {
|
||||
width: 82px;
|
||||
height: 24px;
|
||||
margin-right: 30px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.h-item-x {
|
||||
border-radius: 100px;
|
||||
background-color: #FF2C3C;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.search {
|
||||
width: 240px;
|
||||
|
||||
::v-deep .el-input {
|
||||
width: 240px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.shop-details {
|
||||
margin-top: 10px;
|
||||
|
||||
.left {
|
||||
.l-border {
|
||||
padding-bottom: 27px;
|
||||
border-bottom: 1px solid #EEEEEE;
|
||||
margin-bottom: 27px;
|
||||
}
|
||||
|
||||
.desc {
|
||||
color: #101010;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.desc-b {
|
||||
color: #FFFFFF;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.desc-n {
|
||||
color: #FFFFFF;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.desc-n {
|
||||
color: #101010;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.left-btn {
|
||||
width: 82px;
|
||||
height: 29px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid rgba(187, 187, 187, 100);
|
||||
}
|
||||
|
||||
.left-shop {
|
||||
background-color: #FFFFFF;
|
||||
padding: 20px 15px;
|
||||
width: 210px;
|
||||
height: 364px;
|
||||
}
|
||||
|
||||
.r-color-h {
|
||||
background-color: #A4ADB3;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.l-tips {
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
.l-fen {
|
||||
width: 210px;
|
||||
height: 44px;
|
||||
line-height: 20px;
|
||||
color: rgba(16, 16, 16, 100);
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.l-fen-select {
|
||||
color: #FF2C3C;
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
.right {
|
||||
width: 961px;
|
||||
|
||||
.coupon-list {
|
||||
background-color: #FFFFFF;
|
||||
padding: 20px 0;
|
||||
margin: 0 20px;
|
||||
border-bottom: 1px solid #EEEEEE;
|
||||
|
||||
.coupons-more {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.swiper-item-c {
|
||||
width: 760px;
|
||||
// height: 120px;
|
||||
|
||||
flex-wrap: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.swiper-item-zk {
|
||||
width: 770px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
|
||||
.shop-list {
|
||||
background-color: #FFFFFF;
|
||||
height: 360px;
|
||||
padding: 0 20px;
|
||||
padding-top: 10px;
|
||||
|
||||
.shop-item {
|
||||
width: 200px;
|
||||
height: 298px;
|
||||
background-color: #FFFFFF;
|
||||
margin-right: 12px;
|
||||
|
||||
.name {
|
||||
color: rgba(16, 16, 16, 100);
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.sort {
|
||||
padding: 16px 16px 0;
|
||||
|
||||
.sort-name {
|
||||
.item {
|
||||
margin-right: 30px;
|
||||
cursor: pointer;
|
||||
|
||||
&.active {
|
||||
color: #FF2C3C
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.swiper {}
|
||||
|
||||
.swiper-item {
|
||||
width: 672px;
|
||||
// box-sizing: content-box;
|
||||
}
|
||||
|
||||
.item {
|
||||
margin-bottom: 20px;
|
||||
margin-right: 16px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
|
||||
.coupon-button {
|
||||
background-color: #f2f2f2;
|
||||
width: 240px;
|
||||
height: 30px;
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.info {
|
||||
padding: 0 10px;
|
||||
background: url("~/static/images/bg_coupon_s.png") no-repeat;
|
||||
width: 240px;
|
||||
height: 80px;
|
||||
background-size: 100%;
|
||||
|
||||
&.gray {
|
||||
background-image: url("~/static/images/bg_coupon.png");
|
||||
}
|
||||
|
||||
.info-hd {
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.tips {
|
||||
position: relative;
|
||||
background-color: #f2f2f2;
|
||||
height: 30px;
|
||||
padding: 0 8px;
|
||||
|
||||
.tips-con {
|
||||
width: 100%;
|
||||
left: 0;
|
||||
background-color: #f2f2f2;
|
||||
position: absolute;
|
||||
top: 30px;
|
||||
padding: 10px;
|
||||
z-index: 99;
|
||||
}
|
||||
}
|
||||
|
||||
.receice {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0px;
|
||||
width: 58px;
|
||||
height: 45px;
|
||||
}
|
||||
|
||||
.choose {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
background-color: #ffe72c;
|
||||
color: $--color-primary;
|
||||
padding: 1px 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.more {
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
cursor: pointer;
|
||||
right: 30px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,128 +0,0 @@
|
|||
<!-- 专区内页 -->
|
||||
<template>
|
||||
<div class="special-area">
|
||||
<div class="header-top">
|
||||
<el-breadcrumb style="flex: 1;" separator="/">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item class="line1" style="max-width: 800px;">{{ name }}</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
<div class="m-b-20 header-img">
|
||||
<!-- <el-image :src="require('@/static/images/special_area_bg.jpg')" style="height: 240px; width: 1180px;"></el-image> -->
|
||||
<div class="header-img-tile flex-col col-center row-center">
|
||||
<div class="max-title white">
|
||||
{{ name }}
|
||||
</div>
|
||||
<div class="m-t-22 min-title white">
|
||||
{{ title }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="goodsList.length">
|
||||
<goods-list :list="goodsList" />
|
||||
<div class="pagination flex m-t-30 row-center" style="padding-bottom: 38px" v-if="count">
|
||||
<el-pagination background layout="prev, pager, next" :total="count" prev-text="上一页" next-text="下一页"
|
||||
hide-on-single-page :page-size="20" @current-change="changePage">
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<null-data v-else :img="require('~/static/images/goods_null.png')" text="暂无商品~"></null-data>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
}, ],
|
||||
}
|
||||
},
|
||||
|
||||
async asyncData({ query }) {
|
||||
|
||||
return {
|
||||
name: query.name,
|
||||
title: query.title,
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
goodsList: [],
|
||||
page: 1,
|
||||
count: 0,
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 获取商品
|
||||
async getGoods() {
|
||||
const id = this.$route.query.id
|
||||
let {
|
||||
code,
|
||||
data: {
|
||||
list,
|
||||
count
|
||||
}
|
||||
} = await this.$get("activity_area/activityGoodsList", {
|
||||
params: {
|
||||
id: id,
|
||||
page_no: this.page,
|
||||
page_size: 20,
|
||||
},
|
||||
})
|
||||
|
||||
if (code == 1) {
|
||||
this.goodsList = list
|
||||
this.count = count
|
||||
}
|
||||
},
|
||||
|
||||
changePage(current) {
|
||||
this.page = current;
|
||||
this.getGoods();
|
||||
},
|
||||
},
|
||||
|
||||
created() {
|
||||
this.getGoods()
|
||||
},
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.special-area {
|
||||
.header-top {
|
||||
margin: 16px 0;
|
||||
}
|
||||
|
||||
.header-img {
|
||||
width: 1180px;
|
||||
height: 240px;
|
||||
background: url(../static/images/special_area_bg.jpg);
|
||||
|
||||
.header-img-tile {
|
||||
|
||||
.max-title {
|
||||
margin-top: 65px;
|
||||
font-size: 32px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.min-title {
|
||||
padding: 5px 27px;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
border-radius: 100px;
|
||||
background-color: rgba(186, 122, 246);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,164 +0,0 @@
|
|||
<template>
|
||||
<div class="detail">
|
||||
|
||||
<div class="m-t-20">
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item :to="{ path: '/store_settled' }"><a>商家入驻</a></el-breadcrumb-item>
|
||||
<el-breadcrumb-item :to="{ path: '/store_settled/record' }"><a>申请列表</a></el-breadcrumb-item>
|
||||
<el-breadcrumb-item>详情</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
|
||||
<div class="main bg-white m-t-20">
|
||||
|
||||
<div class="header">
|
||||
<div class="m-b-30 pointer" @click="$router.back();">
|
||||
<i class="el-icon-arrow-left"></i>
|
||||
返回
|
||||
</div>
|
||||
|
||||
<div v-if="detail.audit_status==1">
|
||||
<div class="flex normal xxl bold" style="font-weight:600">
|
||||
<img class="m-r-12" src="~/static/images/time.png" alt="">
|
||||
恭喜您,资料提交成功
|
||||
</div>
|
||||
<div class="xs muted m-t-12 m-l-42">
|
||||
预计在3个工作日内审核完毕,如通过我们将会发送短信通知您,请注意查收!
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else-if="detail.audit_status==3">
|
||||
<div class="flex normal xxl bold" style="font-weight:600">
|
||||
<img class="m-r-12" src="~/static/images/error.png" alt="">
|
||||
很遗憾,审核不通过!
|
||||
</div>
|
||||
<div class="xs muted m-t-12 m-l-42">
|
||||
请尽量完善您的资料信息再重新提交!
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else-if="detail.audit_status==2">
|
||||
<div class="flex normal xxl bold" style="font-weight:600">
|
||||
<img class="m-r-12" src="~/static/images/success.png" alt="">
|
||||
恭喜您,审核已通过!
|
||||
</div>
|
||||
<div class="xs muted m-t-12 m-l-42">
|
||||
您的审核已通过
|
||||
</div>
|
||||
|
||||
<div class="admin m-t-20">
|
||||
<div class="xs p-t-16">
|
||||
<span>PC管理后台地址:</span>
|
||||
<a :href="detail.admin_address">
|
||||
{{detail.admin_address}}
|
||||
</a>
|
||||
</div>
|
||||
<div class="xs m-t-16">
|
||||
<span>商家账号:</span>
|
||||
<a href="" target="_blank" rel="noopener noreferrer">
|
||||
{{detail.account}}
|
||||
</a>
|
||||
</div>
|
||||
<div class="xs m-t-16">
|
||||
<span>登录密码:</span>
|
||||
登录密码:密码是您在创建账号时设置的登录密码,如忘记密码可联系官方客服进行修改!
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<div class="xl bold normal m-b-30">资料详情</div>
|
||||
<el-form :model="detail" size="medium" :label-position="'left'" ref="form" label-width="110px"
|
||||
class="demo-form">
|
||||
<el-form-item label="商家名称:" prop="name">
|
||||
<span>{{detail.name}}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="主营类目:" prop="name">
|
||||
<span>{{detail.cid_desc}}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="联系人姓名:" prop="name">
|
||||
<span>{{detail.nickname}}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号码:" prop="name">
|
||||
<span>{{detail.mobile}}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="商家账号:" prop="name">
|
||||
<span>{{detail.account}}</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="营业执照:" prop="name">
|
||||
<el-image v-for="(item, index) in detail.license" :key="index"
|
||||
style="width: 72px; height: 72px; margin-right: 10px" :src="item" fit="fit"></el-image>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
detail: {},
|
||||
};
|
||||
},
|
||||
|
||||
async mounted() {
|
||||
console.log(this.$route.query.id);
|
||||
const { data } = await this.$get("ShopApply/detail", {
|
||||
params: { id: this.$route.query.id },
|
||||
});
|
||||
this.detail = data
|
||||
|
||||
console.log("我艹啊私房话哀诉还是");
|
||||
},
|
||||
|
||||
methods: {},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scope>
|
||||
.detail {
|
||||
width: 100%;
|
||||
height: 788px;
|
||||
.main {
|
||||
width: 100%;
|
||||
height: 788px;
|
||||
padding: 30px;
|
||||
.header {
|
||||
padding: 0px 0 40px;
|
||||
margin-bottom: 25px;
|
||||
border-bottom: 1px dotted #e5e5e5;
|
||||
img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
.admin {
|
||||
background: #f6f6f6;
|
||||
padding: 0 30px;
|
||||
padding-bottom: 16px;
|
||||
a:hover {
|
||||
color: #ff2c3c;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,303 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="m-t-20">
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>商家入驻</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
|
||||
<div class="store bg-white m-t-16">
|
||||
|
||||
<div class="main">
|
||||
<div class="title">入驻申请</div>
|
||||
<el-form :model="form" :rules="rules" ref="form" label-width="110px" class="demo-form">
|
||||
<el-form-item label="商家名称:" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入商家名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="主营类目:" prop="cid">
|
||||
<el-select v-model="form.cid" placeholder="请选择" style="width: 100%">
|
||||
<el-option v-for="item in category" :key="item.id" :label="item.name" :value="item.id">
|
||||
{{item.name}}
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="联系人姓名:" prop="nickname">
|
||||
<el-input v-model="form.nickname" placeholder="请输入联系人姓名"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号码:" prop="mobile">
|
||||
<el-input v-model="form.mobile" placeholder="请输入手机号码"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="验证码:" prop="code">
|
||||
<el-input v-model="form.code" placeholder="请输入验证码" style="width:355px"></el-input>
|
||||
<el-button style="margin-left: 14px;width: 175px" @click="sndSmsToPhone">
|
||||
<div v-if="canSendPwd">获取验证码</div>
|
||||
<count-down v-else :time="60" format="ss秒" autoStart @finish="canSendPwd = true" />
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item label="创建账号:" prop="account">
|
||||
<el-input v-model="form.account" placeholder="请设置登录账号(可用手机号代替)"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="设置密码:" prop="password">
|
||||
<el-input v-model="form.password" placeholder="请输入登录密码"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="营业执照:" prop="">
|
||||
<el-upload class="avatar-uploader" :action="action" :show-file-list="true"
|
||||
list-type="picture-card" :on-success="uploadFileSuccess" :on-remove="handleRemove"
|
||||
:headers="{token: $store.state.token}">
|
||||
<i class="el-icon-picture avatar-uploader-icon"></i>
|
||||
<div class="m-t-20 xs">上传图片</div>
|
||||
</el-upload>
|
||||
<div class="xs muted">支持jpg、png、jpeg格式的图片,最多可上传10张</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="">
|
||||
<div class="xs muted m-t-20">
|
||||
<el-checkbox v-model="checked"></el-checkbox>
|
||||
同意并阅读<span class="primary pointer" @click="dialogVisible=true">《服务协议》</span>
|
||||
</div>
|
||||
<div class="flex m-t-10">
|
||||
<el-button style="width: 213px;" class="bg-primary white" @click="onSubmitStore('form')">
|
||||
提交申请
|
||||
</el-button>
|
||||
<span class="m-l-20 xs muted pointer"
|
||||
@click="$router.push('/store_settled/record')">查看申请记录</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 服务协议 -->
|
||||
<el-dialog title="提示" :visible.sync="dialogVisible" width="50%">
|
||||
<div style="height: 40vh;overflow-y: auto;">
|
||||
<div v-html="content">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="dialogVisible = false">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import config from "~/config/app";
|
||||
import { SMSType } from "~/utils/type";
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
checked: false,
|
||||
action: config.baseUrl + "/api/file/formimage",
|
||||
category: [], //类目
|
||||
fileList: [],
|
||||
content: "", //隐私协议
|
||||
dialogVisible: false, //是否显示服务协议
|
||||
canSendPwd: true, //是否验证码
|
||||
form: {
|
||||
cid: "", //类目ID
|
||||
clabel: "", //类目名称
|
||||
name: "", //商家名称
|
||||
nickname: "", //联系人姓名
|
||||
mobile: "", //手机号码
|
||||
account: "", //账号
|
||||
password: "", //密码
|
||||
code: "", //验证码
|
||||
},
|
||||
rules: {
|
||||
name: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入商家名称",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
cid: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择主营类目",
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
nickname: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入联系人姓名",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
mobile: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入手机号码",
|
||||
trigger: "blur",
|
||||
},
|
||||
{
|
||||
pattern: /^1[3|4|5|7|8][0-9]{9}$/,
|
||||
message: "请输入正确的手机号",
|
||||
},
|
||||
],
|
||||
code: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入验证码",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
account: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入登录账号",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
password: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入设置登录密码",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
imageForm: [
|
||||
{
|
||||
required: true,
|
||||
message: "请上传营业执照",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
async asyncData({ $get }) {
|
||||
const { data } = await $get("shop_category/getList");
|
||||
return { category: data };
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.getServiceData();
|
||||
},
|
||||
|
||||
methods: {
|
||||
async sndSmsToPhone() {
|
||||
if (!/^1[3|4|5|7|8][0-9]{9}$/.test(this.form.mobile))
|
||||
return this.$message.error("请输入正确的手机号码");
|
||||
const { code } = await this.$post("sms/send", {
|
||||
mobile: this.form.mobile,
|
||||
key: SMSType.SJSQYZ,
|
||||
});
|
||||
if (code == 1) {
|
||||
this.canSendPwd = false;
|
||||
return this.$message.success("发送成功");
|
||||
} else return this.$message.error("发送失败");
|
||||
},
|
||||
|
||||
uploadFileSuccess(res, fileList) {
|
||||
this.fileList.push(res.data.uri);
|
||||
console.log(res, this.fileList);
|
||||
},
|
||||
|
||||
handleRemove(file, fileList) {
|
||||
console.log(fileList);
|
||||
if (fileList.length >= 0) {
|
||||
const res = fileList.map((item) => item.response.data.uri);
|
||||
this.fileList = res;
|
||||
}
|
||||
},
|
||||
|
||||
async getServiceData() {
|
||||
const res = await this.$get("ShopApply/getTreaty");
|
||||
|
||||
if (res.code == 1) {
|
||||
this.content = res.data.content;
|
||||
}
|
||||
},
|
||||
|
||||
onSubmitStore(formName) {
|
||||
if (!this.checked)
|
||||
return this.$message.error("请同意并阅读服务协议");
|
||||
this.$refs[formName].validate(async (valid) => {
|
||||
if (valid) {
|
||||
const { data, code, msg } = await this.$post(
|
||||
"ShopApply/apply",
|
||||
{
|
||||
...this.form,
|
||||
license: this.fileList,
|
||||
}
|
||||
);
|
||||
if (code == 1) {
|
||||
// data.id
|
||||
this.$router.push({
|
||||
path: "/store_settled/detail",
|
||||
query: {
|
||||
id: data.id,
|
||||
},
|
||||
});
|
||||
}
|
||||
} else return false;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scope>
|
||||
.store {
|
||||
width: 100%;
|
||||
.main {
|
||||
width: 660px;
|
||||
margin: 0 auto;
|
||||
padding-bottom: 52px;
|
||||
.title {
|
||||
padding: 16px 0;
|
||||
color: #101010;
|
||||
font-size: 18px;
|
||||
text-align: center;
|
||||
}
|
||||
::v-deep .el-input__inner {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
|
||||
.avatar-uploader .el-upload {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 1px solid #d9d9d9;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
line-height: 0px;
|
||||
padding: 20px 0;
|
||||
color: #101010;
|
||||
overflow: hidden;
|
||||
border-radius: 0;
|
||||
}
|
||||
.avatar-uploader .el-upload:hover {
|
||||
border-color: #ff2c3c;
|
||||
}
|
||||
.avatar-uploader-icon {
|
||||
font-size: 28px;
|
||||
color: #8c939d;
|
||||
text-align: center;
|
||||
}
|
||||
.avatar {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,84 +0,0 @@
|
|||
<template>
|
||||
<div class="record">
|
||||
<div class="m-t-20">
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item :to="{ path: '/store_settled' }"><a>商家入驻</a></el-breadcrumb-item>
|
||||
<el-breadcrumb-item>申请列表</el-breadcrumb-item>
|
||||
</el-breadcrumb>
|
||||
</div>
|
||||
<div class="main bg-white m-t-20">
|
||||
|
||||
<el-table :data="record" style="width: 100%" size="medium"
|
||||
:header-cell-style="{background:'#eee',color:'#606266'}">
|
||||
<el-table-column prop="name" label="商家名称" max-width="180">
|
||||
</el-table-column>
|
||||
<el-table-column prop="audit_status_desc" label="审核状态" max-width="180">
|
||||
<template slot-scope="scope">
|
||||
<div class="primary" v-if="scope.row.audit_status==3">{{scope.row.audit_status_desc}}</div>
|
||||
<div v-else>{{scope.row.audit_status_desc}}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="apply_time" label="提交时间" max-width="180">
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" max-width="180">
|
||||
<template slot-scope="scope">
|
||||
<div class="pointer" @click="$router.push({
|
||||
path: '/store_settled/detail',
|
||||
query: {
|
||||
id: scope.row.id
|
||||
}
|
||||
})">查看详情</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
record: [],
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
// console.log("我艹啊私房话哀诉还是");
|
||||
},
|
||||
|
||||
async asyncData({ $get }) {
|
||||
const { data } = await $get("ShopApply/record");
|
||||
console.log(data);
|
||||
return { record: data.lists };
|
||||
},
|
||||
|
||||
methods: {},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scope>
|
||||
.record {
|
||||
width: 100%;
|
||||
height: 788px;
|
||||
.main {
|
||||
padding: 18px;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,198 +0,0 @@
|
|||
<template>
|
||||
<div class="address-list">
|
||||
<div class="address-header lg">收货地址</div>
|
||||
<div class="address-content" v-show="!isDataNull">
|
||||
<el-table :data="addressList" style="width: 100%">
|
||||
<el-table-column prop="contact" label="收货人" width="200" />
|
||||
<el-table-column prop="telephone" label="手机号码" width="150" />
|
||||
<el-table-column prop="addressDetail" label="收货地区" />
|
||||
<el-table-column fixed="right" label="操作" max-width="216">
|
||||
<template slot-scope="scope">
|
||||
<div class="flex">
|
||||
<div class="flex m-r-20" style="margin-left: 36px;cursor: pointer;" @click="setDefault(scope.row)">
|
||||
<div :class="{'default-border': scope.row.is_default == 0}"
|
||||
style="width: 16px;height: 16px;margin-right: 8px;"
|
||||
v-if="scope.row.is_default == 0" />
|
||||
<img :class="{'default-border': scope.row.is_default == 0}"
|
||||
style="width: 16px;height: 16px;margin-right: 8px;" v-else
|
||||
src="~/static/images/logistics_success.png" />
|
||||
<div class="nr" :class="{'primary': scope.row.is_default == 1}">
|
||||
{{scope.row.is_default == 1 ? '设为默认' : '设为默认'}}</div>
|
||||
<!-- <el-radio v-model="scope.row.is_default" >{{scope.row.is_default == 1 ? '默认' : '设为默认'}}</el-radio> logistics_success -->
|
||||
</div>
|
||||
<div style="margin-right: 24px;">
|
||||
<el-button @click="modifyRow(scope.row)" type="text" class="nr" size="small">修改
|
||||
</el-button>
|
||||
</div>
|
||||
<el-popconfirm confirm-button-text='确定' cancel-button-text='取消' icon="el-icon-info"
|
||||
icon-color="red" title="确定要删除地址吗?" @confirm="deleteAddress(scope.row)">
|
||||
<el-button type="text" slot="reference" size="small" class="nr">删除</el-button>
|
||||
</el-popconfirm>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="add-address-btn flex row-end">
|
||||
<el-button type="primary" style="width: 106px" @click="showAddressPop">添加地址</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column-center data-null" v-show="isDataNull">
|
||||
<img style="width: 150px;height: 150px" src="@/static/images/address_null.png" />
|
||||
<div class="muted xs m-t-8">暂无地址记录~</div>
|
||||
<div class="m-t-30">
|
||||
<el-button type="primary" style="width: 106px" @click="showAddressPop">添加地址</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<address-add v-model="addressPop" :aid="editId == -1 ? '' : editId" @success="getAddressList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
async asyncData({ $get, $post }) {
|
||||
let addressList = [];
|
||||
let isDataNull = true;
|
||||
let res = await $get("user_address/lists");
|
||||
if (res.code == 1) {
|
||||
addressList = res.data;
|
||||
addressList.forEach((item) => {
|
||||
item.addressDetail =
|
||||
item.province +
|
||||
" " +
|
||||
item.city +
|
||||
" " +
|
||||
item.district +
|
||||
" " +
|
||||
item.address;
|
||||
});
|
||||
if (addressList.length <= 0) {
|
||||
isDataNull = true;
|
||||
} else {
|
||||
isDataNull = false;
|
||||
}
|
||||
}
|
||||
return {
|
||||
addressList,
|
||||
isDataNull,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
addressPop: false,
|
||||
editId: -1,
|
||||
isDataNull: false
|
||||
};
|
||||
},
|
||||
mounted() {},
|
||||
methods: {
|
||||
modifyRow(e) {
|
||||
this.editId = e.id;
|
||||
this.addressPop = true;
|
||||
},
|
||||
|
||||
// 设置默认地址
|
||||
async setDefault(e) {
|
||||
let res = await this.$post("user_address/setdefault", { id: e.id });
|
||||
if (res.code == 1) {
|
||||
await this.getAddressList();
|
||||
this.$message({
|
||||
message: "设置成功",
|
||||
type: "success",
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 获取地址列表
|
||||
async getAddressList() {
|
||||
let res = await this.$get("user_address/lists");
|
||||
if (res.code == 1) {
|
||||
this.addressList = res.data;
|
||||
this.addressList.forEach((item) => {
|
||||
item.addressDetail =
|
||||
item.province +
|
||||
" " +
|
||||
item.city +
|
||||
" " +
|
||||
item.district +
|
||||
" " +
|
||||
item.address;
|
||||
});
|
||||
if (this.addressList.length <= 0) {
|
||||
this.isDataNull = true;
|
||||
} else {
|
||||
this.isDataNull = false;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 删除地址
|
||||
async deleteAddress(e) {
|
||||
let res = await this.$post("user_address/del", { id: e.id });
|
||||
if (res.code == 1) {
|
||||
await this.getAddressList();
|
||||
this.$message({
|
||||
message: "删除成功",
|
||||
type: "success",
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 显示添加地址
|
||||
showAddressPop() {
|
||||
this.addressPop = true;
|
||||
this.editId = -1;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.address-list {
|
||||
width: 980px;
|
||||
padding: 10px;
|
||||
.address-header {
|
||||
padding: 10px 5px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
.address-content {
|
||||
margin-top: 15px;
|
||||
.default-border {
|
||||
border: 1px solid #e5e5e5;
|
||||
border-radius: 60px;
|
||||
}
|
||||
::v-deep .el-table {
|
||||
color: #222;
|
||||
}
|
||||
::v-deep .el-table .el-button--text {
|
||||
color: #222;
|
||||
font-weight: 400;
|
||||
}
|
||||
::v-deep .el-table th {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
::v-deep .el-table thead {
|
||||
color: #555555;
|
||||
}
|
||||
.add-address-btn {
|
||||
margin-top: 18px;
|
||||
}
|
||||
}
|
||||
.data-null {
|
||||
text-align: center;
|
||||
padding-top: 150px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,229 +0,0 @@
|
|||
<template>
|
||||
<div class="apply-detail">
|
||||
<div class="apply-detail-content">
|
||||
<el-table :data="lists.order_goods" style="width: 100%">
|
||||
<el-table-column prop="date" label="商品信息" max-width="180">
|
||||
<template slot-scope="scope">
|
||||
<div class="flex">
|
||||
<el-image style="width: 80px; height: 80px" :src="scope.row.image" fit="fit"></el-image>
|
||||
<div class="m-l-10">
|
||||
<div class="line-2">
|
||||
{{scope.row.goods_name}}
|
||||
</div>
|
||||
<div>
|
||||
{{scope.row.spec_value}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="价格" width="180">
|
||||
<template slot-scope="scope">
|
||||
¥{{scope.row.goods_price}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="goods_num" label="数量" width="180">
|
||||
</el-table-column>
|
||||
<el-table-column prop="address" label="申请状态" width="180">
|
||||
<template>{{lists.status_text}}</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div class="m-t-30" style="padding: 0 20px">
|
||||
<div class="result-content">
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款类型:</div>
|
||||
<div class="desc">{{lists.refund_type_text}}</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款原因:</div>
|
||||
<div class="desc">{{lists.refund_reason}}</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款金额:</div>
|
||||
<div class="desc">
|
||||
<price-formate :price="lists.refund_price" showSubscript color="red" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">申请时间:</div>
|
||||
<div class="desc">{{lists.create_time}}</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款编号:</div>
|
||||
<div class="desc">{{lists.sn}}</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款说明:</div>
|
||||
<div class="column desc">
|
||||
<div class="m-b-16"></div>
|
||||
<el-image style="width: 76px;height: 76px;" :src="lists.refund_image"
|
||||
v-if="lists.refund_image" :preview-src-list="[lists.refund_image]" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="apply-detail-address flex" v-if="lists.refund_type_text == '退款退货' && lists.status == 2">
|
||||
退货地址:{{lists.shop.contact||'-'}},{{lists.shop.mobile||'-'}}, {{lists.shop.address||'-'}}
|
||||
<div class="copy pointer" @click="onCopy">复制</div>
|
||||
</div>
|
||||
|
||||
<div class="btn-group flex row-center m-t-60">
|
||||
<el-popconfirm title="确定撤销商品吗?" confirm-button-text="确定" cancel-button-text="取消" icon="el-icon-info"
|
||||
icon-color="red" @confirm="cancelApply(lists.id)">
|
||||
<el-button class="apply-btn flex row-center sm" size="small" slot="reference"
|
||||
v-if="lists.status!=6">撤销申请</el-button>
|
||||
</el-popconfirm>
|
||||
<el-button class="apply-btn flex row-center sm" size="small" v-if="lists.status==2"
|
||||
@click="showInput=true">填写快递单号</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<input-express v-model="showInput" @success="getDetail" :aid="lists.id" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
|
||||
data() {
|
||||
return {
|
||||
lists: {
|
||||
order_goods: [],
|
||||
shop: {},
|
||||
},
|
||||
showInput: false,
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.getDetail();
|
||||
},
|
||||
|
||||
methods: {
|
||||
async getDetail() {
|
||||
let res = await this.$get("after_sale/detail", {
|
||||
params: {
|
||||
id: this.$route.query.afterSaleId,
|
||||
},
|
||||
});
|
||||
if (res.code == 1) {
|
||||
let goods = [res.data.order_goods];
|
||||
res.data.order_goods = goods;
|
||||
console.log(goods);
|
||||
this.lists = res.data;
|
||||
}
|
||||
},
|
||||
|
||||
onCopy() {
|
||||
// this.deliverOrder.invoice_no;
|
||||
let oInput = document.createElement("input");
|
||||
oInput.value = this.lists.shop.address;
|
||||
document.body.appendChild(oInput);
|
||||
oInput.select();
|
||||
document.execCommand("Copy");
|
||||
this.$message.success("复制成功");
|
||||
oInput.remove();
|
||||
},
|
||||
|
||||
async cancelApply(afterSaleId) {
|
||||
let res = await this.$post("after_sale/cancel", {
|
||||
id: afterSaleId,
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: "success",
|
||||
});
|
||||
setTimeout(() => {
|
||||
this.$router.go(-1);
|
||||
}, 500);
|
||||
}
|
||||
},
|
||||
|
||||
goRefund(afterSaleId, orderId, itemId) {
|
||||
this.$router.push(
|
||||
"/user/after_sales/apply_result?afterSaleId=" +
|
||||
afterSaleId +
|
||||
"&order_id=" +
|
||||
orderId +
|
||||
"&item_id=" +
|
||||
itemId
|
||||
);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.apply-detail {
|
||||
padding: 10px;
|
||||
.apply-detail-header {
|
||||
padding: 15px 0;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
.apply-detail-address {
|
||||
margin: 0 10px;
|
||||
padding-top: 16px;
|
||||
border-top: 1px solid #e5e5e5;
|
||||
|
||||
.copy {
|
||||
margin-left: 20px;
|
||||
padding: 2px 6px;
|
||||
color: $--color-primary;
|
||||
background-color: rgba(255, 44, 60, 0.2);
|
||||
}
|
||||
}
|
||||
.result-content {
|
||||
padding: 24px 20px;
|
||||
.result-item {
|
||||
margin-bottom: 16px;
|
||||
&:not(:last-of-type) {
|
||||
.label {
|
||||
width: 82px;
|
||||
align-self: flex-start;
|
||||
text-align: right;
|
||||
&::before {
|
||||
content: "* ";
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
}
|
||||
.label {
|
||||
width: 82px;
|
||||
align-self: flex-start;
|
||||
text-align: right;
|
||||
}
|
||||
.desc {
|
||||
margin-left: 24px;
|
||||
width: 680px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.apply-detail-content {
|
||||
.btn-group {
|
||||
.apply-btn {
|
||||
border: 1px solid #cccccc;
|
||||
border-radius: 2px;
|
||||
width: 100px;
|
||||
height: 32px;
|
||||
align-self: flex-start;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,106 +0,0 @@
|
|||
<template>
|
||||
<div class="apply-result-container">
|
||||
<div class="result-header flex">
|
||||
<img style="width: 40px;height: 40px;align-self: flex-start" src="~/static/images/pay_success.png" />
|
||||
<div class="m-l-16">
|
||||
<div class="apply-title" style="font-weight: 500;">提交申请</div>
|
||||
<div class="muted m-t-8">申请已提交,请耐心等待商家处理…</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="result-content">
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款类型:</div>
|
||||
<div class="desc">{{lists.refund_type_text}}</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款原因:</div>
|
||||
<div class="desc">{{lists.refund_reason}}</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款金额:</div>
|
||||
<div class="desc">
|
||||
<price-formate :price="lists.refund_price" showSubscript color="red" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="result-item flex">
|
||||
<div class="label">退款说明:</div>
|
||||
<div class="column desc">
|
||||
<div class="m-b-16">{{lists.refund_remark}}</div>
|
||||
<el-image style="width: 76px;height: 76px;" :src="lists.refund_image" v-if="lists.refund_image" :preview-src-list="[lists.refund_image]" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{ rel: "icon", type: "image/x-icon", href: this.$store.getters.favicon}],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
async asyncData({$get, query}) {
|
||||
const data = {
|
||||
id: query.afterSaleId
|
||||
};
|
||||
let lists = {}
|
||||
let res = await $get("after_sale/detail", {params: data});
|
||||
if(res.code == 1) {
|
||||
lists = res.data;
|
||||
}
|
||||
return {
|
||||
lists,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.apply-result-container {
|
||||
padding: 10px;
|
||||
.result-header {
|
||||
padding: 46px 20px;
|
||||
border-bottom: 1px solid #E5E5E5;
|
||||
.apply-title {
|
||||
font-size: 24px;
|
||||
}
|
||||
}
|
||||
.result-content {
|
||||
padding: 24px 20px;
|
||||
.result-item {
|
||||
margin-bottom: 16px;
|
||||
&:not(:last-of-type) {
|
||||
.label {
|
||||
width: 82px;
|
||||
align-self: flex-start;
|
||||
text-align: right;
|
||||
&::before {
|
||||
content: '* ';
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
}
|
||||
.label {
|
||||
width: 82px;
|
||||
align-self: flex-start;
|
||||
text-align: right;
|
||||
}
|
||||
.desc {
|
||||
margin-left: 24px;
|
||||
width: 680px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,242 +0,0 @@
|
|||
<template>
|
||||
<div class="apply-sale-list">
|
||||
<div class="goods-info">
|
||||
<div class="table-head flex">
|
||||
<div class="info">商品信息</div>
|
||||
<div class="price flex row-center">单价</div>
|
||||
<div class="num flex row-center">数量</div>
|
||||
<div class="sum flex row-center">合计</div>
|
||||
<div class="act-pay flex row-center">实付</div>
|
||||
</div>
|
||||
<div class="table-content flex m-t-10">
|
||||
<div class="info flex">
|
||||
<div class="flex">
|
||||
<el-image style="width: 72px;height: 72px; flex: none" :src="goods.image" />
|
||||
<div class="m-l-10" style="flex: 1; align-self: flex-start">
|
||||
<div class="line2">{{goods.goods_name}}</div>
|
||||
<div class="mt10 muted sm">{{goods.spec_value}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="price flex row-center" style="align-self: flex-start">
|
||||
<price-formate :price="goods.goods_price" />
|
||||
</div>
|
||||
<div class="num flex row-center" style="align-self: flex-start">
|
||||
{{goods.goods_num}}
|
||||
</div>
|
||||
<div class="sum flex row-center" style="align-self: flex-start">
|
||||
<price-formate :price="goods.total_price" />
|
||||
</div>
|
||||
<div class="act-pay flex row-center" style="align-self: flex-start">
|
||||
<price-formate :price="goods.total_pay_price" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="apply-form">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="退款类型:" prop="applyType">
|
||||
<el-radio-group v-model="applyType" @change="applyRadioChange">
|
||||
<el-radio label="仅退款"></el-radio>
|
||||
<el-radio label="退货退款"></el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="退款原因:" prop="reason">
|
||||
<el-select v-model="form.reason" placeholder="请选择">
|
||||
<el-option :label="item" :value="item" v-for="(item, index) in reason" :key="index" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="退款说明:" prop="desc">
|
||||
<el-input style="width: 600px" type="textarea" v-model="form.desc" placeholder="退款说明(200字以内)"
|
||||
maxlength="200" show-word-limit resize="none" rows="5" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<upload isSlot :file-list="fileList" @remove="uploadSuccess" @success="uploadSuccess" :limit="3">
|
||||
<div class="" style="height: 100%">
|
||||
<i class="el-icon-camera xs" style="font-size: 24px" />
|
||||
</div>
|
||||
</upload>
|
||||
<div class="xs muted">最多可上传3张图片,支持jpg、png格式,图片大小1M以内</div>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div class="flex">
|
||||
<el-button type="primary" @click="onSubmit">提交申请</el-button>
|
||||
<div class="m-l-20">
|
||||
退款金额:<span class="primary">¥{{goods.total_price}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
name: "applySale",
|
||||
async asyncData({ $get, $post, query }) {
|
||||
let goods = {};
|
||||
let reason = [];
|
||||
let res = await $get("after_sale/goodsInfo", {
|
||||
params: {
|
||||
order_id: query.order_id,
|
||||
item_id: query.item_id,
|
||||
},
|
||||
});
|
||||
if (res.code == 1) {
|
||||
goods = res.data.goods;
|
||||
reason = res.data.reason;
|
||||
}
|
||||
return {
|
||||
reason,
|
||||
goods,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
applyType: "仅退款",
|
||||
form: {
|
||||
applyType: 0,
|
||||
reason: "",
|
||||
desc: "",
|
||||
},
|
||||
rules: {
|
||||
applyType: [{ required: true, message: "请选择退款类型" }],
|
||||
reason: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择退款原因",
|
||||
triggle: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
fileList: [],
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
applyRadioChange(value) {
|
||||
value == "仅退款"
|
||||
? (this.form.applyType = 0)
|
||||
: (this.form.applyType = 1);
|
||||
},
|
||||
|
||||
onSubmit(e) {
|
||||
this.$refs["form"].validate((valid) => {
|
||||
if (valid) {
|
||||
if (this.$route.query.afterSaleId) {
|
||||
this.applyAgainFun();
|
||||
} else {
|
||||
this.$applyAfterSale();
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onUploadChange(e) {
|
||||
let fileList = Object.assign([], this.fileList);
|
||||
fileList.push(e);
|
||||
this.fileList = fileList;
|
||||
console.log("onChange", e, " fileList:", this.fileList);
|
||||
},
|
||||
|
||||
uploadSuccess(e) {
|
||||
this.fileList = e.map((item) => item.response.data.uri);
|
||||
},
|
||||
|
||||
// 重新申请
|
||||
async $applyAgain() {
|
||||
const data = {
|
||||
id: this.$route.query.afterSaleId,
|
||||
reason: this.form.reason,
|
||||
refund_type: this.form.applyType,
|
||||
remark: this.form.desc,
|
||||
img: fileList.length <= 0 ? "" : this.fileList[0],
|
||||
};
|
||||
let res = await $post("after_sale/again", data);
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: "提交成功",
|
||||
type: "success",
|
||||
});
|
||||
this.$router.push(
|
||||
"/user/after_sales/apply_result?afterSaleId=" +
|
||||
res.data.after_sale_id
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
// 初次申请售后
|
||||
async $applyAfterSale() {
|
||||
console.log(this.fileList[0])
|
||||
const data = {
|
||||
item_id: this.$route.query.item_id,
|
||||
order_id: this.$route.query.order_id,
|
||||
reason: this.form.reason,
|
||||
refund_type: this.form.applyType,
|
||||
remark: this.form.desc,
|
||||
// 目前只支持单个
|
||||
img: this.fileList[0],
|
||||
};
|
||||
let res = await this.$post("after_sale/add", data);
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: "提交成功",
|
||||
type: "success",
|
||||
});
|
||||
this.$router.push(
|
||||
"/user/after_sales/apply_result?afterSaleId=" +
|
||||
res.data.after_sale_id
|
||||
);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.apply-sale-list {
|
||||
padding: 10px;
|
||||
.goods-info {
|
||||
.table-head {
|
||||
padding: 10px 20px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
.table-content {
|
||||
padding: 10px 20px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
.info {
|
||||
width: 500px;
|
||||
}
|
||||
.price {
|
||||
width: 100px;
|
||||
}
|
||||
.num {
|
||||
width: 100px;
|
||||
}
|
||||
.sum {
|
||||
width: 100px;
|
||||
}
|
||||
.act-pay {
|
||||
width: 100px;
|
||||
}
|
||||
}
|
||||
.apply-form {
|
||||
margin-top: 24px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,148 +0,0 @@
|
|||
<template>
|
||||
<div class="after-sales">
|
||||
<div class="after-sales-header">
|
||||
<el-tabs v-model="activeName" @tab-click="handleClick">
|
||||
<el-tab-pane v-for="(item, index) in afterSale" :key="index" :label="item.name" :name="item.type">
|
||||
<template v-if="item.list.length">
|
||||
<after-sales-list :type="item.type" :lists="item.list" @refresh="getAfterSaleList"
|
||||
@show="onInputShow" />
|
||||
<div class="pagination row-center" v-if="item.count">
|
||||
<el-pagination hide-on-single-page background layout="prev, pager, next" :total="item.count"
|
||||
prev-text="上一页" next-text="下一页" :page-size="10" @current-change="changePage">
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<null-data :img="require('~/static/images/order_null.png')" text="暂无售后~"></null-data>
|
||||
</template>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
<input-express v-model="showInput" :aid="aid" @success="getAfterSaleList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { AfterSaleType } from "@/utils/type";
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
data() {
|
||||
return {
|
||||
activeName: AfterSaleType.NORMAL,
|
||||
afterSale: [
|
||||
{
|
||||
type: AfterSaleType.NORMAL,
|
||||
list: [],
|
||||
name: "售后申请",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: AfterSaleType.HANDLING,
|
||||
list: [],
|
||||
name: "处理中",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: AfterSaleType.FINISH,
|
||||
list: [],
|
||||
name: "已处理",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
],
|
||||
showInput: false,
|
||||
aid: -1,
|
||||
};
|
||||
},
|
||||
async asyncData({ $get, $post }) {
|
||||
let afterList = [];
|
||||
let res = await $get("after_sale/lists", {
|
||||
params: { page_no: 1, page_size: 10 },
|
||||
});
|
||||
if (res.code == 1) {
|
||||
const { list, count } = res.data;
|
||||
afterList = { list, count };
|
||||
}
|
||||
return {
|
||||
afterList: afterList,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
handleClick() {
|
||||
this.getAfterSaleList();
|
||||
},
|
||||
|
||||
onInputShow(e) {
|
||||
this.aid = e;
|
||||
this.showInput = true;
|
||||
},
|
||||
|
||||
changePage(val) {
|
||||
this.afterSale.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
item.page = val;
|
||||
}
|
||||
});
|
||||
this.getAfterSaleList();
|
||||
},
|
||||
async getAfterSaleList() {
|
||||
const { activeName, afterSale } = this;
|
||||
const item = afterSale.find((item) => item.type == activeName);
|
||||
const {
|
||||
data: { list, count },
|
||||
code,
|
||||
} = await this.$get("after_sale/lists", {
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: item.page,
|
||||
type: activeName,
|
||||
},
|
||||
});
|
||||
if (code == 1) {
|
||||
this.afterList = { list, count };
|
||||
}
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
afterList: {
|
||||
immediate: true,
|
||||
handler(val) {
|
||||
this.afterSale.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
Object.assign(item, val);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.after-sales {
|
||||
.after-sales-header {
|
||||
padding: 15px;
|
||||
}
|
||||
::v-deep .el-tabs__header {
|
||||
margin-left: 5px;
|
||||
}
|
||||
::v-deep .el-tabs .el-tabs__nav-scroll {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,336 +0,0 @@
|
|||
<template>
|
||||
<div class="user-collection-container">
|
||||
<div class="user-collection-content">
|
||||
<el-tabs v-model="activeName" class="mt10" @tab-click="handleClick">
|
||||
<el-tab-pane v-for="(item, index) in userCollection" :label="item.name" :name="item.type+''"
|
||||
:key="index">
|
||||
<div v-if="index == activeName">
|
||||
|
||||
<template v-if="userCollection[activeName].lists.length">
|
||||
<!-- 商品收藏 -->
|
||||
<template v-if="activeName == 0">
|
||||
<div @click.stop="$router.push({
|
||||
path: '/goods_details/'+item2.id
|
||||
})" class="goods"
|
||||
v-for="(item2, index2) in item.lists" :key="index2">
|
||||
<div class="goods-image">
|
||||
<el-image style="width: 180px; height: 180px" :src="item2.image" fit="fit">
|
||||
</el-image>
|
||||
<div class="goods-image-wrap flex">
|
||||
<div @click.stop="cancelColl(item2.id)">取消收藏</div>
|
||||
<div @click.stop="$router.push({
|
||||
path: '/shop_street_detail',
|
||||
query: {
|
||||
id: item2.shop_id
|
||||
}
|
||||
})">进入店铺</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="goods-name m-t-10">
|
||||
<div class="line-2">{{item2.name}}</div>
|
||||
</div>
|
||||
<div class="m-t-14">
|
||||
<span class="primary xl">¥{{item2.min_price}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- 店铺收藏 -->
|
||||
<template v-if="activeName == 1">
|
||||
<div class="shop flex" style="width:100%" v-for="(item2, index2) in item.lists" :key="index2">
|
||||
<!-- 店铺 -->
|
||||
<div class="shop-item flex-col row-right" :style="{
|
||||
'background-image': `url(${item2.cover})`,
|
||||
}">
|
||||
<div class="shop-wrap xs flex">
|
||||
<div @click.stop="cancelColl(item2.id)">取消收藏</div>
|
||||
<div @click.stop="$router.push({
|
||||
path: '/shop_street_detail',
|
||||
query: {
|
||||
id: item2.shop_id
|
||||
}
|
||||
})">进入店铺</div>
|
||||
</div>
|
||||
<div class="bg-white shop-info text-center">
|
||||
<el-image class="logo" :src="item2.logo"></el-image>
|
||||
<div class="m-t-12 line-1 lg">
|
||||
{{ item2.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 店铺下的商品 -->
|
||||
<div style="width: 100%" class="flex-1 m-l-20" v-if="item2.goods_list.length >= 1">
|
||||
<div class="shop-title flex row-between">
|
||||
<span>店铺推荐</span>
|
||||
<div class="pointer" @click.stop="$router.push({
|
||||
path: '/shop_street_detail',
|
||||
query: {
|
||||
id: item2.shop_id
|
||||
}
|
||||
})">
|
||||
进入店铺<i class="el-icon-arrow-right"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="m-t-20 flex">
|
||||
<div class="m-r-16" @click.stop="$router.push({
|
||||
path: '/goods_details/'+item3.id
|
||||
})" v-for="(item3, index3) in item2.goods_list" :key="index3">
|
||||
<el-image style="width: 150px; height: 150px" :src="item3.image"
|
||||
fit="fit">
|
||||
</el-image>
|
||||
<div class="primary flex row-center m-t-10">
|
||||
¥{{item3.min_price}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<template v-else>
|
||||
<null-data :img="require('~/static/images/profit_null.png')" text="暂无收藏~"></null-data>
|
||||
</template>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
<!-- <null-data
|
||||
style="padding: 150px"
|
||||
img-style="width: 94px;height:118px"
|
||||
:img="require('~/assets/images/img_null.png')"
|
||||
text="请前往移动端进行查看"
|
||||
></null-data> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
data() {
|
||||
return {
|
||||
activeName: 0,
|
||||
recodeList: {},
|
||||
userCollection: [
|
||||
{
|
||||
type: 0,
|
||||
lists: [],
|
||||
name: "商品",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: 1,
|
||||
lists: [],
|
||||
name: "店铺",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
fetch() {
|
||||
this.handleClick();
|
||||
},
|
||||
mounted() {
|
||||
this.getRecodeList();
|
||||
},
|
||||
methods: {
|
||||
handleClick() {
|
||||
this.getRecodeList();
|
||||
},
|
||||
|
||||
changePage(val) {
|
||||
this.userCollection.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
item.page = val;
|
||||
}
|
||||
});
|
||||
this.getRecodeList();
|
||||
},
|
||||
|
||||
async getRecodeList() {
|
||||
const { activeName, userCollection } = this;
|
||||
const item = userCollection.find((item) => item.type == activeName);
|
||||
const {
|
||||
data: { lists, count },
|
||||
code,
|
||||
} =
|
||||
activeName == 0
|
||||
? await this.$get("goods_collect/lists", {
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: item.page,
|
||||
},
|
||||
})
|
||||
: await this.$get("pc/shopFollowList", {
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: item.page,
|
||||
},
|
||||
});
|
||||
if (code == 1) {
|
||||
this.recodeList = { lists, count };
|
||||
}
|
||||
},
|
||||
|
||||
async cancelColl(id) {
|
||||
const { code, msg } =
|
||||
this.activeName == 0
|
||||
? await this.$post("goods_collect/changeStatus", {
|
||||
goods_id: id,
|
||||
})
|
||||
: await this.$post("shop_follow/changeStatus", {
|
||||
shop_id: id,
|
||||
});
|
||||
|
||||
if (code == 1) {
|
||||
this.$message.success("取消成功");
|
||||
}
|
||||
this.getRecodeList();
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
recodeList: {
|
||||
immediate: true,
|
||||
handler(val) {
|
||||
console.log("val:", val);
|
||||
this.userCollection.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
Object.assign(item, val);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.user-collection-container {
|
||||
width: 980px;
|
||||
padding: 10px 10px 60px 10px;
|
||||
|
||||
::v-deep .el-tabs__header {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-tabs .el-tabs__nav-scroll {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.user-collection-content {
|
||||
// margin-top: 17px;
|
||||
.goods {
|
||||
width: 180px;
|
||||
height: 260px;
|
||||
margin-right: 15px;
|
||||
margin-bottom: 30px;
|
||||
float: left;
|
||||
&-image {
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
}
|
||||
&-image:hover .goods-image-wrap {
|
||||
opacity: 1;
|
||||
}
|
||||
&-image-wrap {
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 180px;
|
||||
height: 26px;
|
||||
padding: 8px 0;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s linear;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
> div {
|
||||
width: 90px;
|
||||
cursor: pointer;
|
||||
}
|
||||
> div:first-child {
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
.goods:nth-child(5n) {
|
||||
margin-right: 0;
|
||||
}
|
||||
.goods-name {
|
||||
height: 36px;
|
||||
color: #101010;
|
||||
}
|
||||
|
||||
.shop {
|
||||
padding: 20px 0;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.shop-item:hover .shop-wrap {
|
||||
opacity: 1;
|
||||
}
|
||||
.shop-item {
|
||||
width: 148px;
|
||||
height: 220px;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
padding: 10px;
|
||||
border-radius: 6px;
|
||||
position: relative;
|
||||
.shop-wrap {
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
width: 148px;
|
||||
height: 26px;
|
||||
padding: 8px 0;
|
||||
color: #fff;
|
||||
opacity: 0;
|
||||
text-align: center;
|
||||
transition: opacity 0.2s linear;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
> div {
|
||||
width: 74px;
|
||||
cursor: pointer;
|
||||
}
|
||||
> div:first-child {
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
}
|
||||
.shop-info {
|
||||
border-radius: 6px;
|
||||
padding: 18px 15px;
|
||||
|
||||
.logo {
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
border-radius: 50%;
|
||||
margin-top: -45px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.shop:last-child {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,133 +0,0 @@
|
|||
<template>
|
||||
<div class="user-coupons">
|
||||
<div class="coupons-header lg">
|
||||
我的优惠券
|
||||
</div>
|
||||
|
||||
<div class="tabs">
|
||||
<el-button v-for="(value,key,index) in expand" @click="changeTabs(index)" :key="key" class="button m-l-18"
|
||||
:class="index==active?'active':''" type="primary">
|
||||
{{coupons[index].title}}({{value}})</el-button>
|
||||
|
||||
<div v-for="(item2, index2) in coupons" :key="index2">
|
||||
<div class="m-t-20" v-if="index2==active">
|
||||
<coupons-list v-if="item2.hasData" :list="item2.list" :type="active" />
|
||||
<null-data v-else :img="require('~/static/images/coupon_null.png')" text="暂无优惠券~"></null-data>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
active: 0,
|
||||
expand: {
|
||||
valid: 0,
|
||||
used: 0,
|
||||
expired: 0,
|
||||
},
|
||||
coupons: [
|
||||
{
|
||||
title: "可使用",
|
||||
type: "valid",
|
||||
list: [],
|
||||
hasData: true,
|
||||
},
|
||||
{
|
||||
title: "已使用",
|
||||
type: "used",
|
||||
list: [],
|
||||
hasData: true,
|
||||
},
|
||||
{
|
||||
title: "已过期",
|
||||
type: "expired",
|
||||
list: [],
|
||||
hasData: true,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.getMyCoupons();
|
||||
},
|
||||
methods: {
|
||||
changeTabs(index) {
|
||||
this.active = index;
|
||||
this.getMyCoupons();
|
||||
},
|
||||
async getMyCoupons() {
|
||||
let { data, code } = await this.$get("coupon/myCouponList", {
|
||||
params: {
|
||||
type: this.coupons[this.active].type + "",
|
||||
page_size: 100,
|
||||
},
|
||||
});
|
||||
if (code == 1) {
|
||||
for (const key in this.expand) {
|
||||
this.$set(this.expand, key, data.expand[key]);
|
||||
}
|
||||
this.changeData(data);
|
||||
}
|
||||
},
|
||||
changeData(data) {
|
||||
this.coupons.some((item, index) => {
|
||||
console.log(data, index);
|
||||
if (index == this.active) {
|
||||
Object.assign(item, {
|
||||
list: data.lists,
|
||||
hasData: data.lists.length,
|
||||
});
|
||||
return true;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.user-coupons {
|
||||
width: 980px;
|
||||
.coupons-header {
|
||||
padding: 20px 15px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
padding: 15px 0;
|
||||
.button {
|
||||
width: 104px;
|
||||
height: 30px;
|
||||
line-height: 0px;
|
||||
display: inline-block;
|
||||
background: #fff;
|
||||
color: #666;
|
||||
border: 1px solid #e5e5e5;
|
||||
}
|
||||
.active {
|
||||
color: #fff;
|
||||
border: 0;
|
||||
background: $--color-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,240 +0,0 @@
|
|||
<template>
|
||||
<div class="evaluate">
|
||||
<div class="goods">
|
||||
<div class="goods-hd lighter flex">
|
||||
<div class="info flex flex-1">商品信息</div>
|
||||
<div class="price flex row-center">单价</div>
|
||||
<div class="num flex row-center">数量</div>
|
||||
<div class="total flex row-center">合计</div>
|
||||
</div>
|
||||
<div class="goods-con">
|
||||
<div class="goods-item flex ">
|
||||
<div class="info flex flex-1">
|
||||
<img class="goods-img" :src="goodsInfo.goods_item.image" alt="" />
|
||||
<div class="goods-info flex flex-1">
|
||||
<div class="goods-name line-2">
|
||||
{{ goodsInfo.name }}
|
||||
</div>
|
||||
<div class="sm lighter m-t-8">{{goodsInfo.spec_value_str}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="price flex row-center">
|
||||
<price-formate :price="goodsInfo.goods_price" weight="400" />
|
||||
</div>
|
||||
<div class="num flex row-center">{{ goodsInfo.goods_num }}</div>
|
||||
<div class="total flex row-center">
|
||||
<price-formate :price="goodsInfo.total_price" weight="400" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="evaluate-con">
|
||||
<div class="goods-rate">
|
||||
<div class="flex item">
|
||||
<div class="name">商品评价</div>
|
||||
<el-rate v-model="goodsRate" show-text text-color="#FF9E2C" :texts="goodsTexts"></el-rate>
|
||||
</div>
|
||||
<div class="flex item">
|
||||
<div class="name">描述相符</div>
|
||||
<el-rate v-model="descRate"></el-rate>
|
||||
</div>
|
||||
<div class="flex item">
|
||||
<div class="name">服务态度</div>
|
||||
<el-rate v-model="serverRate"></el-rate>
|
||||
</div>
|
||||
<div class="flex item">
|
||||
<div class="name">配送服务</div>
|
||||
<el-rate v-model="deliveryRate"></el-rate>
|
||||
</div>
|
||||
</div>
|
||||
<div class="evaluate-input flex">
|
||||
<div class="name">商品评价</div>
|
||||
<div>
|
||||
<el-input type="textarea" placeholder="收到商品您有什么想法或者反馈,用几个字来评价下商品吧~" v-model="comment"
|
||||
maxlength="150" :rows="6" show-word-limit resize="none">
|
||||
</el-input>
|
||||
<div class="upload m-t-16">
|
||||
<upload :limit="9" @success="onSuccess" />
|
||||
<div class="muted m-t-8">
|
||||
最多可上传9张图片,支持jpg、png格式,图片大小1M以内
|
||||
</div>
|
||||
</div>
|
||||
<div class="submit-btn white bg-primary m-t-16 flex row-center" @click="onSubmit">
|
||||
提交评价
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
}, ],
|
||||
};
|
||||
},
|
||||
async asyncData({
|
||||
$get,
|
||||
query
|
||||
}) {
|
||||
const id = query.id;
|
||||
let {
|
||||
data
|
||||
} = await $get("goods_comment/getCommentPage", {
|
||||
params: {
|
||||
order_goods_id: id,
|
||||
},
|
||||
});
|
||||
return {
|
||||
goodsInfo: data,
|
||||
id,
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
data() {
|
||||
return {
|
||||
goodsInfo: {},
|
||||
goodsRate: 0,
|
||||
descRate: 0,
|
||||
serverRate: 0,
|
||||
deliveryRate: 0,
|
||||
comment: "",
|
||||
fileList: [],
|
||||
goodsTexts: ["差评", "差评", "中评", "好评", "好评"],
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
onSuccess(res) {
|
||||
console.log('res', res)
|
||||
this.fileList = res.map((item) => item.response.data);
|
||||
console.log('fileList', this.fileList)
|
||||
},
|
||||
onSubmit() {
|
||||
let {
|
||||
goodsRate,
|
||||
fileList,
|
||||
comment,
|
||||
deliveryRate,
|
||||
descRate,
|
||||
serverRate,
|
||||
} = this;
|
||||
let image = fileList.map((item) => item.uri);
|
||||
if (!goodsRate)
|
||||
return this.$message({
|
||||
message: "请对商品进行评分",
|
||||
type: "error",
|
||||
});
|
||||
if (!descRate)
|
||||
return this.$message({
|
||||
message: "请对描述相符进行评分",
|
||||
type: "error",
|
||||
});
|
||||
if (!serverRate)
|
||||
return this.$message({
|
||||
message: "请对服务态度进行评分",
|
||||
type: "error",
|
||||
});
|
||||
if (!deliveryRate)
|
||||
return this.$message({
|
||||
message: "请对配送服务进行评分",
|
||||
type: "error",
|
||||
});
|
||||
this.$post("goods_comment/addGoodsComment", {
|
||||
id: parseInt(this.id),
|
||||
goods_comment: goodsRate,
|
||||
service_comment: serverRate,
|
||||
express_comment: deliveryRate,
|
||||
description_comment: descRate,
|
||||
comment,
|
||||
image,
|
||||
order_goods_id: this.$route.query.id
|
||||
}).then((res) => {
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: "评价成功",
|
||||
type: "success",
|
||||
});
|
||||
setTimeout(() => {
|
||||
this.$router.replace({
|
||||
path: "/user/evaluation",
|
||||
// query: {
|
||||
// type: 2,
|
||||
// },
|
||||
});
|
||||
}, 1500);
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.evaluate {
|
||||
width: 1010px;
|
||||
padding: 0 10px;
|
||||
|
||||
.goods {
|
||||
|
||||
.goods-hd,
|
||||
.goods-con {
|
||||
padding: 10px 20px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
|
||||
.goods-item {
|
||||
padding: 10px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.info {
|
||||
.goods-img {
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.price,
|
||||
.num,
|
||||
.total {
|
||||
width: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
.evaluate-con {
|
||||
padding: 20px;
|
||||
|
||||
.goods-rate {
|
||||
.item {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
.name {
|
||||
margin-right: 24px;
|
||||
flex: none;
|
||||
}
|
||||
|
||||
.evaluate-input {
|
||||
align-items: flex-start;
|
||||
|
||||
.el-textarea {
|
||||
width: 630px;
|
||||
}
|
||||
|
||||
.submit-btn {
|
||||
width: 100px;
|
||||
height: 32px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,149 +0,0 @@
|
|||
<template>
|
||||
<div class="user-evaluate">
|
||||
<el-tabs v-model="type" @tab-click="handleClick">
|
||||
<el-tab-pane v-for="(item, index) in evaluate" :key="index" :label="item.name" :name="item.type">
|
||||
<template v-if="item.lists.length">
|
||||
<evaluation-list :list="item.lists" :type="item.type" :userInfo="userInfo"/>
|
||||
<div class="pagination flex row-center" v-if="item.count">
|
||||
<el-pagination hide-on-single-page background layout="prev, pager, next" :total="item.count"
|
||||
prev-text="上一页" next-text="下一页" :page-size="10" @current-change="changePage">
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<null-data v-else :img="require('~/static/images/news_null.png')" text="暂无评价~"></null-data>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
}, ],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
|
||||
watchQuery: true,
|
||||
async asyncData({
|
||||
$get,
|
||||
query
|
||||
}) {
|
||||
const type = query.type || "1";
|
||||
let {
|
||||
data: {
|
||||
lists,
|
||||
count
|
||||
}
|
||||
} = await $get("goods_comment/getUnCommentOrder", { // 未评价列表
|
||||
params: {
|
||||
page_size: 10
|
||||
},
|
||||
});
|
||||
|
||||
let {
|
||||
data: userInfo
|
||||
} = await $get("user/info"); // 用户信息
|
||||
|
||||
return {
|
||||
commentList: {
|
||||
lists,
|
||||
count
|
||||
},
|
||||
type,
|
||||
userInfo,
|
||||
};
|
||||
},
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
evaluate: [{
|
||||
type: "1",
|
||||
lists: [],
|
||||
name: "待评价",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: "2",
|
||||
lists: [],
|
||||
name: "已评价",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
handleClick() {
|
||||
this.getEvaluateList();
|
||||
},
|
||||
async getEvaluateList() {
|
||||
const {
|
||||
type,
|
||||
evaluate
|
||||
} = this;
|
||||
const item = evaluate.find((item) => item.type == type);
|
||||
const {
|
||||
data: {
|
||||
lists,
|
||||
count
|
||||
},
|
||||
code,
|
||||
} = type == 1 ? await this.$get("goods_comment/getUnCommentOrder", { // 未评价列表
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: item.page,
|
||||
},
|
||||
}) : await this.$get("goods_comment/getCommentOrder", { // 已评价列表
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: item.page,
|
||||
},
|
||||
});
|
||||
|
||||
if (code == 1) {
|
||||
this.commentList = {
|
||||
lists,
|
||||
count
|
||||
};
|
||||
}
|
||||
},
|
||||
changePage(val) {
|
||||
this.evaluate.some((item) => {
|
||||
if (item.type == this.type) {
|
||||
item.page = val;
|
||||
}
|
||||
});
|
||||
this.getEvaluateList();
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
commentList: {
|
||||
immediate: true,
|
||||
handler(val) {
|
||||
this.evaluate.some((item) => {
|
||||
if (item.type == this.type) {
|
||||
Object.assign(item, val);
|
||||
console.log(item);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.user-evaluate {
|
||||
width: 1000px;
|
||||
padding: 20px 0;
|
||||
}
|
||||
</style>
|
|
@ -1,453 +0,0 @@
|
|||
<template>
|
||||
<div class="order-detail">
|
||||
<div class="detail-hd row-between">
|
||||
<div class="lg">订单详情</div>
|
||||
<div :class="[
|
||||
'status lg',
|
||||
{ primary: orderDetail.order_status == 0 },
|
||||
]">
|
||||
{{ orderDetail.order_status_desc }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="address">
|
||||
<div class="address-item">
|
||||
<div class="lighter address-item-label">收件人:</div>
|
||||
<div>{{ orderDetail.consignee }}</div>
|
||||
</div>
|
||||
<div class="address-item">
|
||||
<div class="lighter address-item-label">联系方式:</div>
|
||||
<div>{{ orderDetail.mobile }}</div>
|
||||
</div>
|
||||
|
||||
<div class="address-item">
|
||||
<div class="lighter address-item-label">收货地址:</div>
|
||||
<div>{{ orderDetail.delivery_address }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="detail-con">
|
||||
<div class="title flex">
|
||||
<nuxt-link class="flex-1 lighter sm line-1 m-r-20" style="min-width: 0"
|
||||
:to="`/shop_street_detail?id=${orderDetail.shop.id}`">
|
||||
{{ orderDetail.shop.name }}
|
||||
</nuxt-link>
|
||||
<div class="flex-1 lighter sm">
|
||||
下单时间:{{ orderDetail.create_time }}
|
||||
</div>
|
||||
<div class="flex-1 lighter sm">
|
||||
订单编号:{{ orderDetail.order_sn }}
|
||||
</div>
|
||||
<div :class="[
|
||||
'status sm',
|
||||
{ primary: orderDetail.order_status == 0 },
|
||||
]">
|
||||
{{ getOrderStatus(orderDetail.order_status) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="goods">
|
||||
<div class="goods-hd lighter flex">
|
||||
<div class="info flex-1">商品信息</div>
|
||||
<div class="price flex row-center">商品价格</div>
|
||||
<div class="num flex row-center">数量</div>
|
||||
<div class="total flex row-center">合计</div>
|
||||
</div>
|
||||
<div class="goods-list">
|
||||
<div class="goods-item flex" v-for="(item, index) in orderDetail.order_goods" :key="index">
|
||||
<nuxt-link :to="`/goods_details/${item.goods_id}`" class="info flex flex-1">
|
||||
<el-image class="goods-img" :src="item.image" alt="" />
|
||||
<div class="goods-info flex-1">
|
||||
<div class="goods-name line-2">
|
||||
<el-tag size="mini" effect="plain" v-if="item.is_seckill">秒杀</el-tag>
|
||||
{{ item.goods_name }}
|
||||
</div>
|
||||
<div class="sm lighter m-t-8">
|
||||
{{ item.spec_value }}
|
||||
</div>
|
||||
</div>
|
||||
</nuxt-link>
|
||||
<div class="price">
|
||||
<price-formate :price="item.goods_price" />
|
||||
</div>
|
||||
<div class="num flex row-center">{{ item.goods_num }}</div>
|
||||
<div class="total flex row-center">
|
||||
<price-formate :price="item.sum_price" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-t-16" v-if="orderDetail.user_remark">
|
||||
<span class="lighter m-r-8">买家留言:</span>
|
||||
<span>{{ orderDetail.user_remark }}</span>
|
||||
</div>
|
||||
<div class="m-t-16" v-if="orderDetail.delivery_content">
|
||||
<span class="lighter m-r-8">发货内容:</span>
|
||||
<span>{{ orderDetail.delivery_content }}</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-footer flex">
|
||||
<div>
|
||||
<div class="flex-col" style="align-items: flex-end">
|
||||
<div class="money flex m-b-8">
|
||||
<div class="lighter">商品总价:</div>
|
||||
<div>
|
||||
<price-formate :price="orderDetail.goods_price" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="money flex m-b-8">
|
||||
<div class="lighter">运费:</div>
|
||||
<div>
|
||||
<price-formate :price="orderDetail.shipping_price" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="money flex m-b-8">
|
||||
<div class="lighter">会员抵扣:</div>
|
||||
<div class="primary">
|
||||
-<price-formate :price="orderDetail.member_amount" color="#FF0808" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="money flex m-b-16" v-if="orderDetail.discount_amount != 0">
|
||||
<div class="lighter">优惠券:</div>
|
||||
<div>
|
||||
-
|
||||
<price-formate :price="orderDetail.discount_amount" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="money flex">
|
||||
<div class="lighter">实付金额:</div>
|
||||
<div class="primary">
|
||||
<price-formate :price="orderDetail.order_amount" :subscript-size="14" :first-size="28"
|
||||
:second-size="28" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oprate-btn flex row-right m-t-16">
|
||||
<div class="btn plain flex row-center lighter" v-if="orderDetail.cancel_btn"
|
||||
@click="handleOrder(0)">
|
||||
取消订单
|
||||
</div>
|
||||
<div class="btn plain flex row-center m-l-8 lighter" v-if="orderDetail.delivery_btn"
|
||||
@click="showDeliverPop = true">
|
||||
物流查询
|
||||
</div>
|
||||
<div class="btn bg-primary flex row-center white m-l-8" v-if="orderDetail.take_btn"
|
||||
@click="handleOrder(2)">
|
||||
确认收货
|
||||
</div>
|
||||
<div class="btn plain flex row-center lighter m-l-8" v-if="orderDetail.del_btn"
|
||||
@click="handleOrder(1)">
|
||||
删除订单
|
||||
</div>
|
||||
<nuxt-link :to="`/payment?id=${orderDetail.id}&from=order`"
|
||||
class="btn bg-primary flex row-center white m-l-8" v-if="orderDetail.pay_btn">
|
||||
<span class="mr8">去付款</span>
|
||||
<count-down v-if="
|
||||
getCancelTime(orderDetail.order_cancel_time) > 0
|
||||
" :time="getCancelTime(orderDetail.order_cancel_time)" format="hh:mm:ss"
|
||||
@finish="getOrderDetail" />
|
||||
</nuxt-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="detail-upload" v-if="orderDetail.frontend_array.length > 0">
|
||||
<div class="tit">上传合同列表</div>
|
||||
<div class="img-boxs">
|
||||
<div class="img" v-for="(item, index) in orderDetail.frontend_array" :key="index">
|
||||
<el-image
|
||||
style="width: 100%; height: 100%"
|
||||
:src="baseUrl + item"
|
||||
:preview-src-list="frontend_arrayNew"
|
||||
>
|
||||
</el-image>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<deliver-search v-model="showDeliverPop" :aid="id" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { copyClipboard } from '@/utils/tools'
|
||||
import config from "~/config/app";
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
layout: 'user',
|
||||
async asyncData({ $get, query }) {
|
||||
const { data, code } = await $get('order/getOrderDetail', {
|
||||
params: {
|
||||
id: query.id,
|
||||
},
|
||||
})
|
||||
|
||||
if (code == 1) {
|
||||
return {
|
||||
orderDetail: data,
|
||||
id: query.id,
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
orderDetail: {},
|
||||
showDeliverPop: false,
|
||||
baseUrl:config.baseUrl + '/',
|
||||
frontend_arrayNew:[], //大图带域名
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (this.orderDetail.delivery_type === 2) {
|
||||
this.creatQrCode(this.orderDetail.pickup_code)
|
||||
}
|
||||
if(this.orderDetail.frontend_array) {
|
||||
this.frontend_arrayNew = this.orderDetail.frontend_array.map(item => {
|
||||
return this.baseUrl + item
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
async getOrderDetail() {
|
||||
const { data, code } = await this.$get('order/getOrderDetail', {
|
||||
params: {
|
||||
id: this.id,
|
||||
},
|
||||
})
|
||||
if (code == 1) {
|
||||
this.orderDetail = data
|
||||
}
|
||||
},
|
||||
handleOrder(type) {
|
||||
this.type = type
|
||||
this.$confirm(this.getTipsText(type), {
|
||||
title: '温馨提示',
|
||||
center: true,
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
width: '300px',
|
||||
callback: (action) => {
|
||||
if (action == 'confirm') {
|
||||
this.postOrder()
|
||||
}
|
||||
},
|
||||
})
|
||||
},
|
||||
async postOrder() {
|
||||
const { type, id } = this
|
||||
let url = ''
|
||||
switch (type) {
|
||||
case 0:
|
||||
url = 'order/cancel'
|
||||
break
|
||||
case 1:
|
||||
url = 'order/del'
|
||||
break
|
||||
case 2:
|
||||
url = 'order/confirm'
|
||||
break
|
||||
}
|
||||
let { code, data, msg } = await this.$post(url, { id })
|
||||
if (code == 1) {
|
||||
this.$message({
|
||||
message: msg,
|
||||
type: 'success',
|
||||
})
|
||||
if (type == 1) {
|
||||
setTimeout(() => {
|
||||
this.$router.go(-1)
|
||||
}, 1500)
|
||||
} else {
|
||||
this.getOrderDetail()
|
||||
}
|
||||
}
|
||||
},
|
||||
getTipsText(type) {
|
||||
switch (type) {
|
||||
case 0:
|
||||
return '确认取消订单吗?'
|
||||
case 1:
|
||||
return '确认删除订单吗?'
|
||||
case 2:
|
||||
return '确认收货吗?'
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
getOrderStatus() {
|
||||
return (status) => {
|
||||
let text = ''
|
||||
switch (status) {
|
||||
case 0:
|
||||
text = '待支付'
|
||||
break
|
||||
case 1:
|
||||
text = '待发货'
|
||||
break
|
||||
case 2:
|
||||
text = '待收货'
|
||||
break
|
||||
case 3:
|
||||
text = '已完成'
|
||||
break
|
||||
case 4:
|
||||
text = '订单已关闭'
|
||||
break
|
||||
}
|
||||
return text
|
||||
}
|
||||
},
|
||||
getCancelTime() {
|
||||
return (time) => time - Date.now() / 1000
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.order-detail {
|
||||
padding: 0 16px 20px;
|
||||
|
||||
.detail-hd {
|
||||
padding: 14px 5px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
.address {
|
||||
padding: 16px 0;
|
||||
|
||||
>div {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
&-item {
|
||||
display: flex;
|
||||
|
||||
&-label {
|
||||
width: 70px;
|
||||
text-align: justify;
|
||||
text-align-last: justify;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.detail-con {
|
||||
.title {
|
||||
height: 40px;
|
||||
background: #f2f2f2;
|
||||
border: 1px solid #e5e5e5;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.goods {
|
||||
|
||||
.goods-hd,
|
||||
.goods-list {
|
||||
padding: 10px 20px;
|
||||
border: 1px solid #e5e5e5;
|
||||
border-top-width: 0;
|
||||
|
||||
.goods-item {
|
||||
padding: 10px 0;
|
||||
|
||||
.goods-name {
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.info {
|
||||
.goods-img {
|
||||
width: 72px;
|
||||
height: 72px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.price,
|
||||
.num,
|
||||
.total {
|
||||
width: 150px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.detail-footer {
|
||||
padding: 25px 20px;
|
||||
justify-content: flex-end;
|
||||
|
||||
.money {
|
||||
>div {
|
||||
text-align: right;
|
||||
|
||||
&:first-of-type {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
&:last-of-type {
|
||||
width: 120px;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.oprate-btn {
|
||||
.btn {
|
||||
width: 152px;
|
||||
height: 44px;
|
||||
cursor: pointer;
|
||||
border-radius: 2px;
|
||||
|
||||
&.plain {
|
||||
border: $--border-base;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.qr-container {
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
padding: 6px;
|
||||
border: $--border-base;
|
||||
border-radius: 6px;
|
||||
}
|
||||
}
|
||||
.detail-upload {
|
||||
.tit {
|
||||
font-size: 20px;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
line-height: 1;
|
||||
margin-bottom: 20px;
|
||||
border-left: 4px solid #f00;
|
||||
padding-left: 14px;
|
||||
}
|
||||
.img-boxs {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
.img {
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
margin-top: 10px;
|
||||
margin-right: 15px;
|
||||
border: 1px solid #ededed;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,184 +0,0 @@
|
|||
<template>
|
||||
<div class="user-order">
|
||||
<div class="download-box">
|
||||
<a target="_blank" :href="download_contract.domain + '/' + download_contract.path"><el-button type="success" icon="el-icon-download" size="medium">下载合同</el-button></a>
|
||||
</div>
|
||||
<el-tabs v-model="activeName" @tab-click="handleClick">
|
||||
<el-tab-pane
|
||||
v-for="(item, index) in order"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:name="item.type"
|
||||
>
|
||||
<template v-if="item.list.length">
|
||||
<order-list :list="item.list" @refresh="getOrderList" />
|
||||
<div class="pagination flex row-center" v-if="item.count">
|
||||
<el-pagination
|
||||
hide-on-single-page
|
||||
background
|
||||
layout="prev, pager, next"
|
||||
:total="item.count"
|
||||
prev-text="上一页"
|
||||
next-text="下一页"
|
||||
:page-size="10"
|
||||
@current-change="changePage"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</template>
|
||||
<null-data
|
||||
v-else
|
||||
:img="require('~/static/images/order_null.png')"
|
||||
text="暂无订单~"
|
||||
></null-data>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Message } from 'element-ui';
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: 'icon',
|
||||
type: 'image/x-icon',
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
layout: 'user',
|
||||
async asyncData({query, $get, $post }) {
|
||||
let that = this;
|
||||
let download_contract = {};
|
||||
const {
|
||||
data: { list, count },
|
||||
code,
|
||||
} = await $get('order/lists', {
|
||||
params: {
|
||||
page_size: 10,
|
||||
},
|
||||
})
|
||||
await $post('order/contractDownload', {}).then(({ code, data, msg }) => {
|
||||
if (code == 1) {
|
||||
download_contract = data;
|
||||
}
|
||||
})
|
||||
if(query.is_frontend == 1) {
|
||||
Message.success('订单前置成功')
|
||||
}
|
||||
if (code == 1) {
|
||||
return {
|
||||
orderList: { list, count },
|
||||
download_contract
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
activeName: 'all',
|
||||
order: [
|
||||
{
|
||||
type: 'all',
|
||||
list: [],
|
||||
name: '全部',
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: 'pay',
|
||||
list: [],
|
||||
name: '待付款',
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: 'delivery',
|
||||
list: [],
|
||||
name: '待收货',
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: 'finish',
|
||||
list: [],
|
||||
name: '已完成',
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: 'close',
|
||||
list: [],
|
||||
name: '已关闭',
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
],
|
||||
download_contract:{} //下载合同地址
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleClick() {
|
||||
this.getOrderList()
|
||||
},
|
||||
async getOrderList() {
|
||||
const { activeName, order } = this
|
||||
const item = order.find((item) => item.type == activeName)
|
||||
const {
|
||||
data: { list, count },
|
||||
code,
|
||||
} = await this.$get('order/lists', {
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: item.page,
|
||||
type: activeName,
|
||||
},
|
||||
})
|
||||
if (code == 1) {
|
||||
this.orderList = { list, count }
|
||||
}
|
||||
},
|
||||
changePage(val) {
|
||||
this.order.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
item.page = val
|
||||
}
|
||||
})
|
||||
this.getOrderList()
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
orderList: {
|
||||
immediate: true,
|
||||
handler(val) {
|
||||
this.order.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
Object.assign(item, val)
|
||||
console.log(item)
|
||||
return true
|
||||
}
|
||||
})
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.user-order {
|
||||
padding: 20px 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.download-box {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 22px;
|
||||
z-index: 999;
|
||||
}
|
||||
</style>
|
|
@ -1,426 +0,0 @@
|
|||
<template>
|
||||
<div class="user-profile">
|
||||
<div class="user-header lg">
|
||||
个人资料
|
||||
</div>
|
||||
<div class="user-container">
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">头像</label>
|
||||
<div class="user-avatar-upload">
|
||||
<el-upload class="avatar-uploader" :action="action" :show-file-list="false" :file-list="fileList"
|
||||
:on-success="uploadFileSuccess" :headers="{token: $store.state.token}"
|
||||
accept="image/jpg,image/jpeg,image/png"
|
||||
:before-upload="beforeAvatarUpload">
|
||||
<div class="avatar">
|
||||
<el-image style="width: 64px;height: 64px;border-radius: 60px" :src="avatar" />
|
||||
<div class="mask white"></div>
|
||||
</div>
|
||||
</el-upload>
|
||||
</div>
|
||||
</div>
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">用户ID</label>
|
||||
<div class="normal nr">{{sn}}</div>
|
||||
</div>
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">昵称</label>
|
||||
<el-input v-model="nickName" class="user-input" suffix-icon="el-icon-edit" />
|
||||
</div>
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">性别</label>
|
||||
<el-radio-group v-model="radio">
|
||||
<el-radio :label="'男'">男</el-radio>
|
||||
<el-radio :label="'女'">女</el-radio>
|
||||
<!-- <el-radio :label="3">保密</el-radio> -->
|
||||
</el-radio-group>
|
||||
</div>
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">手机号</label>
|
||||
<div class="normal nr">{{mobile}}</div>
|
||||
<div style="color: #6699CC;margin-left: 13px;cursor: pointer;" @click="openChangeNumber">
|
||||
{{mobile?'修改号码':'绑定手机号'}}</div>
|
||||
</div>
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">注册时间</label>
|
||||
<div class="normal nr">{{createTime}}</div>
|
||||
</div>
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">登录密码</label>
|
||||
<div class="nr" style="color: #6699CC;cursor: pointer;" @click="openChangePwdPop">修改密码</div>
|
||||
</div>
|
||||
<div class="user-form-item flex">
|
||||
<label class="user-form-label nr">我的团队</label>
|
||||
<div class="normal nr flex">
|
||||
<div class="name">团队名称:<span class="primary">{{team_info.name}}</span></div>
|
||||
<div class="phone m-l-30">联系电话:<span class="primary">{{team_info.phone}}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="primary-btn bg-primary flex-center white" @click="saveUserInfo">
|
||||
保存
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- 修改手机号 -->
|
||||
<el-dialog :center="true" :title="mobile ? '更换手机号': '绑定手机'" :visible.sync="showChangeNumber" width="40%">
|
||||
<div>
|
||||
<el-form style="width: 50%;margin: 0 auto">
|
||||
<el-form-item>
|
||||
<el-input v-model="telephone" placeholder="请输入新的手机号码" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div class="flex">
|
||||
<el-input v-model="verifyCode" placeholder="短信验证码" />
|
||||
<el-button style="margin-left: 14px;" @click="sndSmsToPhone">
|
||||
<div v-if="canSendNumber">获取验证码</div>
|
||||
<count-down v-else :time="60" format="ss秒" autoStart @finish="canSendNumber = true" />
|
||||
</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<el-button style="width:134px" type="primary" @click="changeUserMobile">确认</el-button>
|
||||
<el-button style="width:134px" @click="closeChangeNumber">取消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 登录密码设置 -->
|
||||
<el-dialog title="设置登录密码" :center="true" :visible.sync="showPwdPop" width="40%">
|
||||
<div>
|
||||
<el-form style="width: 50%;margin: 0 auto;">
|
||||
<el-form-item>
|
||||
<el-input v-model="mobile" placeholder="请输入手机号码" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div class="flex">
|
||||
<el-input v-model="verifyCode" placeholder="短信验证码" />
|
||||
<el-button style="margin-left: 14px;" @click="sndSmsToPhone">
|
||||
<div v-if="canSendPwd">获取验证码</div>
|
||||
<count-down v-else :time="60" format="ss秒" autoStart @finish="canSendPwd = true" />
|
||||
</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-input v-model="pwd" type="password" placeholder="请输入密码 (数字与字母自由组合)" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-input v-model="againPwd" type="password" placeholder="再次输入密码" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<el-button style="width:134px" type="primary" @click="setPassWord">确认</el-button>
|
||||
<el-button style="width:134px" @click="closePwdPop">取消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { SMSType, client, FieldType } from "~/utils/type";
|
||||
import Cookies from "js-cookie";
|
||||
import { mapActions } from "vuex";
|
||||
import config from "~/config/app";
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
mounted() {
|
||||
this.getUserInfoFun();
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
avatar: "",
|
||||
mobile: "",
|
||||
sex: 0,
|
||||
createTime: "",
|
||||
sn: "",
|
||||
action: config.baseUrl + "/api/file/formimage",
|
||||
nickName: "",
|
||||
radio: 1,
|
||||
showChangeNumber: false,
|
||||
showPwdPop: false,
|
||||
telephone: "",
|
||||
verifyCode: "",
|
||||
pwd: "",
|
||||
againPwd: "",
|
||||
smsType: SMSType.CHANGE_MOBILE,
|
||||
canSendNumber: true,
|
||||
canSendPwd: true,
|
||||
fileList: [],
|
||||
team_info:{} //团队
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
beforeAvatarUpload(file) {
|
||||
var testmsg = file.name.substring(file.name.lastIndexOf('.') + 1)
|
||||
console.log('fdsadsf')
|
||||
const extension = testmsg === 'jpg'
|
||||
const extension2 = testmsg === 'png'
|
||||
const extension4 = testmsg === 'jpeg'
|
||||
if (!extension && !extension2) {
|
||||
this.$message({
|
||||
message: '上传文件只能是 jpg, jpeg, png格式!',
|
||||
type: 'warning'
|
||||
})
|
||||
return false
|
||||
}
|
||||
return extension || extension2 || extension4
|
||||
},
|
||||
|
||||
...mapActions(["getPublicData"]),
|
||||
|
||||
async getUserInfoFun() {
|
||||
let res = await this.$get("user/info");
|
||||
if (res.code == 1) {
|
||||
this.avatar = res.data.avatar;
|
||||
this.nickName = res.data.nickname;
|
||||
this.mobile = res.data.mobile;
|
||||
this.sex = res.data.sex;
|
||||
this.radio = this.sex;
|
||||
this.createTime = res.data.create_time;
|
||||
this.sn = res.data.sn;
|
||||
}
|
||||
|
||||
let resData = await this.$get("user/center");
|
||||
if (resData.code == 1) {
|
||||
this.team_info = resData.data.team_info;
|
||||
}
|
||||
},
|
||||
|
||||
async saveUserInfo() {
|
||||
let res = await this.$post("pc/changeUserInfo", {
|
||||
sex: this.radio == "男" ? 1 : 2,
|
||||
nickname: this.nickName,
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: "success",
|
||||
});
|
||||
this.getPublicData();
|
||||
}
|
||||
},
|
||||
closeChangeNumber() {
|
||||
this.telephone = "";
|
||||
this.verifyCode = "";
|
||||
this.showChangeNumber = false;
|
||||
},
|
||||
closePwdPop() {
|
||||
this.telephone = "";
|
||||
this.verifyCode = "";
|
||||
this.showPwdPop = false;
|
||||
},
|
||||
|
||||
// 打开修改手机号的弹窗
|
||||
openChangeNumber() {
|
||||
this.showChangeNumber = true;
|
||||
this.smsType = this.mobile ? SMSType.CHANGE_MOBILE : SMSType.BIND;
|
||||
},
|
||||
|
||||
// 打开修改登录密码的弹窗
|
||||
openChangePwdPop() {
|
||||
if (this.mobile == "") return this.$message.error("请先绑定手机号");
|
||||
this.showPwdPop = true;
|
||||
this.smsType = SMSType.FINDPWD;
|
||||
},
|
||||
|
||||
// 发送验证码
|
||||
async sndSmsToPhone() {
|
||||
if (
|
||||
(this.smsType == SMSType.CHANGE_MOBILE ||
|
||||
this.smsType == SMSType.BIND) &&
|
||||
!this.canSendNumber
|
||||
)
|
||||
return;
|
||||
else if (this.smsType == SMSType.FINDPWD && !this.canSendPwd)
|
||||
return;
|
||||
if (this.smsType == SMSType.CHANGE_MOBILE && !this.telephone)
|
||||
return this.$message.error("请输入手机号");
|
||||
|
||||
let res = await this.$post("sms/send", {
|
||||
mobile:
|
||||
this.smsType == SMSType.FINDPWD
|
||||
? this.mobile
|
||||
: this.telephone,
|
||||
key: this.smsType,
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.smsType == SMSType.FINDPWD
|
||||
? (this.canSendPwd = false)
|
||||
: (this.canSendNumber = false);
|
||||
this.$message.success("发送成功");
|
||||
}
|
||||
},
|
||||
|
||||
// 修改手机号码
|
||||
async changeUserMobile() {
|
||||
if (!this.telephone)
|
||||
return this.$message.error("请输入新的手机号码");
|
||||
if (!this.verifyCode) return this.$message.error("请输入验证码");
|
||||
let res = await this.$post("user/changeMobile", {
|
||||
mobile: this.mobile,
|
||||
new_mobile: this.telephone,
|
||||
code: this.verifyCode,
|
||||
action: this.mobile ? "change" : "",
|
||||
client: client,
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.showChangeNumber = false;
|
||||
this.$message.success(res.msg);
|
||||
this.getPublicData();
|
||||
this.getUserInfoFun();
|
||||
}
|
||||
},
|
||||
|
||||
// 设置登录密码
|
||||
async setPassWord() {
|
||||
if (!this.verifyCode) return this.$message.error("请输入验证码");
|
||||
if (!this.pwd) return this.$message.error("请输入密码");
|
||||
if (!this.againPwd) return this.$message.error("请输入确认密码");
|
||||
if (this.pwd != this.againPwd)
|
||||
return this.$message.error("两次密码输入不一致");
|
||||
let res = await this.$post("login_password/forget", {
|
||||
mobile: this.mobile,
|
||||
code: this.verifyCode,
|
||||
password: this.pwd,
|
||||
repassword: this.againPwd,
|
||||
client: client,
|
||||
});
|
||||
if (res.code == 1) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: "success",
|
||||
});
|
||||
this.showPwdPop = false;
|
||||
const token = res.data.token;
|
||||
Cookies.set("token", token, { expires: 60 });
|
||||
}
|
||||
},
|
||||
async uploadFileSuccess(res, fileList) {
|
||||
let respond = await this.$post("user/setInfo", {
|
||||
field: FieldType.AVATAR,
|
||||
value: res.data.uri,
|
||||
});
|
||||
if (respond.code == 1) {
|
||||
this.$message({
|
||||
message: respond.msg,
|
||||
type: "success",
|
||||
});
|
||||
let userRes = await this.$get("user/info");
|
||||
if (userRes.code == 1) {
|
||||
this.avatar = userRes.data.avatar;
|
||||
this.nickName = userRes.data.nickname;
|
||||
this.mobile = userRes.data.mobile;
|
||||
this.sex = userRes.data.sex;
|
||||
this.radio = this.sex;
|
||||
this.createTime = userRes.data.create_time;
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.user-profile {
|
||||
width: 980px;
|
||||
padding: 10px;
|
||||
.user-header {
|
||||
padding: 10px 5px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
.user-container {
|
||||
margin-top: 35px;
|
||||
.user-form-item {
|
||||
padding-left: 13px;
|
||||
margin-top: 24px;
|
||||
.user-form-label {
|
||||
width: 60px;
|
||||
text-align: left;
|
||||
margin-right: 24px;
|
||||
}
|
||||
.user-avatar-upload {
|
||||
.avatar-uploader {
|
||||
&:hover {
|
||||
.avatar {
|
||||
.mask {
|
||||
display: flex;
|
||||
}
|
||||
&::after {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
.avatar {
|
||||
position: relative;
|
||||
.mask {
|
||||
display: none;
|
||||
position: absolute;
|
||||
}
|
||||
&::after {
|
||||
content: "更换头像";
|
||||
position: absolute;
|
||||
transition: opacity 0.3s ease;
|
||||
opacity: 0;
|
||||
width: 100%;
|
||||
height: 64px;
|
||||
left: 0;
|
||||
top: 0;
|
||||
border-radius: 60px;
|
||||
background-color: rgba(
|
||||
$color: #000000,
|
||||
$alpha: 0.3
|
||||
);
|
||||
color: white;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.user-input {
|
||||
width: 240px;
|
||||
}
|
||||
.el-radio__input.is-checked + .el-radio__label {
|
||||
color: #007aff;
|
||||
}
|
||||
.el-input__inner:focus {
|
||||
border-color: #007aff;
|
||||
}
|
||||
.el-radio__input.is-checked .el-radio__inner {
|
||||
border-color: #007aff;
|
||||
background: #007aff;
|
||||
}
|
||||
.el-radio__inner:hover {
|
||||
border-color: #007aff;
|
||||
}
|
||||
}
|
||||
.primary-btn {
|
||||
height: 32px;
|
||||
width: 100px;
|
||||
margin-top: 32px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
&:focus {
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,211 +0,0 @@
|
|||
<template>
|
||||
<div class="user-wallet-container">
|
||||
<div class="user-wallet-header lg">
|
||||
我的钱包
|
||||
</div>
|
||||
<div class="user-wallet-content">
|
||||
<div class="wallet-info-box flex">
|
||||
<div class="user-wallet-info">
|
||||
<div class="xs title">我的余额</div>
|
||||
<div class="nr white flex" style="font-weight: 500;align-items: baseline;">¥<label
|
||||
style="font-size: 24px;">{{wallet.user_money || 0}}</label></div>
|
||||
</div>
|
||||
<div class="user-wallet-info" style="margin-left: 144px">
|
||||
<div class="xs title">累计消费</div>
|
||||
<div class="nr white flex" style="font-weight: 500;align-items: baseline;">¥<label
|
||||
style="font-size: 24px;">{{wallet.total_order_amount || 0}}</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<el-tabs v-model="activeName" class="mt10" @tab-click="handleClick">
|
||||
<el-tab-pane v-for="(item, index) in userWallet" :label="item.name" :name="item.type" :key="index">
|
||||
<div class="user-wallet-table">
|
||||
<el-table :data="item.list" style="width: 100%">
|
||||
<el-table-column prop="source_type" label="类型" />
|
||||
<el-table-column prop="change_amount" label="金额">
|
||||
<div slot-scope="scope" :class="{'primary': scope.row.change_type == 1}">
|
||||
{{scope.row.change_amount}}
|
||||
</div>
|
||||
</el-table-column>
|
||||
<el-table-column prop="create_time" label="时间" />
|
||||
</el-table>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
<!-- <null-data
|
||||
style="padding: 150px"
|
||||
img-style="width: 94px;height:118px"
|
||||
:img="require('~/assets/images/img_null.png')"
|
||||
text="请前往移动端进行查看"
|
||||
></null-data> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
head() {
|
||||
return {
|
||||
title: this.$store.getters.headTitle,
|
||||
link: [
|
||||
{
|
||||
rel: "icon",
|
||||
type: "image/x-icon",
|
||||
href: this.$store.getters.favicon,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
layout: "user",
|
||||
data() {
|
||||
return {
|
||||
activeName: "all",
|
||||
userWallet: [
|
||||
{
|
||||
type: "all",
|
||||
list: [],
|
||||
name: "全部记录",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: "output",
|
||||
list: [],
|
||||
name: "收入记录",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
{
|
||||
type: "income",
|
||||
list: [],
|
||||
name: "消费记录",
|
||||
count: 0,
|
||||
page: 1,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
async asyncData({ $get, query }) {
|
||||
let wallet = {};
|
||||
let recodeList = [];
|
||||
let walletRes = await $get("user/myWallet");
|
||||
let recodeRes = await $get("user/accountLog", {
|
||||
params: {
|
||||
page_no: 1,
|
||||
page_size: 10,
|
||||
source: 1,
|
||||
type: 0,
|
||||
},
|
||||
});
|
||||
if (walletRes.code == 1) {
|
||||
wallet = walletRes.data;
|
||||
}
|
||||
if (recodeRes.code == 1) {
|
||||
recodeList = recodeRes.data.list;
|
||||
}
|
||||
return {
|
||||
wallet,
|
||||
recodeList,
|
||||
};
|
||||
},
|
||||
fetch() {
|
||||
this.handleClick();
|
||||
},
|
||||
methods: {
|
||||
handleClick() {
|
||||
this.getRecodeList();
|
||||
},
|
||||
|
||||
changePage(val) {
|
||||
this.userWallet.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
item.page = val;
|
||||
}
|
||||
});
|
||||
this.getRecodeList();
|
||||
},
|
||||
|
||||
async getRecodeList() {
|
||||
const { activeName, userWallet } = this;
|
||||
let type = activeName == "all" ? 0 : activeName == "income" ? 2 : 1;
|
||||
const item = userWallet.find((item) => item.type == activeName);
|
||||
const {
|
||||
data: { list, count },
|
||||
code,
|
||||
} = await this.$get("user/accountLog", {
|
||||
params: {
|
||||
page_size: 10,
|
||||
page_no: item.page,
|
||||
type: type,
|
||||
source: 1,
|
||||
},
|
||||
});
|
||||
if (code == 1) {
|
||||
this.recodeList = { list, count };
|
||||
}
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
recodeList: {
|
||||
immediate: true,
|
||||
handler(val) {
|
||||
console.log("val:", val);
|
||||
this.userWallet.some((item) => {
|
||||
if (item.type == this.activeName) {
|
||||
Object.assign(item, val);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.user-wallet-container {
|
||||
width: 980px;
|
||||
padding: 10px 10px 60px 10px;
|
||||
.user-wallet-header {
|
||||
padding: 10px 5px;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
::v-deep .el-tabs__header {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
::v-deep .el-tabs .el-tabs__nav-scroll {
|
||||
padding: 0;
|
||||
}
|
||||
.user-wallet-content {
|
||||
margin-top: 17px;
|
||||
.wallet-info-box {
|
||||
padding: 24px;
|
||||
background: linear-gradient(87deg, #ff2c3c 0%, #ff9e2c 100%);
|
||||
.user-wallet-info {
|
||||
.title {
|
||||
color: #ffdcd7;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.user-wallet-table {
|
||||
background-color: #f2f2f2;
|
||||
::v-deep .el-table {
|
||||
color: #222;
|
||||
}
|
||||
::v-deep .el-table .el-button--text {
|
||||
color: #222;
|
||||
font-weight: 400;
|
||||
}
|
||||
::v-deep .el-table th {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
::v-deep .el-table thead {
|
||||
color: #555555;
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,35 +0,0 @@
|
|||
import { Message } from 'element-ui';
|
||||
import config from '~/config/app'
|
||||
export default function ({ $axios, redirect, store }, inject) {
|
||||
|
||||
$axios.setBaseURL(config.baseUrl + '/api')
|
||||
$axios.onRequest(config => {
|
||||
config.headers.token = store.state.token
|
||||
|
||||
})
|
||||
$axios.onResponse((response) => {
|
||||
const {
|
||||
code,
|
||||
show,
|
||||
msg
|
||||
} = response.data;
|
||||
console.log(response.data)
|
||||
if (code == 0 && show && msg) {
|
||||
Message({
|
||||
message: msg,
|
||||
type: 'error'
|
||||
})
|
||||
}else if(code == -1){
|
||||
store.commit('logout')
|
||||
redirect('/account/login')
|
||||
}
|
||||
})
|
||||
$axios.onError(error => {
|
||||
Message({
|
||||
message: '系统错误',
|
||||
type: 'error'
|
||||
})
|
||||
})
|
||||
inject('get', $axios.$get)
|
||||
inject('post', $axios.$post)
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import Vue from 'vue'
|
||||
import Element from 'element-ui'
|
||||
import locale from 'element-ui/lib/locale/lang/zh-CN'
|
||||
|
||||
Vue.use(Element, { locale })
|
|
@ -1,8 +0,0 @@
|
|||
import Cookies from 'js-cookie'
|
||||
export default function ({ store }) {
|
||||
const token = Cookies.get('token')
|
||||
token && store.commit('setToken', token)
|
||||
store.dispatch('getCategory')
|
||||
store.dispatch('getPublicData')
|
||||
store.dispatch('getConfig')
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
import Vue from 'vue'
|
||||
import VueAwesomeSwiper from 'vue-awesome-swiper'
|
||||
Vue.use(VueAwesomeSwiper)
|
Binary file not shown.
Before Width: | Height: | Size: 8.4 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 9.9 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue