初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false

90
addon/pc/source/os/.gitignore vendored Executable file
View File

@@ -0,0 +1,90 @@
# 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

69
addon/pc/source/os/README.md Executable file
View File

@@ -0,0 +1,69 @@
# nuxt
## 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).

12
addon/pc/source/os/api/addon.js Executable file
View File

@@ -0,0 +1,12 @@
import http from "../utils/http"
/**
* 插件是否存在
* @param {object} params
*/
export function addonisexit(params) {
return http({
url: "/api/addon/addonisexit",
data: params
})
}

View File

@@ -0,0 +1,22 @@
import http from "../utils/http"
/**
* 地址
* @param {object} params
*/
export function getArea(params) {
return http({
url: "/api/address/lists",
data: params
})
}
/**
* 获取地区
*/
export function getCity(params) {
return http({
url: "/api/address/city",
data: params
})
}

View File

@@ -0,0 +1,86 @@
import http from "../../utils/http"
/**
* 登录
*/
export function login(params) {
return http({
url: "/api/login/login",
data: params
})
}
/**
* 手机号登录
* @param params
* @returns {Promise}
*/
export function mobile_login(params) {
return http({
url: "/api/login/mobile",
data: params
})
}
/**
* 获取短信动态码
*/
export function mobileCode(params) {
return http({
url: "/api/login/mobileCode",
data: params
})
}
/**
* 重置密码
*/
export function rePass(params) {
return http({
url: "/api/findpassword/mobile",
data: params
})
}
/**
* 下一步
*/
export function nextStep(params) {
return http(
{
url: "/api/member/checkmobile",
data: params
},
-1
)
}
/**
* 获取短信动态码
*/
export function smsCode(params) {
return http({
url: "/api/findpassword/mobilecode",
data: params
})
}
/**
* 获取注册配置
*/
export function registerConfig(params) {
return http({
url: "/api/register/config",
data: params
})
}
/**
* 获取微信绑定手机短信动态码
*/
export function wechatMobileCode(params) {
return http({
url: "/api/login/getMobileCode",
data: params
})
}

View File

@@ -0,0 +1,61 @@
import http from "../../utils/http"
/**
* 获取注册协议
*/
export function getRegisterAgreement(params) {
return http({
url: "/api/register/aggrement",
data: params
})
}
/**
* 获取新人福利
*/
export function getRegisterReward(params) {
return http({
url: "/memberregister/api/Config/Config",
data: params
})
}
/**
* 账号密码注册
*/
export function register(params) {
return http({
url: "/api/register/username",
data: params
})
}
/**
* 手机号注册
*/
export function registerMobile(params) {
return http({
url: "/api/register/mobile",
data: params
})
}
/**
* 获取注册短信动态码
*/
export function registerMobileCode(params) {
return http({
url: "/api/register/mobileCode",
data: params
})
}
/**
* 注册配置
*/
export function registerConfig(params) {
return http({
url: "/api/register/config",
data: params
})
}

View File

@@ -0,0 +1,12 @@
import http from "../utils/http"
/**
* 组合套餐列表
* @param {object} params
*/
export function bundlingList(params) {
return http({
url: "/bundling/api/bundling/lists",
data: params
})
}

View File

@@ -0,0 +1,31 @@
import http from "../../utils/http"
/**
* 获取文章列表
*/
export function getArticleList(params) {
return http({
url: "/api/article/page",
data: params
})
}
/**
* 获取文章分类列表
*/
export function articleCategoryList(params) {
return http({
url: "/api/article/category",
data: params
})
}
/**
* 获取文章详情
*/
export function articleDetail(params) {
return http({
url: "/api/article/info",
data: params
})
}

View File

@@ -0,0 +1,31 @@
import http from "../../utils/http"
/**
* 获取帮助列表
*/
export function helpList(params) {
return http({
url: "/api/helpclass/lists",
data: params
})
}
/**
* 获取帮助详情
*/
export function helpDetail(params) {
return http({
url: "/api/help/info",
data: params
})
}
/**
* 获取帮助详情
*/
export function helpOther(params) {
return http({
url: "/api/help/page",
data: params
})
}

View File

@@ -0,0 +1,21 @@
import http from "../../utils/http"
/**
* 获取公告列表
*/
export function noticesList(params) {
return http({
url: "/api/notice/page",
data: params
})
}
/**
* 获取公告详情
*/
export function noticeDetail(params) {
return http({
url: "/api/notice/info",
data: params
})
}

48
addon/pc/source/os/api/combo.js Executable file
View File

@@ -0,0 +1,48 @@
import http from "../utils/http"
/**
* 获取订单初始化数据
* @param {object} params
*/
export function payment(params) {
return http({
url: "/bundling/api/ordercreate/payment",
data: params,
forceLogin: true
})
}
/**
* 获取订单初始化数据
* @param {object} params
*/
export function calculate(params) {
return http({
url: "/bundling/api/ordercreate/calculate",
data: params,
forceLogin: true
})
}
/**
* 订单创建
* @param {object} params
*/
export function orderCreate(params) {
return http({
url: "/bundling/api/ordercreate/create",
data: params,
forceLogin: true
})
}
/**
* 获取套餐列表
* @param {object} params
*/
export function detail(params) {
return http({
url: "/bundling/api/bundling/detail",
data: params
})
}

View File

@@ -0,0 +1,31 @@
import http from "../utils/http"
/**
* 优惠券类型列表
* @param {object} params
*/
export function couponTypeList(params) {
return http({
url: "/coupon/api/coupon/typepagelists",
data: params
})
}
/**
* 领取优惠券
* @param {object} params
*/
export function couponReceive(params) {
return http({
url: "/coupon/api/coupon/receive",
data: params,
forceLogin: true
})
}
export function goodsCoupon(params) {
return http({
url: "/coupon/api/coupon/goodsCoupon",
data: params
})
}

View File

@@ -0,0 +1,59 @@
import http from "../../utils/http"
/**
* 加入购物车
* @param {array} params
*/
export function addToCart(params) {
return http({
data: params,
url: "/api/cart/add",
forceLogin: true
})
}
/**
* 购物车列表
* @param {array} params
*/
export function cartList(params) {
return http({
data: params,
url: "/api/cart/goodslists"
})
}
/**
* 删除购物车
* @param {array} params
*/
export function deleteCart(params) {
return http({
data: params,
url: "/api/cart/delete",
forceLogin: true
})
}
/**
* 修改购物车数量
* @param {array} params
*/
export function editCartNum(params) {
return http({
data: params,
url: "/api/cart/edit",
forceLogin: true
})
}
/**
* 获取购物车数量
* @param {array} params
*/
export function getCartCount(params) {
return http({
data: params,
url: "/api/cart/count"
})
}

View File

@@ -0,0 +1,23 @@
import http from "../../utils/http"
/**
* 商品评价列表
* @param {object} params
*/
export function goodsEvaluateList(params) {
return http({
url: "/api/goodsevaluate/page",
data: params
})
}
/**
* 商品评价数量
* @param {object} params
*/
export function goodsEvaluateCount(params) {
return http({
url: "/api/goodsevaluate/getgoodsevaluate",
data: params
})
}

View File

@@ -0,0 +1,128 @@
import http from "../../utils/http"
/**
* 商品列表
* @param {object} params
*/
export function goodsSkuPage(params) {
return http({
url: "/api/goodssku/page",
data: params
})
}
export function goodsSkuList(params) {
return http({
url: "/api/goodssku/lists",
data: params
})
}
/**
* 商品详情
* @param {Object} params
*/
export function goodsSkuDetail(params) {
return http({
url: "/api/goodssku/detail",
data: params
})
}
/**
* 获取商品详情评价权限
*/
export function evaluateConfig() {
return http({
url: "/api/goodsevaluate/config",
data: {},
forceLogin: true
})
}
/**
* 商品信息
* @param { Object } params
*/
export function goodsSkuInfo(params) {
return http({
url: "/api/goodssku/info",
data: params
})
}
/**
* 商品信息
* @param { Object } params
*/
export function goodsQrcode(params) {
return http({
url: "/api/goodssku/goodsqrcode",
data: params
})
}
/**
* 获取满减信息
* @param {Object} params
*/
export function manjian(params) {
return http({
url: "/manjian/api/manjian/info",
data: params
})
}
/**
* 获取售后服务
* @param {Object} params
*/
export function aftersale(params) {
return http({
url: "/api/goods/aftersale",
data: params
})
}
/**
* 更新商品点击量
* @param {Object} params
*/
export function modifyClicks(params) {
return http({
url: "/api/goods/modifyclicks",
data: params
})
}
/**
* 添加商品足迹
* @param {Object} params
*/
export function addGoodsbrowse(params) {
return http({
url: "/api/goodsbrowse/add",
data: params
})
}
/**
* 商品推荐列表
* @param {object} params
*/
export function goodsRecommend(params) {
return http({
url: "/api/goodssku/recommend",
data: params
})
}
/**
* 品牌列表
*/
export function brandPage(params) {
return http({
url: "/api/goodsbrand/page",
data: params
})
}

View File

@@ -0,0 +1,37 @@
import http from "../../utils/http"
/**
* 是否关注该商品
* @param {object} params
*/
export function isCollect(params) {
return http({
url: "/api/goodscollect/iscollect",
data: params,
forceLogin: true
})
}
/**
* 添加商品关注
* @param {Object} params
*/
export function addCollect(params) {
return http({
url: "/api/goodscollect/add",
data: params,
forceLogin: true
})
}
/**
* 删除商品关注
* @param {Object} params
*/
export function deleteCollect(params) {
return http({
url: "/api/goodscollect/delete",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,43 @@
import http from "../../utils/http"
/**
* 获取商品分类树结构
*/
export function tree(params) {
return http({
url: "/api/goodscategory/tree",
data: params
})
}
/**
* 获取商品分类信息
* @param {Object} params 参数 category_id:1
*/
export function goodsCategoryInfo(params) {
return http({
url: "/api/goodscategory/info",
data: params
})
}
/**
* 获取分类配置
*/
export function categoryConfig(params) {
return http({
url: "/api/config/categoryconfig",
data: params
})
}
/**
* 获取商品分类列表
* @param {Object} params 参数 level:1
*/
export function goodsCategoryList(params) {
return http({
url: "/api/goodscategory/lists",
data: params
})
}

View File

@@ -0,0 +1,84 @@
import http from "../utils/http"
/**
* 获取订单初始化数据
* @param {object} params
*/
export function payment(params) {
return http({
url: "/groupbuy/api/ordercreate/payment",
data: params,
forceLogin: true
})
}
/**
* 获取团购商品详情评价权限
*/
export function evaluateConfig() {
return http({
url: "/api/goodsevaluate/config",
data: {},
forceLogin: true
})
}
/**
* 获取订单初始化数据
* @param {object} params
*/
export function calculate(params) {
return http({
url: "/groupbuy/api/ordercreate/calculate",
data: params,
forceLogin: true
})
}
/**
* 订单创建
* @param {object} params
*/
export function orderCreate(params) {
return http({
url: "/groupbuy/api/ordercreate/create",
data: params,
forceLogin: true
})
}
/**
* 商品列表
* @param {object} params
*/
export function goodsPage(params) {
return http({
url: "/groupbuy/api/goods/page",
data: params,
forceLogin: true
})
}
/**
* 商品详情
* @param {object} params
*/
export function goodsSkuDetail(params) {
return http({
url: "/groupbuy/api/goods/detail",
data: params,
forceLogin: true
})
}
/**
* 商品信息
* @param {object} params
*/
export function goodsSkuInfo(params) {
return http({
url: "/groupbuy/api/goods/info",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,124 @@
import http from "../../utils/http"
/**
* 获取余额基础信息
*/
export function balance(params) {
return http({
url: "/api/memberaccount/info",
data: params,
forceLogin: true
})
}
/**
* 获取提现配置
*/
export function withdrawConfig(params) {
return http({
url: "/api/memberwithdraw/config",
data: params,
forceLogin: true
})
}
/**
* 获取余额明细
*/
export function balanceDetail(params) {
return http({
url: "/api/memberaccount/page",
data: params,
forceLogin: true
})
}
/**
* 获取提现信息
*/
export function withdrawInfo(params) {
return http({
url: "/api/memberwithdraw/info",
data: params,
})
}
/**
* 获取银行账号信息
*/
export function accountInfo(params) {
return http({
url: "/api/memberbankaccount/defaultinfo",
data: params,
})
}
/**
* 提现
*/
export function withdraw(params) {
return http({
url: "/api/memberwithdraw/apply",
data: params,
})
}
/**
* 提现记录
*/
export function withdrawList(params) {
return http({
url: "/api/memberwithdraw/page",
data: params,
})
}
/**
* 提现详情
*/
export function withdrawDetail(params) {
return http({
url: "/api/memberwithdraw/detail",
data: params,
})
}
/**
* 充值套餐列表
*/
export function rechargeList(params) {
return http({
url: "/memberrecharge/api/memberrecharge/page",
data: params,
})
}
/**
* 充值套餐详情
*/
export function rechargeDetail(params) {
return http({
url: "/memberrecharge/api/memberrecharge/info",
data: params,
})
}
/**
* 充值
*/
export function recharge(params) {
return http({
url: "/memberrecharge/api/ordercreate/create",
data: params,
})
}
/**
* 充值记录
*/
export function rechargeOrder(params) {
return http({
url: "/memberrecharge/api/order/page",
data: params,
})
}

View File

@@ -0,0 +1,23 @@
import http from "../../utils/http"
/**
* 我的商品收藏
*/
export function goodsCollect(params) {
return http({
url: "/api/goodscollect/page",
data: params,
forceLogin: true
})
}
/**
* 取消商品收藏
*/
export function deleteGoods(params) {
return http({
url: "/api/goodscollect/delete",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,56 @@
import http from "../../utils/http"
/**
* 获取会员基础信息
*/
export function memberInfo(params) {
return http({
url: "/api/member/info",
data: params,
forceLogin: true
})
}
/**
* 订单数量
*/
export function orderNum(params) {
return http({
url: "/api/order/num",
data: params,
forceLogin: true
})
}
/**
* 优惠券数量
*/
export function couponNum(params) {
return http({
url: "/coupon/api/coupon/num",
data: params,
forceLogin: true
})
}
/**
* 我的足迹
*/
export function footprint(params) {
return http({
url: "/api/goodsbrowse/page",
data: params,
forceLogin: true
})
}
/**
* 会员等级列表
*/
export function levelList(params) {
return http({
url: "/api/memberlevel/lists",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,37 @@
import http from "../../utils/http"
/**
* 获取用户信息
* @param {object} params
*/
export function info(params) {
return http({
url: "/api/member/info",
data: params,
forceLogin: true
})
}
/**
* 修改昵称
* @param {object} params
*/
export function nickName(params) {
return http({
url: "/api/member/modifynickname",
data: params,
forceLogin: true
})
}
/**
* 修改头像
* @param {object} params
*/
export function headImg(params) {
return http({
url: "/api/member/modifyheadimg",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,159 @@
import http from "../../utils/http"
/**
* 获取会员信息【进入首页调用了,不能控制登录】
*/
export function memberDetail(params) {
return http({
url: "/api/member/info",
data: params
})
}
/**
* 获取地址列表
*/
export function addressList(params) {
return http({
url: "/api/memberaddress/page",
data: params,
forceLogin: true
})
}
/**
* 设为默认
*/
export function setDefault(params) {
return http({
url: "/api/memberaddress/setdefault",
data: params,
forceLogin: true
})
}
/**
* 删除地址
*/
export function deleteAddress(params) {
return http({
url: "/api/memberaddress/delete",
data: params,
forceLogin: true
})
}
/**
* 地址信息
*/
export function addressInfo(params) {
return http({
url: "/api/memberaddress/info",
data: params,
forceLogin: true
})
}
/**
* 添加地址
*/
export function saveAddress(params) {
return http({
url: "/api/memberaddress/" + params.url,
data: params,
forceLogin: true
})
}
/**
* 获取优惠券列表
*/
export function couponList(params) {
return http({
url: "/coupon/api/coupon/memberpage",
data: params,
forceLogin: true
})
}
/**
* 我的足迹
*/
export function footPrint(params) {
return http({
url: "/api/goodsbrowse/page",
data: params,
forceLogin: true
})
}
/**
* 删除时间线
*/
export function delFootprint(params) {
return http({
url: "/api/goodsbrowse/delete",
data: params,
forceLogin: true
})
}
/**
* 账户列表
*/
export function accountList(params) {
return http({
url: "/api/memberbankaccount/page",
data: params,
})
}
/**
* 设置默认账户
*/
export function accountDefault(params) {
return http({
url: "/api/memberbankaccount/setdefault",
data: params,
})
}
/**
* 删除账户
*/
export function delAccount(params) {
return http({
url: "/api/memberbankaccount/delete",
data: params,
})
}
/**
* 获取转账方式
*/
export function transferType(params) {
return http({
url: "/api/memberwithdraw/transferType",
data: params,
})
}
/**
* 获取账户详情
*/
export function accountDetail(params) {
return http({
url: "/api/memberbankaccount/info",
data: params,
})
}
/**
* 保存
*/
export function saveAccount(params) {
return http({
url: "/api/memberbankaccount/" + params.url,
data: params,
})
}

View File

@@ -0,0 +1,23 @@
import http from "../../utils/http"
/**
* 获取积分基础信息
*/
export function pointInfo(params) {
return http({
url: "/api/memberaccount/info",
data: params,
forceLogin: true
})
}
/**
* 获取积分列表
*/
export function pointList(params) {
return http({
url: "/api/memberaccount/page",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,122 @@
import http from "../../utils/http"
/**
* 修改密码
* @param {object} params
*/
export function passWord(params) {
return http({
url: "/api/member/modifypassword",
data: params,
forceLogin: true
})
}
/**
* 发送短信动态码
* @param {object} params
*/
export function tellCode(params) {
return http({
url: "/api/member/bindmobliecode",
data: params,
forceLogin: true
})
}
/**
* 绑定手机号
* @param {object} params
*/
export function tell(params) {
return http({
url: "/api/member/modifymobile",
data: params,
forceLogin: true
})
}
/**
* 检测邮箱是否存在
* @param {object} params
*/
export function checkEmail(params) {
return http({
url: "/api/member/checkemail",
data: params,
forceLogin: true
})
}
/**
* 发送邮箱动态码
* @param {object} params
*/
export function emailCode(params) {
return http({
url: "/api/member/bingemailcode",
data: params,
forceLogin: true
})
}
/**
* 绑定邮箱
* @param {object} params
*/
export function email(params) {
return http({
url: "/api/member/modifyemail",
data: params,
forceLogin: true
})
}
/**
* 验证码验证
* @param {object} params
*/
export function verifyPayPwdCode(params) {
return http({
url: "/api/member/verifypaypwdcode",
data: params,
forceLogin: true
})
}
/**
* 获取之前密码
* @param {object} params
*/
export function modifyPayPassword(params) {
return http({
url: "/api/member/modifypaypassword",
data: params,
forceLogin: true
})
}
/**
* 手机动态码
* @param {object} params
*/
export function payPwdCode(params) {
return http({
url: "/api/member/paypwdcode",
data: params,
forceLogin: true
})
}
/**
* 手机密码动态码
* @param {object} params
*/
export function pwdMoblieCode(params) {
return http({
url: '/api/member/pwdmobliecode',
data: params,
forceLogin: true
})
}

112
addon/pc/source/os/api/message.js Executable file
View File

@@ -0,0 +1,112 @@
import http from "../utils/http"
/**
* 发送消息
* @param {object} params
*/
export function sendMessage(params) {
return http({
url: "/servicer/api/chat/say",
data: params
})
}
/**
* 发送图片
* @param {object} params
*/
export function sendImg(params) {
return http({
url: "/api/upload/chatimg",
data: params
})
}
/**
* 标识消息已读
* @param {object} params
*/
export function readMessage(params) {
return http({
url: "/servicer/api/chat/setRead",
data: params
})
}
// 绑定客服(客服id,店铺id)client_idsite_id
export function bindServicer(params) {
return http({
url: '/servicer/api/chat/bind',
data: params
})
}
// 获取聊天记录
export function messageList(params) {
return http({
url: '/servicer/api/chat/dialogs',
data: params
})
}
// 是否在线
export function hasServicers(params) {
return http({
url: '/servicer/api/chat/hasServicers',
data: params
})
}
// 获取联系人
export function sessionList(params) {
return http({
url: '/servicer/api/chat/chatList',
data: params
})
}
// 获取联系人
export function currStore(params) {
return http({
url: '/api/shop/info',
data: params
})
}
// 获取联系人servicer_site_id
export function groupList(params) {
return http({
url: '/servicer/api/servicer/getGroupList',
data: params
})
}
// 客服是否在线
export function isHaveServicers(params) {
return http({
url: '/servicer/api/chat/hasServicers',
data: params
})
}
//关闭客服
export function closeMessage(params) {
return http({
url: '/servicer/api/chat/bye',
data: params
})
}
// 获取关键词
export function getKeywords() {
return http({
url: '/servicer/api/chat/keyword',
})
}
// 获取关键词
export function getSiteInfo() {
return http({
url: '/api/site/info',
})
}

View File

@@ -0,0 +1,126 @@
import http from "../../utils/http"
/**
* 订单列表
* @param {object} params
*/
export function apiOrderList(params) {
return http({
url: "/api/order/lists",
data: params,
forceLogin: true
})
}
/**
* 订单支付
* @param {object} params
*/
export function apiOrderPay(params) {
return http({
url: "/api/order/pay",
data: params,
forceLogin: true
})
}
/**
* 订单关闭
* @param {object} params
*/
export function apiOrderClose(params) {
return http({
url: "/api/order/close",
data: params,
forceLogin: true
})
}
/**
* 订单收货(收到所有货物)
* @param {object} params
*/
export function apiOrderTakedelivery(params) {
return http({
url: "/api/order/takedelivery",
data: params,
forceLogin: true
})
}
/**
* 订单详情
* @param {object} params
*/
export function apiOrderDetail(params) {
return http({
url: "/api/order/detail",
data: params,
forceLogin: true
})
}
/**
* 订单包裹信息
* @param {object} params
*/
export function apiOrderPackageInfo(params) {
return http({
url: "/api/order/package",
data: params,
forceLogin: true
})
}
/**
* 订单评价获取订单信息
*/
export function orderInfo(params) {
return http({
url: "/api/order/evluateinfo",
data: params,
forceLogin: true
})
}
/**
* 提交评价
*/
export function save(params) {
var url = ""
if (params.isEvaluate) {
url = "/api/goodsevaluate/again"
} else {
url = "/api/goodsevaluate/add"
}
return http({
url: url,
data: params,
forceLogin: true
})
}
/**
* 订单收货(收到所有货物)
* @param {object} params
*/
export function apiMemberVirtualTakeDelivery(params) {
return http({
url: "/api/order/membervirtualtakedelivery",
data: params,
forceLogin: true
})
}
/**
* 订单删除
* @param {object} params
*/
export function apiOrderDelete(params) {
return http({
url: "/api/order/delete",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,71 @@
import http from "../../utils/http"
/**
* 获取订单初始化数据
* @param {object} params
*/
export function payment(params) {
return http({
url: "/api/ordercreate/payment",
data: params,
forceLogin: true
})
}
/**
* 获取订单初始化数据
* @param {object} params
*/
export function calculate(params) {
return http({
url: "/api/ordercreate/calculate",
data: params,
forceLogin: true
})
}
/**
* 订单创建
* @param {object} params
*/
export function orderCreate(params) {
return http({
url: "/api/ordercreate/create",
data: params,
forceLogin: true
})
}
/**
* 验证支付密码
* @param {object} params
*/
export function checkPayPassword(params) {
return http({
url: "/api/member/checkpaypassword",
data: params,
forceLogin: true
})
}
/**
* 获取余额支付配置
*/
export function balanceConfig() {
return http({
url: "/api/pay/getBalanceConfig",
data: "",
forceLogin: true
})
}
/**
* 获取优惠券
*/
export function getCouponList(params) {
return http({
url: "/api/ordercreate/getcouponlist",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,121 @@
import http from "../../utils/http"
/**
* 退款数据
* @param {object} params
*/
export function refundData(params) {
return http({
url: "/api/orderrefund/refundData",
data: params,
forceLogin: true
})
}
/**
* 批量退款数据
* @param {object} params
*/
export function refundDataBatch(params) {
return http({
url: "/api/orderrefund/refundDataBatch",
data: params,
forceLogin: true
})
}
/**
* 退款
* @param {object} params
*/
export function refund(params) {
return http({
url: "/api/orderrefund/refund",
data: params,
forceLogin: true
})
}
/**
* 退款详情
* @param {object} params
*/
export function detail(params) {
return http({
url: "/api/orderrefund/detail",
data: params,
forceLogin: true
})
}
/**
* 退货物流
* @param {object} params
*/
export function delivery(params) {
return http({
url: "/api/orderrefund/delivery",
data: params,
forceLogin: true
})
}
/**
* 撤销维权
* @param {object} params
*/
export function cancleRefund(params) {
return http({
url: "/api/orderrefund/cancel",
data: params,
forceLogin: true
})
}
/**
* 平台维权数据
* @param {object} params
*/
export function complainData(params) {
return http({
url: "/api/ordercomplain/detail",
data: params,
forceLogin: true
})
}
/**
* 平台维权申请
* @param {object} params
*/
export function complain(params) {
return http({
url: "/api/ordercomplain/complain",
data: params,
forceLogin: true
})
}
/**
* 平台维权撤销
* @param {object} params
*/
export function complainCancel(params) {
return http({
url: "/api/ordercomplain/cancel",
data: params,
forceLogin: true
})
}
/**
* 退款列表
* @param {object} params
*/
export function refundList(params) {
return http({
url: "/api/orderrefund/lists",
data: params,
forceLogin: true
})
}

View File

@@ -0,0 +1,60 @@
import http from "../../utils/http"
/**
* 核销权限
* @param {object} params
*/
export function checkIsVerifier(params) {
return http({
url: "/api/verify/checkisverifier",
data: params,
forceLogin: true
})
}
/**
* 核销
* @param {object} params
*/
export function verifyInfo(params) {
return http({
url: "/api/verify/verifyInfo",
data: params,
forceLogin: true
})
}
/**
* 核销验证
* @param {object} params
*/
export function verify(params) {
return http({
url: "/api/verify/verify",
data: params,
forceLogin: true
})
}
/**
* 核销类型
* @param {object} params
*/
export function getVerifyType(params) {
return http({
url: "/api/verify/getVerifyType",
data: params
})
}
/**
* 核销记录
* @param {object} params
*/
export function verifyList(params) {
return http({
url: "/api/verify/lists",
data: params,
forceLogin: true
})
}

84
addon/pc/source/os/api/pay.js Executable file
View File

@@ -0,0 +1,84 @@
import http from "../utils/http"
/**
* 支付详情
* @param {object} params
*/
export function getPayInfo(params) {
return http({
url: "/api/pay/info",
data: params,
forceLogin: true
})
}
/**
* 支付方式
* @param {object} params
*/
export function getPayType(params) {
return http({
url: "/api/pay/type",
data: params,
forceLogin: true
})
}
/**
* 支付状态
* @param {object} params
*/
export function checkPayStatus(params) {
return http({
url: "/api/pay/status",
data: params,
forceLogin: true
})
}
/**
* 支付状态
* @param {object} params
*/
export function pay(params) {
return http({
url: "/api/pay/pay",
data: params,
forceLogin: true
})
}
/**
* 获取线下支付配置
*/
export function getOfflinepayConfig() {
return http({
url: "/offlinepay/api/pay/config",
})
}
/**
* 线下支付信息
* @param {object} params
*/
export function getOfflinepayPayInfo(params) {
return http({
url: "/offlinepay/api/pay/info",
data: params,
forceLogin: true
})
}
/**
* 线下支付
* @param {object} params
*/
export function offlinepay(params) {
return http({
url: "/offlinepay/api/pay/pay",
data: params,
forceLogin: true
})
}

42
addon/pc/source/os/api/pc.js Executable file
View File

@@ -0,0 +1,42 @@
import http from "../utils/http"
/**
* 楼层
* @param {object} params
*/
export function floors(params) {
return http({
url: "/api/pc/floors",
data: params
})
}
/**
* 获取热门搜索关键词
*/
export function apiHotSearchWords(params) {
return http({
url: "/api/goods/hotSearchWords",
data: params
})
}
/**
* 获取默认搜索关键词
*/
export function apiDefaultSearchWords(params) {
return http({
url: "/api/goods/defaultSearchWords",
data: params
})
}
/**
* 获取首页浮层
*/
export function floatLayer(params) {
return http({
url: "/api/pc/floatLayer",
data: params
})
}

View File

@@ -0,0 +1,92 @@
import http from "../utils/http"
/**
* 商品列表
* @param {object} params
*/
export function goodsPage(params) {
return http({
url: "/seckill/api/seckillgoods/page",
data: params
})
}
/**
* 商品详情
* @param {object} params
*/
export function goodsSkuDetail(params) {
return http({
url: "/seckill/api/seckillgoods/detail",
data: params
})
}
/**
* 秒杀时间段
* @param {object} params
*/
export function timeList(params) {
return http({
url: "/seckill/api/seckill/lists",
data: params
})
}
/**
* 秒杀商品信息
* @param { Object } params
*/
export function seckillGoodsInfo(params) {
return http({
url: "/seckill/api/seckillgoods/info",
data: params
})
}
/**
* 获取订单初始化数据
* @param {object} params
*/
export function payment(params) {
return http({
url: "/seckill/api/ordercreate/payment",
data: params,
forceLogin: true
})
}
/**
* 获取订单初始化数据
* @param {object} params
*/
export function calculate(params) {
return http({
url: "/seckill/api/ordercreate/calculate",
data: params,
forceLogin: true
})
}
/**
* 获取秒杀商品详情评价权限
*/
export function evaluateConfig() {
return http({
url: "/api/goodsevaluate/config",
data: {},
forceLogin: true
})
}
/**
* 订单创建
* @param {object} params
*/
export function orderCreate(params) {
return http({
url: "/seckill/api/ordercreate/create",
data: params,
forceLogin: true
})
}

115
addon/pc/source/os/api/website.js Executable file
View File

@@ -0,0 +1,115 @@
import http from "../utils/http"
/**
* 获取网站信息
*/
export function websiteInfo(params) {
return http({
url: "/api/site/info",
data: params
})
}
/**
* 获取版权信息
*/
export function copyRight(params) {
return http({
url: "/api/config/copyright",
data: params
})
}
/**
* 获取wap端二维码
*/
export function wapQrcode(params) {
return http({
url: "/api/site/wapqrcode",
data: params
})
}
export function siteDefaultFiles(params) {
return http({
url: "/api/config/defaultimg",
data: params
})
}
/**
* 获取首页小程序二维码
*/
export function weQrcode(params) {
return http({
url: "weapp/api/weapp/qrcode",
data: params
})
}
/**
* 广告图
* @param {Object} params 参数
*/
export function adList(params) {
return http({
url: "/api/adv/detail",
data: params
})
}
/**
* 获取商家服务
*/
export function shopServiceLists(params) {
return http({
url: "/api/goods/service",
data: params
})
}
/**
* 友情链接
* @param {Object} params 参数
*/
export function friendlyLink(params) {
return http({
url: "/api/pc/friendlyLink",
data: params
})
}
/**
* 导航
* @param {Object} params 参数
*/
export function navList(params) {
return http({
url: "/api/pc/navList",
data: params
})
}
/**
* 获取验证码
*/
export function captcha(params) {
return http({
url: "/api/captcha/captcha",
data: params
})
}
export function getSiteStatus() {
return http({
url: "/api/site/status"
})
}
// 客服打开方式
export function shopServiceOpen(params) {
return http({
url: "/api/config/servicer",
data: params
})
}

View File

@@ -0,0 +1,41 @@
import http from "../utils/http"
/**
* 获取微信二维码
*/
export function loginCode(params) {
return http({
url: "/wechat/api/wechat/logincode",
data: params
})
}
/**
* 检测是否扫码
*/
export function checkLogin(params) {
return http({
url: "/api/login/checklogin",
data: params
})
}
/**
* 微信登录绑定手机号
*/
export function wechatLogin(params) {
return http({
url: "/api/login/wechatLogin",
data: params
})
}
/**
* 检测是否可以微信扫码登录
*/
export function isWechatLogin(params) {
return http({
url: "/api/config/init",
data: params
})
}

View File

@@ -0,0 +1,23 @@
@import "main.scss";
/* 改变主题色变量 */
$--color-white:#fff;
$--color-primary: $base-color !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-success: $base-color-success !default;
$--color-warning: $base-color-warning !default;
$--color-danger: $base-color-danger !default;
$--color-info: $base-color-info !default;
/* 改变 icon 字体路径变量,必需 */
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,243 @@
@font-face {
font-family: "iconfont";
src: url('https://cdn3.codesign.qq.com/icons/LOD8r0BMER9RXkg/latest/iconfont.eot?t=1056907098f9743c59852ca6f44325b5'); /* IE9 */
src: url('https://cdn3.codesign.qq.com/icons/LOD8r0BMER9RXkg/latest/iconfont.eot?t=1056907098f9743c59852ca6f44325b5#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('https://cdn3.codesign.qq.com/icons/LOD8r0BMER9RXkg/latest/iconfont.woff?t=1056907098f9743c59852ca6f44325b5') format('woff2'),
url('https://cdn3.codesign.qq.com/icons/LOD8r0BMER9RXkg/latest/iconfont.woff?t=1056907098f9743c59852ca6f44325b5') format('woff'), /* chrome、firefox */
url('https://cdn3.codesign.qq.com/icons/LOD8r0BMER9RXkg/latest/iconfont.ttf?t=1056907098f9743c59852ca6f44325b5') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('https://cdn3.codesign.qq.com/icons/LOD8r0BMER9RXkg/latest/iconfont.svg?t=1056907098f9743c59852ca6f44325b5#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-xiaoxi:before {
content: "\e048";
}
.icon-xiaosuo:before {
content: "\e049";
}
.icon-shouzang:before {
content: "\e04a";
}
.icon-_shouzang2:before {
content: "\e04b";
}
.icon-arrow-right:before {
content: "\e600";
}
.icon-icon-test:before {
content: "\e601";
}
.icon-ziyuan:before {
content: "\e602";
}
.icon-arrow-left-copy:before {
content: "\e603";
}
.icon-shangjiazhongxin-:before {
content: "\e604";
}
.icon-404:before {
content: "\e605";
}
.icon-shang:before {
content: "\e606";
}
.icon-daifahuo:before {
content: "\e60a";
}
.icon-icon_naozhong:before {
content: "\e60b";
}
.icon-jiang-copy:before {
content: "\e60c";
}
.icon-tubiaolunkuo-:before {
content: "\e60d";
}
.icon-youxiang1:before {
content: "\e610";
}
.icon-gouwuche:before {
content: "\e611";
}
.icon-shanchu:before {
content: "\e612";
}
.icon-yue:before {
content: "\e615";
}
.icon-chengnuotuihuo1:before {
content: "\e616";
}
.icon-7tiantuihuan:before {
content: "\e617";
}
.icon-xiaoxiebaozheng1:before {
content: "\e618";
}
.icon-fahuo:before {
content: "\e619";
}
.icon-tuangou:before {
content: "\e61a";
}
.icon-shiyanzhongxin:before {
content: "\e61b";
}
.icon-liangxiaoshifahuo:before {
content: "\e61c";
}
.icon-zhengpinbaozheng:before {
content: "\e61d";
}
.icon-shitiyanzheng1:before {
content: "\e61e";
}
.icon-mendian:before {
content: "\e628";
}
.icon-xuanze:before {
content: "\e62c";
}
.icon-dianhua:before {
content: "\e62e";
}
.icon-yewutubiaoqi:before {
content: "\e633";
}
.icon-zhongchaping:before {
content: "\e634";
}
.icon-weibiaoti35:before {
content: "\e635";
}
.icon-dizhi:before {
content: "\e636";
}
.icon-shouji:before {
content: "\e638";
}
.icon-dongtaima:before {
content: "\e639";
}
.icon-shouhou:before {
content: "\e63c";
}
.icon-daifukuan:before {
content: "\e63d";
}
.icon-zhongxinguanli:before {
content: "\e63e";
}
.icon-youxiang:before {
content: "\e645";
}
.icon-daipingjia:before {
content: "\e646";
}
.icon-zhanghuzhuangtai:before {
content: "\e64a";
}
.icon-haoping1:before {
content: "\e64c";
}
.icon-duigou1:before {
content: "\e64f";
}
.icon-hexiao:before {
content: "\e650";
}
.icon-yanzhengma:before {
content: "\e651";
}
.icon-weixin-copy:before {
content: "\e65b";
}
.icon-anquan:before {
content: "\e65c";
}
.icon-arrowLeft:before {
content: "\e65d";
}
.icon-xuanze-duoxuan:before {
content: "\e660";
}
.icon-zheng:before {
content: "\e667";
}
.icon-likefill:before {
content: "\e668";
}
.icon-shouye:before {
content: "\e669";
}
.icon-shoujiyanzheng:before {
content: "\e66a";
}
.icon-like:before {
content: "\e66b";
}
.icon-mima:before {
content: "\e66c";
}
.icon-miaosha1:before {
content: "\e66d";
}
.icon-yanzheng:before {
content: "\e678";
}
.icon-jiazaizhong:before {
content: "\e681";
}
.icon-zhaoshangguanli:before {
content: "\e686";
}
.icon-H:before {
content: "\e68f";
}
.icon-shangjiazhongxin:before {
content: "\e690";
}
.icon-shouji-copy:before {
content: "\e694";
}
.icon-shurutianxiebi:before {
content: "\e69f";
}
.icon-zhanghao:before {
content: "\e6b8";
}
.icon-xiugaidenglumima:before {
content: "\e6b9";
}
.icon-guanbi:before {
content: "\e6ba";
}
.icon-shiyong:before {
content: "\e711";
}
.icon-zhengpinbaozhang2:before {
content: "\e722";
}
.icon-tui1:before {
content: "\e738";
}
.icon-zuji:before {
content: "\e755";
}
.icon-youhuiquan:before {
content: "\e8c0";
}
.icon-hedui:before {
content: "\ea53";
}
.icon-dian:before {
content: "\ec1e";
}

View File

@@ -0,0 +1,270 @@
// 参考文档https://element.faas.ele.me/#/zh-CN/component/color#fu-zhu-se
//主色调,红色:#FF0036绿色 #4CAF50蓝色#03A9F4黄色#FF9800粉色#FF547B棕色#C3A769浅绿色#65C4AA黑色#333333紫色#B323B4淡粉色#FF8B8B,element UI#409eff
$base-color: #ff547b;
$base-color-success: #4caf50;
$base-color-warning: #e6a23c;
$base-color-danger: #f56c6c;
$base-color-info: #909399;
/* 文字基本颜色 */
$ns-text-color-black: #303133; //基本色
/* 文字尺寸 */
$ns-font-size-sm: 12px;
$ns-font-size-base: 14px;
$ns-font-size-lg: 16px;
$width: 1210px;
// 小
.ns-font-size-sm {
font-size: $ns-font-size-sm;
}
// 标准
.ns-font-size-base {
font-size: $ns-font-size-base;
}
// 标准
.ns-font-size-lg {
font-size: $ns-font-size-lg;
}
//文字颜色
.ns-text-color {
color: $base-color !important;
}
.ns-text-color-black {
color: $ns-text-color-black !important;
}
//边框
.ns-border-color {
border-color: $base-color !important;
}
//背景色
.ns-bg-color {
background-color: $base-color !important;
}
body {
line-height: 1.8;
font-family: 'Helvetica Neue', Helvetica, 'Microsoft Yahei', 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', sans-serif;
background-color: #f9f9f9;
font-size: $ns-font-size-base;
color: $ns-text-color-black;
}
#__nuxt {
background-color: #f9f9f9;
}
#nprogress .bar {
background: $base-color !important; //自定义颜色
}
html,
body,
dl,
dt,
dd,
ol,
ul,
h1,
h2,
h3,
h4,
h5,
h6,
p {
margin: 0;
padding: 0;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
ol,
ul,
li {
list-style: none;
}
i,
em {
font-style: normal;
}
// 去掉a标签的默认样式
a {
text-decoration: none;
color: $ns-text-color-black;
&:hover {
color: $base-color;
}
}
.el-main {
border-top: solid 1px #f2f2f2;
overflow: initial;
// width: $width;
margin: 0 auto;
padding: 0;
}
.el-button:focus,
.el-button:hover {
color: $base-color;
border-color: lighten($base-color, 20%);
background-color: lighten($base-color, 30%);
}
// 改变按钮默认样式
.el-button--primary,
.el-button--primary:focus,
.el-button--primary:hover,
.el-button--primary.is-plain:focus,
.el-button--primary.is-plain:hover {
background-color: $base-color;
border-color: $base-color;
color: #fff;
}
.el-button--primary.is-plain {
color: $base-color;
background-color: transparent;
border-color: $base-color;
}
img {
border-style: none;
max-width: 100%;
vertical-align: middle;
}
// 居中
.ns-text-align {
text-align: center;
}
// 分页
.el-pagination {
text-align: right;
.el-pagination__rightwrapper {
margin-left: 20px;
}
}
/* 单行超出隐藏 */
.using-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
white-space: break-spaces;
}
/* 多行超出隐藏 */
.multi-hidden {
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.el-breadcrumb__inner a:hover,
.el-breadcrumb__inner.is-link:hover {
color: $base-color;
}
.el-tabs__item:hover,
.el-tabs__item.is-active {
color: $base-color;
}
.el-tabs__active-bar {
background-color: $base-color;
}
.el-pager li.active {
color: $base-color;
}
.el-pagination.is-background .el-pager li:not(.disabled):hover {
color: $base-color;
}
.el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: $base-color;
}
.el-menu-item.is-active {
color: $base-color;
}
.el-progress-bar__inner {
background-color: $base-color;
}
.el-link.el-link--default:hover {
color: $base-color;
}
.el-button--text {
color: $base-color;
}
.el-input.is-active .el-input__inner,
.el-input__inner:focus {
border-color: $base-color;
}
.el-loading-spinner .path {
stroke: $base-color;
}
.el-loading-spinner i {
color: $base-color;
}
.el-loading-spinner .el-loading-text {
color: $base-color;
}
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: $base-color;
border-color: $base-color;
}
.el-checkbox__input.is-checked + .el-checkbox__label {
color: $base-color;
}
.el-radio__input.is-checked .el-radio__inner {
border-color: $base-color;
background: $base-color;
}
.el-textarea__inner:focus{
border-color: $base-color;
}

View File

@@ -0,0 +1,239 @@
.cart {
margin: 20px auto;
width: $width;
nav {
overflow: hidden;
padding: 10px;
background: #fff;
margin-bottom: 10px;
li {
float: left;
&:nth-child(1) {
width: 3%;
}
&:nth-child(2) {
width: 55%;
}
&:nth-child(3) {
width: 10%;
}
&:nth-child(4) {
width: 15%;
}
&:nth-child(5) {
width: 10%;
}
&:nth-child(6) {
width: 7%;
}
}
}
.list {
.item {
margin-bottom: 20px;
.head {
padding: 10px;
background: #fff;
border-bottom: 1px solid #eeeeee;
a {
margin: 0 10px 0 20px;
}
}
ul {
overflow: hidden;
padding: 10px;
background: #fff;
li {
float: left;
line-height: 60px;
&:nth-child(1) {
width: 3%;
margin-left: 20px;
}
&:nth-child(2) {
width: 53.3%;
line-height: inherit;
.img-wrap {
width: 60px;
height: 60px;
float: left;
margin-right: 10px;
cursor: pointer;
}
.info-wrap {
margin-left: 70px;
cursor: pointer;
h5 {
font-weight: normal;
font-size: $ns-font-size-base;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
margin-right: 10px;
&:hover {
color: $base-color;
}
}
span {
font-size: $ns-font-size-sm;
color: #9a9a9a;
}
}
}
&:nth-child(3) {
width: 10%;
}
&:nth-child(4) {
width: 15%;
.el-input-number--mini {
width: 100px;
}
}
&:nth-child(5) {
width: 10%;
}
&:nth-child(6) {
width: 7%;
}
}
}
}
}
.lose-list {
margin-bottom: 20px;
.head {
padding: 10px;
background: #fff;
border-bottom: 1px solid #eeeeee;
span {
margin: 0 5px;
font-weight: bold;
font-size: 16px;
}
}
ul {
overflow: hidden;
padding: 10px;
background: #f0f0f0;
li {
float: left;
line-height: 60px;
color: #9a9a9a;
&:nth-child(1) {
width: 3%;
margin-left: 5px;
margin-right: 15px;
}
&:nth-child(2) {
width: 53.3%;
line-height: inherit;
.img-wrap {
width: 60px;
height: 60px;
float: left;
margin-right: 10px;
}
.info-wrap {
margin-left: 70px;
cursor: pointer;
h5 {
font-weight: normal;
font-size: $ns-font-size-base;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
margin-right: 10px;
}
span {
font-size: $ns-font-size-sm;
}
}
}
&:nth-child(3) {
width: 10%;
}
&:nth-child(4) {
width: 15%;
.el-input-number--mini {
width: 100px;
}
}
&:nth-child(5) {
width: 10%;
}
&:nth-child(6) {
width: 7%;
}
}
}
}
footer {
background-color: #fff;
margin-bottom: 20px;
padding: 10px;
.operation {
display: inline-block;
vertical-align: middle;
margin-left: 20px;
li {
float: left;
margin-right: 30px;
}
}
.sum-wrap {
float: right;
.selected-sum {
display: inline-block;
margin-right: 20px;
.total-count {
padding: 0 5px;
font-size: 16px;
color: $base-color;
font-weight: bold;
}
}
.price-wrap {
display: inline-block;
margin-right: 20px;
span {
font-size: $ns-font-size-sm;
}
strong {
font-size: 18px;
}
}
}
}
}
.el-button--text {
color: #333;
&:hover {
color: $base-color;
}
}
.empty-wrap {
padding: 50px 0 60px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
img{
width: 400px;
height: 244px;
}
a{
font-size: 14px;
color: #4A4A4A;
&:hover{
color: $base-color;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,261 @@
.index-wrap {
width: 100%;
height: 500px;
}
.index {
width: $width;
margin: 0 auto;
box-sizing: border-box;
display: flex;
flex-direction: row;
justify-content: space-between;
.border-right {
border-right: 1px solid #f5f5f5;
}
.border-bottom {
border-bottom: 1px solid #f5f5f5;
}
.banner {
height: 430px;
width: 100%;
.el-carousel__indicators--horizontal{
padding-left: 240px;
}
.el-image {
width: 100%;
height: 100%;
}
}
}
.index-content-wrap {
width: $width;
margin: auto;
// 中部广告位
.adv-middle{
display: flex;
margin-top: 30px;
.adv-middle-item{
margin-right: 15px;
height: 210px;
// flex: 1;
transition: all 0.2s linear 0s;
cursor: pointer;
.el-image{
height: 210px;
}
&:last-of-type{
margin-right: 0;
}
&:hover{
z-index: 2;
box-shadow: rgb(0 0 0 / 10%) 0 15px 30px;
transform: translate3d(0px, -2px, 0px);
}
img{
max-width: 100%;
max-height: 100%;
}
}
}
// 广告
.ad-wrap {
width: $width;
margin: 20px auto;
display: flex;
justify-content: space-between;
> div {
width: calc((100% - 15px) / 2);
height: 372px;
}
.ad-big {
display: flex;
justify-content: space-between;
.ad-big-img {
width: calc((100% - 15px) / 2);
cursor: pointer;
}
}
.ad-small {
display: flex;
justify-content: space-between;
align-content: space-between;
flex-wrap: wrap;
.ad-small-img {
width: calc((100% - 15px) / 2);
height: calc((100% - 15px) / 2);
cursor: pointer;
}
}
}
// 限时秒杀
.seckill-wrap {
height: 376px;
width: $width;
background-color: #ffffff;
margin: 20px auto;
border: 1px solid #e9e9e9;
}
.seckill-time {
width: 100%;
height: 45px;
line-height: 44px;
border-bottom: 1px solid #e9e9e9;
display: flex;
justify-content: space-between;
padding: 0 20px;
box-sizing: border-box;
.seckill-time-left {
color: #383838;
i,
.seckill-time-title {
font-size: 18px;
font-weight: 600;
margin-right: 5px;
}
.seckill-time-title {
margin-right: 15px;
}
}
.count-down {
display: inline-block;
margin-left: 7px;
}
.seckill-time-right {
color: #838383;
cursor: pointer;
}
}
.seckill-content {
padding: 20px 20px 0;
}
.seamless-warp2 {
overflow: hidden;
ul.item {
li {
float: left;
width: 250px;
padding: 0 25px;
box-sizing: border-box;
border-right: 1px solid #f1f1f1;
.seckill-goods {
cursor: pointer;
.seckill-goods-img {
width: 100%;
height: 200px;
}
img {
object-fit: cover;
}
> p {
line-height: 24px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
height: 50px;
}
.seckill-price-wrap {
display: flex;
align-items: flex-end;
height: 24px;
line-height: 24px;
margin-top: 10px;
p span {
font-size: 24px;
}
.primary-price {
text-decoration: line-through;
color: #838383;
margin-left: 10px;
}
}
}
}
}
}
}
.floor {
width: $width;
margin: 20px auto;
.floor_item {
margin-top: 10px;
}
}
.floatLayer-wrap {
position: fixed;
height: 100vh;
width: 100vw;
left: 0;
top: 0;
background: rgba($color: #000000, $alpha: 0.5);
z-index: 999;
.floatLayer {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 999;
cursor: pointer;
.img-wrap {
width: 456px;
height: 274px;
line-height: 274px;
overflow: hidden;
text-align: center;
img{
max-height: 100%;
}
}
i {
color: #ffffff;
font-size: 30px;
position: absolute;
top: -30px;
right: -30px;
}
}
}
// 悬浮搜索
.fixed-box {
width: 100vw;
background-color: #ffffff;
position: fixed;
top: 0;
left: 0;
z-index: 999;
border-bottom: 2px solid $base-color;
}

View File

@@ -0,0 +1,354 @@
.payment-wrap {
width: 1210px;
margin: 20px auto;
}
.clear {
clear: both;
}
.item-block {
padding: 0 15px 1px;
margin: 10px 0;
border-radius: 0;
border: none;
background: #ffffff;
.block-text {
border-color: #eeeeee;
color: $ns-text-color-black;
padding: 7px 0;
border-bottom: 1px;
}
.box {
.liuyan-text {
background-color: #f7f7f7;
border: 2px solid #dadada;
height: 56px;
width: 80%;
padding: 10px;
box-sizing: border-box;
border-radius: 4px;
}
}
.jifen-price {
font-weight: bold;
color: red;
}
}
.padd-bom-10 {
padding-bottom: 10px;
}
.padd-bom-20 {
padding-bottom: 20px;
}
//收货地址
.address-desc {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.address-item {
width: 23%;
border: 3px solid #eee;
box-sizing: border-box;
margin: 1%;
height: 150px;
cursor: pointer;
float: left;
.add-address {
padding: 10px;
text-align: center;
line-height: 120px;
}
.address-info {
padding: 10px;
height: 100%;
box-sizing: border-box;
position: relative;
.options {
position: absolute;
right: 0;
top: 10px;
width: 50%;
text-align: right;
div {
display: inline-block;
margin-right: 10px;
color: #999999;
}
}
.address-name {
color: $base-color;
padding: 0 0 6px;
border-bottom: 1px solid #eee;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding-right: 71px;
box-sizing: border-box;
line-height: 25px;
}
.address-mobile {
padding: 10px 0 4px;
}
}
}
.address-item.active {
background-color: #fffbf9;
border-color: $base-color;
}
//支付方式
.pay-type-list {
padding: 20px 0;
}
.distribution {
color: #ff547b;
margin-left: 10px;
}
.pay-type-item {
background-color: white;
display: inline-block;
border: 2px solid #eeeeee;
padding: 5px 20px;
margin-right: 20px;
cursor: pointer;
}
.pay-type-item.active {
border-color: $base-color;
}
.mobile-wrap {
width: 300px;
}
//商品列表
.goods-list {
padding: 15px 0;
.store-icon {
margin-right: 5px;
font-size: 16px;
}
.shop-icon {
font-size: 18px;
}
table {
width: 100%;
}
.goods-info-left {
width: 60px;
height: 60px;
float: left;
.goods-img {
width: 60px;
height: 60px;
}
}
.goods-info-right {
float: left;
height: 60px;
margin-left: 10px;
color: $base-color;
width: 80%;
.goods-name {
line-height: 20px;
padding-top: 10px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.goods-spec {
color: #999;
span{
margin-right: 5px;
}
}
}
.goods-footer {
background-color: #f3fbfe;
padding: 10px;
margin-top: 10px;
.goods-footer-right {
width: 50%;
float: left;
}
.goods-footer-left {
width: 50%;
float: left;
}
.order-cell {
cursor: pointer;
.tit {
padding: 5px 0 0 0;
}
}
.express-item {
margin-top: 5px;
display: inline-block;
border: 2px solid #eeeeee;
padding: 3px 10px;
margin-right: 20px;
cursor: pointer;
}
.express-item.active {
border-color: $base-color;
}
}
}
.promotion-show {
color: #999;
}
.align-right {
text-align: right;
}
//统计
.order-statistics {
float: right;
padding: 10px;
// color: #999;
}
.order-submit {
float: right;
padding: 10px;
}
.order-money {
display: inline-block;
margin-right: 20px;
div {
display: inline-block;
font-size: $ns-font-size-lg;
}
}
.buyer-message.el-textarea {
width: 400px;
}
.address-open {
cursor: pointer;
font-size: 13px;
padding: 0 0 10px 10px;
}
.pay-password-item {
margin-bottom: 10px;
}
.pay-password {
width: 80%;
}
.pay-password.hide-password {
position: fixed;
top: -9999px;
}
.platform-coupon {
cursor: pointer;
}
.forget-password {
text-align: right;
margin-right: 45px;
cursor: pointer;
}
.disabled-selected-wrap {
pointer-events: none;
cursor: pointer;
}
.cursor-pointer {
cursor: pointer;
}
//发票样式
.invoice-information {
.invoice-type-box {
display: inline-block;
padding: 10px 0;
vertical-align: bottom;
height: 30px;
line-height: 30px;
&.invoice-title-box {
margin-right: 100px;
}
.invoice-name {
margin-right: 25px;
}
.invoice-to-type {
display: inline-block;
margin-right: 30px;
position: relative;
// i{
// width: 17px;
// height: 17px;
// display: inline-block;
// position: absolute;
// border-radius: 34px;
// overflow: hidden;
// top: 7px;
// left:-1px;
// background: #fff;
// background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
// background-size: 100% 100%;
// }
i {
width: 14px;
height: 14px;
display: inline-block;
border-radius: 34px;
overflow: hidden;
background: #fff;
vertical-align: text-bottom;
border: 1px solid #999;
&.active {
width: 17px;
height: 17px;
overflow: hidden;
background: #fff;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
background-size: 100% 100%;
border: none;
}
}
input {
vertical-align: middle;
margin: 0;
width: 15px;
height: 15px;
}
}
.invoice-box-form {
display: inline-block;
input {
height: 28px;
line-height: 28px;
margin-right: 20px;
border: 1px solid #dddddd;
padding-left: 10px;
border-radius: 3px;
outline: none;
}
}
}
.invoice-condition {
padding: 10px 0;
.invoice-name {
margin-right: 25px;
}
.invoice-box-form {
display: inline-block;
.option-item {
margin-right: 20px;
cursor: pointer;
&.active {
color: #ff547b;
}
}
}
}
.invoice-tops{
margin-bottom: 20px;
}
}

View File

@@ -0,0 +1,937 @@
.el-main{
.detail-nav-wrap{
background-color: #f8f8f8;
.detail-nav{
margin: auto;
width: 1210px;
height: 54px;
display: flex;
align-items: center;
.iconfont{
margin: 0 8px;
}
span{
color: #666;
&:last-of-type{
color: $base-color;
}
}
.goods-name{
display: inline-block;
width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
}
.detail-main {
background: #fff;
padding-top: 20px;
}
.goods-detail {
overflow: hidden;
margin: 0 auto;
width: 1210px;
.preview-wrap {
display: flex;
float: left;
.video-player-wrap {
position: absolute;
z-index: 1;
.video-player {
visibility: hidden;
> div {
width: 356px;
height: 356px;
display: none;
}
.vjs-control-bar,
.vjs-big-play-button {
visibility: hidden;
transition: none;
}
.vjs-big-play-button {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
}
.media-mode {
position: absolute;
width: 356px;
z-index: 5;
bottom: 0;
top: 300px;
text-align: center;
line-height: 25px;
span {
background: rgba(100, 100, 100, 0.6);
color: #fff;
font-size: 12px;
line-height: 25px;
border-radius: 10px;
padding: 0 15px;
display: inline-block;
cursor: pointer;
&:last-child {
margin-left: 20px;
}
}
}
&.show {
.video-player,
.vjs-control-bar,
.vjs-big-play-button {
visibility: visible;
}
.video-player {
> div {
display: block;
}
}
.media-mode {
top: initial;
bottom: 50px;
}
}
}
.magnifier-wrap {
width: 460px;
height: 460px;
border: 1px solid #d8d8d8;
box-sizing: border-box;
.magnifier-box .mouse-cover {
background-color: #fede4f;
opacity: 0.4;
}
}
.spec-items {
margin-left: 10px;
position: relative;
width: 84px;
height: 460px;
overflow: hidden;
> span {
cursor: pointer;
left: 0;
top: 0;
width: 84px;
height: 42px;
line-height: 42px;
text-align: center;
position: absolute;
background: #fff;
color: #838383;
z-index: 1;
font-size: 25px;
&:first-of-type{
transform: rotate(180deg);
}
&:last-of-type{
top: calc(100% - 42px);
}
}
ul {
display: flex;
flex-direction: column;
width: 100%;
height: 500%;
position: absolute;
top: 48px;
li {
width: 84px;
height: 84px;
overflow: hidden;
margin-bottom: 10px;
border: 1px solid #DADADA;
cursor: pointer;
opacity: 0.5;
box-sizing: border-box;
&:hover,
&.selected {
opacity: 1;
border-color: $base-color;
}
}
}
}
.share-collect {
padding: 10px 0 20px;
cursor: pointer;
text-align: right;
color: #838383;
display: flex;
justify-content: space-between;
align-items: center;
a{
color: #838383;
}
i,
span {
vertical-align: middle;
}
i {
margin-right: 5px;
}
}
}
.basic-info-wrap {
float: left;
width: calc(100% - 589px);
margin-left: 30px;
h1 {
font-size: 20px;
font-weight: normal;
color: #333;
line-height: 1.5;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.desc {
font-size: 12px;
color: #999;
margin: 5px 0 12px;
}
.divider {
margin: 10px 0;
border: 0;
border-top: 1px dotted #e5e5e5;
}
.discount-banner {
margin-top: 5px;
background: url(~/assets/images/goods/discount_bg.png) no-repeat;
height: 40px;
line-height: 40px;
overflow: hidden;
display: flex;
justify-content: space-between;
align-items: center;
.activity-name {
color: #fff;
font-size: 14px;
height: 40px;
i {
display: inline-block;
line-height: 40px;
}
span {
display: inline-block;
line-height: 40px;
vertical-align: top;
}
}
.discount-icon {
margin: 0 8px 0 10px;
color: #fff;
font-size: 20px;
}
.surplus-time {
color: #fff;
font-size: 14px;
float: right;
height: 35px;
line-height: 35px;
padding-right: 5px;
text-align: right;
> span {
margin-right: 5px;
}
i {
font-style: normal;
padding: 2px;
width: 20px;
height: 20px;
margin: 0 5px;
border-radius: 3px;
}
.count-down {
display: inline-block;
}
}
}
.item-block {
background-color: #f8f8f8;
padding: 15px 0;
position: relative;
background-size: cover;
min-height: 62px;
margin-bottom: 20px;
.statistical {
position: absolute;
right: 20px;
top: 16px;
li {
display: inline-block;
text-align: center;
position: relative;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
&:first-child {
margin-right: 40px;
}
p {
color: #838383;
}
span {
color: #383838;
font-size: 16px;
}
}
}
}
.item-line {
font-size: 14px;
min-height: 35px;
line-height: 35px;
display: flex;
padding-left: 20px;
margin-bottom: 10px;
dt {
display: inline-block;
width: 50px;
height: 35px;
line-height: 35px;
text-align: justify;
font-size: 12px;
margin-right: 16px;
color: #222;
flex-shrink: 0;
&::after {
display: inline-block;
width: 100%;
content: '';
height: 0;
}
}
> * {
height: inherit;
line-height: inherit;
font-size: 14px;
}
> dd {
display: flex;
align-items: center;
height: 35px;
}
&:last-of-type{
margin-bottom: 0;
}
&:first-of-type > dd{
align-items: baseline;
}
.yuan {
font-size: 18px;
}
.price {
font-size: 30px;
font-weight: bold;
}
.market-yuan {
font-size: 14px;
text-decoration: line-through;
}
.member_price {
font-size: 14px;
margin-left: 5px;
}
.market-price {
font-size: 14px;
margin-left: 5px;
text-decoration: line-through;
}
&.promotion-price .label {
line-height: initial;
font-size: 18px;
background: transparent;
padding: 0;
vertical-align: text-bottom;
}
&.coupon-list {
align-items: baseline;
> div {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
dd {
margin-right: 20px;
}
}
p {
display: inline-block;
position: relative;
line-height: 18px;
}
span {
display: inline-block;
padding: 0 10px;
margin-right: 10px;
cursor: pointer;
border: 1px solid $base-color;
height: 32px;
line-height: 32px;
color: $base-color;
font-size: 14px;
box-sizing: border-box;
}
label {
line-height: 16px;
position: absolute;
left: 10px;
top: 1px;
}
}
&.manjian {
align-items: end;
}
&.manjian span {
// padding: 2px 10px;
font-size: 12px;
margin-right: 5px;
}
&.delivery {
position: relative;
i {
margin-left: 5px;
}
dd{
align-items: center;
}
.region-selected {
position: relative;
display: inline-block;
vertical-align: middle;
cursor: pointer;
margin: 0 5px 0 0;
width: auto;
padding: 0 10px;
height: 32px;
line-height: 32px;
border: 1px solid #e5e5e5;
z-index: 2;
font-size: 14px;
}
.region-list {
width: 466px;
position: absolute;
z-index: 10;
top: 35px;
left: 82px;
background: #fff;
border: 1px solid #e5e5e5;
padding: 15px;
line-height: 18px;
height: auto;
display: none;
font-size: 14px;
&.hide{
display: none !important;
}
.nav-tabs {
border-bottom: 2px solid $base-color;
height: 30px;
> li {
margin-bottom: -2px;
float: left;
> div {
padding: 4px 8px;
border: 2px solid transparent;
height: 20px;
display: inline-block;
line-height: 20px;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1);
cursor: pointer;
&:hover {
border-color: transparent;
}
}
&.active {
> div {
color: $base-color;
border: 2px solid;
border-bottom-color: #fff !important;
}
}
}
}
.tab-content {
> .active {
padding: 10px 0;
}
> .tab-pane {
display: none;
&.active {
display: block;
}
li {
float: left;
width: 25%;
line-height: 30px;
&.selected {
color: $base-color;
}
span {
cursor: pointer;
&:hover {
color: $base-color;
}
}
}
}
}
}
dd:hover {
.region-list {
display: block;
}
}
}
&.service a {
margin: 0 5px;
}
&.buy-btn {
margin: 25px 0 0;
dt{
margin: 0;
padding: 0;
width: 0;
height: 0;
}
dd{
height: auto;
}
button {
min-width: 168px;
height: 52px;
margin-right: 10px;
font-size: 20px;
text-shadow: 0 0 0;
border-radius: 0;
&[disabled] {
cursor: not-allowed;
pointer-events: initial;
border: 1px solid;
opacity: 1;
}
i {
margin-right: 5px;
font-size: 20px;
}
}
}
.i-activity-flag {
height: 32px;
line-height: 32px;
padding: 0 8px;
border: 1px solid;
font-size: 14px;
margin-right: 5px;
white-space: nowrap;
}
&.gift-point strong {
font-size: 14px;
}
&.merchant-service {
overflow: hidden;
margin: 10px 0;
align-items: flex-start;
> div {
display: inline-block;
}
dd {
display: inline-block;
margin-right: 18px;
// margin: 0;
&:last-child {
padding-right: 0;
}
i {
color: $base-color;
font-size: $ns-font-size-base;
margin-right: 5px;
}
span {
cursor: pointer;
}
}
}
}
.sku-list {
ul {
overflow: hidden;
padding: 1px;
li {
float: left;
position: relative;
margin: 2px 10px 10px 0;
line-height: 14px;
vertical-align: middle;
div {
padding: 8px 15px;
text-align: center;
border: 1px solid #b7b7b7;
display: inline-block;
-webkit-transition: none;
transition: none;
position: relative;
cursor: pointer;
&.selected,
&:hover {
border: 1px solid;
color: $base-color;
}
&:hover {
color: $base-color;
}
&.disabled,
&.disabled:hover {
border: 1px solid #b7b7b7;
margin: 0;
cursor: not-allowed;
color: #aaa;
}
img {
margin-right: 10px;
width: 26px;
height: 26px;
display: inline-block;
vertical-align: middle;
}
i {
position: absolute;
right: -10px;
bottom: 0px;
display: none;
font-size: 32px;
}
&:not(.disabled).selected i,
&:not(.disabled):hover i {
display: block;
}
}
}
}
}
.buy-number {
margin: 10px 0;
.num-wrap {
display: inline-block;
vertical-align: middle;
position: relative;
margin-right: 10px;
input {
width: 126px;
padding-left: 40px;
padding-right: 40px;
font-size: 12px;
height: 32px;
line-height: 32px;
border-radius: 0;
border-color: #D5D5D5;
text-align: center;
&.disabled {
cursor: not-allowed;
}
}
span {
position: absolute;
top: 2px;
left: 0;
width: 32px;
height: 32px;
overflow: hidden;
cursor: pointer;
display: block;
line-height: 32px;
text-align: center;
user-select: none;
z-index: 1;
&.decrease{
border-right: 1px solid #D5D5D5;
}
&.increase{
left: 94px;
border-left: 1px solid #D5D5D5;
}
&.disabled {
cursor: not-allowed;
}
}
}
.inventory {
margin-left: 10px;
}
}
.go-phone {
position: relative;
float: right;
width: 52px;
height: 52px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
border: 1px solid #d8d8d8;
box-sizing: border-box;
margin-right: 10px;
cursor: pointer;
&>img{
}
&>span{
margin-top: 4px;
line-height: 1;
font-size: 12px;
color: #999;
}
&:hover .qrcode-wrap {
display: block;
}
.qrcode-wrap {
border: 1px solid #e5e5e5;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.12);
height: 120px;
overflow: hidden;
padding: 10px;
position: absolute;
width: 120px;
left: 30px;
top: -50px;
display: none;
background:white;
}
&.icon-item{
.iconfont{
font-size: 22px;
font-weight: bold;
color: #5E5C5C;
&.selected{
color: #ff9000;
}
}
}
}
}
.shop-wrap {
float: right;
border: 1px solid #e9e9e9;
padding: 0 20px;
width: 234px;
box-sizing: border-box;
.head-wrap {
text-align: center;
padding: 16px 0;
border-bottom: 1px solid #f1f1f1;
.img-wrap {
width: 64px;
height: 64px;
line-height: 64px;
display: inline-block;
img {
max-width: 100%;
max-height: 100%;
}
}
.site-name {
font-size: 14px;
color: #383838;
}
.tag {
margin-left: 10px;
font-size: 14px;
}
}
.info-wrap {
padding: 10px 0;
border-bottom: 1px solid #f1f1f1;
dl {
font-size: $ns-font-size-sm;
dt {
color: #838383;
// width: 65px;
line-height: 25px;
font-weight: normal;
float: left;
}
dt.site-score {
// width: 58px;
padding-right: 5px;
}
dd {
height: 25px;
line-height: 25px;
// margin-left: 50px;
color: #838383;
span {
color: #383838;
font-weight: 600;
}
}
}
}
.operation {
padding: 12px 0;
.el-button {
padding: 10px 16px;
}
}
}
.detail-wrap {
padding: 64px 0 35px;
clear: both;
.goods-recommended {
float: left;
width: 234px;
}
.goods-tab {
.attr-list {
font-size: 14px;
display: flex;
flex-wrap: wrap;
li {
margin-bottom: 5px;
padding: 0 10px;
flex: 0 0 30%;
width: 33%;
}
}
.el-tabs__header{
margin-bottom: 30px;
}
.tablist{
border-radius: 0;
}
.el-tabs__item{
position: relative;
width: 168px;
height: 52px;
line-height: 52px;
text-align: center;
font-size: 18px;
&.is-active{
color: $base-color;
&:after{
content: "";
position: absolute;
top: -1px;
left: 0;
right: 0;
height: 2px;
background-color: $base-color;
}
}
&:hover{
color: $base-color;
}
}
.evaluate {
.empty {
color: #898989;
text-align: center;
font-size: 14px;
}
nav {
padding: 10px;
overflow: hidden;
background: #f7f7f7;
li {
float: left;
padding: 0 20px;
cursor: pointer;
&:first-child {
padding-left: 0;
}
&:hover,
&.selected {
color: $base-color;
}
}
}
.list {
margin-top: 10px;
font-size: 14px;
li {
padding: 15px;
border-bottom: 1px solid #e5e5e5;
.member-info {
float: left;
width: 140px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
img {
width: 25px;
height: 25px;
border-radius: 50%;
margin-right: 5px;
}
}
.info-wrap {
margin-left: 150px;
margin-bottom: 10px;
.content {
padding: 10px 0;
}
.img-list {
.el-image {
width: 50px;
margin-left: 10px;
&:first-child {
margin-left: 0;
}
}
}
.sku-info {
color: #898989;
font-size: 12px;
span {
margin-right: 5px;
&.create-time {
margin-left: 10px;
}
}
}
.evaluation-reply {
margin: 10px 0;
color: $base-color;
}
.review-evaluation {
.review-time {
font-size: $ns-font-size-sm;
margin-left: 20px;
color: #898989;
}
}
}
}
}
.page-wrap {
margin-top: 10px;
text-align: right;
}
}
}
}
}

View File

@@ -0,0 +1,936 @@
.el-main{
.detail-nav-wrap{
background-color: #f8f8f8;
.detail-nav{
margin: auto;
width: 1210px;
height: 54px;
display: flex;
align-items: center;
.iconfont{
margin: 0 8px;
}
span{
color: #666;
&:last-of-type{
color: $base-color;
}
}
.goods-name{
display: inline-block;
width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
}
.detail-main {
background: #fff;
padding-top: 20px;
}
.goods-detail {
overflow: hidden;
margin: 0 auto;
width: 1210px;
.preview-wrap {
display: flex;
float: left;
.video-player-wrap {
position: absolute;
z-index: 1;
.video-player {
visibility: hidden;
> div {
width: 356px;
height: 356px;
display: none;
}
.vjs-control-bar,
.vjs-big-play-button {
visibility: hidden;
transition: none;
}
.vjs-big-play-button {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
}
.media-mode {
position: absolute;
width: 356px;
z-index: 5;
bottom: 0;
top: 300px;
text-align: center;
line-height: 25px;
span {
background: rgba(100, 100, 100, 0.6);
color: #fff;
font-size: 12px;
line-height: 25px;
border-radius: 10px;
padding: 0 15px;
display: inline-block;
cursor: pointer;
&:last-child {
margin-left: 20px;
}
}
}
&.show {
.video-player,
.vjs-control-bar,
.vjs-big-play-button {
visibility: visible;
}
.video-player {
> div {
display: block;
}
}
.media-mode {
top: initial;
bottom: 50px;
}
}
}
.magnifier-wrap {
width: 460px;
height: 460px;
border: 1px solid #d8d8d8;
box-sizing: border-box;
.magnifier-box .mouse-cover {
background-color: #fede4f;
opacity: 0.4;
}
}
.spec-items {
margin-left: 10px;
position: relative;
width: 84px;
height: 460px;
overflow: hidden;
> span {
cursor: pointer;
left: 0;
top: 0;
width: 84px;
height: 42px;
line-height: 42px;
text-align: center;
position: absolute;
background: #fff;
color: #838383;
z-index: 1;
font-size: 25px;
&:first-of-type{
transform: rotate(180deg);
}
&:last-of-type{
top: calc(100% - 42px);
}
}
ul {
display: flex;
flex-direction: column;
width: 100%;
height: 500%;
position: absolute;
top: 48px;
li {
width: 84px;
height: 84px;
overflow: hidden;
margin-bottom: 10px;
border: 1px solid #DADADA;
cursor: pointer;
opacity: 0.5;
box-sizing: border-box;
&:hover,
&.selected {
opacity: 1;
border-color: $base-color;
}
}
}
}
.share-collect {
padding: 10px 0 20px;
cursor: pointer;
text-align: right;
color: #838383;
display: flex;
justify-content: space-between;
align-items: center;
a{
color: #838383;
}
i,
span {
vertical-align: middle;
}
i {
margin-right: 5px;
}
}
}
.basic-info-wrap {
float: left;
width: calc(100% - 589px);
margin-left: 30px;
h1 {
font-size: 20px;
font-weight: normal;
color: #333;
line-height: 1.5;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.desc {
font-size: 12px;
color: #999;
margin: 5px 0 12px;
}
.divider {
margin: 10px 0;
border: 0;
border-top: 1px dotted #e5e5e5;
}
.discount-banner {
margin-top: 5px;
background: url(../../../../assets/images/goods/discount_bg.png) no-repeat;
height: 40px;
line-height: 40px;
overflow: hidden;
display: flex;
justify-content: space-between;
align-items: center;
.activity-name {
color: #fff;
font-size: 14px;
height: 40px;
i {
display: inline-block;
line-height: 40px;
}
span {
display: inline-block;
line-height: 40px;
vertical-align: top;
}
}
.discount-icon {
margin: 0 8px 0 10px;
color: #fff;
font-size: 20px;
}
.surplus-time {
color: #fff;
font-size: 14px;
float: right;
height: 35px;
line-height: 35px;
padding-right: 5px;
text-align: right;
> span {
margin-right: 5px;
}
i {
font-style: normal;
padding: 2px;
width: 20px;
height: 20px;
margin: 0 5px;
border-radius: 3px;
}
.count-down {
display: inline-block;
}
}
}
.item-block {
background-color: #f8f8f8;
padding: 15px 0;
position: relative;
background-size: cover;
min-height: 62px;
margin-bottom: 20px;
.statistical {
position: absolute;
right: 20px;
top: 16px;
li {
display: inline-block;
text-align: center;
position: relative;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
&:first-child {
margin-right: 40px;
}
p {
color: #838383;
}
span {
color: #383838;
font-size: 16px;
}
}
}
}
.item-line {
font-size: 14px;
min-height: 35px;
line-height: 35px;
display: flex;
padding-left: 20px;
margin-bottom: 10px;
dt {
display: inline-block;
width: 50px;
height: 35px;
line-height: 35px;
text-align: justify;
font-size: 12px;
margin-right: 16px;
color: #222;
flex-shrink: 0;
&::after {
display: inline-block;
width: 100%;
content: '';
height: 0;
}
}
> * {
height: inherit;
line-height: inherit;
font-size: 14px;
}
> dd {
display: flex;
align-items: center;
height: 35px;
}
&:last-of-type{
margin-bottom: 0;
}
&:first-of-type > dd{
align-items: baseline;
}
.yuan {
font-size: 18px;
}
.price {
font-size: 30px;
font-weight: bold;
}
.market-yuan {
font-size: 14px;
text-decoration: line-through;
}
.member_price {
font-size: 14px;
margin-left: 5px;
}
.market-price {
font-size: 14px;
margin-left: 5px;
text-decoration: line-through;
}
&.promotion-price .label {
line-height: initial;
font-size: 18px;
background: transparent;
padding: 0;
vertical-align: text-bottom;
}
&.coupon-list {
align-items: baseline;
> div {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
dd {
margin-right: 20px;
}
}
p {
display: inline-block;
position: relative;
line-height: 18px;
}
span {
display: inline-block;
padding: 0 10px;
margin-right: 10px;
cursor: pointer;
border: 1px solid $base-color;
height: 32px;
line-height: 32px;
color: $base-color;
font-size: 14px;
box-sizing: border-box;
}
label {
line-height: 16px;
position: absolute;
left: 10px;
top: 1px;
}
}
&.manjian {
align-items: end;
}
&.manjian span {
// padding: 2px 10px;
font-size: 12px;
margin-right: 5px;
}
&.delivery {
position: relative;
i {
margin-left: 5px;
}
dd{
align-items: center;
}
.region-selected {
position: relative;
display: inline-block;
vertical-align: middle;
cursor: pointer;
margin: 0 5px 0 0;
width: auto;
padding: 0 10px;
height: 32px;
line-height: 32px;
border: 1px solid #e5e5e5;
z-index: 2;
font-size: 14px;
}
.region-list {
width: 466px;
position: absolute;
z-index: 10;
top: 35px;
left: 82px;
background: #fff;
border: 1px solid #e5e5e5;
padding: 15px;
line-height: 18px;
height: auto;
display: none;
font-size: 14px;
&.hide{
display: none !important;
}
.nav-tabs {
border-bottom: 2px solid $base-color;
height: 30px;
> li {
margin-bottom: -2px;
float: left;
> div {
padding: 4px 8px;
border: 2px solid transparent;
height: 20px;
display: inline-block;
line-height: 20px;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1);
cursor: pointer;
&:hover {
border-color: transparent;
}
}
&.active {
> div {
color: $base-color;
border: 2px solid;
border-bottom-color: #fff !important;
}
}
}
}
.tab-content {
> .active {
padding: 10px 0;
}
> .tab-pane {
display: none;
&.active {
display: block;
}
li {
float: left;
width: 25%;
line-height: 30px;
&.selected {
color: $base-color;
}
span {
cursor: pointer;
&:hover {
color: $base-color;
}
}
}
}
}
}
dd:hover {
.region-list {
display: block;
}
}
}
&.service a {
margin: 0 5px;
}
&.buy-btn {
margin: 25px 0 0;
dt{
margin: 0;
padding: 0;
width: 0;
height: 0;
}
dd{
height: auto;
}
button {
min-width: 168px;
height: 52px;
margin-right: 10px;
font-size: 20px;
text-shadow: 0 0 0;
border-radius: 0;
&[disabled] {
cursor: not-allowed;
pointer-events: initial;
border: 1px solid;
opacity: 1;
}
i {
margin-right: 5px;
font-size: 20px;
}
}
}
.i-activity-flag {
height: 32px;
line-height: 32px;
padding: 0 8px;
border: 1px solid;
font-size: 14px;
margin-right: 5px;
white-space: nowrap;
}
&.gift-point strong {
font-size: 14px;
}
&.merchant-service {
overflow: hidden;
margin: 10px 0;
align-items: flex-start;
> div {
display: inline-block;
}
dd {
display: inline-block;
margin-right: 18px;
// margin: 0;
&:last-child {
padding-right: 0;
}
i {
color: $base-color;
font-size: $ns-font-size-base;
margin-right: 5px;
}
span {
cursor: pointer;
}
}
}
}
.sku-list {
ul {
overflow: hidden;
padding: 1px;
li {
float: left;
position: relative;
margin: 2px 10px 10px 0;
line-height: 14px;
vertical-align: middle;
div {
padding: 8px 12px;
text-align: center;
border: 1px solid #b7b7b7;
display: inline-block;
-webkit-transition: none;
transition: none;
position: relative;
cursor: pointer;
&.selected,
&:hover {
border: 2px solid;
margin: -1px;
color: $base-color;
}
&:hover {
color: $base-color;
}
&.disabled,
&.disabled:hover {
border: 1px solid #b7b7b7;
margin: 0;
cursor: not-allowed;
color: #aaa;
}
img {
margin-right: 10px;
width: 26px;
height: 26px;
display: inline-block;
vertical-align: middle;
}
i {
position: absolute;
right: -10px;
bottom: 0px;
display: none;
font-size: 32px;
}
&:not(.disabled).selected i,
&:not(.disabled):hover i {
display: block;
}
}
}
}
}
.buy-number {
margin: 10px 0;
.num-wrap {
display: inline-block;
vertical-align: middle;
position: relative;
margin-right: 10px;
input {
width: 126px;
padding-left: 40px;
padding-right: 40px;
font-size: 12px;
height: 32px;
line-height: 32px;
border-radius: 0;
border-color: #D5D5D5;
text-align: center;
&.disabled {
cursor: not-allowed;
}
}
span {
position: absolute;
top: 2px;
left: 0;
width: 32px;
height: 32px;
overflow: hidden;
cursor: pointer;
display: block;
line-height: 32px;
text-align: center;
user-select: none;
z-index: 1;
&.decrease{
border-right: 1px solid #D5D5D5;
}
&.increase{
left: 94px;
border-left: 1px solid #D5D5D5;
}
&.disabled {
cursor: not-allowed;
}
}
}
.inventory {
margin: 0 10px;
}
}
.go-phone {
position: relative;
float: right;
width: 52px;
height: 52px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
border: 1px solid #d8d8d8;
box-sizing: border-box;
margin-right: 10px;
cursor: pointer;
&>img{
}
&>span{
margin-top: 4px;
line-height: 1;
font-size: 12px;
color: #999;
}
&:hover .qrcode-wrap {
display: block;
}
.qrcode-wrap {
border: 1px solid #e5e5e5;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.12);
height: 120px;
overflow: hidden;
padding: 10px;
position: absolute;
width: 120px;
left: 30px;
top: -50px;
display: none;
background:white;
}
&.icon-item{
.iconfont{
font-size: 22px;
font-weight: bold;
color: #5E5C5C;
&.selected{
color: #ff9000;
}
}
}
}
}
.shop-wrap {
float: right;
border: 1px solid #e9e9e9;
padding: 0 20px;
width: 234px;
box-sizing: border-box;
.head-wrap {
text-align: center;
padding: 16px 0;
border-bottom: 1px solid #f1f1f1;
.img-wrap {
width: 64px;
height: 64px;
line-height: 64px;
display: inline-block;
img {
max-width: 100%;
max-height: 100%;
}
}
.site-name {
font-size: 14px;
color: #383838;
}
.tag {
margin-left: 10px;
font-size: 14px;
}
}
.info-wrap {
padding: 10px 0;
border-bottom: 1px solid #f1f1f1;
dl {
font-size: $ns-font-size-sm;
dt {
color: #838383;
// width: 65px;
line-height: 25px;
font-weight: normal;
float: left;
}
dt.site-score {
// width: 58px;
padding-right: 5px;
}
dd {
height: 25px;
line-height: 25px;
// margin-left: 50px;
color: #838383;
span {
color: #383838;
font-weight: 600;
}
}
}
}
.operation {
padding: 12px 0;
.el-button {
padding: 10px 16px;
}
}
}
.detail-wrap {
padding: 64px 0 35px;
clear: both;
.goods-recommended {
float: left;
width: 234px;
}
.goods-tab {
.attr-list {
font-size: 14px;
display: flex;
flex-wrap: wrap;
li {
margin-bottom: 5px;
padding: 0 10px;
flex: 0 0 30%;
width: 33%;
}
}
.el-tabs__header{
margin-bottom: 30px;
}
.tablist{
border-radius: 0;
}
.el-tabs__item{
position: relative;
width: 168px;
height: 52px;
line-height: 52px;
text-align: center;
font-size: 18px;
&.is-active{
color: $base-color;
&:after{
content: "";
position: absolute;
top: -1px;
left: 0;
right: 0;
height: 2px;
background-color: $base-color;
}
}
&:hover{
color: $base-color;
}
}
.evaluate {
.empty {
color: #898989;
text-align: center;
font-size: 14px;
}
nav {
padding: 10px;
overflow: hidden;
background: #f7f7f7;
li {
float: left;
padding: 0 20px;
cursor: pointer;
&:first-child {
padding-left: 0;
}
&:hover,
&.selected {
color: $base-color;
}
}
}
.list {
margin-top: 10px;
font-size: 14px;
li {
padding: 15px;
border-bottom: 1px solid #e5e5e5;
.member-info {
float: left;
width: 140px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
img {
width: 25px;
height: 25px;
border-radius: 50%;
margin-right: 5px;
}
}
.info-wrap {
margin-left: 150px;
margin-bottom: 10px;
.content {
padding: 10px 0;
}
.img-list {
.el-image {
width: 50px;
margin-left: 10px;
&:first-child {
margin-left: 0;
}
}
}
.sku-info {
color: #898989;
font-size: 12px;
span {
margin-right: 5px;
&.create-time {
margin-left: 10px;
}
}
}
.evaluation-reply {
margin: 10px 0;
color: $base-color;
}
.review-evaluation {
.review-time {
font-size: $ns-font-size-sm;
margin-left: 20px;
color: #898989;
}
}
}
}
}
.page-wrap {
margin-top: 10px;
text-align: right;
}
}
}
}
}

View File

@@ -0,0 +1,327 @@
.ns-seckill {
.ns-seckill-time-box {
&>span {
cursor: pointer;
bottom: 0;
line-height: 64px;
position: absolute;
color: #fff;
z-index: 1;
background-color: rgba(0, 0, 0, .3);
width: 35px;
font-size: 24px;
text-align: center;
}
.left-btn {
left: 0;
}
.right-btn {
right: 0;
}
.ns-seckill-time-list {
width: 100%;
height: 64px;
position: relative;
}
ul {
width: 500%;
position: absolute;
top: 0;
left: 16px;
display: flex;
li {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 302.5px;
height: 64px;
overflow: hidden;
cursor: pointer;
text-align: center;
background: linear-gradient(135deg, #EDEDED 0%, #FFFFFF 100%);
opacity: 0.87;
color: #424242;
&::after{
content: "";
position: absolute;
left: 0;
top: 0;
bottom: 12px;
border-left: 30px solid rgba(255,255,255,0.87);
border-bottom: 60px solid rgba(255,255,255,0.87);
border-right: 30px solid transparent;
border-top: 60px solid transparent;
}
&:first-of-type::after{
border: 0;
}
div:first-child {
font-size: 16px;
}
div:nth-child(2) {
line-height: 14px;
font-size: 12px;
}
&.selected-tab {
background: linear-gradient(135deg, #F42424 0%, #FA6400 100%);
opacity: 0.88;
color: #FFF;
}
&.selected-tab + li{
background-color: red;
}
&.selected-tab+li::after{
border-left-color: rgba(250,75,0,0.88);
border-bottom-color: rgba(250,75,0,0.88);
}
&.selected-tab::after{
border-left-color: rgba(255,255,255,1);
border-bottom-color: rgba(255,255,255,1);
}
}
}
}
.ns-seckill-head {
position: relative;
width: $width;
margin: auto;
.el-carousel{
.el-image{
height: 100%;
}
}
}
.ns-seckill-box {
padding-top: 54px;
width: $width;
margin: 0 auto 50px;
.ns-seckill-title {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #e8e8e8;
.seckill-title-left {
display: flex;
align-items: center;
.name {
font-size: 30px;
font-weight: bold;
border-bottom: 4px solid #f42424;
color: #333;
}
.desc {
margin-left: 15px;
font-size: 16px;
color: #424242;
}
}
.ns-seckill-right {
&>span {
font-size: 20px;
color: #424242;
}
.count-down {
display: inline-block;
margin-left: 6px;
&>p {
display: flex;
align-items: center;
i {
margin-left: 3px;
margin-right: -6px;
}
}
}
}
}
}
}
.ns-seckill-time-box {
position: absolute;
bottom: 0;
left: 0;
right: 0;
width: $width;
height: 64px;
margin: 0 auto;
overflow: hidden;
z-index: 5;
.seckill-time {
width: $width;
margin: 0 auto;
.el-tabs__nav-wrap .el-tabs__item .seckill-time-li.selected-tab div p {
color: #ffffff;
border: none;
}
.seckill-time-li {
text-align: center;
padding: 0;
height: 56px;
line-height: unset;
padding-top: 6px;
box-sizing: border-box;
color: #afafaf;
div {
&:first-child {
font-size: 18px;
line-height: 22px;
}
&:last-child {
height: 14px;
line-height: 14px;
margin-top: 6px;
p {
height: 14px;
line-height: 14px;
}
}
}
}
.selected-tab {
background: $base-color;
color: #ffffff;
}
}
}
.goods-list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
margin-top: 35px;
.goods {
width: 228px;
margin-bottom: 18px;
margin-right: 17px;
overflow: hidden;
color: #303133;
transition: 0.3s;
padding: 18px;
background-color: #fff;
box-sizing: border-box;
cursor: pointer;
&:nth-child(5n+5) {
margin-right: 0;
}
}
.img {
width: 192px;
height: 192px;
}
.price {
display: flex;
align-items: baseline;
flex-wrap: wrap;
.curr-price {
display: flex;
align-items: flex-end;
height: 24px;
color: $base-color;
font-weight: bold;
span:first-child {
font-size: 14px;
line-height: 24px;
}
span:nth-child(2) {
font-size: 12px;
}
}
.main_price {
color: $base-color;
font-size: 16px;
line-height: 24px;
}
.primary_price {
text-decoration: line-through;
color: $base-color-info;
margin-left: 5px;
font-size: 12px;
}
}
.name {
margin-top: 10px;
font-size: 14px;
white-space: normal;
overflow: hidden;
p {
line-height: 24px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
height: 50px;
}
}
.el-button {
width: 100%;
height: 42px;
line-height: 42px;
background: $base-color;
color: #ffffff;
margin-top: 5px;
border: none;
border-radius: 0;
padding: 0;
font-size: 16px;
}
}
.empty-wrap {
padding: 50px 0 60px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-sizing: border-box;
img{
width: 400px;
height: 244px;
}
span{
font-size: 14px;
color: #4A4A4A;
}
}

View File

@@ -0,0 +1,407 @@
.payment-wrap {
width: 1210px;
margin: 20px auto;
}
.clear {
clear: both;
}
.item-block {
padding: 0 15px 1px;
margin: 10px 0;
border-radius: 0;
border: none;
background: #ffffff;
.block-text {
border-color: #eeeeee;
color: $ns-text-color-black;
padding: 7px 0;
border-bottom: 1px;
}
.box {
.liuyan-text {
background-color: #F7F7F7;
border: 2px solid #DADADA;
height: 56px;
width: 80%;
padding: 10px;
box-sizing: border-box;
border-radius: 4px;
}
}
}
.padd-bom-10 {
padding-bottom: 10px;
}
.padd-bom-20 {
padding-bottom: 20px;
}
//收货地址
.address-desc {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.address-item {
width: 23%;
border: 3px solid #eee;
box-sizing: border-box;
margin: 1%;
height: 150px;
cursor: pointer;
float: left;
.add-address {
padding: 10px;
text-align: center;
line-height: 120px;
}
.address-info {
padding: 10px;
height: 100%;
box-sizing: border-box;
position: relative;
.options {
position: absolute;
right: 0;
top: 10px;
width: 50%;
text-align: right;
div {
display: inline-block;
margin-right: 10px;
color: #999999;
}
}
.address-name {
color: $base-color;
padding: 0px 0 6px;
border-bottom: 1px solid #eee;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding-right: 71px;
box-sizing: border-box;
line-height: 25px;
}
.address-mobile {
padding: 10px 0 4px;
}
}
}
.address-item.active {
background-color: #fffbf9;
border-color: $base-color;
}
//支付方式
.pay-type-list {
padding: 20px 0;
}
.distribution {
color: #ff547b;
margin-left: 10px;
}
.pay-type-item {
background-color: white;
display: inline-block;
border: 2px solid #eeeeee;
padding: 5px 20px;
margin-right: 20px;
cursor: pointer;
}
.pay-type-item.active {
border-color: $base-color;
}
.mobile-wrap {
width: 300px;
}
.pay-password {
width: 80%;
}
//商品列表
.goods-list {
padding: 15px 0;
.store-icon {
margin-right: 5px;
font-size: 16px;
}
.shop-icon {
font-size: 18px;
}
table {
width: 100%;
}
.goods-info-left {
width: 60px;
height: 60px;
float: left;
.goods-img {
width: 60px;
height: 60px;
}
}
.goods-info-right {
float: left;
height: 60px;
margin-left: 10px;
color: $base-color;
width: 80%;
.goods-name {
line-height: 20px;
padding-top: 10px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.goods-spec {
color: #999;
}
}
.goods-footer {
background-color: #f3fbfe;
padding: 10px;
margin-top: 10px;
.goods-footer-right {
width: 50%;
float: left;
}
.goods-footer-left {
width: 50%;
float: left;
}
.order-cell {
cursor: pointer;
.tit {
padding: 5px 0 0 0;
}
}
.express-item {
margin-top: 5px;
display: inline-block;
border: 2px solid #eeeeee;
padding: 3px 10px;
margin-right: 20px;
cursor: pointer;
}
.express-item.active {
border-color: $base-color;
}
}
}
.promotion-show {
color: #999;
}
.align-right {
text-align: right;
}
//统计
.order-statistics {
float: right;
padding: 10px;
// color: #999;
}
.order-submit {
float: right;
padding: 10px;
}
.order-money {
display: inline-block;
margin-right: 20px;
div {
display: inline-block;
font-size: $ns-font-size-lg;
}
}
.buyer-message.el-textarea {
width: 400px;
margin-top: 10px;
}
.address-open {
cursor: pointer;
font-size: 13px;
padding: 0 0 10px 10px;
}
.pay-password-item {
margin-bottom: 10px;
}
.pay-password {
width: 80%;
}
.pay-password.hide-password {
position: fixed;
top: -9999px;
}
.platform-coupon {
cursor: pointer;
}
.forget-password {
text-align: right;
margin-right: 45px;
cursor: pointer;
}
.disabled-selected-wrap {
pointer-events: none;
cursor: pointer;
}
.cursor-pointer {
cursor: pointer;
}
//发票样式
.invoice-information {
.invoice-type-box {
display: inline-block;
padding: 10px 0px;
vertical-align: bottom;
height: 30px;
line-height: 30px;
&.invoice-title-box {
margin-right: 100px;
}
.invoice-name {
margin-right: 25px;
}
.invoice-to-type {
display: inline-block;
margin-right: 30px;
position: relative;
// i{
// width: 17px;
// height: 17px;
// display: inline-block;
// position: absolute;
// border-radius: 34px;
// overflow: hidden;
// top: 7px;
// left:-1px;
// background: #fff;
// background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
// background-size: 100% 100%;
// }
i {
width: 14px;
height: 14px;
display: inline-block;
border-radius: 34px;
overflow: hidden;
background: #fff;
vertical-align: text-bottom;
border: 1px solid #999;
&.active {
width: 17px;
height: 17px;
overflow: hidden;
background: #fff;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
background-size: 100% 100%;
border: 0px solid #fff;
}
}
input {
vertical-align: middle;
margin: 0px;
width: 15px;
height: 15px;
}
}
.invoice-box-form {
display: inline-block;
input {
height: 28px;
line-height: 28px;
margin-right: 20px;
border: 1px solid #dddddd;
padding-left: 10px;
border-radius: 3px;
outline: none;
}
}
}
.invoice-condition {
padding: 10px 0px;
.invoice-name {
margin-right: 25px;
}
.invoice-box-form {
display: inline-block;
.option-item {
margin-right: 20px;
cursor: pointer;
&.active {
color: #ff547b;
}
}
}
}
.invoice-tops {
margin-bottom: 20px;
}
}

View File

@@ -0,0 +1,348 @@
.payment-wrap {
width: 1210px;
margin: 20px auto;
}
.clear {
clear: both;
}
.item-block {
padding: 0 15px 1px;
margin: 10px 0;
border-radius: 0;
border: none;
background: #ffffff;
.block-text {
border-color: #eeeeee;
color: $ns-text-color-black;
padding: 7px 0;
border-bottom: 1px;
}
.box{
.liuyan-text{
background-color: #F7F7F7;
border: 2px solid #DADADA;
height: 56px;
width: 80%;
padding: 10px;
box-sizing: border-box;
border-radius: 4px;
}
}
}
.padd-bom-10{
padding-bottom: 10px;
}
.padd-bom-20{
padding-bottom: 20px;
}
//收货地址
.address-desc {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.address-item {
width: 23%;
border: 3px solid #eee;
box-sizing: border-box;
margin: 1%;
height: 150px;
cursor: pointer;
float: left;
.add-address {
padding: 10px;
text-align: center;
line-height: 120px;
}
.address-info {
padding: 10px;
height: 100%;
box-sizing: border-box;
position: relative;
.options {
position: absolute;
right: 0;
top: 10px;
width: 50%;
text-align: right;
div {
display: inline-block;
margin-right: 10px;
color: #999999;
}
}
.address-name {
color: $base-color;
padding: 0px 0 6px;
border-bottom: 1px solid #eee;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding-right: 71px;
box-sizing: border-box;
line-height: 25px;
}
.address-mobile {
padding: 10px 0 4px;
}
}
}
.address-item.active {
background-color: #fffbf9;
border-color: $base-color;
}
//支付方式
.pay-type-list {
padding: 20px 0;
}
.distribution{
color: #ff547b;
margin-left: 10px;
}
.pay-type-item {
background-color: white;
display: inline-block;
border: 2px solid #eeeeee;
padding: 5px 20px;
margin-right: 20px;
cursor: pointer;
}
.pay-type-item.active {
border-color: $base-color;
}
.mobile-wrap {
width: 300px;
}
//商品列表
.goods-list {
padding: 15px 0;
.store-icon {
margin-right: 5px;
font-size: 16px;
}
.shop-icon {
font-size: 18px;
}
table {
width: 100%;
}
.goods-info-left {
width: 60px;
height: 60px;
float: left;
.goods-img {
width: 60px;
height: 60px;
}
}
.goods-info-right {
float: left;
height: 60px;
margin-left: 10px;
color: $base-color;
width: 80%;
.goods-name {
line-height: 20px;
padding-top: 10px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.goods-spec {
color: #999;
}
}
.goods-footer {
background-color: #f3fbfe;
padding: 10px;
margin-top: 10px;
.goods-footer-right {
width: 50%;
float: left;
}
.goods-footer-left {
width: 50%;
float: left;
}
.order-cell {
cursor: pointer;
.tit {
padding: 5px 0 0 0;
}
}
.express-item {
margin-top: 5px;
display: inline-block;
border: 2px solid #eeeeee;
padding: 3px 10px;
margin-right: 20px;
cursor: pointer;
}
.express-item.active {
border-color: $base-color;
}
}
}
.promotion-show {
color: #999;
}
.align-right {
text-align: right;
}
//统计
.order-statistics {
float: right;
padding: 10px;
// color: #999;
}
.order-submit {
float: right;
padding: 10px;
}
.order-money {
display: inline-block;
margin-right: 20px;
div {
display: inline-block;
font-size: $ns-font-size-lg;
}
}
.buyer-message.el-textarea {
width: 400px;
}
.address-open {
cursor: pointer;
font-size: 13px;
padding: 0 0 10px 10px;
}
.pay-password-item {
margin-bottom: 10px;
}
.pay-password {
width: 80%;
}
.pay-password.hide-password {
position: fixed;
top: -9999px;
}
.platform-coupon {
cursor: pointer;
}
.forget-password {
text-align: right;
margin-right: 45px;
cursor: pointer;
}
.disabled-selected-wrap {
pointer-events: none;
cursor: pointer;
}
.cursor-pointer {
cursor: pointer;
}
//发票样式
.invoice-information {
.invoice-type-box {
display: inline-block;
padding: 10px 0px;
vertical-align: bottom;
height: 30px;
line-height: 30px;
&.invoice-title-box {
margin-right: 100px;
}
.invoice-name {
margin-right: 25px;
}
.invoice-to-type {
display: inline-block;
margin-right: 30px;
position: relative;
// i{
// width: 17px;
// height: 17px;
// display: inline-block;
// position: absolute;
// border-radius: 34px;
// overflow: hidden;
// top: 7px;
// left:-1px;
// background: #fff;
// background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
// background-size: 100% 100%;
// }
i {
width: 14px;
height: 14px;
display: inline-block;
border-radius: 34px;
overflow: hidden;
background: #fff;
vertical-align: text-bottom;
border: 1px solid #999;
&.active {
width: 17px;
height: 17px;
overflow: hidden;
background: #fff;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
background-size: 100% 100%;
border: 0px solid #fff;
}
}
input {
vertical-align: middle;
margin: 0px;
width: 15px;
height: 15px;
}
}
.invoice-box-form {
display: inline-block;
input {
height: 28px;
line-height: 28px;
margin-right: 20px;
border: 1px solid #dddddd;
padding-left: 10px;
border-radius: 3px;
outline: none;
}
}
}
.invoice-condition {
padding: 10px 0px;
.invoice-name {
margin-right: 25px;
}
.invoice-box-form {
display: inline-block;
.option-item {
margin-right: 20px;
cursor: pointer;
&.active {
color: #ff547b;
}
}
}
}
.invoice-tops{
margin-bottom: 20px;
}
}

View File

@@ -0,0 +1,347 @@
.payment-wrap {
width: 1210px;
margin: 20px auto;
}
.clear {
clear: both;
}
.item-block {
padding: 0 15px 1px;
margin: 10px 0;
border-radius: 0;
border: none;
background: #ffffff;
.block-text {
border-color: #eeeeee;
color: $ns-text-color-black;
padding: 7px 0;
border-bottom: 1px;
}
.box{
.liuyan-text{
background-color: #F7F7F7;
border: 2px solid #DADADA;
height: 56px;
width: 80%;
padding: 10px;
box-sizing: border-box;
border-radius: 4px;
}
}
}
.padd-bom-10{
padding-bottom: 10px;
}
.padd-bom-20{
padding-bottom: 20px;
}
//收货地址
.address-desc {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.address-item {
width: 23%;
border: 3px solid #eee;
box-sizing: border-box;
margin: 1%;
height: 150px;
cursor: pointer;
float: left;
.add-address {
padding: 10px;
text-align: center;
line-height: 120px;
}
.address-info {
padding: 10px;
height: 100%;
box-sizing: border-box;
position: relative;
.options {
position: absolute;
right: 0;
top: 10px;
width: 50%;
text-align: right;
div {
display: inline-block;
margin-right: 10px;
color: #999999;
}
}
.address-name {
color: $base-color;
padding: 0px 0 6px;
border-bottom: 1px solid #eee;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding-right: 71px;
box-sizing: border-box;
line-height: 25px;
}
.address-mobile {
padding: 10px 0 4px;
}
}
}
.address-item.active {
background-color: #fffbf9;
border-color: $base-color;
}
//支付方式
.pay-type-list {
padding: 20px 0;
}
.distribution{
color: #ff547b;
margin-left: 10px;
}
.pay-type-item {
background-color: white;
display: inline-block;
border: 2px solid #eeeeee;
padding: 5px 20px;
margin-right: 20px;
cursor: pointer;
}
.pay-type-item.active {
border-color: $base-color;
}
.mobile-wrap {
width: 300px;
}
//商品列表
.goods-list {
padding: 15px 0;
.store-icon {
margin-right: 5px;
font-size: 16px;
}
.shop-icon {
font-size: 18px;
}
table {
width: 100%;
}
.goods-info-left {
width: 60px;
height: 60px;
float: left;
.goods-img {
width: 60px;
height: 60px;
}
}
.goods-info-right {
float: left;
height: 60px;
margin-left: 10px;
color: $base-color;
width: 80%;
.goods-name {
line-height: 20px;
padding-top: 10px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.goods-spec {
color: #999;
}
}
.goods-footer {
background-color: #f3fbfe;
padding: 10px;
margin-top: 10px;
.goods-footer-right {
width: 50%;
float: left;
}
.goods-footer-left {
width: 50%;
float: left;
}
.order-cell {
cursor: pointer;
.tit {
padding: 5px 0 0 0;
}
}
.express-item {
margin-top: 5px;
display: inline-block;
border: 2px solid #eeeeee;
padding: 3px 10px;
margin-right: 20px;
cursor: pointer;
}
.express-item.active {
border-color: $base-color;
}
}
}
.promotion-show {
color: #999;
}
.align-right {
text-align: right;
}
//统计
.order-statistics {
float: right;
padding: 10px;
// color: #999;
}
.order-submit {
float: right;
padding: 10px;
}
.order-money {
display: inline-block;
margin-right: 20px;
div {
display: inline-block;
font-size: $ns-font-size-lg;
}
}
.buyer-message.el-textarea {
width: 400px;
}
.address-open {
cursor: pointer;
font-size: 13px;
padding: 0 0 10px 10px;
}
.pay-password-item {
margin-bottom: 10px;
}
.pay-password {
width: 80%;
}
.pay-password.hide-password {
position: fixed;
top: -9999px;
}
.platform-coupon {
cursor: pointer;
}
.forget-password {
text-align: right;
margin-right: 45px;
cursor: pointer;
}
.disabled-selected-wrap {
pointer-events: none;
cursor: pointer;
}
.cursor-pointer {
cursor: pointer;
}
//发票样式
.invoice-information {
.invoice-type-box {
display: inline-block;
padding: 10px 0px;
vertical-align: bottom;
height: 30px;
line-height: 30px;
&.invoice-title-box {
margin-right: 100px;
}
.invoice-name {
margin-right: 25px;
}
.invoice-to-type {
display: inline-block;
margin-right: 30px;
position: relative;
// i{
// width: 17px;
// height: 17px;
// display: inline-block;
// position: absolute;
// border-radius: 34px;
// overflow: hidden;
// top: 7px;
// left:-1px;
// background: #fff;
// background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
// background-size: 100% 100%;
// }
i {
width: 14px;
height: 14px;
display: inline-block;
border-radius: 34px;
overflow: hidden;
background: #fff;
vertical-align: text-bottom;
border: 1px solid #999;
&.active {
width: 17px;
height: 17px;
overflow: hidden;
background: #fff;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbUlEQVQ4jYXTsUvVURQH8I8PE1zKTdcEK7I/wNkkKpGgxNaGBqUQ3JT2xoQoaajmhhTEgoig1V0QdQiaCgTxJRK4PDlybtwe+vzCDw7n+/3ee+75ndPVmpzXhut4jDu4nNQPfMFbbNbyRhX34BW+YxdTuJTfw8wF9wa9xdRdmT/jD66g2VbVRn5LeI813MVRqWARB5g8xVyjmZq46EV5wjAe4BFaKR7CchqaGQ8l10pteIa7s2FLeWrgKtbRV918H6MYwXZqX4Y3KriN1Ur8vM1c0JdcwafwxgGD2KqIsQ49uFXFUclgo4P4PPSUvxBDcq0Sf+tg/FrFUfnPRk7YvYp4hv1TzPvJFYzHZXHAO8zgYhJb2e2VnI2DjEeqXoV2Nka77MJrDOSQlFk4C134iN94Upo4l6cGEbN/FoIrmvD8W6ajfNMv7GABN3Ahux1x5IKLpZpIz3/bGImnOXH9edMh9vAhczcxjb8nDhwDyjpTCJDO1nsAAAAASUVORK5CYII=);
background-size: 100% 100%;
border: 0px solid #fff;
}
}
input {
vertical-align: middle;
margin: 0px;
width: 15px;
height: 15px;
}
}
.invoice-box-form {
display: inline-block;
input {
height: 28px;
line-height: 28px;
margin-right: 20px;
border: 1px solid #dddddd;
padding-left: 10px;
border-radius: 3px;
outline: none;
}
}
}
.invoice-condition {
padding: 10px 0px;
.invoice-name {
margin-right: 25px;
}
.invoice-box-form {
display: inline-block;
.option-item {
margin-right: 20px;
cursor: pointer;
&.active {
color: #ff547b;
}
}
}
}
.invoice-tops{
margin-bottom: 20px;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 810 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -0,0 +1,303 @@
import {
rePass,
nextStep,
smsCode,
registerConfig
} from "@/api/auth/login"
import {
captcha
} from "@/api/website"
export default {
data() {
var isMobile = (rule, value, callback) => {
if (!value) {
return callback(new Error("手机号不能为空"))
} else {
if (/^\d{11}$/.test(value)) {
callback()
} else {
callback(new Error("请输入正确的手机号"))
}
}
}
let self = this
var setPass = function (rule, value, callback) {
let regConfig = self.registerConfig
if (!value) {
return callback(new Error("请输入新的登录密码"))
} else {
if (regConfig.pwd_len > 0) {
if (value.length < regConfig.pwd_len) {
return callback(new Error("密码长度不能小于" + regConfig.pwd_len + "位"))
} else {
callback()
}
} else {
if (regConfig.pwd_complexity != "") {
let passwordErrorMsg = "密码需包含",
reg = ""
if (regConfig.pwd_complexity.indexOf("number") != -1) {
reg += "(?=.*?[0-9])"
passwordErrorMsg += "数字"
} else if (regConfig.pwd_complexity.indexOf("letter") != -1) {
reg += "(?=.*?[a-z])"
passwordErrorMsg += "、小写字母"
} else if (regConfig.pwd_complexity.indexOf("upper_case") != -1) {
reg += "(?=.*?[A-Z])"
passwordErrorMsg += "、大写字母"
} else if (regConfig.pwd_complexity.indexOf("symbol") != -1) {
reg += "(?=.*?[#?!@$%^&*-])"
passwordErrorMsg += "、特殊字符"
} else {
reg += ""
passwordErrorMsg += ""
}
if (reg.test(value)) {
return callback(new Error(passwordErrorMsg))
} else {
callback()
}
}
}
}
}
var checkPass = function (rule, value, callback) {
if (!value) {
return callback(new Error("请输入确认密码"))
} else {
if (value !== self.formData.pass) {
callback(new Error("两次密码输入不一致"))
} else {
callback()
}
}
}
return {
formData: {
mobile: "",
vercode: "",
dynacode: "",
pass: "",
repass: "",
key: ""
},
step: 1,
activeName: "first",
isShowPhone: "",
captcha: {
id: "",
img: ""
},
// 验证码
dynacodeData: {
seconds: 120,
timer: null,
codeText: "获取动态码",
isSend: false
},
// 动态码
registerConfig: {},
rules: {
mobile: [{
required: true,
validator: isMobile,
trigger: "blur"
}],
vercode: [{
required: true,
message: "请输入验证码",
trigger: "blur"
}],
dynacode: [{
required: true,
message: "请输入短信动态码",
trigger: "blur"
}],
pass: [{
required: true,
validator: setPass,
trigger: "blur"
}],
repass: [{
required: true,
validator: checkPass,
trigger: "blur"
}]
}
}
},
created() {
this.getCaptcha()
this.getRegisterConfig()
},
head() {
return {
title: '找回密码-' + this.$store.state.site.siteInfo.site_name
}
},
watch: {
"dynacodeData.seconds": {
handler(newValue, oldValue) {
if (newValue == 0) {
clearInterval(this.dynacodeData.timer)
this.dynacodeData = {
seconds: 120,
timer: null,
codeText: "获取动态码",
isSend: false
}
}
},
immediate: true,
deep: true
}
},
methods: {
/**
* 下一步
*/
nextStep(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
nextStep({
mobile: this.formData.mobile
}).then(res => {
if (res.code == -1) {
this.step = 2
} else {
this.$message({
message: res.message,
type: "warning"
})
}
}).catch(err => {
if (err.code == 0) {
this.$message({
message: "该手机号未注册",
type: "warning"
})
} else {
this.$message.error(err.message)
}
})
} else {
return false
}
})
},
/**
* 获取动态验证码 下一步
*/
nextStepToSetPass(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
this.step = 3
} else {
return false
}
})
},
/**
* 重置密码
*/
resetPass(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
rePass({
password: this.formData.pass,
code: this.formData.dynacode,
key: this.formData.key,
mobile: this.formData.mobile
}).then(res => {
if (res.code >= 0) {
this.step = 4
this.$message({
message: res.message,
type: "success"
})
}
}).catch(err => {
this.$message.error(err.message)
})
} else {
return false
}
})
},
/**
* 获取验证码
*/
getCaptcha() {
captcha({
captcha_id: this.captcha.id
}).then(res => {
if (res.code >= 0) {
this.captcha.id = res.data.id
this.captcha.img = res.data.img
this.captcha.img = this.captcha.img.replace(/\r\n/g, "")
}
}).catch(err => {
this.$message.error(err.message)
})
},
/**
* 发送手机动态码
*/
sendMobileCode(formName) {
if (this.dynacodeData.seconds != 120) return
this.$refs[formName].clearValidate("dynacode")
this.$refs[formName].validateField("vercode", valid => {
if (!valid) {
if (this.isSend) return
this.isSend = true
smsCode({
captcha_id: this.captcha.id,
captcha_code: this.formData.vercode,
mobile: this.formData.mobile
}).then(res => {
if (res.code >= 0) {
this.formData.key = res.data.key
if (this.dynacodeData.seconds == 120 && this.dynacodeData.timer == null) {
this.dynacodeData.timer = setInterval(() => {
this.dynacodeData.seconds--
this.dynacodeData.codeText = this.dynacodeData.seconds + "s后可重新获取"
}, 1000)
} else {
this.$message({
message: res.message,
type: "warning"
})
this.isSend = false
this.getCaptcha()
}
}
}).catch(err => {
this.isSend = false
this.getCaptcha()
this.$message.error(err.message)
})
} else {
return false
}
})
},
/**
* 获取注册配置
*/
getRegisterConfig() {
registerConfig().then(res => {
if (res.code >= 0) {
this.registerConfig = res.data.value
}
})
}
}
}

View File

@@ -0,0 +1,537 @@
import {
mobileCode,
registerConfig,
wechatMobileCode,
} from "@/api/auth/login"
import {
adList,
captcha
} from "@/api/website"
import {
isWechatLogin
} from "@/api/wechat"
export default {
data: () => {
var isMobile = (rule, value, callback) => {
if (!value) {
return callback(new Error("手机号不能为空"))
} else {
if (/^\d{11}$/.test(value)) {
callback()
} else {
callback(new Error("请输入正确的手机号"))
}
}
}
return {
qrcodeData: {
time: 0,
timer: 0,
},
wx_key: '',
expire_time: '',
ischecked: false,
ischecked1: false,
activeName: "first", // tab切换
// 表单数据
formData: {
account: "",
password: "",
vercode: "",
mobile: "",
dynacode: "",
key: "",
checked: false,
autoLoginRange: 7
},
// 验证码
captcha: {
id: "",
img: ""
},
// 动态码
dynacodeData: {
seconds: 120,
timer: null,
codeText: "获取动态码",
isSend: false
},
// 提交防重复
isSub: false,
registerConfig: {
is_enable: 1,
register: '',
login: ''
},
accountRules: {
account: [{
required: true,
message: "请输入登录账号",
trigger: "blur"
}],
password: [{
required: true,
message: "请输入登录密码",
trigger: "blur"
}],
vercode: [{
required: true,
message: "请输入验证码",
trigger: "blur"
}]
},
mobileRules: {
mobile: [{
required: true,
validator: isMobile,
trigger: "blur"
}],
vercode: [{
required: true,
message: "请输入验证码",
trigger: "blur"
}],
dynacode: [{
required: true,
message: "请输入短信动态码",
trigger: "blur"
}]
},
wechatRules: {
mobile: [{
required: true,
validator: isMobile,
trigger: "blur"
}],
vercode: [{
required: true,
message: "请输入验证码",
trigger: "blur"
}],
dynacode: [{
required: true,
message: "请输入短信动态码",
trigger: "blur"
}]
},
codeRules: {
mobile: [{
required: true,
validator: isMobile,
trigger: "blur"
}],
vercode: [{
required: true,
message: "请输入验证码",
trigger: "blur"
}]
},
loadingAd: true,
adList: [],
backgroundColor: '',
img: '',
third_party: 0,
wechatConfigStatus: 0,
}
},
created() {
this.ischecked = this.$route.params.third_party;
if (this.ischecked) {
this.weixinLogin()
}
this.getAdList()
this.getCaptcha()
this.getRegisterConfig()
this.getIsWechatLogin()
},
head() {
return {
title: '登录-' + this.$store.state.site.siteInfo.site_name
}
},
watch: {
"dynacodeData.seconds": {
handler(newValue, oldValue) {
if (newValue == 0) {
clearInterval(this.dynacodeData.timer)
this.dynacodeData = {
seconds: 120,
timer: null,
codeText: "获取动态码",
isSend: false
}
}
},
immediate: true,
deep: true
}
},
methods: {
getIsWechatLogin() {
isWechatLogin().then(res => {
if (res.code == 0) {
this.wechatConfigStatus = res.data.wechat_config_status;
}
})
},
getAdList() {
adList({
keyword: "NS_PC_LOGIN"
}).then(res => {
if (res.code == 0 && res.data.adv_list) {
this.adList = res.data.adv_list
for (let i = 0; i < this.adList.length; i++) {
if (this.adList[i].adv_url) this.adList[i].adv_url = JSON.parse(this.adList[i].adv_url)
}
this.backgroundColor = this.adList[0].background
}
this.loadingAd = false
}).catch(err => {
this.loadingAd = false
})
},
handleClick(tab, event) {
},
handleChange(curr, pre) {
this.backgroundColor = this.adList[curr].background
},
/**
* 账号登录
*/
accountLogin(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
var data = {
username: this.formData.account,
password: this.formData.password
}
if (this.captcha.id != "") {
data.captcha_id = this.captcha.id
data.captcha_code = this.formData.vercode
}
if (this.formData.checked) {
data.autoLoginRange = this.formData.autoLoginRange
}
if (this.isSub) return
this.isSub = true
this.$store
.dispatch("member/login", data)
.then(res => {
if (res.code >= 0) {
this.$message({
message: "登录成功!",
type: "success"
})
if (this.$route.query.redirect) {
const a = this.$route.query.redirect
const b = this.$route.query
this.$router.push(this.$route.query.redirect)
} else {
this.$router.push({
name: "member"
})
}
} else {
this.isSub = false
this.getCaptcha()
this.$message({
message: res.message,
type: "warning"
})
}
})
.catch(err => {
this.isSub = false
this.$message.error(err.message)
this.getCaptcha()
})
} else {
return false
}
})
},
/**
* 手机号登录
*/
mobileLogin(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
var data = {
mobile: this.formData.mobile,
key: this.formData.key,
code: this.formData.dynacode
}
if (this.captcha.id != "") {
data.captcha_id = this.captcha.id
data.captcha_code = this.formData.vercode
}
if (this.isSub) return
this.isSub = true
this.$store.dispatch("member/mobile_login", data).then(res => {
if (res.code >= 0) {
this.$message({
message: "登录成功!",
type: "success"
})
if (this.$route.query.redirect) {
this.$router.push(this.$route.query.redirect)
} else {
this.$router.push({
name: "member"
})
}
} else {
this.isSub = false
this.getCaptcha()
this.$message({
message: res.message,
type: "warning"
})
}
}).catch(err => {
this.isSub = false
this.$message.error(err.message)
this.getCaptcha()
})
} else {
return false
}
})
},
/**
* 微信登录
*/
wechatLogin(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
var data = {
mobile: this.formData.mobile,
key: this.formData.key,
code: this.formData.dynacode
}
if (this.captcha.id != "") {
data.captcha_id = this.captcha.id
data.captcha_code = this.formData.vercode
}
if (this.isSub) return
this.isSub = true
this.$store.dispatch("wechat/wechatLogin", data).then(res => {
if (res.code >= 0) {
this.$message({
message: "登录成功!",
type: "success"
})
if (this.$route.query.redirect) {
this.$router.push(this.$route.query.redirect)
} else {
this.$router.push({
name: "member"
})
}
} else {
this.isSub = false
this.getCaptcha()
this.$message({
message: res.message,
type: "warning"
})
}
}).catch(err => {
this.isSub = false
this.$message.error(err.message)
this.getCaptcha()
})
} else {
return false
}
})
},
weixinLogin() {
this.ischecked = true;
this.$store.dispatch("wechat/loginCode").then(res => {
if (res.code >= 0) {
this.img = res.data.qrcode;
this.wx_key = res.data.key;
this.expire_time = res.data.expire_time;
this.qrcodeData.timer = setInterval(() => {
this.checkLogin()
}, 2000);
}
})
},
// 检测是否扫码
checkLogin() {
this.qrcodeData.time += 2;
if (this.qrcodeData.time > this.expire_time) {
clearInterval(this.qrcodeData.timer);
return;
}
var data = {
key: this.wx_key
};
this.$store.dispatch("wechat/checkLogin", data).then(res => {
if (res.code >= 0) {
if (res.data.token != undefined) {
this.$message({
message: "登录成功!",
type: "success"
})
if (this.$route.query.redirect) {
this.$router.push(this.$route.query.redirect)
} else {
this.$router.push({
name: "member"
})
}
} else {
this.ischecked1 = true;
}
clearInterval(this.qrcodeData.timer);
}
})
},
closeWx() {
this.ischecked = false;
},
closeWx1() {
this.ischecked = false;
this.ischecked1 = false;
},
/**
* 获取注册配置
*/
getRegisterConfig() {
registerConfig()
.then(res => {
if (res.code >= 0) {
this.registerConfig = res.data.value
if (this.registerConfig.login.indexOf('username') != -1) {
this.activeName = 'first';
} else {
this.activeName = 'second';
}
}
})
},
/**
* 获取验证码
*/
getCaptcha() {
captcha({
captcha_id: this.captcha.id
}).then(res => {
if (res.code >= 0) {
this.captcha.id = res.data.id
this.captcha.img = res.data.img
this.captcha.img = this.captcha.img.replace(/\r\n/g, "")
}
}).catch(err => {
this.$message.error(err.message)
})
},
/**
* 发送手机动态码
*/
sendMobileCode(formName) {
if (this.dynacodeData.seconds != 120) return
this.$refs[formName].clearValidate("dynacode")
this.$refs[formName].validateField("mobile", valid => {
if (valid) {
return false
}
})
this.$refs[formName].validateField("vercode", valid => {
if (!valid) {
mobileCode({
mobile: this.formData.mobile,
captcha_id: this.captcha.id,
captcha_code: this.formData.vercode
}).then(res => {
if (res.code >= 0) {
this.formData.key = res.data.key
if (this.dynacodeData.seconds == 120 && this.dynacodeData.timer == null) {
this.dynacodeData.timer = setInterval(() => {
this.dynacodeData.seconds--
this.dynacodeData.codeText = this.dynacodeData.seconds + "s后可重新获取"
}, 1000)
}
}
}).catch(err => {
this.$message.error(err.message)
})
} else {
return false
}
})
},
/**
* 发送微信绑定手机动态码
*/
sendWechatMobileCode(formName) {
if (this.dynacodeData.seconds != 120) return
this.$refs[formName].clearValidate("dynacode")
this.$refs[formName].validateField("mobile", valid => {
if (valid) {
return false
}
})
this.$refs[formName].validateField("vercode", valid => {
if (!valid) {
wechatMobileCode({
mobile: this.formData.mobile,
captcha_id: this.captcha.id,
captcha_code: this.formData.vercode
}).then(res => {
if (res.code >= 0) {
this.formData.key = res.data.key
if (this.dynacodeData.seconds == 120 && this.dynacodeData.timer == null) {
this.dynacodeData.timer = setInterval(() => {
this.dynacodeData.seconds--
this.dynacodeData.codeText = this.dynacodeData.seconds + "s后可重新获取"
}, 1000)
}
}
}).catch(err => {
this.$message.error(err.message)
})
} else {
return false
}
})
},
keypress(e) {
let that = this;
var keycode = e.all ? e.keyCode : e.which;
if (keycode == 13) {
if (that.activeName == "first") {
that.accountLogin('ruleForm'); // 登录方法名
} else {
that.mobileLogin('mobileRuleForm'); // 登录方法名
}
return false;
}
}
}
}

View File

@@ -0,0 +1,324 @@
import {
mapGetters
} from "vuex"
import {
cartList
} from "@/api/goods/cart"
export default {
data: () => {
return {
cartList: [], // 购物车
checkAll: false,
totalPrice: "0.00",
totalCount: 0,
invalidGoods: [], // 失效商品集合
loading: true,
modifyNum: 1, // 防止数量跳动
}
},
created() {
this.getCartList()
},
computed: {
...mapGetters(["defaultGoodsImage"])
},
middleware: 'auth',
methods: {
// 获取购物车数据
getCartList() {
cartList({}).then(res => {
if (res.code >= 0 && res.data.length) {
this.handleCartList(res.data)
}
this.loading = false
}).catch(res => {
this.loading = false
})
},
// 处理购物车数据结构
handleCartList(data) {
this.invalidGoods = []
this.cartList = []
var temp = {}
data.forEach((item, index) => {
if (item.goods_state == 1) {
item.checked = true
if (temp["site_" + item.site_id] != undefined) {
temp["site_" + item.site_id].cartList.push(item)
} else {
temp["site_" + item.site_id] = {
siteId: item.site_id,
siteName: item.site_name,
checked: true,
cartList: [item]
}
}
} else {
this.invalidGoods.push(item)
}
})
this.invalidGoods.forEach(v => {
if (v.sku_spec_format) {
v.sku_spec_format = JSON.parse(v.sku_spec_format)
} else {
v.sku_spec_format = []
}
})
Object.keys(temp).forEach(key => {
this.cartList.push(temp[key])
})
this.calculationTotalPrice()
this.cartList.forEach(v => {
v.cartList.forEach(k => {
if (k.sku_spec_format) {
k.sku_spec_format = JSON.parse(k.sku_spec_format)
} else {
k.sku_spec_format = []
}
})
})
},
// 单选
singleElection(siteIndex, index) {
this.calculationTotalPrice()
},
// 店铺全选
siteAllElection(index) {
this.cartList[index].cartList.forEach(item => {
item.checked = this.cartList[index].checked
})
this.calculationTotalPrice()
},
// 全选
allElection() {
if (this.cartList.length) {
this.cartList.forEach(siteItem => {
siteItem.checked = this.checkAll
siteItem.cartList.forEach(item => {
item.checked = this.checkAll
})
})
}
this.calculationTotalPrice()
},
// 计算购物车总价
calculationTotalPrice() {
if (this.cartList.length) {
let totalPrice = 0,
totalCount = 0,
siteAllElectionCount = 0
this.cartList.forEach(siteItem => {
let siteGoodsCount = 0
siteItem.cartList.forEach(item => {
if (item.checked) {
siteGoodsCount += 1
totalCount += 1
totalPrice += item.discount_price * item.num
}
})
if (siteItem.cartList.length == siteGoodsCount) {
siteItem.checked = true
siteAllElectionCount += 1
} else {
siteItem.checked = false
}
})
this.totalPrice = totalPrice.toFixed(2)
this.totalCount = totalCount
this.checkAll = this.cartList.length == siteAllElectionCount
} else {
this.totalPrice = "0.00"
this.totalCount = 0
}
this.modifyNum = 1;
},
// 删除单个
deleteCart(siteIndex, cartIndex) {
this.$confirm("确定要删除该商品吗?", "提示信息", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$store.dispatch("cart/delete_cart", {
cart_id: this.cartList[siteIndex].cartList[cartIndex].cart_id.toString()
}).then(res => {
if (res.code >= 0) {
this.cartList[siteIndex].cartList.splice(cartIndex, 1)
if (this.cartList[siteIndex].cartList.length == 0) this.cartList.splice(siteIndex, 1)
this.calculationTotalPrice()
this.$message({
type: "success",
message: "删除成功"
})
} else {
this.$message({
message: res.message,
type: "warning"
})
}
}).catch(err => {
this.$message.error(err.message)
})
})
},
// 删除选择的购物车
deleteCartSelected() {
var cartIds = []
var selectedItem = []
this.cartList.forEach((siteItem, siteIndex) => {
siteItem.cartList.forEach((item, cartIndex) => {
if (item.checked) {
cartIds.push(item.cart_id)
selectedItem.push({
siteIndex: siteIndex,
cartIndex: cartIndex,
siteId: siteItem.siteId,
cartId: item.cart_id
})
}
})
})
if (cartIds.length == 0) {
this.$message({
message: "请选择要删除的商品",
type: "warning"
})
return
}
this.$confirm("确定要删除选择的商品吗?", "提示信息", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$store.dispatch("cart/delete_cart", {
cart_id: cartIds.toString()
}).then(res => {
if (res.code >= 0) {
selectedItem.forEach(selectedItem => {
this.cartList.forEach((siteItem, siteIndex) => {
siteItem.cartList.forEach((item, cartIndex) => {
if (selectedItem.cartId == item.cart_id) {
siteItem.cartList.splice(cartIndex, 1)
}
if (siteItem.cartList.length == 0) {
this.cartList.splice(siteIndex, 1)
}
})
})
})
this.calculationTotalPrice()
this.$message({
type: "success",
message: "删除成功"
})
} else {
this.$message({
message: res.message,
type: "warning"
})
}
}).catch(err => {
this.$message.error(err.message)
})
})
},
// 清空失效商品
clearInvalidGoods() {
this.$confirm("确认要清空这些商品吗?", "提示信息", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
var cartIds = []
this.invalidGoods.forEach(goodsItem => {
cartIds.push(goodsItem.cart_id)
})
if (cartIds.length) {
this.$store.dispatch("cart/delete_cart", {
cart_id: cartIds.toString()
}).then(res => {
if (res.code >= 0) {
this.invalidGoods = []
this.$message({
type: "success",
message: "删除成功"
})
} else {
this.$message({
message: res.message,
type: "warning"
})
}
}).catch(err => {
this.$message.error(err.message)
})
}
})
},
// 变更购物车数量
cartNumChange(num, params) {
if (num < 1 || !num) num = 1;
// 防止数量跳动
this.modifyNum = 0;
this.$store.dispatch("cart/edit_cart_num", {
num,
cart_id: this.cartList[params.siteIndex].cartList[params.cartIndex].cart_id
}).then(res => {
if (res.code >= 0) {
this.cartList[params.siteIndex].cartList[params.cartIndex].num = num;
this.calculationTotalPrice();
} else {
this.$message({
message: res.message,
type: "warning"
});
this.modifyNum = 1;
}
}).catch(err => {
this.$message.error(err.message);
this.modifyNum = 1;
})
},
// 结算
settlement() {
if (this.totalCount > 0) {
let cart_ids = []
this.cartList.forEach(siteItem => {
siteItem.cartList.forEach(item => {
if (item.checked) {
cart_ids.push(item.cart_id)
}
})
})
if (cart_ids.length > 100) {
this.$message({
message: '购物车最多支持100个商品一起购买',
type: "warning"
});
return;
}
var data = {
cart_ids: cart_ids.toString()
}
this.$store.dispatch("order/setOrderCreateData", data)
this.$router.push({
path: "/order/payment"
})
}
},
imageError(siteIndex, cartIndex) {
this.cartList[siteIndex].cartList[cartIndex].sku_image = this.defaultGoodsImage
},
imageErrorInvalid(index) {
this.invalidGoods[index].sku_image = this.defaultGoodsImage
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,258 @@
import {
goodsSkuPage,
brandPage
} from "@/api/goods/goods"
import {
mapGetters
} from "vuex"
import {
goodsCategoryInfo,
goodsCategoryList
} from "@/api/goods/goodscategory"
export default {
data: () => {
return {
goodsList: [],
total: 0,
keyword: "",
catewords: '',
currentPage: 1,
pageSize: 25,
is_free_shipping: 0,
filters: {
category_id: 0,
category_level: 0,
brand_id: 0,
min_price: "",
max_price: "",
order: "",
sort: "desc",
coupon: 0
},
loading: true,
first_index: 0,
categoryList: [],
selectCategoryId: 0,
// 全部商品分类链接
categoryAll: {
id: 0,
level: 0,
isAllow: true // 是否允许选中
},
brandList: [], // 品牌列表
brandInitialList: [],
currentInitial: "", // 当前选择品牌分区
choosedBrand: "", // 已选择的品牌,
isShowMoreBrand: false // 是否展开更多品牌
}
},
created() {
this.keyword = this.$route.query.keyword || ""
if (this.$route.query.keyword && process.client) window.document.title = `${this.$route.query.keyword} - ${this.siteInfo.site_name}`
this.filters.category_id = this.$route.query.category_id || ""
this.filters.category_level = this.$route.query.level || ""
this.filters.brand_id = this.$route.query.brand_id || ""
this.filters.coupon = this.$route.query.coupon || 0
this.getBrandList();
this.getGoodsList();
if (this.$route.query.category_id && this.$route.query.category_id > 0) {
this.categorySearch();
} else {
// 查询一级商品分类
this.getGoodsCategoryList();
}
},
computed: {
salesArrowDirection() {
let className = this.filters.order === 'sale_num' && this.filters.sort === 'desc' ? 'arrow-down' : 'arrow-up';
return className;
},
priceArrowDirection() {
let className = this.filters.order === 'discount_price' && this.filters.sort === 'desc' ? 'arrow-down' :
'arrow-up';
return className;
},
...mapGetters(["defaultGoodsImage", "siteInfo"])
},
methods: {
// 商品分类搜索
categorySearch() {
goodsCategoryInfo({
category_id: this.filters.category_id
}).then(res => {
if (res.code == 0 && res.data) {
let data = res.data;
this.catewords = data.category_full_name;
this.first_index = data.category_id_1;
this.categoryList = data.child_list;
this.selectCategoryId = this.filters.category_id;
// 设置全部的链接地址
switch (data.level) {
case 1:
this.categoryAll.level = 1;
this.categoryAll.id = data.category_id_1;
this.categoryAll.isAllow = true;
break;
case 2:
this.categoryAll.level = 1;
this.categoryAll.id = data.category_id_1;
this.categoryAll.isAllow = true;
if (this.categoryList[0].level == 3) {
this.categoryAll.level = 2;
this.categoryAll.id = data.category_id_2;
}
break;
case 3:
this.categoryAll.level = 2;
this.categoryAll.id = data.category_id_2;
this.categoryAll.isAllow = false;
break;
}
for (let i = 0; i < this.categoryList.length; i++) {
let item = this.categoryList[i];
if (item.category_id == this.categoryAll.id) {
this.categoryAll.id = 0;
this.categoryAll.isAllow = false; // 匹配到了分类,禁止选中 全部
break;
}
}
if (process.client) window.document.title = `${data.category_name} - ${this.siteInfo.site_name}`
}
})
},
// 一级商品分类列表
getGoodsCategoryList() {
goodsCategoryList({}).then(res => {
if (res.code == 0 && res.data) {
// 设置全部的链接地址
this.categoryAll.level = 1;
this.categoryAll.id = 0;
this.categoryAll.isAllow = true;
this.categoryList = res.data;
}
})
},
getGoodsList() {
const params = {
page: this.currentPage,
page_size: this.pageSize,
keyword: this.keyword,
...this.filters
}
goodsSkuPage(params || {}).then(res => {
const {
count,
page_count,
list
} = res.data
this.total = count
this.goodsList = list
this.loading = false
}).catch(err => {
this.loading = false
})
},
handlePageSizeChange(size) {
this.pageSize = size
this.getGoodsList()
},
handleCurrentPageChange(page) {
this.currentPage = page
this.getGoodsList()
},
handlePriceRange() {
if (Number(this.filters.min_price) > Number(this.filters.max_price)) {
// es6解构赋值
[this.filters.min_price, this.filters.max_price] = [this.filters.max_price, this.filters.min_price]
}
this.getGoodsList()
},
changeSort(type) {
if (this.filters.order === type) {
this.$set(this.filters, "sort", this.filters.sort === "desc" ? "asc" : "desc")
} else {
this.$set(this.filters, "order", type)
this.$set(this.filters, "sort", "desc")
}
this.getGoodsList()
},
getBrandList() {
brandPage({
page: 1,
page_size: 0
}).then(res => {
if (res.code >= 0 && res.data) {
this.brandList = res.data.list;
if (this.filters.brand_id) {
for (var i = 0; i < this.brandList.length; i++) {
if (this.brandList[i].brand_id == this.filters.brand_id) {
this.choosedBrand = this.brandList[i];
}
}
}
}
});
},
handleChangeInitial(initial) {
this.currentInitial = initial
},
onChooseBrand(brand) {
this.choosedBrand = brand
this.filters.brand_id = brand.brand_id
this.getGoodsList()
},
closeBrand() {
this.choosedBrand = ""
this.filters.brand_id = ""
this.getGoodsList()
},
showPrice(data) {
let price = data.discount_price;
if (data.member_price && parseFloat(data.member_price) < parseFloat(price)) price = data.member_price;
return price;
}
},
watch: {
is_free_shipping: function (val) {
this.filters.is_free_shipping = val ? 1 : ""
this.getGoodsList()
},
$route: function (curr) {
this.currentPage = 1
if (curr.query.keyword && process.client) window.document.title = `${curr.query.keyword} - ${this.siteInfo.site_name}`
if (curr.query.level && curr.query.category_id > 0) {
this.filters.category_level = curr.query.level
this.filters.category_id = curr.query.category_id
this.getGoodsList()
this.categorySearch()
} else {
this.getGoodsCategoryList();
this.first_index = 0
this.selectCategoryId = 0
if (process.client) window.document.title = `${this.siteInfo.site_name}`
}
if (curr.query.category_id == undefined || curr.query.category_id == 0) {
this.catewords = ""
this.keyword = curr.query.keyword
this.filters.category_id = curr.query.category_id || ""
this.filters.category_level = curr.query.level || ""
this.filters.brand_id = curr.query.brand_id || ""
this.getGoodsList()
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More