Browse Source

yshop2.0发布

master
hupeng 5 years ago
parent
commit
150d7eb84f
  1. 60
      README.md
  2. 9
      src/api/yxStoreOrder.js
  3. 34
      src/api/yxSystemStore.js
  4. 27
      src/api/yxUserRecharge.js
  5. 1
      src/assets/icons/svg/price.svg
  6. 1
      src/assets/icons/svg/rec.svg
  7. 1
      src/assets/icons/svg/store.svg
  8. BIN
      src/assets/images/bg.jpg
  9. 2
      src/settings.js
  10. 2
      src/views/activity/bargain/form.vue
  11. 2
      src/views/activity/combination/form.vue
  12. 15
      src/views/activity/coupon/form.vue
  13. 2
      src/views/activity/couponissue/index.vue
  14. 2
      src/views/activity/seckill/form.vue
  15. 103
      src/views/dashboard/YshopInfo.vue
  16. 2
      src/views/login.vue
  17. 5
      src/views/shop/cate/index.vue
  18. 3
      src/views/shop/express/form.vue
  19. 3
      src/views/shop/goods/attr.vue
  20. 43
      src/views/shop/goods/form.vue
  21. 158
      src/views/shop/order/formC.vue
  22. 2
      src/views/shop/order/index.vue
  23. 526
      src/views/shop/order/indext.vue
  24. 99
      src/views/shop/recharge/index.vue
  25. 10
      src/views/shop/set/form.vue
  26. 7
      src/views/shop/set/hotform.vue
  27. 10
      src/views/shop/set/menuform.vue
  28. 9
      src/views/shop/set/rollform.vue
  29. 6
      src/views/shop/set/seckillform.vue
  30. 8
      src/views/shop/set/signform.vue
  31. 10
      src/views/shop/set/usermenuform.vue
  32. 171
      src/views/shop/store/index.vue
  33. 70
      src/views/shop/store/set.vue
  34. 8
      src/views/shop/userlevel/form.vue
  35. 8
      src/views/wechat/config/index.vue
  36. 9
      src/views/wechat/config/pay.vue
  37. 20
      src/views/wechat/config/point.vue
  38. 12
      src/views/wechat/config/postage.vue
  39. 15
      src/views/wechat/config/promoter.vue
  40. 9
      src/views/wechat/config/wxapp.vue
  41. 4
      vue.config.js

60
README.md

@ -2,13 +2,13 @@
#### 项目简介
yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2+Jpa+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含商城、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员等功能,更适合企业或个人二次开发;;
yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2+Jpa+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含商城、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、到店核销等功能,更适合企业或个人二次开发;;
**开发文档** 【[查看文档](https://gitee.com/guchengwuyue/yshopmall/wikis/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83?sort_id=1718722)】
#### 体验地址
| | 后台系统 | 前端(公众号) |
| | 后台系统 | 前端(公众号+小程序(mpvue2.0),关注公众号即可体验公众号与小程序) |
|--- |--- | --- |
| | https://www.yixiang.co |H5:https://h5.yixiang.co 测试号:hupeng/123456,也可以自行注册 |
| | 后台体验账号/密码:admin/123456 | 公众号:![输入图片说明](https://images.gitee.com/uploads/images/2019/1116/060936_fd73496c_477893.jpeg "qrcode_for_gh_95df5a2881cc_258.jpg") |
@ -32,7 +32,7 @@ CMS,CRM,OA等等本版本本身属于独立后台商城管理系统;
3.可以个人、企业直接使用。
### VIP版
1.包括了开源版,还包括了移动端(H5+公众号)、小程序(mpvue2框架)1.0已经发布一个开发版、移动端API
1.包括了开源版,还包括了移动端(H5+公众号)、小程序(mpvue2框架、移动端API
2.本版本是演示的所有功能代码;
@ -64,7 +64,6 @@ CMS,CRM,OA等等本版本本身属于独立后台商城管理系统;
- yshop-tools 第三方工具模块
- yshop-generator 代码生成模块
- yshop-shop 商城模块
- yshop-monitor 监控模块
#### 系统预览
<table>
@ -87,7 +86,7 @@ CMS,CRM,OA等等本版本本身属于独立后台商城管理系统;
</table>
<table>
<tr>
<td><img src="https://images.gitee.com/uploads/images/2019/1223/195748_ce8bddc3_477893.jpeg"/></td>
<td><img src="https://images.gitee.com/uploads/images/2020/0303/023406_d4ef025a_477893.jpeg"/></td>
<td><img src="https://images.gitee.com/uploads/images/2019/1129/234538_62ba99b7_477893.jpeg"/></td>
</tr>
<tr>
@ -136,31 +135,38 @@ CMS,CRM,OA等等本版本本身属于独立后台商城管理系统;
- 1.3.1版本手机端新增商户管理、后台新增统计
- 1.3.2新增后台微信相关及其支付配置,新增自动回复配置
- 1.3.3新增 后台微信图文发送功能,小程序配置,增加小程序授权等,修复一些bug等
- yshop1.4版本发布
- 1.4.1个人中心新增账单流水
- yshop1.4.2 发布更新如下:
- 1.4.3版本,后台图标更新,后台模块重新拆分,物流快递单独管理,导出最新sql
- 1.4.4版本,新增模板消息通知、H5端商家管理发货修改及其列表时间显示修复
- yshop1.5版本发布:
- yshop1.6发布:
- yshop1.6.1发布:新增移动端浏览记录,下单增加简单ReentrantLock锁
- yshop1.6.2发布:修复用户昵称带有表情导致入库失败问题,修复下单订单金额为0不能支付的问题
- yshop1.6.4发布:后台新增修改订单价格与备注优化订单详情显示明细,修复积分记录标题不显示的问题
- yshop1.7 发布
- yshop1.8发布:
- yshop1.8.3发布更新如下:
- yshop1.9.1,新增城市接口,修复小程序登陆与支付问题,发布mpvue1.0小程序
- 1、新增城市接口
- 2、修复小程序登陆与支付问题
- 3、发布mpvue1.0小程序
- 4、WxJava升级到3.6
- 5、微信公众号服务配置重构
- 6、修复后台配置公众号,API端必须要重启才能生效的问题
- yshop1.9.2
- 1、修复素材库无法分页的问题#I18KJN
- 2、修复订单退款问题#I18GG6
- 3、修复分类问题#I17UEI
- 4、修复后台添加角色的问题#I18NCW
- yshop1.9.1,新增城市接口,修复小程序登陆与支付问题,发布mpvue1.0小程序
- yshop1.9.4,新增小程序普通二维码功能及其修复小程序其他问题,详情登陆演示后台查看明细
- yshop2.0发布更新如下:
- 1、优化代码结构与名称,修改get请求参数其统一继承分页参数
- 2、新增redis监听未付款30分钟取消功能与7天自动收货功能,mq队列作为备选(注释掉)
- 3、新增门店到店核销功能
- 4、新增分销全局开关#I19HB1
- 5、积分新增消费限制#I19TUR
- 6、新增充值功能#I18V5D
- 7、后台菜单调整,新增财务模块
- 8、优化后台配置赋值写法
- 9、修复管理后台新增表单之后如果直接再新增数据导致默认数据缺失问题#I1AFBK
- 10、修复提交购物车可能查询多条数据的问题
- 11、后台登陆背景图固定#I1A0LS
- 12、增加常量与枚举优化硬编码问题
- 13、微信支付、公众号、模板消息修改
- 14、修复代码生成器不全的问题#I1AIO4
- 15、修复营销产品拼团等轮播图不能修改的问题#I1AHXR
- 16、移除yshop-monitor模块
- 17、修复退货理由文字错误#I1AQ7D
- 18、修复新增分类的图片自动显示上次一次的图片#I1AQBK
- 19、新增微信jssdk接口返回所需js权限
- 20、新增余额充值变动模板消息通知
- 21、首页数据缓存优化
- 22、新增未支付订单显示到期时间
- 23、修复加入购物车购买后,后台订单中的商品信息数据重复#I1AXNX
- 24、修复后台-管理商品-规格属性 属性无法删除问题#I1AYL2
- 25、修复公众号商品直接微信分享标题不显示的问题#I1AX0R
#### 反馈交流

9
src/api/yxStoreOrder.js

@ -23,6 +23,15 @@ export function edit(data) {
})
}
export function editT(data) {
return request({
url: 'api/yxStoreOrder/check',
method: 'put',
data
})
}
export function refund(data) {
return request({
url: 'api/yxStoreOrder/refund',

34
src/api/yxSystemStore.js

@ -0,0 +1,34 @@
import request from '@/utils/request'
export function get() {
return request({
url: 'api/yxSystemStore',
method: 'get'
})
}
export function getL(data) {
return request({
url: 'api/yxSystemStore/getL',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: 'api/yxSystemStore/',
method: 'delete',
data: ids
})
}
export function update(data) {
return request({
url: 'api/yxSystemStore',
method: 'put',
data
})
}
export default { get, getL, update, del }

27
src/api/yxUserRecharge.js

@ -0,0 +1,27 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: 'api/yxUserRecharge',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: 'api/yxUserRecharge/',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: 'api/yxUserRecharge',
method: 'put',
data
})
}
export default { add, edit, del }

1
src/assets/icons/svg/price.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1583159767474" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1574" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M954.112 343.87v466.856c0 21.78 0.717 42.855-8.335 63.478-26.604 60.61-85.863 58.803-140.662 58.803h-609.68c-64.107 0-108.595-43.202-108.595-107.73V226.591c0-11.94-0.133-23.885 0.2-35.82 1.439-51.625 49.47-91.863 99.241-91.863h610.616c55.225 0 97.649 44.79 99.16 98.934 0.92 32.947 52.12 33.04 51.2 0-2.535-90.916-74.476-150.134-162.166-150.134H197.806c-87.685 0-159.626 59.218-162.16 150.134-1.04 37.314 0 74.808 0 112.133v459.233c0 51.59-4.373 102.339 25.226 148.101 27.018 41.76 75.986 66.898 125.363 66.898h651.464c19.845 0 38.968-0.686 58.48-5.662 54.595-13.947 95.785-62.603 106.48-116.788 9.145-46.356 2.658-99.03 2.658-145.797V343.864c-0.005-33.013-51.205-33.013-51.205 0.005z" p-id="1575"></path><path d="M279.04 241.53h576.072c55.157 0 97.49 44.919 98.995 98.93 0.921 32.947 52.121 33.034 51.2 0-2.555-91.505-74.998-150.13-162.944-150.13H279.035c-33.014 0-33.014 51.2 0.005 51.2z m74.148 145.225a641855.693 641855.693 0 0 0 156.242 156.19c9.86 9.867 26.342 9.867 36.198 0C597.852 490.762 650.076 438.543 702.3 386.33c23.368-23.363-12.836-59.572-36.198-36.204L509.43 506.778h36.198L389.391 350.55c-23.367-23.368-59.57 12.841-36.203 36.204z m-43.515 243.502h430.09c33.014 0 33.014-51.2 0-51.2h-430.09c-33.014 0-33.014 51.2 0 51.2z m0 131.517h430.09c33.014 0 33.014-51.2 0-51.2h-430.09c-33.014 0-33.014 51.2 0 51.2z" p-id="1576"></path><path d="M503.188 523.607v308.198c0 33.014 51.2 33.014 51.2 0V523.607c0-33.019-51.2-33.019-51.2 0z" p-id="1577"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/assets/icons/svg/rec.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1583161332399" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2360" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M798.416 224.976c-76.58-76.58-178.403-118.693-286.659-118.693s-210.079 42.113-286.659 118.693c-76.58 76.58-118.693 178.403-118.693 286.659 0 108.256 42.113 210.079 118.693 286.659 76.58 76.58 178.403 118.693 286.659 118.693 108.256 0 210.079-42.113 286.659-118.693 76.58-76.58 118.693-178.403 118.693-286.659 0-108.256-42.113-210.079-118.693-286.659zM511.758 859.948c-192.117 0-348.311-156.194-348.311-348.311s156.194-348.311 348.311-348.311 348.311 156.194 348.311 348.311-156.194 348.311-348.311 348.311z" fill="" p-id="2361"></path><path d="M563.337 296.945h-104.007v41.506h-155.102v33.253h68.571l-55.463 154.617h62.017l-65.051 184.835h103.523l65.051-184.835h60.682v184.835h173.063v-33.253h-69.055v-151.583h16.626c27.914 0 48.060-27.549 39.322-54.128l-19.661-58.982h-101.823l21.36 63.351c3.035 7.888-3.519 16.626-12.257 16.626h-154.131l40.172-121.484h241.633v-33.253h-155.466v-41.506z" fill="" p-id="2362"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
src/assets/icons/svg/store.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1583227572050" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2343" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960.507 367.104c-0.046-0.512-0.174-0.957-0.22-1.331-0.446-1.89-0.973-3.733-1.69-5.51l-76.913-190.98c-13.322-39.614-51.517-63.903-96.276-63.995H245.949c-45.342 0-80.537 24.069-93.28 62.126L70.046 362.28c-0.4 1.157-0.799 2.842-1.173 4.577-6.016 18.386-9.016 37.279-9.016 56.218 0.066 66.657 36.68 127.452 95.544 158.807 0 0 0 0.046 0.02 0.046 0.042 0 0.042 0 0.042 0.046 0 0 0.02 0 0.02 0.041 24.248 12.923 52.736 19.41 84.844 19.41 53.826-0.133 103.628-23.716 137.62-64.123 33.777 40.054 83.22 63.498 136.96 63.857 53.29-0.44 102.584-23.936 136.243-63.99 33.977 40.366 83.892 63.903 137.933 63.903 32.686-0.18 61.768-7.02 86.288-20.43 57.953-31.62 93.926-92.256 93.88-158.228 0.092-18.964-3.016-38.016-8.745-55.311zM843.935 531.482c-14.833 8.125-33.393 12.298-54.933 12.39-39.926 0-76.293-20.204-97.566-54.554-1.51-3.266-4.086-8.617-8.75-13.788-5.458-6.062-15.274-13.23-31.442-13.23-13.103 0-24.914 5.33-31.576 13.502-4.439 5.017-6.84 9.948-8.57 13.522-21.008 33.904-57.068 54.333-96.19 54.645-39.634-0.225-75.827-20.603-96.947-54.758-1.464-3.02-3.932-8.105-7.772-12.39-15.411-18.36-49.915-17.409-63.35-1.419-4.951 5.417-7.552 10.86-9.216 14.52-21.16 33.926-57.6 54.314-97.367 54.4-21.161 0-39.327-3.993-53.914-11.77h-0.112c-37.504-19.917-69.187-67.057-69.212-109.466 0-12.523 2.063-25.175 6.287-37.478 0.312-0.886 0.553-1.864 0.799-2.868l81.382-200.35c1.664-4.926 6.707-19.85 32-19.85h556.396c10.434 0.599 28.334 2.442 34.682 21.135l76.207 197.775a30.75 30.75 0 0 0 0.972 3.753c4.265 12.345 6.303 24.894 6.303 37.325 0.097 41.897-31.206 88.812-68.111 108.954z m28.774 96.716c-18.12 0-28.6 14.654-28.6 32.733l0.092 182.743c0 10.168-8.305 18.432-18.473 18.467l-633.646 0.4c-10.168 0-18.427-8.213-18.427-18.294l-0.246-179.722c-0.02-18.028-10.526-32.64-28.6-32.64h-0.067c-18.073 0.046-28.554 14.7-28.528 32.814l0.22 175.416c0 46.142 37.683 83.712 83.999 83.712l617.036-0.4c46.275-0.091 83.938-37.744 83.938-83.931l-0.092-178.57c-0.006-18.11-10.486-32.728-28.606-32.728z m-101.606-237.49H246.482c-18.12 0-32.799-10.502-32.799-28.555 0-18.028 14.7-28.554 32.799-28.554h524.62c18.115 0 32.769 10.526 32.769 28.554 0.005 18.048-14.649 28.554-32.768 28.554z" p-id="2344"></path></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
src/assets/images/bg.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

2
src/settings.js

@ -2,7 +2,7 @@ module.exports = {
/**
* @description 网站标题
*/
title: 'YSHOP',
title: 'YSHOP-2.0dev',
/**
* @description 是否显示 tagsView
*/

2
src/views/activity/bargain/form.vue

@ -161,7 +161,7 @@ export default {
},
'form.sliderImageArr': function(val) {
if (val) {
this.form.sliderImage = val.join(',')
this.form.images = val.join(',')
}
}
},

2
src/views/activity/combination/form.vue

@ -140,7 +140,7 @@ export default {
},
'form.sliderImageArr': function(val) {
if (val) {
this.form.sliderImage = val.join(',')
this.form.images = val.join(',')
}
}
},

15
src/views/activity/coupon/form.vue

@ -102,14 +102,13 @@ export default {
this.form = {
id: '',
title: '',
integral: '',
couponPrice: '',
useMinPrice: '',
couponTime: '',
sort: '',
status: '',
addTime: '',
isDel: ''
integral: 0,
couponPrice: 0,
useMinPrice: 0,
couponTime: 1,
sort: 0,
status: 1,
addTime: ''
}
}
}

2
src/views/activity/couponissue/index.vue

@ -119,6 +119,8 @@ export default {
cid: data.cid,
startTime: data.startTime,
endTime: data.endTime,
startTimeDate: data.startTimeDate,
endTimeDate: data.endTimeDate,
totalCount: data.totalCount,
remainCount: data.remainCount,
isPermanent: data.isPermanent,

2
src/views/activity/seckill/form.vue

@ -135,7 +135,7 @@ export default {
},
'form.sliderImageArr': function(val) {
if (val) {
this.form.sliderImage = val.join(',')
this.form.images = val.join(',')
}
}
},

103
src/views/dashboard/YshopInfo.vue

@ -10,7 +10,7 @@
<span style="font-weight: bolder">yshop基于当前流行技术组合的前后端分离商城系统</span>
SpringBoot2+Jpa+MybatisPlus+SpringSecurity
的前后端分离的商城系统
包含商城拼团砍价商户管理 秒杀优惠券积分分销会员等功能
包含商城拼团砍价商户管理 秒杀优惠券积分分销会员充值门店核销等功能
</div>
<div class="text item">
<span style="font-weight: bolder">技术选型</span>
@ -39,6 +39,10 @@
<span style="font-weight: bolder">H5演示</span><a target="_blank" href="https://h5.yixiang.co">https://h5.yixiang.co</a> <br>
<span style="font-weight: bolder">H5测试号</span>hupeng/123456,也可以自行注册
</div>
<div class="text item">
<span style="font-weight: bolder;color: red">如果想体验手机端商户管理与订单核销功能记得去后台会员管理搜索找到自己
然后编辑设置商户管理员开启即可然后刷新个人中心即可体验</span>
</div>
</el-card>
</div>
</el-col>
@ -58,7 +62,7 @@
</div>
<div class="text item">
1VIP为终身制包括JAVA端+H5公众号端后期免费升级迭代及其技术支持<br>
2价格vip会员价248元(JAVA+H5+公众号版)后续的系统升级vip价格会有相应的调整的所以早上车更优惠哦<br>
2价格vip会员价298元(JAVA+H5+公众号版)后续的系统升级vip价格会有相应的调整的所以早上车更优惠哦<br>
3VIP购买淘宝地址https://item.taobao.com/item.htm?id=607532386325<br>
4加入vip群931426444,请输入你的淘宝订单编号即可入群<br>
5群里面获取私服git<br>
@ -83,70 +87,121 @@
<span style="font-weight: bolder">更新日志</span>
</div>
<div class="text item">
<span style="font-weight: bolder">2020-02-11yshop1.9.6版本 发布更新如下</span>
<span style="font-weight: bolder">即将发布yshop2.0dev版本 发布更新如下</span>
</div>
<div class="text item">
1优化代码结构与名称修改get请求参数其统一继承分页参数
</div>
<div class="text item">
2新增redis监听未付款30分钟取消功能与7天自动收货功能mq队列作为备选(注释掉)
</div>
<div class="text item">
3新增门店到店核销功能
</div>
<div class="text item">
4新增分销全局开关#I19HB1
</div>
<div class="text item">
5积分新增消费限制#I19TUR
</div>
<div class="text item">
6新增充值功能#I18V5D
</div>
<div class="text item">
7后台菜单调整新增财务模块
</div>
<div class="text item">
8优化后台配置赋值写法
</div>
<div class="text item">
9修复管理后台新增表单之后如果直接再新增数据导致默认数据缺失问题#I1AFBK
</div>
<div class="text item">
10修复提交购物车可能查询多条数据的问题
</div>
<div class="text item">
11后台登陆背景图固定#I1A0LS
</div>
<div class="text item">
12增加常量与枚举优化硬编码问题
</div>
<div class="text item">
13微信支付公众号模板消息修改
</div>
<div class="text item">
14修复代码生成器不全的问题#I1AIO4
</div>
<div class="text item">
15修复营销产品拼团等轮播图不能修改的问题#I1AHXR
</div>
<div class="text item">
16移除yshop-monitor模块
</div>
<div class="text item">
17修复退货理由文字错误#I1AQ7D
</div>
<div class="text item">
1H5(公众号)端新增商品海报功能
18修复新增分类的图片自动显示上次一次的图片#I1AQBK
</div>
<div class="text item">
2管理后台配置新增排序与可隐藏选项同时移动端接口相应更新
19新增微信jssdk接口返回所需js权限
</div>
<div class="text item">
3去除小程序首页新闻轮播图标识
20新增余额充值变动模板消息通知
</div>
<div class="text item">
4修复小程序图片路径写死了问题(只能修改vue中的url,css中的需要自行替换)#I18KRS
21首页数据缓存优化
</div>
<div class="text item">
5修改小程序登录成功后跳到转个人中心问题 #I194VT
22新增未支付订单显示到期时间
</div>
<div class="text item">
6修复小程序申请退款页面图文#I197FG
23修复加入购物车购买后后台订单中的商品信息数据重复#I1AXNX
</div>
<div class="text item">
7修复砍价不能下单问题
24修复后台-管理商品-规格属性 属性无法删除问题#I1AYL2
</div>
<div class="text item">
<span style="font-weight: bolder">2020-02-07yshop1.9.5版本 发布更新如下</span>
25修复公众号商品直接微信分享标题不显示的问题#I1AX0R
</div>
<div class="text item">
1.H5(公众号)新增手机号绑定#I18IVP
<span style="font-weight: bolder">2020-02-24yshop修复优化版本 发布更新如下</span>
</div>
<div class="text item">
2.小程序新增手机号绑定接口(小程序待对接)
1.修复小程序积分支付功能#I1A03I
</div>
<div class="text item">
3.H5(公众号)端新增我的账户信息管理(头像等信息修改)
2.修复小程序砍价功能上面时间没有进行倒计时#I1A037
</div>
<div class="text item">
4.修复H5注册NULL问题
3.优化小程序底层导航栏适配ios#I1A1QX
</div>
<div class="text item">
5.修复小程序未付款订单支付问题#I18ZV5
4.修复小程序返回的问题#I1A036
</div>
<div class="text item">
<span style="font-weight: bolder">2020-02-06yshop1.9.4版本 发布更新如下</span>
5.修复小程序地址管理#I1A03U
</div>
<div class="text item">
1.后台砍价列表显示调整
6.调整小程序首页样式修改与H5保持同步
</div>
<div class="text item">
2.后台会员新增用户来源
7.H5首页数据加载顺序调整
</div>
<div class="text item">
3.小程序新增普通二维码功能
<span style="font-weight: bolder">2020-02-20yshop1.9.10版本 发布更新如下</span>
</div>
<div class="text item">
4.修复小程序砍价海报问题
1.小程序新增了商品详情海报功能
</div>
<div class="text item">
5.修复小程序首页滚动新闻不显示的问题
2.小程序新增了手机号绑定功能
</div>
<div class="text item">
6.修复小程序个人中心积分列表问题
3.修复小程序选择规格的问题#I19PD7
</div>
<div class="text item">
7.修复小程序购物车删除问题#I19176
4.修改移动端二维码海报生成拆分为H5端与小程序端
</div>
</el-card>
</div>

2
src/views/login.vue

@ -147,7 +147,7 @@ export default {
justify-content: center;
align-items: center;
height: 100%;
background-image:url(https://api.isoyu.com/bing_images.php);
background-image:url("../assets/images/bg.jpg");
background-size: cover;
}
.title {

5
src/views/shop/cate/index.vue

@ -100,14 +100,15 @@ export default {
},
watch: {
picArr: function(val) {
console.log();
this.form.pic = val.join(',')
}
},
methods: {
//
[CRUD.HOOK.afterToCU](crud, form) {
console.log(form)
if (form.pic) {
this.picArr = []
if (form.pic && form.id) {
this.picArr = form.pic.split(',')
}

3
src/views/shop/express/form.vue

@ -90,8 +90,7 @@ export default {
id: '',
code: '',
name: '',
sort: '',
isShow: ''
sort: 0
}
}
}

3
src/views/shop/goods/attr.vue

@ -36,7 +36,7 @@
:span="3"
:name="attr"
>
<el-tag closable @on-close="attrRemove(item,k)">{{ attr }}</el-tag>
<el-tag closable @close="attrRemove(item,k)">{{ attr }}</el-tag>
</el-col>
<el-col :span="5">
<el-input v-model="item.detailValue" style="width: 150px;" placeholder="设置属性" />
@ -330,6 +330,7 @@ export default {
if (this.items.length > 1) { this.items.splice(index, 1) } else { Message({ message: '请设置至少一个规则', type: 'error' }) }
},
attrRemove(item, k) {
console.log('item:')
if (item.detail.length == 1) {
Message({ message: '请设置至少一个属性', type: 'error' })
return false

43
src/views/shop/goods/form.vue

@ -208,7 +208,7 @@ export default {
this.$refs['form'].resetFields()
this.form = {
id: '',
merId: '',
merId: 0,
image: '',
sliderImage: '',
imageArr: [],
@ -217,34 +217,33 @@ export default {
storeInfo: '',
keyword: '',
barCode: '',
cateId: '',
price: '',
vipPrice: '',
otPrice: '',
postage: '',
cateId: 1,
price: 0,
vipPrice: 0,
otPrice: 0,
postage: 0,
unitName: '',
sort: '',
sort: 0,
sales: 0,
stock: 0,
isShow: 1,
isHot: 1,
isBenefit: 1,
isBest: 1,
isNew: 1,
isHot: 0,
isBenefit: 0,
isBest: 0,
isNew: 0,
description: '',
addTime: '',
isPostage: 1,
isDel: '',
merUse: '',
giveIntegral: '',
cost: '',
isSeckill: '',
isBargain: '',
isGood: '',
ficti: '',
browse: '',
isPostage: 0,
isDel: 0,
merUse: 0,
giveIntegral: 0,
cost: 0,
isSeckill: 0,
isBargain: 0,
isGood: 0,
ficti: 0,
browse: 0,
codePath: '',
soureLink: ''
}
},
getCates() {

158
src/views/shop/order/formC.vue

@ -0,0 +1,158 @@
<template>
<el-dialog :append-to-body="true" :close-on-click-modal="false" :before-close="cancel" :visible.sync="dialog" :title="isAdd ? '新增' : '订单核销'" width="500px">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="核销码">
<el-input v-model="form.verifyCode" style="width: 370px;" placeholder="请输入核销码" />
<p style="color: red">注意:请务必核对核销码的与客户正确性</p>
<p style="color: red">注意:手机端也可以核销去会员管理里把编辑相应会员开启商户管理即可</p>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancel">取消</el-button>
<el-button :loading="loading" type="primary" @click="doSubmit">确认</el-button>
</div>
</el-dialog>
</template>
<script>
import { add, editT, get } from '@/api/yxStoreOrder'
export default {
props: {
isAdd: {
type: Boolean,
required: true
}
},
data() {
return {
loading: false, dialog: false, express: [],
form: {
id: '',
deliveryName: '',
deliveryType: 'express',
deliveryId: ''
},
rules: {
unique: [
{ required: true, message: 'please enter', trigger: 'blur' }
]
}
}
},
created() {
this.get()
},
methods: {
cancel() {
this.resetForm()
},
doSubmit() {
this.loading = true
if (this.isAdd) {
this.doAdd()
} else this.doEdit()
},
doAdd() {
add(this.form).then(res => {
this.resetForm()
this.$notify({
title: '添加成功',
type: 'success',
duration: 2500
})
this.loading = false
this.$parent.init()
}).catch(err => {
this.loading = false
console.log(err.response.data.message)
})
},
doEdit() {
editT(this.form).then(res => {
this.resetForm()
this.$notify({
title: '操作成功',
type: 'success',
duration: 2500
})
this.loading = false
this.$parent.init()
}).catch(err => {
this.loading = false
console.log(err.response.data.message)
})
},
resetForm() {
this.dialog = false
this.$refs['form'].resetFields()
this.form = {
id: '',
orderId: '',
uid: '',
realName: '',
userPhone: '',
userAddress: '',
cartId: '',
freightPrice: '',
totalNum: '',
totalPrice: '',
totalPostage: '',
payPrice: '',
payPostage: '',
deductionPrice: '',
couponId: '',
couponPrice: '',
paid: '',
payTime: '',
payType: '',
addTime: '',
status: '',
refundStatus: '',
refundReasonWapImg: '',
refundReasonWapExplain: '',
refundReasonTime: '',
refundReasonWap: '',
refundReason: '',
refundPrice: '',
deliveryName: '',
deliveryType: '',
deliveryId: '',
gainIntegral: '',
useIntegral: '',
backIntegral: '',
mark: '',
isDel: '',
unique: '',
remark: '',
merId: '',
isMerCheck: '',
combinationId: '',
pinkId: '',
cost: '',
seckillId: '',
bargainId: '',
verifyCode: '',
storeId: '',
shippingType: '',
isChannel: '',
isRemind: '',
isSystemDel: ''
}
},
get() {
get().then(res => {
this.express = res.content
}).catch(err => {
this.loading = false
console.log(err.response.data.message)
})
}
}
}
</script>
<style scoped>
</style>

2
src/views/shop/order/index.vue

@ -54,7 +54,7 @@
<span>{{ item.cartInfoMap.productInfo.storeName }}&nbsp;{{ item.cartInfoMap.productInfo.attrInfo.suk }}</span>
<span> | {{ item.cartInfoMap.truePrice }}×{{ item.cartInfoMap.cartNum }}</span>
</div>
<div v-else v-for="(item,index) in scope.row.cartInfoList">
<div v-else>
<span><img
style="width: 30px;height: 30px;margin:0;cursor: pointer;"
:src="item.cartInfoMap.productInfo.image"

526
src/views/shop/order/indext.vue

@ -0,0 +1,526 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<el-input v-model="query.value" clearable placeholder="输入搜索内容" style="width: 200px;" class="filter-item" @keyup.enter.native="toQuery" />
<el-select v-model="query.type" clearable placeholder="类型" class="filter-item" style="width: 130px">
<el-option v-for="item in queryTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
<el-select v-model="status" clearable placeholder="订单状态" class="filter-item" style="width: 130px">
<el-option
v-for="item in statusOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="toQuery">搜索</el-button>
<!-- 新增 -->
</div>
<!--表单组件-->
<eForm ref="form" :is-add="isAdd" />
<eDetail ref="form1" :is-add="isAdd" />
<eRefund ref="form2" :is-add="isAdd" />
<editOrder ref="form3" :is-add="isAdd" />
<eRemark ref="form4" :is-add="isAdd" />
<!--表格渲染-->
<el-table v-loading="loading" :data="data" size="small" style="width: 100%;">
<el-table-column prop="orderId" width="140" label="订单号">
<template slot-scope="scope">
<span>{{ scope.row.orderId }}</span>
<p>{{ scope.row.pinkName }}</p>
</template>
</el-table-column>
<el-table-column prop="realName" label="用户姓名" />
<el-table-column prop="cartInfoList" width="300" label="商品信息">
<template slot-scope="scope">
<div v-for="(item,index) in scope.row.cartInfoList" v-if="item.cartInfoMap.productInfo.attrInfo">
<span>
<img
style="width: 30px;height: 30px;margin:0;cursor: pointer;"
:src="item.cartInfoMap.productInfo.attrInfo.image"
>
</span>
<span>{{ item.cartInfoMap.productInfo.storeName }}&nbsp;{{ item.cartInfoMap.productInfo.attrInfo.suk }}</span>
<span> | {{ item.cartInfoMap.truePrice }}×{{ item.cartInfoMap.cartNum }}</span>
</div>
<div v-else v-for="(item,index) in scope.row.cartInfoList">
<span><img
style="width: 30px;height: 30px;margin:0;cursor: pointer;"
:src="item.cartInfoMap.productInfo.image"
></span>
<span>{{ item.cartInfoMap.productInfo.storeName }}</span>
<span> | {{ item.cartInfoMap.truePrice }}×{{ item.cartInfoMap.cartNum }}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="payPrice" label="实际支付" />
<el-table-column prop="payTypeName" label="支付状态" />
<el-table-column prop="statusName" label="订单状态">
<template slot-scope="scope">
<span v-html="scope.row.statusName">{{ scope.row.addTime }}</span>
</template>
</el-table-column>
<el-table-column prop="addTime" width="160" label="创建时间">
<template slot-scope="scope">
<span>{{ formatTime(scope.row.addTime) }}</span>
</template>
</el-table-column>
<el-table-column v-if="checkPermission(['admin','YXSTOREORDER_ALL','YXSTOREORDER_EDIT','YXSTOREORDER_DELETE'])" label="操作" width="200" align="center" fixed="right">
<template slot-scope="scope">
<el-button
v-permission="['admin','YXSTOREORDER_ALL','YXSTOREORDER_EDIT']"
size="mini"
type="primary"
@click="detail(scope.row)"
>
订单详情</el-button>
<el-dropdown size="mini" split-button type="primary" trigger="click">
操作
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>
<el-button
v-permission="['admin','YXSTOREORDER_ALL','YXSTOREORDER_EDIT']"
size="mini"
type="success"
@click="remark(scope.row)"
>
订单备注</el-button>
</el-dropdown-item>
<el-dropdown-item>
<el-button
v-if="scope.row._status == 2"
v-permission="['admin','YXSTOREORDER_ALL','YXSTOREORDER_EDIT']"
size="mini"
type="primary"
@click="edit(scope.row)"
>
订单核销</el-button>
</el-dropdown-item>
<el-dropdown-item>
<el-button
v-if="scope.row._status == 3"
v-permission="['admin','YXSTOREORDER_ALL','YXSTOREORDER_EDIT']"
size="mini"
type="primary"
@click="refund(scope.row)"
>
立刻退款</el-button>
</el-dropdown-item>
<el-dropdown-item v-if="scope.row._status == 1">
<el-button
v-permission="['admin','YXSTOREORDER_ALL','YXSTOREORDER_EDIT']"
size="mini"
type="primary"
@click="editOrder(scope.row)"
>
修改订单</el-button>
</el-dropdown-item>
<el-dropdown-item v-if="scope.row._status == 1">
<el-popover
:ref="scope.row.id"
v-permission="['admin','YXSTOREORDER_ALL','YXSTOREORDER_DELETE']"
placement="top"
width="180"
>
<p>确定删除本条数据吗</p>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="$refs[scope.row.id].doClose()">取消</el-button>
<el-button :loading="delLoading" type="primary" size="mini" @click="subDelete(scope.row.id)">确定</el-button>
</div>
<el-button slot="reference" type="danger" icon="el-icon-delete" size="mini">删除</el-button>
</el-popover>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<el-pagination
:total="total"
:current-page="page + 1"
style="margin-top: 8px;"
layout="total, prev, pager, next, sizes"
@size-change="sizeChange"
@current-change="pageChange"
/>
</div>
</template>
<script>
import checkPermission from '@/utils/permission'
import initData from '@/mixins/crud'
import { del } from '@/api/yxStoreOrder'
import eForm from './formC'
import eDetail from './detail'
import eRefund from './refund'
import editOrder from './edit'
import eRemark from './remark'
import { formatTime } from '@/utils/index'
export default {
components: { eForm, eDetail, eRefund, editOrder, eRemark },
mixins: [initData],
data() {
return {
delLoading: false, status, orderType: '0',
queryTypeOptions: [
{ key: 'orderId', display_name: '订单号' },
{ key: 'realName', display_name: '用户姓名' },
{ key: 'userPhone', display_name: '用户电话' }
],
statusOptions: [
{ value: '0', label: '未支付' },
{ value: '1', label: '未发货' },
{ value: '2', label: '待收货' },
{ value: '3', label: '待评价' },
{ value: '4', label: '交易完成' },
// { value: '5', label: '' },
{ value: '-1', label: '退款中' },
{ value: '-2', label: '已退款' },
{ value: '-4', label: '已删除' }
]
}
},
created() {
this.$nextTick(() => {
this.init()
})
},
methods: {
formatTime,
checkPermission,
beforeInit() {
this.url = 'api/yxStoreOrder'
const sort = 'id,desc'
this.params = { page: this.page, size: this.size, sort: sort, orderStatus: this.status, orderType: 5 }
const query = this.query
const type = query.type
const value = query.value
if (type && value) { this.params[type] = value }
return true
},
subDelete(id) {
this.delLoading = true
del(id).then(res => {
this.delLoading = false
this.$refs[id].doClose()
this.dleChangePage()
this.init()
this.$notify({
title: '删除成功',
type: 'success',
duration: 2500
})
}).catch(err => {
this.delLoading = false
this.$refs[id].doClose()
console.log(err.response.data.message)
})
},
add() {
this.isAdd = true
this.$refs.form.dialog = true
},
edit(data) {
this.isAdd = false
const _this = this.$refs.form
_this.form = {
id: data.id,
orderId: data.orderId,
uid: data.uid,
realName: data.realName,
userPhone: data.userPhone,
userAddress: data.userAddress,
cartId: data.cartId,
freightPrice: data.freightPrice,
totalNum: data.totalNum,
totalPrice: data.totalPrice,
totalPostage: data.totalPostage,
payPrice: data.payPrice,
payPostage: data.payPostage,
deductionPrice: data.deductionPrice,
couponId: data.couponId,
couponPrice: data.couponPrice,
paid: data.paid,
payTime: data.payTime,
payType: data.payType,
addTime: data.addTime,
status: data.status,
refundStatus: data.refundStatus,
refundReasonWapImg: data.refundReasonWapImg,
refundReasonWapExplain: data.refundReasonWapExplain,
refundReasonTime: data.refundReasonTime,
refundReasonWap: data.refundReasonWap,
refundReason: data.refundReason,
refundPrice: data.refundPrice,
deliveryName: data.deliveryName,
deliveryType: data.deliveryType,
deliveryId: data.deliveryId,
gainIntegral: data.gainIntegral,
useIntegral: data.useIntegral,
backIntegral: data.backIntegral,
mark: data.mark,
isDel: data.isDel,
unique: data.unique,
remark: data.remark,
merId: data.merId,
isMerCheck: data.isMerCheck,
combinationId: data.combinationId,
pinkId: data.pinkId,
cost: data.cost,
seckillId: data.seckillId,
bargainId: data.bargainId,
verifyCode: data.verifyCode,
storeId: data.storeId,
shippingType: data.shippingType,
isChannel: data.isChannel,
isRemind: data.isRemind,
isSystemDel: data.isSystemDel
}
_this.dialog = true
},
editOrder(data) {
this.isAdd = false
const _this = this.$refs.form3
_this.form = {
id: data.id,
orderId: data.orderId,
uid: data.uid,
realName: data.realName,
userPhone: data.userPhone,
userAddress: data.userAddress,
cartId: data.cartId,
freightPrice: data.freightPrice,
totalNum: data.totalNum,
totalPrice: data.totalPrice,
totalPostage: data.totalPostage,
payPrice: data.payPrice,
payPostage: data.payPostage,
deductionPrice: data.deductionPrice,
couponId: data.couponId,
couponPrice: data.couponPrice,
paid: data.paid,
payTime: data.payTime,
payType: data.payType,
addTime: data.addTime,
status: data.status,
refundStatus: data.refundStatus,
refundReasonWapImg: data.refundReasonWapImg,
refundReasonWapExplain: data.refundReasonWapExplain,
refundReasonTime: data.refundReasonTime,
refundReasonWap: data.refundReasonWap,
refundReason: data.refundReason,
refundPrice: data.refundPrice,
deliveryName: data.deliveryName,
deliveryType: data.deliveryType,
deliveryId: data.deliveryId,
gainIntegral: data.gainIntegral,
useIntegral: data.useIntegral,
backIntegral: data.backIntegral,
mark: data.mark,
isDel: data.isDel,
unique: data.unique,
remark: data.remark,
merId: data.merId,
isMerCheck: data.isMerCheck,
combinationId: data.combinationId,
pinkId: data.pinkId,
cost: data.cost,
seckillId: data.seckillId,
bargainId: data.bargainId,
verifyCode: data.verifyCode,
storeId: data.storeId,
shippingType: data.shippingType,
isChannel: data.isChannel,
isRemind: data.isRemind,
isSystemDel: data.isSystemDel
}
_this.dialog = true
},
remark(data) {
this.isAdd = false
const _this = this.$refs.form4
_this.form = {
id: data.id,
orderId: data.orderId,
uid: data.uid,
realName: data.realName,
userPhone: data.userPhone,
userAddress: data.userAddress,
cartId: data.cartId,
freightPrice: data.freightPrice,
totalNum: data.totalNum,
totalPrice: data.totalPrice,
totalPostage: data.totalPostage,
payPrice: data.payPrice,
payPostage: data.payPostage,
deductionPrice: data.deductionPrice,
couponId: data.couponId,
couponPrice: data.couponPrice,
paid: data.paid,
payTime: data.payTime,
payType: data.payType,
addTime: data.addTime,
status: data.status,
refundStatus: data.refundStatus,
refundReasonWapImg: data.refundReasonWapImg,
refundReasonWapExplain: data.refundReasonWapExplain,
refundReasonTime: data.refundReasonTime,
refundReasonWap: data.refundReasonWap,
refundReason: data.refundReason,
refundPrice: data.refundPrice,
deliveryName: data.deliveryName,
deliveryType: data.deliveryType,
deliveryId: data.deliveryId,
gainIntegral: data.gainIntegral,
useIntegral: data.useIntegral,
backIntegral: data.backIntegral,
mark: data.mark,
isDel: data.isDel,
unique: data.unique,
remark: data.remark,
merId: data.merId,
isMerCheck: data.isMerCheck,
combinationId: data.combinationId,
pinkId: data.pinkId,
cost: data.cost,
seckillId: data.seckillId,
bargainId: data.bargainId,
verifyCode: data.verifyCode,
storeId: data.storeId,
shippingType: data.shippingType,
isChannel: data.isChannel,
isRemind: data.isRemind,
isSystemDel: data.isSystemDel
}
_this.dialog = true
},
refund(data) {
this.isAdd = false
const _this = this.$refs.form2
_this.form = {
id: data.id,
orderId: data.orderId,
uid: data.uid,
realName: data.realName,
userPhone: data.userPhone,
userAddress: data.userAddress,
cartId: data.cartId,
freightPrice: data.freightPrice,
totalNum: data.totalNum,
totalPrice: data.totalPrice,
totalPostage: data.totalPostage,
payPrice: data.payPrice,
payPostage: data.payPostage,
deductionPrice: data.deductionPrice,
couponId: data.couponId,
couponPrice: data.couponPrice,
paid: data.paid,
payTime: data.payTime,
payType: data.payType,
addTime: data.addTime,
status: data.status,
refundStatus: data.refundStatus,
refundReasonWapImg: data.refundReasonWapImg,
refundReasonWapExplain: data.refundReasonWapExplain,
refundReasonTime: data.refundReasonTime,
refundReasonWap: data.refundReasonWap,
refundReason: data.refundReason,
refundPrice: data.refundPrice,
deliveryName: data.deliveryName,
deliveryType: data.deliveryType,
deliveryId: data.deliveryId,
gainIntegral: data.gainIntegral,
useIntegral: data.useIntegral,
backIntegral: data.backIntegral,
mark: data.mark,
isDel: data.isDel,
unique: data.unique,
remark: data.remark,
merId: data.merId,
isMerCheck: data.isMerCheck,
combinationId: data.combinationId,
pinkId: data.pinkId,
cost: data.cost,
seckillId: data.seckillId,
bargainId: data.bargainId,
verifyCode: data.verifyCode,
storeId: data.storeId,
shippingType: data.shippingType,
isChannel: data.isChannel,
isRemind: data.isRemind,
isSystemDel: data.isSystemDel
}
_this.dialog = true
},
detail(data) {
this.isAdd = false
const _this = this.$refs.form1
_this.form = {
id: data.id,
orderId: data.orderId,
payTypeName: data.payTypeName,
statusName: data.statusName,
uid: data.uid,
realName: data.realName,
userPhone: data.userPhone,
userAddress: data.userAddress,
cartId: data.cartId,
freightPrice: data.freightPrice,
totalNum: data.totalNum,
totalPrice: data.totalPrice,
totalPostage: data.totalPostage,
payPrice: data.payPrice,
payPostage: data.payPostage,
deductionPrice: data.deductionPrice,
couponId: data.couponId,
couponPrice: data.couponPrice,
paid: data.paid,
payTime: data.payTime,
payType: data.payType,
addTime: data.addTime,
status: data.status,
refundStatus: data.refundStatus,
refundReasonWapImg: data.refundReasonWapImg,
refundReasonWapExplain: data.refundReasonWapExplain,
refundReasonTime: data.refundReasonTime,
refundReasonWap: data.refundReasonWap,
refundReason: data.refundReason,
refundPrice: data.refundPrice,
deliveryName: data.deliveryName,
deliveryType: data.deliveryType,
deliveryId: data.deliveryId,
gainIntegral: data.gainIntegral,
useIntegral: data.useIntegral,
backIntegral: data.backIntegral,
mark: data.mark,
isDel: data.isDel,
unique: data.unique,
remark: data.remark,
merId: data.merId,
isMerCheck: data.isMerCheck,
combinationId: data.combinationId,
pinkId: data.pinkId,
cost: data.cost,
seckillId: data.seckillId,
bargainId: data.bargainId,
verifyCode: data.verifyCode,
storeId: data.storeId,
shippingType: data.shippingType,
isChannel: data.isChannel,
isRemind: data.isRemind,
isSystemDel: data.isSystemDel
}
_this.dialog = true
}
}
}
</script>
<style scoped>
</style>

99
src/views/shop/recharge/index.vue

@ -0,0 +1,99 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-input v-model="query.value" clearable placeholder="输入搜索内容" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<el-select v-model="query.type" clearable placeholder="类型" class="filter-item" style="width: 130px">
<el-option v-for="item in queryTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" />
</el-select>
<rrOperation :crud="crud" />
</div>
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
<crudOperation :permission="permission" />
<!--表单组件-->
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="500px">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="small" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
<el-table-column type="selection" width="55" />
<el-table-column v-if="columns.visible('id')" prop="id" label="id" width="75px" />
<el-table-column v-if="columns.visible('nickname')" prop="nickname" label="昵称" width="100px" />
<el-table-column v-if="columns.visible('orderId')" prop="orderId" label="订单号" />
<el-table-column v-if="columns.visible('price')" prop="price" label="充值金额" width="100px" />
<el-table-column v-if="columns.visible('rechargeType')" prop="rechargeType" label="充值类型" width="100px" />
<el-table-column v-if="columns.visible('paid')" prop="paid" label="是否支付" width="100px">
<template slot-scope="scope">
<span v-if="scope.row.paid == 1"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column v-if="columns.visible('payTime')" prop="payTime" label="支付时间" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.payTime) }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns.visible('addTime')" prop="addTime" label="充值时间" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.addTime) }}</span>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<pagination />
</div>
</div>
</template>
<script>
import crudYxUserRecharge from '@/api/yxUserRecharge'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
// crudpresenter
const defaultCrud = CRUD({ title: '充值管理', url: 'api/yxUserRecharge', sort: 'id,desc', crudMethod: { ...crudYxUserRecharge }, optShow: { add: false, edit: false, del: true, download: true}})
const defaultForm = { id: null, uid: null, orderId: null, price: null, rechargeType: null, paid: null, payTime: null, addTime: null, refundPrice: null, nickname: null }
export default {
name: 'YxUserRecharge',
components: { pagination, crudOperation, rrOperation, udOperation },
mixins: [presenter(defaultCrud), header(), form(defaultForm), crud()],
data() {
return {
permission: {
add: ['admin', 'yxUserRecharge:add'],
edit: ['admin', 'yxUserRecharge:edit'],
del: ['admin', 'yxUserRecharge:del']
},
rules: {
},
queryTypeOptions: [
{ key: 'nickname', display_name: '昵称' }
]
}
},
methods: {
//
[CRUD.HOOK.beforeRefresh]() {
const query = this.query
if (query.type && query.value) {
this.crud.params[query.type] = query.value
}
return true
}
}
}
</script>
<style scoped>
</style>

10
src/views/shop/set/form.vue

@ -112,11 +112,13 @@ export default {
this.form = {
id: '',
groupName: 'routine_home_banner',
name: '',
url: '',
wxapp_url: '',
pic: '',
imageArr: [],
value: '',
addTime: '',
sort: '',
status: ''
sort: 0,
status: 1
}
}
}

7
src/views/shop/set/hotform.vue

@ -91,10 +91,9 @@ export default {
this.form = {
id: '',
groupName: 'routine_hot_search',
value: '',
addTime: '',
sort: '',
status: ''
title: '',
sort: 0,
status: 1
}
}
}

10
src/views/shop/set/menuform.vue

@ -112,11 +112,13 @@ export default {
this.form = {
id: '',
groupName: 'routine_home_menus',
name: '',
url: '',
wxapp_url: '',
pic: '',
imageArr: [],
value: '',
addTime: '',
sort: '',
status: ''
sort: 0,
status: 1
}
}
}

9
src/views/shop/set/rollform.vue

@ -99,10 +99,11 @@ export default {
this.form = {
id: '',
groupName: 'routine_home_roll_news',
value: '',
addTime: '',
sort: '',
status: ''
info: '',
wxapp_url: '',
url: '',
sort: 0,
status: 1
}
}
}

6
src/views/shop/set/seckillform.vue

@ -86,10 +86,8 @@ export default {
this.form = {
id: '',
groupName: 'routine_seckill_time',
value: '',
addTime: '',
sort: '',
status: ''
time: 5,
continued: 2
}
}
}

8
src/views/shop/set/signform.vue

@ -95,10 +95,10 @@ export default {
this.form = {
id: '',
groupName: 'sign_day_num',
value: '',
addTime: '',
sort: '',
status: ''
day: 1,
sign_num: 0,
sort: 0,
status: 1
}
}
}

10
src/views/shop/set/usermenuform.vue

@ -52,8 +52,8 @@ export default {
wxapp_url: '',
pic: '',
imageArr: [],
sort: '',
status: ''
sort: 0,
status: 1
},
rules: {
}
@ -112,9 +112,11 @@ export default {
this.form = {
id: '',
groupName: 'routine_my_menus',
name: '',
url: '',
wxapp_url: '',
pic: '',
imageArr: [],
value: '',
addTime: '',
sort: 0,
status: 1
}

171
src/views/shop/store/index.vue

@ -0,0 +1,171 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="150px">
<el-form-item label="门店名称" prop="name">
<el-input v-model="form.name" style="width: 370px;" />
</el-form-item>
<el-form-item label="门店简介" prop="introduction">
<el-input v-model="form.introduction" style="width: 370px;" />
</el-form-item>
<el-form-item label="门店手机" prop="phone">
<el-input v-model="form.phone" style="width: 370px;" />
</el-form-item>
<el-form-item label="门店地址" prop="address">
<el-input v-model="form.address" style="width: 370px;" />
<el-button :loading="loading" size="medium" type="primary" @click="getL(form.address)">获取经纬度</el-button>
</el-form-item>
<el-form-item label="门店logo" prop="image">
<MaterialList v-model="form.imageArr" style="width: 370px" type="image" :num="1" :width="150" :height="150" />
</el-form-item>
<el-form-item label="纬度" prop="latitude">
<el-input v-model="form.latitude" :disabled="true" style="width: 370px;" />
</el-form-item>
<el-form-item label="经度" prop="longitude">
<el-input v-model="form.longitude" :disabled="true" style="width: 370px;" />
</el-form-item>
<el-form-item label="核销时效" prop="validTime">
<el-date-picker
@change="getTimeT"
style="width: 370px;"
v-model="form.validTimeArr"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="营业时间" prop="dayTime">
<el-time-picker
@change="getTime"
style="width: 370px;"
is-range
v-model="form.dayTimeArr"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围">
</el-time-picker>
</el-form-item>
<el-form-item label="">
<el-button :loading="loading" size="medium" type="primary" @click="doSubmit">保存配置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import { get, update, getL } from '@/api/yxSystemStore'
import MaterialList from '@/components/material'
import { parseTime } from '@/utils/index'
export default {
name: 'YxSystemStore',
components: { MaterialList },
data() {
return {
loading: false,
form: { id:null, name: '', introduction: '', phone: '', address: '', detailedAddress: '', image: '' ,
latitude: '', longitude: '', validTime: '', dayTime: '', validTimeStart: null, validTimeEnd: null,
dayTimeStart: null, dayTimeEnd: null, dayTimeArr: [new Date(),new Date()], validTimeArr: [], imageArr: []},
rules: {
name: [
{ required: true, message: '门店名称不能为空', trigger: 'blur' }
],
introduction: [
{ required: true, message: '简介不能为空', trigger: 'blur' }
],
phone: [
{ required: true, message: '手机号码不能为空', trigger: 'blur' }
],
address: [
{ required: true, message: '省市区不能为空', trigger: 'blur' }
],
latitude: [
{ required: true, message: '纬度不能为空', trigger: 'blur' }
],
longitude: [
{ required: true, message: '经度不能为空', trigger: 'blur' }
],
validTime: [
{ required: true, message: '核销有效日期不能为空', trigger: 'blur' }
],
dayTime: [
{ required: true, message: '每日营业开关时间不能为空', trigger: 'blur' }
]
}
}
},
watch: {
'form.imageArr': function(val) {
console.log(222)
if (val) {
console.log(val)
this.form.image = val.join(',')
}
}
},
created() {
this.init()
},
methods: {
init() {
get().then(res => {
if(res.content.length > 0){
const con = res.content[0]
this.form = con
this.form.imageArr = [con.image]
this.form.dayTimeArr = [con.dayTimeStart,con.dayTimeEnd]
this.form.validTimeArr = [con.validTimeStart,con.validTimeEnd]
}
})
},
doSubmit() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true
this.form.image = this.form.imageArr.join(',')
update(this.form).then(res => {
this.$notify({
title: '保存成功',
type: 'success',
duration: 2500
})
this.loading = false
}).catch(err => {
this.loading = false
console.log(err.response.data.message)
})
} else {
return false
}
})
},
getTime(t) {
this.form.dayTimeStart = t[0]
this.form.dayTimeEnd = t[1]
this.form.dayTime = parseTime(t[0],'{h}:{i}:{s}') + ' - ' + parseTime(t[1],'{h}:{i}:{s}')
},
getTimeT(t) {
this.form.validTimeStart = t[0]
this.form.validTimeEnd = t[1]
this.form.validTime = parseTime(t[0],'{y}-{m}-{d}') + ' - ' + parseTime(t[1],'{y}-{m}-{d}')
},
getL(addr) {
getL({addr}).then(res => {
this.form.latitude = res.result.location.lat
this.form.longitude = res.result.location.lng
})
}
}
}
</script>
<style scoped>
</style>

70
src/views/shop/store/set.vue

@ -0,0 +1,70 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="150px">
<el-form-item label="开启门店自提">
<el-radio v-model="form.store_self_mention" :label="1">开启</el-radio>
<el-radio v-model="form.store_self_mention" :label="2">关闭</el-radio>
</el-form-item>
<el-form-item label="腾讯地图KEY">
<el-input v-model="form.tengxun_map_key" style="width: 370px;" />
</el-form-item>
<el-form-item label="">
<el-button type="primary" @click="doSubmit">提交</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import checkPermission from '@/utils/permission'
import initData from '@/mixins/crud'
import { del, add, get } from '@/api/yxSystemConfig'
import { Message } from 'element-ui'
export default {
mixins: [initData],
data() {
return {
delLoading: false,
form: {
store_self_mention: 1,
tengxun_map_key: ''
},
rules: {
}
}
},
created() {
get().then(rese => {
const that = this
rese.content.map(function(key, value) {
const keyName = key.menuName
const newValue = key.value
if(keyName in that.form){
that.form[keyName] = newValue
}
})
this.form.store_self_mention = parseInt(this.form.store_self_mention)
})
},
methods: {
checkPermission,
doSubmit() {
add(this.form).then(res => {
Message({ message: '设置成功', type: 'success' })
}).catch(err => {
// this.loading = false
console.log(err.response.data.message)
})
}
}
}
</script>
<style scoped>
</style>

8
src/views/shop/userlevel/form.vue

@ -137,17 +137,17 @@ export default {
name: '',
money: '',
validDate: '',
isForever: '',
isForever: 1,
isPay: '',
isShow: '',
isShow: 1,
grade: '',
discount: '',
image: '',
icon: '',
explain: '',
addTime: '',
imageArr: [],
iconArr: [],
explain: '',
addTime: '',
isDel: ''
}
}

8
src/views/wechat/config/index.vue

@ -79,13 +79,15 @@ export default {
},
created() {
get().then(rese => {
const newObj = {}
const that = this
rese.content.map(function(key, value) {
const keyName = key.menuName
newObj[keyName] = key.value
const newValue = key.value
if(keyName in that.form){
that.form[keyName] = newValue
}
})
this.form = newObj
this.form.imageArr = this.form.wechat_share_img.split(',')
})
},

9
src/views/wechat/config/pay.vue

@ -48,13 +48,14 @@ export default {
},
created() {
get().then(rese => {
const newObj = {}
const that = this
rese.content.map(function(key, value) {
const keyName = key.menuName
newObj[keyName] = key.value
const newValue = key.value
if(keyName in that.form){
that.form[keyName] = newValue
}
})
this.form = newObj
})
},
methods: {

20
src/views/wechat/config/point.vue

@ -5,6 +5,14 @@
<el-input v-model="form.integral_ratio" style="width: 370px;" />
<p style="color: red">积分抵用比例(1积分抵多少金额)</p>
</el-form-item>
<el-form-item label="满多少可以抵扣">
<el-input v-model="form.integral_full" style="width: 370px;" />
<p style="color: red">消费必须满一定额度才可使用,0代表无限制</p>
</el-form-item>
<el-form-item label="单次最大抵扣积分">
<el-input v-model="form.integral_max" style="width: 370px;" />
<p style="color: red">限制一次只能使用多少积分,0代表无限制</p>
</el-form-item>
<el-form-item label="">
<el-button type="primary" @click="doSubmit">提交</el-button>
</el-form-item>
@ -26,7 +34,9 @@ export default {
return {
delLoading: false,
form: {
integral_ratio: ''
integral_ratio: '',
integral_full: 0,
integral_max: 0
},
rules: {
}
@ -34,13 +44,15 @@ export default {
},
created() {
get().then(rese => {
const newObj = {}
const that = this
rese.content.map(function(key, value) {
const keyName = key.menuName
newObj[keyName] = key.value
const newValue = key.value
if(keyName in that.form){
that.form[keyName] = newValue
}
})
this.form = newObj
})
},
methods: {

12
src/views/wechat/config/postage.vue

@ -29,7 +29,8 @@ export default {
return {
delLoading: false,
form: {
integral_ratio: ''
store_postage: '',
store_free_postage: ''
},
rules: {
}
@ -37,13 +38,14 @@ export default {
},
created() {
get().then(rese => {
const newObj = {}
const that = this
rese.content.map(function(key, value) {
const keyName = key.menuName
newObj[keyName] = key.value
const newValue = key.value
if(keyName in that.form){
that.form[keyName] = newValue
}
})
this.form = newObj
})
},
methods: {

15
src/views/wechat/config/promoter.vue

@ -1,6 +1,10 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="150px">
<el-form-item label="分销开关">
<el-radio v-model="form.store_brokerage_open" :label="1">开启</el-radio>
<el-radio v-model="form.store_brokerage_open" :label="2">关闭</el-radio>
</el-form-item>
<el-form-item label="分销模式">
<el-radio v-model="form.store_brokerage_statu" :label="1">指定分销</el-radio>
<el-radio v-model="form.store_brokerage_statu" :label="2">人人分销</el-radio>
@ -43,6 +47,7 @@ export default {
return {
delLoading: false,
form: {
store_brokerage_open: 1,
store_brokerage_statu: 2,
store_brokerage_ratio: 0,
store_brokerage_two: 0,
@ -56,13 +61,17 @@ export default {
},
created() {
get().then(rese => {
const newObj = {}
const that = this;
rese.content.map(function(key, value) {
const keyName = key.menuName
newObj[keyName] = key.value
const newValue = key.value
if(keyName in that.form){
that.form[keyName] = newValue
}
})
this.form = newObj
this.form.store_brokerage_statu = parseInt(this.form.store_brokerage_statu)
this.form.store_brokerage_open = parseInt(this.form.store_brokerage_open)
})
},
methods: {

9
src/views/wechat/config/wxapp.vue

@ -39,13 +39,14 @@ export default {
},
created() {
get().then(rese => {
const newObj = {}
const that = this
rese.content.map(function(key, value) {
const keyName = key.menuName
newObj[keyName] = key.value
const newValue = key.value
if(keyName in that.form){
that.form[keyName] = newValue
}
})
this.form = newObj
})
},
methods: {

4
vue.config.js

@ -14,14 +14,14 @@ module.exports = {
publicPath: '/',
outputDir: 'dist',
assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development',
lintOnSave: false,
productionSourceMap: false,
devServer: {
port: port,
open: true,
overlay: {
warnings: false,
errors: false
errors: true
},
proxy: {
'/api': {

Loading…
Cancel
Save