799 Commits

Author SHA1 Message Date
pikachu1995@126.com
8a0f5ff120 fix(goods): 移除下载结算单接口URL中的多余斜杠 2025-12-09 16:44:18 +08:00
chc
c5fecda212 先注释掉未实际使用功能,后续优化密码修改内容 2025-12-01 18:55:46 +08:00
pikachu1995@126.com
e5d98d022e feat(manager): 调整分页组件默认页面大小为20
- 将所有页面的默认页面大小从10调整为20
- 更新分页选项数组,将最小值从10改为20
- 统一所有分页相关组件的pageSize默认值为20
- 修改pageSizeOpts选项为[20, 50, 100]
- 确保所有涉及分页的业务逻辑使用新的默认值
2025-11-24 13:09:11 +08:00
pikachu1995@126.com
799184fd21 style(components): 将按钮组件替换为链接样式
- 统一将页面中的 Button 组件替换为 a 标签,保持样式一致
- 添加统一的链接样式类 ops-link 和分隔符样式类 ops-sep
- 更新操作列中按钮的样式,使用颜色、光标和文本装饰属性替代原有 props 配置
- 在多个文件中调整了操作项之间的分隔符显示逻辑
- 优化表格操作列渲染函数,去除冗余的 Button 属性配置
- 保持功能不变的前提下提升界面视觉一致性
2025-11-24 11:33:54 +08:00
pikachu1995@126.com
756cb28daa fix(api): 修正更新隐私协议的API路径格式
feat(ui): 在顶部导航栏添加客服按钮及样式
添加客服按钮功能,包括获取IM链接和用户信息验证

refactor(order): 重构分销订单状态显示逻辑
统一订单状态显示为"未完成"、"完成"和"退款",并调整对应颜色
2025-11-23 16:30:41 +08:00
lifenlong
5f6eb6a26d feat(积分商品分类): 添加分页功能并支持按排序值排序
在积分商品分类页面添加分页组件,支持分页查询和排序
新增排序值字段展示,并对分类列表按排序值进行递归排序
2025-11-20 15:32:46 +08:00
pikachu1995@126.com
4efbec5741 refactor(分页): 统一调整分页大小选项为[20, 50, 100]并更新默认pageSize
style(售后订单): 优化商品图片样式,添加圆角和固定宽高
docs(售后订单): 更新售后状态显示文本,使其更清晰易懂
2025-10-27 18:34:01 +08:00
Ryan Ran
86dbc0d86e docs(README): 更新安装指导,新增yarn安装和启动步骤,移除npm相关内容以简化用户体验 2025-10-22 15:01:21 +08:00
pikachu1995@126.com
c32d011851 docs(readme): 更新交流方式和联系方式- 移除了旧的QQ群交流信息
- 新增微信交流群二维码
- 添加在线客服链接
- 精简了联系方式展示方式
- 统一了交流渠道描述格式
2025-10-20 14:52:33 +08:00
pikachu1995@126.com
311ca35afc feat(商品设置): 添加ES商品索引管理功能
新增三个API接口用于管理ES商品索引:
1. 删除ES中下架的商品
2. 删除不存在的索引
3. 生成所有商品的缓存
同时在商品设置页面添加对应操作按钮
2025-10-20 13:43:34 +08:00
Ryan Ran
1a3fae6501 fix(README & package.json): 更新 README 文档以反映 Node.js 版本兼容性,移除 NODE_OPTIONS 环境变量的依赖,确保项目在 Node.js 16 及以上版本下正常运行,优化用户安装指导。 2025-10-10 15:23:27 +08:00
Ryan Ran
3432530de7 fix(README.md): 更新文档以兼容更高的 Node.js 版本(20、18、16),并提供安装指导,确保用户能够顺利拉取最新代码和处理依赖问题。 2025-09-30 14:03:43 +08:00
Ryan Ran
af85493863 fix(buyer端升级node版本): 添加 .npmrc 和 .yarnrc 文件以支持引擎配置,更新 package.json 中的 NODE_OPTIONS 环境变量,替换多个组件中的 /deep/ 选择器为 ::v-deep,优化依赖管理,确保兼容性,兼容node16版本 2025-09-30 13:33:22 +08:00
Ryan Ran
ae85f0d612 fix(manager端升级node版本): 更新多个组件的样式,替换 /deep/ 选择器为 ::v-deep,替换 node-sass 为 sass,优化依赖管理和兼容性,兼容node16版本 2025-09-30 11:38:38 +08:00
Ryan Ran
16c4a78e29 fix(兼容性): 更新 seller 项目的 package.json 和 README.md,添加 NODE_OPTIONS 环境变量以支持 Node.js 版本 20 和 18 的运行,详细说明各版本的兼容性和安装要求,优化文档以提升用户体验。 2025-09-30 11:04:12 +08:00
Ryan Ran
8fb87aa64d feat(seller端升级node版本): 添加 .npmrc 和 .yarnrc 文件以支持引擎配置,更新 package.json 中的引擎要求并替换 node-sass 为 sass,优化依赖管理和兼容性,兼容node16版本 2025-09-29 18:26:52 +08:00
Ryan Ran
c5d675b6d2 fix(商品规格): 优化规格值处理逻辑,确保在规格值为空时移除对应行并更新表格数据,增强用户体验 2025-09-23 19:17:24 +08:00
Ryan Ran
f4d06b2d7b fix(商品审核): 更新审核功能,添加请求头以支持表单数据提交,提升接口兼容性 2025-09-23 14:14:43 +08:00
Ryan Ran
bb610a7cd8 fix(商品审核): 优化审核功能,使用FormData处理请求数据,提升代码可读性和维护性 2025-09-23 14:01:53 +08:00
misworga831
bb864e72b3 fix(商品规格): 优化规格值编辑逻辑,避免空值提交并清理错误提示 2025-09-15 21:45:47 +09:00
misworga831
c6c4797d87 fix(商品规格): 修复规格值过滤逻辑,确保移除空值并更新表格数据 2025-09-15 21:03:33 +09:00
misworga831
25fed42395 fix(商品规格): 添加内联错误提示,优化规格值验证逻辑 2025-09-15 16:04:48 +09:00
misworga831
66c4676493 fix(商品规格): 更新规格值提示信息,增加用户操作指导 2025-09-12 22:35:03 +09:00
misworga831
f8747b5d5d fix(商品操作): 优化模板和方法中的代码格式,提升可读性 2025-09-12 22:19:38 +09:00
misworga831
0eb58d4b8a fix(商品规格): 修复规格值编辑逻辑,避免对未定义索引的访问 2025-09-11 19:52:35 +09:00
pikachu1995@126.com
7b30ea343f feat(商品管理): 添加商品复制功能并优化批量操作
- 在商品操作页面添加复制商品功能,通过copyId参数区分复制操作
- 复制商品时自动清除原商品ID确保提交为新商品
- 优化批量操作按钮功能,包括上架、下架、删除和设置物流模板
- 移除未使用的批量规格更新功能
- 调整商品列表操作按钮布局,将复制功能加入操作列
2025-09-09 17:04:58 +08:00
pikachu1995@126.com
7db8484a7c feat(售后订单): 添加售后数量统计功能并显示在标签页
- 在manager和seller端添加获取售后数量统计的API接口
- 修改售后订单页面,显示各状态对应的数量统计
- 新增计算属性serviceStatusWithCount动态生成带数量的标签页
- 在初始化、搜索和状态切换时调用统计接口更新数据
2025-08-29 11:36:45 +08:00
pikachu1995@126.com
78b058009b feat(订单/商品): 添加数量统计功能并优化列表展示
- 在订单和商品管理页面添加数量统计功能
- 优化订单和商品列表的筛选和展示样式
- 统一API接口参数传递方式
- 移除重复代码和无用代码
2025-08-29 09:40:36 +08:00
pikachu1995@126.com
05abad3905 feat(会员管理): 新增会员ID搜索和头像显示功能
refactor(订单管理): 移除表格边框并优化分页选项

feat(售后订单): 添加关键字搜索字段并移除二维码功能

feat(商品管理): 新增批量操作和审核功能,优化商品列表展示

style: 移除多余的margin-top样式
2025-08-27 16:15:11 +08:00
pikachu1995@126.com
ad178b1806 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-08-27 10:12:05 +08:00
pikachu1995@126.com
075c20ae41 feat(订单列表): 新增搜索字段和支付方式筛选功能
- 添加关键字、商品名称、收货人和支付方式搜索字段
- 增加支付方式显示列和筛选功能
- 调整默认分页大小为20并增加100条选项
- 优化订单状态筛选逻辑
2025-08-27 10:11:40 +08:00
Ryan Ran
56420bd4d0 feat: 添加pageClientType属性以支持页面类型设置
在`renovation.vue`文件中,新增`pageClientType`属性并设置为'PC',以便于在页面数据中区分客户端类型,提升页面功能的灵活性。
2025-08-26 10:40:19 +08:00
pikachu1995@126.com
a18fc729c0 style(oss-manage): 调整表单元素宽度并优化布局结构
将日期选择器和输入框的宽度从200px统一调整为240px,提升表单元素的一致性
拆分操作区域到单独的Card组件中,改善页面布局结构
2025-08-21 16:41:46 +08:00
pikachu1995@126.com
099941a54e style: 统一输入框和选择器宽度为240px并优化卡片布局
- 将多处输入框和选择器的宽度从200px调整为240px
- 优化卡片布局结构,添加分割卡片提升可读性
- 移除部分冗余的刷新按钮和样式代码
- 调整日期选择器等表单元素的宽度为240px
2025-08-21 16:41:27 +08:00
Ryan Ran
3867d51d92 fix: 移除管理端会员列表,回收站username字段,优化成员列表组件的属性结构 2025-08-13 18:18:41 +08:00
Ryan Ran
f1be18b7e3 添加vue-virtual-scroller依赖并在消息视图中实现虚拟滚动功能,以优化对话列表的渲染性能。同时,为managerseller项目添加minimatch依赖项的解析版本以解决潜在的版本冲突。 2025-07-15 16:16:42 +08:00
Ryan Ran
ef46380f9e 添加minimatch依赖项的解析版本以解决潜在的版本冲突 2025-07-04 17:16:47 +08:00
chc
d711273cf0 商品发布参数项校验无法some问题 2025-03-12 10:28:59 +08:00
chc
5e7cf2d679 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-03-11 19:09:39 +08:00
chc
11319ba21f 分类参数必填校验 2025-03-11 19:09:05 +08:00
Chopper711
b4a706820e ### feat: 优化优惠折扣输入组件 (master)
- 将`Input`组件替换为`InputNumber`组件,以确保输入的优惠折扣
  在0.1到9.9之间,并支持一位小数。
- 在`full-discount-add.vue`和`full-discount-detail.vue`文件中,
  更新了`FormItem`组件的`优惠折扣`输入逻辑。
- 在`coupon-publish.vue`文件中,更新了描述文本以强调输入
  范围和格式。
- 在`coupon.vue`文件中,修复了优惠券类型判断逻辑,增加了
  "DISCOUNT"类型和未知类型的处理。
2025-02-21 17:34:58 +08:00
Chopper711
376a3223dc fix: 优化积分商品添加页面和对账单详情页面的功能 (master)
- 移除积分商品添加页面的冗余标题
- 将兑换时间选择器替换为活动时间范围选择器
- 简化验证规则,使用rangeTime替代单独的开始和结束时间
- 调整批量删除按钮和其他按钮的样式格式
- 在对账单详情页面添加删除消息提示框功能
2025-02-21 16:09:14 +08:00
Chopper711
a85ec69549 fix: 消息提示框以及消息点击查看后需要标记已读按钮优化 2025-02-20 15:48:19 +08:00
Chopper711
ebf4d6d3eb Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2025-02-20 14:57:21 +08:00
Chopper711
2ccd8265b9 fix: 消息提示框以及消息点击查看后需要标记已读按钮优化 2025-02-20 14:52:53 +08:00
chc
fb1671d062 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-02-17 13:41:42 +08:00
chc
95e37df2ec 电子面单物流选中错误问题 2025-02-17 13:41:05 +08:00
pikachu1995@126.com
cfde72f1ab Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-02-11 15:43:20 +08:00
pikachu1995@126.com
efc778acbc 微信支付配置,添加配置使用公钥还是证书 2025-02-11 15:43:09 +08:00
misworga831
37384ebadd fix: 优化商品编辑 2025-01-21 13:53:07 +08:00
misworga831
9a7aee7e97 fix: 优化商品编辑 2025-01-20 18:43:21 +08:00
chc
1a56534d28 提现设置增加校验 2025-01-20 18:12:41 +08:00
chc
79e7e5f087 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2025-01-17 17:42:58 +08:00
chc
aea03cf975 支付设置选中状态错误问题 2025-01-17 17:42:49 +08:00
pikachu1995@126.com
8ef6f944dc 微信支付配置,添加微信支付公钥 2025-01-08 16:14:14 +08:00
pikachu1995@126.com
e18d243961 优化微信支付配置,不读取密钥文件,改成读配置文件 2024-12-27 11:01:53 +08:00
chc
765b633cea Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-12-25 10:35:50 +08:00
chc
9c402a3878 1.查看物流信息
2.直播图片选择器修改
3.管理端隐藏会员详情
2024-12-25 10:35:40 +08:00
Chopper711
86426b087a feat: 使用InputNumber组件替换折扣输入框 (master)
在coupon-publish.vue中,将折扣输入框从Input组件更改为
InputNumber组件,以便更好地控制折扣值的输入范围。
2024-12-23 11:51:05 +08:00
chc
c5aaa2f3e2 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-12-02 18:05:51 +08:00
chc
cc59bb6094 售后实际退款金额显示错误问题 2024-12-02 18:05:43 +08:00
Ryan Ran
5662da1210 fix: 修改商家端分销商品列表点击链接商品不展示问题 2024-11-25 10:43:49 +08:00
Ryan Ran
863725d3ba 优化管理端活动楼层装修 2024-11-11 15:23:32 +08:00
Yer11214
b1acfbdd4b !40 修复了行政地区切换验证状态没更新的问题
Merge pull request !40 from 孟锴/feature/mengkai-master-branch
2024-10-14 07:34:03 +00:00
mengkai
001f9c3f30 修复了行政地区切换验证状态没更新的问题 2024-10-14 11:26:26 +08:00
Yer11214
8d4df4b66e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-10-07 22:26:15 +08:00
Yer11214
604447508a fix: oss选择图片不展示报错bug 2024-10-07 22:26:13 +08:00
misworga831
6f30949620 fix: 移动端楼层装修促销活动移除优惠券.pc端楼层装修快捷导航外部链接无法填写问题 2024-09-23 21:18:27 +08:00
chc
10e8e82fe4 增加部分发货状态 2024-09-18 15:25:04 +08:00
Yer11214
5227e0ae13 优惠券列表样式修改 2024-09-08 23:10:23 +08:00
misworga831
cf193f4eab fix: 优化店铺oss分组删除问题 2024-09-05 14:29:10 +08:00
RyanRan
708ae53fe2 docs: seller 端 axios修改 timeout过期时间 2024-07-24 14:45:46 +08:00
Yer11214
aed57177dd update README.md.
Signed-off-by: Yer11214 <17633066053@163.com>
2024-07-19 02:12:28 +00:00
Yer11214
e916a03ff8 update README.md.
Signed-off-by: Yer11214 <17633066053@163.com>
2024-07-19 02:10:18 +00:00
pikachu1995@126.com
859d60c0bf Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-07-18 14:30:27 +08:00
pikachu1995@126.com
1eeaf38638 优化店铺资源管理页面 2024-07-18 14:30:14 +08:00
RyanRan
ca09bbe3fc Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-07-18 14:05:02 +08:00
RyanRan
57b42bdc66 删除.npmrc以及.yarnrc命令 2024-07-18 14:05:00 +08:00
misworga831
88c31d157e fix: 修复商品编辑规格第一个规格值无效问题 2024-07-18 09:44:46 +08:00
RyanRan
c738274423 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-07-17 14:52:42 +08:00
RyanRan
1c62ee6efe docs: 删除package.json中无用的引用导致报错 2024-07-17 14:52:22 +08:00
Yer11214
4fcb24607d update README.md.
修改readme文档

Signed-off-by: Yer11214 <17633066053@163.com>
2024-07-12 06:26:28 +00:00
RyanRan
52ce1e795c fix: buyer端删除 package-lock.json 2024-07-10 13:15:29 +08:00
pikachu1995@126.com
39c4593d9e 优化支付、短信的配置内容 2024-07-07 14:04:19 +08:00
pikachu1995@126.com
6ae288cf01 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-07-02 14:56:20 +08:00
pikachu1995@126.com
bab54570fe 优化结算单详情以及分销相关页面展示 2024-07-02 14:56:10 +08:00
Yer11214
2551c76d97 删除文件 buyer/yarn.lock 2024-07-02 03:15:18 +00:00
pikachu1995@126.com
e3a5583802 商家增加库存导出导入api 2024-06-28 10:44:53 +08:00
pikachu1995@126.com
b03adc1b1f 优化微信支付的参数配置 2024-06-28 09:09:01 +08:00
pikachu1995@126.com
6e9d725f6d 支持店铺通过excel批量更新商品库存功能 2024-06-27 17:09:58 +08:00
pikachu1995@126.com
92559ca9e7 优化订单导出功能 2024-06-26 11:51:22 +08:00
misworga831
3bfa99f578 fix: 修复优惠券使用范围中的部分商品分类 2024-06-14 11:30:53 +08:00
misworga831
30b85163b7 fix: 临时注释优惠券使用范围中的部分商品分类(后续改为部分店铺分类) 2024-06-13 16:11:00 +08:00
15386982806
ef528a2952 OSS资源修改分组 2024-05-27 16:41:34 +08:00
lele0521
907e9d35a7 fix: 增加订单备注 2024-05-15 17:56:06 +08:00
lele0521
d003e5da70 fix: 增加订单备注 2024-05-15 16:57:27 +08:00
lele0521
19530988ce Merge remote-tracking branch 'origin/master' 2024-05-15 15:57:00 +08:00
lele0521
4e9baebcf5 fix: 增加订单备注 2024-05-15 15:56:50 +08:00
RyanRan
3a1cbfe8bb fix: 🐛 修改昨天提交判断出错bug 2024-05-10 17:36:55 +08:00
RyanRan
c16b37c8bc feat: pc端新增专题功能 2024-05-09 18:38:22 +08:00
15386982806
0c6703f04d 修改促销活动展示问题 2024-04-23 11:28:44 +08:00
lele0521
3471caf00a fix: 商品导入后,导入动态样式未取消 2024-04-22 16:34:09 +08:00
lele0521
ad28e70a07 fix: 运营后台首页统计数据,处理默认数据显示 2024-03-29 11:46:34 +08:00
lele0521
47315963f1 fix: 订单支付超时跳转对应页面 2024-03-27 15:36:56 +08:00
15386982806
fb8fa9e787 修改OSS资源回显 2024-03-26 18:07:20 +08:00
lele0521
223fa7ca05 fix: 修复商品评价中商家回复信息的展示 2024-03-25 16:31:03 +08:00
Yer
b568c242e3 perf: 🐛 修改个人资料后应该直接刷新页面,获取最新数据 2024-03-24 09:02:15 +08:00
15386982806
e4283e1c53 修改编辑会员地址 2024-03-21 19:19:59 +08:00
15386982806
25f9cc1095 修改编辑店铺入参 2024-03-21 18:51:39 +08:00
15386982806
85729e3761 我的评价展示商家回复 2024-03-21 17:38:47 +08:00
15386982806
fa0a0cb1d8 优化订单统计展示、修改店铺校验 2024-03-21 17:12:16 +08:00
15386982806
e7ee256b80 会员回收站列表 修改器启用提示信息 2024-03-21 16:19:02 +08:00
lele0521
36190438f0 fix: OSS资源管理运营端增加按店铺名称搜索 2024-03-19 17:58:45 +08:00
chc
ce629a1fb6 PC端增加修改价格字段 2024-03-15 16:29:13 +08:00
15386982806
f989d1ef4e OSS资源回显问题 2024-03-15 10:35:25 +08:00
chc
99455dee58 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-03-11 16:08:13 +08:00
chc
c7bd7223bc 多货物订单无售后按钮 2024-03-11 16:08:05 +08:00
chc
8166f90f0f 多SKU订单无申请售后按钮 2024-03-11 15:49:35 +08:00
15386982806
8b2587daa7 修改商家端素材管理样式 2024-03-07 19:32:25 +08:00
Yer
82e047c797 style: 2024-03-07 15:48:22 +08:00
misworga831
3cefb40ccb merge conflict 2024-02-28 09:14:38 +08:00
misworga831
8bba4a1e48 fix: 修复编辑商品sku规格项时,值为空鼠标移出后显示错误问题 2024-02-28 09:13:16 +08:00
Yer
a12f317aa8 fix: 🐛 修改部分页面点击回车刷新页面bug 2024-02-27 11:56:43 +08:00
Chopper711
1d133af38d fix: 淘宝镜像源地址https证书过期问题处理 2024-02-19 18:06:26 +08:00
chc
9cab354cbb 去除商家修改收货地址的长度限制 2024-02-19 15:04:05 +08:00
chc
c0385414ca 隐藏普通发货功能,使用分包裹发货 2024-02-18 16:12:26 +08:00
Yer
4f7846dc4e Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2024-02-02 18:29:12 +08:00
Yer
01beac9265 fix: 🐛 优化管理端商品分类添加/修改/删除 之后原有的 层级关闭问题 2024-02-02 18:29:10 +08:00
15386982806
77ad146e24 商家端优化OSS资源管理 2024-02-02 18:09:29 +08:00
15386982806
6c1c47de1d 管理端优化OSS资源管理 2024-02-02 17:24:57 +08:00
lele0521
b3cac070df fix: 管理端-结算单流水去除(flowType: "PAY") 2024-01-30 09:39:37 +08:00
Yer
daf1b20f67 fix: 🐛 修改订单设置退单描述问题 2024-01-29 14:53:04 +08:00
Yer
2316fb8d11 fix: 🐛 修改订单配置中描述错误bug 2024-01-29 14:08:24 +08:00
lele0521
43159335f8 Revert "分销结构优化"
This reverts commit 63b22f4c86.
2024-01-26 13:35:47 +08:00
misworga831
0e56c2038d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2024-01-25 17:51:09 +08:00
misworga831
0840740e2c fix: 优化秒杀展示 2024-01-25 17:50:55 +08:00
15386982806
e2404f0f3b Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-25 13:20:57 +08:00
15386982806
5e9a258cc8 隐私协议右侧添加手机查看效果 2024-01-25 13:20:46 +08:00
misworga831
8cfc420085 fix: 买家端虚拟商品订单不显示地址信息 2024-01-25 09:36:04 +08:00
misworga831
83593bd015 fix: 优化虚拟商品不需要收货地址 2024-01-24 19:23:34 +08:00
pikachu1995@126.com
c1cdf97edb Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-24 14:58:11 +08:00
pikachu1995@126.com
eca8370c70 结算单详情调优 2024-01-24 14:58:01 +08:00
chc
54502b331f Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-24 11:33:21 +08:00
chc
0ec5955ea0 库存预警,分类搜索问题 2024-01-24 11:33:12 +08:00
pikachu1995@126.com
b70a9bf0c0 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-24 09:47:11 +08:00
pikachu1995@126.com
fb20cb32da 结算单详情调优 2024-01-24 09:46:59 +08:00
chc
a314373e64 商品编辑数据可能被覆盖问题 2024-01-23 16:51:10 +08:00
pikachu1995@126.com
4976b87c4e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-23 10:33:08 +08:00
misworga831
3b9e54375a fix: 修复删除sku图片无效问题 2024-01-23 10:06:36 +08:00
misworga831
8b15cfb0b1 fix: 兼容旧版本图片格式 2024-01-22 18:11:25 +08:00
pikachu1995@126.com
ff02cce191 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-22 15:24:41 +08:00
misworga831
83beb81a3b fix: 兼容旧版本图片格式 2024-01-22 14:39:43 +08:00
misworga831
de89249d3e improved: 优化sku编辑 2024-01-22 14:09:00 +08:00
chc
77732e766a Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-18 11:46:30 +08:00
chc
21c91cfcf1 库存预警 2024-01-18 11:46:11 +08:00
Yer
ebaf5e34d8 fix: 🐛 修改商家端订单评论发现的bug 和后端字段不统一 2024-01-17 18:35:11 +08:00
15386982806
94e389ab23 编辑商品字符长度限制 2024-01-16 18:09:11 +08:00
15386982806
7ba94c7fe1 编辑商品详情 2024-01-16 17:54:28 +08:00
15386982806
c47394a162 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-16 17:29:39 +08:00
15386982806
bf8afdc0f4 买家端订单状态 2024-01-16 17:29:19 +08:00
chc
3df17ed33f Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-16 17:28:33 +08:00
chc
dc6d3b3743 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2024-01-16 17:28:25 +08:00
15386982806
6e626f6e11 买家端订单退款状态 2024-01-16 17:27:05 +08:00
chc
d20da31f2c 库存预警 2024-01-16 17:26:09 +08:00
15386982806
2182cd012a 商品详情展示此规格的价格 2024-01-16 16:33:43 +08:00
15386982806
71c629cb06 运费模板 品牌 计量单位刷新成功提醒 2024-01-16 11:12:07 +08:00
15386982806
185d675abf 库存预警还原 2024-01-16 10:45:03 +08:00
chc
6221b59b21 库存预警回退 2024-01-16 10:18:39 +08:00
15386982806
07f320ca2f 修改订单查询物流样式 2024-01-11 14:45:17 +08:00
15386982806
9908b83b18 商家端优化库存预警,管理端 商家端隐藏所有促销活动的删除按钮 2024-01-11 13:32:39 +08:00
15386982806
9ce1c966eb 订单支持分包裹发货 2024-01-10 19:15:24 +08:00
15386982806
c81eff58d3 上传图片采用素材管理 2024-01-09 17:09:23 +08:00
15386982806
92b61a203f 商家端图片上传采用素材管理上传 2024-01-09 16:39:52 +08:00
15386982806
b1f9c0adf2 商家端添加OSS资源素材管理 2024-01-08 17:59:49 +08:00
15386982806
c5d75a3570 运营后台商品详情展示此规格的价格 2024-01-05 16:28:36 +08:00
15386982806
42c64920b1 商品规格字符长度限制 2024-01-05 15:54:10 +08:00
15386982806
77e7d095a7 运费模板 品牌 计量单位 支持刷新功能 2024-01-05 15:10:48 +08:00
15386982806
560199944d PC端订单货物展示退款状态与实际退款金额 2024-01-05 14:00:22 +08:00
15386982806
21ae217369 订单取消状态改为已关闭、订单货物展示退款数量 2024-01-05 10:08:37 +08:00
mahe
4565297fe6 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-12-22 17:41:30 +08:00
mahe
118e68b8ac fix: 修复楼层装修跳转错误 2023-12-22 17:41:19 +08:00
Yer
a03f908e96 style: 🐛 修改店铺入驻协议样式问题 2023-12-22 17:35:51 +08:00
Yer
0b6dcf17d1 fix: 🐛 修改 im cdn 2023-12-22 17:13:18 +08:00
Yer
5136f8b3dd fix: 🐛 修改商家端楼层装修bug 2023-12-22 14:31:39 +08:00
mahe
286295393d 发布商品增加局部刷新与去除成本价 2023-12-18 18:04:44 +08:00
mahe
195ea35798 修改图片超出内容问题 2023-12-18 15:35:20 +08:00
mahe
053279f60d 修改店铺分类未展示 2023-12-18 14:43:58 +08:00
Chopper711
9bfb7e8b69 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-12-11 07:58:28 +08:00
Chopper711
c82f8a6de3 fix: 部门搜索功能bug修复 2023-12-11 07:58:22 +08:00
Yer
749147cfad feat: 商家端富文本改为本地引入 2023-12-01 11:38:31 +08:00
Yer
4429227665 feat: 商家端富文本改为本地引入 2023-12-01 11:38:01 +08:00
Yer
3ec0e9d997 feat: 新增富文本本地引入 2023-12-01 10:47:33 +08:00
Chopper711
904046f02c Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-11-30 18:50:01 +08:00
pikachu1995@126.com
5a29215b80 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-10-26 14:34:49 +08:00
misworga831
508a00d103 fix: 优化编译脚本 2023-10-18 08:14:54 +08:00
misworga831
5385d10bc8 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-10-16 18:20:34 +08:00
misworga831
08b4a04791 resolve conflict 2023-10-16 18:20:29 +08:00
misworga831
218cee2aef fix: 优化售后订单搜索 2023-10-16 18:16:28 +08:00
pikachu1995@126.com
63b22f4c86 分销结构优化 2023-10-16 16:00:15 +08:00
Chopper711
709a3f71fd Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-10-13 11:14:19 +08:00
Yer
f7589e42ab Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-10-11 16:36:38 +08:00
Yer
0e7008862e feat: 新增弹出页以及广告页面开启关闭提示 2023-10-11 16:36:36 +08:00
misworga831
7e88ee930b resolve conflict 2023-10-11 10:11:11 +08:00
chc
e935f2a3e3 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-10-10 11:29:15 +08:00
chc
9d442a2aa1 订单统计切换分页问题处理 2023-10-10 11:26:50 +08:00
Yer
eed6ba43d9 合并提交 2023-10-09 13:30:56 +08:00
Yer
b2c286f0f5 fix: 🐛 修复在统计图中可能出现的Bug 2023-10-09 13:27:13 +08:00
misworga831
2aae5a4bff fix: 修复拼团批量删除,所选数量不正确问题 2023-09-30 17:48:35 +08:00
“Yer”
c88c1865e7 fix: 🐛 修改统计图已发现的问题 2023-09-30 16:18:27 +08:00
Chopper711
7152e339e5 fix: 前后端交互数据出现问题处理 2023-09-27 07:07:22 +08:00
pikachu1995@126.com
46143beb83 添加文件-文件夹 2023-09-26 18:48:55 +08:00
Yer
2c66eaae2b fix: 🐛 修复已知统计问题 2023-09-26 15:53:13 +08:00
Yer
b8c74ac84c Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-09-26 15:02:20 +08:00
Yer
cb210916eb style: 调整投诉详情页面的样式 2023-09-26 15:02:17 +08:00
Chopper711
f968f3d20d refactor: 重构PC分享页面,优化布局展示,增加移动端二维码展示 2023-09-25 15:02:57 +08:00
Chopper711
4ef2496221 店铺菜单管api 补充提交 2023-09-25 12:13:07 +08:00
Chopper711
b2b56178a2 菜单权限url增加长度限制 2023-09-25 12:05:05 +08:00
Chopper711
525838468c refactor: 增加店铺菜单维护页面 2023-09-25 11:58:34 +08:00
Yer
ef92bcfe3a fix: 🐛 修改部分已知的Bug 2023-09-25 10:05:41 +08:00
Yer
ed72c2ffc2 style: 关闭文章列表在楼层中添加文章功能 2023-09-22 11:51:18 +08:00
Yer
9f94c2013a style: 调整商品选择器,店铺选择器代码 2023-09-22 10:49:11 +08:00
misworga831
8666254ffe Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-09-19 09:37:04 +08:00
Yer
e13fc57ae7 fix: 🐛 修复已知的bug 2023-09-19 09:25:57 +08:00
misworga831
c6cf90fb4e fix: 优化统计数据文本显示 2023-09-18 16:59:23 +08:00
Yer
fff086a3a1 feat: 新增商品审核中多个规格以及库存展示 2023-09-18 16:45:30 +08:00
misworga831
b7a2a5af6d fix: 修复管理端商品分类,编辑时状态显示错误问题及佣金比例限制 2023-09-18 16:04:25 +08:00
Yer
1786dfeee2 fix: 🐛 修复几个已知的bug 2023-09-18 15:36:46 +08:00
Yer
2c32088f4c feat: 优化部分代码,新增审核商品视频 2023-09-15 19:43:41 +08:00
Yer
71f61461ce Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-09-14 18:07:44 +08:00
Yer
54be87efea fix: 🐛 解决几个发现的重置bug 2023-09-14 18:07:42 +08:00
misworga831
76fc55fdd0 improve: 统一物流单号名词 2023-09-14 16:58:35 +08:00
misworga831
5d5a845523 fix: 完善文字性描述 2023-09-14 15:06:59 +08:00
Yer
4f915a32b6 fix: 🐛 解决几个已知的bug 2023-09-14 13:58:50 +08:00
Yer
78df54d153 fix: 🐛 修复几个已知bug 2023-09-14 09:11:25 +08:00
Yer
24554a0768 feat: 编辑会员新增默认头像展示 2023-09-13 17:25:35 +08:00
Yer
ffe03fd785 feat: 买家端查看商品详情新增商品参数功能,修复几个已知的bug 2023-09-13 16:06:42 +08:00
Yer
4b635735ae Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-09-05 11:28:26 +08:00
Yer
79c1e2c5bb fix: 🐛 修复填写支付宝微信支付秘钥被截断问题 2023-09-05 11:28:23 +08:00
Yer11214
cf9f9fb7dd style: 💄 PC端收藏商品中收藏店铺添加跳转以及优化样式 2023-08-26 13:48:04 +08:00
Yer
2bcefc1306 fix: 🐛 解决商品编辑中重新选择分类、商品参数不更新问题 2023-08-24 16:40:28 +08:00
Chopper711
39547b542c style: 默认描述增加 2023-08-22 16:08:54 +08:00
Yer
8c9246faa4 fix: 🐛 修复商家端菜单切换之后active样式丢失问题 2023-08-16 16:29:45 +08:00
Yer
74b180f6d3 fix: 🐛 修改展示字错误 2023-08-14 15:53:44 +08:00
Yer
ac26690e78 fix: 🐛 修改部分已知的bug 2023-08-11 17:41:44 +08:00
Yer
d642e00844 fix: 🐛 修改订单详情因为发票信息可能出现的bug 2023-08-10 16:53:14 +08:00
Yer
7bbb657379 perf: 优化地区选择器代码 2023-08-10 11:29:57 +08:00
Yer
00a56473f1 fix: 🐛 优化买家端首页点击回到顶部的判断 2023-08-09 15:32:44 +08:00
Yer
e138275c0a fix: 📝 补充提交 2023-08-09 14:57:35 +08:00
Yer
9e7a1b3ee3 feat: 商家端新增楼层数据保存到本地功能 2023-08-09 14:56:57 +08:00
Yer
c5e06ad1f2 feat: 新增管理端楼层装修保存到本地功能 2023-08-09 14:42:23 +08:00
Yer
128ad892d1 feat: 买家端使用最新地址选择器,默认在config关闭高德地图功能,开启后可继续使用 2023-08-03 16:36:41 +08:00
Yer
552b4c605d feat: 地图选择器 2023-08-03 10:38:07 +08:00
Yer
8b33dbe8d7 feat: 管理端使用最新地址选择器,默认在config关闭高德地图功能,开启后可继续使用 2023-08-03 10:37:53 +08:00
Yer
8a43335b75 feat: 商家端使用最新地址选择器,默认在config关闭高德地图功能,开启后可继续使用 2023-08-02 10:53:14 +08:00
“Yer”
a4d17102f1 style: 💄 修改文章页面红线突兀样式 2023-07-31 17:48:30 +08:00
Yer
d02d0adb39 fix: 🐛 修改PC首页跳转bug 2023-07-28 17:11:19 +08:00
Yer
c86cecf4f0 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-25 10:10:22 +08:00
Yer
7bc5d67efc feat: 商家端新增redirect登录功能 2023-07-25 10:10:20 +08:00
misworga831
d058d7d6e8 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-24 15:11:03 +08:00
misworga831
914fa0a324 fix: 优化统计数据文本展示 2023-07-24 15:10:52 +08:00
Yer
4389911436 买家端展示视频判断 2023-07-24 14:26:07 +08:00
Yer
841d48e2a7 style: 🐛 修改几个console警告问题 2023-07-21 11:17:40 +08:00
Yer
b6c16e7048 提交优化一个小问题 2023-07-20 18:10:16 +08:00
Yer
9fce33ca18 买家端新增视频播放功能 2023-07-20 16:50:43 +08:00
Yer
6a653198c3 商家端新增上传视频功能 2023-07-19 14:08:32 +08:00
Yer
2c8e34008f 轮播图 string类型改成 number类型 要不然有警告 2023-07-14 13:45:00 +08:00
Yer
6feb650f06 优化Buyer端展示 2023-07-14 13:42:35 +08:00
Yer
873764b59e feat: 管理端添加多标签Tab页内嵌模式设置 2023-07-14 09:19:52 +08:00
Yer
36ef331b94 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-13 17:24:03 +08:00
Yer
308619fbdd feat: buyer端新增 平台/店铺切换搜索,管理端意见按照时间反馈排序展示 2023-07-13 17:24:00 +08:00
pikachu1995@126.com
6dec218e81 删除无用的配置项 2023-07-13 16:00:09 +08:00
Yer
f9717eb7ac 微信消息订阅模板 描述文字更换 订阅 改成 初始化 2023-07-11 17:10:54 +08:00
Chopper711
cb10bd97a0 店铺编辑管理端排版处理 2023-07-11 15:35:25 +08:00
Yer
430894eb69 删除管理端中 物流公司中需要填写的电子表单 2023-07-11 15:07:10 +08:00
Yer
34cb3b4a29 style: 💄 优化PC首页展示以及店铺中搜索商品未携带id问题 2023-07-11 11:45:29 +08:00
Yer
b89f81e5d6 fix: 🐛 修复日志管理中开发人员操作时间展示问题 2023-07-10 10:13:38 +08:00
Yer
604bdcaf77 fix: 🐛 修改日志模块中操作时间展示问题 2023-07-10 09:49:14 +08:00
Yer
a46cd8ee97 优化最新pc首页展示的问题 ,删除秒杀活动默认展示以及轮播图新增自动滚动 2023-07-07 09:21:07 +08:00
Yer
7e14569479 补充提交 2023-07-06 17:23:46 +08:00
Yer
3c296ea011 feat: 新增楼层装修 更改部分买家端UI 2023-07-06 17:21:38 +08:00
Yer
8529641145 优化了部分展示功能 2023-07-06 16:21:25 +08:00
Yer
b133502062 补充提交 2023-07-06 15:37:59 +08:00
Yer
5470253626 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-06 11:44:17 +08:00
Yer
6b697f9ecd feat: 新增多标签Tab页内嵌模式 2023-07-06 11:44:15 +08:00
pikachu1995@126.com
44558d9072 运营后台-售后列表,售后状态展示优化 2023-07-05 11:42:25 +08:00
pikachu1995@126.com
8dbd5429f0 运营后台-订单列表,订单状态展示优化 2023-07-05 11:11:39 +08:00
Yer
3c83179579 feat: 管理端新增格式化价格文件插件并在代码中引入,更新代码需要install插件 2023-07-04 10:24:21 +08:00
Yer
bf70527c58 feat: 商家端新增格式化价格文件插件并在代码中引入,更新代码需要install插件 2023-07-03 16:28:58 +08:00
Yer
26a539662e fix: 🐛 修改在买家端商品详情中因为categoryName为空导致页面出错不展示bug 2023-06-16 10:58:06 +08:00
mahe
48f2bd82a1 修改热区无法跳转专题问题 2023-06-15 09:44:46 +08:00
mahe
73c2654cc5 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-06-09 17:42:16 +08:00
mahe
49dfd644a2 修改优惠券展示问题 2023-06-09 17:39:59 +08:00
chc
09ce16dc95 IM携带商品信息 2023-06-01 10:10:51 +08:00
Chopper711
5b58d1de5e fix:之前的部分售后逻辑补足,不过代码判定存在问题,需要未来进行优化 2023-05-31 15:04:46 +08:00
Yer
775b339c17 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-05-26 16:54:29 +08:00
Yer
1ef8dd26cf fix: 🐛 修改店铺详情bug 2023-05-26 16:54:26 +08:00
yeliang-king
b36be16f38 会员修改刷新列表 2023-05-16 17:10:48 +08:00
Yer
1c765f37cf feat: 新增pc端 商品下架功能 2023-05-10 13:51:24 +08:00
Yer
724922dddc Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-05-09 11:42:44 +08:00
Yer
9dece4dd2c fix: 🐛 修复规格列表中,第一次新增规格点击编辑不回显问题 2023-05-09 11:42:41 +08:00
mahe
4a628acd37 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-05-09 11:05:49 +08:00
mahe
5c3501f08d 优化系统设置中的警告 2023-05-09 11:05:40 +08:00
misworga831
ad09b38ed5 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-05-08 18:42:09 +08:00
misworga831
c60a54b8f9 fix: 修复满减活动没有传递范围参数 2023-05-08 18:41:56 +08:00
Chopper711
056386e8e9 fix:用户端提现状态展示问题处理 2023-05-06 16:34:33 +08:00
Chopper711
8ad79b8728 fix: 兼容提现失败前端的展示 2023-05-06 16:23:29 +08:00
Chopper711
a78374910f fix: 兼容提现失败前端的展示 2023-05-06 16:23:27 +08:00
mahe
4318e8d0da 修改店铺装修选择链接问题 2023-05-06 16:07:30 +08:00
mahe
4ace1a9cca 增加店铺楼层装修图片热区功能 2023-05-06 15:57:34 +08:00
chc
7ded1c564e 类型保存问题 2023-04-26 11:02:24 +08:00
chc
28d68bdca6 去除电子面单必填校验 2023-04-25 10:40:31 +08:00
9181befdf9 秒杀增加card,满额详情不展示操作列 2023-04-23 10:23:32 +08:00
87b3cbe344 满额活动增加card样式 2023-04-23 09:33:16 +08:00
Yer
8b0ca5ba7e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-04-21 17:36:05 +08:00
Yer
b30be8efb2 优化商城端可以重复搜索内容 2023-04-21 17:36:02 +08:00
Yer
2213f0d0ce 新版楼层装修样式修改以及链接修改 2023-04-21 17:25:16 +08:00
夜良king
0883a967b6 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-04-19 10:34:43 +08:00
夜良king
c8e8685586 删除多余的文字 2023-04-19 10:34:32 +08:00
73ce45aff9 虚拟订单展示物流bug 2023-04-17 17:41:16 +08:00
e954cf4d92 订单详情重复展示问题 2023-04-17 11:31:52 +08:00
d1a974f6b0 规格列表,编辑不回显问题 2023-04-17 10:13:29 +08:00
39f7f1ed38 修改规格列表多余提示 2023-04-17 09:29:26 +08:00
lemon橪
5380cf9ba9 Merge remote-tracking branch 'refs/remotes/origin/master' 2023-04-15 09:37:13 +08:00
lemon橪
6e9ca81b58 fix: 🐛 修改系统设置oss设置表单校验不通过问题 2023-04-15 09:36:36 +08:00
学习很差啦
531ed5b2dd Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui into dev-feature 2023-04-12 11:07:47 +08:00
学习很差啦
ebc79da0fc feat: 对原有填写金额的input框进行改进,优化部分样式问题 2023-04-12 11:06:25 +08:00
学习很差啦
1cbafbce25 最新楼层装修模块 2023-04-07 16:47:27 +08:00
学习很差啦
816d842a57 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui into dev-feature 2023-04-07 10:12:01 +08:00
misworga831
e5c25895a0 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-04-04 15:15:09 +08:00
misworga831
1abc7a5a52 fix: 适配新获取商品返回结果 2023-04-04 15:14:41 +08:00
学习很差啦
170244cc9c style: 修改部分页面中展示细节,分销订单中新增状态展示,统计模块优化代码,热词模块 历史热词默认展示昨天热词,以及优化热词统计 2023-04-03 14:22:07 +08:00
学习很差啦
3498de4529 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-31 18:16:37 +08:00
学习很差啦
16b0d457fc style: 新增部分代码注释 页面新增部分提示 2023-03-31 18:16:33 +08:00
misworga831
87b6ddbaa6 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-03-31 17:14:29 +08:00
misworga831
2f6e50cc1c fix: 适配新获取商品返回结果 2023-03-31 17:14:22 +08:00
Chopper711
aa196918bf update README.md.
Signed-off-by: Chopper711 <1814994716@qq.com>
2023-03-31 07:23:51 +00:00
学习很差啦
5958353383 楼层装修新增内容 2023-03-31 15:22:38 +08:00
lemon橪
f37f633f51 新增部分楼层 2023-03-29 14:05:31 +08:00
chc
8c286610ba 待自提状态 2023-03-29 10:06:59 +08:00
chc
d2540733dc fix: 电子面单参数显示错误 2023-03-28 17:00:19 +08:00
chc
ab56bdfcad 规格问题 2023-03-27 19:45:53 +08:00
Chopper711
803eae5c7d style:按钮空格 2023-03-23 16:44:28 +08:00
学习很差啦
6b3892e17d 楼层装修新特征 2023-03-22 16:22:10 +08:00
学习很差啦
500afcc33f 楼层装修新特征 2023-03-22 16:22:01 +08:00
pikachu1995@126.com
64c61d5365 Merge branch 'master' into Bulbasaur 2023-03-22 08:43:05 +08:00
chc
bf58711c88 -fix APP版本时间问题,微信消息修改时间问题 2023-03-15 19:41:08 +08:00
学习很差啦
48b3e3246c Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-15 10:44:05 +08:00
学习很差啦
8f629db5ab feat: 新增全局Input表单默认最大输入值,开放config全局配置 2023-03-15 10:44:02 +08:00
Chopper711
1ca94d289a fix: 关闭优惠券按钮状态判定未判定新活动状态导致新活动点击关闭按钮无效 2023-03-15 10:19:03 +08:00
17600048398
3159c325e3 商品分类移除多余字符 2023-03-14 11:18:17 +08:00
17600048398
b51040c73e 物流管理-关闭物流传参错误问题, 2023-03-14 09:10:18 +08:00
17600048398
f4ddeaa5c5 前端问题处理 2023-03-09 18:16:10 +08:00
misworga831
8599708af3 Increase payment support and update parameters
- Improved payment system with WeChat and AliPay support
- Increased minimum recharge amount to `1`
- Added maximum of `9` characters for the recharge amount
- Added minimum withdraw amount setting
- Added real name field for AliPay
- Added third-party login field for AliPay
- Added maxlength of `9` characters for the withdraw amount
- Added a span tag to append '元' to the recharge amount
- Added a new function `with

[buyer/src/pages/home/userCenter/MoneyManagement.vue]
- Raise the minimum recharge amount to `1`
- Allow for a maximum of `9` characters for the recharge amount
- Added support for WeChat and AliPay
- Added a minimum withdraw amount setting
- Added a real name field for AliPay
- Added a third-party login field for AliPay
- Added maxlength of `9` characters for the withdraw amount
- Added a span tag to append '元' to the recharge amount
- Fixed typo
[buyer/src/api/pay.js]
- Add a new function `withdrawalSettingVO` for payment result inquiry
- Change the parameters for `payCallback` function
2023-03-08 21:58:29 +08:00
pikachu1995@126.com
72fb11d3d3 Merge branch 'master' into Bulbasaur 2023-03-08 18:42:17 +08:00
chc
7d0b3c6908 feat: 商家端增加修改密码,手机号登录 2023-03-08 10:25:23 +08:00
chc
f7a9bff2ba feat: 集成顺丰平台,发货,查询物流,打印面单 2023-03-06 18:00:11 +08:00
chc
4fd419fcfe Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-02 17:55:47 +08:00
chc
f72c28d770 fix: 🐛 关闭物流公司传递参数错误,css /deep/拼写错误 2023-03-02 17:55:36 +08:00
pikachu1995@126.com
7c775f7692 增加提现设置内容:提现方式、最低提现金额、微信提现应用ID 2023-03-02 06:52:15 +08:00
学习很差啦
ac0404adaa 补充提交im ws-socket中发现的问题 2023-03-01 17:51:43 +08:00
学习很差啦
40ccbf3edb fix: 🐛 买家端buyer im传值优化 2023-03-01 15:25:00 +08:00
学习很差啦
2aa7b67b7a Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-01 14:59:57 +08:00
学习很差啦
4700bc995a feat: 优化im 接口403判定,新增从买家端以及卖家端进行跳转im权限判定,新增im掉线重连以及重连成功提醒,新增发送的消息断线将会进行重新发送消息提示,优化最近浏览 订单列表空展示。注释部分im打印的日志信息 2023-03-01 14:59:54 +08:00
Chopper711
7052fa7420 !31 修复添加源时默认切换源类型不正确问题
Merge pull request !31 from Jimi/master
2023-02-28 03:32:00 +00:00
Jimi
08c62e5c9c fix:修复添加源时默认切换源类型不正确问题 2023-02-28 09:21:41 +08:00
学习很差啦
32b29f45e7 修改直播价格展示信息错误 2023-02-21 14:25:32 +08:00
学习很差啦
49d023cef0 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-17 11:28:29 +08:00
学习很差啦
674c2352ef feat: 新增im接口权限失效判定,优化买家显示样式以及卖家样式。 2023-02-17 11:28:26 +08:00
pikachu1995@126.com
96156508b5 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-16 18:16:17 +08:00
pikachu1995@126.com
802f13e6e5 存储新增:腾讯云、华为云
短信新增:腾讯云、华为云
物流新增:快递100
2023-02-16 18:15:39 +08:00
学习很差啦
5d24dda4c1 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-16 16:28:25 +08:00
学习很差啦
2207d11c7c 修改入驻电话校验 2023-02-16 16:28:24 +08:00
495096c779 im跳转问题 2023-02-16 15:57:18 +08:00
9375ba9e31 im金额格式化 2023-02-13 09:24:30 +08:00
42a24d854b im路径跳转 2023-02-09 16:34:01 +08:00
cc31b6232f im聊天发送中文问题 2023-02-09 15:59:08 +08:00
092873592d Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-09 15:14:05 +08:00
70757e8adf IM商家端不显示问题 2023-02-09 15:13:55 +08:00
Chopper711
b1fb019b01 update README.md.
Signed-off-by: Chopper711 <1814994716@qq.com>
2023-02-09 03:21:07 +00:00
15386982806
ed4f78bf6a 用户PC端,我的订单,根据订单号搜索框展示不全问题修改 2023-02-08 18:18:09 +08:00
chc
826ba41866 自提地址最下方显示问题 2023-02-03 17:26:49 +08:00
mahe
4886b53847 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-03 10:22:13 +08:00
mahe
56d6401cda 调整im样式,过滤数据 2023-02-03 10:22:06 +08:00
夜良king
36794613cd Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-03 10:06:50 +08:00
夜良king
cfd2529caf 修改错别字 2023-02-03 10:06:22 +08:00
chc
f0628c5995 失效商品导致页面不展示 2023-02-02 18:04:49 +08:00
chc
4780ae5b18 核销自提订单 2023-02-02 17:06:32 +08:00
chc
5a93abb946 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-01 15:03:51 +08:00
chc
d371fd0146 IM功能 2023-02-01 15:03:40 +08:00
misworga831
c850a27cca fix: 🐛 修复规格值为空后,规格错乱问题 2023-02-01 10:18:38 +08:00
chc
a97ed0c3f6 接口问题修改 2023-01-31 17:42:36 +08:00
15386982806
3c65de9912 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-01-31 17:07:36 +08:00
15386982806
c6e1cc060a 重置用户密码 2023-01-31 17:07:28 +08:00
chc
9df377677b 开启面单按钮问题 2023-01-19 17:26:31 +08:00
chc
69caf86c7e 下载问题 2023-01-19 17:25:07 +08:00
15386982806
c86d863f1d 修改积分商品回显问题 2023-01-18 11:28:46 +08:00
c130597e95 im商家接口问题 2023-01-13 18:16:14 +08:00
5d16a7a80e 转换表情 2023-01-13 10:53:39 +08:00
bad9f9109c im当前浏览发送问题 2023-01-12 17:10:34 +08:00
7e33598b8e 宽度,表情 2023-01-12 14:34:38 +08:00
lemon橪
83f145767e refactor: 修改config API_DEV为线上掩饰站点api 2023-01-12 11:07:25 +08:00
8ea3843d61 足迹 2023-01-11 18:24:18 +08:00
paulGao
29cc6002cd Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-01-11 11:29:34 +08:00
paulGao
db33b34f18 feat: 增加优惠券领取详情和优化pc端跳转使用优惠券页面 2023-01-11 11:28:28 +08:00
73acb0bc09 跳转样式问题 2023-01-10 18:44:39 +08:00
夜良king
94ab061cc8 config 修改 2023-01-10 18:32:26 +08:00
夜良king
4f243afb63 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-01-10 18:27:52 +08:00
夜良king
efd3ed26df 自动发券模块(管理端加前端展示) 2023-01-10 18:27:37 +08:00
Chopper711
e7d1664673 Merge branch 'lili_self' 2023-01-09 18:47:48 +08:00
夜良king
7b7310ed75 优惠券详情 2023-01-06 10:33:10 +08:00
夜良king
c8649caf1a 商家端 规格修改 2023-01-05 10:43:37 +08:00
aaa2deef85 pc发布商品不显示IM 2022-12-30 18:40:50 +08:00
夜良king
b0ed6635e5 修改发布商品模块 商品描述 请求数据删除 2022-12-30 17:24:41 +08:00
0dc3124bba 订单列表发送 2022-12-29 18:20:06 +08:00
1135c1fbc3 滚动加载样式 2022-12-28 18:32:48 +08:00
779f6e4fa1 滚动加载样式 2022-12-28 18:31:26 +08:00
chc
f4bf4dc060 展示问题 2022-12-28 18:23:23 +08:00
84d3dd247d 滚动请求 2022-12-28 14:54:57 +08:00
61c44af5a0 ds 2022-12-28 11:25:40 +08:00
e8b7a85140 聊天 2022-12-28 11:23:46 +08:00
chc
aa4dbc1bbd 商品信息展示修改 2022-12-28 11:22:54 +08:00
3881370b6e IM 2022-12-28 10:08:51 +08:00
0fa93d545e 删除IM文件夹 2022-12-28 10:08:18 +08:00
chc
a92c213b64 IM功能 2022-12-28 09:22:05 +08:00
lemon橪
fcc9a9f8c5 fix: 🐛 解决秒杀商品中分页错误,以及删除看到的冗余代码 2022-12-26 18:03:09 +08:00
夜良king
0ffd0f0c29 goolist 虚拟/实物展示问题 2022-12-26 11:48:10 +08:00
夜良king
3afad96b8f 楼层 选择链接模板修改 2022-12-23 15:31:59 +08:00
chc
d9e1a4a491 站点图标与logo分开添加与展示 2022-12-22 15:17:13 +08:00
chc
2e4246e63b 手机号搜索消失 2022-12-19 10:19:06 +08:00
Chopper711
235d582ae2 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-12-07 17:01:28 +08:00
c34e2ad6ad 楼层代码注释 2022-12-07 17:00:37 +08:00
Chopper711
78b8a002e9 楼层装修问题处理 2022-12-07 16:58:51 +08:00
夜良king
29091739d4 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-12-07 10:45:25 +08:00
夜良king
aa05ee1165 去除店铺结算已审核 2022-12-07 10:45:12 +08:00
学习很差啦
2446c28b20 补充提交api地址错误问题 2022-12-07 10:42:47 +08:00
学习很差啦
8378182730 解决合并冲突 2022-12-07 10:37:24 +08:00
学习很差啦
d84250ab88 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-12-07 10:36:17 +08:00
学习很差啦
5218388eff 删除富文本中不用的插件,新增商品上传提示 2022-12-07 10:36:15 +08:00
夜良king
984bc4b635 去除 店铺 申请中状态 2022-12-07 09:58:31 +08:00
paulGao
acc9a0b88a 补全缺失接口 2022-12-06 16:42:32 +08:00
paulGao
a31c7a5ad0 fix: 修复移动端楼层装修外部链接没有地方填写问题 2022-12-06 16:32:29 +08:00
paulGao
f0882793e4 fix: 🐛 优化批发商品,起批量提示 2022-11-29 15:00:45 +08:00
paulGao
053e5ce062 fix: 🐛 优化批发商品购买数量不能低于起批量 2022-11-29 11:40:37 +08:00
mahe
34ef7e555a 修改优惠券的宽度,浏览记录分页与评论超出问题 2022-11-28 09:51:47 +08:00
chc
34165127f0 im 2022-11-23 18:43:53 +08:00
学习很差啦
4d347df505 fix: 🐛 修改 商家端楼层装中 intro 和 mobileIntro 可能存在转义符导致json出错问题 2022-11-23 14:44:46 +08:00
chc
830154371a 自提 2022-11-22 17:17:37 +08:00
学习很差啦
69c2c4c5c2 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-11-22 15:17:14 +08:00
学习很差啦
a5d067943d fix: 🐛 商家端楼层装修选择图片问题修改,以及删除商家端搜索模块 2022-11-22 15:17:09 +08:00
Chopper711
1e190e3a88 update LICENSE.
Signed-off-by: Chopper711 <1814994716@qq.com>
2022-11-21 03:23:34 +00:00
paulGao
b042bd6052 增加可链接外部页面 2022-11-18 10:13:28 +08:00
chc
3861881996 行高问题 2022-10-28 11:27:21 +08:00
chc
405bb4a216 Merge remote-tracking branch 'origin/master' 2022-10-28 09:44:47 +08:00
chc
c382f015f4 移动装修分页无效和pc装修分页样式 2022-10-28 09:44:24 +08:00
夜良king
c083a58f30 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-10-26 16:34:46 +08:00
夜良king
a78d637468 楼层装修 2022-10-26 16:34:34 +08:00
paulGao
0cb32caa3e 优化秒杀页面样式问题 2022-10-26 15:42:08 +08:00
8095aa0d8e 登陆页header footer 警告 2022-10-26 11:13:43 +08:00
chc
60117f51b3 商家跳转404 2022-10-26 08:57:31 +08:00
chc
b51a5e6deb 店铺 2022-10-25 19:22:52 +08:00
chc
b9869053c2 wapList 2022-10-25 18:50:54 +08:00
chc
f1753babbe 跳转问题 2022-10-25 18:35:48 +08:00
chc
05f8defe56 配置文件 2022-10-25 17:32:49 +08:00
chc
af115c45cc 配置文件 2022-10-25 17:32:09 +08:00
学习很差啦
532fc8b2dd fix: 🐛 修改演示站点多展示专题问题 2022-10-24 11:10:33 +08:00
chc
fa8aa633bf v4.2.5 2022-10-21 11:22:56 +08:00
chc
dca8ee512f 导入提示 2022-10-20 17:30:31 +08:00
学习很差啦
50c3fd6af8 docs: 📝 更改楼层装修中商品分类模块的表述内容 2022-10-19 14:56:19 +08:00
学习很差啦
bb93be2fb1 feat: 楼层装修新增绑定分类功能 2022-10-19 11:56:08 +08:00
paulGao
17a4131bf1 fix: 修复新增首个规格项的规格值时。规格列表显示错乱问题 2022-10-14 15:43:39 +08:00
eb9c999a16 修改分类树形 2022-10-13 10:36:37 +08:00
学习很差啦
a70c741990 feat: 🎨 新增加专题功能 2022-10-11 17:24:37 +08:00
学习很差啦
6007dc57d5 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-10-09 18:33:32 +08:00
学习很差啦
7dfdb4f685 fix: 🐛 修改发现的代码bug 2022-10-09 18:33:30 +08:00
paulGao
0cc27f4e60 style: 优化秒杀页面显示效果 2022-10-09 16:04:25 +08:00
paulGao
163f9f26c2 fix: 🐛 修复管理端分类绑定规格无数据问题 2022-09-27 10:38:33 +08:00
学习很差啦
68ba97e590 fix: 🐛 修改扫码登录等待时间 2022-09-23 15:24:31 +08:00
学习很差啦
d36c2bdc3d fix: 🐛 解决部门中出现的bug
部门中排序代码导致页面报错不能操作
2022-09-22 09:52:42 +08:00
学习很差啦
72c64f017f Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-09-22 09:14:05 +08:00
学习很差啦
0f28a7f16c 提交微信登录不能登录问题 2022-09-22 09:14:03 +08:00
paulGao
581a1f75e1 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-09-21 16:29:36 +08:00
paulGao
a727001daf 适配统一接口返回值 2022-09-21 16:29:28 +08:00
学习很差啦
2f9754b2a5 优化pc二维码刷新 2022-09-21 11:07:21 +08:00
paulGao
a11452a430 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-09-20 19:08:16 +08:00
paulGao
7d90846960 修复添加直播商品报错问题 2022-09-20 19:07:59 +08:00
lemon橪
23e456d265 feat: 基于 @xiaochangbai 老哥的代码进行了一点样式优化
看到老哥有引入其他的qr插件,在项目里面本身自带了一个,稍微改了一下部分样式

https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp/pulls/3
2022-09-16 16:37:38 +08:00
paulGao
cddd94b9e5 fix: 🐛 商品编辑时无商品类型问题 2022-09-16 10:01:08 +08:00
paulGao
685ec5f679 fix: 🐛 修复热区弹框优先级问题。优化编辑商品时,可修改分类与商品类型 2022-09-09 19:40:01 +08:00
paulGao
0933f1942e fix: 🐛 修复管理端下架商品传递undefined问题,优化秒杀展示 2022-09-09 14:30:15 +08:00
paulGao
2792df38c0 修复店铺分类可能为undefined问题 2022-09-07 17:58:14 +08:00
paulGao
62d8d121c6 优化热区展示 2022-09-07 16:38:41 +08:00
paulGao
b99db4c673 修复热区移动bug 2022-09-07 15:17:34 +08:00
paulGao
3639804d1b Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-09-06 19:45:13 +08:00
paulGao
f6ff0b8a12 管理端楼层装修增加热区功能 2022-09-06 19:45:02 +08:00
Chopper
a345586b25 功能测试与修改 2022-09-05 14:35:01 +08:00
学习很差啦
3d0ba486df Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-09-05 14:22:00 +08:00
学习很差啦
4651d74b7b 优化部分操作流程,修改售后显示问题,优化计量单位 商品规格添加重复问题 2022-09-05 14:21:58 +08:00
paulGao
55aa57d812 优化管理端代码结构 2022-09-02 17:51:33 +08:00
paulGao
36c4584970 修复编辑店铺时,步骤按钮不正确问题 2022-09-02 16:44:55 +08:00
paulGao
96b6565272 优化商品规格编辑 2022-09-02 11:12:02 +08:00
paulGao
8b22b73f3d 优化pc端商品详情页的优惠券展示 2022-09-02 11:00:01 +08:00
fengtianyangyang
ba91d7c26d 合并 2022-09-02 10:46:41 +08:00
paulGao
fd847944b7 还原routes 2022-09-02 10:42:12 +08:00
mahe
4ea142ea08 增加楼层专题 2022-09-02 09:30:57 +08:00
chc
2aceffc112 电子面单页面,导入商品 2022-09-01 18:52:11 +08:00
paulGao
ed59b389a5 improve code 2022-09-01 18:30:51 +08:00
paulGao
2b433cf1e8 merge code 2022-09-01 18:20:22 +08:00
paulGao
41ea3b7a88 重构商品规格编辑部分 2022-09-01 17:36:24 +08:00
paulGao
f5a452c124 重构商品规格编辑部分 2022-09-01 17:34:41 +08:00
chc
9ce3a5e916 电子面单前端页面 2022-08-31 17:27:09 +08:00
学习很差啦
248c4031c0 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-08-30 09:06:29 +08:00
学习很差啦
8715066f7c 修改部分页面展示问题 2022-08-30 09:06:27 +08:00
Chopper
5dc5cce96b 店铺详情多一个空页面问题处理 2022-08-29 16:17:25 +08:00
paulGao
f58500c4e3 优化编辑规格 2022-08-26 19:56:25 +08:00
paulGao
2041eca723 修复删除规格项问题 2022-08-25 14:05:01 +08:00
学习很差啦
db6e47fa04 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-08-18 12:44:54 +08:00
学习很差啦
116c168ed7 修改演示站点发现的问题 2022-08-18 12:44:53 +08:00
paulGao
8ff6c0414a 优化买家端订单详情页,优化卖家端、平台端优惠券显示。优化结算页无效商品提示。 2022-08-12 19:24:41 +08:00
Chopper
aaf1c172de 秒杀销售百分比展示问题 2022-08-12 10:06:45 +08:00
学习很差啦
f7c310b126 修改楼层装修判断的语法 2022-08-12 09:11:07 +08:00
paulGao
ab0db38eb2 修复管理端楼层装修符号错误问题 2022-08-11 22:06:21 +08:00
paulGao
283f4d6afa 修复订单列表查询订单类型查询无效问题 2022-08-11 20:57:30 +08:00
chc
db51df89f7 热词统计增加下方表格 2022-08-11 10:32:26 +08:00
学习很差啦
b77b4c0ef8 解决楼层装修 移动端发现的小问题 2022-08-10 19:06:19 +08:00
学习很差啦
dd67687d3a 发现 并解决了一个 移动端楼层装修拖动促销活动时候出现的bug 2022-08-10 17:54:17 +08:00
学习很差啦
61f5dde015 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-08-04 14:40:55 +08:00
学习很差啦
0355dcddde 新增商家发布商品同步描述按钮 2022-08-04 14:40:50 +08:00
Chopper
1d6a61d5d9 店铺修改密码接口调整 2022-08-04 11:19:22 +08:00
学习很差啦
bf393181b8 补充提交 2022-08-03 18:32:16 +08:00
学习很差啦
79ff1cecb4 修改楼层装修判断失误导致误出现Bug 2022-08-03 18:31:00 +08:00
学习很差啦
0d21c87816 修改发现的bug 2022-08-03 15:18:06 +08:00
学习很差啦
c281b0a867 优化退款消息提示 2022-08-03 11:20:07 +08:00
OceansDeep
bd322709f3 修复多次选择积分商品信息有误 2022-07-28 07:42:06 +00:00
Chopper711
bc4f9527d0 !26 去除router.js中重复的路由
Merge pull request !26 from master
2022-07-20 01:09:27 +00:00
胡程
0b5e7c40b0 去掉fix:router.js中重复路由 2022-07-19 17:51:22 +08:00
学习很差啦
8d5f4db494 修改pc足迹以及nav显示遮罩问题 2022-07-19 16:28:40 +08:00
lemon橪
4ecb41e9a2 merge paulGao commit 2022-07-14 10:38:52 +08:00
lemon橪
dba167738b 优化商家对账时点击切换可能出现的问题 2022-07-14 10:38:07 +08:00
OceansDeep
c1853fd4e0 !25 修复pc端楼层装修外部链接无法填写
Merge pull request !25 from OceansDeep/dev-gl
2022-07-13 13:05:58 +00:00
paulGao
75ef173c64 修复pc端楼层装修外部链接无法填写 2022-07-13 20:00:41 +08:00
Chopper
752c1086a0 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-07-13 19:06:42 +08:00
Chopper
6c5994202b 增加minio配置前端访问地址 2022-07-13 19:06:28 +08:00
lemon橪
00e229e7f4 新增退款失败错误提示 2022-07-13 18:12:30 +08:00
lemon橪
4674cfae37 merge 2022-07-13 09:38:58 +08:00
lemon橪
eeadfc1db9 新增移动端公告横纵向设置,我的足迹以及秒杀活动展示优化 2022-07-13 09:37:59 +08:00
Chopper711
34788d800e 足迹未能正常展示问题处理 2022-07-13 01:15:42 +00:00
lemon橪
954cd1cda9 修改分销中展示问题 2022-07-08 18:52:03 +08:00
lemon橪
f3ef286aa7 修改分销订单显示问题 2022-07-08 14:48:23 +08:00
lemon橪
7874931b1f 修改win上商品详情展示优化 2022-07-08 11:48:12 +08:00
lemon橪
c3b3e7bb61 合并master 2022-07-08 11:13:11 +08:00
lemon橪
12839eee8d 解决秒杀活动可能在首页出现的bug 2022-07-08 11:12:13 +08:00
Chopper
601a2e8d33 PC端分销用户绑定关系接口问题处理 2022-07-08 09:34:45 +08:00
mhhhh
a3fe3a3743 修改隐私协议的判断 2022-07-07 18:25:27 +08:00
lemon橪
86fa39d7af 合并master 2022-07-06 17:33:08 +08:00
lemon橪
a785718715 修改回收站不能修改用户信息问题 2022-07-06 17:31:12 +08:00
OceansDeep
d4eb17e573 !24 优化逻辑
Merge pull request !24 from OceansDeep/dev-gl
2022-07-06 08:43:21 +00:00
paulGao
994b700892 优化逻辑 2022-07-06 16:18:09 +08:00
mhhhh
317bf1cd47 增加商家后台打印发货单 2022-07-06 15:18:56 +08:00
lemon橪
8327639c23 优化看到的富文本大小问题 2022-07-05 18:27:01 +08:00
lemon橪
c1830df1a2 修改优化 2022-07-05 18:24:14 +08:00
lemon橪
590ceaf641 合并merge 2022-07-05 18:04:22 +08:00
lemon橪
c7b739e546 更换editor,可支持拖拽式上传 2022-07-05 18:04:04 +08:00
OceansDeep
42db858d61 !23 优化订单投诉显示
Merge pull request !23 from OceansDeep/dev-gl
2022-07-05 01:58:13 +00:00
paulGao
85349a197f 优化订单投诉显示 2022-07-04 18:36:05 +08:00
lemon橪
8ef3510c4b 修改pc显示商品详情图片问题 2022-07-04 18:33:40 +08:00
mhhhh
8d6fa2f19f 去掉隐私协议中的排序,分类 2022-06-30 10:25:38 +08:00
Chopper711
af975b9f46 update README.md. 2022-06-23 01:45:56 +00:00
OceansDeep
3de928ee14 !22 优化管理端促销相关文本,操作条件;优化k8s部署提交
Merge pull request !22 from OceansDeep/dev-gl
2022-06-22 02:56:27 +00:00
paulGao
0a5563e5e2 优化管理端促销相关文本,操作条件 2022-06-22 10:55:17 +08:00
paulGao
f4b7068cd6 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2022-06-22 10:20:06 +08:00
lemon橪
2cb6f04465 更改统计图关键字 2022-06-21 16:57:32 +08:00
lemon橪
037a307ed1 pc端分销问题 2022-06-21 16:51:39 +08:00
lemon橪
cd81a6afb1 合并master 2022-06-17 18:50:54 +08:00
lemon橪
f930d73a6a 商品选择器显示零售商品批发商品 2022-06-17 18:50:30 +08:00
paulGao
23bae9efd5 优化k8s部署提交 2022-06-16 14:08:46 +08:00
OceansDeep
2880c21a26 !21 优化代码
Merge pull request !21 from OceansDeep/dev-gl
2022-06-16 01:24:18 +00:00
paulGao
274ac3f155 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2022-06-16 09:21:29 +08:00
paulGao
c85d488de4 优化代码 2022-06-16 09:21:14 +08:00
lemon橪
92d58ea7e5 合并paulGao代码 2022-06-15 18:49:34 +08:00
lemon橪
9a3d202524 优化统计图显示 2022-06-15 18:48:43 +08:00
OceansDeep
ba71eaeaaf !20 适配优化的sql,将平台id改为0
Merge pull request !20 from OceansDeep/dev-gl
2022-06-08 08:16:55 +00:00
paulGao
273fdf2e84 适配优化的sql,将平台id改为0 2022-06-08 15:40:23 +08:00
lemon橪
59cfa0efb0 合并master 更改并提交内容 2022-06-07 10:22:42 +08:00
lemon橪
14d720beed 商家端刷新token 路径修改 2022-06-07 10:22:11 +08:00
Chopper
2dcfacd431 适配minio 2022-06-07 09:37:53 +08:00
mhhhh
71690cfd8f 修改title闪现undefined 2022-06-06 16:08:58 +08:00
Chopper
d2c2da25b4 消费积分设置问题 2022-06-02 09:29:19 +08:00
mhhhh
c3c29af8c7 吧配送模版费用为0的限制去掉 2022-06-01 13:56:29 +08:00
mhhhh
e5f9f81ef7 解决冲突 2022-06-01 10:26:41 +08:00
mhhhh
0c0c903529 修改商家logo没有更换的问题 2022-06-01 10:13:53 +08:00
OceansDeep
115fa87ff2 !19 管理端商品详情增加批发商品信息展示
Merge pull request !19 from OceansDeep/dev-gl
2022-06-01 01:15:27 +00:00
paulGao
bb40364aed 管理端商品详情增加批发商品信息展示 2022-06-01 09:04:36 +08:00
lemon橪
0e921de6c3 合并master 2022-05-31 11:17:29 +08:00
lemon橪
58eeed4bbd 解决商品分类控件-添加一个品种后重复添加问题 2022-05-31 11:17:05 +08:00
mhhhh
21289f5a92 修改logo缓存 2022-05-31 11:04:40 +08:00
mhhhh
0aec486291 修改logo接口缓存 2022-05-31 09:51:43 +08:00
OceansDeep
5c34245ba4 !18 修复编辑sku时,单独编辑的sku图片没有保存问题
Merge pull request !18 from OceansDeep/dev-gl
2022-05-30 06:45:42 +00:00
paulGao
3d0a202cbe 修复编辑sku时,单独编辑的sku图片没有保存问题 2022-05-30 14:44:36 +08:00
OceansDeep
66143deb0d !17 增加批发商品的标识
Merge pull request !17 from OceansDeep/dev-gl
2022-05-27 10:28:17 +00:00
paulGao
2111020f62 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2022-05-27 18:27:20 +08:00
lemon橪
160658cfb6 批发商品部分 2022-05-27 18:20:42 +08:00
lemon橪
8a7f9b2487 批量商品价格展示 2022-05-27 18:16:12 +08:00
paulGao
85061ed2f8 增加批发商品的标识 2022-05-27 18:12:19 +08:00
paulGao
3405cf68bb 优化生成价格区间 2022-05-27 16:28:26 +08:00
paulGao
ebacb58049 商品搜索优化 2022-05-27 16:07:54 +08:00
paulGao
8873f575db 商品搜索和列表显示增加销售模式 2022-05-27 15:49:27 +08:00
paulGao
994ef217ac add wholesale of sale model 2022-05-27 15:23:10 +08:00
paulGao
1bda042bc9 add wholesale of sale model 2022-05-27 15:22:36 +08:00
lemon橪
e97dbe1c90 批量价格显示的样式 2022-05-27 10:28:37 +08:00
lemon橪
f19071542a 添加vuex cdn 2022-05-24 14:21:10 +08:00
lemon橪
50836e0aa3 删除已发现的冗余内容 2022-05-23 14:17:36 +08:00
lemon橪
1b4c05f70b 修改高德地图key更新此commit 之前请务必确认一下创建的高德key日期。修改部分方法名称 2022-05-20 16:40:09 +08:00
lemon橪
32dffe96ed 修改axios为19.2链接 2022-05-20 15:42:23 +08:00
lemon橪
e2df32d906 补充提交 2022-05-20 15:11:26 +08:00
lemon橪
9eab3b261e 合并seller 2022-05-20 14:42:43 +08:00
lemon橪
1e40e2d557 修改axios版本 2022-05-20 14:42:11 +08:00
OceansDeep
256ada983b !16 优化商品sku编辑,不在清空数据。commit v1
Merge pull request !16 from OceansDeep/dev-gl
2022-05-19 09:32:57 +00:00
paulGao
cd0c90ace8 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2022-05-19 17:30:32 +08:00
paulGao
913b96af5a 优化商品sku编辑,不在清空数据。commit v1 2022-05-19 17:22:22 +08:00
lemon橪
a3f5212bbc 删除被墙的cdn 启用pickmall cdn加载资源 2022-05-19 15:51:32 +08:00
lemon橪
9d7a06e867 优化管理端代办事项 2022-05-19 09:13:16 +08:00
mhhhh
48f3c38fbd 修改获取logo接口地址 2022-05-18 21:53:32 +08:00
lemon橪
706bab7eff 修改buyer端发现的问题 2022-05-17 17:27:19 +08:00
mhhhh
b6fa3175c6 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-05-17 09:19:58 +08:00
mhhhh
3cd57a6915 隐私协议菜单,店铺详情店铺详情非空判断,自定义logo 2022-05-17 09:19:36 +08:00
lemon橪
d433ff02cb 首页历史统计新增 历史记录对比 2022-05-13 14:17:33 +08:00
lemon橪
68d2c25ff5 合并提交 2022-05-12 15:46:55 +08:00
lemon橪
9ccf51dd5c 优化商品发布规格丢失问题 新增修改删除规格值不丢失 2022-05-12 15:36:59 +08:00
mhhhh
727d240715 git stashMerge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-05-12 10:44:17 +08:00
mhhhh
1f4448ba08 增加打印发货单功能,隐藏配送信息,删除腾讯云智能客服 2022-05-12 10:33:02 +08:00
OceansDeep
6064c168bf !15 修复秒杀已售数量不正确问题
Merge pull request !15 from OceansDeep/dev-gl
2022-05-12 01:10:44 +00:00
fengtianyangyang
479470832d 结算单修改 2022-05-11 19:18:04 +08:00
paulGao
71fa00c267 修复秒杀已售数量不正确问题 2022-05-11 16:11:59 +08:00
OceansDeep
c1331e8ccf !14 add build.sh
Merge pull request !14 from OceansDeep/dev-gl
2022-05-10 07:58:11 +00:00
paulGao
8a2ec77c84 add build.sh 2022-05-10 15:57:30 +08:00
lemon橪
b197cda548 合并分支 2022-05-09 18:38:48 +08:00
lemon橪
c83eddd62e 优化订单统计 2022-05-09 18:37:53 +08:00
OceansDeep
46168a037d !13 修复秒杀活动页已售数量问题
Merge pull request !13 from OceansDeep/dev-gl
2022-05-09 07:11:47 +00:00
paulGao
cbb2365ae8 修复秒杀活动页已售数量问题 2022-05-09 14:32:00 +08:00
OceansDeep
ec3093246a !12 修复bug
Merge pull request !12 from OceansDeep/dev-gl
2022-05-05 01:32:18 +00:00
paulGao
670ba74044 修复bug 2022-05-05 09:30:42 +08:00
学习很差啦
84e0803558 !9 修复查看满额活动详细后点击返回键找不到路由返回白屏问题
Merge pull request !9 from Assure/master 感谢Assure发现的返回白屏问题 此处接受并提交
2022-04-28 08:19:02 +00:00
ran
1691f8244f 修改账户昵称过长问题以及viper 在pr上提的Bug 2022-04-28 16:13:36 +08:00
Chopper
24f4a36082 流水信息退款单中展示更多细节 2022-04-26 11:14:57 +08:00
胡程
7cf7123dd2 fix:修复查看满额活动详细后点击返回键找不到路由返回白屏问题 2022-04-26 10:05:11 +08:00
Chopper
37064141c2 Merge branch 'dev-lmr'
# Conflicts:
#	manager/src/views/page/article-manage/hotWords.vue
2022-04-25 19:00:25 +08:00
Chopper
5bd66b9ec6 还原接口api 2022-04-25 18:16:06 +08:00
Chopper
9e34b44165 热词功能补充提交 2022-04-25 18:09:49 +08:00
Chopper
8d9a64d84b 热词功能完善 2022-04-25 18:08:29 +08:00
yeliang-king
92aafe3031 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-04-25 14:50:11 +08:00
yeliang-king
81f4f4a742 接口更改 2022-04-25 14:49:57 +08:00
lemon橪
9b14cd633e 热词部分代码 2022-04-25 09:18:31 +08:00
OceansDeep
118aaaf6fb !8 修复结算页中有无效商品店铺显示问题。优化购物车页。管理端增加搜索热词全删除
Merge pull request !8 from OceansDeep/dev-gl
2022-04-22 08:50:00 +00:00
paulGao
0635dd38a2 修复结算页中有无效商品店铺显示问题。优化购物车页。管理端增加搜索热词全删除 2022-04-22 16:48:43 +08:00
fengtianyangyang
1d648bbad7 结算单页面修改 2022-04-22 09:04:20 +08:00
OceansDeep
5dfcc2482c !7 优化楼层装修,修复结算页显示失效商品问题
Merge pull request !7 from OceansDeep/dev-gl
2022-04-21 08:27:40 +00:00
paulGao
7ff51b5e53 修复结算页显示失效商品问题 2022-04-21 16:11:11 +08:00
paulGao
c4168c9a2b 优惠移动端楼层装修 2022-04-21 14:57:33 +08:00
fengtianyangyang
7312b3ec3f 店铺结算单修改 2022-04-18 19:10:46 +08:00
fengtianyangyang
c09e25974f 结算单修改 2022-04-18 19:10:10 +08:00
paulGao
744567e8de 优化楼层装修 2022-04-18 09:49:09 +08:00
paulGao
4156d51d78 优化楼层装修 2022-04-18 09:38:52 +08:00
yeliang-king
0faae31b2e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-04-18 09:18:08 +08:00
yeliang-king
79a719e7ff 取消横向滚动条 2022-04-18 09:15:08 +08:00
lemon橪
0d09920314 修复楼层装修选择链接时可能出现的bug 2022-04-18 09:01:09 +08:00
lemon橪
d641123987 新增商家商品模版显示分页显示 2022-04-13 14:34:34 +08:00
lemon橪
ce871a804c 合并提交 2022-04-13 10:42:05 +08:00
lemon橪
36fd58a446 解决短信模版页面分页条件不显示问题 2022-04-13 10:40:45 +08:00
pikachu
9e0a681e01 buyer端的导航条下拉 2022-04-12 18:03:31 +08:00
lemon橪
df408e640a 合并master 2022-04-08 17:31:14 +08:00
lemon橪
f365231ee7 提交高德api中更新安全密钥的提示 2022-04-08 17:29:28 +08:00
paulGao
2e8d124560 修复pc端订单详情不展示发票信息 2022-04-08 15:32:18 +08:00
paulGao
1e8279c849 improve code 2022-03-31 09:26:24 +08:00
paulGao
48668fd2d4 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-03-29 17:58:47 +08:00
paulGao
ee5539fb0f 修复pc搜索商品分类参数无效问题 2022-03-29 17:57:42 +08:00
pikachu
97d88abf80 溢出 滚动显示 2022-03-28 18:21:44 +08:00
pikachu
9a33db76e9 楼层装修 问题 2022-03-22 10:14:31 +08:00
Chopper
65aa9d0a9f Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-03-18 17:41:33 +08:00
Chopper
baaeef0978 管理端无法修改会员信息问题处理 2022-03-18 17:41:29 +08:00
lemon橪
e27070e089 优化一个上传组件控制台报错bug 以及 buyer端楼层装修显示 2022-03-17 16:35:10 +08:00
pikachu
2ea2723aed 样式 问题 2022-03-16 11:31:05 +08:00
pikachu
5188bba5b1 会员流量报表 名称修改 2022-03-15 11:46:49 +08:00
lemon橪
33bb16a0d3 修改菜单栏重复点击console会显示bug , 以及行政地区不回显问题 2022-03-04 15:12:37 +08:00
夜良king
87f6b81e37 合并 2022-03-04 02:31:56 +08:00
lemon橪
3b4f0b8c9d 修改店铺 2022-03-03 11:33:53 +08:00
lemon橪
3b540b1aac 提交补漏 2022-03-03 11:31:23 +08:00
lemon橪
378ac39315 商家楼层装修 2022-03-03 11:26:50 +08:00
lemon橪
2dac958227 更改买家提交售后显示的价格 2022-03-02 15:21:28 +08:00
lemon橪
c879cb2af0 优化订单详情中显示的价格问题 2022-03-02 15:02:18 +08:00
夜良king
32336decc6 动态导航 2022-02-27 18:24:35 +08:00
夜良king
7cd64553ab chongtu 2022-02-26 15:35:04 +08:00
夜良king
6e737a3fa7 解决冲突 2022-02-26 15:27:10 +08:00
fengtianyangyang
25b403cde9 冲突文件 2022-02-26 15:05:51 +08:00
fengtianyangyang
535a36c378 ‘合并 2022-02-23 21:24:18 +08:00
fengtianyangyang
7b30bc42d7 添加 2022-02-23 20:56:00 +08:00
lemon橪
403ae0a963 修改管理端会员详情缺少前缀问题 2022-02-23 16:16:29 +08:00
lemon橪
800b91d406 修改会员信息少一个前缀问题 2022-02-23 16:15:37 +08:00
Chopper
bf92b0804e 修改会员API路径调整导致无法修改会员信息问题处理 2022-02-23 16:00:37 +08:00
Chopper
7e8ff778f9 商家增加im按钮 2022-02-22 01:32:36 +08:00
Chopper
31f438edfa IM更新 2022-02-21 22:45:39 +08:00
zhenghao
a7ed6454af clerk 2022-02-17 16:37:11 +08:00
夜良king
12ea0c2b84 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-02-17 10:44:14 +08:00
paulGao
44086e8bf4 修改api 2022-02-17 15:32:56 +08:00
paulGao
b740a6f906 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-02-17 14:54:30 +08:00
paulGao
7376d4d890 修复api错误 2022-02-17 14:54:18 +08:00
夜良king
f9d09365ea 部分bug 2022-02-17 10:43:46 +08:00
夜良king
81297db7a8 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-02-16 11:37:50 +08:00
夜良king
b5ca94ab98 楼层装修 分页 2022-02-16 11:37:00 +08:00
lemon橪
a220339fd6 合并内容 2022-02-16 11:26:01 +08:00
lemon橪
0994b6659a 合并部分代码 回滚规格 2022-02-16 11:22:35 +08:00
夜良king
c4037a346d 修改样式 和 优化一些 功能 2022-02-16 09:25:01 +08:00
lemon橪
45a6e76d4a 需改pc样式上的bug 2022-02-15 16:54:36 +08:00
paulGao
aee67ec317 修改版本号 2022-02-15 14:08:04 +08:00
夜良king
51610546c4 重新修改config 2022-02-15 10:17:19 +08:00
夜良king
e8e7d27c0d Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-02-15 10:12:53 +08:00
夜良king
166e889b6f commit 2022-02-15 10:12:49 +08:00
paulGao
db95647cd8 修复管理端刷新tokenapi错误问题 2022-02-15 10:03:14 +08:00
lemon橪
db13814156 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-02-14 17:10:45 +08:00
lemon橪
5cf3956bc8 取消cdn加载 2022-02-14 17:10:40 +08:00
OceansDeep
329e6df722 !6 适配接口路径修改
Merge pull request !6 from OceansDeep/fengtianyangyang
2022-02-14 07:51:16 +00:00
paulGao
8023852b3c 升级版本号 2022-02-14 15:35:01 +08:00
paulGao
228935034d 适配api 2022-02-14 14:21:37 +08:00
paulGao
acff55dc65 适配修改后的api 2022-02-12 15:20:36 +08:00
paulGao
61a9110c51 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into fengtianyangyang 2022-02-11 16:44:27 +08:00
paulGao
3a3e14e0a7 适配微服务 2022-02-10 18:57:36 +08:00
lemon橪
6ba767419e 新增文库详情页面,转门为审核使用 2022-02-10 17:13:26 +08:00
lemon橪
925365018b 优化商家发布商品丢失规格问题,修改开启cdn 2022-02-10 14:26:53 +08:00
lemon橪
5960df31bd 合并并提交修改 2022-02-09 20:50:09 +08:00
lemon橪
21f9fd92e2 取消cdn加载 2022-02-09 20:49:49 +08:00
paulGao
9765310136 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into fengtianyangyang 2022-02-09 10:32:50 +08:00
paulGao
51cde2dd0d fix bugs 2022-01-27 14:58:37 +08:00
fengtianyangyang
3311568e50 修改路径 2022-01-25 19:08:47 +08:00
fengtianyangyang
e5918b041a 路径修改 2022-01-25 12:01:40 +08:00
paulGao
f46330ecf0 Merge branch 'fengtianyangyang' of gitee.com:beijing_hongye_huicheng/lilishop-ui into fengtianyangyang 2022-01-25 09:46:15 +08:00
paulGao
846e80f1fa 适配微服务版本 2022-01-25 09:46:12 +08:00
fengtianyangyang
631519d7c7 路径修改 2022-01-25 09:22:22 +08:00
paulGao
bbeb31e8a3 修复店铺和平台优惠券同时选择时,显示问题 2022-01-21 19:02:09 +08:00
paulGao
52bcf07e25 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-01-21 16:53:28 +08:00
paulGao
4d725221a5 优化店铺搜索栏 2022-01-21 16:53:16 +08:00
Chopper
c8a0619141 积分设置优化 2022-01-21 16:20:15 +08:00
fengtianyangyang
e1d7b1801d 接口修改 2022-01-21 09:14:21 +08:00
paulGao
15456ae377 修复删除会员评论,弹出框不关闭问题 2022-01-20 17:40:05 +08:00
fengtianyangyang
1c3d711298 路径修改 2022-01-20 17:21:30 +08:00
paulGao
1bee69cefb 优化管理端和卖家端登录 2022-01-17 18:00:49 +08:00
paulGao
cf740d9605 修复富文本编辑器xss过滤样式问题 2022-01-17 16:49:55 +08:00
paulGao
d2aca24d06 优化申请售后退货 2022-01-04 19:57:40 +08:00
paulGao
6e042c4b78 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-01-04 09:21:03 +08:00
paulGao
1afd1704ab 修复pc显示促销价格问题 2022-01-04 09:21:00 +08:00
夜良king
d5f81fe5d8 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-31 18:23:05 +08:00
夜良king
fada0a735f 修改样式 和查看虚拟实物 2021-12-31 18:22:30 +08:00
夜良king
35de0c031d 样式加 虚拟实物查看 2021-12-31 18:22:06 +08:00
lemon橪
2e5eefc079 提交 buyer和seller退出uuid清空bug 2021-12-30 11:16:08 +08:00
学习很差啦
1fa264b0bf !5 修复登出账号、修改密码等操作会清除uuid的bug 感谢大佬ray 提出的pr
Merge pull request !5 from master
2021-12-30 03:06:29 +00:00
zhanglei829
d2a0940858 修复登出账号、修改密码等操作会清除uuidbug 2021-12-30 10:13:34 +08:00
paulGao
4ff8eb6494 修复优化拼团 2021-12-29 19:50:24 +08:00
paulGao
8ca87cdb2a Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-28 19:54:58 +08:00
paulGao
f45b115355 修复满额活动赠送积分不显示填写积分。商品规格默认项无法退格删除。权限菜单选择某一子项获取选择全部问题 2021-12-28 19:54:40 +08:00
夜良king
7490211340 修改了小样式 按钮 2021-12-28 18:33:47 +08:00
夜良king
76d028277a buyer一些样式和一个弹框 2021-12-28 17:51:23 +08:00
lemon橪
0a0066fe5c Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-27 16:16:27 +08:00
lemon橪
4f7e38db3b 修改移动端楼层装修文章地址 2021-12-27 16:16:26 +08:00
paulGao
54dcd2d8be 修复优化促销问题 2021-12-25 18:36:15 +08:00
paulGao
6c1d7cce8d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-25 17:05:19 +08:00
lemon橪
06b090cdf6 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-25 10:59:02 +08:00
lemon橪
3653b4e7cb 优化buyer底部信息,优化购物车显示规格数量可能导致的bug 新增订单物流显示 2021-12-25 10:59:00 +08:00
paulGao
c6c890da63 修复拼团排序问题 2021-12-24 16:55:30 +08:00
paulGao
75e7bc2d9c 优化搜索热词管理 2021-12-24 16:09:57 +08:00
paulGao
649f983990 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-23 21:20:52 +08:00
paulGao
193628913a 优化店铺详情页 2021-12-23 21:20:37 +08:00
lemon橪
cb304d7d53 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-23 19:02:30 +08:00
lemon橪
4bb7bd4603 buyer端 部分颜色优化以及部分间距优化 2021-12-23 19:02:29 +08:00
paulGao
1e408eb8ae 修复管理端积分商品问题 2021-12-23 17:11:30 +08:00
Chopper
d762d18c7b 将支付应用id分别配置 2021-12-23 11:58:09 +08:00
Chopper
3622c7bb53 pc订单详情无法跳转商品详情页面问题处理 2021-12-22 18:29:29 +08:00
paulGao
1b9b2d9c95 适配字段变化 2021-12-22 10:50:43 +08:00
paulGao
0d5c60ed8c Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-21 18:59:57 +08:00
paulGao
ab2bcb515f 优化促销相关代码 2021-12-21 18:59:45 +08:00
lemon橪
b3e6eb72eb 新增npmrc以及yarnrc文件,修改config配置变成可配置的cdn加载以及端口设置 2021-12-21 16:30:54 +08:00
lemon橪
9742aaf0bc udesk 技术储备方案 2021-12-20 17:37:22 +08:00
lemon橪
bc1942c492 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-20 16:48:10 +08:00
lemon橪
44facf549a 提交udesk方案 2021-12-20 16:48:08 +08:00
eeer
09dd9861fd update seller/vue.config.js. 统一取消cdn加载 目前cdn链接的https请求挂了 2021-12-20 06:31:42 +00:00
eeer
8d3b5cf91d update manager/vue.config.js. 统一取消cdn加载 目前cdn链接的https请求挂了 2021-12-20 06:31:08 +00:00
eeer
5a90567e98 update buyer/vue.config.js. 统一取消cdn加载 目前cdn链接的https请求挂了 2021-12-20 06:30:40 +00:00
lemon橪
246ba9057f 删除最低购买金额 2021-12-16 13:41:57 +08:00
lemon橪
9eecc603db Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-13 19:27:23 +08:00
lemon橪
1fe4078115 化楼层装修中商品分类判断 2021-12-13 19:27:20 +08:00
paulGao
ef73a6fe94 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-11 13:51:33 +08:00
paulGao
edef393535 适配重构促销 2021-12-11 13:50:58 +08:00
Chopper
97e6fc79ea Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-09 20:21:49 +08:00
Chopper
0b82ae7569 商家设置坐席id代码补充 2021-12-09 20:21:46 +08:00
lemon橪
3cb0e52ca0 优化楼层装修中商品分类代码可能会出现的bug . 如果更新此版本建议同步更新uni版本更新 2021-12-09 18:32:11 +08:00
lemon橪
fd1d32d431 管理端优惠券判断优化 2021-12-03 10:00:23 +08:00
lemon橪
8c169489eb 修改统计中发现的bug 2021-11-30 17:15:37 +08:00
lemon橪
6ecb6b8055 修改部分冗余代码,新增商家端npmrc配置 后续还会新增yarnrc 2021-11-22 11:16:32 +08:00
lemon橪
515cd3ebbd 新增部分售后判断 2021-11-18 18:07:58 +08:00
lemon橪
6c6b89f512 优化buyer端配置信息完善性 2021-11-18 17:10:44 +08:00
lemon橪
1ac5dcfe25 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-11-18 14:51:46 +08:00
lemon橪
ccd5decbf7 优化楼层装修 pc端中控制台因类型转换问题导致的报错信息 2021-11-18 14:51:44 +08:00
1129 changed files with 313229 additions and 36693 deletions

7
.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
*/.vscode/
/.idea/
*/dist/
.DS_Store
node_modules/
yarn.lock
package-lock.json

View File

@@ -1,17 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</value>
</option>
<codeStyleSettings language="JavaScript">
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="0" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

View File

@@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

12
.idea/lili-shop-ui.iml generated
View File

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

9
.idea/misc.xml generated
View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="WebPackConfiguration">
<option name="mode" value="DISABLED" />
</component>
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/lili-shop-ui.iml" filepath="$PROJECT_DIR$/.idea/lili-shop-ui.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

380
.idea/workspace.xml generated
View File

@@ -1,380 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BranchesTreeState">
<expand>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
</path>
</expand>
<select />
</component>
<component name="ChangeListManager">
<list default="true" id="7e964aa0-753b-43f7-854a-2942a3e76fe4" name="默认更改列表" comment="店铺设置">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<<<<<<< HEAD
<change beforePath="$PROJECT_DIR$/buyer/src/pages/home/orderCenter/AddAddress.vue" beforeDir="false" afterPath="$PROJECT_DIR$/buyer/src/pages/home/orderCenter/AddAddress.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/manager/src/config/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/manager/src/config/index.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/seller/src/config/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/seller/src/config/index.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/seller/src/views/statistics/goods/goodsStatistics.vue" beforeDir="false" afterPath="$PROJECT_DIR$/seller/src/views/statistics/goods/goodsStatistics.vue" afterDir="false" />
=======
<change beforePath="$PROJECT_DIR$/manager/src/views/goods-unit/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/manager/src/views/goods-unit/index.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/manager/src/views/sensitiveWords/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/manager/src/views/sensitiveWords/index.vue" afterDir="false" />
>>>>>>> new-lmr
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Vue File" />
<option value="Vue Single File Component" />
<option value="JavaScript File" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectId" id="1gGPnr0TWcTGoYhLT7QHFe5MrX4" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<<<<<<< HEAD
<property name="last_opened_file_path" value="$PROJECT_DIR$/manager/src/api" />
=======
<property name="last_opened_file_path" value="$PROJECT_DIR$/manager/src/views/sys/setting-manage" />
>>>>>>> new-lmr
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
<property name="node.js.path.for.package.tslint" value="project" />
<property name="node.js.selected.package.eslint" value="(autodetect)" />
<property name="node.js.selected.package.tslint" value="(autodetect)" />
<property name="nodejs_package_manager_path" value="npm" />
<property name="settings.editor.selected.configurable" value="preferences.sourceCode.XML" />
<property name="ts.external.directory.path" value="$APPLICATION_HOME_DIR$/plugins/JavaScriptLanguage/jsLanguageServicesImpl/external" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<<<<<<< HEAD
<recent name="$PROJECT_DIR$/manager/src/api" />
<recent name="$PROJECT_DIR$/manager/src/views/my-components" />
=======
<recent name="$PROJECT_DIR$/manager/src/views/sys/setting-manage" />
>>>>>>> new-lmr
<recent name="$PROJECT_DIR$/buyer/src/components/verify" />
<recent name="$PROJECT_DIR$/buyer/src/components/change" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/buyer/src/components/change" />
<recent name="$PROJECT_DIR$/buyer/src/pages/home/memberCenter" />
<recent name="$PROJECT_DIR$/buyer/src/pages/home/orderCenter" />
<recent name="$PROJECT_DIR$/buyer/src/pages/home" />
<recent name="$PROJECT_DIR$/buyer/src/components/home/order" />
</key>
</component>
<component name="RunManager">
<configuration name="Home.vue" type="JavascriptDebugType" temporary="true" nameIsGenerated="true" uri="http://localhost:63342/lili-shop-ui/buyer/src/page/user/Home.vue" useBuiltInWebServerPort="true">
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="JavaScript Debug.Home.vue" />
</list>
</recent_temporary>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="7e964aa0-753b-43f7-854a-2942a3e76fe4" name="默认更改列表" comment="" />
<created>1597738125477</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1597738125477</updated>
<workItem from="1597738127938" duration="6268000" />
<workItem from="1597825716012" duration="3768000" />
<workItem from="1597830090678" duration="7632000" />
<workItem from="1597972262326" duration="865000" />
<workItem from="1597974893526" duration="112000" />
<workItem from="1597975021121" duration="17000" />
<workItem from="1597975216701" duration="17254000" />
<workItem from="1598184961388" duration="14000" />
<workItem from="1598233017859" duration="10307000" />
<workItem from="1598259954059" duration="2720000" />
<workItem from="1598318520176" duration="726000" />
<workItem from="1598319433942" duration="106000" />
<workItem from="1598319554477" duration="13265000" />
<workItem from="1598406300597" duration="6030000" />
<workItem from="1598422866858" duration="7787000" />
<workItem from="1598491104901" duration="37245000" />
<workItem from="1606876680167" duration="61000" />
<workItem from="1611131536390" duration="5616000" />
<workItem from="1611537245379" duration="828000" />
<workItem from="1611538362285" duration="350000" />
<workItem from="1611560515629" duration="834000" />
<workItem from="1611650051294" duration="3000" />
<workItem from="1611818003333" duration="239000" />
<workItem from="1613989205923" duration="7005000" />
<workItem from="1614076082765" duration="8973000" />
<workItem from="1614142479169" duration="2129000" />
<workItem from="1614162982178" duration="8343000" />
<workItem from="1614228135182" duration="3456000" />
<workItem from="1614248866969" duration="8023000" />
<workItem from="1614313313338" duration="83000" />
<workItem from="1614313447954" duration="211000" />
</task>
<task id="LOCAL-00001" summary="管理端页面优化">
<created>1613996019944</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1613996019944</updated>
</task>
<task id="LOCAL-00002" summary="修复修改商家地址报错问题">
<created>1613996389449</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1613996389449</updated>
</task>
<task id="LOCAL-00003" summary="去掉id">
<created>1614076370139</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1614076370139</updated>
</task>
<task id="LOCAL-00004" summary="选择物流规则不能选择物流模板">
<created>1614080544415</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1614080544415</updated>
</task>
<task id="LOCAL-00005" summary="修改查询条件样式">
<created>1614143298555</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1614143298555</updated>
</task>
<task id="LOCAL-00006" summary="修改样式">
<created>1614143902874</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1614143902874</updated>
</task>
<task id="LOCAL-00007" summary="修改更新时间为NAN">
<created>1614144541858</created>
<option name="number" value="00007" />
<option name="presentableId" value="LOCAL-00007" />
<option name="project" value="LOCAL" />
<updated>1614144541858</updated>
</task>
<task id="LOCAL-00008" summary="修复app版本无法添加和修改">
<created>1614230386509</created>
<option name="number" value="00008" />
<option name="presentableId" value="LOCAL-00008" />
<option name="project" value="LOCAL" />
<updated>1614230386509</updated>
</task>
<task id="LOCAL-00009" summary="去掉打印">
<created>1614230407722</created>
<option name="number" value="00009" />
<option name="presentableId" value="LOCAL-00009" />
<option name="project" value="LOCAL" />
<updated>1614230407722</updated>
</task>
<task id="LOCAL-00010" summary="去掉多选">
<created>1614230544808</created>
<option name="number" value="00010" />
<option name="presentableId" value="LOCAL-00010" />
<option name="project" value="LOCAL" />
<updated>1614230544808</updated>
</task>
<task id="LOCAL-00011" summary="修改消息标题宽度">
<created>1614230627881</created>
<option name="number" value="00011" />
<option name="presentableId" value="LOCAL-00011" />
<option name="project" value="LOCAL" />
<updated>1614230627881</updated>
</task>
<task id="LOCAL-00012" summary="店铺相关js提交">
<created>1614231645143</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1614231645143</updated>
</task>
<task id="LOCAL-00013" summary="店铺修改">
<created>1614231785359</created>
<option name="number" value="00013" />
<option name="presentableId" value="LOCAL-00013" />
<option name="project" value="LOCAL" />
<updated>1614231785359</updated>
</task>
<task id="LOCAL-00014" summary="优化页面">
<created>1614249105672</created>
<option name="number" value="00014" />
<option name="presentableId" value="LOCAL-00014" />
<option name="project" value="LOCAL" />
<updated>1614249105672</updated>
</task>
<task id="LOCAL-00015" summary="页面优化">
<created>1614258980903</created>
<option name="number" value="00015" />
<option name="presentableId" value="LOCAL-00015" />
<option name="project" value="LOCAL" />
<updated>1614258980903</updated>
</task>
<task id="LOCAL-00016" summary="页面优化">
<created>1614259068248</created>
<option name="number" value="00016" />
<option name="presentableId" value="LOCAL-00016" />
<option name="project" value="LOCAL" />
<updated>1614259068248</updated>
</task>
<task id="LOCAL-00017" summary="页面优化">
<created>1614313690732</created>
<option name="number" value="00017" />
<option name="presentableId" value="LOCAL-00017" />
<option name="project" value="LOCAL" />
<updated>1614313690732</updated>
</task>
<option name="localTasksCounter" value="18" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="Vcs.Log.History.Properties">
<option name="COLUMN_ID_ORDER">
<list>
<option value="Default.Root" />
<option value="Default.Author" />
<option value="Default.Date" />
<option value="Default.Subject" />
</list>
</option>
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="1">
<value>
<State>
<option name="SHOW_ONLY_AFFECTED_CHANGES" value="true" />
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="HEAD" />
</list>
</value>
</entry>
<entry key="structure">
<value>
<list>
<option value="dir:/Users/liushuai/Documents/workspace/lili-shop-ui/seller/src/router" />
</list>
</value>
</entry>
</map>
</option>
</State>
</value>
</entry>
<entry key="MAIN">
<value>
<State>
<option name="COLUMN_ORDER" />
</State>
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="店铺设置" />
<MESSAGE value="文件排序问题处理" />
<MESSAGE value="管理端页面优化" />
<MESSAGE value="修复修改商家地址报错问题" />
<MESSAGE value="去掉id" />
<MESSAGE value="选择物流规则不能选择物流模板" />
<MESSAGE value="修改查询条件样式" />
<MESSAGE value="修改样式" />
<MESSAGE value="修改更新时间为NAN" />
<MESSAGE value="修复app版本无法添加和修改" />
<MESSAGE value="去掉打印" />
<MESSAGE value="去掉多选" />
<MESSAGE value="修改消息标题宽度" />
<MESSAGE value="店铺相关js提交" />
<MESSAGE value="店铺修改" />
<MESSAGE value="优化页面" />
<MESSAGE value="页面优化" />
<option name="LAST_COMMIT_MESSAGE" value="页面优化" />
</component>
<component name="WindowStateProjectService">
<state x="2074" y="292" key="CommitChangelistDialog2" timestamp="1614313690605">
<screen x="0" y="23" width="3440" height="1333" />
</state>
<state x="2074" y="292" key="CommitChangelistDialog2/0.23.3440.1333@0.23.3440.1333" timestamp="1614313690605" />
<state x="1660" y="123" width="1572" height="1133" key="DiffContextDialog" timestamp="1614231764977">
<screen x="0" y="23" width="3440" height="1333" />
</state>
<state x="1660" y="123" width="1572" height="1133" key="DiffContextDialog/0.23.3440.1333@0.23.3440.1333" timestamp="1614231764977" />
<state x="2046" y="418" key="Vcs.Push.Dialog.v2" timestamp="1614313692405">
<screen x="0" y="23" width="3440" height="1333" />
</state>
<state x="2046" y="418" key="Vcs.Push.Dialog.v2/0.23.3440.1333@0.23.3440.1333" timestamp="1614313692405" />
<state x="2055" y="414" width="782" height="550" key="find.popup" timestamp="1614256597933">
<screen x="0" y="23" width="3440" height="1333" />
</state>
<state x="2055" y="414" width="782" height="550" key="find.popup/0.23.3440.1333@0.23.3440.1333" timestamp="1614256597933" />
<state x="2111" y="325" key="run.anything.popup" timestamp="1613991372498">
<screen x="0" y="23" width="3440" height="1333" />
</state>
<state x="2111" y="325" key="run.anything.popup/0.23.3440.1333@0.23.3440.1333" timestamp="1613991372498" />
<state x="2111" y="327" width="670" height="676" key="search.everywhere.popup" timestamp="1614254687317">
<screen x="0" y="23" width="3440" height="1333" />
</state>
<state x="2111" y="327" width="670" height="676" key="search.everywhere.popup/0.23.3440.1333@0.23.3440.1333" timestamp="1614254687317" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" type="javascript">
<url>file://$PROJECT_DIR$/manager/src/views/sys/monitor/monitor.vue</url>
<line>5</line>
<option name="timeStamp" value="2" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
</component>
</project>

143
LICENSE
View File

@@ -1,5 +1,5 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
@@ -7,17 +7,15 @@
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
@@ -72,7 +60,7 @@ modification follow.
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

288
README.md
View File

@@ -1,167 +1,195 @@
## 🔥 Lilishop B2B2C商城系统
##### 🌹 开源不易如有帮助请点Star
## Lilishop B2B2C商城系统
#### PS **演示站点所有环境均部署master分支。如果有演示站点问题可以反馈如果演示站点没问题本地运行有问题需自行处理**
#### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,进群先看文档后提问)
- **[在线客服](https://work.weixin.qq.com/kfid/kfc4d8dc24a73c15f44)**
- **微信交流1群已满**
- **微信交流2群**:
![微信群](https://lilishop-wechat.oss-cn-beijing.aliyuncs.com/wechat.jpg)
##### 交流 qq 1群 961316482已满
##### 体验 公众号/小程序/APP 体验,扫描二维码
##### 交流 qq 2群 875294241
##### 商城 公众号/小程序体验,扫描二维码
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png)
![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png)
[![star](https://gitee.com/beijing_hongye_huicheng/lilishop/badge/star.svg?theme=dark)](https://gitee.com/beijing_hongye_huicheng/lilishop/stargazers)
&nbsp;&nbsp;![github](https://img.shields.io/github/stars/hongyehuicheng/lilishop.svg?style=social&logo=#181717)
## 2025-10-10日更新
兼容更高的node版本16
### 🔥 商城介绍
这里我用的是node版本 v16.20.2
npm版本 8.19.4
使用yarn install 然后执行 yarn dev
yarn 安装/启动
```
// 如果没有 yarn 安装yarn
npm install yarn -g
// 切换源
yarn config set registry https://registry.npmmirror.com
// 以buyer项目为例
cd buyer
yarn install
yarn dev
```
没有二开过的项目直接拉最新代码即可,二开项目可以跟着提交记录一起同步修改 install出现问题检查的话删除 "package-lock.json" 重新install
Q&A 为什么不升级更高的node版本 :因为高node版本 OpenSSL 改动 导致旧版本 Webpack 插件会失效 试了好几次如果兼容的话 需要升级Webpack5以及其他的插件 升级内容较多 为了更稳定的还是尽量少动为主
****
## 如何在本地环境运行lilishop-ui部署视频
https://www.bilibili.com/video/BV1B28EeJEnP/
## 如何在服务器上部署lilishop-ui
https://www.bilibili.com/video/BV1WD87eoE9F/
## 开发项目
#### 安装Node.js
保证`node`版本`14`,推荐 14.17.0
2025-10-10日拉的代码之后不限制于node版本为14这里只是以14版本为例子
可以使用 `yarn` 或者 `npm` 进行安装
#### yarn 安装/启动
```
// 如果没有 yarn 安装yarn
npm install yarn -g
// 切换源
yarn config set registry https://registry.npmmirror.com
// 以buyer项目为例
cd buyer
yarn install
yarn dev
```
#### FAQ
##### npmmirror镜像源报错 451 Unavailable For Legal Reasons
```
//切换其他的镜像源
// npm
npm config set registry http://mirrors.cloud.tencent.com/npm/
// yarn
yarn config set registry http://mirrors.cloud.tencent.com/npm/
```
##### 安装不上去
可以按照这个思路排查一下
```
1. 看下Node.js 是否是14.17.0
2. 项目目录下是否有 package-lock.json 或者 .npmrc 或者 .yarnrc 设置了镜像源, 如果有可以删除重新install
3. 切换当前 npm 或者 yarn 镜像源重试
```
### 商城介绍
**官网**https://pickmall.cn
Lilishop 商城系统 基于SpringBoot 研发,B2B2C多用户商城系统前端使用 Vue、uniapp开发 **系统全端全部代码开源**
Lilishop商城系统支持商家入驻,后端基于SpringBoot 研发,前端使用 Vue、uniapp开发 **系统全端全部代码开源**
业务兼容O2O商城/B2B商城/B2B2C商城/F2B2C商城/S2B2C商城。支持小程序商城、H5商城、APP商城、 PC商城
前后端分离支持分布式部署支持Docker各个API独立并且有独立的消费者
### 商城 API/消费者 聚合版
api不需要单独部署只需启动一个jar包就可以正常运转 如有需要,可以点击跳转
https://gitee.com/beijing_hongye_huicheng/lilishop-simplify
商城前后端分离、支持分布式部署。
商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、分销模块、文章模块、系统设置模块、流量分析模块
商城包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等支持Docker支持k8s。是一款高性能支持高并发的商城系统。
##### 商城 API/消费者 聚合版
api不需要单独部署只需启动一个jar包就可以正常运转 如有需要可以点击跳转https://gitee.com/beijing_hongye_huicheng/lilishop-simplify
### ☃️ 商城 开发/使用/常见问题 帮助文档
### 开发/使用/常见问题 帮助文档
https://docs.pickmall.cn
### 💧 开源商城项目地址(gitee)
### 项目地址
**API商城所有API**https://gitee.com/beijing_hongye_huicheng/lilishop.git
gitee : https://gitee.com/beijing_hongye_huicheng
**UI商城管理端/商家端/买家PC端** https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
github 镜像: https://github.com/lilishop?tab=repositories
**uniapp商城移动端支持小程序/APP/H5**https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
**docker一键部署商城部署脚本**https://gitee.com/beijing_hongye_huicheng/docker.git
### 💧 开源商城项目地址(github)
**API商城所有API**https://github.com/hongyehuicheng/lilishop.git
**UI商城管理端/商家端/买家PC端** https://github.com/hongyehuicheng/lilishop-ui.git
**uniapp商城移动端支持小程序/APP/H5**https://github.com/hongyehuicheng/lilishop-uniapp.git
**docker一键部署商城部署脚本**https://github.com/hongyehuicheng/docker.git
商城UI 项目下3个文件夹
buyer买家PC端seller商家端manager后台管理端
☃️ UI 项目下3个文件夹 buyer买家PC端seller商家端manager后台管理端
### 演示地址
PS手机验证码为 111111
**平台管理端**https://admin-b2b2c.pickmall.cn 账号admin/123456
### 💧 演示地址(手机验证码为 111111)
**商城管理端**https://admin-b2b2c.pickmall.cn 账号admin/123456
**商城店铺后台**https://store-b2b2c.pickmall.cn 账号13011111111/111111
**店铺管理端**https://store-b2b2c.pickmall.cn 账号13011111111/111111
**商城PC页面**https://pc-b2b2c.pickmall.cn
**商城移动端(请使浏览器手机模式,或者用手机浏览器打开)**https://m-b2b2c.pickmall.cn
**商城 小程序/公众号/APP**:扫描二维码
**小程序/公众号**:扫描二维码
![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png)
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png)
### 快速本地部署
### 🚙 3行命令搭建本地商城只能本机访问如需调整请自行操作镜像
[点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)
温馨提示由于服务中间件较多如果笔记本环境启动内存没有32g可能无法启动成功macbookpro 2020 16g内存启动无法成功台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
**商城数据库**
使用docker-compose部署数据库自动初始化数据库不需要手动下载等操作
如果手动部署才需要获取sql [点击跳转](https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql) PS这里有与tag版本一致的sql如果是历史版本则docker项目也切换至历史版本获取sql即可历史版本升级则根据java相聚的根目录DB目录下的升级sql按需执行
##### docker环境安装 [点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)
### 功能列表
##### 下载docker-compose脚本
`git clone https://gitee.com/beijing_hongye_huicheng/docker.git `
#### 平台管理端功能
##### 部署商城所需中间件
`docker-compose up -d`
##### 部署商城应用
`docker-compose -f docker-compose-application.yml up -d`
![平台管理端功能](https://static.pickmall.cn/images/other/managerList1.jpg)
PS:商城数据库单独部署 https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql 这里有与tag版本一致的sql根据tag获取sql如果使用master代码则需要在lilishop项目根目录的DB目录中获取对应的升级sql。
#### 卖家功能
##### 商城 API/UI 地址
| API | 地址 |
| -------------- | --------------- |
| 商城买家API | http://127.0.0.1:8888 |
| 商城商家API | http://127.0.0.1:8889 |
| 商城管理端API | http://127.0.0.1:8887 |
| 商城基础API | http://127.0.0.1:8890 |
| 前端演示 | 地址 |
| -------------- | --------------- |
| 商城PC端 | http://127.0.0.1:10000 |
| 商城WAP端 | http://127.0.0.1:10001 |
| 商城卖家端 | http://127.0.0.1:10002 |
| 商城管理端 | http://127.0.0.1:10003 |
![商家端功能](https://static.pickmall.cn/images/other/storeList.jpg)
### 商城前端功能展示
#### 商城移动端
<img src="https://static.pickmall.cn/images/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
#### 平台管理端
![管理端功能展示](https://static.pickmall.cn/images/other/manager.gif)
### 技术选型
### ⚾️ 功能列表
#### 架构图
![技术选型](https://lili-system.oss-cn-beijing.aliyuncs.com/docs/%E6%9E%B6%E6%9E%84.png)
#### 🥎 商城平台功能
![平台功能](https://pickmall.cn/assets/imgs/other/managerList.jpg)
#### 🥎 商城卖家功能
![商家端功能](https://pickmall.cn/assets/imgs/other/storeList.jpg)
### 🧩 商城前端功能展示
#### ⚽️ 商城移动端
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
#### ⚽️ 商城管理端
![管理端功能展示](https://pickmall.cn/assets/imgs/other/manager.gif)
### 商城技术选型
#### 🥅 架构图
![架构](https://lili-system.oss-cn-beijing.aliyuncs.com/docs/%E6%9E%B6%E6%9E%84.png)
##### 🕹 后台技术选型
##### 后台技术选型
| 说明 | 框架 | 说明 | |
| -------------- | --------------- | -------------- | ------------- |
@@ -175,7 +203,7 @@ PS:商城数据库单独部署 https://gitee.com/beijing_hongye_huicheng/docker/
| 短信 | 阿里云短信 | 认证 | JWT |
| 日志处理 | Log4j | 接口规范 | RESTful |
##### 🖥 前端-运营后台、店铺后台
##### 前端-运营后台、店铺后台
| 说明 | 框架 | 说明 | 框架 |
| ---------- | ---------- | ---------- | ------- |
@@ -185,34 +213,42 @@ PS:商城数据库单独部署 https://gitee.com/beijing_hongye_huicheng/docker/
| 基础UI库 | iView | UI界面基于 | iView |
| 网络请求 | axios | | |
##### 📱前端-移动端
##### 前端-移动端
| 说明 | 架构 | 说明 | 架构 |
| --------- | ------- | -------- | ------- |
| 基础UI库 | uViewui | 基础框架 | uni-app |
| CSS预处理 | scss | 地图引擎 | amap |
### 🌟 版本升级
### 版本升级
```
商城后续会持续版本升级修复bug完善功能覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
后续会考虑推出微服务商城系统/商城中台等
系统后续会提供多场景解决方案。
更多架构微服务、Saas、中台等都会支持。 支持差价升级商业授权
```
### 商业授权
商业版本与开源版本代码一致,没有区分
### ⚠️ 开源须知
商业使用需要授权授权方式可选择联系官网客服或者qq群联系群主。
商业授权模式为永久授权,支持永久升级。
商业案例由于涉及部分多层二开关系,如需了解可以咨询销售。
### 开源须知
1.仅允许用于个人学习研究使用.
2.禁止将本开源的代码和资源进行任何形式任何名义的出售.
3.软件受国家计算机软件著作权保护登记号2021SR0805085
4.限制商用如果需要商业使用请联系我们。QQ3409056806.
4.限制商用如果需要商业使用请联系我们。QQ3409056806.或者加入qq群联系群主。
### 附录
有人有自己的学习视频、学习记录文档、希望宣传关联开源项目等均可以私聊仓库所有者。
### 🐧 交流群
##### 官方qq 1群 961316482已满
##### 官方qq 2群 875294241
类似:
清晨敲代码同学的分析: https://blog.csdn.net/vaevaevae233/category_12103567.html

19
build.sh Normal file
View File

@@ -0,0 +1,19 @@
#代码目录
code_path=$PWD
git pull
cd ${code_path}/manager
rm -rf ./dist
yarn install
yarn build
cd ${code_path}/seller
rm -rf ./dist
yarn install
yarn build
cd ${code_path}/buyer
rm -rf ./dist
yarn install
yarn build

1
buyer/.npmrc Normal file
View File

@@ -0,0 +1 @@
engine-strict=false

1
buyer/.yarnrc Normal file
View File

@@ -0,0 +1 @@
--ignore-engines true

View File

@@ -1,8 +1,13 @@
FROM nginx:alpine
FROM node:10.19.0 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
RUN mkdir -p /app/
COPY ./dist /app/
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]k

View File

@@ -1,19 +0,0 @@
# new
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

View File

@@ -1 +1 @@
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/buyer-ui:4.2.2.1 .
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/buyer-ui:4.2.4.1 .

View File

@@ -1,51 +1,46 @@
#这个文件给docker用的
#user nobody;
worker_processes 1;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
keepalive_timeout 65;
client_max_body_size 10m;
gzip on;
gzip_min_length 5k;
gzip_buffers 4 16k;
gzip_min_length 5k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 4;
gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
server {
listen 10000;
server_name localhost;
listen 10000;
location / {
root /app;
try_files $uri $uri/ /index.html $uri/ =404;
index index.html index.htm;
index index.html index.htm;
}
}
}

9902
buyer/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,21 +3,25 @@
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "vue-cli-service serve",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
"build": "vue-cli-service build",
"dev": "vue-cli-service serve"
},
"engines": {
"node": ">=14"
},
"dependencies": {
"@amap/amap-jsapi-loader": "0.0.7",
"axios": "^0.19.2",
"dplayer": "^1.27.1",
"js-cookie": "^2.2.1",
"less": "^2.7.0",
"less-loader": "^5.0.0",
"mv-count-down": "^0.1.15",
"node-sass": "^4.14.1",
"sass": "^1.63.6",
"postcss-loader": "^4.3.0",
"psl": "^1.8.0",
"qs": "^6.9.4",
"sass-loader": "^7.3.1",
"uuid": "^8.3.2",
"view-design": "^4.3.2",
"vue": "^2.6.11",
@@ -30,7 +34,7 @@
"devDependencies": {
"@vue/cli-service": "~4.5.0",
"compression-webpack-plugin": "^5.0.0",
"sass-loader": "^7.3.1",
"sass-loader": "^10.4.1",
"uglifyjs-webpack-plugin": "^2.2.0",
"vue-template-compiler": "^2.6.11"
},
@@ -38,5 +42,10 @@
"> 1%",
"last 2 versions",
"not dead"
]
],
"resolutions": {
"minimatch": "^3.1.2",
"node-sass": "npm:sass@^1.63.6",
"@achrinza/node-ipc": "9.2.2"
}
}

View File

@@ -1,18 +1,17 @@
var BASE = {
/**
* @description api请求基础路径
*/
API_DEV: {
common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn",
seller: "https://store-api.pickmall.cn",
manager: "https://admin-api.pickmall.cn"
},
API_PROD: {
common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn",
seller: "https://store-api.pickmall.cn",
manager: "https://admin-api.pickmall.cn"
},
};
/**
* @description api请求基础路径
*/
API_DEV: {
common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn",
seller: "https://store-api.pickmall.cn",
manager: "https://admin-api.pickmall.cn"
},
API_PROD: {
common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn",
seller: "https://store-api.pickmall.cn",
manager: "https://admin-api.pickmall.cn"
},
};

View File

@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name='description' content='在线购物平台'>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>logo.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
@@ -16,7 +17,7 @@
<% } %>
<script src="/config.js"></script>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>

View File

@@ -1,25 +1,66 @@
<template>
<div id="app">
<router-view/>
<router-view />
</div>
</template>
<script>
import {v4 as uuidv4} from 'uuid';
import storage from '@/plugins/storage';
import storage from "@/plugins/storage";
import { getBaseSite } from "@/api/common.js";
export default {
name: 'App',
mounted () {
let uuid = storage.getItem('uuid');
if (!uuid) {
uuid = uuidv4();
storage.setItem('uuid', uuid);
name: "App",
mounted() {
this.init();
},
methods:{
init(){
if(!storage.getItem("siteName")||!storage.getItem("logoImg")||!storage.getItem("sitelogo_expiration_time")) {
this.getSite();
}else{
// 如果缓存过期,则获取最新的信息
if (new Date() > storage.getItem("sitelogo_expiration_time")) {
this.getSite();
return;
}else{
window.document.title = storage.getItem("siteName");
//动态获取icon
let link =document.querySelector("link[rel*='icon']") ||document.createElement("link");
link.type = "image/x-icon";
link.href = storage.getItem("siteIcon");
link.rel = "shortcut icon";
document.getElementsByTagName("head")[0].appendChild(link);
}
}
},
getSite(){
//获取基本站点信息
getBaseSite().then((res) => {
if (res.success && res.result.settingValue) {
let data = JSON.parse(res.result.settingValue);
// 过期时间
var expirationTime = new Date().setHours(new Date().getHours() + 1);
// 存放过期时间
storage.setItem("sitelogo_expiration_time", expirationTime);
// 存放信息
storage.setItem('siteName', data.siteName);
storage.setItem('logoImg', data.buyerSideLogo);
storage.setItem("siteIcon",data.buyerSideIcon);
window.document.title = data.siteName;
//动态获取icon
let link =document.querySelector("link[rel*='icon']") ||document.createElement("link");
link.type = "image/x-icon";
link.href = data.buyerSideIcon;
link.rel = "shortcut icon";
document.getElementsByTagName("head")[0].appendChild(link);
}
});
}
}
};
</script>
<style lang="scss">
#app{
#app {
@include background_color($light_background_color);
}
</style>

View File

@@ -11,7 +11,7 @@ import request, {Method} from '@/plugins/request.js'
// 获取密码状态
export function getPwdStatus (params) {
return request({
url: '/buyer/members/wallet/check',
url: '/buyer/passport/member/wallet/check',
method: Method.GET,
needToken: true,
params
@@ -21,7 +21,7 @@ export function getPwdStatus (params) {
// 设置密码
export function setPwd (params) {
return request({
url: '/buyer/members/wallet/set-password',
url: '/buyer/passport/member/wallet/set-password',
method: Method.POST,
needToken: true,
data: params
@@ -31,7 +31,7 @@ export function setPwd (params) {
// 设置支付密码
export function setUpdatePwdOrdinary (params) {
return request({
url: '/buyer/members/wallet/update-password/ordinary',
url: '/buyer/passport/member/wallet/update-password/ordinary',
method: Method.GET,
needToken: true,
data: params
@@ -41,7 +41,7 @@ export function setUpdatePwdOrdinary (params) {
// 修改会员资料
export function editMemberInfo (params) {
return request({
url: '/buyer/members/editOwn',
url: '/buyer/passport/member/editOwn',
method: Method.PUT,
needToken: true,
data: params
@@ -51,7 +51,7 @@ export function editMemberInfo (params) {
// 修改密码
export function editPwd (params) {
return request({
url: `/buyer/members/modifyPass`,
url: `/buyer/passport/member/modifyPass`,
method: Method.PUT,
needToken: true,
data: params
@@ -61,7 +61,7 @@ export function editPwd (params) {
// 获取密码状态
export function logout () {
return request({
url: '/buyer/members/logout',
url: '/buyer/passport/member/logout',
method: Method.POST,
needToken: true
})

View File

@@ -5,7 +5,7 @@ import request, {
// 会员收货地址列表
export function memberAddress () {
return request({
url: '/buyer/memberAddress',
url: '/buyer/member/address',
needToken: true,
method: Method.GET
});
@@ -14,7 +14,7 @@ export function memberAddress () {
// 添加收货地址
export function newMemberAddress (params) {
return request({
url: '/buyer/memberAddress',
url: '/buyer/member/address',
needToken: true,
method: Method.POST,
data: params
@@ -24,7 +24,7 @@ export function newMemberAddress (params) {
// 编辑收货地址
export function editMemberAddress (params) {
return request({
url: '/buyer/memberAddress',
url: '/buyer/member/address',
needToken: true,
method: Method.PUT,
params
@@ -34,7 +34,7 @@ export function editMemberAddress (params) {
// 删除收货地址
export function delMemberAddress (id) {
return request({
url: `/buyer/memberAddress/delById/${id}`,
url: `/buyer/member/address/delById/${id}`,
needToken: true,
method: Method.DELETE
});
@@ -43,7 +43,7 @@ export function delMemberAddress (id) {
// 根据id获取会员地址详情
export function getAddrDetail (id) {
return request({
url: `/buyer/memberAddress/get/${id}`,
url: `/buyer/member/address/get/${id}`,
needToken: true,
method: Method.GET
});
@@ -52,7 +52,7 @@ export function getAddrDetail (id) {
// 传给后台citycode 获取城市街道等id
export function handleRegion (params) {
return request({
url: `${commonUrl}/common/region/region`,
url: `${commonUrl}/common/common/region/region`,
needToken: true,
method: Method.GET,
params

View File

@@ -212,3 +212,52 @@ export function receiptSelect (params) {
params
});
}
/**
* 获取全部配送方式
*/
export function shippingMethodList(params) {
return request({
url: `/buyer/trade/carts/shippingMethodList`,
method: Method.GET,
needToken: true,
params: params,
});
}
/**
* 获取全部配送方式
*/
export function storeAddressList(params) {
return request({
url: `/buyer/store/address/shippingMethodList`,
method: Method.GET,
needToken: true,
params: params,
});
}
/**
* 设置自提地址ID
* @param addressId
*/
export function setStoreAddressId(storeAddressId,way) {
return request({
url: `/buyer/trade/carts/storeAddress?storeAddressId=${storeAddressId}&way=${way}`,
method: Method.GET,
needToken: true,
});
}
/**
* 提交配送方式
* @param params
*/
export function setShipMethod(params) {
return request({
url: "/buyer/trade/carts/shippingMethod",
method: Method.PUT,
needToken: true,
params,
});
}

View File

@@ -5,7 +5,7 @@ import request, {Method, commonUrl} from '@/plugins/request.js';
*/
export function getVerifyImg (verificationEnums) {
return request({
url: `${commonUrl}/common/slider/${verificationEnums}`,
url: `${commonUrl}/common/common/slider/${verificationEnums}`,
method: Method.GET,
needToken: false
});
@@ -15,7 +15,7 @@ export function getVerifyImg (verificationEnums) {
*/
export function postVerifyImg (params) {
return request({
url: `${commonUrl}/common/slider/${params.verificationEnums}`,
url: `${commonUrl}/common/common/slider/${params.verificationEnums}`,
method: Method.POST,
needToken: false,
params
@@ -26,26 +26,17 @@ export function postVerifyImg (params) {
*/
export function sendSms (params) {
return request({
url: `${commonUrl}/common/sms/${params.verificationEnums}/${params.mobile}`,
url: `${commonUrl}/common/common/sms/${params.verificationEnums}/${params.mobile}`,
method: Method.GET,
needToken: false,
params
});
}
/**
* 获取logo图标
*/
export function getLogo () {
return request({
url: `${commonUrl}/common/logo`,
method: Method.GET,
needToken: false
});
}
// 地区数据,用于三级联动
export function getRegion (id) {
return request({
url: `${commonUrl}/common/region/item/${id}`,
url: `${commonUrl}/common/common/region/item/${id}`,
needToken: true,
method: Method.GET
});
@@ -57,7 +48,7 @@ export function getRegion (id) {
*/
export function articleList (params) {
return request({
url: `/buyer/article`,
url: `/buyer/other/article`,
method: Method.GET,
params
});
@@ -69,7 +60,7 @@ export function articleList (params) {
*/
export function articleCateList () {
return request({
url: `/buyer/article/articleCategory/list`,
url: `/buyer/other/article/articleCategory/list`,
method: Method.GET
});
}
@@ -77,7 +68,28 @@ export function articleCateList () {
// 通过id获取文章
export function articleDetail (id) {
return request({
url: `/buyer/article/get/${id}`,
url: `/buyer/other/article/get/${id}`,
method: Method.GET
});
}
// 获取IM接口前缀
export function getIMDetail () {
return request({
url: `${commonUrl}/common/common/IM`,
method: Method.GET
});
}
//获取图片logo
export function getBaseSite(){
return request ({
url:`${commonUrl}/common/common/site`,
method: Method.GET,
needToken: false
})
}

View File

@@ -5,7 +5,7 @@ import request, {
// 商品列表
export function goodsList (params) {
return request({
url: '/buyer/goods/es',
url: '/buyer/goods/goods/es',
method: Method.GET,
needToken: false,
params
@@ -15,7 +15,7 @@ export function goodsList (params) {
// 商品分类 筛选条件 品牌, 尺寸等
export function filterList (params) {
return request({
url: '/buyer/goods/es/related',
url: '/buyer/goods/goods/es/related',
method: Method.GET,
needToken: false,
params
@@ -25,7 +25,7 @@ export function filterList (params) {
// id获取商品详情
export function goodsDetail (goodsId) {
return request({
url: `/buyer/goods/get/${goodsId}`,
url: `/buyer/goods/goods/get/${goodsId}`,
method: Method.GET,
needToken: false
});
@@ -34,7 +34,7 @@ export function goodsDetail (goodsId) {
// id获取商品Sku详情
export function goodsSkuDetail (params) {
return request({
url: `/buyer/goods/sku/${params.goodsId}/${params.skuId}`,
url: `/buyer/goods/goods/sku/${params.goodsId}/${params.skuId}`,
method: Method.GET,
needToken: true,
params
@@ -44,7 +44,7 @@ export function goodsSkuDetail (params) {
// 获取所有商品分类
export function getCategory (parentId) {
return request({
url: `/buyer/category/get/${parentId}`,
url: `/buyer/goods/category/get/${parentId}`,
method: Method.GET,
needToken: false
});
@@ -65,7 +65,7 @@ export function pintuanMembers (pintuanId) {
*/
export function hotWords (params) {
return request({
url: `/buyer/goods/hot-words`,
url: `/buyer/goods/goods/hot-words`,
method: Method.GET,
needToken: false,
params

View File

@@ -1,13 +1,44 @@
import request, {Method} from '@/plugins/request.js'
import request, { Method } from "@/plugins/request.js";
/**
* 获取首页专题数据
*/
export function getTopicData(id) {
return request({
url: `/buyer/other/pageData/get/${id}`,
method: Method.GET,
});
}
// 获取首页楼层装修数据
export function indexData (params) {
export function indexData(params) {
return request({
url: '/buyer/pageData/getIndex',
url: "/buyer/other/pageData/getIndex",
method: Method.GET,
needToken: false,
params
})
params,
});
}
// 获取自动发券
export function getAutoCoup(){
return request({
url: "/buyer/promotion/coupon/activity",
method: Method.GET,
needToken: true,
});
}
/**
* 获取店铺楼层数据
*/
export function getFloorStoreData(params) {
return request({
url: `/buyer/other/pageData?pageClientType=PC`,
method: "get",
params,
});
}
/**
@@ -15,21 +46,33 @@ export function indexData (params) {
* @param pageClientType 客户端类型,可用值:PC,H5,WECHAT_MP,APP
* @param pageType 页面类型,可用值:INDEX,STORE,SPECIAL
*/
export function pageData (params) {
export function pageData(params) {
return request({
url: `/buyer/pageData`,
url: `/buyer/other/pageData`,
method: Method.GET,
needToken: false,
params
})
params,
});
}
/**
* 刷新token
*/
export function handleRefreshToken (token) {
export function handleRefreshToken(token) {
return request({
url: `/buyer/members/refresh/${token}`,
url: `/buyer/passport/member/refresh/${token}`,
method: Method.GET,
needToken: false
})
needToken: false,
});
}
// /**
// * 获取店铺楼层数据
// */
// export function getFloorStoreData(params) {
// return request({
// url: `/buyer/other/pageData?pageClientType=PC`,
// method: "get",
// params,
// });
// }

View File

@@ -6,7 +6,7 @@ import request, {Method, buyerUrl} from '@/plugins/request.js';
*/
export function regist (params) {
return request({
url: '/buyer/members/register',
url: '/buyer/passport/member/register',
method: Method.POST,
needToken: false,
data: params
@@ -18,7 +18,7 @@ export function regist (params) {
*/
export function login (params) {
return request({
url: '/buyer/members/userLogin',
url: '/buyer/passport/member/userLogin',
method: Method.POST,
needToken: false,
data: params,
@@ -31,7 +31,7 @@ export function login (params) {
*/
export function smsLogin (params) {
return request({
url: '/buyer/members/smsLogin',
url: '/buyer/passport/member/smsLogin',
method: Method.POST,
needToken: false,
data: params,
@@ -44,7 +44,7 @@ export function smsLogin (params) {
*/
export function getMemberMsg (params) {
return request({
url: '/buyer/members',
url: '/buyer/passport/member',
method: Method.GET,
needToken: true,
params
@@ -55,7 +55,7 @@ export function getMemberMsg (params) {
* 第三方登录 支付宝微博qq,微信
*/
export function webLogin (type) {
window.open(`${buyerUrl}/buyer/connect/login/web/${type}`, 'blank');
window.open(`${buyerUrl}/buyer/passport/connect/connect/login/web/${type}`, 'blank');
}
/**
@@ -63,7 +63,7 @@ export function webLogin (type) {
*/
export function loginCallback (uuid) {
return request({
url: `/buyer/connect/result?state=${uuid}`,
url: `/buyer/passport/connect/connect/result?state=${uuid}`,
method: Method.GET,
needToken: false
});
@@ -74,7 +74,7 @@ export function loginCallback (uuid) {
*/
export function validateCode (params) {
return request({
url: `/buyer/members/resetByMobile`,
url: `/buyer/passport/member/resetByMobile`,
method: Method.POST,
needToken: false,
params
@@ -86,7 +86,24 @@ export function validateCode (params) {
*/
export function resetPassword (params) {
return request({
url: `/buyer/members/resetPassword`,
url: `/buyer/passport/member/resetPassword`,
method: Method.POST,
needToken: false,
params
});
}
export function getSCLoginCode(params) {
return request({
url: `/buyer/passport/member/pc_session`,
method: Method.POST,
needToken: false,
params
});
}
export function sCLogin(token,params) {
return request({
url: `/buyer/passport/member/session_login/`+token,
method: Method.POST,
needToken: false,
params

View File

@@ -3,7 +3,7 @@ import request, {Method} from '@/plugins/request.js';
// 查询账户余额
export function getMembersWallet () {
return request({
url: '/buyer/members/wallet',
url: '/buyer/wallet/wallet',
method: Method.GET,
needToken: true
});
@@ -22,7 +22,7 @@ export function getDepositLog (params) {
// 查询充值记录
export function getRecharge (params) {
return request({
url: '/buyer/member/recharge',
url: '/buyer/wallet/recharge',
method: Method.GET,
needToken: true,
params
@@ -52,14 +52,14 @@ export function recharge (params) {
// 提现
export function withdrawalApply (params) {
return request({
url: '/buyer/members/wallet/withdrawal',
url: '/buyer/wallet/wallet/withdrawal',
method: Method.POST,
needToken: true,
data: params
});
}
// 收藏商品、店铺
// 收藏商品
export function collectGoods (type, id) {
return request({
url: `/buyer/member/collection/add/${type}/${id}`,
@@ -68,7 +68,16 @@ export function collectGoods (type, id) {
});
}
// 取消 收藏商品、店铺
// 收藏店铺
export function collectStore (type, id) {
return request({
url: `/buyer/member/storeCollection/add/${type}/${id}`,
method: Method.POST,
needToken: true
});
}
// 取消 收藏商品
export function cancelCollect (type, id) {
return request({
url: `/buyer/member/collection/delete/${type}/${id}`,
@@ -77,7 +86,16 @@ export function cancelCollect (type, id) {
});
}
// 查看是否收藏
// 取消 收藏店铺
export function cancelStoreCollect (type, id) {
return request({
url: `/buyer/member/storeCollection/delete/${type}/${id}`,
method: Method.DELETE,
needToken: true
});
}
// 查看是否收藏商品
export function isCollection (type, goodsId) {
return request({
url: `/buyer/member/collection/isCollection/${type}/${goodsId}`,
@@ -86,7 +104,16 @@ export function isCollection (type, goodsId) {
});
}
// 会员收藏列表
// 查看是否收藏店铺
export function isStoreCollection (type, goodsId) {
return request({
url: `/buyer/member/storeCollection/isCollection/${type}/${goodsId}`,
method: Method.GET,
needToken: true
});
}
// 会员收藏商品列表
export function collectList (params) {
return request({
url: `/buyer/member/collection/${params.type}`,
@@ -96,10 +123,20 @@ export function collectList (params) {
});
}
// 会员收藏店铺列表
export function storeCollectList (params) {
return request({
url: `/buyer/member/storeCollection/${params.type}`,
method: Method.GET,
needToken: true,
params
});
}
// 单个商品评价
export function goodsComment (params) {
return request({
url: `/buyer/memberEvaluation/${params.goodsId}/goodsEvaluation`,
url: `/buyer/member/evaluation/${params.goodsId}/goodsEvaluation`,
method: Method.GET,
needToken: false,
params
@@ -109,7 +146,7 @@ export function goodsComment (params) {
// 商品各评价类别数量
export function goodsCommentNum (goodsId) {
return request({
url: `/buyer/memberEvaluation/${goodsId}/evaluationNumber`,
url: `/buyer/member/evaluation/${goodsId}/evaluationNumber`,
method: Method.GET,
needToken: false
});
@@ -118,7 +155,7 @@ export function goodsCommentNum (goodsId) {
// 添加会员评价
export function addEvaluation (params) {
return request({
url: `/buyer/memberEvaluation`,
url: `/buyer/member/evaluation`,
method: Method.POST,
needToken: true,
params
@@ -128,7 +165,7 @@ export function addEvaluation (params) {
// 会员评价详情
export function evaluationDetail (id) {
return request({
url: `/buyer/memberEvaluation/get/${id}`,
url: `/buyer/member/evaluation/get/${id}`,
method: Method.GET,
needToken: true
});
@@ -195,7 +232,7 @@ export function receiveCoupon (couponId) {
// 获取申请售后列表
export function afterSaleList (params) {
return request({
url: `/buyer/afterSale/page`,
url: `/buyer/order/afterSale/page`,
method: Method.GET,
needToken: true,
params
@@ -205,7 +242,7 @@ export function afterSaleList (params) {
// 获取申请售后页面信息
export function afterSaleInfo (sn) {
return request({
url: `/buyer/afterSale/applyAfterSaleInfo/${sn}`,
url: `/buyer/order/afterSale/applyAfterSaleInfo/${sn}`,
method: Method.GET,
needToken: true
});
@@ -214,7 +251,7 @@ export function afterSaleInfo (sn) {
// 获取申请售后、投诉原因
export function afterSaleReason (serviceType) {
return request({
url: `/buyer/afterSale/get/afterSaleReason/${serviceType}`,
url: `/buyer/order/afterSale/get/afterSaleReason/${serviceType}`,
method: Method.GET,
needToken: true
});
@@ -222,7 +259,7 @@ export function afterSaleReason (serviceType) {
// 获取申请售后详情
export function afterSaleDetail (sn) {
return request({
url: `/buyer/afterSale/get/${sn}`,
url: `/buyer/order/afterSale/get/${sn}`,
method: Method.GET,
needToken: true
});
@@ -230,7 +267,7 @@ export function afterSaleDetail (sn) {
// 售后日志
export function afterSaleLog (sn) {
return request({
url: `/buyer/afterSale/get/getAfterSaleLog/${sn}`,
url: `/buyer/order/afterSale/get/getAfterSaleLog/${sn}`,
method: Method.GET,
needToken: true
});
@@ -239,7 +276,7 @@ export function afterSaleLog (sn) {
// 申请售后
export function applyAfterSale (params) {
return request({
url: `/buyer/afterSale/save/${params.orderItemSn}`,
url: `/buyer/order/afterSale/save/${params.orderItemSn}`,
method: Method.POST,
needToken: true,
params
@@ -249,7 +286,7 @@ export function applyAfterSale (params) {
// 取消售后申请
export function cancelAfterSale (afterSaleSn) {
return request({
url: `/buyer/afterSale/cancel/${afterSaleSn}`,
url: `/buyer/order/afterSale/cancel/${afterSaleSn}`,
method: Method.POST,
needToken: true
});
@@ -258,7 +295,7 @@ export function cancelAfterSale (afterSaleSn) {
// 投诉商品
export function handleComplain (data) {
return request({
url: `/buyer/complain`,
url: `/buyer/order/complain`,
method: Method.POST,
needToken: true,
data
@@ -267,7 +304,7 @@ export function handleComplain (data) {
// 分页获取我的投诉列表
export function complainList (params) {
return request({
url: `/buyer/complain`,
url: `/buyer/order/complain`,
method: Method.GET,
needToken: true,
params
@@ -279,7 +316,7 @@ export function complainList (params) {
*/
export function getComplainDetail (id) {
return request({
url: `/buyer/complain/${id}`,
url: `/buyer/order/complain/${id}`,
method: Method.GET,
needToken: true
});
@@ -290,7 +327,7 @@ export function getComplainDetail (id) {
*/
export function clearComplain (id) {
return request({
url: `/buyer/complain/status/${id}`,
url: `/buyer/order/complain/status/${id}`,
method: Method.PUT,
needToken: true
});
@@ -301,7 +338,7 @@ export function clearComplain (id) {
*/
export function distribution () {
return request({
url: `/buyer/distribution`,
url: `/buyer/distribution/distribution`,
method: Method.GET,
needToken: true
});
@@ -314,7 +351,7 @@ export function distribution () {
*/
export function applyDistribution (params) {
return request({
url: `/buyer/distribution`,
url: `/buyer/distribution/distribution`,
method: Method.POST,
needToken: true,
params
@@ -326,7 +363,7 @@ export function applyDistribution (params) {
*/
export function getDistOrderList (params) {
return request({
url: `/buyer/distribution/distributionOrder`,
url: `/buyer/distribution/order`,
method: Method.GET,
needToken: true,
params
@@ -338,7 +375,7 @@ export function getDistOrderList (params) {
*/
export function getDistGoodsList (params) {
return request({
url: `/buyer/distributionGoods`,
url: `/buyer/distribution/goods`,
method: Method.GET,
needToken: true,
params
@@ -352,7 +389,7 @@ export function getDistGoodsList (params) {
*/
export function selectDistGoods (params) {
return request({
url: `/buyer/distributionGoods/checked/${params.distributionGoodsId}`,
url: `/buyer/distribution/goods/checked/${params.distributionGoodsId}`,
method: Method.GET,
needToken: true,
params
@@ -390,7 +427,7 @@ export function distCash (params) {
*/
export function tracksList (params) {
return request({
url: `/buyer/footprint`,
url: `/buyer/member/footprint`,
method: Method.GET,
needToken: true,
params
@@ -402,7 +439,7 @@ export function tracksList (params) {
*/
export function clearTracks () {
return request({
url: `/buyer/footprint`,
url: `/buyer/member/footprint`,
method: Method.DELETE,
needToken: true
});
@@ -414,7 +451,7 @@ export function clearTracks () {
*/
export function clearTracksById (ids) {
return request({
url: `/buyer/footprint/delByIds/${ids}`,
url: `/buyer/member/footprint/delByIds/${ids}`,
method: Method.DELETE,
needToken: true
});
@@ -449,7 +486,7 @@ export function memberPointHistory (params) {
*/
export function memberMsgList (params) {
return request({
url: `/buyer/member/message`,
url: `/buyer/message/member`,
method: Method.GET,
needToken: true,
params
@@ -462,7 +499,7 @@ export function memberMsgList (params) {
export function readMemberMsg (id) {
return request({
url: `/buyer/member/message/${id}`,
url: `/buyer/message/member/${id}`,
method: Method.PUT,
needToken: true
});
@@ -473,7 +510,7 @@ export function readMemberMsg (id) {
*/
export function delMemberMsg (id) {
return request({
url: `/buyer/member/message/${id}`,
url: `/buyer/message/member/${id}`,
method: Method.DELETE,
needToken: true
});
@@ -485,7 +522,7 @@ export function delMemberMsg (id) {
*/
export function getGoodsDistribution (distributionId) {
return request({
url: `/buyer/distribution/bindingDistribution/${distributionId}`,
url: `/buyer/distribution/distribution/bindingDistribution/${distributionId}`,
method: Method.GET,
needToken: true
});

View File

@@ -5,7 +5,7 @@ import request, {
// 查询会员订单列表
export function getOrderList (params) {
return request({
url: `/buyer/orders`,
url: `/buyer/order/order`,
method: Method.GET,
needToken: true,
params
@@ -18,7 +18,7 @@ export function getOrderList (params) {
*/
export function orderDetail (orderSn) {
return request({
url: `/buyer/orders/${orderSn}`,
url: `/buyer/order/order/${orderSn}`,
method: Method.GET,
needToken: true
});
@@ -31,7 +31,7 @@ export function orderDetail (orderSn) {
*/
export function cancelOrder (params) {
return request({
url: `/buyer/orders/${params.orderSn}/cancel`,
url: `/buyer/order/order/${params.orderSn}/cancel`,
method: Method.POST,
needToken: true,
params
@@ -44,7 +44,7 @@ export function cancelOrder (params) {
*/
export function delOrder (orderSn) {
return request({
url: `/buyer/orders/${orderSn}`,
url: `/buyer/order/order/${orderSn}`,
method: Method.DELETE,
needToken: true
});
@@ -56,7 +56,7 @@ export function delOrder (orderSn) {
*/
export function sureReceived (orderSn) {
return request({
url: `/buyer/orders/${orderSn}/receiving`,
url: `/buyer/order/order/${orderSn}/receiving`,
method: Method.POST,
needToken: true
});
@@ -68,7 +68,7 @@ export function sureReceived (orderSn) {
*/
export function getTraces (orderSn) {
return request({
url: `/buyer/orders/getTraces/${orderSn}`,
url: `/buyer/order/order/getTraces/${orderSn}`,
method: Method.POST,
needToken: true
});
@@ -80,7 +80,7 @@ export function getTraces (orderSn) {
*/
export function evolutionList (params) {
return request({
url: `/buyer/memberEvaluation`,
url: `/buyer/member/evaluation`,
method: Method.GET,
needToken: true,
params
@@ -90,7 +90,7 @@ export function evolutionList (params) {
// 添加交易投诉对话
export function communication (params) {
return request({
url: `/buyer/complain/communication`,
url: `/buyer/order/complain/communication`,
method: Method.POST,
needToken: true,
params
@@ -100,7 +100,7 @@ export function communication (params) {
// 退换货服务 提交物流
export function afterSaleDelivery (params) {
return request({
url: `/buyer/afterSale/delivery/${params.afterSaleSn}`,
url: `/buyer/order/afterSale/delivery/${params.afterSaleSn}`,
method: Method.POST,
needToken: true,
params
@@ -109,9 +109,27 @@ export function afterSaleDelivery (params) {
// 获取退货可选物流公司
export function getLogisticsCompany () {
return request({
url: `/buyer/logistics`,
url: `/buyer/other/logistics`,
method: Method.GET,
needToken: true,
params: { pageNumber: 1, pageSize: 200, disabled: 'OPEN' }
});
}
//查询包裹列表
export const getPackage = (sn) => {
return request({
url: `/buyer/order/order/getPackage/${sn}`,
method: Method.GET,
needToken: true,
})
}
//查询物流
export const getTracesList = (sn, params) => {
return request({
url: `/buyer/order/order/getTracesList/${sn}`,
method: Method.GET,
needToken: true,
})
};

View File

@@ -10,7 +10,7 @@ import request, {
*/
export function tradeDetail (params) {
return request({
url: '/buyer/cashier/tradeDetail',
url: '/buyer/payment/cashier/tradeDetail',
needToken: true,
method: Method.GET,
params
@@ -26,7 +26,7 @@ export function tradeDetail (params) {
*/
export function pay (params) {
return request({
url: `/buyer/cashier/pay/${params.paymentMethod}/${params.paymentClient}`,
url: `/buyer/payment/cashier/pay/${params.paymentMethod}/${params.paymentClient}`,
needToken: true,
method: Method.GET,
params
@@ -40,7 +40,21 @@ export function pay (params) {
*/
export function payCallback (params) {
return request({
url: `/buyer/cashier/result`,
url: `/buyer/payment/cashier/result`,
needToken: true,
method: Method.GET,
params
});
}
/**
* 支付结果查询
* @param orderType 交易类型,可用值:TRADE,ORDER,RECHARGE
* @param sn 订单编号
*/
export function withdrawalSettingVO (params) {
return request({
url: `/buyer/wallet/wallet/withdrawalSettingVO`,
needToken: true,
method: Method.GET,
params

View File

@@ -5,7 +5,7 @@ import request, {
// 店铺分页列表
export function shopList (params) {
return request({
url: '/buyer/store',
url: '/buyer/store/store',
needToken: true,
method: Method.GET,
params
@@ -15,7 +15,7 @@ export function shopList (params) {
// 申请店铺第一步-填写企业信息
export function applyFirst (params) {
return request({
url: '/buyer/store/apply/first',
url: '/buyer/store/store/apply/first',
needToken: true,
method: Method.PUT,
params
@@ -25,7 +25,7 @@ export function applyFirst (params) {
// 申请店铺第一步-填写企业信息
export function applySecond (params) {
return request({
url: '/buyer/store/apply/second',
url: '/buyer/store/store/apply/second',
needToken: true,
method: Method.PUT,
params
@@ -35,7 +35,7 @@ export function applySecond (params) {
// 申请店铺第一步-填写企业信息
export function applyThird (params) {
return request({
url: '/buyer/store/apply/third',
url: '/buyer/store/store/apply/third',
needToken: true,
method: Method.PUT,
params
@@ -45,7 +45,7 @@ export function applyThird (params) {
// 店铺详情
export function getDetailById (id) {
return request({
url: `/buyer/store/get/detail/${id}`,
url: `/buyer/store/store/get/detail/${id}`,
needToken: true,
method: Method.GET
})
@@ -53,7 +53,7 @@ export function getDetailById (id) {
// 店铺分类
export function getCateById (id) {
return request({
url: `/buyer/store/label/get/${id}`,
url: `/buyer/store/store/label/get/${id}`,
needToken: true,
method: Method.GET
})
@@ -61,7 +61,7 @@ export function getCateById (id) {
// 店铺入驻协议
export function agreement () {
return request({
url: `/buyer/article/type/STORE_REGISTER`,
url: `/buyer/other/article/type/STORE_REGISTER`,
needToken: true,
method: Method.GET
})
@@ -70,8 +70,20 @@ export function agreement () {
// 获取当前登录会员的店铺信息
export function applyStatus () {
return request({
url: `/buyer/store/apply`,
url: `/buyer/store/store/apply`,
needToken: true,
method: Method.GET
})
}
/**
* 获取自提点信息
* @param storeId
*/
export function getStoreAddress(storeId,params) {
return request({
url: `/buyer/store/address/page/${storeId}`,
method: Method.GET,
params
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24 44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4C12.9543 4 4 12.9543 4 24C4 35.0457 12.9543 44 24 44Z" fill="none" stroke="#333" stroke-width="4" stroke-linejoin="round"/><path d="M20 24V17.0718L26 20.5359L32 24L26 27.4641L20 30.9282V24Z" fill="none" stroke="#333" stroke-width="4" stroke-linejoin="round"/></svg>

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -10,20 +10,28 @@ $warning_color: #ff9900;
$error_color: #ed3f14;
$handle-btn-color: #438cde;
$theme_color: #ed3f14;
$theme_color: #F31947;
$border_color: #dddee1;
$title_color: #8c8c8c;
$light_title_color: #1c2438;
$light_content_color: #495060;
$light_sub_color: #80848f;
$light_background_color: #f8f8f9;
$light_background_color: #F5F5F7;
$light_white_background_color: #fff;
// 暗黑主题颜色
$dark_background_color: #141414;
$dark_sub_background_color: #1d1d1d; //稍微浅一点的
$dark_content_color: #d5d5d5;
.wes-2 {
/* 适用于webkit内核和移动端 */
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
/***** 封装一些方法可用于 黑暗主题 ,明亮主题 *****/
// 背景颜色
@@ -170,6 +178,19 @@ $dark_content_color: #d5d5d5;
margin-right: 20px;
}
.mb_24 {
margin-bottom: 24px;
}
.mt_24 {
margin-top: 24px;
}
.ml_24 {
margin-left: 24px;
}
.mr_24 {
margin-right: 24px;
}
.mb_10 {
margin-bottom: 10px;
}
@@ -270,10 +291,24 @@ li {
left: auto;
}
}
.flex{
display: flex;
}
.flex-a-c{
align-items: center;
}
.flex-j-sb{
justify-content: space-between;
}
.flex-j-c{
justify-content: center;
}
.width_1200_auto {
width: 1184px;
margin: 0 auto;
}
@@ -336,4 +371,4 @@ li {
margin:10px auto ;
text-align: right;
width: 1200px;
}
}

View File

@@ -30,8 +30,18 @@
margin-top: 6px;
}
.goods-show-detail {
height: 36px;
font-size: 12px;
margin: 6px 0px;
overflow:hidden;
text-overflow: ellipsis;
display:-webkit-box;
-webkit-line-clamp:2;
-webkit-box-orient:vertical;
color:#808080;
}
.goods-show-detail :hover{
color:#E23A3A;
}
.goods-show-num {
font-size: 12px;

View File

@@ -1,9 +1,19 @@
@import '~view-design/src/styles/index.less';
@import "~view-design/src/styles/index.less";
// iview 自定义样式
@primary-color: #ed3f14;
@primary-color: #ff5c58;
@info-color: #fa6419;
@success-color: #68cabe;
@error-color: #ff3c2a;
@table-thead-bg: #f8f8f9;
@table-td-stripe-bg: #f8f8f9;
@table-td-hover-bg: #ededed;
@table-td-highlight-bg: #ededed;
@font-size-base: 12px;
.ivu-drawer,
.drawer,
.ivu-drawer-wrap {
z-index: 2600 !important;
}
@table-thead-bg : #f8f8f9;
@table-td-stripe-bg : #f8f8f9;
@table-td-hover-bg : #ededed;
@table-td-highlight-bg : #ededed;

View File

@@ -1,6 +1,6 @@
<template>
<div>
<div class="container">
<div class="navbar" :class="{'small-search-box':useClass == 'fixed-show'}">
<div class="container width_1200_auto flex flex-a-c">
<img
:src="$store.state.logoImg"
v-if="showLogo"
@@ -8,38 +8,45 @@
alt=""
@click="$router.push('/')"
/>
<i-input
v-model="searchData"
size="large"
class="search"
placeholder="输入你想查找的商品"
@keyup.enter.native="search"
>
<Button v-if="!store" slot="append" @click="search">搜索</Button>
</i-input>
<div v-if="store" class="btn-div">
<Button class="store-search" type="warning" @click="searchStore">搜本店</Button>
<Button class="store-search" type="primary" @click="search">搜全站</Button>
<div :class="{'small-search-box':useClass == 'fixed-show'}" class="search-box">
<i-input
v-model="searchData"
size="large"
class="search "
placeholder="输入你想查找的商品"
@keyup.enter.native="search"
>
<div class="search-icon" slot="append" @click="search">
<Icon type="ios-search" size="21"/>
</div>
</i-input>
<template v-if="showTag">
<div class="only-store" v-if="storeId" @click="research()">
切换为{{!onlyStore ? '店铺内' : '平台'}}搜索
</div>
<div v-if="promotionTags.length === 0"></div>
<div v-else class="history-list flex">
<div
v-for="(item, index) in promotionTags"
:key="index"
class="mr_10"
>
<span class="history-item" @click="selectTags(item)">{{ item }}</span>
</div>
</div>
</template>
</div>
<template v-if="showTag">
<div style="height:12px" v-if="promotionTags.length === 0"></div>
<div v-else>
<Tag
v-for="(item, index) in promotionTags"
:key="index"
class="mr_10"
>
<span class="hover-color" @click="selectTags(item)">{{ item }}</span>
</Tag>
</div>
</template>
</div>
</div>
</template>
<script>
import storage from '@/plugins/storage.js'
import {hotWords} from '@/api/goods.js'
export default {
name: 'search',
props: {
@@ -51,37 +58,59 @@ export default {
type: Boolean,
default: true
},
store: { // 是否为店铺页面
type: Boolean,
default: false
storeId: { // 是否为店铺页面
type: String,
default: ""
},
hover: {
type: Boolean,
default: false
},
useClass:{
type:null,
default:''
}
},
data () {
watch:{
storeId(val){
this.onlyStore = val ? true : false
}
},
data() {
return {
searchData: '' // 搜索内容
searchData: '', // 搜索内容
onlyStore:false,
};
},
methods: {
selectTags (item) { // 选择热门标签
selectTags(item) { // 选择热门标签
this.searchData = item;
this.search();
},
search () { // 全平台搜索商品
this.$router.push({
path: '/goodsList',
query: { keyword: this.searchData }
});
research(){
this.onlyStore = !this.onlyStore
},
searchStore () { // 店铺搜索商品
search () { // 全平台搜索商品
const url = this.$route.path;
if(url == '/goodsList'){
this.$emit('search', this.searchData)
}else{
const pushData = {
path:'/goodsList',
query: { keyword: this.searchData },
}
if(this.storeId && this.onlyStore) pushData.query.storeId = this.storeId
this.$router.push(pushData);
}
},
searchStore() { // 店铺搜索商品
this.$emit('search', this.searchData)
}
},
computed: {
promotionTags () {
promotionTags() {
if (this.$store.state.hotWordsList) {
return JSON.parse(this.$store.state.hotWordsList)
} else {
@@ -89,8 +118,9 @@ export default {
}
}
},
created () {
created() {
this.searchData = this.$route.query.keyword
if (!this.hover) { // 首页顶部固定搜索栏不调用热词接口
// 搜索热词每5分钟请求一次
const reloadTime = storage.getItem('hotWordsReloadTime')
@@ -111,27 +141,70 @@ export default {
};
</script>
<style scoped lang="scss">
.container {
margin: 30px auto;
width: 460px;
position: relative;
.only-store{
text-align: right;
color:$theme_color;
cursor: pointer;
}
.navbar {
height: 113px;
background: #fff;
}
.search-icon{
width: 100%;
height: 100%;
}
.small-search-box{
height: 60px;
margin: 0 !important;
}
.container {
position: relative;
height: 100%;
}
.search {
width: 778.4px;
margin: 10px 0px 5px 0;
/deep/ .ivu-input.ivu-input-large {
border: 2px solid $theme_color;
font-size: 12px;
height: 34px;
border-radius: 18.9px;
::v-deep .ivu-input.ivu-input-large {
border: 1.4px solid $theme_color;
box-sizing: border-box;
border-radius: 19.6px;
position: relative;
padding-left: 26px;
font-size: 14px;
font-weight: normal;
height: 37.8px;
color: #999;
&:focus {
box-shadow: none;
}
}
/deep/ .ivu-input-group-append {
border: 1px solid $theme_color;
border-left: none;
height: 30px;
::v-deep .ivu-input-group-append {
border-radius: 19.6px !important;
cursor: pointer;
box-sizing: border-box;
border: 1.4px solid $theme_color;
width: 67.2px;
height: 37.8px;
position: absolute;
right: 0;
display: flex;
align-items: center;
justify-content: center;
top: 0;
z-index: 99;
background-color: $theme_color;
color: #ffffff;
button {
font-size: 14px;
font-weight: 600;
@@ -139,24 +212,46 @@ export default {
}
}
}
.search-box{
margin-left: 28px;
}
.logo-img {
position: absolute;
left: -360px;
top: -9px;
width: 150px;
max-width: 150px;
cursor: pointer;
}
.store-search{
.store-search {
width: 55.6px;
padding: 0 9px;
border-radius: 0;
&:nth-child(2){
margin-left: -5px;
border-radius: 3px;
&:nth-child(2) {
width: 55px;
margin-left: -2px;
border-radius: 3px;
}
}
.btn-div{
.btn-div {
position: relative;
height: 0px;
top: -38px;
left: 339px;
left: 352px;
}
.history-list {
margin-left: 28px;
}
.history-item {
font-size: 13px;
font-weight: normal;
line-height: 16px;
letter-spacing: 0px;
margin-right: 17px;
color: #666666;
cursor: pointer;
}
</style>

View File

@@ -12,12 +12,8 @@
<i-input v-model="formData.name" style="width: 600px"></i-input>
</FormItem>
<FormItem label="收件地区" prop="address">
<i-input
v-model="formData.address"
disabled
style="width: 600px"
></i-input>
<Button type="primary" size="small" @click="$refs.map.showMap = true">选择</Button>
{{ formData.address || '暂无地址' }}
<Button type="primary" style="margin-left: 10px;" size="small" @click="$refs.map.open()">选择</Button>
</FormItem>
<FormItem label="详细地址" prop="detail">
<i-input v-model="formData.detail" style="width: 600px"></i-input>
@@ -43,12 +39,12 @@
<Button type="primary" class="mr_10" :loading="loading" @click="save">保存收货地址</Button>
</div>
</Modal>
<lili-map ref="map" @getAddress="getAddress"></lili-map>
<multipleMap ref="map" @callback="getAddress"></multipleMap>
</div>
</template>
<script>
import liliMap from '@/components/map';
import multipleMap from "@/components/map/multiple-map";
import {
newMemberAddress,
editMemberAddress,
@@ -129,14 +125,24 @@ export default {
}
});
},
getAddress (item) {
// 获取地图选择信息
this.mapMsg = item;
this.$set(this.formData, 'address', item.addr);
this.$set(this.formData, 'consigneeAddressIdPath', item.addrId);
this.$set(this.formData, 'detail', item.detail);
this.formData.lat = item.position.lat;
this.formData.lon = item.position.lng;
getAddress (val) {
// 获取地图选择信息
if(val.type === 'select'){
const paths = val.data.map(item => item.name).join(',')
const ids = val.data.map(item => item.id).join(',')
this.$set(this.formData,'address',paths)
this.$set(this.formData,'consigneeAddressIdPath',ids)
const coord = val.data[val.data.length - 1].center.split(',')
this.formData.lat = coord[1]
this.formData.lon = coord[0]
}else{
this.$set(this.formData, "address", val.data.addr);
this.$set(this.formData, "consigneeAddressIdPath", val.data.addrId);
this.$set(this.formData, "detail", val.data.address);
this.formData.lat = val.data.position.lat;
this.formData.lon = val.data.position.lng;
}
},
show () { // 地址模态框显示
this.showAddr = true;
@@ -158,7 +164,7 @@ export default {
}
},
components: {
liliMap
multipleMap
}
};
</script>

View File

@@ -24,7 +24,7 @@ export default {
.advertising {
height: 80px;
width: 100%;
background-color: $theme_color;
text-align: center;
overflow: hidden;
position: relative;

View File

@@ -113,12 +113,12 @@ export default {
}
}
/deep/ .ivu-card, .ivu-card-head, ._Card {
::v-deep .ivu-card, .ivu-card-head, ._Card {
margin-bottom: 20px;
@include white_background_color();
}
/deep/ .ivu-card-head {
::v-deep .ivu-card-head {
position: relative;
padding: 0 14px;
height: 50px;
@@ -140,7 +140,7 @@ export default {
cursor: pointer;
}
/deep/ .ivu-card-body {
::v-deep .ivu-card-body {
padding: 0 !important;
display: none;
}

View File

@@ -190,7 +190,7 @@ export default {
this.$router.push('/home/Coupons')
},
onCancel: () => {
if (item.storeId !== 'platform') {
if (item.storeId !== '0') {
this.$router.push({path: '/merchant', query: {id: item.storeId}})
} else {
if (item.scopeType === 'PORTION_GOODS_CATEGORY') {
@@ -290,7 +290,7 @@ export default {
}
this.loading = true
tracksList(params).then(res => {
this.tracksList = res.result
this.tracksList = res.result.records
this.loading = false
}).catch(() => { this.loading = false })
}

View File

@@ -147,11 +147,11 @@ export default {
justify-content: center;
flex-direction: column;
}
/deep/.popup .ivu-drawer-body{
::v-deep.popup .ivu-drawer-body{
padding: 0!important;
background-color: #eee;
}
/deep/.popup .ivu-drawer-wrap{
::v-deep.popup .ivu-drawer-wrap{
z-index: 3001;
}
</style>

View File

@@ -7,6 +7,7 @@
alt=""
/>
<p v-if="_Title">{{ _Title }}</p>
<slot></slot>
</div>
</template>
@@ -35,6 +36,6 @@ export default {
}
p {
cursor: pointer;
}
</style>

View File

@@ -0,0 +1,119 @@
<template>
<div class="shadow-box">
<div class="shadow-item flex flex-a-c flex-j-c" v-for="(item,index) in iconList" @click="handleClickIcon(item)" :key="index">
<img class="icon" :src="require(`@/assets/iconfont/${item.icon}.png`)">
<div class="shadow-label">{{item.label}}</div>
<div class="line" v-if="iconList.length-1 !=index"></div>
</div>
</div>
</template>
<script>
export default {
name: "fixed-index",
data(){
return{
iconList:[
{
icon:"user",
label:"会员中心",
path:"/home"
},
{
icon:"carts",
label:"购物车",
path:"/cart"
},
{
icon:"notification",
label:"消息",
path:"/home/MsgList"
},
{
icon:"collage",
label:"收藏",
path:"/home/Favorites"
},
{
icon:"back",
label:"顶部",
path:"back"
},
],
isScrolling:false,
timeoutId:"",
}
},
mounted() {
const vm = this
// 添加滚轮事件监听器
window.addEventListener('wheel', function() {
if (vm.isScrolling) {
// 如果页面正在滚动,则取消定时器并设置 isScrolling 为 false
window.cancelAnimationFrame(vm.timeoutId);
vm.isScrolling = false;
}
});
},
methods:{
scrollToTop() {
const c = document.documentElement.scrollTop || document.body.scrollTop;
if (c > 0) {
this.timeoutId = window.requestAnimationFrame(this.scrollToTop);
window.scrollTo(0, c - c / 4);
this.isScrolling = true;
}else {
this.isScrolling = false;
}
},
handleClickIcon(val){
if(val.path === 'back'){
this.scrollToTop()
}else{
this.$router.push(val.path)
}
}
}
}
</script>
<style scoped lang="scss">
.shadow-box{
width: 64px;
height: 354px;
border-radius: 10px;
opacity: 1;
background: #FFFFFF;
box-shadow: 0px 1px 10px 0px rgba(154, 154, 154, 0.5);
}
.shadow-label{
font-size: 13px;
font-weight: normal;
line-height: 16px;
text-align: center;
letter-spacing: 0px;
color: #666666;
}
.icon{
margin-top: 15px;
width: 20px;
height: 20px;
margin-bottom: 5px;
}
.shadow-item{
cursor: pointer;
flex-direction: column;
height: 70px;
>.line{
width: 34px;
height: 1px;
opacity: 1;
margin-top: 17px;
border: 0.7px solid #EAEAEA;
}
}
</style>

View File

@@ -3,20 +3,20 @@
<footer class="footer">
<div class="clearfix"></div>
<div class="icon-row">
<div class="footer-icon">
<h5 class="footer-icon-child"></h5>
<div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child"></h5>
<span class="footer-icon-text">品类齐全轻松购物</span>
</div>
<div class="footer-icon">
<h5 class="footer-icon-child footer-icon-child-2"></h5>
<div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child footer-icon-child-2"></h5>
<span class="footer-icon-text">多仓直发极速配送</span>
</div>
<div class="footer-icon">
<h5 class="footer-icon-child footer-icon-child-3"></h5>
<div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child footer-icon-child-3"></h5>
<span class="footer-icon-text">正品行货精致服务</span>
</div>
<div class="footer-icon">
<h5 class="footer-icon-child footer-icon-child-4"></h5>
<div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child footer-icon-child-4"></h5>
<span class="footer-icon-text">天天低价畅选无忧</span>
</div>
</div>
@@ -37,27 +37,28 @@
</li>
</ul>
<div class="icp">
<li v-if="config.icpCard">
<a href="https://beian.miit.gov.cn/" target="_blank">
</a>
</li>
<li v-if="config.icpMessage">
<a href="https://beian.miit.gov.cn/" target="_blank">
{{config.icpMessage}}
</a>
</li>
</div>
</div>
<div class="information">
<a class="flex " :href="config.company.href">
<img class="zhizhao" src="@/assets/images/zhizhao.jpg" mode="" />{{config.company.title}}
</a>
</div>
<div class="information footer-bottmom">
<div class="icp">
<li v-if="config.icpCard">
<a :href='"https://tsm.miit.gov.cn/dxxzsp/xkz/xkzgl/resource/qiyesearch.jsp?num="+config.icpCard+"&type=xuke"' target="_blank">
{{config.icpCard}}
</a>
</li>
<li v-if="config.icpMessage" class="footer-bottmom">
<a href="https://beian.miit.gov.cn/" target="_blank">
{{config.icpMessage}}
</a>
</li>
</div>
<a class="flex " :href="config.company.href">
<img class="zhizhao" src="@/assets/images/zhizhao.jpg" mode="" />{{config.company.name}}
</a>
</div>
<div class="clearfix"></div>
<div class="copyright">
<p>Copyright © {{year}} {{config.title}}</p>
@@ -68,16 +69,16 @@
</template>
<script>
import config from '@/config'
export default {
name: "Footer",
data() {
return {
config,
config:require('@/config'),
guideArr: [
// 导航链接
["购物指南", "购物流程", "会员介绍", "生活旅行", "常见问题"],
["配送方式", "上门自提", "配送服务查询", "收取标准", "物流规则"],
["配送方式", "上门自提", "配送查询", "收取标准", "物流规则"],
["支付方式", "在线支付", "公司转账", "余额支付", "积分支付"],
["售后服务", "售后政策", "退款说明", "返修/退货", "取消订单"],
],
@@ -101,40 +102,36 @@ export default {
/*****************************底 部 开 始*****************************/
.footer {
width: 100%;
padding-top: 30px;
@include background_color($light_background_color);
height: 370px;
background: #FFFFFF;
}
.icon-row {
margin: 15px auto;
padding-top: 8px;
width: 1000px;
height: 64px;
display: flex;
align-items: center;
justify-content: space-between;
width: 1056px;
height: 71px;
margin: 0 auto;
}
.footer-icon {
margin-left: 17px;
margin-right: 17px;
float: left;
}
.footer-icon-child {
margin-top: 10px;
overflow: hidden;
position: absolute;
width: 36px;
height: 42px;
background-image: url("../../assets/images/footer/ico_service.png");
text-indent: -999px;
}
.footer-icon-child-2 {
background-position: 0 -43px;
}
.footer-icon-child-3 {
background-position: 0 -86px;
}
.footer-icon-child-4 {
background-position: 0 -129px;
width: 36.4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18.2px;
font-weight: normal;
color: #333;
height: 36.4px;
border: 1.4px solid #CECECE;
border-radius: 50%;
}
.icp {
margin-right: 30px !important;
>*{
margin: 0 4px;
}
@@ -148,52 +145,69 @@ export default {
}
}
.footer-icon-text {
margin-left: 45px;
font-size: 18px;
font-weight: bold;
line-height: 64px;
margin-left: 11px;
font-size: 16px;
font-weight: normal;
text-align: center;
}
.service-intro {
width: 100%;
border-top: 1px solid $border_color;
}
.servece-type {
margin: 15px auto;
width: 800px;
width: 952px;
margin: 22px auto 10px auto;
display: flex;
flex-direction: row;
justify-content: space-between;
}
}
.servece-type-info{
}
.servece-type-info ul {
list-style: none;
}
.servece-type-info li {
font-size: 14px;
font-size: 12px;
cursor: pointer;
line-height: 26px;
font-weight: normal;
line-height: 15px;
text-align: center;
margin-bottom: 13px;
color: #333;
}
.servece-type-info li:first-child {
font-size: 16px;
line-height: 28px;
font-weight: bold;
font-size: 14.82px;
font-weight: normal;
line-height: 18px;
letter-spacing: 0px;
margin-bottom: 17px;
color: #333333;
}
.friend-link {
display: flex;
align-items: flex-start;
justify-content: space-between;
justify-content: center;
width: 908px;
padding: 10px 0;
margin: 0px auto;
border-top: 1px solid $border_color;
}
.information {
margin-top: 23px;
margin-bottom: 21px;
display: flex;
flex-direction: column;
> * {
margin: 2px 0;
}
justify-content: center;
}
a{
color: #3457FF;
}
.zhizhao {
width: 20px;
@@ -206,24 +220,38 @@ export default {
.friend-link-item li {
padding: 5px 0px;
float: left;
margin-right: 59px;
font-weight: normal;
line-height: 13px;
color: #333333;
}
.link-item {
padding: 0px 8px;
cursor: pointer;
border-right: 1px solid $border_color;
}
.link-last-item {
border: none;
}
.copyright {
width: 100%;
line-height: 30px;
cursor: pointer;
text-align: center;
height:25px;
opacity: 1;
margin-bottom: 12px;
font-size: 12px;
font-weight: normal;
line-height: 13px;
letter-spacing: 0px;
color: #959595;
}
.copyright a {
color: #232323;
font-size: 20px;
}
.footer-icon-text {
@include title_color($light_title_color);
}

View File

@@ -4,22 +4,31 @@
<!-- 详情左侧展示数据图片收藏举报 -->
<div class="item-detail-left">
<!-- 大图放大镜 -->
<div class="item-detail-big-img">
<pic-zoom :url="imgList[imgIndex].url" :scale="2"></pic-zoom>
<!-- <div id="dplayer"></div> -->
<div class="item-detail-big-img" v-if="imgList[imgIndex]">
<pic-zoom :url="imgList[imgIndex].url || imgList[imgIndex]" :scale="2"></pic-zoom>
</div>
<!-- <div id="dplayer"></div> -->
<div class="item-detail-img-row">
<div
class="item-detail-img-small"
@mouseover="imgIndex = index"
v-for="(item, index) in imgList"
:key="index"
>
<img :src="item.url" />
<img :src="item.url || item"/>
</div>
</div>
<div class="goodsConfig mt_10">
<span @click="collect" ><Icon type="ios-heart" :color="isCollected ? '#ed3f14' : '#666'" />{{isCollected?'已收藏':'收藏'}}</span>
<span @click="collect"
><Icon
type="ios-heart"
:color="isCollected ? '#ed3f14' : '#666'"
/>{{ isCollected ? "已收藏" : "收藏" }}</span
>
</div>
</div>
<!-- 右侧商品信息活动信息操作展示 -->
@@ -27,53 +36,155 @@
<div class="item-detail-title">
<p>
{{ skuDetail.goodsName }}
<Tag
v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'"
style="margin-top:10px;rgb(153, 149, 149);"
>
实物商品
</Tag>
<Tag
v-else-if="skuDetail.goodsType == 'VIRTUAL_GOODS'"
style="margin-top:10px;rgb(153, 149, 149);"
>
虚拟商品
</Tag>
</p>
</div>
<div class="sell-point">
{{skuDetail.sellingPoint}}
{{ skuDetail.sellingPoint }}
</div>
<!-- 限时秒杀 -->
<Promotion v-if="promotionMap['SECKILL']" :time="promotionMap['SECKILL'].endTime"></Promotion>
<Promotion
v-if="promotionMap['SECKILL']"
:time="promotionMap['SECKILL'].endTime"
></Promotion>
<!-- 商品详细 价格优惠券促销 -->
<div class="item-detail-price-row">
<div class="item-price-left">
<!-- 商品原价 -->
<div class="item-price-row" v-if="!skuDetail.promotionPrice">
<!-- 秒杀价格 -->
<div
class="item-price-row"
v-if="skuDetail.promotionPrice && promotionMap['SECKILL']"
>
<p>
<span class="item-price-title"> &nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="item-price">{{skuDetail.price | unitPrice("¥")}}</span>
<span class="item-price-title" v-if="promotionMap['SECKILL']"
> &nbsp;&nbsp;</span
>
<span class="item-price">{{
skuDetail.promotionPrice | unitPrice("¥")
}}</span>
<span class="item-price-old">{{
skuDetail.price | unitPrice("¥")
}}</span>
</p>
</div>
<!-- 秒杀价格 -->
<div class="item-price-row" v-if="skuDetail.promotionPrice">
<p>
<span class="item-price-title" v-if="promotionMap['SECKILL']"> &nbsp;&nbsp;</span>
<span class="item-price">{{skuDetail.promotionPrice | unitPrice("¥")}}</span>
<span class="item-price-old">{{skuDetail.price | unitPrice("¥")}}</span>
</p>
<!-- 商品原价 -->
<div class="item-price-row" v-else>
<!-- 批发价格 -->
<div v-if="wholesaleNum && wholesaleNum.length">
<div class="flex">
<div class="item-price-title">
&nbsp;&nbsp;&nbsp;&nbsp;
</div>
<div
v-for="(item, index) in wholesalePrice"
:key="index"
class="item-price item-num"
>
{{ item | unitPrice("¥") }}
</div>
</div>
<div class="flex">
<div class="item-price-title"> </div>
<div
v-for="(item, index) in wholesaleNum"
:key="index"
class="item-num item-price-num"
>
{{ item }}{{ skuDetail.goodsUnit }}
</div>
</div>
</div>
<!-- 普通价格 -->
<div v-else>
<span class="item-price-title"
> &nbsp;&nbsp;&nbsp;&nbsp;</span
>
<span class="item-price">{{
skuDetail.price | unitPrice("¥")
}}</span>
</div>
</div>
<!-- 优惠券展示 -->
<div class="item-price-row" v-if="promotionMap['COUPON'].length">
<p>
<div class="item-price-coupon-row" v-if="promotionMap['COUPON'].length">
<p class="Ellipsis">
<span class="item-price-title"> </span>
<span
class="item-coupon"
v-for="(item, index) in promotionMap['COUPON']"
:key="index"
@click="receiveCoupon(item.id)"
<span>
<span
class="item-coupon"
v-for="(item, index) in promotionMap['COUPON'].slice(0, 6)"
:key="index"
@click="receiveCoupon(item.id)"
>
<span v-if="item.couponType == 'PRICE'">{{ item.consumeThreshold }}{{item.price}}</span>
<span v-if="item.couponType == 'DISCOUNT'">{{ item.consumeThreshold }}{{item.couponDiscount}}</span>
<span v-if="item.couponType == 'PRICE'"
>{{ item.consumeThreshold }}{{ item.price }}</span
>
<span v-if="item.couponType == 'DISCOUNT'"
>{{ item.consumeThreshold }}{{
item.couponDiscount
}}</span
>
</span>
</span>
<div class="dropdown" v-if="promotionMap['COUPON'].length > 6">
<span>展开更多</span>
<div class="dropdown-content">
<span
class="item-coupon"
v-for="(item, index) in promotionMap['COUPON'].slice(6, promotionMap['COUPON'].length)"
:key="index"
@click="receiveCoupon(item.id)"
>
<span v-if="item.couponType == 'PRICE'"
>{{ item.consumeThreshold }}{{ item.price }}</span
>
<span v-if="item.couponType == 'DISCOUNT'"
>{{ item.consumeThreshold }}{{
item.couponDiscount
}}</span
>
</span>
</div>
</div>
</p>
</div>
<!-- 满减展示 -->
<div class="item-price-row" v-if="promotionMap['FULL_DISCOUNT']">
<p>
<span class="item-price-title">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="item-price-title"
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span
>
<span class="item-promotion">满减</span>
<span class="item-desc-pintuan" v-if="promotionMap['FULL_DISCOUNT'].fullMinus">{{ promotionMap['FULL_DISCOUNT'].fullMoney }}立减现金{{ promotionMap['FULL_DISCOUNT'].fullMinus}}</span>
<span class="item-desc-pintuan" v-if="promotionMap['FULL_DISCOUNT'].fullRate">{{ promotionMap['FULL_DISCOUNT'].fullMoney }}立享{{ promotionMap['FULL_DISCOUNT'].fullRate}}</span>
<span
class="item-desc-pintuan"
v-if="promotionMap['FULL_DISCOUNT'].fullMinus"
>{{ promotionMap["FULL_DISCOUNT"].fullMoney }}立减现金{{
promotionMap["FULL_DISCOUNT"].fullMinus
}}</span
>
<span
class="item-desc-pintuan"
v-if="
promotionMap['FULL_DISCOUNT'].fullRate &&
promotionMap['FULL_DISCOUNT'].fullRateFlag
"
>满{{ promotionMap["FULL_DISCOUNT"].fullMoney }}元,立享{{
promotionMap["FULL_DISCOUNT"].fullRate
}}折</span
>
</p>
</div>
</div>
@@ -81,20 +192,35 @@
<div class="item-remarks-sum">
<p>累计评价</p>
<p>
<span class="item-remarks-num">{{ skuDetail.commentNum || 0 }} </span>
<span class="item-remarks-num"
>{{ skuDetail.commentNum || 0 }} 条</span
>
</p>
</div>
</div>
</div>
<!-- 选择颜色 -->
<div class="item-select" v-for="(sku, index) in formatList" :key="sku.name">
<div
class="item-select"
v-for="(sku, index) in formatList"
:key="sku.name"
>
<div class="item-select-title">
<p>{{ sku.name }}</p>
</div>
<div class="item-select-column">
<div class="item-select-row" v-for="(item) in sku.values" :key="item.value">
<div class="item-select-box" @click="select(index, item.value)"
:class="{ 'item-select-box-active': item.value === currentSelceted[index] }"
<div
class="item-select-row"
v-for="item in sku.values"
:key="item.value"
>
<div
class="item-select-box"
@click="select(index, item.value)"
:class="{
'item-select-box-active':
item.value === currentSelceted[index],
}"
>
<div class="item-select-intro">
<p>{{ item.value }}</p>
@@ -110,72 +236,191 @@
<p>数量</p>
</div>
<div class="item-select-row">
<InputNumber :min="1" :disabled="skuDetail.quantity === 0" v-model="count"></InputNumber>
<span class="inventory"> 库存{{skuDetail.quantity}}</span>
<InputNumber
:min="1"
:max="skuDetail.quantity"
:disabled="skuDetail.quantity === 0"
v-model="count"
:precision="0.1"
@on-blur="changeCount"
></InputNumber>
<span class="inventory"> 库存{{ skuDetail.quantity }}</span>
</div>
</div>
<div class="item-select" v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS' && skuDetail.weight !== 0">
<div
class="item-select"
v-if="
skuDetail.goodsType !== 'VIRTUAL_GOODS' && skuDetail.weight !== 0
"
>
<div class="item-select-title">
<p>重量</p>
</div>
<div class="item-select-row">
<span class="inventory"> {{skuDetail.weight}}kg</span>
<span class="inventory"> {{ skuDetail.weight }}kg</span>
</div>
</div>
<div class="add-buy-car" v-if="$route.query.way === 'POINT' && skuDetail.isAuth === 'PASS'">
<Button type="error" :loading="loading" :disabled="skuDetail.quantity === 0" @click="pointPay">积分购买</Button>
</div>
<div class="add-buy-car" v-if="$route.query.way !== 'POINT' && skuDetail.isAuth === 'PASS'">
<Button type="error" v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'" :loading="loading" :disabled="skuDetail.quantity === 0" @click="addShoppingCartBtn">加入购物车</Button>
<Button type="warning" :loading="loading1" :disabled="skuDetail.quantity === 0" @click="buyNow">立即购买</Button>
<div
class="add-buy-car"
v-if="$route.query.way === 'POINT' && skuDetail.authFlag === 'PASS'"
>
<Button
type="error"
:loading="loading"
:disabled="skuDetail.quantity === 0"
@click="pointPay"
>积分购买</Button
>
</div>
<div
class="add-buy-car"
v-if="$route.query.way !== 'POINT' && skuDetail.authFlag === 'PASS'"
>
<Button
type="error"
v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'"
:loading="loading"
:disabled="skuDetail.quantity === 0"
@click="addShoppingCartBtn"
>加入购物车</Button
>
<Button
type="warning"
:loading="loading1"
:disabled="skuDetail.quantity === 0"
@click="buyNow"
>立即购买</Button
>
<Tooltip content="观看视频" v-if="skuDetail.goodsVideo">
<img class="view-video" @click="showGoodsVideo = true" :src="require('@/assets/iconfont/play.svg')" alt="">
</Tooltip>
</div>
</div>
</div>
<Modal title="浏览视频" v-model="showGoodsVideo">
<div id="dplayer"></div>
</Modal>
</div>
</div>
</template>
<script>
import Promotion from './Promotion.vue';
import PicZoom from 'vue-piczoom'; // 图片放大
import { collectGoods, isCollection, receiveCoupon, cancelCollect } from '@/api/member.js';
import { addCartGoods } from '@/api/cart.js';
import Promotion from "./Promotion.vue";
import PicZoom from "vue-piczoom"; // 图片放大
import DPlayer from "dplayer";
import {
collectGoods,
isCollection,
receiveCoupon,
cancelCollect,
} from "@/api/member.js";
import { addCartGoods } from "@/api/cart.js";
export default {
name: 'ShowGoods',
name: "ShowGoods",
props: {
// 商品数据
detail: {
type: Object,
default: null
default: null,
},
},
watch: {
detail: {
handler(val) {
this.skuDetail = val.data;
this.wholesaleList = val.wholesaleList;
if (this.wholesaleList && this.wholesaleList.length > 0) {
this.count = this.wholesaleList[0].num;
}
this.promotion();
this.swiperGoodsImg();
},
deep: true,
immediate: true,
},
showGoodsVideo(val){
if(val){
this.initVideo();
}
}
},
data () {
data() {
return {
showGoodsVideo:false,
goodsVideo:"",
wholesaleList: [],
count: 1, // 商品数量
imgIndex: 0, // 展示图片下标
currentSelceted: [], // 当前商品sku
imgList: [{}], // 商品图片列表
skuDetail: this.detail.data, // sku详情
imgList: [], // 商品图片列表
skuDetail: {
specList: [],
}, // sku详情
goodsSpecList: this.detail.specs, // 商品spec
promotionMap: { // 活动状态
promotionMap: {
// 活动状态
SECKILL: null,
FULL_DISCOUNT: null,
COUPON: []
COUPON: [],
}, // 促销活动
formatList: [], // 选择商品品类的数组
loading: false, // 立即购买loading
loading1: false, // 加入购物车loading
isCollected: false // 是否收藏
isCollected: false, // 是否收藏
};
},
components: { PicZoom, Promotion },
computed: {
wholesalePrice(key) {
return this.wholesaleList.length
? this.wholesaleList.map((item) => {
return item.price;
})
: [];
},
wholesaleNum(key) {
return this.wholesaleList.length
? this.wholesaleList.map((item) => {
return item.num;
})
: [];
},
},
methods: {
select (index, value) { // 选择规格
// 初始化video
initVideo(){
if(!this.goodsVideo ){
setTimeout(()=>{
this.goodsVideo = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url:this.skuDetail.goodsVideo,
},
});
},100)
}
},
changeCount(val) {
if (this.wholesaleList && this.wholesaleList.length > 0) {
if (this.count <= this.wholesaleList[0].num) {
this.$Message.warning("批发商品购买数量不能小于起批数量");
this.count = this.wholesaleList[0].num;
}
}
},
select(index, value) {
// 选择规格
this.$set(this.currentSelceted, index, value);
let selectedSkuId = this.goodsSpecList.find((i) => {
let matched = true;
let specValues = i.specValues.filter((j) => j.specName !== 'images');
let specValues = i.specValues.filter((j) => j.specName !== "images");
for (let n = 0; n < specValues.length; n++) {
if (specValues[n].specValue !== this.currentSelceted[n]) {
matched = false;
@@ -186,77 +431,90 @@ export default {
return i;
}
});
this.$router.push({
path: '/goodsDetail',
query: { skuId: selectedSkuId.skuId, goodsId: this.skuDetail.goodsId }
this.$emit("handleClickSku", {
skuId: selectedSkuId.skuId,
goodsId: this.skuDetail.goodsId,
});
},
addShoppingCartBtn () { // 添加购物车
const params = {
num: this.count,
skuId: this.skuDetail.id
};
this.loading = true;
addCartGoods(params).then(res => {
this.loading = false;
if (res.success) {
this.$router.push({path: '/shoppingCart', query: {detail: this.skuDetail, count: this.count}});
} else {
this.$Message.warning(res.message);
}
}).catch(() => {
this.loading = false;
});
},
buyNow () { // 立即购买
addShoppingCartBtn() {
// 添加购物车
const params = {
num: this.count,
skuId: this.skuDetail.id,
cartType: 'BUY_NOW'
};
this.loading = true;
addCartGoods(params)
.then((res) => {
this.loading = false;
if (res.success) {
this.$router.push({
path: "/shoppingCart",
query: { detail: this.skuDetail, count: this.count },
});
} else {
this.$Message.warning(res.message);
}
})
.catch(() => {
this.loading = false;
});
},
buyNow() {
// 立即购买
const params = {
num: this.count,
skuId: this.skuDetail.id,
cartType: "BUY_NOW",
};
// 虚拟商品购买
if (this.skuDetail.goodsType === 'VIRTUAL_GOODS') {
params.cartType = 'VIRTUAL'
if (this.skuDetail.goodsType === "VIRTUAL_GOODS") {
params.cartType = "VIRTUAL";
}
this.loading1 = true;
addCartGoods(params).then(res => {
this.loading1 = false;
if (res.success) {
this.$router.push({path: '/pay', query: {way: params.cartType}});
} else {
this.$Message.warning(res.message);
}
}).catch(() => {
this.loading1 = false;
});
addCartGoods(params)
.then((res) => {
this.loading1 = false;
if (res.success) {
this.$router.push({
path: "/pay",
query: { way: params.cartType },
});
} else {
this.$Message.warning(res.message);
}
})
.catch(() => {
this.loading1 = false;
});
},
async collect () { // 收藏商品
async collect() {
// 收藏商品
if (this.isCollected) {
let cancel = await cancelCollect('GOODS', this.skuDetail.id)
let cancel = await cancelCollect("GOODS", this.skuDetail.id);
if (cancel.success) {
this.$Message.success('取消收藏成功')
this.isCollected = false
this.$Message.success("取消收藏成功");
this.isCollected = false;
}
} else {
let collect = await collectGoods('GOODS', this.skuDetail.id);
let collect = await collectGoods("GOODS", this.skuDetail.id);
if (collect.code === 200) {
this.isCollected = true;
this.$Message.success('收藏商品成功,可以前往个人中心我的收藏查看');
this.$Message.success("收藏商品成功,可以前往个人中心我的收藏查看");
}
}
},
// 格式化数据
formatSku (list) {
formatSku(list) {
let arr = [{}];
list.forEach((item, index) => {
item.specValues.forEach((spec, specIndex) => {
let name = spec.specName;
let values = {
value: spec.specValue,
quantity: item.quantity
quantity: item.quantity,
};
if (name === 'images') {
if (name === "images") {
return;
}
@@ -275,7 +533,7 @@ export default {
if (!keys.includes(name)) {
arr.push({
name: name,
values: [values]
values: [values],
});
}
});
@@ -286,55 +544,66 @@ export default {
let cur = list.filter((i) => i.skuId === this.$route.query.skuId)[0];
if (cur) {
cur.specValues.filter((i) => i.specName !== 'images')
cur.specValues
.filter((i) => i.specName !== "images")
.forEach((value, _index) => {
this.currentSelceted[_index] = value.specValue;
});
}
this.skuList = list;
},
receiveCoupon (id) { // 领取优惠券
receiveCoupon(id).then(res => {
receiveCoupon(id) {
// 领取优惠券
receiveCoupon(id).then((res) => {
if (res.success) {
this.$Message.success('优惠券领取成功')
this.$Message.success("优惠券领取成功");
} else {
this.$Message.warning(res.message)
this.$Message.warning(res.message);
}
})
});
},
promotion () { // 格式化促销活动,返回当前促销的对象
promotion() {
this.promotionMap = {SECKILL: null, FULL_DISCOUNT: null, COUPON: []};
// 格式化促销活动,返回当前促销的对象
if (!this.detail.promotionMap) return false;
let keysArr = Object.keys(this.detail.promotionMap);
if (keysArr.length === 0) return false;
for (let i = 0; i < keysArr.length; i++) {
let key = keysArr[i].split('-')[0]
if (key === 'COUPON') {
this.promotionMap[key].push(this.detail.promotionMap[keysArr[i]])
let key = keysArr[i].split("-")[0];
if (key === "COUPON") {
this.promotionMap[key].push(this.detail.promotionMap[keysArr[i]]);
} else {
this.promotionMap[key] = this.detail.promotionMap[keysArr[i]]
this.promotionMap[key] = this.detail.promotionMap[keysArr[i]];
}
}
}
},
swiperGoodsImg() {
this.skuDetail.specList.forEach((e) => {
if (e.specName === "images") {
this.imgList = this.skuDetail.goodsGalleryList.filter(i => i.indexOf("\"url\":") === -1 && i.indexOf("\"status\":") === -1);
}
});
if (!this.imgList) {
this.imgList = [this.skuDetail.original];
}
},
},
mounted () {
mounted() {
// 用户登录才会判断是否收藏
if (this.Cookies.getItem('userInfo')) {
isCollection('GOODS', this.skuDetail.id).then(res => {
if (this.Cookies.getItem("userInfo")) {
isCollection("GOODS", this.skuDetail.id).then((res) => {
if (res.success && res.result) {
this.isCollected = true;
}
})
});
}
this.detail.data.specList.forEach(e => {
if (e.specName === 'images') {
this.imgList = e.specImage
}
})
this.formatSku(this.goodsSpecList);
this.promotion()
document.title = this.skuDetail.goodsName
}
// this.promotion();
document.title = this.skuDetail.goodsName;
},
};
</script>
@@ -344,58 +613,24 @@ export default {
width: 175px;
margin-left: 30px;
}
.flex {
display: flex;
}
.inventory {
padding-left: 4px;
}
.global_color {
text-align: center;
}
.see-Img {
width: 100%;
height: 175px;
}
.see-Item {
> p {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.Report {
color: $theme_color !important;
}
.wrapper {
@include white_background_color();
}
.item-sale-flex {
width: 29%;
padding: 0 3%;
.item-num {
text-align: center;
width: 100px;
}
.item-sale {
margin: 10px 0;
> h3 {
width: 13%;
text-align: center;
font-size: 20px;
line-height: 60px;
box-sizing: border-box;
border-right: 1px solid $border_color;
}
height: 60px;
justify-content: center;
align-items: center;
display: flex;
width: 1200px;
margin: 0 auto;
margin-bottom: 10px;
border: 1px solid $border_color;
background: #f7f7f7;
.item-price-num {
font-size: 16px;
color: #666;
}
.item-detail-show {
@@ -408,6 +643,7 @@ export default {
.item-detail-left {
width: 350px;
margin-right: 30px;
}
@@ -416,8 +652,14 @@ export default {
height: 350px;
box-shadow: 0px 0px 8px $border_color;
cursor: pointer;
}
}
#dplayer{
width: 100%;
height: 100%;
}
.item-detail-big-img img {
width: 100%;
}
@@ -505,14 +747,65 @@ export default {
margin-left: 5px;
}
.item-price-coupon-row {
display: flex;
align-items: center;
margin: 5px 0px;
}
.Ellipsis {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2; //控制显示几行
-webkit-box-orient: vertical; //webbox方向
}
.dropdown {
position: relative;
display: inline-block;
cursor: pointer;
z-index: 999;
}
.dropdown .item-coupon {
display: flex;
align-content: center;
align-items: center;
color: $theme_color;
margin: 5px 0;
font-size: 12px;
background-color: #ffdedf;
border: 1px dotted $theme_color;
cursor: pointer;
span {
padding: 3px;
}
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
padding: 12px 16px;
}
.dropdown:hover .dropdown-content {
display: block;
}
.item-coupon {
margin-right: 5px;
padding: 3px;
padding: 0 5px;
color: $theme_color;
font-size: 12px;
background-color: #ffdedf;
border: 1px dotted $theme_color;
cursor: pointer;
span {
padding: 3px;
}
}
.item-promotion {
margin-right: 5px;
@@ -521,8 +814,17 @@ export default {
font-size: 12px;
border: 1px solid $theme_color;
}
.item-price-right {
display: flex;
align-content: center;
align-items: center;
}
.item-remarks-sum {
padding-left: 8px;
width: 70px;
text-align: center;
padding: 0 10px;
border-left: 1px solid $border_color;
}
@@ -591,13 +893,16 @@ export default {
.add-buy-car-box {
width: 100%;
margin-top: 15px;
border-top: 1px dotted $border_color;
}
.add-buy-car {
display: flex;
align-items: center;
margin-top: 15px;
>*{
> * {
margin: 0 4px;
}
}
@@ -607,7 +912,7 @@ export default {
justify-content: space-between;
> span {
padding-right: 10px;
&:hover{
&:hover {
cursor: pointer;
color: $theme_color;
}
@@ -618,5 +923,8 @@ export default {
color: red;
margin-bottom: 5px;
}
.view-video{
cursor: pointer;
}
/******************商品图片及购买详情结束******************/
</style>

View File

@@ -1,12 +1,12 @@
<template>
<div>
<div style="height:auto;">
<div class="item-intro-show">
<div class="item-intro-detail" ref="itemIntroDetail">
<div class="item-intro-nav item-tabs">
<Tabs :animated="false" @on-click="tabClick">
<TabPane label="商品介绍">
<div class="item-intro-img" ref="itemIntroGoods">
<div v-html="skuDetail.intro" v-if="skuDetail.intro"></div>
<div class="item-intro" v-html="skuDetail.intro" v-if="skuDetail.intro"></div>
<div v-else style="margin:20px;">暂无商品介绍</div>
</div>
</TabPane>
@@ -47,6 +47,7 @@
<img :src="img" alt="">
</div>
</div>
<div class="preview-img" v-if="item.previewImg" @click.prevent="hidePreviewImg(item)">
<div>
<span @click.stop="rotatePreviewImg(0, item)"><Icon type="md-refresh" />左转</span>
@@ -58,6 +59,22 @@
<span class="remarks-item">{{item.goodsName}}</span>
<span class="remarks-time">{{item.createTime}}</span>
</p>
<!-- 商家回复 -->
<div class="reply" v-if="item.reply">
<p>商家回复</p>
<div>
<p class="remarks-content">{{ item.reply }}</p>
<div>
<div class="comment-img" v-if="item.replyImage">
<div v-for="(img, imgIndex) in item.replyImage.split(',')" @click="$previewImage(img)" :key="imgIndex">
<img :src="img" alt="">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="remarks-page">
@@ -71,7 +88,7 @@
</TabPane>
<TabPane label="商品参数">
<template v-if="detail.goodsParamsDTOList && detail.goodsParamsDTOList.length">
<div class="goods-params" v-for="item in detail.goodsParamsDTOList" :key="item.groupId">
<div class="goods-params" style="height:inherit;" v-for="item in detail.goodsParamsDTOList" :key="item.groupId">
<span class="ml_10">{{item.groupName}}</span>
<table class="mb_10" cellpadding='0' cellspacing="0" >
<tr v-for="param in item.goodsParamsItemDTOList" :key="param.paramId">
@@ -214,12 +231,18 @@ export default {
</script>
<style scoped lang="scss">
.item-intro{
>img{
display:block;
}
}
/***************商品详情介绍和推荐侧边栏开始***************/
.item-intro-show{
width: 1200px;
margin: 15px auto;
display: flex;
overflow-x: hidden;
flex-direction: row;
}
@@ -303,6 +326,9 @@ export default {
.item-intro-img {
width: 100%;
min-height: 300px;
::v-deep img{
margin:0 auto;
}
}
.item-intro-img img{
max-width: 1000px;
@@ -446,7 +472,7 @@ export default {
.ivu-tabs-ink-bar {
background-color: $theme_color !important;
}
/deep/.ivu-tabs-bar{
::v-deep.ivu-tabs-bar{
border: none;
}
.item-tabs > .ivu-tabs > .ivu-tabs-bar .ivu-tabs-tab{
@@ -497,4 +523,10 @@ table{
margin-left: 30px;
span{color:#999}
}
.reply{
>*{
margin: 4px;
}
}
</style>

View File

@@ -1,25 +1,32 @@
<template>
<div class="box">
<div class="nav">
<ul class="location">
<li v-if="$route.path.includes('home')" style="margin-left:10px"><router-link to="/">首页</router-link></li>
<div class="nav width_1200_auto">
<ul class="location flex">
<li v-if="$route.path.includes('home')" style="margin-left:10px">
<router-link to="/">首页</router-link>
</li>
<ul class="flex">
<li>Hi欢迎来到{{ config.title }}</li>
<li class="first" v-show="!userInfo.username">
<router-link :to="`/signUp`" class="nav-item">
<span>立即注册</span>
</router-link>
</li>
<li v-show="!userInfo.username">
<router-link class="nav-item" :to="`/login?rePath=${$route.path}&query=${JSON.stringify($route.query)}`">
<span>请登录</span>
</router-link>
</li>
</ul>
</ul>
<ul class="detail">
<li class="first" v-show="!userInfo.username">
<router-link :to="`/signUp`">
<span style="border:none">立即注册</span>
</router-link>
</li>
<li v-show="!userInfo.username">
<router-link :to="`/login?rePath=${$route.path}&query=${JSON.stringify($route.query)}`">
<span style="border:none">请登录</span>
</router-link>
</li>
<ul class="detail flex">
<li v-show="!!userInfo.username">
<div class="username-p">
<div>
<Avatar class="person-icon" :src="userInfo.face" icon="person" size="small" />
<span class="username">{{ userInfo.nickName? userInfo.nickName : userInfo.username | secrecyMobile }}</span>
<Avatar class="person-icon" :src="userInfo.face" icon="person" size="small"/>
<span class="username">{{
userInfo.nickName ? userInfo.nickName : userInfo.username | secrecyMobile
}}</span>
</div>
<transition name='fade'>
<ul class="drop-items">
@@ -31,16 +38,15 @@
</transition>
</div>
</li>
<li @click="goUserCenter('/home/MyOrder')"><span class="nav-item hover-color">我的订单</span></li>
<li @click="goUserCenter('/home/MyTracks')"><span class="nav-item hover-color">我的足迹</span></li>
<li @click="goUserCenter('/home/MsgList')"><span class="nav-item hover-color">我的消息</span></li>
<li @click="goUserCenter('/home/MyOrder')"><span class="nav-item">我的订单</span></li>
<li @click="goUserCenter('/home/MyTracks')"><span class="nav-item">我的足迹</span></li>
<li @click="goUserCenter('/home/MsgList')"><span class="nav-item">我的消息</span></li>
<li v-if="$route.name !== 'Cart'" style="position:relative;">
<i class="cart-badge" v-show="Number(cartNum)">{{cartNum < 100 ? cartNum : '99'}}</i>
<Dropdown placement="bottom-start">
<router-link to="/cart" target="_blank">
<span @mouseenter="getCartList">
<span class="nav-item" @mouseenter="getCartList">
<Icon size="18" type="ios-cart-outline"></Icon>
购物车
购物车{{ cartNum < 100 ? cartNum : '99' }}
</span>
</router-link>
<DropdownMenu slot="list">
@@ -52,25 +58,25 @@
<div class="shopping-cart-list" v-show="shoppingCart.length > 0">
<div class="shopping-cart-box" v-for="(item, index) in shoppingCart" @click="goToPay" :key="index">
<div class="shopping-cart-img">
<img :src="item.goodsSku.thumbnail" class="hover-pointer" />
<img :src="item.goodsSku.thumbnail" class="hover-pointer"/>
</div>
<div class="shopping-cart-info">
<div class="shopping-cart-title ">
<p class="hover-pointer goods-title ellipsis">{{ item.goodsSku.goodsName }}</p>
</div>
<div class="shopping-cart-detail">
<p>
<div>
数量:
<span class="shopping-cart-text">{{ item.num }}</span>
价钱:
<span class="shopping-cart-text">{{ item.purchasePrice | unitPrice('¥') }}</span>
</p>
</div>
<div class="shopping-price">
{{ item.purchasePrice | unitPrice('¥') }}
</div>
</div>
</div>
</div>
<div class="go-to-buy">
<Button type="error" size="small" @click="goToPay">去结账</Button>
</div>
</div>
</DropdownMenu>
</Dropdown>
@@ -78,6 +84,7 @@
<li>
<span class="nav-item" @click="shopEntry">店铺入驻</span>
</li>
</ul>
</div>
</div>
@@ -85,42 +92,45 @@
<script>
import storage from '@/plugins/storage.js';
import { cartGoodsAll } from '@/api/cart.js';
import { logout } from '@/api/account.js';
import {cartGoodsAll} from '@/api/cart.js';
import {logout} from '@/api/account.js';
export default {
name: 'M-Header',
created () {
created() {
if (storage.getItem('userInfo')) {
this.userInfo = JSON.parse(storage.getItem('userInfo'));
}
},
data () {
data() {
return {
config: require('@/config'),
userInfo: {}, // 用户信息
shoppingCart: [] // 购物车
};
},
computed: {
// 购物车商品数量
cartNum () {
cartNum() {
return this.$store.state.cartNum;
}
},
methods: {
goToPay () { // 跳转购物车
goToPay() { // 跳转购物车
let url = this.$router.resolve({
path: '/cart'
});
window.open(url.href, '_blank');
},
myInfo () { // 跳转会员中心
myInfo() { // 跳转会员中心
let url = this.$router.resolve({
path: '/home'
});
window.open(url.href, '_blank');
},
signOutFun () { // 退出登录
signOutFun() { // 退出登录
logout().then(res => {
storage.removeItem('accessToken');
storage.removeItem('refreshToken');
@@ -130,10 +140,10 @@ export default {
this.$router.push('/login');
});
},
goUserCenter (path) {
goUserCenter(path) {
// 跳转我的订单,我的足迹、收藏等
if (this.userInfo.username) {
this.$router.push({ path: path });
this.$router.push({path: path});
} else {
this.$Modal.confirm({
title: '请登录',
@@ -152,19 +162,19 @@ export default {
});
}
},
shopEntry () {
shopEntry() {
// 店铺入驻
if (storage.getItem('accessToken')) {
let routeUrl = this.$router.resolve({
path: '/shopEntry',
query: { id: 1 }
query: {id: 1}
});
window.open(routeUrl.href, '_blank');
} else {
this.$router.push('login');
}
},
getCartList () {
getCartList() {
// 获取购物车列表
if (this.userInfo.username) {
cartGoodsAll().then((res) => {
@@ -179,106 +189,88 @@ export default {
</script>
<style scoped lang="scss">
.shopping-cart-detail,
.shopping-cart-text,
.shopping-cart-info,
.nav a,
.location,
.first,
.username,
.shopping-cart-null span {
}
.box {
width: 100%;
font-size: 12px!important;
// height: 35px;
@include background_color($light_white_background_color);
font-size: 12px !important;
height: 36px;
background: #333;
color: #fff;
}
.nav {
margin: 0 auto;
width: 1200px;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.nav ul {
list-style: none;
}
.nav li {
cursor: pointer;
float: left;
font-size: 12px;
line-height: 35px;
margin-right: 10px;
font-weight: bold;
line-height: 36px;
margin-right: 15px;
}
.nav a,
.nav-item {
font-size: 13px;
font-weight: normal;
text-decoration: none;
padding-left: 14px;
border-left: 1px solid #ccc;
color: #999;
cursor: pointer;
color: #fff;
}
.nav-item {
padding-left: 20px;
}
.location a {
border-left: none;
}
.nav a:hover {
color: $theme_color;
}
.icon {
color: gray;
vertical-align: middle;
}
.first a:first-child {
padding-left: 3px;
border-left: none;
}
.city {
padding: 10px 15px;
}
.city-item {
font-weight: bold;
cursor: pointer;
padding: 5px;
}
.city-item:hover {
color: $theme_color;
}
.person-icon {
color: $theme_color;
background-color: #f0cdb2;
}
.shopping-cart-list {
padding: 10px 15px;
box-sizing: border-box;
max-height: 300px;
overflow: scroll;
}
.shopping-cart-box {
margin: 8px 0px;
margin-top: 15px;
padding-bottom: 15px;
height: 40px;
display: flex;
align-items: center;
border-bottom: 1px #ccc dotted;
}
.shopping-cart-box:first-child {
margin-top: 8px;
}
.shopping-cart-img {
margin-right: 15px;
width: 40px;
height: 40px;
}
.shopping-cart-img img {
width: 100%;
}
.shopping-cart-info {
display: flex;
flex-direction: column;
@@ -290,10 +282,7 @@ export default {
line-height: 20px;
}
.go-to-buy {
display: flex;
justify-content: flex-end;
}
.shopping-cart-null {
padding: 15px;
display: flex;
@@ -301,22 +290,28 @@ export default {
align-items: center;
justify-content: center;
}
.cart-null-icon {
font-size: 38px;
margin-bottom: 15px;
}
.shopping-cart-null span {
font-size: 12px;
line-height: 16px;
}
.username-p {
position: relative;
div{
div {
cursor: pointer;
>span{
> span {
margin-left: 5px;
}
}
.drop-items {
position: absolute;
display: none;
@@ -335,19 +330,21 @@ export default {
li {
color: rgb(107, 106, 106);
width: 100%;
border-bottom:1px solid rgb(207, 206, 206);
border-bottom: 1px solid rgb(207, 206, 206);
font-weight: normal;
text-align: center;
&:last-child{
&:last-child {
border: none;
}
&:hover{
&:hover {
cursor: pointer;
color: $theme_color;
}
}
&::before{
&::before {
position: absolute;
top: -20px;
left: 30px;
@@ -355,10 +352,10 @@ export default {
width: 0;
height: 0;
border: 10px solid #999;
border-color: transparent transparent #fff transparent ;
border-color: transparent transparent #fff transparent;
}
&::after{
&::after {
content: '';
position: absolute;
width: 80px;
@@ -367,8 +364,9 @@ export default {
left: 0;
}
}
&:hover{
.drop-items{
&:hover {
.drop-items {
display: block;
}
}
@@ -382,11 +380,13 @@ export default {
justify-content: center;
align-items: center;
}
.my-page a {
margin: 0px;
padding: 0px;
border: none;
}
.my-info {
padding: 5px;
width: 50%;
@@ -394,15 +394,19 @@ export default {
text-align: center;
cursor: pointer;
}
.my-info:hover {
box-shadow: 0px 0px 5px #ccc;
}
.my-info i {
font-size: 28px;
}
.my-info p {
font-size: 12px;
}
.sign-out {
padding: 5px;
width: 50%;
@@ -410,18 +414,23 @@ export default {
text-align: center;
cursor: pointer;
}
.sign-out:hover {
box-shadow: 0px 0px 5px $border_color;
}
.sign-out i {
font-size: 28px;
}
.sign-out p {
font-size: 12px;
}
.goods-title:hover {
color: $theme_color;
}
.cart-badge {
position: absolute;
right: -8px;
@@ -437,4 +446,34 @@ export default {
z-index: 3;
top: 3px;
}
.shopping-cart-box {
padding: 8px 0;
cursor: pointer;
display: flex;
align-items: center;
border-bottom: 1px #ccc dotted;
}
.shopping-cart-list {
padding: 10px 10px;
box-sizing: border-box;
max-height: 300px;
overflow-y: scroll;
color: #333;
}
.shopping-cart-detail {
color: #999;
font-size: 12px;
}
.shopping-price {
color: $theme_color;
font-size: 14px;
font-weight: bold;
}
</style>

View File

@@ -1,62 +0,0 @@
<template>
<div class="shop-box">
<div class="shop-container">
<div class="shop-title-content">
<img class="hover-pointer" @click="linkTo(`/merchant?id=${storeDetail.storeId}`)" :src="storeDetail.storeLogo" height="40" alt="">
<p><router-link :to="`/merchant?id=${storeDetail.storeId}`">{{ storeDetail.storeName }}</router-link></p>
<div class="ml_20" v-html="storeDetail.storeDesc"></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ShopHeader',
props: {
detail: {
type: Object,
default: null
}
},
computed: {
storeDetail () { // 店铺详情
return this.detail;
}
}
};
</script>
<style scoped>
/* 店铺介绍 */
.shop-box {
width: 100%;
height: 50px;
background-color: #484848;
}
.shop-container {
width: 1200px;
height: 100%;
margin: 0px auto;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
color: #fff;
}
.shop-title-content {
display: flex;
align-items: center;
}
.shop-title-content p {
font-size: 20px;
margin-left: 20px;
}
.shop-title-content a {
color: #fff;
}
</style>

View File

@@ -1,93 +1,117 @@
<template>
<div class="scroll-show">
<div class="content clearfix">
<cateNav class="cate" :hover="true" :showNavBar="false"></cateNav>
<Search class="search-con" :hover="true" :showLogo="false" :showTag="false"></Search>
<Icon type="ios-cart-outline" @click="goCartList" class="cart-icon" @mouseenter.native="getCartList" />
<i class="cart-badge">{{cartNum < 100 ? cartNum : '99'}}</i>
<cateNav class="cate" :hover="true" :showNavBar="false"
useClass="fixed-show"></cateNav>
<Search
class="search-con"
:hover="true"
ref="search"
:showLogo="false"
:showTag="false"
useClass="fixed-show"
></Search>
<div class="flex flex-a-c cart">
<Icon
type="ios-cart-outline"
@click="goCartList"
class="cart-icon"
@mouseenter.native="getCartList"
/>
<i class="cart-badge">{{ cartNum < 100 ? cartNum : "99" }}</i>
</div>
</div>
</div>
</template>
<script>
import {cartCount} from '@/api/cart.js'
import storage from '@/plugins/storage.js';
import { cartCount } from "@/api/cart.js";
import storage from "@/plugins/storage.js";
export default {
data () {
data() {
return {
userInfo: {} // 用户信息
}
userInfo: {}, // 用户信息
};
},
computed: {
cartNum () { // 购物车商品数量
return this.$store.state.cartNum
}
cartNum() {
// 购物车商品数量
return this.$store.state.cartNum;
},
},
methods: {
goCartList () { // 跳转购物车页面
goCartList() {
// 跳转购物车页面
let routerUrl = this.$router.resolve({
path: '/cart'
})
window.open(routerUrl.href, '_blank')
path: "/cart",
});
window.open(routerUrl.href, "_blank");
},
getCartList () { // 获取购物车列表
if (storage.getItem('userInfo')) {
cartCount().then(res => {
this.$store.commit('SET_CARTNUM', res.result)
this.Cookies.setItem('cartNum', res.result)
})
getCartList() {
// 获取购物车列表
if (storage.getItem("userInfo")) {
cartCount().then((res) => {
this.$store.commit("SET_CARTNUM", res.result);
this.Cookies.setItem("cartNum", res.result);
});
}
},
},
mounted() {
if (storage.getItem("userInfo")) {
this.userInfo = JSON.parse(storage.getItem("userInfo"));
}
},
mounted () {
if (storage.getItem('userInfo')) {
this.userInfo = JSON.parse(storage.getItem('userInfo'));
}
}
}
};
</script>
<style lang="scss" scoped>
.content{
width: 1200px;
height: 40px;
margin: 10px auto;
position: relative;
}
.cate {
float: left;
width: 200px!important;
}
.search-con{
float: left;
width: 800px;
overflow: hidden;
margin-top: -27px;
}
.cart-icon {
width: 30px;
float: left;
font-size: 25px;
margin-top: 8px;
color: $theme_color;
z-index: 1;
position: relative;
&:hover{
cursor: pointer;
}
}
.cart-badge {
position: absolute;
font-style: normal;
right: 165px;
display: block;
background-color: $theme_color;
color: #fff;
font-size: 12px;
width: 17px;
height: 17px;
border-radius: 10px;
line-height: 17px;
text-align: center;
z-index: 5;
top: 3px;
.content {
width: 1200px;
height: 40px;
margin: 0 auto;
position: relative;
}
.cate {
float: left;
width: 200px !important;
}
.search-con {
float: left;
width: 800px;
overflow: hidden;
margin-top: -27px;
}
.cart{
height: 60px;
}
.cart-icon {
width: 30px;
float: left;
font-size: 25px;
color: $theme_color;
z-index: 1;
position: relative;
&:hover {
cursor: pointer;
}
}
.cart-badge {
position: absolute;
font-style: normal;
right: 165px;
display: block;
background-color: $theme_color;
color: #fff;
font-size: 12px;
width: 17px;
height: 17px;
border-radius: 10px;
line-height: 17px;
text-align: center;
z-index: 5;
top: 10px;
}
</style>

View File

@@ -2,13 +2,19 @@
<div class="model-item" v-if="element && element.key">
<!-- 轮播图模块包括个人信息快捷导航模块 -->
<template v-if="element.type == 'carousel'">
<model-carousel :data="element" class="mb_20 width_1200_auto"></model-carousel>
<model-carousel
:data="element"
class="mb_20 width_1200_auto"
></model-carousel>
</template>
<template v-if="element.type == 'carousel1'">
<model-carousel1 :data="element" class="mb_20"></model-carousel1>
</template>
<template v-if="element.type == 'carousel2'">
<model-carousel2 :data="element" class="mb_20 width_1200_auto"></model-carousel2>
<model-carousel2
:data="element"
class="mb_20 width_1200_auto"
></model-carousel2>
</template>
<!-- 热门广告 -->
<template v-if="element.type == 'hotAdvert'">
@@ -37,13 +43,16 @@
</template>
<!-- 限时秒杀 待完善 -->
<template v-if="element.type == 'seckill' && element.options.list.length">
<seckill :data="element" class="mb_20 width_1200_auto"></seckill>
<seckill :data="element" class="mb_20 width_1200_auto"></seckill>
</template>
<!-- 折扣广告 -->
<template v-if="element.type == 'discountAdvert'">
<div
class="discountAdvert"
:style="{'backgroundImage' :'url(' + require('@/assets/images/decorate.png') + ')'}"
:style="{
backgroundImage:
'url(' + require('@/assets/images/decorate.png') + ')',
}"
>
<img
@click="linkTo(item.url)"
@@ -72,46 +81,82 @@
<template v-if="element.type == 'recommend'">
<recommend :data="element" class="mb_20 width_1200_auto"></recommend>
</template>
<!-- 一行三列 -->
<template v-if="element.type == 'oneRowThreeColumns'">
<oneRowThreeColumns :data="element" class="mb_20 width_1200_auto"></oneRowThreeColumns>
</template>
<!-- 商品模块 -->
<template v-if="element.type == 'goodsType'">
<goodsAndType :paramData="element" class="mb_20 width_1200_auto"></goodsAndType>
</template>
<!-- 商品模块 -->
<template v-if="element.type == 'onlyGoodsModel'">
<onlyGoodsModel :data="element" class="mb_20 width_1200_auto"></onlyGoodsModel>
</template>
<!-- 混合模块 -->
<template v-if="element.type == 'mixModel'">
<mixModel :data="element" class="mb_20 width_1200_auto"></mixModel>
</template>
<!-- 混合模块 -->
<template v-if="element.type == 'forYour'">
<forYour :data="element" class="mb_20 width_1200_auto"></forYour>
</template>
<!-- 新品排行 -->
<template v-if="element.type == 'newGoodsSort'">
<new-goods-sort :data="element" class="mb_20 width_1200_auto"></new-goods-sort>
<new-goods-sort
:data="element"
class="mb_20 width_1200_auto"
></new-goods-sort>
</template>
<!-- 首页广告 -->
<template v-if="element.type == 'firstAdvert'">
<first-page-advert :data="element" class="mb_20 width_1200_auto"></first-page-advert>
<first-page-advert
:data="element"
class="mb_20 width_1200_auto"
></first-page-advert>
</template>
<!-- 横幅广告 -->
<template v-if="element.type == 'bannerAdvert'">
<div style="width:100%; text-align: center;">
<img
width="1200"
class="hover-pointer mb_20"
@click="linkTo(element.options.url)"
:src="element.options.img"
alt=""
/>
<template v-if="element.type == 'bannerAdvert'">
<div style="width: 100%; text-align: center">
<img
width="1200"
class="hover-pointer mb_20 bannerAd"
@click="linkTo(element.options.url)"
:src="element.options.img"
alt=""
/>
</div>
</template>
<template v-if="element.type == 'notEnough'">
<not-enough :data="element" class="mb_20 width_1200_auto"></not-enough>
<template v-if="element.type == 'notEnough'"
>
<not-enough
:data="element"
class="mb_20 width_1200_auto"
></not-enough>
</template>
</div>
</template>
<script>
import ModelCarousel from './modelList/Carousel.vue';
import ModelCarousel1 from './modelList/Carousel1.vue';
import ModelCarousel2 from './modelList/Carousel2.vue';
import FirstPageAdvert from './modelList/FirstPageAdvert.vue';
import NewGoodsSort from './modelList/NewGoodsSort.vue';
import Recommend from './modelList/Recommend.vue';
import NotEnough from './modelList/NotEnough.vue';
import Seckill from './modelList/Seckill.vue';
import ModelCarousel from "./modelList/Carousel.vue";
import ModelCarousel1 from "./modelList/Carousel1.vue";
import ModelCarousel2 from "./modelList/Carousel2.vue";
import FirstPageAdvert from "./modelList/FirstPageAdvert.vue";
import NewGoodsSort from "./modelList/NewGoodsSort.vue";
import Recommend from "./modelList/Recommend.vue";
import NotEnough from "./modelList/NotEnough.vue";
import Seckill from "./modelList/Seckill.vue";
import oneRowThreeColumns from "./modelList/oneRowThreeColumns.vue";
import goodsAndType from "./modelList/goodsAndType.vue";
import onlyGoodsModel from "./modelList/onlyGoodsModel.vue";
import mixModel from "./modelList/mixModel.vue";
import forYour from "./modelList/forYour.vue";
export default {
name: 'modelFormItem',
props: ['element', 'select', 'index', 'data'],
name: "modelFormItem",
props: ["element", "select", "index", "data"],
components: {
ModelCarousel,
ModelCarousel1,
@@ -120,22 +165,31 @@ export default {
NewGoodsSort,
FirstPageAdvert,
NotEnough,
Seckill
Seckill,
oneRowThreeColumns,
goodsAndType,
onlyGoodsModel,
mixModel,
forYour
},
data () {
data() {
return {
showModal: false, // 控制模态框显隐
selected: {} // 已选数据
selected: {}, // 已选数据
};
}
},
};
</script>
<style lang="scss" scoped>
.model-item {
position: relative;
margin-bottom: 10px;
}
.bannerAd{
width: 1183px;
height: 166.6px;
border-radius: 10px;
}
/** 热门广告 */
.advert-list {
background: $theme_color;
@@ -180,9 +234,4 @@ export default {
}
}
.width_1200_auto{
width: 1200px;
margin: 0 auto;
background-color: #fff;
}
</style>

View File

@@ -5,14 +5,13 @@
<div class="nav-side"></div>
<div class="nav-content">
<!-- 轮播图 -->
<Carousel autoplay>
<CarouselItem v-for="(item, index) in data.options.list" :key="index">
<div style="overflow: hidden">
<!-- autoplay autoplay-speed="10000"-->
<Carousel :height="333.9" autoplay :autoplay-speed="5000">
<CarouselItem v-for="(item, index) in data.options.list" :key="index">
<div class="swiper-img" >
<img
:src="item.img"
width="790"
@click="linkTo(item.url)"
height="340"
class="hover-pointer"
/>
</div>
@@ -21,83 +20,320 @@
</div>
<div class="nav-right">
<div class="person-msg">
<img :src="userInfo.face" v-if="userInfo.face" alt />
<Avatar icon="ios-person" class="mb_10" v-else size="80" />
<div>Hi{{ userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile }}</div>
<div v-if="userInfo.id">
<Button type="error" shape="circle" @click="$router.push('home')">会员中心</Button>
<div class="user-box" @click="entryControl({ path: 'home' })">
<img class="user-face" :src="userInfo.face || defaultAvatar" alt />
<div class="welcome">
Hi, {{
userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile
}}
</div>
</div>
<div v-else>
<Button type="error" @click="$router.push('login')" shape="circle"
>请登录</Button
<div v-if="userInfo.id">
<div class="icon-list"></div>
<!-- #TODO 后续增加 -->
<!-- <div class="icon-list flex flex-j-sb" >
<div class="icon-item" :key="index" @click="entryControl(item)" v-for="(item,index) in recentList">
<div class="value">
{{ item.value}}
</div>
<div class="label">
{{ item.label}}
</div>
</div>
</div> -->
</div>
<div v-else class="flex flex-a-c ">
<div class="btns" @click="$router.push('login')" shape="circle"
>登录</div
>
<div class="btns sign-up" @click="$router.push('signUp')" shape="circle"
>注册</div
>
</div>
</div>
<div class="shop-msg">
<div>
<span>常见问题</span>
<ul class="article-list">
<li class="ellipsis" :alt="article.title" v-for="(article, index) in articleList" :key="index" @click="goArticle(article.id)">
{{article.title}}
</li>
</ul>
<div class="gray-line"></div>
<div class="icon-list flex flex-j-sb" >
<div class="icon-item" @click="entryControl(item)" :key="index" v-for="(item, index) in entranceList">
<img class="icon" :src="require(`@/assets/iconfont/${item.icon}.png`)">
<div>
{{ item.label }}
</div>
</div>
</div>
<div class="icon-list flex flex-j-sb" >
<div class="icon-item" :key="index" @click="entryControl(item)" v-for="(item, index) in appendList">
<img class="icon" :src="require(`@/assets/iconfont/${item.icon}.png`)">
<div>
{{ item.label }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import config from '@/config'
import {articleList} from '@/api/common.js'
import storage from '@/plugins/storage';
import storage from "@/plugins/storage";
export default {
name: 'modelCarousel',
props: ['data'],
data () {
name: "modelCarousel",
props: ["data"],
data() {
return {
config,
config: require("@/config"),
defaultAvatar: require("@/assets/images/default.png"),
userInfo: {}, // 用户信息
articleList: [], // 常见问题
params: { // 请求常见问题参数
pageNumber: 1,
pageSize: 5,
type: 'ANNOUNCEMENT',
sort: 'sort'
}
entranceList: [
{
icon: "collage",
label: "宝贝收藏",
path: "/home/Favorites"
},
{
icon: "shop",
label: "收藏店铺",
path: "/home/Favorites?type=STORE"
},
{
icon: "carts",
label: "购物车",
path: "/cart"
},
{
icon: "story",
label: "我的足迹",
path: "/home/MyTracks"
},
],
appendList: [
{
icon: "support",
label: "帮助中心",
path: "/article"
},
{
icon: "feedback",
label: "我的评论",
path: "/home/CommentList"
},
{
icon: "notice",
label: "收货地址",
path: "/home/MyAddress"
},
{
icon: "notification",
label: "我的消息",
path: "/home/MsgList"
},
],
recentList: [
{
value: "0",
label: "购物车"
},
{
value: "0",
label: "待收货"
},
{
value: "0",
label: "待发货"
},
{
value: "0",
label: "代付款"
},
],
};
},
methods: {
getArticleList () { // 获取常见问题列表
articleList(this.params).then(res => {
if (res.success) {
this.articleList = res.result.records
}
})
// 快捷跳转中心
entryControl(val) {
console.log("val",val)
let url = this.$router.resolve(val.path);
window.open(url.href, '_blank');
},
goArticle (id) { // 跳转文章详情
let routeUrl = this.$router.resolve({
path: '/article',
query: {id}
});
window.open(routeUrl.href, '_blank');
}
},
mounted () {
if (storage.getItem('userInfo')) this.userInfo = JSON.parse(storage.getItem('userInfo'));
this.getArticleList()
}
mounted() {
if (storage.getItem("userInfo"))
this.userInfo = JSON.parse(storage.getItem("userInfo"));
},
};
</script>
<style scoped lang="scss">
.label {
font-size: 12px;
font-weight: normal;
line-height: 14px;
text-align: center;
letter-spacing: 0px;
color: #666666;
}
.swiper-img {
overflow: hidden;
width: 637px;
height: 329.9px;
}
.icon-list {
width: 216px
}
.icon-list:nth-last-of-type(1) {
margin-top: 20px;
}
.hot-box {
margin-top: 35px;
width: 216px;
}
.hot-tag {
margin-right: 6px;
width: 36px;
height: 18px;
border-radius: 4px;
opacity: 1;
font-size: 12px;
border: 1px solid $theme_color;
color: $theme_color;
text-align: center;
line-height: 18px;
}
.gray-line {
width: 216px;
height: 1px;
border: 1px solid #E5E5E5;
margin-bottom: 13px;
}
.icon {
width: 20px !important;
height: 20px !important;
margin-bottom: 7px;
}
.icon-item {
cursor: pointer;
text-align: center;
>div {
font-size: 11px;
font-weight: normal;
line-height: 13px;
text-align: center;
letter-spacing: 0px;
color: #666666;
}
>.value {
font-size: 14px;
line-height: 17px;
text-align: center;
font-weight: 400;
letter-spacing: 0px;
margin-bottom: 3px;
color: $theme_color;
}
>.label {
font-weight: 400;
font-size: 12px;
line-height: 14px;
text-align: center;
letter-spacing: 0px;
color: #666666;
margin-bottom: 13px;
}
}
.model-carousel {
width: 1200px;
height: 340px;
overflow: hidden;
}
.hover-pointer {
//display: block;
//width: 100%;
//height: 100%;
width: 637px;
height: 329.9px;
object-fit: cover;
border-radius: 10px;
}
.welcome {
font-size: 14px;
font-weight: normal;
line-height: 17px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.hr {
width: 216px;
height: 1px;
border: 1px solid #E5E5E5;
}
.btns {
margin-top: 21px;
margin-bottom: 13px;
width: 77px;
height: 28px;
border-radius: 14px;
opacity: 1;
font-size: 13px;
font-weight: normal;
line-height: 28px;
text-align: center;
cursor: pointer;
letter-spacing: 0px;
color: #FFFFFF;
background: $theme_color;
}
.sign-up {
background: #F39519;
margin-left: 10px;
}
.avatar {
margin-bottom: 13px;
}
.user-face {
margin-bottom: 12px;
width: 70px;
height: 70px;
border-radius: 50%;
}
/* 导航主体 */
.nav-body {
width: 1200px;
@@ -106,65 +342,80 @@ export default {
}
.nav-side {
height: 100%;
width: 200px;
height: 334px;
width: 263.2px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
float: left;
padding: 0px;
color: #fff;
background-color: #6e6568;
// background-color: #6e6568;
}
/*导航内容*/
.nav-content {
width: 790px;
overflow: hidden;
width: 637px;
margin-left: 10.8px;
margin-top: 10px;
height: 333.9px;
float: left;
position: relative;
}
.nav-right {
float: left;
width: 210px;
margin-top: 10px;
width: 263.2px;
margin-left: 10px;
border-radius: 10px;
background: #FFFFFF;
.person-msg {
cursor: pointer;
height: 333px;
display: flex;
align-items: center;
flex-direction: column;
margin: 20px auto;
button {
height: 25px !important;
margin-top: 10px;
}
.ivu-btn-default {
color: $theme_color;
border-color: $theme_color;
}
img {
margin-bottom: 10px;
width: 80px;
height: 80px;
border-radius: 50%;
padding-top: 28px;
padding-bottom: 25px;
>.user-box{
text-align: center;
}
}
.shop-msg {
div {
width: 100%;
margin: 10px 27px;
span {
cursor: pointer;
text-align: center;
font-weight: bold;
margin-left: 5px;
}
span:nth-child(1) {
@include content_color($theme_color);
margin-left: 0;
}
span:nth-child(2) {
font-weight: normal;
}
span:nth-child(3):hover {
color: $theme_color;
}
}
ul {
li {
cursor: pointer;
@@ -172,6 +423,7 @@ export default {
color: #999395;
width: 150px;
font-size: 12px;
&:hover {
color: $theme_color;
}

View File

@@ -57,7 +57,7 @@
</template>
<script>
import config from '@/config'
import {articleList} from '@/api/common.js'
import storage from '@/plugins/storage';
export default {
@@ -65,7 +65,7 @@ export default {
props: ['data'],
data () {
return {
config,
config:require('@/config'),
userInfo: {}, // 用户信息
articleList: [], // 常见问题
params: { // 请求常见问题参数

View File

@@ -1,16 +1,18 @@
<template>
<div class="not-enough">
<ul class="nav-bar">
<li
v-for="(item, index) in conData.options.navList"
:class="currentIndex === index ? 'curr' : ''"
@click="changeCurr(index)"
:key="index"
>
<p>{{ item.title }}</p>
<p>{{ item.desc }}</p>
</li>
</ul>
<div class="not-enough" ref="obtain" id="demo">
<Affix :offset-top="62" @on-change="change">
<ul class="nav-bar" v-show="topSearchShow">
<li
v-for="(item, index) in conData.options.navList"
:class="currentIndex === index ? 'curr' : ''"
@click="changeCurr(index)"
:key="index"
>
<p @click="gotoDemo">{{ item.title }}</p>
<p @click="gotoDemo">{{ item.desc }}</p>
</li>
</ul>
</Affix>
<div class="content" v-if="showContent">
<div
v-for="(item, index) in conData.options.list[currentIndex]"
@@ -29,17 +31,26 @@
</template>
<script>
export default {
mounted() {
window.addEventListener('scroll',this.handleScrollx,true)
},
props: {
data: {
type: Object,
default: null
}
default: null,
},
},
data () {
data() {
return {
screenHeight:document.body.clientHeight,
scrollHieght:0,
topSearchShow: true, //展示 导航条
topIndex: 0, // 当前滚动条位置 (取整)
scrollTops: 0,
open:'',
currentIndex: 0, // 当前分类下标
conData: this.data, // 装修数据
showContent: true // 是否展示内容
showContent: true, // 是否展示内容
};
},
watch: {
@@ -47,14 +58,40 @@ export default {
this.conData = val;
},
conData: function (val) {
this.$emit('content', val);
}
this.$emit("content", val);
},
},
methods: {
changeCurr (index) { // 选择分类
this.currentIndex = index;
handleScrollx(){
// console.log('滚动高度',window.pageYOffset) // 获取滚动条的高度
// console.log(this.$refs.obtain.getBoundingClientRect().top) //获取到距离顶部的距离
// this.scrollHieght = Number(window.pageYOffset);//获取到距离顶部的距离
// this.scrollTops = Number(this.$refs.obtain.getBoundingClientRect().top); // 获取到距离顶部的距离
// this.topSearchShow = true; // 展示图钉
// if(this.scrollTops < -660){ // 超过隐藏
// this.topSearchShow = false;
// }
},
toguid(path,id){
var path =path;
var Id = id;
localStorage.setItem('toId',Id);
this.$router.push(path);
},
change(status){ //获取是否获取到图钉
this.open = status
},
gotoDemo(){ // 跳转到demo的位置
if(this.open){ // 获取到图钉之后在跳转当前位置
document.querySelector("#demo").scrollIntoView(true);
}
}
//scrollIntoView()可以在所有的HTML元素上调用通过滚动浏览器窗口或某个容器元素
},
changeCurr(index) {
// 选择分类
this.currentIndex = index;
},
},
};
</script>
<style lang="scss" scoped>
@@ -63,10 +100,13 @@ export default {
justify-content: center;
width: 100%;
margin-bottom: 10px;
background-color: rgb(218, 217, 217);
background-color: #f8f8f8;
height: 60px;
align-items: center;
position: relative;
position: sticky;
position: -webkit-sticky;
top: 0;
li {
padding: 0 30px;
text-align: center;
@@ -140,5 +180,6 @@ export default {
}
}
}
}
</style>

View File

@@ -161,7 +161,7 @@ export default {
padding: 0 10px;
font-size: 12px;
>div:nth-child(1) {
width: 130px;
margin-top: 30px;
span:nth-child(1){
color: #fff;
@@ -169,7 +169,7 @@ export default {
padding: 0 5px;
background-color: #a25684;
display: block;
width: 120px;
overflow: hidden;
white-space: nowrap;
margin: 0 10px 10px 0;

View File

@@ -1,5 +1,5 @@
<template>
<div class="seckill">
<div class="seckill" v-if="goodsList.length">
<div class="aside hover-pointer" @click="goToSeckill">
<div class="title">{{ actName }}</div>
<div class="hour">
@@ -14,7 +14,7 @@
</div>
<swiper :options="swiperOption" ref="mySwiper">
<swiper-slide v-for="(item,index) in goodsList" :key="index">
<div class="content hover-pointer" @click="goToSeckill">
<div class="content hover-pointer" @click.stop="goToSeckill">
<img :src="item.goodsImage" width="140" height="140" :alt="item.goodsName">
<div class="ellipsis">{{item.goodsName}}</div>
<div>
@@ -58,7 +58,7 @@ export default {
seconds: 0, // 秒
interval: null, // 定时器
swiperOption: { // 轮播图参数
loop: true,
slidesPerView: 5,
// 设置点击箭头
navigation: {
@@ -157,6 +157,7 @@ export default {
// ]
this.list = this.data.options.list
this.goodsList = this.list[0].seckillGoodsList
console.log( this.goodsList)
this.countDown(this.currIndex)
}
}

View File

@@ -0,0 +1,228 @@
<template>
<div class="model" v-if="data">
<div class="for-your">{{ data.options.title }}</div>
<div class="flex card">
<div class="left">
<img :src="data.options.data.image.src" alt="" />
</div>
<div class="right flex">
<!-- 商品区 -->
<div class="goods-list">
<div
class="goods-item"
:key="index"
v-for="(item, index) in data.options.data.list"
@click="linkTo(item.url)"
>
<div>
<div class="goods-name">{{ item.title }}</div>
<div class="goods-desc">{{ item.desc }}</div>
</div>
<img class="goods-img" :src="item.img" alt="" />
</div>
</div>
<!-- 热卖区 -->
<div class="hot-list">
<div class="hot-title">{{ data.options.data.hot.title }}</div>
<div
class="hot-item flex flex-a-c"
v-for="(item, index) in data.options.data.hot.list"
:key="index"
@click="linkTo(item.url)"
>
<img :src="item.img" alt="" />
<div class="hot-goods">
<div class="hot-goods-title">{{ item.title }}</div>
<div>
<div class="hot-price">{{ item.price | unitPrice }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "forYour",
data() {
return {
current: "",
};
},
props: {
data: {
type: Object,
default: {},
},
},
mounted() {},
methods: {},
};
</script>
<style scoped lang="scss">
.goods-list {
display: flex;
width: 558px;
flex-wrap: wrap;
}
.goods-item {
width: 278px;
height: 277px;
text-align: center;
box-sizing: border-box;
cursor: pointer;
border-right: 1.4px solid #e2e2e2;
&:nth-of-type(3) {
border-top: 1.4px solid #e2e2e2;
}
&:nth-of-type(4) {
border-top: 1.4px solid #e2e2e2;
}
&:hover {
::v-deep .goods-name {
color: $theme_color;
}
::v-deep .goods-desc {
color: $theme_color;
}
}
}
.goods-name {
margin-top: 23px;
font-size: 25px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.goods-img {
width: 190px;
height: 156px;
margin-top: 19px;
border-radius: 10px;
}
.goods-desc {
font-size: 14px;
font-weight: normal;
line-height: 17px;
text-align: center;
margin-top: 11px;
letter-spacing: 0px;
color: #333333;
}
.for-your {
font-size: 35px;
font-weight: normal;
line-height: 42px;
text-align: center;
letter-spacing: 0px;
margin-bottom: 32px;
color: #333333;
}
.card,
.right-card {
opacity: 1;
background: #ffffff;
border-radius: 10px;
position: relative;
box-shadow: 0px 1px 13px 0px #E5E5E5;
&:hover {
.setup-box {
display: block;
}
}
}
.modal-tab-bar {
> .flex {
align-items: center;
margin: 10px 0;
}
}
.draggable {
> .flex {
align-items: center;
}
}
.left {
width: 346px;
height: 554px;
border-radius: 9.8px 0px 0px 9.8px;
> img {
max-width: 100%;
height: 100%;
}
}
.right {
width: 839px;
height: 554px;
border-radius: 0px 9.8px 9.8px 0px;
}
.hot-list {
width: 279px;
}
.hot-title {
margin-left: 25px;
line-height: 63px;
font-size: 17px;
font-weight: normal;
letter-spacing: 0px;
color: #333333;
height: 63px;
}
.hot-item {
cursor: pointer;
box-sizing: border-box;
border-top: 1.4px solid #e2e2e2;
height: 122px;
padding:0 14px;
align-items: center;
&:hover {
> .hot-goods {
> .hot-goods-title {
color: $theme_color;
}
}
}
> img {
width: 76.3px;
height: 77.7px;
}
}
.hot-goods {
margin-left: 14px;
}
.hot-goods-title {
font-size: 13px;
font-weight: normal;
line-height: 16px;
letter-spacing: 0px;
color: #333333;
}
.hot-price {
margin-top: 10.3px;
font-size: 24px;
font-weight: normal;
line-height: 29px;
letter-spacing: 0px;
color: $theme_color;
}
</style>

View File

@@ -0,0 +1,205 @@
<template>
<div class="goods-type-wrapper">
<div class="flex goods-type-line">
<div class="goods-type-title">{{ paramData.options.title }}</div>
<div class="flex goods-type-labels">
<div
:class="{ active: current === item.___index }"
class="goods-type-item"
v-for="(item, index) in paramData.options.labels"
:key="index"
@click="handleClickLabel(item, index)"
>
{{ item.label }}
</div>
</div>
</div>
<!-- 商品部分 -->
<div class="only-goods-list flex-j-sb">
<div
v-if="paramData.options"
class="only-goods-list-item "
v-for="(item, index) in paramData.options.list.filter((client) => {
return client.___index == current;
})"
:key="index"
@click="linkTo(item.url)"
>
<div class="goods-img">
<img :src="item.img" />
</div>
<div>
<div class="goods-name wes-2">{{ item.title }}</div>
<div class="goods-desc">{{ item.desc }}</div>
</div>
<div class="goods-price">
{{ item.price | unitPrice("¥") }}
</div>
<!-- 查看 -->
<div class="white-shadow">
<div class="search">去查看</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "goods",
props: {
paramData: {
type: Object,
default: {},
},
},
data() {
return {
current: "",
};
},
watch: {},
mounted() {
this.current = this.paramData.options.labels[0].___index;
},
methods: {
// 筛选出当前分类下的商品
handleClickLabel(val, index) {
this.current = index;
},
},
};
</script>
<style scoped lang="scss">
.white-shadow {
width: 287px;
height: 122px;
border-radius: 0px 0px 10px 10px;
opacity: 1;
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
display: flex;
justify-content: center;
transition: 0.35s;
align-items: center;
background: linear-gradient(
180deg,
rgba(252, 252, 252, 0.58) -50%,
#ffffff 99%
);
}
.search {
width: 143px;
height: 45px;
border-radius: 22.5px;
opacity: 1;
font-size: 20px;
font-weight: normal;
text-align: center;
letter-spacing: 0px;
line-height: 45px;
color: #ffffff;
background: $theme_color;
}
.only-goods-list{
display: flex;
flex-wrap: wrap;
}
.only-goods-list-item {
padding-top: 30px;
width: 287px;
height: 343.7px;
border-radius: 9.8px;
opacity: 1;
margin-bottom: 14.3px;
cursor: pointer;
background: #ffffff;
transition: all 0.4s ease;
box-shadow: 0px 1px 13px 0px #e5e5e5;
position: relative;
&:hover {
transform: translateY(-5px);
box-shadow: 0px 1px 14px 0px #c5c5c5;
> .white-shadow {
opacity: 1;
}
> .goods-img {
> img {
opacity: 0.8 !important;
}
}
}
}
.goods-img {
margin-bottom: 9.8px;
text-align: center;
> img {
transition: all 0.4s ease;
width: auto;
max-height: 183px;
}
}
.goods-name {
font-size: 18px;
font-weight: normal;
line-height: 22px;
text-align: center;
letter-spacing: 0px;
width: 200px;
margin: 0 auto 12.4px auto;
color: #333333;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-desc {
font-size: 14px;
font-weight: normal;
line-height: 17px;
text-align: center;
letter-spacing: 0px;
margin-bottom: 12.4px;
color: #666666;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-price {
font-size: 25.2px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: #f31947;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-type-line {
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.goods-type-title {
font-size: 31px;
font-weight: normal;
line-height: 37px;
letter-spacing: 0px;
color: #333333;
}
.active {
color: #f31947;
}
.goods-type-labels {
cursor: pointer;
font-size: 21px;
font-weight: normal;
line-height: 25px;
letter-spacing: 0px;
}
.goods-type-item {
margin-left: 28px;
}
</style>

View File

@@ -0,0 +1,53 @@
<template>
<div class="mix-model">
<!-- 左侧 -->
<div class="left-card">
<left :data="data" />
</div>
<!-- 右侧 -->
<div class="right-card">
<right :data="data" />
</div>
</div>
</template>
<script>
import left from './mixs/mix-goods'
import right from './mixs/mix-brand'
export default {
name: "mixModel",
data() {
return {}
},
props: {
data: {
type: Object,
default: {}
}
},
components: {
left,
right
},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
.mix-model{
display: flex;
justify-content:space-between;
}
.left-card,.right-card{
width: 584px;
height: 344px;
border-radius: 10px;
opacity: 1;
background: #FFFFFF;
box-shadow: 0px 1px 13px 0px #E5E5E5;
position: relative;
}
</style>

View File

@@ -0,0 +1,132 @@
<template>
<div class="flex" v-if="data.options.right.model == 'brand'">
<div class="left-side" @click="linkTo(data.options.right.data.image.url)">
<img :src="data.options.right.data.image.src" alt="">
</div>
<div class="right-side">
<div class="badge-box flex">
<div class="round">
<Icon type="ios-arrow-forward" />
</div>
</div>
<div class="flex goods-list">
<div class="goods-item flex" @click="linkTo(item.url)" :key="index" v-for="(item,index) in data.options.right.data.list">
<div class="goods-thumbnail">
<img :src="item.img" alt="">
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "mix-goods",
data() {
return {}
},
props: {
data: {
type: Object,
default: {}
}
},
components: {},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
.right-side{
width: 330px;
}
.goods-detail-title{
font-size: 13px;
font-weight: normal;
line-height: 16px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.goods-detail-price{
font-size: 14px;
font-weight: normal;
line-height: 17px;
letter-spacing: 0px;
color: $theme_color;
margin-top: 8px;
margin-bottom:10px;
}
.goods-thumbnail{
margin-left: 7px;
display: flex;
align-items: center;
>img{
width:90px;
height: 90px;
}
}
.badge-box{
margin-top: 33px;
justify-content:right;
>.round{
width: 17.5px;
height: 17.5px;
opacity: 1;
border-radius: 50%;
text-align: center;
line-height: 17.5px;
border: 0.7px solid #333333;
margin-right: 17.5px;
}
}
.goods-list{
width: 330px;
flex-wrap: wrap;
justify-content:space-between;
padding: 0 16px;
}
.goods-item{
display: flex;
align-items: center;
justify-content: center;
width:50%;
height: 85px;
border-radius: 9.8px;
opacity: 1;
transition: .35s;
background: #FFFFFF;
margin-bottom:9px;
}
.left-side {
>img{
width: 254px;
height: 344px;
border-radius: 9.8px 0px 0px 9.8px;
opacity: 1;
}
}
.badge {
width: 50px;
height: 27px;
line-height:27px;
border-radius: 13.3px 0px 0px 13.3px;
opacity: 1;
background: #F31947;
font-size: 12.6px;
font-weight: normal;
text-align: center;
letter-spacing: 0px;
color: #FFFFFF;
margin-top: 26px;
margin-bottom:17px;
}
</style>

View File

@@ -0,0 +1,127 @@
<template>
<div class="flex" v-if="data.options.left.model == 'goods'">
<div class="left-side" @click="linkTo(data.options.right.data.image.url)">
<img :src="data.options.left.data.image.src" alt="">
</div>
<div class="right-side">
<div class="badge-box flex">
<div class="badge" @click="linkTo(data.options.right.data.image.url)">
{{data.options.left.data.badge.label}}
</div>
</div>
<div class="flex goods-list">
<div class="goods-item flex" @click="linkTo(item.url)" :key="index" v-for="(item,index) in data.options.left.data.list">
<div class="goods-thumbnail">
<img :src="item.img" alt="">
</div>
<div class="goods-detail">
<div class="goods-detail-title">{{item.title}}</div>
<div class="goods-detail-price">{{item.price | unitPrice('¥')}}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "mix-goods",
data() {
return {}
},
props: {
data: {
type: Object,
default: {}
}
},
components: {},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
.right-side{
width: 387px;
}
.goods-detail-title{
font-size: 13px;
font-weight: normal;
line-height: 16px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.goods-detail-price{
font-size: 14px;
font-weight: normal;
line-height: 17px;
letter-spacing: 0px;
color: #F31947;
margin-top: 8px;
margin-bottom:10px;
}
.goods-thumbnail{
margin-left: 7px;
display: flex;
align-items: center;
>img{
width:90px;
height: 90px;
}
}
.badge-box{
justify-content:right;
}
.goods-list{
width: 387px;
flex-wrap: wrap;
justify-content:space-between;
padding: 0 16px;
}
.goods-item{
cursor: pointer;
display: flex;
align-items: center;
width: 173.6px;
height: 119px;
border-radius: 9.8px;
opacity: 1;
transition: .35s;
background: #FFFFFF;
margin-bottom:9px;
&:hover{
box-shadow: 0px 1px 6px 0px #E5E5E5;
}
}
.left-side {
>img{
border-radius: 10px 0px 0px 10px;
display: block;
width: 196.7px;
height: 343.7px;
}
}
.badge {
width: 50px;
height: 27px;
line-height:27px;
border-radius: 13.3px 0px 0px 13.3px;
opacity: 1;
background: #F31947;
font-size: 12.6px;
font-weight: normal;
text-align: center;
letter-spacing: 0px;
color: #FFFFFF;
margin-top: 26px;
margin-bottom:17px;
}
</style>

View File

@@ -0,0 +1,36 @@
<template>
<div class="line flex flex-a-c flex-j-sb">
<div class="column" v-for="(item,index) in data.options.list" :key="index">
<img :src="item.img" class="three-column-img">
</div>
</div>
</template>
<script>
export default {
name: "oneRowThreeColumns",
props: {
data: {
type: Object,
default: {}
}
},
data () {
return {
};
},
methods: {}
}
</script>
<style scoped lang="scss">
.column{
width: 385px;
height: 165px;
>img{
width: 100%;
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,186 @@
<template>
<div class="goods-type-wrapper">
<!-- 商品部分 -->
<div class="only-goods-list flex" >
<div
class="only-goods-list-item"
v-for="(item, index) in data.options.list"
:key="index"
@click="handleClick(item)"
>
<div>
<div class="goods-name wes-2">{{ item.title }}</div>
<div class="goods-desc">{{ item.desc }}</div>
</div>
<div class="goods-img">
<img :src="item.img" />
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "onlyGoodsList",
props: {
data: {
type: Object,
default: {},
},
},
data() {
return {
flag:false,
tabIndex:0,
current: 0,
showModal: false,
selected: {}, // 已选数据
picModelFlag: false,
};
},
mounted(){
},
methods: {
handleClick(val){
this.linkTo(val.url)
},
},
};
</script>
<style scoped lang="scss">
.goods-type-wrapper {
position: relative;
}
.del-btn{
margin-left:10px;
}
.tab-bar {
margin-bottom: 20px;
}
.draggable {
padding: 10px;
border-bottom: 1px solid #ededed;
transition: 0.35s;
&:hover {
background-color: #ededed;
}
}
.column-config {
margin-left: 10px;
> * {
margin: 4px;
}
}
.column-img {
width: 100px;
height: 100px;
}
.add-goods {
margin-left: 20px;
margin-bottom: 10px;
}
.only-goods-list {
position: relative;
flex-wrap: wrap;
justify-content: space-between;
&:hover {
> .setup-box {
display: block;
}
}
}
.column-goods-config {
flex: 2;
align-items: center;
justify-content: space-between;
}
.only-goods-list-item {
padding-top: 34.8px;
margin-bottom: 14.3px;
width: 287px;
height: 343.7px;
border-radius: 9.8px;
opacity: 1;
cursor: pointer;
background: #ffffff;
transition: 0.35s;
box-shadow: 0px 1px 13px 0px #e5e5e5;
&:hover {
box-shadow: 0px 1px 14px 0px #c5c5c5;
transform: translateY(-2px);
}
}
.goods-img {
text-align: center;
> img {
width: auto;
max-height: 183px;
}
}
.goods-name {
margin-bottom: 11.9px;
font-size: 25px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: #333333;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-desc {
margin-bottom: 30px;
font-size: 16px;
font-weight: normal;
line-height: 19px;
text-align: center;
letter-spacing: 0px;
color: #666666;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-price {
font-size: 25.2px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: $theme_color;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-type-line {
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.goods-type-title {
font-size: 31px;
font-weight: normal;
line-height: 37px;
letter-spacing: 0px;
color: #333333;
}
.active {
color: $theme_color;
}
.goods-type-labels {
font-size: 21px;
font-weight: normal;
line-height: 25px;
letter-spacing: 0px;
}
.goods-type-item {
margin-left: 28px;
}
</style>

View File

@@ -1,114 +1,94 @@
<template>
<div class="lili-map">
<Modal v-model="showMap" title="选择地址" width="800">
<div class="address">{{ addrContent.address }}</div>
<div id="map-container"></div>
<div class="map">
<div class="address">{{ addrContent.address }}</div>
<div id="map-container"></div>
<div class="search-con">
<Input placeholder="输入关键字搜索" id="input-map" v-model="mapSearch" />
<ul>
<li v-for="(tip, index) in tips" :key="index" @click="selectAddr(tip.location)">
<p>{{ tip.name }}</p>
<p>{{ tip.district + tip.address }}</p>
</li>
</ul>
</div>
<div slot="footer" class="footer">
<Button type="primary" :loading="loading" @click="ok">确定</Button>
</div>
<div class="search-con">
<Input
placeholder="输入关键字搜索"
id="input-map"
v-model="mapSearch"
/>
<ul>
<li
v-for="(tip, index) in tips"
:key="index"
@click="selectAddr(tip.location)"
>
<p>{{ tip.name }}</p>
<p>{{ tip.district + tip.address }}</p>
</li>
</ul>
</div>
<div slot="footer">
<Button type="default" @click="showMap = false">取消</Button>
<Button type="primary" :loading="loading" @click="ok">确定</Button>
</div>
</Modal>
</div>
</template>
<script>
import AMapLoader from '@amap/amap-jsapi-loader';
import { handleRegion } from '@/api/address.js';
import config from '@/config'
import AMapLoader from "@amap/amap-jsapi-loader";
import { handleRegion } from "@/api/address.js";
const config = require('@/config/index')
export default {
name: 'map',
props: {
useApi: {
default: true,
type: Boolean
}
},
data () {
name: "map",
data() {
return {
config,
showMap: false, // 展示地图
mapSearch: '', // 地图搜索
showMap: false, // 地图显隐
mapSearch: "", // 地图搜索
map: null, // 初始化地图
autoComplete: null, // 初始化搜索方法
geocoder: null, // 初始化地理、坐标转化
positionPicker: null, // 地图拖拽选点
tips: [], // 搜索关键字列表
tips: [], //搜索关键字列表
addrContent: {}, // 回显地址信息
loading: false // 加载状态
loading: false, // 加载状态
};
},
watch: {
// 监听搜索框搜索地图
mapSearch: function (val) {
this.searchOfMap(val);
}
},
},
methods: {
ok () {
// 确定选择
this.loading = true;
const address = this.addrContent.address;
const township = this.addrContent.regeocode.addressComponent.township;
const index = address.indexOf(township) + township.length;
this.addrContent.detail = address.substring(index);
const params = {
cityCode: this.addrContent.regeocode.addressComponent.citycode,
townName: this.addrContent.regeocode.addressComponent.township
};
if (this.useApi) {
ok() {
if (this.addrContent && this.addrContent.regeocode) {
const params = {
cityCode: this.addrContent.regeocode.addressComponent.citycode,
townName: this.addrContent.regeocode.addressComponent.township,
};
handleRegion(params).then((res) => {
this.loading = false;
if (res.success) {
this.showMap = false;
this.addrContent.addr = res.result.name.replace(/,/g, ' ');
this.addrContent.addr = res.result.name.replace(/,/g, " ");
this.addrContent.addrId = res.result.id;
this.$emit('getAddress', this.addrContent);
this.loading = false;
this.$emit("getAddress", this.addrContent);
}
});
} else {
this.loading = false;
this.showMap = false;
this.$emit('getAddress', this.addrContent);
this.$Message.error('未获取到坐标信息请查看高德API配置是否正确')
}
},
init () { // 初始化地图
init() {
AMapLoader.load({
key: this.config.aMapKey, // 申请好的Web端开发者Key首次调用 load 时必填
version: '', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
version: "", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: [
'AMap.ToolBar',
'AMap.Autocomplete',
'AMap.PlaceSearch',
'AMap.Geolocation',
'AMap.Geocoder'
"AMap.ToolBar",
"AMap.Autocomplete",
"AMap.PlaceSearch",
"AMap.Geolocation",
"AMap.Geocoder",
], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
AMapUI: {
// 是否加载 AMapUI缺省不加载
version: '1.1', // AMapUI 缺省 1.1
plugins: ['misc/PositionPicker'] // 需要加载的 AMapUI ui插件
}
version: "1.1", // AMapUI 缺省 1.1
plugins: ["misc/PositionPicker"], // 需要加载的 AMapUI ui插件
},
})
.then((AMap) => {
let that = this;
this.map = new AMap.Map('map-container', {
zoom: 12
this.map = new AMap.Map("map-container", {
zoom: 12,
});
that.map.addControl(new AMap.ToolBar());
that.map.addControl(new AMap.Autocomplete());
@@ -117,15 +97,15 @@ export default {
// 实例化Autocomplete
let autoOptions = {
city: '全国'
city: "全国",
};
that.autoComplete = new AMap.Autocomplete(autoOptions); // 搜索
that.geocoder = new AMap.Geocoder(autoOptions);
that.positionPicker = new AMapUI.PositionPicker({
// 拖拽选点
mode: 'dragMap',
map: that.map
mode: "dragMap",
map: that.map,
});
that.positionPicker.start();
/**
@@ -134,38 +114,37 @@ export default {
* 需要字段可以查找
*
*/
that.positionPicker.on('success', function (positionResult) {
// console.log(positionResult);
that.positionPicker.on("success", function (positionResult) {
that.addrContent = positionResult;
});
})
.catch((e) => {});
.catch((e) => { });
},
searchOfMap (val) {
searchOfMap(val) {
// 地图搜索
let that = this;
this.autoComplete.search(val, function (status, result) {
// 搜索成功时result即是对应的匹配数据
if (status === 'complete' && result.info === 'OK') {
if (status == "complete" && result.info == "OK") {
that.tips = result.tips;
} else {
that.tips = [];
}
});
},
selectAddr (location) {
selectAddr(location) {
// 选择坐标
if (!location) {
this.$Message.warning('请选择正确点位');
this.$Message.warning("请选择正确点位");
return false;
}
const lnglat = [location.lng, location.lat];
this.positionPicker.start(lnglat);
}
},
},
mounted () {
mounted() {
this.init();
}
},
};
</script>
<style lang="scss" scoped>
@@ -179,16 +158,20 @@ export default {
right: 20px;
top: 64px;
width: 260px;
ul {
width: 260px;
height: 400px;
height: 360px;
overflow: scroll;
li {
padding: 5px;
p:nth-child(2) {
color: #999;
font-size: 12px;
}
&:hover {
background-color: #eee;
cursor: pointer;
@@ -199,6 +182,12 @@ export default {
.address {
margin-bottom: 10px;
// color: $theme_color;
font-weight: bold;
}
.footer {
text-align: right;
margin: 10px 0;
}
</style>

View File

@@ -0,0 +1,155 @@
<template>
<Modal width="800" footer-hide v-model="enableMap">
<RadioGroup @on-change="changeMap" v-model="mapDefault" type="button">
<Radio label="select">级联选择</Radio>
<Radio label="map" v-if="aMapSwitch">高德地图</Radio>
</RadioGroup>
<div>
<div v-if="mapDefault === 'select'">
<div class="selector">
<div class="selector-item" v-for="(plant, plantIndex) in Object.keys(data)" :key="plantIndex">
<div :class="{ 'active': chiosend[plantIndex].id == item.id }" v-for="(item, index) in data[plant]"
:key="index"
@click="init(item, plantIndex != Object.keys(data).length - 1 ? Object.keys(data)[plantIndex + 1] : 0, plantIndex)"
class="map-item">
{{ item.name }}
</div>
</div>
</div>
<div class="footer">
<Button type="primary" @click="finished">确定</Button>
</div>
</div>
<mapping v-if="mapDefault === 'map'" ref="map" @getAddress="getAddress" />
</div>
</Modal>
</template>
<script>
import { aMapSwitch } from '@/config/index'
import mapping from "@/components/map/index.vue";
import * as API_Setup from "@/api/common.js";
export default {
components: { mapping },
data() {
return {
aMapSwitch,
enableMap: false,
mapDefault: "select",
data: {
province: [], //省
city: [], //市
area: [], //区
street: [], //街道
},
chiosend: [],
};
},
mounted() {
this.chiosend = new Array(4).fill("");
},
methods: {
open() {
this.enableMap = true
this.init({ id: 0 }, 'province');
},
changeMap(val) {
this.mapDefault = val
},
init(val, level = 'province', index) {
if (level == 0) {
// 说明选择到了街道将街道id存入数组
this.chiosend.splice(3, 1, val);
}
else {
API_Setup.getRegion(val.id).then((res) => {
if (res.result.length && val.id !== 0) {
this.chiosend[index] = val
}
else if(!res.result.length){
this.chiosend[index] = val
}
this.data[level] = res.result;
if (level == 'city') {
this.data.area = []
this.data.street = []
this.chiosend.splice(1, 3, "","","");
}
if (level == 'area') {
this.data.street = []
this.chiosend.splice(2, 2, "","");
}
if (level == 'street') {
this.chiosend.splice(3, 1, "");
}
});
}
},
getAddress(center) {
this.$emit('callback', {
type: this.mapDefault,
data: center
})
this.enableMap = false;
},
// 选择完成
finished() {
if(!this.chiosend[0]){
this.$Message.error("请选择地址")
return
}
const params = this.chiosend.filter((item) => item!=="" && item.value !== "");
this.enableMap = false;
this.$emit('callback', {
type: this.mapDefault,
data: params
})
},
},
}
</script>
<style lang="scss" scoped>
.selector {
height: 400px;
padding: 10px 0;
display: flex;
}
.selector-item {
width: 100%;
flex: 1;
overflow: auto;
}
.map-item {
width: 100%;
padding: 10px;
border-bottom: 1px solid #eee;
cursor: pointer;
&:hover {
background: #eee;
}
}
.active {
background: #eee;
}
.footer {
text-align: right;
margin: 10px 0;
}
</style>

View File

@@ -0,0 +1,52 @@
<template>
<div></div>
</template>
<script>
import { getIMDetail } from "@/api/common";
import Storage from "@/plugins/storage";
import { getMemberMsg } from "@/api/login";
export default {
data() {
return {
Storage,
IMLink: "",
};
},
methods: {
// 跳转im客服
async IMService(id, goodsId, skuId) {
// 获取访问Token
let accessToken = Storage.getItem("accessToken");
await this.getIMDetailMethods();
const userInfo = await getMemberMsg();
if (userInfo.success) {
//携带商品Id,在IM可以发送商品信息
if(goodsId && skuId){
window.open(
this.IMLink + "?token=" + accessToken + "&id=" + id || this.storeMsg.storeId + "&goodsId=" + goodsId + "&skuId=" + skuId
);
}else{
window.open(
this.IMLink + "?token=" + accessToken + "&id=" + id || this.storeMsg.storeId
);
}
} else {
this.$Message.error("请登录后再联系客服");
return;
}
},
// 获取im信息
async getIMDetailMethods() {
let res = await getIMDetail();
if (res.success) {
this.IMLink = res.result;
}
},
},
};
</script>
<style lang="scss" scoped></style>

View File

@@ -1,27 +1,56 @@
<template>
<div class="cate-nav">
<div class="nav-con">
<div class="all-categories hover-pointer" @mouseenter="showFirstList = true" @mouseleave="showFirstList = false">全部商品分类</div>
<ul class="nav-item" v-if="showNavBar">
<div class="cate-nav width_1200_auto" :class="{'fixed-show':useClass == 'fixed-show'}">
<div class="nav-con" :class="{'background-white':useClass == 'background-white'}">
<div
class="all-categories hover-pointer"
@mouseenter="showFirstLists"
@mouseleave="showFirstList = false"
>
商品分类
</div>
<ul class="nav-item " v-if="showNavBar">
<li
class="nav-lis flex flex-a-c flex-j-c"
v-for="(item, index) in navList.list"
:key="index"
@click="linkTo(item.url)"
>
{{ item.name }}
<div class="colum" v-if="index !== navList.list.length - 1"></div>
</li>
</ul>
</div>
<!-- 全部商品分类 -->
<div class="cate-list" v-show="showAlways || showFirstList" @mouseenter="showFirstList = true" @mouseleave="showFirstList = false">
<div
class="cate-list"
:style="{'top':!showNavBar ?'60px':'46px'}"
v-show="showAlways || showFirstList"
@mouseenter="showFirstList = true"
@mouseleave="showFirstList = false"
>
<!-- 第一级分类 -->
<div class="nav-side" :class="{'large-nav': large, 'opacity-nav': opacity}" @mouseleave="panel = false">
<div
class="nav-side"
:class="{ 'large-nav': large, 'opacity-nav': opacity }"
@mouseleave="panel = false"
>
<ul>
<li v-for="(item, index) in cateList" :key="index" @mouseenter="showDetail(index)" >
<span class="nav-side-item" @click="goGoodsList(item.id)">{{item.name}}</span>
<li
v-for="(item, index) in cateList"
:key="index"
@mouseenter="showDetail(index)"
>
<span class="nav-side-item" @click="goGoodsList(item.id)">{{
item.name
}}</span>
<span v-for="(second, secIndex) in item.children" :key="secIndex">
<span v-if="secIndex < 2" > / </span>
<span @click="goGoodsList(second.id, second.parentId)" class="nav-side-item" v-if="secIndex < 2">{{second.name}}</span>
<span v-if="secIndex < 2"> / </span>
<span
@click="goGoodsList(second.id, second.parentId)"
class="nav-side-item"
v-if="secIndex < 2"
>{{ second.name }}</span
>
</span>
</li>
</ul>
@@ -29,14 +58,19 @@
<!-- 展开分类 -->
<div
class="detail-item-panel"
:style="{'minHeight': large?'470px':'340px'}"
:style="{ minHeight: large ? '470px' : '340px' }"
v-show="panel"
@mouseenter="panel = true"
@mouseleave="panel = false"
>
<div class="nav-detail-item">
<template v-for="(item, index) in panelData">
<span @click="goGoodsList(item.id, item.parentId)" v-if="index < 8" :key="index">{{ item.name }}<Icon type="ios-arrow-forward" /></span>
<template v-for="(item,index) in panelData">
<span
@click="goGoodsList(item.id,item.parentId)"
v-if="index < 8"
:key="index"
>{{ item.name }}<Icon type="ios-arrow-forward"
/></span>
</template>
</div>
<ul>
@@ -45,13 +79,21 @@
:key="index"
class="detail-item-row"
>
<span class="detail-item-title" @click="goGoodsList(items.id,items.parentId)">
<span
class="detail-item-title"
@click="goGoodsList(items.id, items.parentId)"
>
{{ items.name }} <Icon type="ios-arrow-forward" />
<span class="glyphicon glyphicon-menu-right"></span>
</span>
<div>
<span v-for="(item, subIndex) in items.children" @click="goGoodsList(item.id,items.id,items.parentId)"
:key="subIndex" class="detail-item">{{ item.name }}</span>
<span
v-for="(item, subIndex) in items.children"
@click="goGoodsList(item.id, items.id, items.parentId)"
:key="subIndex"
class="detail-item"
>{{ item.name }}</span
>
</div>
</li>
</ul>
@@ -61,133 +103,204 @@
</template>
<script>
import { getCategory } from '@/api/goods';
import storage from '@/plugins/storage.js'
import { getCategory } from "@/api/goods";
import storage from "@/plugins/storage.js";
export default {
name: 'GoodsListNav',
name: "GoodsListNav",
props: {
showAlways: { // 总是显示下拉分类
showAlways: {
// 总是显示下拉分类
default: false,
type: Boolean
type: Boolean,
},
showNavBar: { // 显示全部商品分类右侧导航条
showNavBar: {
// 显示全部商品分类右侧导航条
default: true,
type: Boolean
type: Boolean,
},
hover: {
default: false,
type: Boolean
type: Boolean,
},
large: { // 是否更高的高度
large: {
// 是否更高的高度
default: false,
type: Boolean
type: Boolean,
},
opacity: { // 是否背景透明
opacity: {
// 是否背景透明
default: false,
type: Boolean
type: Boolean,
},
useClass:{
type:null,
default:''
}
},
data () {
data() {
return {
panel: false, // 二级分类展示
panelData: [], // 二级分类数据
showFirstList: false, // 始终展示一级列表
cateList: [] // 商品分类
}
cateList: [], // 商品分类
};
},
computed: {
navList () { // 导航列表
if (storage.getItem('navList')) {
return JSON.parse(storage.getItem('navList'))
navList() {
// 导航列表
if (storage.getItem("navList")) {
return JSON.parse(storage.getItem("navList"));
} else {
return []
return [];
}
}
},
},
methods: {
getCate () { // 获取分类数据
if (this.hover) return false;
getCategory(0).then(res => {
if (res.success) {
this.cateList = res.result;
this.$store.commit('SET_CATEGORY', res.result)
// 过期时间
var expirationTime = new Date().setHours(new Date().getHours() + 1);
// 存放过期时间
localStorage.setItem('category_expiration_time', expirationTime);
// 存放分类信息
localStorage.setItem('category', JSON.stringify(res.result))
}
});
},
showDetail (index) { // 展示全部分类
this.panel = true
this.panelData = this.cateList[index].children
},
goGoodsList (id, secondId, firstId) { // 分类共有三级,传全部分类过去
const arr = [firstId, secondId, id]
if (!arr[1]) {
arr.splice(0, 2)
}
if (!arr[0]) {
arr.shift()
}
let routerUrl = this.$router.resolve({
path: '/goodsList',
query: {categoryId: arr.toString()}
})
window.open(routerUrl.href, '_blank')
}
},
mounted () {
if (localStorage.getItem('category') && localStorage.getItem('category_expiration_time')) {
showFirstLists(){
this.showFirstList = true;
if(
localStorage.getItem("category") &&
localStorage.getItem("category_expiration_time")
) {
// this.getCate();
// 如果缓存过期,则获取最新的信息
if (new Date() > localStorage.getItem('category_expiration_time')) {
if (new Date() > localStorage.getItem("category_expiration_time")) {
this.getCate();
return;
}
this.cateList = JSON.parse(localStorage.getItem('category'))
this.cateList = JSON.parse(localStorage.getItem("category"));
// this.$Message.info(cateList)
}
},
getCate() {
// 获取分类数据
if (this.hover) return false;
getCategory(0).then((res) => {
if (res.success) {
this.cateList = res.result;
this.$store.commit("SET_CATEGORY", res.result);
// 过期时间
var expirationTime = new Date().setHours(new Date().getHours() + 1);
// 存放过期时间
localStorage.setItem("category_expiration_time", expirationTime);
// 存放分类信息
localStorage.setItem("category", JSON.stringify(res.result));
}
});
},
showDetail(index) {
// 展示全部分类
this.panel = true;
this.panelData = this.cateList[index].children;
},
goGoodsList(id, secondId, firstId) {
// 分类共有三级,传全部分类过去
const arr = [firstId, secondId, id];
if (!arr[1]) {
arr.splice(0, 2);
}
if (!arr[0]) {
arr.shift();
}
let routerUrl = this.$router.resolve({
path: "/goodsList",
query: { categoryId: arr.toString() },
});
window.open(routerUrl.href, "_blank");
},
},
mounted() {
if (
localStorage.getItem("category") &&
localStorage.getItem("category_expiration_time")
) {
// 如果缓存过期,则获取最新的信息
if (new Date() > localStorage.getItem("category_expiration_time")) {
this.getCate();
return;
}
this.cateList = JSON.parse(localStorage.getItem("category"));
} else {
this.getCate()
this.getCate();
}
}
},
};
</script>
<style scoped lang="scss">
.cate-nav{
width: 1200px;
.background-white{
background: #fff;
}
.nav-lis:hover {
color: $theme_color !important;
cursor: pointer;
}
.nav-lis{
width: 103px;
text-align: center;
position: relative;
margin: 0 auto;
}
.fixed-show{
margin-top: 0 !important;
>.nav-con{
>.all-categories{
align-items: center !important;
height: 60px;
display: inherit;
justify-content: center;
padding: 0 !important;
}
}
}
.colum{
height: 14.7px;
opacity: 1;
border: 0.7px solid #CBC8C8;
position: absolute;
right: 0;
}
.cate-nav {
position: relative;
margin: 14px auto 0 auto;
}
/** 商品分类 */
.nav-con {
width: 1200px;
height: 40px;
height: 46px;
margin: 0 auto;
display: flex;
.all-categories {
width: 200px;
line-height: 40px;
color: #fff;
background-color: $theme_color;
text-align: center;
font-size: 16px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
padding-left: 37.4px;
background: #FFFFFF;
width: 263.2px;
padding-top: 15.4px;
line-height: 20px;
border-bottom: none;
font-size: 16.8px;
font-weight: normal;
color: #333333;
letter-spacing: 0px;
}
.nav-item {
width: 1000px;
height: 40px;
line-height: 40px;
width: 914px;
height: 46px;
border-radius: 10px;
background: #FFFFFF;
margin-left: 10px;
line-height: 46px;
overflow: hidden;
list-style: none;
background-color: #eee;
// background-color: #eee;
display: flex;
li {
float: left;
font-weight: bold;
margin-left: 20px;
color: rgb(89, 88, 88);
font-size: 15px;
font-size: 17px;
font-weight: normal;
color: #333333;
&:hover {
color: $theme_color;
}
@@ -195,44 +308,54 @@ export default {
}
}
// 分类列表
.cate-list{
.cate-list {
margin: 0 auto;
position: absolute;
z-index: 1000;
}
.nav-side {
width: 200px;
width: 263.2px;
color: #666;
float: left;
padding: 0px;
color: #fff;
background-color: #6e6568;
height: 335px;
overflow: hidden;
overflow:hidden;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
background-color: #fff;
height: 340px;
////自动移滚动条样式
//&::-webkit-scrollbar {
// width: 1px;
// height: 5px;
//}
//&::-webkit-scrollbar-thumb {
// border-radius: 1em;
// background-color: rgba(50, 50, 50, 0.3);
//}
//&::-webkit-scrollbar-track {
// border-radius: 1em;
// background-color: rgba(50, 50, 50, 0.1);
//}
}
.large-nav{
.large-nav {
height: 470px;
ul>li{
ul > li {
line-height: 20px;
}
}
.opacity-nav{
background-color:rgba(0,0,0,.5);
.opacity-nav {
background-color: rgba(0, 0, 0, 0.5);
}
.nav-side ul {
width: 100%;
padding: 0px;
padding-top: 5px;
list-style: none;
}
.nav-side li {
padding: 7.5px 0;
padding-left: 12px;
padding: 0 0 16.2px 37.4px;
font-size: 13px;
line-height: 18px;
&:hover{
background: #999395;
}
}
.nav-side-item:hover {
cursor: pointer;
@@ -262,10 +385,11 @@ export default {
padding-left: 12px;
margin-right: 15px;
font-size: 12px;
background-color: #6e6568;
color: #333;
}
.nav-detail-item span:hover {
background-color: $theme_color;
color: #fff;
}
.detail-item-panel li {
line-height: 30px;
@@ -282,9 +406,11 @@ export default {
.detail-item-title:hover {
color: $theme_color;
}
.detail-item-row {
.detail-item-row {
display: flex;
>div{flex: 1;}
> div {
flex: 1;
}
}
.detail-item {
font-size: 12px;
@@ -292,7 +418,7 @@ export default {
padding-right: 8px;
cursor: pointer;
border-left: 1px solid #ccc;
&:first-child{
&:first-child {
border: none;
padding-left: 0;
}

View File

@@ -153,7 +153,9 @@
</div>
</div>
</template>
<div @click="moreOptions" v-if="tagsContent.length>4" class="more-options">{{showTagCount===5?'更多筛选项':'收起筛选项'}}<Icon :type="showTagCount===5?'ios-arrow-down':'ios-arrow-up'" /></div>
<div @click="moreOptions" v-if="tagsContent.length>4" class="more-options">
{{showTagCount===5?'更多筛选项':'收起筛选项'}}
</div>
</div>
</div>
</template>
@@ -545,7 +547,7 @@ export default {
width: 100px;
height: 50px;
float: left;
line-height: 50px;
line-height: 45px;
border: 1px solid #ddd;
margin: -1px -1px 0 0;
overflow: hidden;
@@ -558,6 +560,7 @@ export default {
&:hover {
border-color: $theme_color;
border: 2px solid $theme_color;
top: 0;
left: 0;
position: relative;
@@ -666,7 +669,7 @@ export default {
height: 30px;
float: left;
line-height: 30px;
color: $primary_color;
color:#4d9cf1;
overflow: hidden;
position: relative;
font-size: 12px;
@@ -716,11 +719,13 @@ export default {
}
.more-options{
margin: 5px;
color: #2d8cf0;
color: #4d9cf1;
font-size: 12px;
cursor: pointer;
text-align: right;
}
.more-options:hover{
color:#0165d1;
}
/** 其他筛选项 end */
</style>

View File

@@ -7,7 +7,7 @@ import storage from '@/plugins/storage.js';
*/
export function getVerifyImg (verificationEnums) {
return request({
url: `${commonUrl}/common/slider/${verificationEnums}`,
url: `${commonUrl}/common/common/slider/${verificationEnums}`,
method: Method.GET,
needToken: false,
headers: {uuid: storage.getItem('uuid')}
@@ -19,7 +19,7 @@ export function getVerifyImg (verificationEnums) {
*/
export function postVerifyImg (params) {
return request({
url: `${commonUrl}/common/slider/${params.verificationEnums}`,
url: `${commonUrl}/common/common/slider/${params.verificationEnums}`,
method: Method.POST,
needToken: false,
params,

View File

@@ -1,42 +1,27 @@
export default {
/**
* @description 配置显示在浏览器标签的title、底部信息、部分信息展示的值
*/
title: "lili-shop",
/**
* @description icp证
*/
icpCard: "",
company:{
href:"https://pickmall.cn",
name:"北京宏业汇成科技有限公司"
},
const Cookie = require('js-cookie')
module.exports = {
title:Cookie.get('siteName') || 'lilishop', //配置显示在浏览器标签的title、底部信息、部分信息展示的值
icpCard: "", // icp证
company: {
href: "https://pickmall.cn",
name: "北京宏业汇成科技有限公司",
}, //公司信息
icpMessage: "京ICP备20009696号-1", //icp备案
/**
* @description icp备案号
* 高德地图申请链接
* https://lbs.amap.com/api/javascript-api/guide/abc/prepare
* 添加成功后可获取到key值和安全密钥jscode自2021年12月02日升级升级之后所申请的 key 必须配备安全密钥 jscode 一起使用)
*/
icpMessage: "京ICP备20009696号-1",
/**
* @description token在Cookie中存储的天数默认1天
*/
cookieExpires: 1,
/**
* @description 是否使用国际化默认为false
* 如果不使用则需要在路由中给需要在菜单中展示的路由设置meta: {title: 'xxx'}
* 用来在菜单中显示文字
*/
useI18n: false,
/**
* @description 高德web端申请的api key
*/
aMapKey: "b440952723253aa9fe483e698057bf7d",
/**
* @description 需要加载的插件
*/
plugin: {
"error-store": {
showInHeader: true, // 设为false后不会在顶部显示错误日志徽标
developmentOff: true // 设为true后在开发环境不会收集错误信息方便开发中排查错误
}
}
//FIXME 请检查当前高德key创建的日期如果2021年12月02日之前申请的 无需填写安全密钥
aMapSecurityJsCode:"2bd0fbf621881f4c77be74f0e76495f3", // 高德web端js申请的安全密钥
aMapKey: "7f11113750315d8543daaf5c3ba353ca", //高德web端js申请的api key
aMapSwitch:false, //是否开启高德定位
enableCDN: true, //生产环境 是否启用cdn加载 vue等js
port: 10000, //端口
inputMaxLength:'140', //全局输入框默认最大输入长度字
PC_DOMAIN: "https://pc-b2b2c.pickmall.cn", // PC端域名
WAP_DOMAIN: "https://m-b2b2c.pickmall.cn", // WAP端域名
};

View File

@@ -1,53 +1,70 @@
import Vue from 'vue';
import App from './App';
import router from './router';
import ViewUI from 'view-design';
import './assets/styles/theme.less';
import Vue from "vue";
import App from "./App";
import router from "./router";
import ViewUI from "view-design";
import "./assets/styles/theme.less";
// import './assets/iconfont/iconfont.css';
import * as filters from './plugins/filters';
import store from '@/vuex/store'
import storage from '@/plugins/storage';
import * as filters from "./plugins/filters";
import store from "@/vuex/store";
import storage from "@/plugins/storage";
// 全局引入封装组件
import {InstallAll} from '@/components/global.js';
import {InstallAll} from "@/components/global.js";
const {aMapSecurityJsCode, title, inputMaxLength} = require("@/config");
const copyViewUi = {...ViewUI}
copyViewUi.Input.props.maxlength.default = inputMaxLength // 挂载最大输入值
Vue.use(copyViewUi);
Vue.use(ViewUI);
Vue.use(InstallAll);
Vue.config.productionTip = false;
Object.keys(filters).forEach(key => {
Object.keys(filters).forEach((key) => {
Vue.filter(key, filters[key]);
});
// 高德安全密钥
if (aMapSecurityJsCode) {
window._AMapSecurityConfig = {
securityJsCode: aMapSecurityJsCode,
};
}
router.beforeEach((to, from, next) => {
ViewUI.LoadingBar.start();
window.document.title = to.meta.title === undefined ? 'lili shop' : to.meta.title
window.document.title = to.meta.title === undefined ? title : to.meta.title;
next();
});
router.afterEach(route => {
router.afterEach((route) => {
ViewUI.LoadingBar.finish();
});
Vue.prototype.linkTo = function (url) {
if (url.substr(0, 1) === '/') { // 非外部链接没有origin只有路由地址
if (router.mode === 'hash') {
window.open(location.origin + '/#' + url, '_blank');
if (url.substr(0, 1) === "/") {
// 非外部链接没有origin只有路由地址
if (router.mode === "hash") {
window.open(location.origin + "/#" + url, "_blank");
} else {
window.open(location.origin + url, '_blank');
window.open(location.origin + url, "_blank");
}
} else { // 外部链接完整的url地址
window.open(url, '_blank')
} else {
// 外部链接完整的url地址
window.open(url, "_blank");
}
}
};
// 联系客服
Vue.prototype.connectCs = function (sign = '37ef9b97807d03c6741298ed4eb5b536d2d238e08a3c00fb01fe48f03a569974c99ad767e72c04b3165ef29aca2c488b505fe4ca') {
const url = 'https://yzf.qq.com/xv/web/static/chat/index.html?sign=' + sign
window.open(url, '_blank')
}
Vue.prototype.Cookies = storage
Vue.prototype.connectCs = function (
sign = "37ef9b97807d03c6741298ed4eb5b536d2d238e08a3c00fb01fe48f03a569974c99ad767e72c04b3165ef29aca2c488b505fe4ca"
) {
const url = "https://yzf.qq.com/xv/web/static/chat/index.html?sign=" + sign;
window.open(url, "_blank");
};
Vue.prototype.Cookies = storage;
/* eslint-disable no-new */
new Vue({
router,
store,
render: h => h(App)
}).$mount("#app")
render: (h) => h(App),
}).$mount("#app");

View File

@@ -4,12 +4,13 @@
<!-- LOGO 搜索 -->
<div class="width_1200 logo">
<div>
<router-link to="/"><img :src="$store.state.logoImg" /></router-link>
<router-link to="/"><img :src="$store.state.logoImg" /></router-link>
<div>
购物车(<span>{{ goodsTotal }}</span>)
购物车(<span>{{ goodsTotal }}</span
>)
</div>
</div>
<Search :showTag="false" :showLogo="false"></Search>
</div>
<Divider />
<!-- 购物车主体 -->
@@ -17,9 +18,15 @@
<div class="available-area">
<div class="cart-steps">
<span :class="stepIndex == 0 ? 'active' : ''">1.我的购物车</span>
<Icon :class="stepIndex == 0 ? 'active-arrow' : ''" custom="icomoon icon-next"></Icon>
<Icon
:class="stepIndex == 0 ? 'active-arrow' : ''"
custom="icomoon icon-next"
></Icon>
<span :class="stepIndex == 1 ? 'active' : ''">2.填写订单信息</span>
<Icon :class="stepIndex == 1 ? 'active-arrow' : ''" custom="icomoon icon-next"></Icon>
<Icon
:class="stepIndex == 1 ? 'active-arrow' : ''"
custom="icomoon icon-next"
></Icon>
<span :class="stepIndex == 2 ? 'active' : ''">3.成功提交订单</span>
</div>
</div>
@@ -27,7 +34,11 @@
<div class="cart-goods">
<div class="cart-goods-title">
<div class="width_60">
<Checkbox v-model="allChecked" @on-change="changeChecked(allChecked, 'all')">全选</Checkbox>
<Checkbox
v-model="allChecked"
@on-change="changeChecked(allChecked, 'all')"
>全选</Checkbox
>
</div>
<div class="goods-title">商品</div>
<div class="width_150">单价</div>
@@ -39,52 +50,116 @@
<p>购物车空空如也</p>
<router-link to="/">去选购&gt;</router-link>
</div>
<div v-else class="cart-goods-items" v-for="(shop, index) in cartList" :key="index">
<div
v-else
class="cart-goods-items"
v-for="(shop, index) in cartList"
:key="index"
>
<div class="shop-name">
<div>
<Checkbox v-model="shop.checked" @on-change="changeChecked(shop.checked, 'shop', shop.storeId)"></Checkbox>
<span class="go-shop-page" @click="goShopPage(shop.storeId)">{{shop.storeName}}</span>
<Checkbox
v-model="shop.checked"
@on-change="changeChecked(shop.checked, 'shop', shop.storeId)"
></Checkbox>
<span class="go-shop-page" @click="goShopPage(shop.storeId)">{{
shop.storeName
}}</span>
</div>
<span class="shop-coupon" v-if="shop.couponList.length" :class="couponAvailable === index ? 'shop-coupon-show' : ''" @click.stop="showCoupon(shop.id, index)">
<span
class="shop-coupon"
v-if="shop.couponList.length"
:class="couponAvailable === index ? 'shop-coupon-show' : ''"
@click.stop="showCoupon(shop.id, index)"
>
<!-- 优惠券模态框 -->
<div v-if="couponAvailable === index">
<div class="coupon-item" v-for="(item, index) in shop.couponList" :key="index">
<span v-if="item.couponType === 'PRICE'">{{ item.price }}</span>
<span v-if="item.couponType === 'DISCOUNT'">{{ item.couponDiscount }}</span>
<span>{{item.consumeThreshold}}元可用</span>
<Button class="coupon-btn" size="small" type="primary" @click="receiveShopCoupon(item)" :disabled="item.disabled">{{ item.disabled ? "已领取" : "领取" }}</Button>
<div
class="coupon-item"
v-for="(item, index) in shop.couponList"
:key="index"
>
<span v-if="item.couponType === 'PRICE'"
>{{ item.price }}</span
>
<span v-if="item.couponType === 'DISCOUNT'"
>{{ item.couponDiscount }}</span
>
<span>{{ item.consumeThreshold }}元可用</span>
<Button
class="coupon-btn"
size="small"
type="primary"
@click="receiveShopCoupon(item)"
:disabled="item.disabled"
>{{ item.disabled ? "已领取" : "领取" }}</Button
>
</div>
</div>
</span>
<div class="promotion-notice">{{shop.promotionNotice}}</div>
<div class="promotion-notice">{{ shop.promotionNotice }}</div>
</div>
<template v-for="(goods, goodsIndex) in shop.skuList">
<div class="goods-item" :key="goodsIndex">
<div class="width_60">
<Checkbox v-model="goods.checked" @on-change="changeChecked(goods.checked, 'goods', goods.goodsSku.id)"></Checkbox>
<Checkbox
v-model="goods.checked"
@on-change="
changeChecked(goods.checked, 'goods', goods.goodsSku.id)
"
></Checkbox>
</div>
<div class="goods-title" @click="goGoodsDetail(goods.goodsSku.id, goods.goodsSku.goodsId)">
<img :src="
goods.goodsSku.thumbnail || '../assets/images/goodsDetail/item-detail-1.jpg'
" />
<div
class="goods-title"
@click="
goGoodsDetail(goods.goodsSku.id, goods.goodsSku.goodsId)
"
>
<img
:src="
goods.goodsSku.thumbnail ||
'../assets/images/goodsDetail/item-detail-1.jpg'
"
/>
<div>
<p>{{ goods.goodsSku.goodsName }}</p>
<template v-for="(promotion, promotionIndex) in goods.promotions">
<div class="promotion" :key="promotionIndex" v-if="promotion.promotionType === 'SECKILL'">
<p>
{{ goods.goodsSku.goodsName }}
</p>
<p><Tag
v-if="goods.goodsSku.salesModel === 'WHOLESALE'"
class="goods-show-tag"
color="purple"
>
批发商品
</Tag></p>
<template
v-for="(promotion, promotionIndex) in goods.promotions"
>
<div
class="promotion"
:key="promotionIndex"
v-if="promotion.promotionType === 'SECKILL'"
>
<span>秒杀</span>
<promotion :time="promotion.endTime" type="cart"></promotion>
<promotion
:time="promotion.endTime"
type="cart"
></promotion>
</div>
</template>
<template v-for="(promotion, promotionIndex) in goods.promotions">
<div class="promotion" :key="promotionIndex" v-if="promotion.promotionType === 'FULL_DISCOUNT'">
<template
v-for="(promotion, promotionIndex) in goods.promotions"
>
<div
class="promotion"
:key="promotionIndex"
v-if="promotion.promotionType === 'FULL_DISCOUNT'"
>
<span>满优惠活动</span>
<promotion :time="promotion.endTime" type="cart"></promotion>
</div>
</template>
<template v-for="(promotion, promotionIndex) in goods.promotions">
<div class="promotion" :key="promotionIndex" v-if="promotion.promotionType === 'COUPON'">
<span>优惠券</span>
<promotion :time="promotion.endTime" type="cart"></promotion>
<promotion
:time="promotion.endTime"
type="cart"
></promotion>
</div>
</template>
</div>
@@ -93,43 +168,76 @@
{{ goods.purchasePrice | unitPrice("¥") }}
</div>
<div class="width_100">
<InputNumber :min="1" size="small" v-model="goods.num" @on-change="changeNum(goods.num, goods.goodsSku.id)"></InputNumber>
<div class="fontsize_12">{{goods.goodsSku.quantity > 0 ? '有货' : '无货'}}</div>
<InputNumber
:min="1"
size="small"
v-model="goods.num"
@on-change="changeNum(goods.num, goods.goodsSku.id)"
></InputNumber>
<div class="fontsize_12">
{{ goods.goodsSku.quantity > 0 ? "有货" : "无货" }}
</div>
</div>
<div class="width_150">
{{ goods.subTotal | unitPrice("¥") }}
</div>
<div class="width_100">
<span class="handle-btn" v-if="!goods.errorMessage" @click="delGoods(goods.goodsSku.id)">删除</span>
<span class="handle-btn" v-if="!goods.errorMessage" @click="collectGoods(goods.goodsSku.id)">收藏</span>
<Button
v-if="!goods.errorMessage"
size="small"
type="primary"
@click="delGoods(goods.goodsSku.id)"
>删除</Button
>
<Button
v-if="!goods.errorMessage"
size="small"
type="info"
@click="collectGoods(goods.goodsSku.id)"
style="margin-left: 10px"
>收藏</Button
>
</div>
<div class="error-goods" v-if="goods.errorMessage">
<div>{{goods.errorMessage}}</div>
<Button type="primary" @click="delGoods(goods.goodsSku.id)">删除</Button>
<div style="margin-top: 20px">{{ goods.errorMessage }}</div>
<Button type="primary" @click="delGoods(goods.goodsSku.id)"
>删除</Button
>
</div>
</div>
</template>
</div>
<!-- 底部支付栏 -->
<div class="cart-goods-footer">
<div>
<div class="width_60">
<Checkbox v-model="allChecked" @on-change="changeChecked(allChecked, 'all')">全选</Checkbox>
<Checkbox
v-model="allChecked"
@on-change="changeChecked(allChecked, 'all')"
>全选</Checkbox
>
</div>
<div class="width_100 handle-btn" @click="delGoods()">
删除选中商品
</div>
<div class="width_100 handle-btn" @click="delGoods">删除选中商品</div>
<!-- <div class="width_100 handle-btn" @click="collectGoods">移到我的收藏</div> -->
<div class="width_100 handle-btn" @click="clearCart">清空购物车</div>
<div class="width_100 handle-btn" @click="clearCart">
清空购物车
</div>
</div>
<div>
<div class="selected-count">
已选择<span>{{ checkedNum }}</span>件商品
已选择<span>{{ checkedNum }}</span
>件商品
</div>
<div class="ml_20 save-price">
已节省<span>{{ priceDetailDTO.discountPrice | unitPrice("¥") }}</span>
已节省<span>{{
priceDetailDTO.discountPrice | unitPrice("¥")
}}</span>
</div>
<div class="ml_20 total-price">
总价不含运费:<div>{{ priceDetailDTO.flowPrice | unitPrice("¥") }}</div>
总价不含运费:
<div>{{ priceDetailDTO.flowPrice | unitPrice("¥") }}</div>
</div>
<div class="pay ml_20" @click="pay">去结算</div>
</div>
@@ -137,146 +245,148 @@
</div>
<Spin size="large" fix v-if="loading"></Spin>
</div>
<BaseFooter></BaseFooter>
<BaseFooter class="footer"></BaseFooter>
</div>
</template>
<script>
import Promotion from '@/components/goodsDetail/Promotion';
import Search from '@/components/Search';
import * as APICart from '@/api/cart';
import * as APIMember from '@/api/member';
import Promotion from "@/components/goodsDetail/Promotion";
import Search from "@/components/Search";
import * as APICart from "@/api/cart";
import * as APIMember from "@/api/member";
export default {
name: 'Cart',
beforeRouteEnter (to, from, next) {
name: "Cart",
beforeRouteEnter(to, from, next) {
window.scrollTo(0, 0);
next();
},
components: {
Search,
Promotion
Promotion,
},
data () {
data() {
return {
couponAvailable: false, // 展示优惠券
stepIndex: 0, // 当前处于哪一步,购物车==0填写订单信息==1成功提交订单==2
goodsTotal: 1, // 商品数量
goodsTotal: 0, // 商品数量
checkedNum: 0, // 选中数量
allChecked: false, // 全选
loading: false, // 加载状态
cartList: [], // 购物车列表
couponList: [], // 优惠券列表
priceDetailDTO: {}, // 价格明细
skuList: [] // sku列表
skuList: [], // sku列表
};
},
methods: {
// 跳转商品详情
goGoodsDetail (skuId, goodsId) {
goGoodsDetail(skuId, goodsId) {
let routeUrl = this.$router.resolve({
path: '/goodsDetail',
query: { skuId, goodsId }
path: "/goodsDetail",
query: { skuId, goodsId },
});
window.open(routeUrl.href, '_blank');
window.open(routeUrl.href, "_blank");
},
// 跳转店铺首页
goShopPage (id) {
goShopPage(id) {
let routeUrl = this.$router.resolve({
path: '/Merchant',
query: { id }
path: "/Merchant",
query: { id },
});
window.open(routeUrl.href, '_blank');
window.open(routeUrl.href, "_blank");
},
// 收藏商品
collectGoods (id) {
collectGoods(id) {
this.$Modal.confirm({
title: '收藏',
content: '<p>商品收藏后可在个人中心我的收藏查看</p>',
title: "收藏",
content: "<p>商品收藏后可在个人中心我的收藏查看</p>",
onOk: () => {
APIMember.collectGoods('GOODS', id).then((res) => {
APIMember.collectGoods("GOODS", id).then((res) => {
if (res.success) {
this.$Message.success('收藏商品成功');
this.$Message.success("收藏商品成功");
this.getCartList();
}
});
},
onCancel: () => {}
onCancel: () => {},
});
},
// 删除商品
delGoods (id) {
delGoods(id) {
const idArr = [];
if (!id) {
const list = this.cartList;
list.forEach((shop) => {
shop.skuList.forEach((goods) => {
idArr.push(goods.goodsSku.id);
if (goods.checked) {
idArr.push(goods.goodsSku.id);
}
});
});
} else {
idArr.push(id);
}
this.$Modal.confirm({
title: '删除',
content: '<p>确定要删除该商品吗?</p>',
title: "删除",
content: "<p>确定要删除该商品吗?</p>",
onOk: () => {
APICart.delCartGoods({ skuIds: idArr.toString() }).then((res) => {
if (res.success) {
this.$Message.success('删除成功');
this.$Message.success("删除成功");
this.getCartList();
} else {
this.$Message.error(res.message);
}
});
}
},
});
},
// 清空购物车
clearCart () {
clearCart() {
this.$Modal.confirm({
title: '提示',
content: '<p>确定要清空购物车吗?清空后不可恢复</p>',
title: "提示",
content: "<p>确定要清空购物车吗?清空后不可恢复</p>",
onOk: () => {
APICart.clearCart().then((res) => {
if (res.success) {
this.$Message.success('清空购物车成功');
this.$Message.success("清空购物车成功");
this.getCartList();
} else {
this.$Message.error(res.message);
}
});
}
},
});
},
// 跳转支付页面
pay () {
pay() {
if (this.checkedNum) {
this.$router.push({ path: '/pay', query: { way: 'CART' } });
this.$router.push({ path: "/pay", query: { way: "CART" } });
} else {
this.$Message.warning('请至少选择一件商品');
this.$Message.warning("请至少选择一件商品");
}
},
// 展示优惠券
showCoupon (storeId, index) {
showCoupon(storeId, index) {
this.couponAvailable = index;
},
// 设置购买数量
changeNum (val, id) {
console.log(val, id);
APICart.setCartGoodsNum({ skuId: id, num: val }).then((res) => {
console.log(res);
if (res.success) {
this.getCartList();
}
});
changeNum(val, id) {
if (val) {
APICart.setCartGoodsNum({ skuId: id, num: val }).then((res) => {
if (res.success) {
this.getCartList();
}
});
}
},
// 设置商品选中状态
async changeChecked (status, type, id) {
async changeChecked(status, type, id) {
const check = status ? 1 : 0;
if (type === 'all') {
if (type === "all") {
// 全选
await APICart.setCheckedAll({ checked: check });
} else if (type === 'shop') {
} else if (type === "shop") {
// 选中店铺所有商品
await APICart.setCheckedSeller({ checked: check, storeId: id });
} else {
@@ -287,17 +397,17 @@ export default {
this.getCartList();
},
// 领取优惠券
async receiveShopCoupon (item) {
async receiveShopCoupon(item) {
let res = await APIMember.receiveCoupon(item.id);
if (res.success) {
this.$set(item, 'disabled', true);
this.$Message.success('领取成功');
this.$set(item, "disabled", true);
this.$Message.success("领取成功");
} else {
this.$Message.error(res.message);
}
},
// 购物车列表
async getCartList () {
async getCartList() {
this.loading = true;
try {
let res = await APICart.cartGoodsAll();
@@ -326,19 +436,22 @@ export default {
} catch (error) {
this.loading = false;
}
}
},
},
mounted () {
mounted() {
this.getCartList();
APICart.cartCount().then((res) => {
// 购物车商品数量
if (res.success) this.goodsTotal = res.result;
});
}
},
};
</script>
<style scoped lang="scss">
.footer{
margin-top: 10px;
}
/** logo 搜索 start **/
.logo {
height: 40px;
@@ -657,12 +770,12 @@ export default {
color: #999;
}
}
.cart-goods-footer > div{
.cart-goods-footer > div {
display: flex;
align-items: center;
overflow: hidden;
}
.total-price{
.total-price {
display: flex;
align-items: center;
}
@@ -671,4 +784,5 @@ export default {
.ivu-input-number-input {
text-align: center;
}
</style>

View File

@@ -5,25 +5,44 @@
<div>
<div class="coupon-title">
<router-link to="/">
<img src="../assets/images/logo.png" width="120" alt="">
<img src="../assets/images/logo.png" width="120" alt="" />
</router-link>
<p>领券中心</p>
<Input search style="width:400px" @on-search='search' enter-button="搜索" placeholder="搜索优惠券" />
<Input
search
style="width: 400px"
@on-search="search"
enter-button="搜索"
placeholder="搜索优惠券"
/>
</div>
<div class="fontsize_18 recommend">推荐好券</div>
<empty v-if="list.length===0" />
<empty v-if="list.length === 0" />
<ul class="coupon-list" v-else>
<li v-for="(item, index) in list" class="coupon-item" :key="index">
<div class="c-left">
<div>
<span v-if="item.couponType === 'PRICE'" class="fontsize_12 global_color">¥<span class="price">{{item.price | unitPrice}}</span></span>
<span v-if="item.couponType === 'DISCOUNT'" class="fontsize_12 global_color"><span class="price">{{item.couponDiscount}}</span></span>
<span class="describe">{{item.consumeThreshold}}元可用</span>
<span
v-if="item.couponType === 'PRICE'"
class="fontsize_12 global_color"
><span class="price">{{
item.price | unitPrice
}}</span></span
>
<span
v-if="item.couponType === 'DISCOUNT'"
class="fontsize_12 global_color"
><span class="price">{{ item.couponDiscount }}</span
></span
>
<span class="describe"
>{{ item.consumeThreshold }}元可用</span
>
</div>
<p>使用范围{{useScope(item.scopeType, item.storeName)}}</p>
<p>有效期{{item.endTime}}</p>
<p>使用范围{{ useScope(item.scopeType, item.storeName) }}</p>
<p>有效期{{ item.endTime }}</p>
</div>
<b></b>
<a class="c-right" @click="receive(item)">立即领取</a>
@@ -31,12 +50,15 @@
<i class="circle-bottom"></i>
</li>
</ul>
<Page :total="total" @on-change="changePageNum"
<Page
:total="total"
@on-change="changePageNum"
class="pageration"
@on-page-size-change="changePageSize"
:page-size="params.pageSize"
show-total
show-sizer>
show-sizer
>
</Page>
</div>
</div>
@@ -44,133 +66,136 @@
</div>
</template>
<script>
import {couponList, receiveCoupon} from '@/api/member.js'
import { couponList, receiveCoupon } from "@/api/member.js";
export default {
data () {
data() {
return {
list: [], // 优惠券列表
total: 0, // 优惠券总数
params: { // 请求参数
params: {
// 请求参数
getType: "FREE",
pageNumber: 1,
pageSize: 20
}
}
pageSize: 20,
},
};
},
methods: {
// 搜索优惠券
search (item) {
this.params.couponName = item
this.params.pageNumber = 1
this.getList()
search(item) {
this.params.couponName = item;
this.params.pageNumber = 1;
this.getList();
},
// 获取优惠券列表
getList () {
this.$Spin.show()
couponList(this.params).then(res => {
this.$Spin.hide()
this.loading = false
if (res.success) {
this.list = res.result.records
this.total = res.result.total
}
}).catch(() => { this.$Spin.hide() })
getList() {
this.$Spin.show();
couponList(this.params)
.then((res) => {
this.$Spin.hide();
this.loading = false;
if (res.success) {
this.list = res.result.records;
this.total = res.result.total;
}
})
.catch(() => {
this.$Spin.hide();
});
},
// 分页 改变页码
changePageNum (val) {
changePageNum(val) {
this.params.pageNumber = val;
this.getList()
this.getList();
},
// 分页 改变每页数
changePageSize (val) {
changePageSize(val) {
this.params.pageNumber = 1;
this.params.pageSize = val;
this.getList()
this.getList();
},
// 领取优惠券
receive (item) {
receiveCoupon(item.id).then(res => {
receive(item) {
receiveCoupon(item.id).then((res) => {
if (res.success) {
console.log(item);
this.$Modal.confirm({
title: '领取优惠券',
content: '<p>优惠券领取成功,可到我的优惠券页面查看</p>',
okText: '我的优惠券',
cancelText: '立即使用',
title: "领取优惠券",
content: "<p>优惠券领取成功,可到我的优惠券页面查看</p>",
okText: "我的优惠券",
cancelText: "立即使用",
closable: true,
onOk: () => {
this.$router.push('/home/Coupons')
this.$router.push("/home/Coupons");
},
onCancel: () => {
if (item.storeId !== 'platform') {
this.$router.push({path: '/merchant', query: {id: item.storeId}})
} else {
if (item.scopeType === 'PORTION_GOODS_CATEGORY') {
this.$router.push({path: '/goodsList', query: {categoryId: item.scopeId}})
} else {
this.$router.push({path: '/goodsList'})
}
}
}
this.$router.push({
path: "/goodsList",
query: { promotionsId: item.id, promotionType: "COUPON" },
});
},
});
}
})
});
},
// 优惠券可用范围
useScope (type, storeName) {
let shop = '平台';
let goods = '全部商品'
if (storeName !== 'platform') shop = storeName
useScope(type, storeName) {
let shop = "平台";
let goods = "全部商品";
if (storeName !== "platform") shop = storeName;
switch (type) {
case 'ALL':
goods = '全部商品'
case "ALL":
goods = "全部商品";
break;
case 'PORTION_GOODS':
goods = '部分商品'
case "PORTION_GOODS":
goods = "部分商品";
break;
case 'PORTION_GOODS_CATEGORY':
goods = '部分分类商品'
case "PORTION_GOODS_CATEGORY":
goods = "部分分类商品";
break;
}
return `${shop}${goods}可用`
}
return `${shop}${goods}可用`;
},
},
mounted () {
this.getList()
}
}
mounted() {
this.getList();
},
};
</script>
<style lang="scss" scoped>
@import '../assets/styles/coupon.scss';
.content{
width: 100%;
background-color: #fff;
@import "../assets/styles/coupon.scss";
.content {
width: 100%;
background-color: #fff;
> div {
margin: 10px auto;
width: 1200px;
}
> div {
margin: 10px auto;
width: 1200px;
}
.coupon-title {
display: flex;
align-items: center;
}
.coupon-title {
display: flex;
align-items: center;
p{
font-size: 18px;
margin-right: 500px;
}
border-bottom: 2px solid $theme_color;
p {
font-size: 18px;
margin-right: 500px;
}
.recommend {
margin: 20px auto;
font-weight: bold;
width: 200px;
text-align: center;
}
.coupon-item {
b{
background: url('../assets/images/small-circle.png') top left repeat-y;
}
}
.pageration {
text-align: right;
padding-bottom: 10px;
border-bottom: 2px solid $theme_color;
}
.recommend {
margin: 20px auto;
font-weight: bold;
width: 200px;
text-align: center;
}
.coupon-item {
b {
background: url("../assets/images/small-circle.png") top left repeat-y;
}
}
.pageration {
text-align: right;
padding-bottom: 10px;
}
</style>

View File

@@ -108,7 +108,7 @@
</template>
<script>
import config from '@/config'
import * as RegExp from '@/plugins/RegExp.js';
import { md5 } from '@/plugins/md5.js';
import * as apiLogin from '@/api/login.js';
@@ -119,7 +119,7 @@ export default {
components: { Verify },
data () {
return {
config,
config:require('@/config'),
loading: false, // 加载状态
loading1: false, // 第二步加载状态
formFirst: { // 手机验证码表单

View File

@@ -1,9 +1,7 @@
<template>
<div style="background:#fff;">
<div style="background: #fff">
<BaseHeader></BaseHeader>
<Search></Search>
<drawer></drawer>
<ShopHeader :detail="storeMsg"></ShopHeader>
<div class="shop-item-path">
<div class="shop-nav-container">
<Breadcrumb>
@@ -12,39 +10,54 @@
{{ item.name }}
</BreadcrumbItem>
</Breadcrumb>
<div class="store-collect">
<span class="mr_10" v-if="goodsMsg.data"><router-link
:to="'Merchant?id=' + goodsMsg.data.storeId">{{ goodsMsg.data.storeName }}</router-link></span>
<span @click="collect"><Icon type="ios-heart"
:color="storeCollected ? '#ed3f14' : '#666'"/>
{{storeCollected ? '已收藏店铺' : '收藏店铺'}}
</span>
<span @click="connectCs(storeMsg.yzfSign)" class="ml_10"><Icon
custom="icomoon icon-customer-service"/>联系客服</span>
<div class="store-collect" v-if="!takeDownSale">
<span class="mr_10" v-if="goodsMsg.data">
<router-link :to="'Merchant?id=' + goodsMsg.data.storeId">{{
goodsMsg.data.storeName
}}</router-link>
</span>
<span @click="collect">
<Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#666'" />
{{ storeCollected? "已收藏店铺": "收藏店铺" }}
</span>
<span class="ml_10" @click="IMService(goodsMsg.data.storeId,goodsMsg.data.goodsId,goodsMsg.data.id)">联系客服</span>
</div>
</div>
</div>
<!-- 商品信息展示 -->
<ShowGoods v-if="goodsMsg.data" :detail="goodsMsg"></ShowGoods>
<ShowGoods @handleClickSku="targetClickSku" v-if="goodsMsg.data" :detail="goodsMsg"></ShowGoods>
<!-- 商品详细展示 -->
<ShowGoodsDetail v-if="goodsMsg.data" :detail="goodsMsg"></ShowGoodsDetail>
<empty _Title='当前商品已下架' v-if="takeDownSale">
<div class="sale-btn">
<Button size="small" class="mr_10" @click="target('/')">返回首页</Button>
<Button size="small" @click="target('goodsList')">返回商品列表</Button>
</div>
</empty>
<Spin size="large" fix v-if="isLoading"></Spin>
<BaseFooter></BaseFooter>
</div>
</template>
<script>
import Search from '@/components/Search';
import ShopHeader from '@/components/header/ShopHeader';
import ShowGoods from '@/components/goodsDetail/ShowGoods';
import ShowGoodsDetail from '@/components/goodsDetail/ShowGoodsDetail';
import {goodsSkuDetail} from '@/api/goods';
import {cancelCollect, collectGoods, isCollection, getGoodsDistribution} from '@/api/member';
import {getDetailById} from '@/api/shopentry'
import Search from "@/components/Search";
import ShowGoods from "@/components/goodsDetail/ShowGoods";
import empty from "@/components/empty/Main";
import ShowGoodsDetail from "@/components/goodsDetail/ShowGoodsDetail";
import { goodsSkuDetail } from "@/api/goods";
import {
cancelStoreCollect,
collectStore,
isStoreCollection,
getGoodsDistribution,
} from "@/api/member";
import { getDetailById } from "@/api/shopentry";
import imTalk from '@/components/mixes/talkIm'
export default {
name: 'GoodsDetail',
name: "GoodsDetail",
beforeRouteEnter (to, from, next) {
window.scrollTo(0, 0);
next();
@@ -52,111 +65,138 @@ export default {
created () {
this.getGoodsDetail();
},
mixins: [imTalk],
data () {
return {
goodsMsg: {}, // 商品信息
isLoading: false, // 加载状态
categoryBar: [], // 分类
storeCollected: false, // 商品收藏
storeMsg: {} // 店铺信息
storeMsg: {}, // 店铺信息
takeDownSale:false, // 是否下架
};
},
methods: {
// 跳转首页或商品页面
target(url){
this.$router.push({path: url})
},
// 点击规格
targetClickSku (val) {
this.getGoodsDetail(val);
},
// 获取商品详情
getGoodsDetail () {
getGoodsDetail (val) {
this.isLoading = true;
const params = this.$route.query;
const params = val || this.$route.query;
// 分销员id
let distributionId = (params && params.distributionId) ? params.distributionId : this.Cookies.getItem('distributionId');
let distributionId =
params && params.distributionId
? params.distributionId
: this.Cookies.getItem("distributionId");
// 如果有分销信息
if (distributionId) {
console.log(distributionId)
console.log(distributionId);
// 先存储
this.Cookies.setItem('distributionId', params.distributionId)
this.Cookies.setItem("distributionId", params.distributionId);
let _this = this;
// 绑定关系
getGoodsDistribution(params.distributionId).then(res => {
getGoodsDistribution(params.distributionId).then((res) => {
// 绑定成功,则清除关系
if (res.success) {
_this.Cookies.removeItem('distributionId');
_this.Cookies.removeItem("distributionId");
}
})
});
}
goodsSkuDetail(params).then((res) => {
this.isLoading = false;
if (res.success) {
const result = res.result;
const cateName = res.result.categoryName;
const cateId = result.data.categoryPath.split(',');
const cateArr = [];
cateId.forEach((e, index) => { // 插入分类id和name
cateArr.push({
id: e,
name: cateName[index]
goodsSkuDetail(params)
.then((res) => {
this.isLoading = false;
if (res.success) {
const result = res.result;
const cateName = res.result.categoryName;
const cateId = result.data.categoryPath.split(",");
const cateArr = [];
cateId.forEach((e, index) => {
// 插入分类id和name
cateArr.push({
id: e,
name: cateName ? cateName[index] : "",
});
});
});
this.categoryBar = cateArr;
this.goodsMsg = res.result;
// 判断是否收藏
if (this.Cookies.getItem('userInfo')) {
isCollection('STORE', this.goodsMsg.data.storeId).then(res => {
if (res.success && res.result) {
this.storeCollected = true;
}
})
}
// 获取店铺信息
getDetailById(this.goodsMsg.data.storeId).then(res => {
if (res.success) {
this.storeMsg = res.result
this.categoryBar = cateArr;
this.$set(this, "goodsMsg", res.result);
if (!this.goodsMsg.data.intro) {
this.goodsMsg.data.intro = ''
}
})
} else {
this.$Message.error(res.message)
this.$router.push('/')
}
}).catch(() => {
this.$router.push('/')
});
// 判断是否收藏
if (this.Cookies.getItem("userInfo")) {
isStoreCollection("STORE", this.goodsMsg.data.storeId).then((res) => {
if (res.success && res.result) {
this.storeCollected = true;
}
});
}
if (!this.storeMsg) {
// 获取店铺信息
getDetailById(this.goodsMsg.data.storeId).then((res) => {
if (res.success) {
this.storeMsg = res.result;
}
});
}
} else {
this.$Message.error(res.message);
this.isLoading = false
}
})
.catch((e) => {
this.isLoading = false
if(e.code === 11001){
this.takeDownSale = true
}
});
},
goGoodsList (currIndex) { // 跳转商品列表
const arr = []
goGoodsList (currIndex) {
// 跳转商品列表
const arr = [];
this.categoryBar.forEach((e, index) => {
if (index <= currIndex) {
arr.push(e.id)
arr.push(e.id);
}
})
return location.origin + '/goodsList?categoryId=' + arr.toString()
});
return location.origin + "/goodsList?categoryId=" + arr.toString();
},
async collect () { // 收藏店铺
async collect () {
// 收藏店铺
if (this.storeCollected) {
let cancel = await cancelCollect('STORE', this.goodsMsg.data.storeId)
let cancel = await cancelStoreCollect("STORE", this.goodsMsg.data.storeId);
if (cancel.success) {
this.$Message.success('已取消收藏')
this.$Message.success("已取消收藏");
this.storeCollected = false;
}
} else {
let collect = await collectGoods('STORE', this.goodsMsg.data.storeId);
let collect = await collectStore("STORE", this.goodsMsg.data.storeId);
if (collect.code === 200) {
this.storeCollected = true;
this.$Message.success('收藏店铺成功,可以前往个人中心我的收藏查看');
this.$Message.success("收藏店铺成功,可以前往个人中心我的收藏查看");
}
}
}
},
},
watch: {
'$route.query.skuId': function (val) {
location.reload();
}
},
computed: {},
watch: {},
components: {
Search,
ShopHeader,
ShowGoods,
ShowGoodsDetail
}
ShowGoodsDetail,
empty
},
};
</script>
<style scoped lang="scss">
@@ -186,4 +226,8 @@ export default {
}
}
}
.sale-btn{
margin:10px 0
}
</style>

View File

@@ -1,9 +1,8 @@
<template>
<div>
<div class="wrapper">
<BaseHeader></BaseHeader>
<Search @search="handleSearch"></Search>
<drawer></drawer>
<cateNav></cateNav>
<div class="container">
<!-- 商品筛选栏 -->
<GoodsClassNav @getParams="getParams"></GoodsClassNav>
@@ -49,27 +48,60 @@
class="goods-show-info"
v-for="(item, index) in goodsList"
:key="index"
@click="goGoodsDetail(item.id, item.content.goodsId)"
@click="goGoodsDetail(item.id, item.goodsId)"
>
<div class="goods-show-img">
<img width="220" height="220" :src="item.content.thumbnail" />
<img width="220" height="220" :src="item.thumbnail" />
</div>
<div class="goods-show-price">
<span>
<span class="seckill-price text-danger">{{
item.content.price | unitPrice("¥")
item.price | unitPrice("¥")
}}</span>
</span>
</div>
<div class="goods-show-detail">
<span>{{ item.content.goodsName }}</span>
<Tag
v-if="item.salesModel === 'WHOLESALE'"
class="goods-show-tag"
color="purple"
>
批发
</Tag>
<span>{{ item.goodsName }}</span>
</div>
<div class="goods-show-num">
已有<span>{{ item.content.commentNum || 0 }}</span
已有<span>{{ item.commentNum || 0 }}</span
>人评价
</div>
<div class="goods-show-seller">
<Tag v-if="item.content.selfOperated" style="padding:0 4px;" size="default" color="error">自营</Tag><span>{{ item.content.storeName }}</span>
<span class="text-bottom" style="color: #e4393c">{{
item.storeName
}}</span>
</div>
<div class="goods-show-right">
<Tag
class="goods-show-tag"
color="red"
v-if="item.selfOperated"
>
自营
</Tag>
<Tag
class="goods-show-tag"
color="blue"
v-if="item.goodsType === 'VIRTUAL_GOODS'"
>
虚拟
</Tag>
<Tag
class="goods-show-tag"
color="blue"
v-else-if="item.goodsType === 'PHYSICAL_GOODS'"
>
实物
</Tag>
</div>
</div>
</div>
@@ -92,175 +124,192 @@
</template>
<script>
import GoodsClassNav from '@/components/nav/GoodsClassNav';
import * as apiGoods from '@/api/goods';
import GoodsClassNav from "@/components/nav/GoodsClassNav";
import * as apiGoods from "@/api/goods";
export default {
name: 'GoodsList',
beforeRouteEnter (to, from, next) {
name: "GoodsList",
beforeRouteEnter(to, from, next) {
window.scrollTo(0, 0);
next();
},
data () {
data() {
return {
sortIndex: 0, // 排序状态
sortPriceIndex: false, // 判断价格升序还是降序
goodsTool: [ // 排序类型
{ title: '综合', en: '' },
{ title: '销量', en: 'buyCount' },
{ title: '评论数', en: 'commentNum' },
{ title: '新品', en: 'releaseTime' }
goodsTool: [
// 排序类型
{ title: "综合", en: "" },
{ title: "销量", en: "buyCount" },
{ title: "评论数", en: "commentNum" },
{ title: "新品", en: "releaseTime" },
],
goodsList: [], // 商品列表
loading: false, // 加载状态
total: 0, // 列表总数
params: { // 请求参数
params: {
// 请求参数
pageNumber: 0,
pageSize: 20,
categoryId: ''
}
categoryId: "",
},
};
},
watch: {
$route () {
const keyword = this.$route.query.keyword
this.handleSearch(keyword)
}
},
methods: {
// 搜索
handleSearch (key) {
this.params.keyword = key
this.params.pageNumber = 0
this.getGoodsList()
},
orderBy (data, index) {
// 排序
this.sortIndex = index;
this.params.sort = data;
this.params.order = 'desc';
if (data === 'price') {
if (!this.sortPriceIndex) {
this.sortPriceIndex = 'asc';
} else {
this.sortPriceIndex === 'desc' ? (this.sortPriceIndex = 'asc') : (this.sortPriceIndex = 'desc');
}
this.params.order = this.sortPriceIndex
} else {
this.sortPriceIndex = false
$route() {
const keyword = this.$route.query.keyword;
if (keyword) {
this.handleSearch(keyword);
}
if (this.$route.query.categoryId) {
let cateId = this.$route.query.categoryId.split(",");
Object.assign(this.params, this.$route.query);
this.params.categoryId = cateId[cateId.length - 1];
}
if (this.$route.query.promotionType) {
this.params.promotionType = this.$route.query.promotionType;
}
if (this.$route.query.promotionsId) {
this.params.promotionsId = this.$route.query.promotionsId;
}
this.getGoodsList();
},
goGoodsDetail (skuId, goodsId) {
},
methods: {
// 搜索
handleSearch(key) {
this.params.keyword = key;
this.$route.query.keyword = key
this.params.pageNumber = 0;
this.getGoodsList();
},
orderBy(data, index) {
// 排序
this.sortIndex = index;
this.params.sort = data;
this.params.order = "desc";
if (data === "price") {
if (!this.sortPriceIndex) {
this.sortPriceIndex = "asc";
} else {
this.sortPriceIndex === "desc"
? (this.sortPriceIndex = "asc")
: (this.sortPriceIndex = "desc");
}
this.params.order = this.sortPriceIndex;
} else {
this.sortPriceIndex = false;
}
this.getGoodsList();
},
goGoodsDetail(skuId, goodsId) {
// 跳转商品详情
let routeUrl = this.$router.resolve({
path: '/goodsDetail',
query: { skuId, goodsId }
path: "/goodsDetail",
query: { skuId, goodsId },
});
window.open(routeUrl.href, '_blank');
window.open(routeUrl.href, "_blank");
},
// 分页 修改页码
changePageNum (val) {
changePageNum(val) {
this.params.pageNumber = val;
this.getGoodsList();
},
// 分页 修改页数
changePageSize (val) {
changePageSize(val) {
this.params.pageNumber = 1;
this.params.pageSize = val;
this.getGoodsList();
},
// 获取商品列表
getGoodsList () {
getGoodsList() {
this.loading = true;
apiGoods.goodsList(this.params)
apiGoods
.goodsList(this.params)
.then((res) => {
this.loading = false;
if (res.success) {
this.goodsList = res.result.content;
this.total = res.result.totalElements;
this.goodsList = res.result.records;
this.total = res.result.total;
}
}).catch(() => {
})
.catch(() => {
this.loading = false;
});
},
getParams (val) {
getParams(val) {
// 筛选条件回显
Object.assign(this.params, val)
this.getGoodsList()
}
Object.assign(this.params, val);
this.getGoodsList();
},
},
created () {
created() {
if (this.$route.query.categoryId) {
let cateId = this.$route.query.categoryId.split(',')
Object.assign(this.params, this.$route.query)
this.params.categoryId = cateId[cateId.length - 1]
let cateId = this.$route.query.categoryId.split(",");
Object.assign(this.params, this.$route.query);
this.params.categoryId = cateId[cateId.length - 1];
} else {
Object.assign(this.params, this.$route.query)
Object.assign(this.params, this.$route.query);
}
this.getGoodsList()
this.getGoodsList();
},
components: {
GoodsClassNav
}
GoodsClassNav,
},
};
</script>
<style scoped lang="scss">
@import '../assets/styles/goodsList.scss';
@import "../assets/styles/goodsList.scss";
.cate-nav{
margin-top: 10px;
}
.goods-show-info > .goods-show-seller > .goods-show-buyer {
width: 35px;
height: 17px;
white-space: nowrap;
line-height: 17px;
text-align: center;
align-content: center;
padding: 0 3px;
background-color: #e23a3a;
}
.goods-show-tag {
height: 18px;
width: 32px;
line-height: 14px;
white-space: nowrap;
text-align: center;
align-items: center;
padding: 0 3px;
}
.goods-show-seller {
// padding:3px 0;
vertical-align: middle;
}
.container {
margin: 15px auto;
width: 1200px;
margin:25px auto 15px auto;
width: 1184px;
min-width: 1000px;
position: relative;
}
.price-sort:hover {
color: #e23a3a;
}
.goods-box {
display: flex;
}
/* ---------------侧边广告栏开始------------------- */
.as-box {
width: 200px;
border: 1px solid #ccc;
}
.item-as-title {
width: 100%;
height: 36px;
color: $theme_color;
line-height: 36px;
font-size: 18px;
}
.item-as-title span:first-child {
margin-left: 20px;
}
.item-as-title span:last-child {
float: right;
margin-right: 15px;
font-size: 10px;
color: #ccc;
}
.item-as {
width: 160px;
margin: 18px auto;
}
.item-as-img {
width: 160px;
height: 160px;
margin: 0px auto;
}
.item-as-price span {
font-size: 18px;
}
.item-as-intro {
.goods-show-right {
display: flex;
flex-direction: row;
margin-top: 5px;
font-size: 12px;
}
.item-as-selled {
margin-top: 5px;
font-size: 12px;
}
.item-as-selled span {
color: #005aa0;
}
/* ---------------侧边广告栏结束------------------- */
/* ---------------商品栏开始------------------- */
.goods-list-box {
@@ -284,6 +333,7 @@ export default {
display: block;
clear: left;
}
.price-sort {
span {
display: inline-block;

View File

@@ -1,6 +1,28 @@
<template>
<div class="container">
<drawer></drawer>
<Modal v-model="showCpmodel" width="350">
<template #header>
<p style="color:black;text-align:left">
<!-- <Icon type="ios-information-circle"></Icon> -->
<span>活动优惠券</span>
</p>
</template>
<template>
<Scroll :on-reach-bottom="handleReachBottom">
<Card dis-hover v-for="(item, index) in autoCoupList" :key="index" style="margin: 10px 15px">
<span v-if="item.couponType === 'PRICE'" class="fontsize_12 global_color" style="font-size: 15px;">¥<span class="price">{{item.price | unitPrice}}</span></span>
<span v-if="item.couponType === 'DISCOUNT'" class="fontsize_12 global_color" style="font-size: 15px;"><span class="price">{{item.discount}}</span></span>
<span class="describe" style="font-size: 15px;margin-left: 5px;">{{item.consumeThreshold}}元可用</span>
<p style="font-size: 10px;">使用范围{{useScope(item.scopeType, item.storeName)}}</p>
<p style="font-size: 10px;">有效期{{item.endTime}}</p>
</Card>
</Scroll>
</template>
<template #footer>
<Button type="error" @click="showCpmodel=false">确定</Button>
</template>
</Modal>
<!-- 固定头部 -->
<hover-search class="hover-search" :class="{show: topSearchShow}"></hover-search>
<!-- 顶部广告 -->
@@ -15,6 +37,8 @@
<model-form ref="modelForm" :data="modelForm"></model-form>
<!-- 底部栏 -->
<BaseFooter></BaseFooter>
<!-- 侧边栏 -->
<fixedBar class="fixed-bar" :class="{'show-fixed': topSearchShow}"></fixedBar>
</div>
</template>
@@ -22,8 +46,9 @@
import Search from '@/components/Search';
import ModelForm from '@/components/indexDecorate/ModelForm';
import HoverSearch from '@/components/header/hoverSearch';
import storage from '@/plugins/storage';
import { indexData } from '@/api/index.js';
import fixedBar from '@/components/fixed/index';
import storage from "@/plugins/storage";
import { indexData,getAutoCoup } from '@/api/index.js';
import {seckillByDay} from '@/api/promotion'
export default {
name: 'Index',
@@ -38,9 +63,14 @@ export default {
that.topSearchShow = false;
}
};
if(storage.getItem('userInfo')){
this.getAutoCoup()
}
},
data () {
return {
autoCoupList:[],
showCpmodel:false,
modelForm: { list: [] }, // 楼层装修数据
topAdvert: {}, // 顶部广告
showNav: false, // 是否展示分类栏
@@ -49,33 +79,114 @@ export default {
carouselOpacity: false // 不同轮播分类样式
};
},
props:{
pageData:{
type:null,
default:""
}
},
// created(){
// },
methods: {
getIndexData () {
// 获取首页装修数据
indexData({ clientType: 'PC' }).then((res) => {
if (res.success) {
let dataJson = JSON.parse(res.result.pageData);
// 秒杀活动不是装修的数据,需要调用接口判断是否有秒杀商品
// 轮播图根据不同轮播,样式不同
for (let i = 0; i < dataJson.list.length; i++) {
let type = dataJson.list[i].type
if (type === 'carousel2') {
this.carouselLarge = true;
} else if (type === 'carousel1') {
this.carouselLarge = true
this.carouselOpacity = true
} else if (type === 'seckill') {
let seckill = this.getListByDay()
dataJson.list[i].options.list = seckill
}
}
this.modelForm = dataJson;
storage.setItem('navList', dataJson.list[1])
this.showNav = true
this.topAdvert = dataJson.list[0];
}
});
// 优惠券可用范围
useScope (type, storeName) {
let shop = '平台';
let goods = '全部商品'
if (storeName !== 'platform') shop = storeName
switch (type) {
case 'ALL':
goods = '全部商品'
break;
case 'PORTION_GOODS':
goods = '部分商品'
break;
case 'PORTION_GOODS_CATEGORY':
goods = '部分分类商品'
break;
}
return `${shop}${goods}可用`
},
getAutoCoup(){
let data = new Date()
let datas = data.getDate()
let hours = data.getHours()
let flagCoup = storage.getItem('getTimes') //缓存
if(flagCoup && flagCoup != undefined && flagCoup != null){ //判断当前是否有缓存
if(Number(datas) > Number(flagCoup)){ //判断缓存是否小于当前天数
if(Number(hours) >= 6){//超过或等于6时清楚缓存
storage.setItem('getTimes',datas)//存储缓存
this.getcps()
}
}
}else{
// window.localStorage.setItem('getTimes',datas)//存储缓存
this.getcps()
}
},
getcps(){
console.log(123123)
let data = new Date()
let datas = data.getDate()
getAutoCoup().then(res=>{ //调用自动发券
if(res.success){
this.autoCoupList.push(...res.result);
let objs = {};
this.autoCoupList = this.autoCoupList.reduce((cur, next) => {
//对象去重
if (next.id != undefined) {
objs[next.id]
? ""
: (objs[next.id] = true && cur.push(next));
}
return cur;
}, []);
if(this.autoCoupList != '' && this.autoCoupList.length > 0){
this.showCpmodel = true;
}
storage.setItem('getTimes',datas)//存储缓存
}
})
},
handleReachBottom(){
} ,
getIndexData () {
if(this.pageData){
this.parsePageData(JSON.stringify(this.pageData))
}
else{
// 获取首页装修数据
indexData({ clientType: 'PC' }).then(async (res) => {
if (res.success && res.result) {
this.parsePageData(res.result.pageData)
}
});
}
},
async parsePageData(pageData){
let dataJson = JSON.parse(pageData);
// 秒杀活动不是装修的数据,需要调用接口判断是否有秒杀商品
// 轮播图根据不同轮播,样式不同
for (let i = 0; i < dataJson.list.length; i++) {
let type = dataJson.list[i].type
if (type === 'carousel2') {
this.carouselLarge = true;
} else if (type === 'carousel1') {
this.carouselLarge = true
this.carouselOpacity = true
} else if (type === 'seckill') {
let seckill = await this.getListByDay()
dataJson.list[i].options.list = seckill
}
}
this.modelForm = dataJson;
storage.setItem('navList', dataJson.list[1])
this.showNav = true
this.topAdvert = dataJson.list[0];
},
async getListByDay () { // 当天秒杀活动
const res = await seckillByDay()
if (res.success && res.result.length) {
@@ -88,12 +199,14 @@ export default {
components: {
Search,
ModelForm,
HoverSearch
HoverSearch,
fixedBar
}
};
</script>
<style scoped lang="scss">
@import '../assets/styles/coupon.scss';
.container {
@include sub_background_color($light_background_color);
}
@@ -106,7 +219,7 @@ export default {
background-color: #fff;
position: fixed;
top: 0;
z-index: 3000;
z-index: 9999;
box-shadow:0 0 10px 2px rgb(90 90 90 / 60%);
transition: 0.35s;
}
@@ -119,4 +232,55 @@ export default {
transform: translateZ(0);
top: 0;
}
.fixed-bar{
opacity: 0 !important;
transform: translateY(-10px);
transition: .35s;
z-index: 999999;
height: 0px !important;
overflow: hidden;
}
.show-fixed{
height: 354px !important;
opacity: 1 !important;
transform: translateY(0);
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
}
/* 2K */
@media screen and (min-width: 2561px) and (max-width: 3840px) {
/* 样式 */
.fixed-bar{
position: fixed;
right:900px;
top: 500px;
}
}
/* 1080p */
@media screen and (max-width: 2560px) {
/* 样式 */
.fixed-bar{
position: fixed;
right:300px;
top: 500px;
}
}
@media screen and (max-width: 2025px) {
/* 样式 */
.fixed-bar{
position: fixed;
right:150px;
top: 300px;
}
}
</style>

View File

@@ -13,7 +13,7 @@
<Carousel loop :autoplay-speed="5000" class="login-carousel" arrow="never">
<CarouselItem>
<div class="demo-carousel" @click='$refs.verify.show = false'>
<img src="https://wanmi-b2b.oss-cn-shanghai.aliyuncs.com/201811141632252680" />
<img src="https://lili-system.oss-cn-beijing.aliyuncs.com/background.jpg" />
</div>
</CarouselItem>
</Carousel>
@@ -21,69 +21,119 @@
<div class="form-box" @click='$refs.verify.show = false'>
<div class="account-number">
<div class="tab-switch">
<span>{{type?'账号登录':'验证码登录'}}</span>
<span @click="type = !type">{{type?'验证码登录':'账号登录'}}</span>
<span>{{ type ? '账号登录' : '验证码登录' }}</span>
<span @click="type = !type,scannerCodeLoginFLag=false">{{ type ? '验证码登录' : '账号登录' }}</span>
</div>
<div @click="$router.push('signUp')">立即注册</div>
<!---->
<div @click="scannerCodeLoginFLag=!scannerCodeLoginFLag">{{!scannerCodeLoginFLag ? '扫码登录' : '返回'}}</div>
</div>
<!-- 账号密码登录 -->
<Form ref="formInline" :model="formData" :rules="ruleInline" v-show="type === true"
@click.self='$refs.verify.show = false'>
<FormItem prop="username">
<i-input type="text" v-model="formData.username" clearable placeholder="用户名">
<Icon type="md-person" slot="prepend"></Icon>
</i-input>
</FormItem>
<FormItem prop="password">
<i-input type="password" v-model="formData.password" clearable placeholder="密码">
<Icon type="md-lock" slot="prepend"> </Icon>
</i-input>
</FormItem>
<FormItem>
<Button type="error" @click.stop="handleSubmit('formInline')" long>登录</Button>
</FormItem>
</Form>
<!-- 验证码登录 -->
<Form ref="formSms" :model="formSms" :rules="ruleInline" v-show="type === false"
@click.self='$refs.verify.show = false'>
<FormItem prop="mobile">
<i-input type="text" v-model="formSms.mobile" clearable placeholder="手机号">
<Icon type="md-lock" slot="prepend"></Icon>
</i-input>
</FormItem>
<FormItem prop="code">
<i-input type="text" v-model="formSms.code" placeholder="手机验证码">
<Icon type="ios-text-outline" style="font-weight: bold" slot="prepend" />
<Button slot="append" @click="sendCode">{{ codeMsg }}</Button>
</i-input>
</FormItem>
<FormItem>
<Button @click.stop="verifyBtnClick" long
:type="verifyStatus?'success':'default'">{{verifyStatus?'验证通过':'点击完成安全验证'}}</Button>
</FormItem>
<FormItem>
<Button type="error" @click="handleSubmit('formSms')" long>登录</Button>
</FormItem>
</Form>
<div class="regist">
<span @click="$router.push('forgetPassword')">忘记密码</span>
</div>
<div class="other-login">
<svg t="1631154795933" class="icon" @click="handleWebLogin('QQ')" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="4969" width="32" height="32">
<path
d="M824.8 613.2c-16-51.4-34.4-94.6-62.7-165.3C766.5 262.2 689.3 112 511.5 112 331.7 112 256.2 265.2 261 447.9c-28.4 70.8-46.7 113.7-62.7 165.3-34 109.5-23 154.8-14.6 155.8 18 2.2 70.1-82.4 70.1-82.4 0 49 25.2 112.9 79.8 159-26.4 8.1-85.7 29.9-71.6 53.8 11.4 19.3 196.2 12.3 249.5 6.3 53.3 6 238.1 13 249.5-6.3 14.1-23.8-45.3-45.7-71.6-53.8 54.6-46.2 79.8-110.1 79.8-159 0 0 52.1 84.6 70.1 82.4 8.5-1.1 19.5-46.4-14.5-155.8z"
p-id="4970" fill="#1296db"></path>
</svg>
<svg t="1631154766336" class="icon" @click="handleWebLogin('WECHAT_PC')" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="3844" width="32" height="32">
<path
d="M683.058 364.695c11 0 22 1.016 32.943 1.976C686.564 230.064 538.896 128 370.681 128c-188.104 0.66-342.237 127.793-342.237 289.226 0 93.068 51.379 169.827 136.725 229.256L130.72 748.43l119.796-59.368c42.918 8.395 77.37 16.79 119.742 16.79 11 0 21.46-0.48 31.914-1.442a259.168 259.168 0 0 1-10.455-71.358c0.485-148.002 128.744-268.297 291.403-268.297l-0.06-0.06z m-184.113-91.992c25.99 0 42.913 16.79 42.913 42.575 0 25.188-16.923 42.579-42.913 42.579-25.45 0-51.38-16.85-51.38-42.58 0-25.784 25.93-42.574 51.38-42.574z m-239.544 85.154c-25.384 0-51.374-16.85-51.374-42.58 0-25.784 25.99-42.574 51.374-42.574 25.45 0 42.918 16.79 42.918 42.575 0 25.188-16.924 42.579-42.918 42.579z m736.155 271.655c0-135.647-136.725-246.527-290.983-246.527-162.655 0-290.918 110.88-290.918 246.527 0 136.128 128.263 246.587 290.918 246.587 33.972 0 68.423-8.395 102.818-16.85l93.809 50.973-25.93-84.677c68.907-51.93 120.286-119.815 120.286-196.033z m-385.275-42.58c-16.923 0-34.452-16.79-34.452-34.179 0-16.79 17.529-34.18 34.452-34.18 25.99 0 42.918 16.85 42.918 34.18 0 17.39-16.928 34.18-42.918 34.18z m188.165 0c-16.984 0-33.972-16.79-33.972-34.179 0-16.79 16.927-34.18 33.972-34.18 25.93 0 42.913 16.85 42.913 34.18 0 17.39-16.983 34.18-42.913 34.18z"
fill="#09BB07" p-id="3845"></path>
</svg>
<!--扫码登录-->
<div v-show="scannerCodeLoginFLag">
<div class="qr-container">
<div class='qr-shadow flex' v-show="qrCodeStatus == 'fail'">
<span>
二维码已失效
</span>
<Button size='small' @click="createPCLoginSession">刷新二维码</Button>
</div>
<vue-qr
:text="qrCode"
:margin="0"
colorDark="#000"
colorLight="#fff"
:size="150"
></vue-qr>
</div>
<div class="drag-area">
<!-- 等待扫码-->
<div v-if="scannerCodeLoginStatus === 0" class="pending-scan">
<p>打开手机App/小程序扫码登录</p>
</div>
<!-- 已经扫码-->
<div v-else-if="scannerCodeLoginStatus === 1" class="scanned">
<p>扫码成功等待确认</p>
</div>
<!-- 存在session等待发送给客户端验证-->
<div v-if="scannerCodeLoginStatus === 2" class="scanned">
<p>登录成功正在页面跳转</p>
</div>
<!-- 已经发送登录请求-->
<div v-else-if="scannerCodeLoginStatus === 3" class="quick-logining">
<p>取消登录</p>
</div>
</div>
</div>
<div>
<div v-show="!scannerCodeLoginFLag">
<!-- 账号密码登录 -->
<Form ref="formInline" :model="formData" :rules="ruleInline" v-show="type === true"
@click.self='$refs.verify.show = false'>
<FormItem prop="username">
<i-input type="text" v-model="formData.username" clearable placeholder="用户名">
<Icon type="md-person" slot="prepend"></Icon>
</i-input>
</FormItem>
<FormItem prop="password">
<i-input type="password" v-model="formData.password" clearable placeholder="密码">
<Icon type="md-lock" slot="prepend"></Icon>
</i-input>
</FormItem>
<FormItem>
<Button type="error" @click.stop="handleSubmit('formInline')" long>登录</Button>
</FormItem>
</Form>
<!-- 验证码登录 -->
<Form ref="formSms" :model="formSms" :rules="ruleInline" v-show="type === false"
@click.self='$refs.verify.show = false'>
<FormItem prop="mobile">
<i-input type="text" v-model="formSms.mobile" clearable placeholder="手机号">
<Icon type="md-lock" slot="prepend"></Icon>
</i-input>
</FormItem>
<FormItem prop="code">
<i-input type="text" v-model="formSms.code" placeholder="手机验证码">
<Icon type="ios-text-outline" style="font-weight: bold" slot="prepend"/>
<Button slot="append" @click="sendCode">{{ codeMsg }}</Button>
</i-input>
</FormItem>
<FormItem>
<Button @click.stop="verifyBtnClick" long
:type="verifyStatus?'success':'default'">{{ verifyStatus ? '验证通过' : '点击完成安全验证' }}
</Button>
</FormItem>
<FormItem>
<Button type="error" @click="handleSubmit('formSms')" long>登录</Button>
</FormItem>
</Form>
</div>
<div class="other">
<div class="other-login">
<svg t="1631154795933" class="icon" @click="handleWebLogin('QQ')" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="4969" width="32" height="32">
<path
d="M824.8 613.2c-16-51.4-34.4-94.6-62.7-165.3C766.5 262.2 689.3 112 511.5 112 331.7 112 256.2 265.2 261 447.9c-28.4 70.8-46.7 113.7-62.7 165.3-34 109.5-23 154.8-14.6 155.8 18 2.2 70.1-82.4 70.1-82.4 0 49 25.2 112.9 79.8 159-26.4 8.1-85.7 29.9-71.6 53.8 11.4 19.3 196.2 12.3 249.5 6.3 53.3 6 238.1 13 249.5-6.3 14.1-23.8-45.3-45.7-71.6-53.8 54.6-46.2 79.8-110.1 79.8-159 0 0 52.1 84.6 70.1 82.4 8.5-1.1 19.5-46.4-14.5-155.8z"
p-id="4970" fill="#1296db"></path>
</svg>
<svg t="1631154766336" class="icon" @click="handleWebLogin('WECHAT_PC')" viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="3844" width="32" height="32">
<path
d="M683.058 364.695c11 0 22 1.016 32.943 1.976C686.564 230.064 538.896 128 370.681 128c-188.104 0.66-342.237 127.793-342.237 289.226 0 93.068 51.379 169.827 136.725 229.256L130.72 748.43l119.796-59.368c42.918 8.395 77.37 16.79 119.742 16.79 11 0 21.46-0.48 31.914-1.442a259.168 259.168 0 0 1-10.455-71.358c0.485-148.002 128.744-268.297 291.403-268.297l-0.06-0.06z m-184.113-91.992c25.99 0 42.913 16.79 42.913 42.575 0 25.188-16.923 42.579-42.913 42.579-25.45 0-51.38-16.85-51.38-42.58 0-25.784 25.93-42.574 51.38-42.574z m-239.544 85.154c-25.384 0-51.374-16.85-51.374-42.58 0-25.784 25.99-42.574 51.374-42.574 25.45 0 42.918 16.79 42.918 42.575 0 25.188-16.924 42.579-42.918 42.579z m736.155 271.655c0-135.647-136.725-246.527-290.983-246.527-162.655 0-290.918 110.88-290.918 246.527 0 136.128 128.263 246.587 290.918 246.587 33.972 0 68.423-8.395 102.818-16.85l93.809 50.973-25.93-84.677c68.907-51.93 120.286-119.815 120.286-196.033z m-385.275-42.58c-16.923 0-34.452-16.79-34.452-34.179 0-16.79 17.529-34.18 34.452-34.18 25.99 0 42.918 16.85 42.918 34.18 0 17.39-16.928 34.18-42.918 34.18z m188.165 0c-16.984 0-33.972-16.79-33.972-34.179 0-16.79 16.927-34.18 33.972-34.18 25.93 0 42.913 16.85 42.913 34.18 0 17.39-16.983 34.18-42.913 34.18z"
fill="#09BB07" p-id="3845"></path>
</svg>
</div>
<div class="register">
<span style="color:red" @click="$router.push('signUp')">还没有账号点击立即注册</span>
<span @click="$router.push('forgetPassword')">忘记密码</span>
</div>
</div>
</div>
</div>
<!-- 拼图验证码 -->
<verify ref="verify" class="verify-con" verifyType="LOGIN" @change="verifyChange"></verify>
</div>
@@ -103,23 +153,32 @@
</template>
<script>
import config from '@/config'
import * as RegExp from "@/plugins/RegExp.js";
import { md5 } from "@/plugins/md5.js";
import * as apiLogin from "@/api/login.js";
import { sendSms } from "@/api/common.js";
import { webLogin, loginCallback } from "@/api/login.js";
import { webLogin, loginCallback,sCLogin,getSCLoginCode} from "@/api/login.js";
import storage from "@/plugins/storage.js";
import verify from "@/components/verify";
import vueQr from "vue-qr";
export default {
name: "Login",
components: {
verify,
vueQr
},
data() {
return {
config,
qrCodeStatus:"success", //
qrCode: '',
qrSessionToken:'',
//是否是二维码登录
scannerCodeLoginFLag: false,
scannerCodeLoginStatus: 0,
qrCodeTimer:null,
config: require('@/config'),
type: true, // true 账号登录 false 验证码登录
formData: {
// 登录表单
@@ -134,19 +193,19 @@ export default {
verifyStatus: false, // 是否图片验证通过
ruleInline: {
// 验证规则
username: [{ required: true, message: "请输入用户名" }],
username: [{required: true, message: "请输入用户名"}],
password: [
{ required: true, message: "请输入密码" },
{ type: "string", min: 6, message: "密码不能少于6位" },
{required: true, message: "请输入密码"},
{type: "string", min: 6, message: "密码不能少于6位"},
],
mobile: [
{ required: true, message: "请输入手机号码" },
{required: true, message: "请输入手机号码"},
{
pattern: RegExp.mobile,
message: "请输入正确的手机号",
},
],
code: [{ required: true, message: "请输入手机验证码" }],
code: [{required: true, message: "请输入手机验证码"}],
},
codeMsg: "发送验证码", // 验证码文字
interval: null, // 定时器
@@ -154,7 +213,14 @@ export default {
year: new Date().getFullYear(),
};
},
watch:{
scannerCodeLoginFLag(val){
!val ? this.clearInterval() : ''
}
},
methods: {
// 登录
handleSubmit(name) {
this.$refs[name].validate((valid) => {
@@ -169,6 +235,7 @@ export default {
this.$Message.success("登录成功");
storage.setItem("accessToken", res.result.accessToken);
storage.setItem("refreshToken", res.result.refreshToken);
storage.setItem('getTimes',0)
apiLogin.getMemberMsg().then((res) => {
if (res.success) {
storage.setItem("userInfo", res.result);
@@ -241,24 +308,7 @@ export default {
.login(data)
.then((res) => {
if (res.success) {
this.$Message.success("登录成功");
storage.setItem("accessToken", res.result.accessToken);
storage.setItem("refreshToken", res.result.refreshToken);
apiLogin.getMemberMsg().then((res) => {
this.$Spin.hide();
if (res.success) {
storage.setItem("userInfo", res.result);
let query = this.$route.query;
if (query.rePath) {
this.$router.push({
path: query.rePath,
query: JSON.parse(query.query),
});
} else {
this.$router.push("/");
}
}
});
this.loginSuccess(res.result.accessToken,res.result.refreshToken);
} else {
this.$Spin.hide();
this.$Message.error(res.message);
@@ -282,6 +332,89 @@ export default {
// 第三方登录
webLogin(type);
},
loginSuccess(accessToken,refreshToken){
this.$Message.success("登录成功");
storage.setItem("accessToken", accessToken);
storage.setItem("refreshToken", refreshToken);
apiLogin.getMemberMsg().then((res) => {
this.$Spin.hide();
if (res.success) {
storage.setItem("userInfo", res.result);
let query = this.$route.query;
if (query.rePath) {
this.$router.push({
path: query.rePath,
query: JSON.parse(query.query),
});
} else {
this.$router.push("/");
}
}
});
},
async createPCLoginSession() {
getSCLoginCode({}).then(response=>{
this.clearQRLoginInfo();
if (response.code == 200) {
this.qrCodeStatus = 'success'
let session = response.result;
this.qrSessionToken = session.token;
if (session.status === 0) {
this.qrCode = session.token;
this.refreshQrCode();
}
this.qrLogin();
}
});
},
async refreshQrCode() {
if (!this.qrCodeTimer) {
this.qrCodeTimer = setInterval(() => {
this.qrCodeStatus = 'fail' // 如果过期将二维码转为失效状态
}, 10 * 1000);
}
},
clearQRLoginInfo(){
this.scannerCodeLoginStatus=0;
this.qrSessionToken='';
if (this.qrCodeTimer) {
clearInterval(this.qrCodeTimer)
}
this.qrCodeTimer= null;
},
async qrLogin() {
if(!this.qrSessionToken) return;
sCLogin(this.qrSessionToken,{beforeSessionStatus:this.scannerCodeLoginStatus}).then(response=>{
if (response.success) {
this.scannerCodeLoginStatus = response.result.status;
switch (response.result.status) {
case 0:
case 1:
this.qrLogin();break;
case 2:
this.loginSuccess(response.result.token.accessToken,response.result.token.refreshToken);
break;
case 3:
this.createPCLoginSession();
break;
default:
this.clearQRLoginInfo();
break
}
} else{
this.clearQRLoginInfo();
}
});
},
},
destroyed() {
this.clearQRLoginInfo();
},
mounted() {
let uuid = this.$route.query.state;
@@ -289,28 +422,21 @@ export default {
storage.setItem("uuid", uuid);
loginCallback(uuid).then((res) => {
if (res.success) {
const result = res.result;
storage.setItem("accessToken", result.accessToken);
storage.setItem("refreshToken", result.refreshToken);
apiLogin.getMemberMsg().then((res) => {
if (res.success) {
storage.setItem("userInfo", res.result);
let query = this.$route.query;
if (query.rePath) {
this.$router.push({
path: query.rePath,
query: JSON.parse(query.query),
});
} else {
this.$router.push("/");
}
}
});
this.loginSuccess(res.result.accessToken,res.result.refreshToken);
}
});
}
},
watch: {
scannerCodeLoginFLag(v){
if(v){
this.createPCLoginSession();
console.log("二维码登录");
}else{
console.log("取消二维码登录");
this.clearQRLoginInfo();
}
},
type(v) {
if (v) {
this.$refs.formInline.resetFields();
@@ -327,10 +453,43 @@ export default {
};
</script>
<style scoped lang="scss">
.drag-area{
margin: 10px 0;
}
.login {
height: 100%;
background-color: #f0f2f5;
}
.other{
display: flex;
align-items: center;
justify-content: space-between;
}
.qr-container{
text-align: center;
margin: 20px 0;
position: relative;
>.qr-shadow{
background: rgba(0, 0, 0, 0.45);
position: absolute;
left: 50%;
margin-left: -75px;
top: 0;
z-index: 99;
width: 150px;
height: 150px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
color: #fff;
>span{
margin-bottom: 20px;
font-size: 13px;
letter-spacing: 2px;
}
}
}
.top-content {
width: 100%;
height: 80px;
@@ -347,19 +506,35 @@ export default {
margin: 0 auto;
display: flex;
align-items: center;
img {
width: 150px;
cursor: pointer;
}
div {
font-size: 20px;
margin-top: 10px;
}
}
}
.pending-scan{
text-align: center;
color:black;
}
.scanned{
text-align: center;
color:green;
}
.quick-logining{
text-align: center;
color:red;
}
.login-carousel {
width: 100%;
height: 550px;
.demo-carousel {
height: 550px;
width: inherit;
@@ -382,15 +557,18 @@ export default {
right: 15%;
padding: 20px;
background: rgba(255, 255, 255, 0.8);
.account-number {
display: flex;
justify-content: space-between;
align-items: baseline;
font-weight: bold;
> div:nth-child(2) {
color: $theme_color;
cursor: pointer;
}
.tab-switch {
height: 40px;
font-size: 14px;
@@ -404,6 +582,7 @@ export default {
span:nth-child(2) {
cursor: pointer;
padding-left: 10px;
&:hover {
color: $theme_color;
}
@@ -420,7 +599,7 @@ export default {
}
.other-login {
margin: 0 auto;
> svg {
cursor: pointer;
width: 24px;
@@ -428,18 +607,22 @@ export default {
height: 24px;
}
}
.regist {
.register {
display: flex;
justify-content: flex-end;
margin-top: -10px;
span {
margin-left: 10px;
&:hover {
cursor: pointer;
color: $theme_color;
}
}
}
.foot {
position: fixed;
bottom: 4vh;
@@ -447,19 +630,24 @@ export default {
left: calc(50% - 184px);
color: rgba(0, 0, 0, 0.45);
font-size: 14px;
.help {
margin: 0 auto;
margin-bottom: 1vh;
width: 60%;
.item {
color: rgba(0, 0, 0, 0.45);
}
:hover {
color: rgba(0, 0, 0, 0.65);
}
}
}
.icon-hover {
cursor: pointer;
}
</style>

View File

@@ -1,217 +1,354 @@
<template>
<div class="merchant">
<BaseHeader />
<BaseHeader/>
<!-- 搜索栏 -->
<Search :store="true" @search="search"></Search>
<Search :storeId="storeMsg.storeId" @search="search"></Search>
<!-- 店铺logo -->
<div class="shop-logo">
<div>
<img :src="storeMsg.storeLogo" height="80" alt="">
<div>
<p>{{storeMsg.storeName || 'xx店铺'}}</p>
<p class="ellipsis" :alt="storeMsg.storeDesc" v-html="storeMsg.storeDesc"></p>
</div>
<div>
<span class="hover-pointer" @click="collect"><Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#fff'" />{{storeCollected?'已收藏店铺':'收藏店铺'}}</span>
<span style="width:80px" class="hover-pointer ml_10" @click="connectCs(storeMsg.yzfSign)"><Icon custom="icomoon icon-customer-service" />联系客服</span>
</div>
<p>{{ storeMsg.storeName || '店铺' }}</p>
<p :alt="storeMsg.storeDesc" class="ellipsis" v-html="storeMsg.storeDesc"></p>
</div>
<div>
<span class="hover-pointer" @click="collect"><Icon :color="storeCollected ? '#ed3f14' : '#fff'"
type="ios-heart"/>{{
storeCollected ? '已收藏店铺' : '收藏店铺'
}}</span>
<span class="hover-pointer ml_10" style="width:80px" @click="IMService(storeMsg.storeId,null,null)"><Icon
custom="icomoon icon-customer-service"/>联系客服</span>
</div>
</div>
<div class="store-category">
<div class="store-category">
<ul class="cate-list">
<li class="cate-item" @click="searchByCate({id:'', labelName: '店铺推荐'})">首页</li>
<li class="cate-item" v-for="(cate, index) in cateList" :key="index">
<li
class="cate-item"
@click="searchByCate({ id: '', labelName: '店铺推荐' })"
>
首页
</li>
<li v-for="(cate, index) in cateList" :key="index" class="cate-item">
<Dropdown v-if="cate.children.length">
<div @click.self="searchByCate(cate)">{{cate.labelName}} <Icon type="ios-arrow-down"></Icon></div>
<div @click.self="searchByCate(cate)">
{{ cate.labelName }}
<Icon type="ios-arrow-down"></Icon>
</div>
<DropdownMenu slot="list">
<DropdownItem @click.native="searchByCate(sec)" :name="sec.id" v-for="sec in cate.children" :key="sec.id">{{sec.labelName}}</DropdownItem>
<DropdownItem
v-for="sec in cate.children"
:key="sec.id"
:name="sec.id"
@click.native="searchByCate(sec)"
>{{ sec.labelName }}
</DropdownItem
>
</DropdownMenu>
</Dropdown>
<span v-else @click.self="searchByCate(cate)">{{cate.labelName}}</span>
<span v-else @click.self="searchByCate(cate)">{{
cate.labelName
}}</span>
</li>
</ul>
</div>
<div class="promotion-decorate">{{cateName}}</div>
<div class="goods-list">
<empty v-if="goodsList.length === 0" />
<div
v-else
class="goods-show-info"
v-for="(item, index) in goodsList"
:key="index"
@click="goGoodsDetail(item.content.id, item.content.goodsId)"
>
<div class="goods-show-img">
<img width="220" height="220" :src="item.content.thumbnail" />
</div>
<div class="goods-show-price">
<span>
<span class="seckill-price text-danger">{{
item.content.price | unitPrice("¥")
}}</span>
</span>
</div>
<div class="goods-show-detail">
<span>{{ item.content.goodsName }}</span>
</div>
<div class="goods-show-num">
已有<span>{{ item.content.commentNum || 0 }}</span>人评价
<div v-if="storeMsg.pageShow&&storeMsg.pageShow==='1'">
<!-- 楼层装修部分 -->
<model-form ref="modelForm" :data="modelForm"></model-form>
</div>
<div v-else>
<div class="promotion-decorate">{{ cateName }}</div>
<div class="goods-list">
<empty v-if="goodsList.length === 0"/>
<div
v-for="(item, index) in goodsList"
v-else
:key="index"
class="goods-show-info"
@click="goGoodsDetail(item.id, item.goodsId)"
>
<div class="goods-show-img">
<img :src="item.small" height="220" width="220" alt=""/>
</div>
<div class="goods-show-price">
<span>
<span class="seckill-price text-danger">{{
item.price | unitPrice("¥")
}}</span>
</span>
</div>
<div class="goods-show-detail">
<span>{{ item.goodsName }}</span>
</div>
<div class="goods-show-num">
已有<span>{{ item.commentNum || 0 }}</span
>人评价
</div>
</div>
</div>
<div class="goods-page">
<Page
:page-size="params.pageSize"
:total="total"
show-sizer
@on-change="changePageNum"
@on-page-size-change="changePageSize"
></Page>
</div>
</div>
<div class="goods-page">
<Page
show-sizer
@on-change="changePageNum"
@on-page-size-change="changePageSize"
:total="total"
:page-size="params.pageSize"
></Page>
</div>
<BaseFooter />
<BaseFooter/>
</div>
</template>
<script>
import {getDetailById, getCateById} from '@/api/shopentry'
import { cancelCollect, collectGoods, isCollection } from '@/api/member';
import {goodsList} from '@/api/goods';
import {getCateById, getDetailById} from "@/api/shopentry";
import {cancelStoreCollect, collectStore} from "@/api/member";
import {goodsList} from "@/api/goods";
import Search from "@/components/Search";
import ModelForm from "@/components/indexDecorate/ModelForm";
import HoverSearch from "@/components/header/hoverSearch";
import storage from "@/plugins/storage";
import {getFloorStoreData} from "@/api/index.js";
import imTalk from '@/components/mixes/talkIm'
export default {
name: 'Merchant',
data () {
name: "Merchant",
components: {
Search,
ModelForm,
HoverSearch,
},
mixins: [imTalk],
data() {
return {
// 店铺装修的内容
modelForm: {list: []}, // 楼层装修数据
topAdvert: {}, // 顶部广告
showNav: false, // 是否展示分类栏
topSearchShow: false, // 滚动后顶部搜索栏展示
carouselLarge: false, // 不同轮播分类尺寸
carouselOpacity: false, // 不同轮播分类样式,
enablePageData: false, //是否显示楼层装修内容
basePageData: false, //基础店铺信息
storeMsg: {}, // 店铺信息
cateList: [], // 店铺分裂
goodsList: [], // 商品列表
total: 0, // 商品数量
params: { // 请求参数
params: {
// 请求参数
pageNumber: 1,
pageSize: 20,
keyword: '',
keyword: "",
storeId: this.$route.query.id,
storeCatId: ''
storeCatId: "",
},
cateName: '店铺推荐', // 分类名称
storeCollected: false // 是否收藏
}
cateName: "店铺推荐", // 分类名称
storeCollected: false, // 是否收藏
};
},
created () {
this.getStoreMsg()
this.getCateList()
this.getGoodsList()
created() {
this.getStoreMsg();
},
methods: {
getStoreMsg () { // 店铺信息
getDetailById(this.$route.query.id).then(res => {
if (res.success) {
this.storeMsg = res.result
document.title = this.storeMsg.storeName
if (this.Cookies.getItem('userInfo')) {
isCollection('STORE', this.storeMsg.storeId).then(res => {
if (res.success && res.result) {
this.storeCollected = true;
getIndexData() {
// 获取首页装修数据
getFloorStoreData({clientType: "PC", num: this.$route.query.id, pageType: 'STORE'}).then(
(res) => {
if (res.success) {
let dataJson = JSON.parse(res.result.pageData);
// 秒杀活动不是装修的数据,需要调用接口判断是否有秒杀商品
// 轮播图根据不同轮播,样式不同
for (const element of dataJson.list) {
let type = element.type;
if (type === "carousel2") {
this.carouselLarge = true;
} else if (type === "carousel1") {
this.carouselLarge = true;
this.carouselOpacity = true;
}
})
// else if (type === "seckill") {
// let seckill = this.getListByDay();
// dataJson.list[i].options.list = seckill;
// }
}
this.modelForm = dataJson;
storage.setItem("navList", dataJson.list[1]);
this.showNav = true;
this.topAdvert = dataJson.list[0];
}
}
})
);
},
getCateList () { // 店铺分类
getCateById(this.$route.query.id).then(res => {
// getStoreMsg () { // 店铺信息
// getDetailById(this.$route.query.id).then(res => {
// if (res.success) {
// this.storeMsg = res.result
// document.title = this.storeMsg.storeName
// if (this.Cookies.getItem('userInfo')) {
// isCollection('STORE', this.storeMsg.storeId).then(res => {
// if (res.success && res.result) {
// this.storeCollected = true;
// }
// })
// }
// }
// })
// },
// async getListByDay() {
// // 当天秒杀活动
// const res = await seckillByDay();
// if (res.success && res.result.length) {
// return res.result;
// } else {
// return [];
// }
// },
getStoreMsg() {
// 店铺信息
getDetailById(this.$route.query.id).then((res) => {
if (res.success) {
this.cateList = res.result
this.storeMsg = res.result;
console.log(this.storeMsg)
//判定如果开启楼层展示,则获取页面信息 否则读取商品信息
if (this.storeMsg.pageShow && this.storeMsg.pageShow === '1') {
this.getIndexData();
} else {
this.getGoodsList();
this.getCateList();
}
let that = this;
window.onscroll = function () {
let top =
document.documentElement.scrollTop || document.body.scrollTop;
if (top > 300) {
that.topSearchShow = true;
} else {
that.topSearchShow = false;
}
};
}
})
},
getGoodsList () { // 商品信息
goodsList(this.params).then((res) => {
if (res.success) {
this.goodsList = res.result.content;
this.total = res.result.totalElements;
}
}).catch(() => {
});
},
goGoodsDetail (skuId, goodsId) {
getCateList() {
// 店铺分类
getCateById(this.$route.query.id).then((res) => {
if (res.success) {
this.cateList = res.result;
console.log(this.cateList,'cateList')
}
});
},
getGoodsList() {
// 商品信息
goodsList(this.params)
.then((res) => {
if (res.success) {
this.goodsList = res.result.records;
this.total = res.result.total;
}
})
.catch(() => {
});
},
goGoodsDetail(skuId, goodsId) {
// 跳转商品详情
let routeUrl = this.$router.resolve({
path: '/goodsDetail',
query: { skuId, goodsId }
path: "/goodsDetail",
query: {skuId, goodsId},
});
window.open(routeUrl.href, '_blank');
window.open(routeUrl.href, "_blank");
},
search (val) { // 搜索本店商品
search(val) {
// 搜索本店商品
console.log(val);
this.params.keyword = val
this.getGoodsList()
this.params.keyword = val;
this.getGoodsList();
},
searchByCate (cate) { // 搜索同分类下商品
this.params.storeCatId = cate.id
this.cateName = cate.labelName
this.getGoodsList()
searchByCate(cate) {
// 搜索同分类下商品
this.params.storeCatId = cate.id;
this.cateName = cate.labelName;
this.getGoodsList();
},
// 分页 修改页码
changePageNum (val) {
changePageNum(val) {
this.params.pageNumber = val;
this.getGoodsList();
},
// 分页 修改页数
changePageSize (val) {
changePageSize(val) {
this.params.pageNumber = 1;
this.params.pageSize = val;
this.getGoodsList();
},
async collect () { // 收藏店铺
async collect() {
// 收藏店铺
if (this.storeCollected) {
let cancel = await cancelCollect('STORE', this.storeMsg.storeId)
let cancel = await cancelStoreCollect("STORE", this.storeMsg.storeId);
if (cancel.success) {
this.$Message.success('已取消收藏')
this.$Message.success("已取消收藏");
this.storeCollected = false;
}
} else {
let collect = await collectGoods('STORE', this.storeMsg.storeId);
let collect = await collectStore("STORE", this.storeMsg.storeId);
if (collect.code === 200) {
this.storeCollected = true;
this.$Message.success('收藏店铺成功,可以前往个人中心我的收藏查看');
this.$Message.success("收藏店铺成功,可以前往个人中心我的收藏查看");
}
}
}
}
},
},
};
</script>
<style scoped lang="scss">
@import '../assets/styles/goodsList.scss';
<style lang="scss" scoped>
@import "../assets/styles/goodsList.scss";
.merchant {
margin: 0 auto;
}
.shop-logo {
position: relative;
width: 100%;
background-color: #666;
padding: 4px;
color: #fff;
>div{
> div {
display: flex;
width: 1200px;
margin: 0 auto;
align-items: center;
>div:nth-child(2){
> div:nth-child(2) {
margin-left: 10px;
flex: 1;
}
>div:nth-child(3){
> div:nth-child(3) {
width: 200px;
}
}
p:nth-child(1) {
font-size: 20px;
}
p:nth-child(2){
p:nth-child(2) {
font-size: 14px;
max-height: 40px;
max-width: 400px;
@@ -221,22 +358,27 @@ export default {
.store-category {
background-color: #005aa0;
color: #fff;
.cate-list{
.cate-list {
width: 1200px;
margin: 0 auto ;
margin: 0 auto;
clear: left;
height: 30px;
line-height: 30px;
.cate-item {
margin-right: 25px;
float: left;
}
.cate-item:hover{
.cate-item:hover {
cursor: pointer;
}
}
}
.promotion-decorate::before,.promotion-decorate::after{
background-image: url('/src/assets/images/sprite@2x.png');
.promotion-decorate::before,
.promotion-decorate::after {
background-image: url("/src/assets/images/sprite@2x.png");
}
</style>

View File

@@ -2,7 +2,7 @@
<div>
<BaseHeader></BaseHeader>
<Search></Search>
<cateNav></cateNav>
<!-- 添加成功提示 -->
<div class="add-info-box-container">
<div class="add-info-box">

View File

@@ -97,7 +97,7 @@
</template>
<script>
import config from '@/config'
import * as RegExp from '@/plugins/RegExp.js';
import { md5 } from '@/plugins/md5.js';
import * as apiLogin from '@/api/login.js';
@@ -108,7 +108,7 @@ export default {
components: { Verify },
data () {
return {
config,
config:require('@/config'),
year: new Date().getFullYear(),
formRegist: {
// 注册表单

37
buyer/src/pages/Topic.vue Normal file
View File

@@ -0,0 +1,37 @@
<template>
<div v-if="pageData">
<Index :page-data="pageData" />
</div>
</template>
<script>
import Index from './Index.vue'
import { getTopicData } from '@/api/index'
export default {
data() {
return {
pageData: ""
}
},
components: { Index },
mounted() {
// 接收id进行查询
const id = this.$route.query.id
this.init(id)
},
methods: {
async init(id) {
const res = await getTopicData(id)
if (res.success) {
console.log(res.result)
// 直接复用首页就行
if (res.result.pageData) {
this.pageData = JSON.parse(res.result.pageData)
}
}
}
}
}
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,88 @@
<template>
<div class="box">
<div class="wrapper">
<div class="nav" @click="back">
<img src="@/assets/images/logo2.png" alt="" class="logo" />
<div class="title">{{ detail.title }}</div>
</div>
<div v-html="detail.content"></div>
</div>
</div>
</template>
<script>
import { articleDetail } from "@/api/common.js";
const config = require("@/config/index");
export default {
data() {
return {
config,
detail: "",
};
},
mounted() {
this.init();
},
methods: {
back() {
this.$router.push("/");
},
// 初始化文章
init() {
const id = this.$route.query.id;
articleDetail(id).then((res) => {
if (res.success) {
this.detail = res.result;
}
});
},
},
};
</script>
<style lang="scss" scoped>
.logo {
max-width: 200px;
}
.box {
min-height: 100vh;
width: 1200px;
overflow: hidden;
margin: 0 auto;
padding: 32px;
}
.wrapper {
width: 1200px;
min-height: 600px;
padding: 32px;
background: #fff;
}
.nav {
text-align: center;
font-size: 21px;
font-weight: bold;
}
.title {
text-align: center;
font-size: 21px;
margin: 20px 0;
}
// iphone
@media screen and (max-width: 767px) {
.box {
min-height: 100vh;
width: 100%;
padding: 0;
margin: 0 auto;
}
.wrapper {
width: 100%;
min-height: 600px;
padding: 0 16px;
background: #fff;
}
}
</style>

View File

@@ -2,7 +2,7 @@
<div>
<BaseHeader></BaseHeader>
<Search></Search>
<cateNav></cateNav>
<div class="title-bg"><p>文章帮助中心</p></div>
<div class="container width_1200">
<Layout class="layoutAll">
@@ -182,7 +182,6 @@ export default {
text-align: center;
}
.title-bg{
border-top: 3px solid $theme_color;
height: 100px;
width: 100%;
background-color: #7b7b7b;

View File

@@ -17,6 +17,10 @@ export const orderStatusList = [
name: '待发货',
status: 'UNDELIVERED'
},
{
name: '部分发货',
status: 'PARTS_DELIVERED'
},
{
name: '已发货',
status: 'DELIVERED'
@@ -30,8 +34,12 @@ export const orderStatusList = [
status: 'TAKE'
},
{
name: '已取消',
name: '已关闭',
status: 'CANCELLED'
},
{
name: '待提货',
status: 'STAY_PICKED_UP'
}
]
// 订单售后状态

View File

@@ -20,7 +20,7 @@
</template>
<script>
import { getPwdStatus } from '@/api/account';
// import { getPwdStatus } from '@/api/account';
export default {
name: 'AccountSafe',
data () {
@@ -40,21 +40,21 @@ export default {
this.$router.push({name: 'ModifyPwd', query: { status: 1 }})
},
// 获取密码状态
getPwdStatus () {
getPwdStatus().then(res => {
if (res) {
this.pwdStatus = '修改密码'
} else {
this.pwdStatus = '设置密码'
}
});
}
// getPwdStatus () {
// getPwdStatus().then(res => {
// if (res) {
// this.pwdStatus = '修改密码'
// } else {
// this.pwdStatus = '设置密码'
// }
// });
// }
}
}
</script>
<style scoped lang="scss">
/deep/ .ivu-col-span-2, .ivu-col-span-4 {
::v-deep .ivu-col-span-2, .ivu-col-span-4 {
text-align: center;
color: $theme_color;
}
@@ -71,7 +71,7 @@ export default {
border-bottom: 1px solid $border_color;
padding: 16px 0;
/deep/ .ivu-col {
::v-deep .ivu-col {
padding: 8px 0;
}

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