Browse Source

yshop3.0-alpha版本

master
hupeng 4 years ago
parent
commit
329d1e1de3
  1. 135
      README.md
  2. 1
      src/components/material/index.vue
  3. 2
      src/settings.js
  4. 3
      src/utils/index.js
  5. 4
      src/views/activity/bargain/form.vue
  6. 4
      src/views/activity/combination/form.vue
  7. 8
      src/views/activity/coupon/form.vue
  8. 2
      src/views/activity/coupon/index.vue
  9. 4
      src/views/activity/couponissue/form.vue
  10. 2
      src/views/activity/extract/form.vue
  11. 2
      src/views/activity/extract/index.vue
  12. 4
      src/views/activity/seckill/form.vue
  13. 4
      src/views/activity/seckill/index.vue
  14. 18
      src/views/shop/goods/form.vue
  15. 8
      src/views/shop/goods/tab.vue
  16. 2
      src/views/shop/order/detail.vue
  17. 9
      src/views/shop/order/index.vue
  18. 3
      src/views/shop/order/indext.vue
  19. 8
      src/views/shop/recharge/index.vue
  20. 2
      src/views/shop/reply/index.vue
  21. 6
      src/views/shop/storestaff/index.vue
  22. 22
      src/views/shop/user/bill.vue
  23. 207
      src/views/shop/user/brobill.vue
  24. 4
      src/views/shop/user/index.vue
  25. 207
      src/views/shop/user/pobill.vue
  26. 9
      src/views/shop/userlevel/form.vue
  27. 4
      src/views/shop/usertask/form.vue
  28. 74
      src/views/wechat/config/express.vue
  29. 16
      src/views/wechat/config/promoter.vue
  30. 78
      src/views/wechat/config/shop.vue
  31. 86
      src/views/wechat/config/sms.vue
  32. 5
      src/views/wechat/template/form.vue
  33. 1
      src/views/wechat/template/index.vue

135
README.md

@ -6,39 +6,8 @@ yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2
**开发文档** 【[查看文档](https://gitee.com/guchengwuyue/yshopmall/wikis/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83?sort_id=1718722)】
#### 体验地址
#### 官网地址:https://www.yixiang.co
| | 后台系统 | 前端(公众号+小程序(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") |
#### 项目源码
| | 后台系统源码 | 后台系统前端源码 |
|--- |--- | --- |
| 码云 | https://gitee.com/guchengwuyue/yshopmall | https://gitee.com/guchengwuyue/yshopmall_qd |
| github | https://github.com/guchengwuyue/yshopmall |https://github.com/guchengwuyue/yshopmall_qd |
#### 开源版本与VIP版本说明
### 开源版
1.包括整个商城系统后台、数据库
2.开源整个商城的管理后台(后台已经封装好了图片素材库、编辑器、配置等等组件), 它可以用于所有的Web应用程序,如网站商城管理后台,网站会员中心,
CMS,CRM,OA等等本版本本身属于独立后台商城管理系统;
3.可以个人、企业直接使用。
### VIP版
1.包括了开源版,还包括了移动端(H5+公众号)、小程序(mpvue2框架)、移动端API
2.本版本是演示的所有功能代码;
3.加入VIP、享有后续所有功能免费升级及其技术支持等。
4、VIP为终身,【[详情请查看](https://gitee.com/guchengwuyue/yshopmall/wikis/pages?sort_id=1715823&doc_id=441578)】
## 商城功能
@ -56,55 +25,24 @@ CMS,CRM,OA等等本版本本身属于独立后台商城管理系统;
#### 项目结构
项目采用分模块开发方式
- yshop-api 移动端API模块
- yshop-mp 微信相关模块
- yshop-app 移动端API模块(H5+uniapp端的API)
- yshop-admin 管理后台模块
- yshop-weixin 微信相关模块
- yshop-mall 商城公共模块
- yshop-shop 后台商城模块
- yshop-message 消息队列模块
- yshop-common 公共模块
- yshop-system 后台模块
- yshop-logging 日志模块
- yshop-tools 第三方工具模块
- yshop-generator 代码生成模块
- yshop-shop 商城模块
- yshop-mproot mybatisPlus配置模块
#### 系统预览
<table>
<tr>
<td><img src="https://images.gitee.com/uploads/images/2019/1107/194017_9207632f_477893.png"/></td>
<td><img src="https://images.gitee.com/uploads/images/2019/1121/230257_5844f5f1_477893.png"/></td>
</tr>
<tr>
<td><img src="https://images.gitee.com/uploads/images/2019/1121/230051_971db503_477893.png"/></td>
<td><img src="https://images.gitee.com/uploads/images/2019/1121/230342_f379583e_477893.png"/></td>
</tr>
<tr>
<td><img src="https://images.gitee.com/uploads/images/2019/1121/230224_5f0dec5d_477893.png"/></td>
<td><img src="https://images.gitee.com/uploads/images/2019/1107/194207_7b3b1f53_477893.png"/></td>
</tr>
<tr>
<td><img src="https://images.gitee.com/uploads/images/2019/1121/230424_f01fca77_477893.png"/></td>
<td><img src="https://images.gitee.com/uploads/images/2019/1127/211402_4103f8e0_477893.png"/></td>
</tr>
</table>
<table>
<tr>
<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>
<td><img src="https://images.gitee.com/uploads/images/2019/1129/234601_7fb028a6_477893.jpeg"/></td>
<td><img src="https://images.gitee.com/uploads/images/2019/1129/234622_6f593729_477893.jpeg"/></td>
</tr>
<tr>
<td><img src="https://images.gitee.com/uploads/images/2019/1130/114845_9ed3c82c_477893.jpeg"/></td>
<td><img src="https://images.gitee.com/uploads/images/2019/1129/234703_49e8fe4f_477893.jpeg"/></td>
</tr>
</table>
## 技术选型
* 1 后端使用技术
* 1.1 SpringBoot2
* 1.2 mybatis、MyBatis-Plus
* 1.3 SpringSecurity
* 1.4 JPA
* 1.5 Druid
* 1.6 Slf4j
* 1.7 Fastjson
@ -123,60 +61,5 @@ CMS,CRM,OA等等本版本本身属于独立后台商城管理系统;
* 前端使用技术
* 2.1 Vue 全家桶
* 2.2 Element
* 2.3 mpvue
#### 项目发布明细
- 1.0版本
- 1.1版本新增积分与优惠券抵扣
- 1.2版本分销功能已经发布
- 1.2.1增加了未付款订单取消功能库存销量退出、优惠券、积分功能,个人中心增加了积分流水
- 1.3版本新增拼团功能,已经发布
- 1.3.1版本手机端新增商户管理、后台新增统计
- 1.3.2新增后台微信相关及其支付配置,新增自动回复配置
- 1.3.3新增 后台微信图文发送功能,小程序配置,增加小程序授权等,修复一些bug等
- yshop1.6.1发布:新增移动端浏览记录,下单增加简单ReentrantLock锁
- yshop1.6.2发布:修复用户昵称带有表情导致入库失败问题,修复下单订单金额为0不能支付的问题
- yshop1.6.4发布:后台新增修改订单价格与备注优化订单详情显示明细,修复积分记录标题不显示的问题
- 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
#### 反馈交流
- QQ交流群:964166879
- 喜欢这个商城后台的小伙伴留下你的小星星啦,star,star哦!
* 2.3 uniapp
#### 特别鸣谢
- eladmin:https://github.com/elunez/eladmin
- mybaitsplus:https://github.com/baomidou/mybatis-plus
- hutool:https://github.com/looly/hutool
- wxjava:https://github.com/Wechat-Group/WxJava
- vue:https://github.com/vuejs/vue
- element:https://github.com/ElemeFE/element

1
src/components/material/index.vue

@ -79,6 +79,7 @@
:on-progress="handleProgress"
:before-upload="beforeUpload"
:on-success="handleSuccess"
:data="{type: 1}"
multiple
>
<el-button size="small" type="primary">批量上传</el-button>

2
src/settings.js

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

3
src/utils/index.js

@ -92,7 +92,8 @@ export function formatTime(time, option) {
}
export function formatTimeTwo(time) {
time = time * 1000
if(time == null) return "无"
//time = time * 1000
const d = new Date(time)
return (
d.getFullYear() + '年' +

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

@ -14,7 +14,7 @@
<el-form-item label="活动开始时间">
<template>
<el-date-picker
v-model="form.startTimeDate"
v-model="form.startTime"
type="datetime"
placeholder="选择日期时间"
/>
@ -23,7 +23,7 @@
<el-form-item label="活动结束时间">
<template>
<el-date-picker
v-model="form.endTimeDate"
v-model="form.stopTime"
type="datetime"
placeholder="选择日期时间"
/>

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

@ -13,7 +13,7 @@
<el-form-item label="拼团开始时间">
<template>
<el-date-picker
v-model="form.startTimeDate"
v-model="form.startTime"
type="datetime"
placeholder="选择日期时间"
/>
@ -22,7 +22,7 @@
<el-form-item label="拼团结束时间">
<template>
<el-date-picker
v-model="form.endTimeDate"
v-model="form.stopTime"
type="datetime"
placeholder="选择日期时间"
/>

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

@ -5,16 +5,16 @@
<el-input v-model="form.title" style="width: 300px;" />
</el-form-item>
<el-form-item label="优惠券面值">
<el-input v-model="form.couponPrice" style="width: 300px;" />
<el-input-number v-model="form.couponPrice" style="width: 300px;" />
</el-form-item>
<el-form-item label="优惠券最低消费">
<el-input v-model="form.useMinPrice" style="width: 300px;" />
<el-input-number v-model="form.useMinPrice" style="width: 300px;" />
</el-form-item>
<el-form-item label="优惠券有效期限(天)">
<el-input v-model="form.couponTime" style="width: 300px;" />
<el-input-number v-model="form.couponTime" style="width: 300px;" />
</el-form-item>
<el-form-item label="排序">
<el-input v-model="form.sort" style="width: 300px;" />
<el-input-number v-model="form.sort" style="width: 300px;" />
</el-form-item>
<el-form-item label="状态">
<el-radio v-model="form.status" :label="1">开启</el-radio>

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

@ -39,7 +39,7 @@
</el-table-column>
<el-table-column prop="addTime" label="创建时间">
<template slot-scope="scope">
<span>{{ formatTime(scope.row.addTime) }}</span>
<span>{{ scope.row.createTime }}</span>
</template>
</el-table-column>
<el-table-column v-if="checkPermission(['admin','YXSTORECOUPON_ALL','YXSTORECOUPON_EDIT','YXSTORECOUPON_DELETE'])" width="200" label="操作" align="center">

4
src/views/activity/couponissue/form.vue

@ -10,7 +10,7 @@
<el-form-item label="领取开启时间">
<template>
<el-date-picker
v-model="form.startTimeDate"
v-model="form.startTime"
type="datetime"
placeholder="选择日期时间"
/>
@ -19,7 +19,7 @@
<el-form-item label="券领结束时间">
<template>
<el-date-picker
v-model="form.endTimeDate"
v-model="form.endTime"
type="datetime"
placeholder="选择日期时间"
/>

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

@ -5,7 +5,7 @@
<el-input v-model="form.realName" style="width: 370px;" />
</el-form-item>
<el-form-item label="提现金额">
<el-input v-model="form.extractPrice" style="width: 370px;" />
<el-input-number v-model="form.extractPrice" style="width: 370px;" />
</el-form-item>
<el-form-item label="审核状态">
<el-radio v-model="form.status" :label="-1">无效</el-radio>

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

@ -37,7 +37,7 @@
</el-table-column>
<el-table-column prop="addTime" label="添加时间">
<template slot-scope="scope">
<span>{{ formatTimeTwo(scope.row.addTime) }}</span>
<span>{{ formatTimeTwo(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column prop="status" label="审核状态">

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

@ -13,7 +13,7 @@
<el-form-item label="秒杀开始时间">
<template>
<el-date-picker
v-model="form.startTimeDate"
v-model="form.startTime"
type="date"
placeholder="选择日期时间"
/>
@ -22,7 +22,7 @@
<el-form-item label="秒杀结束时间">
<template>
<el-date-picker
v-model="form.endTimeDate"
v-model="form.stopTime"
type="date"
placeholder="选择日期时间"
/>

4
src/views/activity/seckill/index.vue

@ -155,8 +155,8 @@ export default {
unitName: data.unitName,
postage: data.postage,
description: data.description,
startTimeDate: new Date(data.startTimeDate),
endTimeDate: new Date(data.endTimeDate),
startTime: data.startTime,
stopTime: data.stopTime,
addTime: data.addTime,
status: data.status,
isPostage: data.isPostage,

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

@ -29,25 +29,25 @@
<editor v-model="form.description" />
</el-form-item>
<el-form-item label="商品价格">
<el-input v-model="form.price" />
<el-input-number v-model="form.price" />
</el-form-item>
<el-form-item label="市场价">
<el-input v-model="form.otPrice" />
<el-input-number v-model="form.otPrice" />
</el-form-item>
<el-form-item label="成本价">
<el-input v-model="form.cost" />
<el-input-number v-model="form.cost" />
</el-form-item>
<el-form-item label="邮费">
<el-input v-model="form.postage" />
<el-input-number v-model="form.postage" />
</el-form-item>
<el-form-item label="排序">
<el-input v-model="form.sort" />
<el-input-number v-model="form.sort" />
</el-form-item>
<el-form-item label="销量">
<el-input v-model="form.sales" />
<el-input-number v-model="form.sales" />
</el-form-item>
<el-form-item label="库存">
<el-input v-model="form.stock" />
<el-input-number v-model="form.stock" />
</el-form-item>
<el-form-item label="热卖单品">
<el-radio v-model="form.isHot" :label="1"></el-radio>
@ -74,10 +74,10 @@
<el-radio v-model="form.isGood" :label="0" style="width: 200px;"></el-radio>
</el-form-item>
<el-form-item label="获得积分">
<el-input v-model="form.giveIntegral" />
<el-input-number v-model="form.giveIntegral" />
</el-form-item>
<el-form-item label="虚拟销量">
<el-input v-model="form.ficti" />
<el-input-number v-model="form.ficti" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">

8
src/views/shop/goods/tab.vue

@ -6,20 +6,16 @@
<el-tab-pane label="待上架产品" name="second">
<unonSale ref="unonSale" />
</el-tab-pane>
<el-tab-pane label="产品回收站" name="thrid">
<recycle ref="recycle" />
</el-tab-pane>
</el-tabs>
</template>
<script>
import onSale from '@/views/shop/goods/index'
import unonSale from '@/views/shop/goods/index2'
import recycle from '@/views/shop/goods/index3'
import '@/assets/styles/description.scss'
export default {
name: 'Tab',
components: { onSale, unonSale, recycle },
components: { onSale, unonSale },
data() {
return {
activeName: 'first'
@ -31,8 +27,6 @@ export default {
this.$refs.onSale.init()
} else if (this.activeName === 'second') {
this.$refs.unonSale.init()
} else {
this.$refs.recycle.init()
}
}
}

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

@ -25,7 +25,7 @@
<div class="text item">订单状态: {{ form.statusName }}</div>
<div class="text item">商品总价: {{ form.totalPrice }}</div>
<div class="text item">优惠券金额: {{ form.couponPrice }}</div>
<div class="text item">创建时间: {{ parseTime(form.addTime) }}</div>
<div class="text item">创建时间: {{ parseTime(form.createTime) }}</div>
<div class="text item">支付时间: {{ parseTime(form.payTime) }}</div>
</el-col>
</el-row>

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

@ -27,9 +27,6 @@
<el-tab-pane name="-2">
<span slot="label"><i class="el-icon-finished"></i> 已退款</span>
</el-tab-pane>
<el-tab-pane name="-4">
<span slot="label"><i class="el-icon-circle-close"></i> 已删除</span>
</el-tab-pane>
</el-tabs>
<!--工具栏-->
<div class="head-container">
@ -124,12 +121,12 @@
<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>
<span v-html="scope.row.statusName"></span>
</template>
</el-table-column>
<el-table-column prop="addTime" width="160" label="创建时间">
<template slot-scope="scope">
<span>{{ formatTime(scope.row.addTime) }}</span>
<span>{{ formatTime(scope.row.createTime) }}</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">
@ -599,7 +596,7 @@
paid: data.paid,
payTime: data.payTime,
payType: data.payType,
addTime: data.addTime,
createTime: data.createTime,
status: data.status,
refundStatus: data.refundStatus,
refundReasonWapImg: data.refundReasonWapImg,

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

@ -23,9 +23,6 @@
<el-tab-pane name="-2">
<span slot="label"><i class="el-icon-finished"></i> 已退款</span>
</el-tab-pane>
<el-tab-pane name="-4">
<span slot="label"><i class="el-icon-circle-close"></i> 已删除</span>
</el-tab-pane>
</el-tabs>
<!--工具栏-->
<div class="head-container">

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

@ -37,12 +37,12 @@
</el-table-column>
<el-table-column v-if="columns.visible('payTime')" prop="payTime" label="支付时间" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.payTime) }}</span>
<span>{{ formatTimeTwo(scope.row.payTime) }}</span>
</template>
</el-table-column>
<el-table-column v-if="columns.visible('addTime')" prop="addTime" label="充值时间" >
<el-table-column v-if="columns.visible('createTime')" prop="createTime" label="充值时间" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.addTime) }}</span>
<span>{{ formatTimeTwo(scope.row.createTime) }}</span>
</template>
</el-table-column>
</el-table>
@ -59,6 +59,7 @@ import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import { formatTimeTwo } from '@/utils/index'
// crudpresenter
const defaultCrud = CRUD({ title: '充值管理', url: 'api/yxUserRecharge', sort: 'id,desc', crudMethod: { ...crudYxUserRecharge }, optShow: { add: false, edit: false, del: true, download: true}})
@ -82,6 +83,7 @@ export default {
}
},
methods: {
formatTimeTwo,
//
[CRUD.HOOK.beforeRefresh]() {
const query = this.query

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

@ -34,7 +34,7 @@
</el-table-column>
<el-table-column prop="addTime" label="评论时间">
<template slot-scope="scope">
<span>{{ formatTime(scope.row.addTime) }}</span>
<span>{{ formatTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column v-if="checkPermission(['admin','YXSTOREPRODUCTREPLY_ALL','YXSTOREPRODUCTREPLY_EDIT','YXSTOREPRODUCTREPLY_DELETE'])" label="操作" width="150px" align="center">

6
src/views/shop/storestaff/index.vue

@ -66,9 +66,9 @@
</div>
</template>
</el-table-column>
<el-table-column v-if="columns.visible('addTime')" prop="addTime" label="添加时间" >
<el-table-column v-if="columns.visible('createTime')" prop="createTime" label="添加时间" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.addTime) }}</span>
<span>{{ formatTimeTwo(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column v-permission="['admin','yxSystemStoreStaff:edit','yxSystemStoreStaff:del']" label="操作" width="150px" align="center">
@ -95,6 +95,7 @@ import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import cuser from '@/views/components/user'
import crudYxSystemStore from '@/api/yxSystemStore'
import { formatTimeTwo } from '@/utils/index'
// crudpresenter
const defaultCrud = CRUD({ title: '门店店员', url: 'api/yxSystemStoreStaff', sort: 'id,desc', crudMethod: { ...crudYxSystemStoreStaff }})
@ -141,6 +142,7 @@ export default {
}
},
methods: {
formatTimeTwo,
//
[CRUD.HOOK.beforeRefresh]() {
const query = this.query

22
src/views/shop/user/bill.vue

@ -4,22 +4,6 @@
<div class="head-container">
<!-- 搜索 -->
<el-input v-model="nickname" clearable placeholder="输入用户昵称" style="width: 200px;" class="filter-item" @keyup.enter.native="toQuery" />
<el-select v-model="category" clearable placeholder="明细种类" class="filter-item" style="width: 130px">
<el-option
v-for="item in categoryOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select v-model="type" clearable placeholder="明细类型" class="filter-item" style="width: 130px">
<el-option
v-for="item in typeOptions"
: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>
<!-- 新增 -->
<el-button
@ -55,7 +39,7 @@
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="addTime" label="创建日期">
<template slot-scope="scope">
<span>{{ formatTime(scope.row.addTime) }}</span>
<span>{{ scope.row.createTime }}</span>
</template>
</el-table-column>
</el-table>
@ -133,8 +117,8 @@ export default {
page: this.page,
size: this.size,
nickname: this.nickname,
category: this.category,
type: this.type
category: 'now_money',
type: ''
}
const query = this.query
const type = query.type

207
src/views/shop/user/brobill.vue

@ -0,0 +1,207 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<el-input v-model="nickname" clearable placeholder="输入用户昵称" style="width: 200px;" class="filter-item" @keyup.enter.native="toQuery" />
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="toQuery">搜索</el-button>
<!-- 新增 -->
<el-button
type="danger"
class="filter-item"
size="mini"
icon="el-icon-refresh"
@click="toQuery"
>刷新</el-button>
</div>
<!--表单组件-->
<eForm ref="form" :is-add="isAdd" />
<pForm ref="formp" :is-add="isAdd" />
<!--表格渲染-->
<el-table v-loading="loading" :data="data" size="small" style="width: 100%;">
<el-table-column prop="nickname" label="用户昵称" />
<el-table-column prop="title" label="账单标题" />
<el-table-column prop="category" label="明细种类">
<template slot-scope="scope">
<span v-if="scope.row.category == 'now_money'">余额</span>
<span v-else-if="scope.row.category == 'integral'">积分</span>
<span v-else>未知</span>
</template>
</el-table-column>
<el-table-column prop="number" label="明细数字">
<template slot-scope="scope">
<span v-if="scope.row.pm == 1">+</span>
<span v-else>-</span>
<span>{{ scope.row.number }}</span>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="addTime" label="创建日期">
<template slot-scope="scope">
<span>{{ scope.row.createTime }}</span>
</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, onStatus } from '@/api/yxUser'
import eForm from './form'
import pForm from './formp'
import { formatTime } from '@/utils/index'
export default {
components: { eForm, pForm },
mixins: [initData],
data() {
return {
delLoading: false, nickname: '', category: '', type: '',
queryTypeOptions: [
{ key: 'nickname', display_name: '用户昵称' },
{ key: 'phone', display_name: '手机号码' }
],
categoryOptions: [
{ value: 'now_money', label: '余额' },
{ value: 'integral', label: '积分' }
],
typeOptions: [
{ value: 'brokerage', label: '佣金' },
{ value: 'sign', label: '签到' }
]
}
},
created() {
this.$nextTick(() => {
this.init()
})
},
methods: {
formatTime,
checkPermission,
onStatus(id, status) {
this.$confirm(`确定进行[${status ? '禁用' : '开启'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
onStatus(id, { status: status }).then(({ data }) => {
this.$message({
message: '操作成功',
type: 'success',
duration: 1000,
onClose: () => {
this.init()
}
})
})
})
.catch(() => { })
},
beforeInit() {
this.url = 'api/yxUserBill'
const sort = 'id,desc'
this.params = {
page: this.page,
size: this.size,
nickname: this.nickname,
category: 'now_money',
type: 'brokerage'
}
const query = this.query
const type = query.type
const value = query.value
if (type && value) { this.params[type] = value }
return true
},
subDelete(uid) {
this.delLoading = true
del(uid).then(res => {
this.delLoading = false
this.$refs[uid].doClose()
this.dleChangePage()
this.init()
this.$notify({
title: '删除成功',
type: 'success',
duration: 2500
})
}).catch(err => {
this.delLoading = false
this.$refs[uid].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 = {
uid: data.uid,
account: data.account,
pwd: data.pwd,
realName: data.realName,
birthday: data.birthday,
cardId: data.cardId,
mark: data.mark,
partnerId: data.partnerId,
groupId: data.groupId,
nickname: data.nickname,
avatar: data.avatar,
phone: data.phone,
addTime: data.addTime,
addIp: data.addIp,
lastTime: data.lastTime,
lastIp: data.lastIp,
nowMoney: data.nowMoney,
brokeragePrice: data.brokeragePrice,
integral: data.integral,
signNum: data.signNum,
status: data.status,
level: data.level,
spreadUid: data.spreadUid,
spreadTime: data.spreadTime,
userType: data.userType,
isPromoter: data.isPromoter,
payCount: data.payCount,
spreadCount: data.spreadCount,
cleanTime: data.cleanTime,
addres: data.addres,
adminid: data.adminid,
loginType: data.loginType
}
_this.dialog = true
},
editP(data) {
this.isAdd = false
const _this = this.$refs.formp
_this.form = {
uid: data.uid,
nickname: data.nickname,
ptype: 1,
money: 0
}
_this.dialog = true
}
}
}
</script>
<style scoped>
</style>

4
src/views/shop/user/index.vue

@ -41,9 +41,9 @@
<el-table-column prop="nowMoney" label="用户余额" />
<el-table-column prop="brokeragePrice" label="佣金金额" />
<el-table-column prop="integral" label="用户积分" />
<el-table-column :show-overflow-tooltip="true" prop="addTime" label="创建日期">
<el-table-column prop="createTime" label="创建日期" width="140">
<template slot-scope="scope">
<span>{{ formatTime(scope.row.addTime) }}</span>
<span>{{ scope.row.createTime }}</span>
</template>
</el-table-column>
<el-table-column label="状态" align="center">

207
src/views/shop/user/pobill.vue

@ -0,0 +1,207 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<el-input v-model="nickname" clearable placeholder="输入用户昵称" style="width: 200px;" class="filter-item" @keyup.enter.native="toQuery" />
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="toQuery">搜索</el-button>
<!-- 新增 -->
<el-button
type="danger"
class="filter-item"
size="mini"
icon="el-icon-refresh"
@click="toQuery"
>刷新</el-button>
</div>
<!--表单组件-->
<eForm ref="form" :is-add="isAdd" />
<pForm ref="formp" :is-add="isAdd" />
<!--表格渲染-->
<el-table v-loading="loading" :data="data" size="small" style="width: 100%;">
<el-table-column prop="nickname" label="用户昵称" />
<el-table-column prop="title" label="账单标题" />
<el-table-column prop="category" label="明细种类">
<template slot-scope="scope">
<span v-if="scope.row.category == 'now_money'">余额</span>
<span v-else-if="scope.row.category == 'integral'">积分</span>
<span v-else>未知</span>
</template>
</el-table-column>
<el-table-column prop="number" label="明细数字">
<template slot-scope="scope">
<span v-if="scope.row.pm == 1">+</span>
<span v-else>-</span>
<span>{{ scope.row.number }}</span>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="addTime" label="创建日期">
<template slot-scope="scope">
<span>{{ scope.row.createTime }}</span>
</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, onStatus } from '@/api/yxUser'
import eForm from './form'
import pForm from './formp'
import { formatTime } from '@/utils/index'
export default {
components: { eForm, pForm },
mixins: [initData],
data() {
return {
delLoading: false, nickname: '', category: '', type: '',
queryTypeOptions: [
{ key: 'nickname', display_name: '用户昵称' },
{ key: 'phone', display_name: '手机号码' }
],
categoryOptions: [
{ value: 'now_money', label: '余额' },
{ value: 'integral', label: '积分' }
],
typeOptions: [
{ value: 'brokerage', label: '佣金' },
{ value: 'sign', label: '签到' }
]
}
},
created() {
this.$nextTick(() => {
this.init()
})
},
methods: {
formatTime,
checkPermission,
onStatus(id, status) {
this.$confirm(`确定进行[${status ? '禁用' : '开启'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
onStatus(id, { status: status }).then(({ data }) => {
this.$message({
message: '操作成功',
type: 'success',
duration: 1000,
onClose: () => {
this.init()
}
})
})
})
.catch(() => { })
},
beforeInit() {
this.url = 'api/yxUserBill'
const sort = 'id,desc'
this.params = {
page: this.page,
size: this.size,
nickname: this.nickname,
category: 'integral',
type: ''
}
const query = this.query
const type = query.type
const value = query.value
if (type && value) { this.params[type] = value }
return true
},
subDelete(uid) {
this.delLoading = true
del(uid).then(res => {
this.delLoading = false
this.$refs[uid].doClose()
this.dleChangePage()
this.init()
this.$notify({
title: '删除成功',
type: 'success',
duration: 2500
})
}).catch(err => {
this.delLoading = false
this.$refs[uid].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 = {
uid: data.uid,
account: data.account,
pwd: data.pwd,
realName: data.realName,
birthday: data.birthday,
cardId: data.cardId,
mark: data.mark,
partnerId: data.partnerId,
groupId: data.groupId,
nickname: data.nickname,
avatar: data.avatar,
phone: data.phone,
addTime: data.addTime,
addIp: data.addIp,
lastTime: data.lastTime,
lastIp: data.lastIp,
nowMoney: data.nowMoney,
brokeragePrice: data.brokeragePrice,
integral: data.integral,
signNum: data.signNum,
status: data.status,
level: data.level,
spreadUid: data.spreadUid,
spreadTime: data.spreadTime,
userType: data.userType,
isPromoter: data.isPromoter,
payCount: data.payCount,
spreadCount: data.spreadCount,
cleanTime: data.cleanTime,
addres: data.addres,
adminid: data.adminid,
loginType: data.loginType
}
_this.dialog = true
},
editP(data) {
this.isAdd = false
const _this = this.$refs.formp
_this.form = {
uid: data.uid,
nickname: data.nickname,
ptype: 1,
money: 0
}
_this.dialog = true
}
}
}
</script>
<style scoped>
</style>

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

@ -9,13 +9,13 @@
<el-radio v-model="form.isForever" :label="0" style="width: 200px;"></el-radio>
</el-form-item>
<el-form-item label="有效时间(天)">
<el-input v-model="form.validDate" style="width: 370px;" />
<el-input-number v-model="form.validDate" style="width: 370px;" />
</el-form-item>
<el-form-item label="会员等级">
<el-input v-model="form.grade" style="width: 370px;" />
<el-input-number v-model="form.grade" style="width: 370px;" />
</el-form-item>
<el-form-item label="享受折扣">
<el-input v-model="form.discount" style="width: 370px;" />
<el-input-number v-model="form.discount" style="width: 370px;" />
</el-form-item>
<el-form-item label="会员背景">
<MaterialList v-model="form.imageArr" style="width: 300px" type="image" :num="1" :width="150" :height="150" />
@ -73,6 +73,9 @@ export default {
isDel: ''
},
rules: {
// grade: [
// { type: 'number', message: '', trigger: 'blur' }
// ]
}
}
},

4
src/views/shop/usertask/form.vue

@ -11,10 +11,10 @@
<el-input v-model="form.name" style="width: 370px;" />
</el-form-item>
<el-form-item label="限定数">
<el-input v-model="form.number" style="width: 370px;" />
<el-input-number v-model="form.number" style="width: 370px;" />
</el-form-item>
<el-form-item label="排序">
<el-input v-model="form.sort" style="width: 370px;" />
<el-input-number v-model="form.sort" style="width: 370px;" />
</el-form-item>
<el-form-item label="是否显示">
<el-radio v-model="form.isShow" :label="1"></el-radio>

74
src/views/wechat/config/express.vue

@ -0,0 +1,74 @@
<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.exp_enable" :label="1">开启</el-radio>
<el-radio v-model="form.exp_enable" :label="2">关闭</el-radio>
</el-form-item>
<el-form-item label="appId">
<el-input v-model="form.exp_appId" style="width: 370px;" />
</el-form-item>
<el-form-item label="appKey">
<el-input v-model="form.exp_appKey" style="width: 370px;" type="password" />
</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 eForm from './form'
import picUpload from '@/components/pic-upload'
import { Message } from 'element-ui'
export default {
components: { eForm, picUpload },
mixins: [initData],
data() {
return {
delLoading: false,
form: {
exp_enable: 2,
exp_appId: '',
exp_appKey: ''
},
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.exp_enable = parseInt(this.form.exp_enable)
})
},
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>

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

@ -5,10 +5,6 @@
<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>
</el-form-item>
<el-form-item label="一级返佣比例">
<el-input v-model="form.store_brokerage_ratio" style="width: 370px;" />
<p style="color: red">订单交易成功后给上级返佣的比例0 - 100,:5 = 反订单金额的5%</p>
@ -20,12 +16,6 @@
<el-form-item label="提现最低金额">
<el-input v-model="form.user_extract_min_price" style="width: 370px;" />
</el-form-item>
<el-form-item label="H5地址">
<el-input v-model="form.site_url" style="width: 370px;" />
</el-form-item>
<el-form-item label="API地址">
<el-input v-model="form.api_url" style="width: 370px;" />
</el-form-item>
<el-form-item label="">
<el-button type="primary" @click="doSubmit">提交</el-button>
</el-form-item>
@ -48,12 +38,9 @@ export default {
delLoading: false,
form: {
store_brokerage_open: 1,
store_brokerage_statu: 2,
store_brokerage_ratio: 0,
store_brokerage_two: 0,
user_extract_min_price: 100,
site_url: '',
api_url: ''
user_extract_min_price: 100
},
rules: {
}
@ -70,7 +57,6 @@ export default {
}
})
this.form.store_brokerage_statu = parseInt(this.form.store_brokerage_statu)
this.form.store_brokerage_open = parseInt(this.form.store_brokerage_open)
})
},

78
src/views/wechat/config/shop.vue

@ -0,0 +1,78 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" :rules="rules" size="small" label-width="150px">
<el-form-item label="移动端H5地址">
<el-input v-model="form.site_url" style="width: 370px;" />
</el-form-item>
<el-form-item label="移动端API地址">
<el-input v-model="form.api_url" style="width: 370px;" />
</el-form-item>
<el-form-item label="后台API地址">
<el-input v-model="form.admin_api_url" style="width: 370px;" />
</el-form-item>
<el-form-item label="文件存储方式">
<el-radio v-model="form.file_store_mode" :label="1">本地存储</el-radio>
<el-radio v-model="form.file_store_mode" :label="2">云存储</el-radio>
</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 eForm from './form'
import picUpload from '@/components/pic-upload'
import { Message } from 'element-ui'
export default {
components: { eForm, picUpload },
mixins: [initData],
data() {
return {
delLoading: false,
form: {
file_store_mode: 2,
site_url: '',
api_url: '',
admin_api_url: ''
},
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.file_store_mode = parseInt(this.form.file_store_mode)
})
},
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>

86
src/views/wechat/config/sms.vue

@ -0,0 +1,86 @@
<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.sms_enable" :label="1">开启</el-radio>
<el-radio v-model="form.sms_enable" :label="2">关闭</el-radio>
</el-form-item>
<el-form-item label="签名">
<el-input v-model="form.sms_sign" style="width: 370px;" />
</el-form-item>
<el-form-item label="模板id">
<el-input v-model="form.sms_templateId" style="width: 370px;" />
</el-form-item>
<el-form-item label="region">
<el-input v-model="form.sms_region" style="width: 370px;" />
</el-form-item>
<el-form-item label="accessKey">
<el-input v-model="form.sms_access_key" style="width: 370px;" />
</el-form-item>
<el-form-item label="accessKeySecret">
<el-input v-model="form.sms_access_secret" style="width: 370px;" type="password" />
</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 eForm from './form'
import picUpload from '@/components/pic-upload'
import { Message } from 'element-ui'
export default {
components: { eForm, picUpload },
mixins: [initData],
data() {
return {
delLoading: false,
form: {
sms_enable: 2,
sms_sign: '',
sms_templateId: '',
sms_region: '',
sms_access_key: '',
sms_access_secret: ''
},
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.sms_enable = parseInt(this.form.sms_enable)
})
},
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>

5
src/views/wechat/template/form.vue

@ -7,9 +7,6 @@
<el-form-item label="模板名">
<el-input v-model="form.name" style="width: 370px;" />
</el-form-item>
<el-form-item label="回复内容">
<el-input v-model="form.content" style="width: 370px;" rows="5" type="textarea" />
</el-form-item>
<el-form-item label="模板ID">
<el-input v-model="form.tempid" style="width: 370px;" />
</el-form-item>
@ -44,7 +41,7 @@ export default {
content: '',
tempid: '',
addTime: '',
status: ''
status: 1
},
rules: {
}

1
src/views/wechat/template/index.vue

@ -21,7 +21,6 @@
<el-table-column prop="id" label="模板id" />
<el-table-column prop="tempkey" label="模板编号" />
<el-table-column prop="name" label="模板名" />
<el-table-column prop="content" label="回复内容" />
<el-table-column prop="tempid" label="模板ID" />
<el-table-column prop="status" label="状态">
<template slot-scope="scope">

Loading…
Cancel
Save