60 Commits

Author SHA1 Message Date
paulGao
9a12a29127 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-11-17 16:39:38 +08:00
paulGao
8d96a3c106 管理端增加退出登录 2021-11-17 16:39:24 +08:00
lemon橪
41bfd17cd0 pc端物流日志 2021-11-16 11:02:59 +08:00
paulGao
5614414185 add logout 2021-11-11 18:45:53 +08:00
lemon橪
7ac4010910 修改规格样式问题 2021-11-09 15:53:11 +08:00
lemon橪
ffc5af6d39 修改商品中参数可能出现的bug 2021-11-09 15:38:45 +08:00
lemon橪
c64f00fe9e merge master 2021-11-05 16:16:56 +08:00
lemon橪
d3a49f3f3e 修改商品参数中部分bug 2021-11-05 16:16:28 +08:00
paulGao
06c6abe250 修复售后订单loading 2021-11-05 10:49:08 +08:00
chopper711
f54739e337 update README.md. 2021-11-02 08:04:19 +00:00
lemon橪
cdc673da06 删除无用数据 2021-10-28 16:27:59 +08:00
Chopper
0bd99df26a 后台查阅消息,跳转分销提现页面内容问题处理 2021-10-27 10:56:25 +08:00
chopper711
0dcee2f2e2 !4 PC显示发票信息问题处理,结算页面商品宽度调整,后台发票开具条件增加已发货可以开具发票的按钮
Merge pull request !4 from chopper711/lifenlong
2021-10-26 02:40:06 +00:00
Chopper
f7f836f5fd PC显示发票信息问题处理,结算页面商品宽度调整,后台发票开具条件增加已发货可以开具发票的按钮 2021-10-26 10:38:41 +08:00
lemon橪
16d1576c10 秒杀金额显示问题 2021-10-22 15:11:18 +08:00
lemon橪
0d1dbd0350 修改语言插件 2021-10-21 17:50:34 +08:00
lemon橪
18ea8a4366 语言设定小插件 2021-10-21 15:48:03 +08:00
lemon橪
b9aa720bea 修改秒杀添加商品可能出现的bug 2021-10-21 14:09:00 +08:00
lemon橪
28473979ec 合并master 2021-10-19 16:41:03 +08:00
lemon橪
dbe5a21f4d 修改buyer api路径 将buyer manager seller 统一为 public/config下修改api地址,新增buyer底部 公司,备案号等信息展示,修改商家端seller秒杀bug以及部分issue中的优化方案 2021-10-19 16:40:43 +08:00
Chopper
31d9859f10 表单校验几个细节问题 2021-10-19 14:20:20 +08:00
lemon橪
7cbd2b698c 优化劵活动优惠券代码 2021-10-15 18:38:29 +08:00
lemon橪
6fa3fa7822 优化砍价逻辑,以及修改劵活动Bug 2021-10-12 18:06:52 +08:00
lemon橪
e80316d43d 修复管理后台es分词报错问题 2021-10-09 09:29:30 +08:00
paulGao
9979b6fd67 修复管理员添加密码验证 2021-10-08 14:56:25 +08:00
OceansDeep
a36a4cd244 !3 修复设置限时抢购活动无时间显示bug
Merge pull request !3 from OceansDeep/dev-gl
2021-10-08 03:38:51 +00:00
paulGao
f99e2673a6 修复设置限时抢购活动无时间显示bug 2021-10-08 11:37:11 +08:00
lemon橪
47da7d3b16 管理端新增文章时删除全部选项 2021-10-06 17:01:30 +08:00
lemon橪
4f2f6e8d20 优化楼层装修样式问题,以及退单金额显示,删除砍价批量删除商品功能 2021-09-29 16:04:24 +08:00
lemon橪
4da164dcba 优化商品发布规格校验,后续会优化规格详情中添加规格以前数据消失问题 2021-09-26 18:02:26 +08:00
lemon橪
1aab8aa8c8 合并shuai分支 优化正则校验以及商品发布中样式 ,后续会优化商品发布中规格问题 2021-09-26 16:37:53 +08:00
lemon橪
8a2a946bc1 合并shuai分支 优化正则校验以及商品发布中样式 ,后续会优化商品发布中规格问题 2021-09-26 16:36:57 +08:00
Chopper
038de5ed53 商品详情管理端,字段优化问题处理 2021-09-26 16:19:53 +08:00
Chopper
0bac362c95 Merge branch 'liushuai'
大部分为参数校验问题,以及部分商品字段优化
# Conflicts:
#	buyer/src/config/index.js
#	manager/src/config/index.js
#	seller/src/views/goods/goods-seller/draftGoods.vue
2021-09-26 16:12:24 +08:00
Chopper
04599148fc 文章分类,积分设置删除后无法新增问题处理 2021-09-26 16:07:50 +08:00
lemon橪
b61faef093 管理端删除基础配置 2021-09-26 14:49:41 +08:00
Chopper
642536f83e 校验问题处理 2021-09-26 14:49:19 +08:00
Chopper
7ebb5e21d2 各种页面校验功能补充优化 2021-09-24 18:19:09 +08:00
OceansDeep
0c18a0f6db !2 修复楼层装修选择店铺,店铺开启状态不正确
Merge pull request !2 from OceansDeep/dev-gl
2021-09-24 08:40:41 +00:00
paulGao
93768e4014 reset config 2021-09-24 16:39:24 +08:00
paulGao
3674b63db4 reset config 2021-09-24 16:38:27 +08:00
paulGao
9e8f369da4 reset config 2021-09-24 16:37:33 +08:00
paulGao
04cc8b991c reset config seller 2021-09-24 16:34:42 +08:00
paulGao
0342f1d17a fix dialog template shops storeDisable show error 2021-09-24 16:32:23 +08:00
paulGao
82838a5ebb Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-24 15:49:00 +08:00
Chopper
20042786aa 商品模块代码继续完善,表单校验等 2021-09-22 15:32:47 +08:00
lemon橪
2037b57a5d 优化管理端商家端冗余以及配置内容。抽出公共主题颜色、站点标题等内容。分离config中api配置,修改商家发布中拖拽以及控制台出错的bug。 2021-09-22 15:08:34 +08:00
Chopper
2932c7f35d 参数校验相关提交 2021-09-22 12:16:22 +08:00
lemon橪
53cc6f46d1 修改buyer端购物车显示bug 2021-09-17 18:26:24 +08:00
paulGao
a5e2ae9a4d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-17 17:19:48 +08:00
lemon橪
95beebc5c7 合并master 2021-09-17 17:16:30 +08:00
lemon橪
f7b8713be1 解决商家端 商家列表报错问题 2021-09-17 17:16:15 +08:00
Chopper
c33d10734f im 页面声明 2021-09-17 11:03:09 +08:00
Chopper
edde94af69 IM 设置 2021-09-17 11:01:57 +08:00
Chopper
fbf2b6a6fa Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-09-16 16:22:36 +08:00
Chopper
b84f1b595e 镜像相关提交 2021-09-16 16:22:13 +08:00
lemon橪
e4bc52a219 修改已发现秒杀的bug 2021-09-15 17:05:43 +08:00
paulGao
ea8c86e2e2 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-07 09:37:30 +08:00
paulGao
70506767ef Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-03 15:44:06 +08:00
paulGao
48002d6143 conifg 2021-09-03 15:43:46 +08:00
131 changed files with 1966 additions and 2062 deletions

3
.idea/misc.xml generated
View File

@@ -3,4 +3,7 @@
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="WebPackConfiguration">
<option name="mode" value="DISABLED" />
</component>
</project>

253
README.md
View File

@@ -1,110 +1,138 @@
## Lilishop B2B2C商城系统
## 🔥 Lilishop B2B2C商城系统
##### 🌹 开源不易如有帮助请点Star
#### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,进群先看文档后提问)
##### 交流 qq 1群 961316482已满
##### 交流 qq 2群 875294241
##### 商城 公众号/小程序体验,扫描二维码
##### 官方公众号 & 开源不易如有帮助请点Star
![image-20210511171611793](https://pickmall.cn/assets/imgs/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)
### 介绍
### 🔥 商城介绍
**官网**https://pickmall.cn
Lilishop 是一款Java开发基于SpringBoot研发B2B2C多用户商城前端使用 Vue、uniapp开发 **系统全端全部代码开源**
Lilishop 商城系统 基于SpringBoot 研发B2B2C多用户商城系统,前端使用 Vue、uniapp开发 **系统全端全部代码开源**
产品前后端分离、支持分布式部署
业务兼容O2O商城/B2B商城/B2B2C商城/F2B2C商城/S2B2C商城。支持小程序商城、H5商城、APP商城、 PC商城
商城展示端包含 PC、H5、微信小程序、APP。
商城前后端分离、支持分布式部署。
商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、分销模块、文章模块、系统设置模块、流量分析模块
系统包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等支持Docker支持k8s。是一款高性能支持高并发商城系统。
商城包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等支持Docker支持k8s。是一款高性能支持高并发商城系统。
开箱即用,简单配置即可部署一套属于您的系统。
##### 商城 API/消费者 聚合版
api不需要单独部署只需启动一个jar包就可以正常运转 如有需要可以点击跳转https://gitee.com/beijing_hongye_huicheng/lilishop-simplify
### 文档
### ☃️ 商城 开发/使用/常见问题 帮助文档
**产品文档**(需求、架构、使用、部署、开发):https://docs.pickmall.cn
https://docs.pickmall.cn
### 💧 开源商城项目地址(gitee)
**API商城所有API**https://gitee.com/beijing_hongye_huicheng/lilishop.git
**UI商城管理端/商家端/买家PC端** https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
**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
### 项目链接(gitee)
☃️ UI 项目下3个文件夹 buyer买家PC端seller商家端manager后台管理端
**Java后台**https://gitee.com/beijing_hongye_huicheng/lilishop.git
**Vue后台前端** https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
### 💧 演示地址(手机验证码为 111111)
**Uni-app**https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
**商城管理端**https://admin-b2b2c.pickmall.cn 账号admin/123456
**docker一键部署**https://gitee.com/beijing_hongye_huicheng/docker.git
**商城店铺后台**https://store-b2b2c.pickmall.cn 账号13011111111/111111
### 项目链接(github)
**商城PC页面**https://pc-b2b2c.pickmall.cn
**Java后台**https://github.com/hongyehuicheng/lilishop.git
**商城移动端(请使浏览器手机模式,或者用手机浏览器打开)**https://m-b2b2c.pickmall.cn
**Vue后台前端** https://github.com/hongyehuicheng/lilishop-ui.git
**Uni-app**https://github.com/hongyehuicheng/lilishop-uniapp.git
**docker一键部署**https://github.com/hongyehuicheng/docker.git
### 演示地址
**运营后台**https://admin-b2b2c.pickmall.cn 账号admin/123456
**店铺后台**https://store-b2b2c.pickmall.cn 账号13011111111/111111
**用户前台**https://pc-b2b2c.pickmall.cn
**移动端**https://m-b2b2c.pickmall.cn
**小程序/公众号**:扫描二维码
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png)
### 3行命令搭建本地环境
### 🚙 3行命令搭建本地商城(注:只能本机访问,如需调整,请自行操作镜像)
温馨提示由于服务较多如果笔记本环境启动内存没有32g可能无法启动成功macbookpro 2020 16g内存启动无法成功台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
温馨提示:由于服务中间件较多如果笔记本环境启动内存没有32g可能无法启动成功macbookpro 2020 16g内存启动无法成功台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
##### 下载docker脚本
##### 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`
PS:单独部署的话,数据库文件访问这里:https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
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 |
| 商城买家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 |
| 商城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://pickmall.cn/assets/imgs/other/managerList.jpg)
#### 商家端功能
#### 🥎 商城卖家功能
![商家端功能](https://pickmall.cn/assets/imgs/other/storeList.jpg)
@@ -112,30 +140,28 @@ PS:单独部署的话数据库文件访问这里https://gitee.com/beijing_
### 功能展示
### 🧩 商城前端功能展示
#### 移动端
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="管理端功能展示" style="zoom:50%;" />
#### ⚽️ 商城移动端
<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)
##### Java后台
##### 🕹 后台技术选型
| 说明 | 框架 | 说明 | |
| -------------- | --------------- | -------------- | ------------- |
@@ -149,7 +175,7 @@ PS:单独部署的话数据库文件访问这里https://gitee.com/beijing_
| 短信 | 阿里云短信 | 认证 | JWT |
| 日志处理 | Log4j | 接口规范 | RESTful |
##### 前端-运营后台、店铺后台
##### 🖥 前端-运营后台、店铺后台
| 说明 | 框架 | 说明 | 框架 |
| ---------- | ---------- | ---------- | ------- |
@@ -159,119 +185,34 @@ PS:单独部署的话数据库文件访问这里https://gitee.com/beijing_
| 基础UI库 | iView | UI界面基于 | iView |
| 网络请求 | axios | | |
##### 前端-移动端
##### 📱前端-移动端
| 说明 | 架构 | 说明 | 架构 |
| --------- | ------- | -------- | ------- |
| 基础UI库 | uViewui | 基础框架 | uni-app |
| CSS预处理 | scss | 地图引擎 | amap |
### 升级计划
#### 计划每个月发布一个版本,具体时间可能有出入
时间2021年6月15日
### 🌟 版本升级
```
新增功能:
1.微信小程序直播
2.优惠券活动
3.新人赠券
4.准确发券
5.用户等级
6.数据导出
7.订单批量
8.APP版本升级检测
9.积分商城
功能优化:
1.优惠券有效期增加类型:设置领取后*内有效。
2.秒杀活动设置为每天开启,需设置秒杀活动开启时间。
3.店铺配送模板,配送地区如果选择省份则下方的市级地址不展示。
4.店铺配送模板支持,店铺包邮。
5.普通商品设置去除卖家承担运费。
商城后续会持续版本升级修复bug完善功能覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
后续会考虑推出微服务商城系统/商城中台等
```
时间2021年7月15日
```
新增功能:
1.会员权益
2.支持用户升级会员
3.供求单
4.IM腾讯云智服
5.服务商品
6.店铺支持订单核销
7.店铺自提点
功能优化:
1.用户分享商城、关注店铺、邀请新用户可获取积分、经验值。
```
时间2021年8月16日
```
新增功能:
1.微淘功能
2.店铺移动端
3.店铺发货单
```
时间2021年9月15日
```
新增功能:
增加供应商功能
```
### 版本升级
```
后续会持续版本升级修复bug完善功能覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
后续会考虑推出微服务/中台等 企业级版本
```
### 技术亮点
1.后端框架基于Springboot构建基于maven持久层使用MyBatisPlus。使用elasticsearch、redis、mongodb、rocketmq 等各种中间健。都是主流架构,轻松应对各种环境。
2.支持集群、分布式支持docker 轻松部署,解决各种复杂场景!
3.代码模块清晰主要分为三端api买家、卖家、管理各端API互相隔离自己鉴权自己操作业务。
4.使用阿里开源的RocketMQ基于mq解决各种并发场景解决事务一致性解决搞并发延迟场景问题。
5.项目使用多级缓存应用不同场景redis缓存业务数据、mongodb缓存关系型多对多关系问题、nginx缓存高频访问低频修改的页面。
6.支持各种联合登陆,支持各种客户端的支付问题,灵活配置灵活开启。
7.内置完善的楼层装修机制,各种拖拉拽,维护跳转页面或外网,即便是一个什么都不懂的运营也可以轻松掌握。
8.内置阿里短信接口可以在线申请短信模版。内置阿里oss系统可以对文件执行各种操作。oss商家端资源相互隔离。
10.强大的统计报表,统计效果,可以实现各个场景,包含在线人数,历史在线人数,活跃人数等信息。
11.标准Api接口、提供swagger文档快速二开。
12.分布式调度任务中心,解决分布式定时任务多次执行问题。
13.代码注释完善,快速上手。
14.非移动端采用IView框架各种自定义插件、选择器实现。移动端采用uniapp一次编写全端使用
15.已经对接好各种第三方插件,支持各种复杂等联合登陆,联合支付等场景。
### 开源须知
### ⚠️ 开源须知
1.仅允许用于个人学习研究使用.
2.禁止将本开源的代码和资源进行任何形式任何名义的出售.
3.限制商用如果需要商业使用请联系我们。QQ3409056806.
3.软件受国家计算机软件著作权保护登记号2021SR0805085
### 交流群
4.限制商用如果需要商业使用请联系我们。QQ3409056806.
**QQ群**961316482
### 🐧 交流群
##### 官方qq 1群 961316482已满
##### 官方qq 2群 875294241

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

18
buyer/public/config.js Normal file
View File

@@ -0,0 +1,18 @@
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"
},
};

View File

@@ -14,7 +14,9 @@
<% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%=js%>"></script>
<% } %>
<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

@@ -57,3 +57,12 @@ export function editPwd (params) {
data: params
})
}
// 获取密码状态
export function logout () {
return request({
url: '/buyer/members/logout',
method: Method.POST,
needToken: true
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

View File

@@ -29,18 +29,38 @@
</div>
</div>
<div class="clearfix"></div>
<div class="friend-link">
<div class="friend-link flex">
<div class="friend-link-item">
<ul>
<li v-for="(link, index) in moreLink" :key="index" @click="goArticle">
<span class="link-item" :class="{'link-last-item': index === 4}">{{link}}</span>
</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>
<div class="clearfix"></div>
<div class="copyright">
<p>Copyright © {{year}} LILI</p>
<p>Copyright © {{year}} {{config.title}}</p>
</div>
</div>
</footer>
@@ -48,28 +68,32 @@
</template>
<script>
import config from '@/config'
export default {
name: 'Footer',
data () {
name: "Footer",
data() {
return {
guideArr: [ // 导航链接
[ '购物指南', '购物流程', '会员介绍', '生活旅行', '常见问题' ],
[ '配送方式', '上门自提', '配送服务查询', '收取标准', '物流规则' ],
[ '支付方式', '在线支付', '公司转账', '余额支付', '积分支付' ],
[ '售后服务', '售后政策', '退款说明', '返修/退货', '取消订单' ]
config,
guideArr: [
// 导航链接
["购物指南", "购物流程", "会员介绍", "生活旅行", "常见问题"],
["配送方式", "上门自提", "配送服务查询", "收取标准", "物流规则"],
["支付方式", "在线支付", "公司转账", "余额支付", "积分支付"],
["售后服务", "售后政策", "退款说明", "返修/退货", "取消订单"],
],
moreLink: ['关于我们', '联系我们', '联系客服', '商家帮助', '隐私政策'], // 更多链接
year: new Date().getFullYear() // 当前年份
moreLink: ["关于我们", "联系我们", "联系客服", "商家帮助", "隐私政策"], // 更多链接
year: new Date().getFullYear(), // 当前年份
};
},
methods: {
goArticle () { // 跳转文章页
goArticle() {
// 跳转文章页
let routeUrl = this.$router.resolve({
path: '/article'
})
window.open(routeUrl.href, '_blank')
}
}
path: "/article",
});
window.open(routeUrl.href, "_blank");
},
},
};
</script>
@@ -77,11 +101,9 @@ export default {
/*****************************底 部 开 始*****************************/
.footer {
width: 100%;
height: 380px;
padding-top: 30px;
@include background_color($light_background_color);
}
.icon-row {
margin: 15px auto;
@@ -112,7 +134,20 @@ export default {
.footer-icon-child-4 {
background-position: 0 -129px;
}
.footer-icon-text{
.icp {
>*{
margin: 0 4px;
}
flex-direction: column;
}
.flex{
display: flex;
align-items: center;
>img{
margin-right: 4px;
}
}
.footer-icon-text {
margin-left: 45px;
font-size: 18px;
font-weight: bold;
@@ -146,14 +181,24 @@ export default {
.friend-link {
display: flex;
align-items: center;
align-items: flex-start;
justify-content: space-between;
width: 908px;
height: 30px;
padding: 10px 0;
margin: 0px auto;
border-top: 1px solid $border_color;
}
.friend-link-item {
margin: 0px auto;
.information {
display: flex;
flex-direction: column;
> * {
margin: 2px 0;
}
}
.zhizhao {
width: 20px;
height: 20px;
border-radius: 50%;
}
.friend-link-item ul {
list-style: none;
@@ -175,15 +220,17 @@ export default {
line-height: 30px;
text-align: center;
}
.copyright a{
.copyright a {
color: #232323;
font-size: 20px;
}
.footer-icon-text{
@include title_color($light_title_color)
.footer-icon-text {
@include title_color($light_title_color);
}
.copyright,.friend-link,.servece-type-info {
@include sub_color($light_sub_color)
.copyright,
.friend-link,
.servece-type-info {
@include sub_color($light_sub_color);
}
/*****************************底 部 结 束*****************************/
</style>

View File

@@ -86,6 +86,7 @@
<script>
import storage from '@/plugins/storage.js';
import { cartGoodsAll } from '@/api/cart.js';
import { logout } from '@/api/account.js';
export default {
name: 'M-Header',
created () {
@@ -120,12 +121,14 @@ export default {
window.open(url.href, '_blank');
},
signOutFun () { // 退出登录
storage.removeItem('accessToken');
storage.removeItem('refreshToken');
storage.removeItem('userInfo');
storage.removeItem('cartNum');
this.$store.commit('SET_CARTNUM', 0)
this.$router.push('/login');
logout().then(res => {
storage.removeItem('accessToken');
storage.removeItem('refreshToken');
storage.removeItem('userInfo');
storage.removeItem('cartNum');
this.$store.commit('SET_CARTNUM', 0)
this.$router.push('/login');
});
},
goUserCenter (path) {
// 跳转我的订单,我的足迹、收藏等

View File

@@ -81,14 +81,17 @@
<first-page-advert :data="element" class="mb_20 width_1200_auto"></first-page-advert>
</template>
<!-- 横幅广告 -->
<template v-if="element.type == 'bannerAdvert'">
<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=""
/>
</div>
</template>
<template v-if="element.type == 'notEnough'">
<not-enough :data="element" class="mb_20 width_1200_auto"></not-enough>

View File

@@ -23,7 +23,7 @@
<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 || "欢迎来到LiLi Shop" | secrecyMobile }}</div>
<div>Hi{{ userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile }}</div>
<div v-if="userInfo.id">
<Button type="error" shape="circle" @click="$router.push('home')">会员中心</Button>
</div>
@@ -49,6 +49,7 @@
</template>
<script>
import config from '@/config'
import {articleList} from '@/api/common.js'
import storage from '@/plugins/storage';
export default {
@@ -56,6 +57,7 @@ export default {
props: ['data'],
data () {
return {
config,
userInfo: {}, // 用户信息
articleList: [], // 常见问题
params: { // 请求常见问题参数

View File

@@ -33,7 +33,7 @@
<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 || "欢迎来到LiLi Shop" | secrecyMobile }}</div>
<div>Hi{{ userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile }}</div>
<div v-if="userInfo.id">
<Button type="error" shape="circle">会员中心</Button>
</div>
@@ -57,6 +57,7 @@
</template>
<script>
import config from '@/config'
import {articleList} from '@/api/common.js'
import storage from '@/plugins/storage';
export default {
@@ -64,6 +65,7 @@ export default {
props: ['data'],
data () {
return {
config,
userInfo: {}, // 用户信息
articleList: [], // 常见问题
params: { // 请求常见问题参数

View File

@@ -31,6 +31,7 @@
<script>
import AMapLoader from '@amap/amap-jsapi-loader';
import { handleRegion } from '@/api/address.js';
import config from '@/config'
export default {
name: 'map',
props: {
@@ -41,6 +42,7 @@ export default {
},
data () {
return {
config,
showMap: false, // 展示地图
mapSearch: '', // 地图搜索
map: null, // 初始化地图
@@ -88,7 +90,7 @@ export default {
},
init () { // 初始化地图
AMapLoader.load({
key: 'b440952723253aa9fe483e698057bf7d', // 申请好的Web端开发者Key首次调用 load 时必填
key: this.config.aMapKey, // 申请好的Web端开发者Key首次调用 load 时必填
version: '', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: [
'AMap.ToolBar',

View File

@@ -1,8 +1,21 @@
export default {
/**
* @description 配置显示在浏览器标签的title
* @description 配置显示在浏览器标签的title、底部信息、部分信息展示的值
*/
title: 'Lili电商',
title: "lili-shop",
/**
* @description icp证
*/
icpCard: "",
company:{
href:"https://pickmall.cn",
name:"北京宏业汇成科技有限公司"
},
/**
* @description icp备案号
*/
icpMessage: "京ICP备20009696号-1",
/**
* @description token在Cookie中存储的天数默认1天
*/
@@ -14,34 +27,14 @@ export default {
*/
useI18n: false,
/**
* @description api请求基础路径
* @description 高德web端申请的api key
*/
api_dev: {
// common: 'http://192.168.0.101:8890',
// buyer: 'http://192.168.0.101:8888',
// seller: 'http://192.168.0.101:8889',
// manager: 'http://192.168.0.101:8887'
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请求基础路径前缀
*/
baseUrlPrefix: '/buyer',
aMapKey: "b440952723253aa9fe483e698057bf7d",
/**
* @description 需要加载的插件
*/
plugin: {
'error-store': {
"error-store": {
showInHeader: true, // 设为false后不会在顶部显示错误日志徽标
developmentOff: true // 设为true后在开发环境不会收集错误信息方便开发中排查错误
}

View File

@@ -4,7 +4,7 @@
<!-- LOGO 搜索 -->
<div class="width_1200 logo">
<div>
<router-link to="/"><img :src="$store.state.logoImg" alt="lili shop" title="lilishop" /></router-link>
<router-link to="/"><img :src="$store.state.logoImg" /></router-link>
<div>
购物车(<span>{{ goodsTotal }}</span>)
</div>

View File

@@ -99,7 +99,7 @@
<Row type="flex" justify="center" class="copyright">
Copyright © {{year}} - Present
<a href="https://pickmall.cn/" target="_blank" style="margin: 0 5px"
>lili-shop</a
>{{config.title}}</a
>
版权所有
</Row>
@@ -108,6 +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';
@@ -118,6 +119,7 @@ export default {
components: { Verify },
data () {
return {
config,
loading: false, // 加载状态
loading1: false, // 第二步加载状态
formFirst: { // 手机验证码表单

View File

@@ -95,7 +95,7 @@
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © {{year}} - Present
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">lili-shop</a>
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">{{config.title}}</a>
版权所有
</Row>
</div>
@@ -103,6 +103,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";
@@ -118,6 +119,7 @@ export default {
},
data() {
return {
config,
type: true, // true 账号登录 false 验证码登录
formData: {
// 登录表单

View File

@@ -89,7 +89,7 @@
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © {{year}} - Present
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">lili-shop</a>
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">{{config.title}}</a>
版权所有
</Row>
</div>
@@ -97,6 +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';
@@ -107,6 +108,7 @@ export default {
components: { Verify },
data () {
return {
config,
year: new Date().getFullYear(),
formRegist: {
// 注册表单

View File

@@ -2,39 +2,23 @@
<div>
<card _Title="收货地址" />
<div class="add-box">
<Form
:model="formData"
ref="form"
label-position="left"
:label-width="100"
:rules="ruleInline"
>
<Form :model="formData" ref="form" label-position="left" :label-width="100" :rules="ruleInline">
<FormItem label="收件人" prop="name">
<i-input v-model="formData.name" placeholder="请输入收件人姓名" style="width: 600px"></i-input>
</FormItem>
<FormItem label="收件地区" prop="address">
<i-input
v-model="formData.address"
disabled
placeholder="请选择收货地址"
style="width: 600px"
></i-input>
<i-input v-model="formData.address" disabled placeholder="请选择收货地址" style="width: 600px"></i-input>
<Button type="primary" size="small" @click="$refs.map.showMap = true">选择</Button>
</FormItem>
<FormItem label="详细地址" prop="detail">
<i-input v-model="formData.detail" placeholder="请输入详细地址" style="width: 600px"></i-input>
<i-input v-model="formData.detail" placeholder="请输入详细地址" style="width: 600px"></i-input>
</FormItem>
<FormItem label="手机号码" prop="mobile">
<i-input v-model="formData.mobile" placeholder="请输入收件人手机号" style="width: 600px"></i-input>
<i-input v-model="formData.mobile" placeholder="请输入收件人手机号" style="width: 600px"></i-input>
</FormItem>
<FormItem label="地址别名">
<i-input
v-model="formData.alias"
length
:maxlength="4"
placeholder="请输入地址别名,例如公司"
style="width: 600px"
></i-input>
<i-input v-model="formData.alias" length :maxlength="4" placeholder="请输入地址别名,例如公司" style="width: 600px">
</i-input>
</FormItem>
<FormItem label="默认地址">
<i-switch v-model="formData.isDefault" />
@@ -42,9 +26,7 @@
</Form>
</div>
<div class="mt_20">
<Button type="primary" class="mr_10" :loading="loading" @click="save"
>保存收货地址</Button
>
<Button type="primary" class="mr_10" :loading="loading" @click="save">保存收货地址</Button>
<Button @click="$router.back()">返回</Button>
</div>
<lili-map ref="map" @getAddress="getAddress"></lili-map>
@@ -52,89 +34,108 @@
</template>
<script>
import card from '@/components/card';
import liliMap from '@/components/map';
import card from "@/components/card";
import liliMap from "@/components/map";
import * as RegExp from "@/plugins/RegExp.js";
import {
newMemberAddress,
editMemberAddress,
getAddrDetail
} from '@/api/address';
getAddrDetail,
} from "@/api/address";
export default {
name: 'AddAddress',
data () {
name: "AddAddress",
data() {
return {
formData: { // 添加地址表单
isDefault: false
formData: {
// 添加地址表单
isDefault: false,
},
ruleInline: { // 验证规则
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
address: [{ required: true, message: '请输入地址', trigger: 'change' }],
ruleInline: {
// 验证规则
name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
address: [{ required: true, message: "请输入地址", trigger: "change" }],
detail: [
{ required: true, message: '请输入详细地址', trigger: 'blur' }
{ required: true, message: "请输入详细地址", trigger: "blur" },
],
mobile: [
]
{ required: true, message: "请输入手机号码" },
{
pattern: RegExp.mobile,
trigger: "blur",
message: "请输入正确的手机号",
},
],
},
loading: false, // 加载状态
mapMsg: {} // 地图信息
mapMsg: {}, // 地图信息
};
},
methods: {
save () { // 保存地址
save() {
// 保存地址
this.$refs.form.validate((valid) => {
if (valid) {
const params = JSON.parse(JSON.stringify(this.formData));
params.consigneeAddressPath = params.address.replace(/\s/g, ',');
params.consigneeAddressPath = params.address.replace(/\s/g, ",");
delete params.address;
this.loading = true;
if (this.$route.query.id) {
editMemberAddress(params).then((res) => {
if (res.success) {
editMemberAddress(params)
.then((res) => {
if (res.success) {
this.loading = false;
this.$router.push("/home/MyAddress");
}
})
.catch(() => {
this.loading = false;
this.$router.push('/home/MyAddress');
}
}).catch(() => { this.loading = false; });
});
} else {
newMemberAddress(params).then((res) => {
if (res.success) {
newMemberAddress(params)
.then((res) => {
if (res.success) {
this.loading = false;
this.$router.push("/home/MyAddress");
}
})
.catch(() => {
this.loading = false;
this.$router.push('/home/MyAddress');
}
}).catch(() => { this.loading = false; });
});
}
}
});
},
getAddrById (id) {
getAddrById(id) {
// 获取地址详情
getAddrDetail(id).then((res) => {
if (res.success) {
console.log(res);
const data = res.result;
data.address = res.result.consigneeAddressPath.replace(/,/g, ' ');
data.address = res.result.consigneeAddressPath.replace(/,/g, " ");
this.formData = data;
}
});
},
getAddress (item) {
getAddress(item) {
// 获取地图选择信息
console.log(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.$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;
}
},
},
mounted () {
mounted() {
const id = this.$route.query.id;
if (id) this.getAddrById(id);
},
components: {
card,
liliMap
}
liliMap,
},
};
</script>

View File

@@ -35,6 +35,15 @@
<h3>配送信息</h3>
<p>配送方式{{order.deliveryMethodValue}}</p>
<p>配送状态{{order.deliverStatusValue}}</p>
<div class="div-express-log" v-if="logistics">
<p class="express-log">
<p>订单日志</p>
<p v-for="(item, index) in logistics.traces" :key="index">
<span class="time">{{ item.AcceptTime }}</span>
<span class="detail">{{ item.AcceptStation }}</span>
</p>
</p>
</div>
</div>
<div class="order-card">
<h3>发票信息</h3>
@@ -122,7 +131,7 @@ export default {
return {
order: {}, // 订单详情数据
progressList: [], // 订单流程
logistics: [], // 物流数据
logistics: "", // 物流数据
cancelParams: { // 取消售后参数
orderSn: '',
reason: ''

View File

@@ -5,7 +5,7 @@
<div class="width_1200 logo">
<div>
<router-link to="/"
><img :src="$store.state.logoImg" alt="lili shop" title="lilishop"
><img :src="$store.state.logoImg"
/></router-link>
<div>结算页</div>
</div>
@@ -569,6 +569,9 @@ export default {
<style scoped lang="scss">
@import "../../assets/styles/coupon.scss";
.goods-msg{
overflow: hidden;
}
/** logo start */
.logo {
height: 40px;
@@ -772,11 +775,13 @@ export default {
}
.goods-list {
width: 1150px;
background-color: #f8f8f8;
margin: 10px 0 20px 0;
.goods-item {
display: flex;
width:100%;
align-items: center;
justify-content: space-between;
padding: 20px 0;
@@ -799,10 +804,15 @@ export default {
> span:nth-child(1) {
font-size: 12px;
flex: 1;
text-align: left;
>span{
margin-left: 10px;
}
}
> span:last-child {
color: $theme_color;
font-weight: bold;
@@ -891,6 +901,7 @@ export default {
/** content end */
/** 底部支付栏 */
.order-footer {
z-index: 20;
height: 50px;
@include background_color($light_white_background_color);
@include title_color($title_color);

View File

@@ -2,7 +2,6 @@ import axios from 'axios';
import https from 'https';
import { Message, Spin, Modal } from 'view-design';
import Storage from './storage';
import config from '@/config';
import router from '../router/index.js';
import store from '../vuex/store';
import { handleRefreshToken } from '@/api/index';
@@ -10,20 +9,20 @@ const qs = require('qs');
// api地址
export const buyerUrl =
process.env.NODE_ENV === 'development'
? config.api_dev.buyer
: config.api_prod.buyer;
? BASE.API_DEV.buyer
: BASE.API_PROD.buyer;
export const commonUrl =
process.env.NODE_ENV === 'development'
? config.api_dev.common
: config.api_prod.common;
? BASE.API_DEV.common
: BASE.API_PROD.common;
export const managerUrl =
process.env.NODE_ENV === 'development'
? config.api_dev.manager
: config.api_prod.manager;
? BASE.API_DEV.manager
: BASE.API_PROD.manager;
export const sellerUrl =
process.env.NODE_ENV === 'development'
? config.api_dev.seller
: config.api_prod.seller;
? BASE.API_DEV.seller
: BASE.API_PROD.seller;
// 创建axios实例
var isRefreshToken = 0;
const refreshToken = getTokenDebounce();

View File

@@ -80,7 +80,7 @@ export default new Router({
name: 'login',
component: Login,
meta: {
title: 'LiLi 登录'
title: '登录'
}
},
{
@@ -88,7 +88,7 @@ export default new Router({
name: 'SignUp',
component: SignUp,
meta: {
title: 'LiLi 注册'
title: '注册'
}
},
{
@@ -96,7 +96,7 @@ export default new Router({
name: 'forgetPassword',
component: ForgetPassword,
meta: {
title: 'LiLi 忘记密码'
title: '忘记密码'
}
},
{
@@ -283,7 +283,7 @@ export default new Router({
path: 'AfterSale',
name: 'AfterSale',
component: AfterSale,
meta: {title: 'LiLi 售后'}
meta: {title: '售后'}
},
{
path: 'ApplyAfterSale',

View File

@@ -1,5 +1,5 @@
docker push registry.cn-beijing.aliyuncs.com/lili-images/buyer-ui-4.2.0:0.0.2
docker push registry.cn-beijing.aliyuncs.com/lili-images/wap-ui-4.2.0:0.0.2
docker push registry.cn-beijing.aliyuncs.com/lili-images/seller-ui-4.2.0:0.0.2
docker push registry.cn-beijing.aliyuncs.com/lili-images/manager-ui-4.2.0:0.0.2
docker push registry.cn-beijing.aliyuncs.com/lili-images/buyer-ui:4.2.2.1
docker push registry.cn-beijing.aliyuncs.com/lili-images/wap-ui:4.2.2.1
docker push registry.cn-beijing.aliyuncs.com/lili-images/seller-ui:4.2.2.1
docker push registry.cn-beijing.aliyuncs.com/lili-images/manager-ui:4.2.2.1

View File

@@ -1 +1 @@
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/manager-ui-4.2.0:0.0.2 .
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/manager-ui:4.2.2.1 .

30
manager/public/config.js Normal file
View File

@@ -0,0 +1,30 @@
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 // 跳转买家端地址 pc端
*/
PC_URL: "https://pc-b2b2c.pickmall.cn",
/**
* @description // 跳转买家端地址 wap端
*/
WAP_URL: "https://m-b2b2c.pickmall.cn",
/**
* @description api请求基础路径前缀
*/
PREFIX: "/manager"
};

View File

@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
<link rel="icon" href="./logo.ico" type="image/x-icon" />
<title>lili admin</title>
<title>admin</title>
<meta name="keywords" content="keywords" />
<meta name="description" content="description" />
<% for(var css of htmlWebpackPlugin.options.cdn.css) { %>
@@ -67,9 +67,10 @@
<% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%=js%>"></script>
<% } %>
<script src="/config.js"></script>
<noscript>
<strong
>We're sorry but lili-admin doesn't work properly without JavaScript
>We're sorry but admin doesn't work properly without JavaScript
enabled. Please enable it to continue.</strong
>
</noscript>

View File

@@ -10,9 +10,9 @@ import {
postRequestWithNoForm,
managerUrl
} from "@/libs/axios";
import config from "@/config";
let commonUrl = (process.env.NODE_ENV === 'development' ? config.api_dev.common : config.api_prod.common)
let commonUrl = (process.env.NODE_ENV === 'development' ? BASE.API_DEV.common : BASE.API_PROD.common)
// 文件上传接口
export const uploadFile = commonUrl+ "/common/upload/file";
@@ -49,6 +49,12 @@ export const getNoticePage = (params) => {
export const login = (params) => {
return getRequestWithNoToken("/user/login", params);
};
// 登出
export const logout = () => {
return postRequest("/user/logout");
};
// 刷新token
export const handleRefreshToken = (token) => {
return getRequestWithNoToken(`/user/refresh/${token}`);
@@ -408,22 +414,22 @@ export const getProgress = () => {
// 分页查询自定义分词
export const getCustomWordsPage = (params) => {
return getRequest(`/manager/custom-words`, params);
return getRequest(`/custom-words/page`, params);
};
// 添加自定义分词
export const insertCustomWords = (params) => {
return postRequest(`/manager/custom-words`, params);
return postRequest(`/custom-words`, params);
};
// 修改自定义分词
export const updateCustomWords = (params) => {
return putRequest(`/manager/custom-words`, params);
return putRequest(`/custom-words`, params);
};
// 删除自定义分词
export const delCustom = (id) => {
return deleteRequest(`/manager/custom-words/${id}`);
return deleteRequest(`/custom-words/${id}`);
};
// 设置热搜词

View File

@@ -2,7 +2,7 @@ export default {
/**
* @description 配置显示在浏览器标签的title
*/
title: "Lili电商",
title: "lilishop",
/**
* @description token在Cookie中存储的天数默认1天
*/
@@ -16,26 +16,14 @@ export default {
/**
* @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"
// common: 'http://192.168.0.100:8890',
// buyer: 'http://192.168.0.100:8888',
// seller: 'http://192.168.0.100:8889',
// manager: 'http://192.168.0.100:8887'
},
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请求基础路径前缀
/**
* @description 高德web端申请的api key
*/
baseUrlPrefix: "/manager",
aMapKey: "b440952723253aa9fe483e698057bf7d",
/**
* @description 官网地址
*/
website: "https://www.pickmall.cn",
/**
* @description 需要加载的插件
*/

View File

@@ -1,31 +1,36 @@
import axios from "axios";
import config from "@/config";
import {getStore, setStore} from "./storage.js";
import {router} from "../router/index";
import {Message} from "view-design";
import { getStore, setStore } from "./storage.js";
import { router } from "../router/index";
import { Message } from "view-design";
import Cookies from "js-cookie";
import {handleRefreshToken} from "../api/index"
import { handleRefreshToken } from "../api/index";
// 统一请求路径前缀
export const commonUrl = (process.env.NODE_ENV === 'development' ? config.api_dev.common : config.api_prod.common);
export const managerUrl = (process.env.NODE_ENV === 'development' ? config.api_dev.manager : config.api_prod.manager) + config.baseUrlPrefix;
export const commonUrl =
process.env.NODE_ENV === "development"
? BASE.API_DEV.common
: BASE.API_PROD.common;
export const managerUrl =
(process.env.NODE_ENV === "development"
? BASE.API_DEV.manager
: BASE.API_PROD.manager) + BASE.PREFIX;
const service = axios.create({
timeout: 8000,
baseURL: managerUrl
})
});
var isRefreshToken = 0;
const refreshToken = getTokenDebounce()
const refreshToken = getTokenDebounce();
service.interceptors.request.use(
config => {
if (config.method == 'get') {
if (config.method == "get") {
config.params = {
_t: Date.parse(new Date()) / 1000,
...config.params
}
};
}
const uuid = getStore('uuid');
config.headers['uuid'] = uuid;
const uuid = getStore("uuid");
config.headers["uuid"] = uuid;
return config;
},
err => {
@@ -36,7 +41,7 @@ service.interceptors.request.use(
// http response 拦截器
service.interceptors.response.use(
(response) => {
response => {
const data = response.data;
// 根据返回的code值来做不同的处理(和后端约定)
if (!data.success && data.message) {
@@ -76,7 +81,7 @@ service.interceptors.response.use(
return data;
}
},
async (error) => {
async error => {
// 返回状态码不为200时候的错误处理
if (error.response) {
if (error.response.status === 401) {
@@ -85,80 +90,79 @@ service.interceptors.response.use(
// 避免刷新token报错
} else if (error.response.status === 403) {
isRefreshToken++;
if(isRefreshToken === 1) {
if (isRefreshToken === 1) {
const getTokenRes = await refreshToken();
if (getTokenRes === 'success') { // 刷新token
if (getTokenRes === "success") {
// 刷新token
if (isRefreshToken === 1) {
error.response.config.headers.accessToken = getStore('accessToken')
return service(error.response.config)
error.response.config.headers.accessToken = getStore(
"accessToken"
);
return service(error.response.config);
} else {
router.go(0)
router.go(0);
}
} else {
Cookies.set("userInfoManager", "");
router.push('/login')
router.push("/login");
}
isRefreshToken = 0
isRefreshToken = 0;
}
} else {
// 其他错误处理
console.log(error.response.data);
Message.error(error.response.data.message)
Message.error(error.response.data.message);
}
}
/* router.push("/login") */
return Promise.resolve(error);
}
)
);
// 防抖闭包来一波
function getTokenDebounce() {
let lock = false
let success = false
return function () {
let lock = false;
let success = false;
return function() {
if (!lock) {
lock = true
lock = true;
let oldRefreshToken = getStore("refreshToken");
handleRefreshToken(oldRefreshToken).then(res => {
if (res.success) {
let {
accessToken,
refreshToken
} = res.result;
setStore("accessToken", accessToken);
setStore("refreshToken", refreshToken);
handleRefreshToken(oldRefreshToken)
.then(res => {
if (res.success) {
let { accessToken, refreshToken } = res.result;
setStore("accessToken", accessToken);
setStore("refreshToken", refreshToken);
success = true
lock = false
} else {
success = false
lock = false
router.push('/login')
}
}).catch((err) => {
success = false
lock = false
})
success = true;
lock = false;
} else {
success = false;
lock = false;
router.push("/login");
}
})
.catch(err => {
success = false;
lock = false;
});
}
return new Promise(resolve => {
// 一直看lock,直到请求失败或者成功
const timer = setInterval(() => {
if (!lock) {
clearInterval(timer)
clearInterval(timer);
if (success) {
resolve('success')
resolve("success");
} else {
resolve('fail')
resolve("fail");
}
}
}, 500) // 轮询时间间隔
})
}
}, 500); // 轮询时间间隔
});
};
}
export const getRequest = (url, params) => {
let accessToken = getStore("accessToken");
return service({
@@ -180,19 +184,19 @@ export const postRequest = (url, params, headers) => {
transformRequest: headers
? undefined
: [
function (data) {
let ret = "";
for (let it in data) {
ret +=
encodeURIComponent(it) +
"=" +
encodeURIComponent(data[it]) +
"&";
function(data) {
let ret = "";
for (let it in data) {
ret +=
encodeURIComponent(it) +
"=" +
encodeURIComponent(data[it]) +
"&";
}
ret = ret.substring(0, ret.length - 1);
return ret;
}
ret = ret.substring(0, ret.length - 1);
return ret;
}
],
],
headers: {
"Content-Type": "application/x-www-form-urlencoded",
accessToken: accessToken,
@@ -238,19 +242,19 @@ export const putRequest = (url, params, headers) => {
transformRequest: headers
? undefined
: [
function (data) {
let ret = "";
for (let it in data) {
ret +=
encodeURIComponent(it) +
"=" +
encodeURIComponent(data[it]) +
"&";
function(data) {
let ret = "";
for (let it in data) {
ret +=
encodeURIComponent(it) +
"=" +
encodeURIComponent(data[it]) +
"&";
}
ret = ret.substring(0, ret.length - 1);
return ret;
}
ret = ret.substring(0, ret.length - 1);
return ret;
}
],
],
headers: {
"Content-Type": "application/x-www-form-urlencoded",
accessToken: accessToken,
@@ -321,7 +325,6 @@ export const getRequestWithNoToken = (url, params) => {
});
};
/**
* 无需token验证的请求 避免旧token过期导致请求失败
* @param {*} url
@@ -334,4 +337,3 @@ export const postRequestWithNoToken = (url, params) => {
params: params
});
};

View File

@@ -1,21 +1,16 @@
import axios from 'axios';
import {
getCurrentPermissionList
} from '@/api/index';
import lazyLoading from './lazyLoading.js';
import router from '@/router/index';
import { getCurrentPermissionList } from "@/api/index";
import lazyLoading from "./lazyLoading.js";
import Cookies from "js-cookie";
let util = {
let util = {};
};
util.title = function (title) {
title = title || 'lili 运营后台';
util.title = function(title) {
title = title || "运营后台";
window.document.title = title;
};
// 判断元素是否存在于数组中
util.oneOf = function (ele, targetArr) {
util.oneOf = function(ele, targetArr) {
if (targetArr.indexOf(ele) >= 0) {
return true;
} else {
@@ -24,7 +19,7 @@ util.oneOf = function (ele, targetArr) {
};
// 打开新的页面
util.openNewPage = function (vm, name, argu, query) {
util.openNewPage = function(vm, name, argu, query) {
if (!vm.$store) {
return;
}
@@ -33,8 +28,9 @@ util.openNewPage = function (vm, name, argu, query) {
let i = 0;
let tagHasOpened = false;
while (i < openedPageLen) {
if (name == pageOpenedList[i].name) { // 页面已经打开
vm.$store.commit('pageOpenedList', {
if (name == pageOpenedList[i].name) {
// 页面已经打开
vm.$store.commit("pageOpenedList", {
index: i,
argu: argu,
query: query
@@ -45,7 +41,7 @@ util.openNewPage = function (vm, name, argu, query) {
i++;
}
if (!tagHasOpened) {
let tag = vm.$store.state.app.tagsList.filter((item) => {
let tag = vm.$store.state.app.tagsList.filter(item => {
if (item.children) {
return name == item.children[0].name;
} else {
@@ -61,17 +57,21 @@ util.openNewPage = function (vm, name, argu, query) {
if (query) {
tag.query = query;
}
vm.$store.commit('increateTag', tag);
vm.$store.commit("increateTag", tag);
}
}
};
util.toDefaultPage = function (routers, name, route, next) {
util.toDefaultPage = function(routers, name, route, next) {
let len = routers.length;
let i = 0;
let notHandle = true;
while (i < len) {
if (routers[i].name == name && routers[i].children && routers[i].redirect == undefined) {
if (
routers[i].name == name &&
routers[i].children &&
routers[i].redirect == undefined
) {
route.replace({
name: routers[i].children[0].name
});
@@ -86,21 +86,24 @@ util.toDefaultPage = function (routers, name, route, next) {
}
};
util.initRouter = function (vm) { // 初始化路由
util.initRouter = function(vm) {
// 初始化路由
const constRoutes = [];
const otherRoutes = [];
// 404路由需要和动态路由一起加载
const otherRouter = [{
path: '/*',
name: 'error-404',
meta: {
title: '404-页面不存在'
},
frontRoute: 'error-page/404'
}];
const otherRouter = [
{
path: "/*",
name: "error-404",
meta: {
title: "404-页面不存在"
},
frontRoute: "error-page/404"
}
];
// 判断用户是否登录
let userInfo = Cookies.get('userInfoManager')
let userInfo = Cookies.get("userInfoManager");
if (!userInfo) {
// 未登录
return;
@@ -114,13 +117,13 @@ util.initRouter = function (vm) { // 初始化路由
// 格式化数据,设置 空children 为 null
for (let i = 0; i < menuData.length; i++) {
let t = menuData[i].children
let t = menuData[i].children;
for (let k = 0; k < t.length; k++) {
let tt = t[k].children;
for (let z = 0; z < tt.length; z++) {
tt[z].children = null
tt[z].children = null;
// 给所有三级路由添加字段显示一级菜单name方便点击页签时的选中筛选
tt[z].firstRouterName = menuData[i].name
tt[z].firstRouterName = menuData[i].name;
}
}
}
@@ -131,20 +134,23 @@ util.initRouter = function (vm) { // 初始化路由
util.initAllMenuData(constRoutes, menuData);
util.initRouterNode(otherRoutes, otherRouter);
// 添加所有主界面路由
vm.$store.commit('updateAppRouter', constRoutes.filter(item => item.children.length > 0));
vm.$store.commit(
"updateAppRouter",
constRoutes.filter(item => item.children.length > 0)
);
// 添加全局路由
vm.$store.commit('updateDefaultRouter', otherRoutes);
vm.$store.commit("updateDefaultRouter", otherRoutes);
// 添加菜单路由
util.initMenuData(vm, menuData);
// 缓存数据 修改加载标识
window.localStorage.setItem('menuData', JSON.stringify(menuData));
vm.$store.commit('setAdded', true);
window.localStorage.setItem("menuData", JSON.stringify(menuData));
vm.$store.commit("setAdded", true);
});
} else {
// 读取缓存数据
let data = window.localStorage.getItem('menuData');
let data = window.localStorage.getItem("menuData");
if (!data) {
vm.$store.commit('setAdded', false);
vm.$store.commit("setAdded", false);
return;
}
let menuData = JSON.parse(data);
@@ -154,21 +160,20 @@ util.initRouter = function (vm) { // 初始化路由
};
// 添加所有顶部导航栏下的菜单路由
util.initAllMenuData = function (constRoutes, data) {
util.initAllMenuData = function(constRoutes, data) {
let allMenuData = [];
data.forEach(e => {
if (e.level == 0) {
e.children.forEach(item => {
allMenuData.push(item);
})
});
}
})
});
util.initRouterNode(constRoutes, allMenuData);
}
};
// 生成菜单格式数据
util.initMenuData = function (vm, data) {
util.initMenuData = function(vm, data) {
const menuRoutes = [];
let menuData = data;
// 顶部菜单
@@ -177,29 +182,29 @@ util.initMenuData = function (vm, data) {
let nav = {
name: e.name,
title: e.title
}
};
navList.push(nav);
})
});
if (navList.length < 1) {
return;
}
// 存入vuex
vm.$store.commit('setNavList', navList);
let currNav = window.localStorage.getItem('currNav')
vm.$store.commit("setNavList", navList);
let currNav = window.localStorage.getItem("currNav");
if (currNav) {
// 读取缓存title
for (var item of navList) {
if (item.name == currNav) {
vm.$store.commit('setCurrNavTitle', item.title);
vm.$store.commit("setCurrNavTitle", item.title);
break;
}
}
} else {
// 默认第一个
currNav = navList[0].name;
vm.$store.commit('setCurrNavTitle', navList[0].title);
vm.$store.commit("setCurrNavTitle", navList[0].title);
}
vm.$store.commit('setCurrNav', currNav);
vm.$store.commit("setCurrNav", currNav);
for (let item of menuData) {
if (item.name == currNav) {
// 过滤
@@ -209,21 +214,25 @@ util.initMenuData = function (vm, data) {
}
util.initRouterNode(menuRoutes, menuData);
// 刷新界面菜单
vm.$store.commit('updateMenulist', menuRoutes.filter(item => item.children.length > 0));
vm.$store.commit(
"updateMenulist",
menuRoutes.filter(item => item.children.length > 0)
);
let tagsList = [];
vm.$store.state.app.routers.map((item) => {
vm.$store.state.app.routers.map(item => {
if (item.children.length <= 1) {
tagsList.push(item.children[0]);
} else {
tagsList.push(...item.children);
}
});
vm.$store.commit('setTagsList', tagsList);
vm.$store.commit("setTagsList", tagsList);
};
// 生成路由节点
util.initRouterNode = function (routers, data) { // data为所有子菜单数据
util.initRouterNode = function(routers, data) {
// data为所有子菜单数据
for (let item of data) {
let menu = Object.assign({}, item);
@@ -237,8 +246,8 @@ util.initRouterNode = function (routers, data) { // data为所有子菜单数据
let meta = {};
// 给页面添加标题、父级菜单name方便左侧菜单选中
meta.title = menu.title ? menu.title + " - lilishop 运营后台" : null;
meta.firstRouterName = item.firstRouterName
meta.title = menu.title ? menu.title + " - 运营后台" : null;
meta.firstRouterName = item.firstRouterName;
menu.meta = meta;
routers.push(menu);

View File

@@ -1,5 +1,7 @@
import config from '@/config/index'
export default {
lili: 'lili',
lili: config.title,
usernameLogin: 'UsernameLogin',
mobileLogin: 'MobileLogin',
autoLogin: 'Auto Login',

View File

@@ -1,5 +1,6 @@
import config from '@/config/index'
export default {
lili: 'lili',
lili: config.title,
usernameLogin: '账户密码登录',
mobileLogin: '手机号登录',
autoLogin: '自动登录',

View File

@@ -11,23 +11,24 @@ import App from './App'
import { router } from './router/index'
import store from './store'
import i18n from '@/locale'
import vueQr from 'vue-qr'
import { getRequest, postRequest, putRequest, deleteRequest, importRequest, uploadFileRequest } from '@/libs/axios'
import { setStore, getStore, removeStore } from '@/libs/storage'
import util from '@/libs/util'
import * as filters from '@/utils/filters' // global filter
import liliDialog from '@/views/lili-dialog'
import i18nBox from '@/views/lili-components/i18n-translate'
import {md5} from '@/utils/md5.js';
Vue.config.devtools = true;
Vue.config.productionTip = false
const buyerUrlPC = 'https://pc-b2b2c.pickmall.cn' // 跳转买家端地址 pc端
const buyerUrlWap = 'https://m-b2b2c.pickmall.cn' // 跳转买家端地址 wap端
const PC_URL = BASE.PC_URL; // 跳转买家端地址 pc端
const WAP_URL = BASE.WAP_URL; // 跳转买家端地址 wap端
Vue.prototype.linkTo = function (goodsId, skuId) { // 跳转买家端商品
window.open(`${buyerUrlPC}/goodsDetail?skuId=${skuId}&goodsId=${goodsId}`, '_blank')
window.open(`${PC_URL}/goodsDetail?skuId=${skuId}&goodsId=${goodsId}`, '_blank')
};
Vue.prototype.wapLinkTo = function (goodsId, skuId) { // app端二维码
return `${buyerUrlWap}/pages/product/goods?id=${skuId}&goodsId=${goodsId}`
return `${WAP_URL}/pages/product/goods?id=${skuId}&goodsId=${goodsId}`
};
Vue.use(ViewUI, {
@@ -35,7 +36,8 @@ Vue.use(ViewUI, {
});
Vue.component('liliDialog',liliDialog)
Vue.component(vueQr)
Vue.component('i18nBox',i18nBox)

View File

@@ -1,11 +1,11 @@
import Main from "@/views/Main.vue";
import config from '@/config/index'
// 不作为Main组件的子页面展示的页面单独写如下
export const loginRouter = {
path: "/login",
name: "login",
meta: {
title: "登录 - lili运营后台"
title: `登录 - ${config.title}运营后台`
},
component: () => import("@/views/login.vue")
};

View File

@@ -1,4 +1,3 @@
$theme_color: #804ed1;
//自动移滚动条样式
@@ -89,113 +88,15 @@ ul,li{
text-overflow:ellipsis;
white-space: nowrap;
}
/*
* @Author: LMR
* @Date: 2020-08-14 11:04:12
* @Last Modified by: LMR
* @Last Modified time: 2020-08-18 14:21:41
*/
// 主题颜色
// 明亮主题颜色
$primary_color: #2d8cf0;
$primary_light_color: #0f1011;
$primary_dark_color: #2b85e4;
$success_color: #19be6b;
$warning_color: #ff9900;
$error_color: #ed3f14;
$handle-btn-color: #438cde;
$theme_color: #ed3f14;
.theme_color{
color: #ed3f14 !important;
$success_color: #68cabe;
$warning_color: #fa6419;
$error_color: #ff3c2a;
$theme_color: #FF5C58;
.theme_color {
color: $theme_color !important;
}
$border_color: #dddee1;
$title_color: #8c8c8c;
$light_title_color: #1c2438;
$light_content_color: #495060;
$light_sub_color: #80848f;
$light_background_color: #f8f8f9;
$light_white_background_color: #fff;
// 暗黑主题颜色
$dark_background_color: #141414;
$dark_sub_background_color: #1d1d1d; //稍微浅一点的
$dark_content_color: #d5d5d5;
$bg_color: #f1f6fa;
/***** 封装一些方法可用于 黑暗主题 ,明亮主题 *****/
// 背景颜色
@mixin background_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_background_color;
}
[data-theme="light"] & {
background-color: $light_background_color;
}
}
// 辅助背景颜色
@mixin sub_background_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_sub_background_color;
}
[data-theme="light"] & {
background-color: $light_background_color;
}
}
@mixin white_background_color() {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $light_white_background_color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_sub_background_color;
}
[data-theme="light"] & {
background-color: $light_white_background_color;
}
}
// 正文颜色
@mixin content_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_content_color;
}
}
// 辅助颜色
@mixin sub_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_sub_color;
}
}
// 标题颜色
@mixin title_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_title_color;
}
}
@import "./table-common.scss";

View File

@@ -1,13 +1,16 @@
@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 {

View File

@@ -57,3 +57,39 @@ export const URL =
// 固话
export const TEL = /0\d{2,3}-\d{7,8}/
// 正整数
export const INTEGER = {
pattern: /^[0-9]\d{0,10}|0$/,
message:'请输入正整数'
}
// 正整数
export const NUMBER = {
pattern: /^(\-|\+)?\d{0,10}$/,
message:'请输入数字'
}
export const VARCHAR5 = {
pattern:/^.{1,5}$/,
message:'长度应该限制在1-5个字符'
}
export const VARCHAR20 = {
pattern:/^.{1,20}$/,
message:'长度应该限制在1-20个字符'
}
export const VARCHAR255 = {
pattern:/^.{1,255}$/,
message:'超出最大长度限制'
}
export const URL200 = {
pattern:/[a-zA-z]+\:\/\/[^\s]{1,190}/,
message:'请输入长度不超过200的URL地址'
}
export const REQUIRED = {
required: true,
message:'请填写参数'
}

View File

@@ -13,23 +13,32 @@
<!-- 顶部标题栏主体 -->
<div class="main-header-con">
<div class="main-header">
<div :class="{'header-avator-con':navType!=4, 'header-avator-con nav4':navType == 4}">
<div
:class="{
'header-avator-con': navType != 4,
'header-avator-con nav4': navType == 4,
}"
>
<!-- 通知消息 -->
<message-tip v-if="tipsMessage" :res="tipsMessage"></message-tip>
<!-- 用户头像 -->
<div class="user-dropdown-menu-con">
<Row type="flex" justify="end" align="middle" class="user-dropdown-innercon">
<Dropdown transfer trigger="hover" @on-click="handleClickUserDropdown">
<div class="dropList">
<span class="main-user-name">{{ userInfo.nickName }}</span>
<Icon type="md-arrow-dropdown" />
<Avatar :src="avatarPath" style="background: #fff;margin-left: 10px;"></Avatar>
<Avatar
:src="avatarPath"
style="background: #fff; margin-left: 10px"
></Avatar>
</div>
<DropdownMenu slot="list">
<DropdownItem name="personalCenter">{{ $t('userCenter') }}</DropdownItem>
<DropdownItem name="changePass">{{ $t('changePass') }}</DropdownItem>
<DropdownItem name="loginOut" divided>{{ $t('logout') }}</DropdownItem>
<DropdownItem name="personalCenter">{{
$t("userCenter")
}}</DropdownItem>
<DropdownItem name="changePass">{{ $t("changePass") }}</DropdownItem>
<DropdownItem name="loginOut" divided>{{ $t("logout") }}</DropdownItem>
</DropdownMenu>
</Dropdown>
</Row>
@@ -60,7 +69,7 @@ import messageTip from "./main-components/message-tip.vue";
import circleLoading from "@/views/my-components/lili/circle-loading.vue";
import Cookies from "js-cookie";
import util from "@/libs/util.js";
import { getNoticePage } from "@/api/index";
import { getNoticePage, logout } from "@/api/index";
var client;
export default {
@@ -90,7 +99,7 @@ export default {
},
lang() {
return this.$store.state.app.lang;
}
},
},
methods: {
@@ -131,11 +140,13 @@ export default {
}
// 退出登录
else if (name === "loginOut") {
this.$store.commit("logout", this);
this.$store.commit('setAdded', false);
this.setStore("accessToken", "");
this.setStore("refreshToken", "");
this.$router.push({ path: "/login" });
logout().then((res) => {
this.$store.commit("logout", this);
this.$store.commit("setAdded", false);
this.setStore("accessToken", "");
this.setStore("refreshToken", "");
this.$router.push({ path: "/login" });
});
}
},
//切换标签
@@ -147,12 +158,7 @@ export default {
});
if (!openpageHasTag) {
// 解决关闭当前标签后再点击回退按钮会退到当前页时没有标签的问题
util.openNewPage(
this,
name,
this.$route.params || {},
this.$route.query || {}
);
util.openNewPage(this, name, this.$route.params || {}, this.$route.query || {});
}
},
//宽度动态计算

View File

@@ -35,7 +35,7 @@
:width="500"
>
<Form ref="form" :model="form" :label-width="100" :rules="formValidate">
<FormItem label="自定义分词" prop="sn">
<FormItem label="自定义分词" prop="name">
<Input v-model="form.name" clearable style="width: 100%" />
</FormItem>
</Form>
@@ -56,6 +56,8 @@ import {
insertCustomWords,
updateCustomWords
} from "@/api/index";
import { regular } from "@/utils";
export default {
name: "customWords",
data() {
@@ -79,11 +81,8 @@ export default {
// 表单验证规则
formValidate: {
name: [
{
required: true,
message: "请输入自定义分词",
trigger: "blur",
},
regular.REQUIRED,
regular.VARCHAR20
],
},
submitLoading: false, // 添加或编辑提交状态

View File

@@ -24,11 +24,11 @@ export const cashStatusList = [
label:'待处理'
},
{
value:'REFUSE',
value:'FAIL_AUDITING',
label:'拒绝'
},
{
value:'PASS',
value:'VIA_AUDITING',
label:'通过'
}
]
@@ -46,4 +46,4 @@ export const orderStatusList = [
value:'COMPLETE_CASH',
label:'提现完成'
}
]
]

View File

@@ -1,24 +1,27 @@
<template>
<div>
<Card>
<Row @keydown.enter.native="handleSearch" >
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="会员名称">
<Input class="search-input" v-model="searchForm.memberName"></Input>
<Form ref="searchForm" :model="searchForm" class="search-form">
<Form-item label="会员名称" class="flex" prop="memberName">
<Input
type="text" v-model="searchForm.memberName"
style="width: 200px"></Input>
</Form-item>
<Form-item label="编号">
<Input class="search-input" v-model="searchForm.sn"></Input>
<Form-item label="编号" class="flex">
<Input
type="text" v-model="searchForm.sn"
style="width: 200px"></Input>
</Form-item>
<Form-item label="状态" style="margin-left: -20px">
<Select v-model="searchForm.distributionCashStatus" style="width:150px;">
<Form-item label="状态"
style="width: 200px">
<Select v-model="searchForm.distributionCashStatus" clearable style="width: 150px">
<Option v-for="item in cashStatusList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</Form-item>
<Form-item style="margin-left:-35px;" class="br">
<Form-item>
<Button @click="handleSearch" type="primary">搜索</Button>
</Form-item>
</Form>
</Row>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10"></Table>
<Row type="flex" justify="end" class="page padding-row">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10,20,50]" size="small" show-total show-elevator show-sizer></Page>

View File

@@ -74,7 +74,7 @@ export default {
render: (h, params) => {
return h("img", {
attrs: {
src: params.row.thumbnail,
src: params.row.thumbnail || '',
alt: "加载图片失败",
},
style: {
@@ -107,20 +107,23 @@ export default {
{
title: "库存",
key: "quantity",
minWidth: 80,
},
{
title: "添加时间",
key: "createTime",
width: 170,
minWidth: 100,
},
{
title: "店铺名称",
key: "storeName",
minWidth: 100,
tooltip: true,
},
{
title: "佣金金额",
key: "commission",
minWidth: 100,
sortable: false,
render: (h, params) => {
return h(
@@ -134,7 +137,7 @@ export default {
key: "action",
align: "center",
fixed: "right",
width: 150,
minWidth: 100,
render: (h, params) => {
return h("div", [
h(

View File

@@ -2,7 +2,7 @@
<div>
<Card>
<Form ref="searchForm" @keydown.enter.native="handleSearch" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="订单编号" prop="orderSn">
<Form-item label="订单编号" prop="orderSn">
<Input
type="text"
v-model="searchForm.orderSn"
@@ -21,7 +21,7 @@
/>
</Form-item>
<Form-item label="店铺名称">
<Select v-model="searchForm.shopId" placeholder="请选择" @on-query-change="searchChange" filterable
<Select v-model="searchForm.storeId" placeholder="请选择" @on-query-change="searchChange" filterable
clearable style="width: 150px">
<Option v-for="item in shopList" :value="item.id" :key="item.id">{{ item.storeName }}</Option>
</Select>
@@ -86,22 +86,26 @@
searchForm: { // 搜索框初始化对象
pageNumber: 1, // 当前页数
pageSize: 10, // 页面大小
sort:"create_time",
order:"desc"
},
columns: [
{
title: "订单编号",
key: "orderSn",
minWidth: 100,
minWidth: 180,
fixed: "left",
tooltip: true
},
{
title: '商品信息',
slot: 'goodsMsg',
minWidth: 120
minWidth: 150
},
{
title: "退款金额",
key: "returnMoney",
minWidth:80,
sortable: false,
render: (h, params) => {
if(params.row.sellBackRebate == null){
@@ -114,23 +118,24 @@
{
title: "分销商",
key: "distributionName",
tooltip: true
tooltip: true,
minWidth:80,
},
{
title: "店铺名称",
key: "storeName",
minWidth:80,
tooltip: true
},
{
title: "状态",
slot: "distributionOrderStatus",
width: 120,
minWidth:80,
},
{
title: "佣金金额",
key: "rebateGrade",
width: 120,
minWidth:80,
sortable: false,
render: (h, params) => {
if(params.row.rebate == null){
@@ -142,9 +147,10 @@
}
},
{
fixed: "right",
title: "创建时间",
key: "createTime",
width: 180,
minWidth:100,
sortable: false,
}
],

View File

@@ -1,20 +1,20 @@
<template>
<div style="background-color: #fff;">
<Form ref="form" :model="form" :label-width="120" style="padding: 10px;">
<Form ref="form" :model="form" :rules="formRule" :label-width="120" style="padding: 10px;">
<Divider orientation="left">分销设置</Divider>
<FormItem label="是否开启分销" prop="distribution">
<FormItem label="是否开启分销" prop="isOpen">
<i-switch size="large" v-model="form.isOpen" :true-value="true" :false-value="false">
<span slot="open">开启</span>
<span slot="close">关闭</span>
</i-switch>
</FormItem>
<FormItem label="分销关系绑定天数" prop="distributionDay">
<InputNumber :min="1" style="width:100px;" v-model="form.distributionDay"></InputNumber>
<InputNumber :min="1" :max="365" style="width:100px;" v-model="form.distributionDay"></InputNumber>
</FormItem>
<FormItem label="分销结算天数" prop="cashDay">
<InputNumber :min="1" style="width:100px;" v-model="form.cashDay"></InputNumber>
<InputNumber :min="1" :max="365" style="width:100px;" v-model="form.cashDay"></InputNumber>
</FormItem>
<FormItem>
<Button type="primary" @click="submit">保存</Button>
@@ -25,15 +25,27 @@
<script>
import { setSetting, getSetting } from "@/api/index";
import { regular } from "@/utils";
export default {
name: "distributionSetting",
data() {
return {
form: {
// 添加或编辑表单对象初始化数据
isOpen: "",
isOpen: true,
distributionDay: 0, //分销关系绑定天数
cashDay: 0, //分销结算天数
},
formRule: {
isOpen: [
regular.REQUIRED
],
distributionDay: [
regular.REQUIRED
],
cashDay: [
regular.REQUIRED
],
}
};
},

View File

@@ -57,6 +57,9 @@ import {
updateGoodsUnit,
delGoodsUnit
} from "@/api/index";
import {regular} from "@/utils";
export default {
name: "goods-unit",
data() {
@@ -79,12 +82,9 @@ export default {
// 表单验证规则
formValidate: {
name: [
{
required: true,
message: "请输入计量单位",
trigger: "blur",
},
],
regular.REQUIRED,
regular.VARCHAR5
]
},
submitLoading: false, // 添加或编辑提交状态
selectList: [], // 多选数据

View File

@@ -18,10 +18,10 @@
style="width: 200px"
/>
</Form-item>
<Form-item label="商品编号" prop="sn">
<Form-item label="商品编号" prop="id">
<Input
type="text"
v-model="searchForm.sn"
v-model="searchForm.id"
placeholder="请输入商品编号"
clearable
style="width: 200px"
@@ -149,21 +149,10 @@ export default {
},
{
title: "商品编号",
key: "sn",
key: "id",
minWidth: 150,
tooltip: true
},
{
title: "成本价",
key: "price",
width: 130,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.cost, "¥")
);
},
},
{
title: "价格",
key: "price",

View File

@@ -18,10 +18,10 @@
style="width: 200px"
/>
</Form-item>
<Form-item label="商品编号" prop="sn">
<Form-item label="商品编号" prop="id">
<Input
type="text"
v-model="searchForm.sn"
v-model="searchForm.id"
placeholder="请输入商品编号"
clearable
style="width: 200px"
@@ -101,21 +101,10 @@
},
{
title: "商品编号",
key: "sn",
key: "id",
minWidth: 100,
tooltip: true
},
{
title: "成本价",
key: "price",
minWidth: 130,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.cost, "¥")
);
},
},
{
title: "价格",
key: "price",

View File

@@ -25,9 +25,8 @@
</div>
<h4>商品规格及图片</h4>
<div class="form-item-view">
<FormItem label="商品编号"> {{ goods.sn }}</FormItem>
<FormItem label="商品编号"> {{ goods.id }}</FormItem>
<FormItem label="商品价格"> ¥{{ goods.price | unitPrice }} </FormItem>
<FormItem label="市场价格"> ¥{{ goods.cost | unitPrice }} </FormItem>
<FormItem label="商品图片">
<div class="demo-upload-list" v-for="(item, __index) in goods.goodsGalleryList" :key="__index">
<img :src="item"/>
@@ -69,14 +68,6 @@
<div v-html="goods.mobileIntro"></div>
</FormItem>
</div>
<h4>商品物流信息</h4>
<div class="form-item-view">
<FormItem label="商品重量">
<Input v-model="goods.weight">
<span slot="append">kg</span>
</Input>
</FormItem>
</div>
</div>
</Card>
</Form>

View File

@@ -1,9 +1,10 @@
<template>
<div class="search">
<Card>
<Form ref="searchForm" @keydown.enter.native="handleSearch" :model="searchForm" inline :label-width="70" class="search-form">
<Form ref="searchForm" @keydown.enter.native="handleSearch" :model="searchForm" inline :label-width="70"
class="search-form">
<Form-item label="品牌名称">
<Input type="text" v-model="searchForm.name" placeholder="请输入品牌名称" clearable style="width: 200px" />
<Input type="text" v-model="searchForm.name" placeholder="请输入品牌名称" clearable style="width: 200px"/>
</Form-item>
<Button @click="handleSearch" type="primary">搜索</Button>
</Form>
@@ -12,14 +13,15 @@
</Row>
<Table :loading="loading" border :columns="columns" :data="data" ref="table"></Table>
<Row type="flex" justify="end" class="mt_10">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"
show-total show-elevator show-sizer></Page>
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage"
@on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"
show-total show-elevator show-sizer></Page>
</Row>
</Card>
<Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="500">
<Form ref="form" :model="form" :label-width="100" :rules="formValidate">
<FormItem label="品牌名称" prop="name">
<Input v-model="form.name" clearable style="width: 100%" />
<Input v-model="form.name" clearable style="width: 100%"/>
</FormItem>
<FormItem label="品牌图标" prop="logo">
<upload-pic-input v-model="form.logo" style="width: 100%"></upload-pic-input>
@@ -43,6 +45,8 @@ import {
} from "@/api/goods";
import uploadPicInput from "@/views/my-components/lili/upload-pic-input";
import {regular} from "@/utils";
export default {
name: "brand",
components: {
@@ -68,7 +72,16 @@ export default {
deleteFlag: "",
},
// 表单验证规则
formValidate: {},
formValidate: {
name: [
regular.REQUIRED,
regular.VARCHAR20
],
logo: [
regular.REQUIRED,
regular.URL200
],
},
submitLoading: false, // 添加或编辑提交状态
columns: [
{
@@ -85,7 +98,7 @@ export default {
render: (h, params) => {
return h("img", {
attrs: {
src: params.row.logo,
src: params.row.logo || '',
alt: "加载图片失败",
},
style: {
@@ -104,9 +117,9 @@ export default {
align: "left",
render: (h, params) => {
if (params.row.deleteFlag == 0) {
return h("Tag", {props: {color: "green",},},"启用");
return h("Tag", {props: {color: "green",},}, "启用");
} else if (params.row.deleteFlag == 1) {
return h("Tag", {props: {color: "volcano",},},"禁用");
return h("Tag", {props: {color: "volcano",},}, "禁用");
}
},
filters: [
@@ -323,7 +336,7 @@ export default {
content: "您确认要启用品牌 " + v.name + " ?",
loading: true,
onOk: () => {
disableBrand(v.id, { disable: false }).then((res) => {
disableBrand(v.id, {disable: false}).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("操作成功");
@@ -340,7 +353,7 @@ export default {
content: "您确认要禁用品牌 " + v.name + " ?",
loading: true,
onOk: () => {
disableBrand(v.id, { disable: true }).then((res) => {
disableBrand(v.id, {disable: true}).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("操作成功");

View File

@@ -171,9 +171,17 @@ export default {
// 表单验证规则
formValidate: {
commissionRate: [
{ required: true, message: "请填写佣金比例" },
{ pattern: regular.Integer, message: "佣金比例不能为负" },
regular.REQUIRED,
regular.INTEGER
],
name:[
regular.REQUIRED,
regular.VARCHAR20,
],
sortOrder:[
regular.REQUIRED,
regular.INTEGER
]
},
columns: [
{
@@ -475,4 +483,4 @@ export default {
min-height: 100vh;
height: auto;
}
</style>
</style>

View File

@@ -1,18 +1,18 @@
<template>
<div style="width: 100%;">
<div style="width: 100%">
<Card>
<Button @click="handleAddParamsGroup" type="primary">添加</Button>
</Card>
<div class="row">
<Card v-if="paramsGroup.length==0">
暂无参数绑定信息
</Card>
<Card v-if="paramsGroup.length == 0"> 暂无参数绑定信息 </Card>
<div class="paramsGroup" v-else>
<Card style="width: 350px; margin:7px;" v-for="group in paramsGroup" :key="group.groupId" :bordered="false">
<Card
style="width: 350px; margin: 7px"
v-for="(group, index) in paramsGroup"
:key="index"
:bordered="false"
>
<p slot="title">
<Icon type="ios-film-outline"></Icon>&nbsp;{{ group.groupName }}
</p>
@@ -23,34 +23,60 @@
<Icon type="ios-arrow-down"></Icon>
</a>
<Dropdown-menu slot="list">
<Dropdown-item @click.native="handleEditParamsGroup(group)">编辑</Dropdown-item>
<Dropdown-item @click.native="handleDeleteParamGroup(group)">删除</Dropdown-item>
<Dropdown-item @click.native="handleEditParamsGroup(group)"
>编辑</Dropdown-item
>
<Dropdown-item @click.native="handleDeleteParamGroup(group)"
>删除</Dropdown-item
>
</Dropdown-menu>
</Dropdown>
<Icon type="arrow-down-b"></Icon>
</p>
<template v-if="group.params && group.params.length > 0">
<div v-for="param in group.params" :key="param.param_id" class="params">
<div
v-for="(param, paramId) in group.params"
:key="paramId"
class="params"
>
<span>{{ param.paramName }}</span>
<span>
<i-button type="text" @click="handleEditParams(group, param)">编辑</i-button>
<i-button type="text" size="small" style="color: #f56c6c" @click="handleDeleteParam(group, param)">删除</i-button>
<i-button type="text" @click="handleEditParams(group, param)"
>编辑</i-button
>
<i-button
type="text"
size="small"
style="color: #f56c6c"
@click="handleDeleteParam(group, param)"
>删除</i-button
>
</span>
</div>
</template>
<div v-else style="align-content: center">暂无数据...</div>
<div style="text-align: center">
<i-button type="text" @click="handleAddParams(group)">添加</i-button>
<i-button type="text" @click="handleAddParams(group)"
>添加</i-button
>
</div>
</Card>
</div>
</div>
<div>
<Modal :title="modalTitle" v-model="dialogParamsVisible" :mask-closable="false" :width="500">
<Form ref="paramForm" :model="paramForm" :label-width="100" :rules="formValidate">
<Modal
:title="modalTitle"
v-model="dialogParamsVisible"
:mask-closable="false"
:width="500"
>
<Form
ref="paramForm"
:model="paramForm"
:label-width="100"
:rules="formValidate"
>
<FormItem label="参数名称" prop="paramName">
<Input v-model="paramForm.paramName" style="width: 100%" />
</FormItem>
@@ -66,42 +92,71 @@
style="width: 100%; text-align: left; margin-right: 10px"
>
<Option
v-for="item in ops"
v-for="(item, itemIndex) in ops.options"
:value="item"
:key="item"
:key="itemIndex"
:label="item"
>
{{item}}
{{ item }}
</Option>
</Select>
</FormItem>
<FormItem label="选项" prop="specName3">
<Checkbox label=1 v-model="paramForm.required">必填</Checkbox>
<Checkbox label=1 v-model="paramForm.isIndex">可索引</Checkbox>
<Checkbox label="1" v-model="paramForm.required">必填</Checkbox>
<Checkbox label="1" v-model="paramForm.isIndex">可索引</Checkbox>
</FormItem>
<FormItem label="排序" prop="specName3">
<Input type="number" v-model="paramForm.sort" style="width: 100%" />
<FormItem label="排序" prop="sort">
<InputNumber
:min="0"
type="number"
v-model="paramForm.sort"
style="width: 100%"
/>
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="dialogParamsVisible = false">取消</Button>
<Button type="primary" :loading="submitLoading" @click="submitParamForm">提交</Button>
<Button
type="primary"
:loading="submitLoading"
@click="submitParamForm"
>提交</Button
>
</div>
</Modal>
</div>
<div>
<Modal :title="modalTitle" v-model="dialogParamsGroupVisible" :mask-closable="false" :width="500">
<Form ref="paramGroupForm" :model="paramGroupForm" :label-width="100" :rules="paramGroupValidate">
<Modal
:title="modalTitle"
v-model="dialogParamsGroupVisible"
:mask-closable="false"
:width="500"
>
<Form
@submit.native.prevent
@keydown.enter.native="submitParamGroupForm"
ref="paramGroupForm"
:model="paramGroupForm"
:label-width="100"
:rules="paramGroupValidate"
>
<FormItem label="参数名称" prop="groupName">
<Input v-model="paramGroupForm.groupName" style="width: 100%" />
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="dialogParamsGroupVisible = false">取消</Button>
<Button type="primary" :loading="submitLoading" @click="submitParamGroupForm">提交</Button>
<Button type="text" @click="dialogParamsGroupVisible = false"
>取消</Button
>
<Button
type="primary"
:loading="submitLoading"
@click="submitParamGroupForm"
>提交</Button
>
</div>
</Modal>
</div>
@@ -117,10 +172,14 @@ import {
updateParamsGroup,
deleteParamsGroup,
} from "@/api/goods";
import { regular } from "@/utils";
export default {
name: "categoryParams",
data() {
return {
submitLoading: false,
/** 分类ID */
categoryId: this.$route.query.id,
/** 参数组 */
@@ -134,24 +193,24 @@ export default {
/** 参数组添加或编辑弹出框 */
dialogParamsGroupVisible: false,
//参数表单
paramForm: {},
paramForm: {
sort: 1,
},
/** 参数值 **/
ops:{
options: []
ops: {
options: [],
},
// 参数表单
paramGroupForm: {},
/** 添加、编辑参数 规格 */
formValidate: {
paramName: [
{ required: true, message: "参数名称不能为空", trigger: "blur" },
],
paramName: [regular.REQUIRED, regular.VARCHAR5],
options: [regular.REQUIRED, regular.VARCHAR255],
sort: [regular.REQUIRED, regular.INTEGER],
},
/** 参数组*/
paramGroupValidate: {
groupName: [
{ required: true, message: "参数组名称不能为空", trigger: "blur" },
],
groupName: [regular.REQUIRED, regular.VARCHAR5],
},
};
},
@@ -160,6 +219,7 @@ export default {
return val === 1 ? "输入项" : "选择项";
},
},
methods: {
// 初始化数据
init() {
@@ -183,17 +243,18 @@ export default {
},
//弹出修改参数框
handleEditParams(group, param) {
console.log(group, param);
this.paramForm = {
paramName: param.paramName,
options: param.options.split(","),
required: param.required==1?true:false,
isIndex: param.isIndex==1?true:false,
groupId: group.groupId,
categoryId: this.categoryId,
sort: param.sort,
options: param.options.split(","),
required: param.required == 1 ? true : false,
isIndex: param.isIndex == 1 ? true : false,
groupId: param.groupId || "",
categoryId: param.categoryId || "",
sort: param.sort || 1,
id: param.id,
};
this.ops = this.paramForm.options
this.ops.options = this.paramForm.options;
this.modalType = 1;
this.modalTitle = "修改参数";
this.dialogParamsVisible = true;
@@ -211,12 +272,8 @@ export default {
},
// 添加参数
handleAddParamsGroup() {
this.paramGroupForm = {
};
this.ops = {
};
this.paramGroupForm = {};
this.ops = {};
(this.paramGroupForm.categoryId = this.categoryId), (this.modalType = 0);
this.modalTitle = "添加参数组";
@@ -236,7 +293,7 @@ export default {
}
});
} else {
console.warn(this.paramGroupForm)
console.warn(this.paramGroupForm);
updateParamsGroup(this.paramGroupForm).then((res) => {
this.submitLoading = false;
if (res.success) {
@@ -255,10 +312,11 @@ export default {
this.$refs.paramForm.validate((valid) => {
if (valid) {
this.submitLoading = true;
let data = JSON.parse(JSON.stringify(this.paramForm));
data.isIndex = Number(data.isIndex);
data.required = Number(data.required);
if (this.modalType === 0) {
this.paramForm.isIndex = Number(this.paramForm.isIndex);
this.paramForm.required = Number(this.paramForm.required);
insertGoodsParams(this.paramForm).then((res) => {
insertGoodsParams(data).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("参数添加成功");
@@ -267,10 +325,10 @@ export default {
}
});
} else {
console.warn(this.paramForm.isIndex)
this.paramForm.isIndex = Number(this.paramForm.isIndex);
this.paramForm.required = Number(this.paramForm.required);
updateGoodsParams(this.paramForm).then((res) => {
console.warn(data.isIndex);
data.isIndex = Number(data.isIndex);
data.required = Number(data.required);
updateGoodsParams(data).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("参数修改成功");
@@ -334,11 +392,12 @@ export default {
},
};
</script>
<style lang="scss" >
<style lang="scss">
.row {
overflow: hidden;
margin: 20px 0;
}
.params {
align-items: center;
display: flex;
@@ -347,6 +406,7 @@ export default {
font-size: 14px;
justify-content: space-between;
}
.ivu-card-head {
background-color: #f5f7fa;
}
@@ -354,6 +414,7 @@ export default {
.ivu-btn {
font-size: 13px;
}
.paramsGroup {
flex-wrap: wrap;
display: flex;

View File

@@ -56,7 +56,8 @@
:mask-closable="false"
:width="500"
>
<Form ref="form" :model="form" :label-width="100">
<Form ref="form" :model="form" :label-width="100"
:rules="formValidate">
<FormItem label="规格名称" prop="specName">
<Input v-model="form.specName" maxlength="30" clearable style="width: 100%"/>
</FormItem>
@@ -92,6 +93,7 @@ import {
delSpec
} from "@/api/goods";
import {regular} from "@/utils";
export default {
name: "spec",
components: {},
@@ -108,6 +110,17 @@ export default {
sort: "createTime", // 默认排序字段
order: "asc", // 默认排序方式
},
// 表单验证规则
formValidate: {
specName: [
regular.REQUIRED,
// regular.VARCHAR20
],
specValue: [
regular.REQUIRED,
regular.VARCHAR255
],
},
form: {
// 添加或编辑表单对象初始化数据
specName: "",
@@ -280,6 +293,7 @@ export default {
this.modalType = 0;
this.modalTitle = "添加";
this.$refs.form.resetFields();
this.specValue = '';
delete this.form.id;
this.modalVisible = true;
},

View File

@@ -90,8 +90,7 @@ h4 {
color: #ffaa71;
}
}
.count-list {
}
.flow-list {
height: 330px;

View File

@@ -68,7 +68,7 @@
<div class="counts">{{$store.state.notices.refund|| 0}}</div>
<div>待审核售后</div>
</div>
<div class="todo-item" >
<div class="todo-item">
<div class="counts">{{$store.state.notices.distributionCash|| 0}}</div>
<div>待审核分销提现</div>
</div>
@@ -197,6 +197,7 @@
<Table stripe :columns="tophotShopsColumns" :data="topHotShopsData"></Table>
</div>
</div>
</template>
@@ -205,11 +206,22 @@ import { homeStatistics, hotGoods, hotShops, getNoticePage } from "@/api/index";
import * as API_Goods from "@/api/goods";
import { Chart } from "@antv/g2";
import * as API_Member from "@/api/member";
// import i18nBox from '@/views/lili-components/i18n-translate'
export default {
name: "home",
// components:{
// i18nBox
// },
data() {
return {
tophotShopsColumns: [ // 表格表头
// 测试数据
test: {
a: "test",
languages:[]
},
// 测试数据结束
tophotShopsColumns: [
// 表格表头
{
type: "index",
width: 100,
@@ -275,7 +287,8 @@ export default {
pvChart: "", // 流量统计
orderChart: "", // 订单统计
historyMemberChart: "", // 最近会员流量统计
params: { // 请求参数
params: {
// 请求参数
searchType: "LAST_SEVEN",
},
// 订单传参
@@ -475,15 +488,13 @@ export default {
}
},
// 历史在线人数
initHistoryMemberChart(){
initHistoryMemberChart() {
// 默认已经加载 legend-filter 交互
let data = this.chartList;
data.forEach((item) => {
item.title = "历史在线人数";
item.date = item.date.substring(5)
item.date = item.date.substring(5);
});
this.historyMemberChart.data(data);
@@ -495,16 +506,14 @@ export default {
this.historyMemberChart
.line()
.position("date*num")
.color("title",['#ffaa71'])
.shape("smooth")
;
.color("title", ["#ffaa71"])
.shape("smooth");
this.historyMemberChart
.point()
.position("date*num")
.color("title",['#ffaa71'])
.shape("circle")
;
.color("title", ["#ffaa71"])
.shape("circle");
this.historyMemberChart.render();
},
// 初始化信息

View File

@@ -0,0 +1,55 @@
<template>
<div>
<Button @click="enable = true">语言设定</Button>
<Modal v-model="enable" draggable sticky scrollable :mask="false" :title="title">
<Tabs closable type="card" @on-tab-remove="handleTabRemove" :value="language[0].title">
<TabPane v-for="(item,index) in language" :key="index" :label="item.title" :name="item.title">
<Input v-model="item.___i18n" />
</TabPane>
</Tabs>
</Modal>
</div>
</template>
<script>
import {language} from "./languages";
export default {
/**
* tabs 循环的语言内容格式 [{'title':'test','value':'val'}]
*/
props: {
value: {
type: null,
default: "",
},
},
watch: {
language: {
handler(val) {
this.$emit("language", { language: [...val], val: this.value });
},
deep: true,
},
},
data() {
return {
language,
tabVal: "",
enable: false, //是否开启modal
title: "转换语言",
};
},
methods: {
// 删除tab标签将没有用的语音进行删除
handleTabRemove(tab) {
this.language = this.language.filter((item) => {
return item.value != tab;
});
},
},
};
</script>
<style lang="scss" scoped>
</style>

View File

@@ -0,0 +1 @@
export const language = [{ title: "中文",value:1 }, { title: "英文" ,value:2}];

View File

@@ -22,7 +22,7 @@
<div class="wap-content-desc-title">{{ item.storeName }}</div>
<div class="self-operated" :class="{'theme_color':item.selfOperated }">{{ item.selfOperated ? '自营' : '非自营' }}</div>
<div class="wap-sku" :class="{'theme_color':!item.storeDisable }">{{ item.storeDisable ? '开启中' : '关闭' }}</div>
<div class="wap-sku" :class="{'theme_color':(item.storeDisable === 'OPEN' ? true : false) }">{{ item.storeDisable === 'OPEN' ? '开启中' : '未开启' }}</div>
</div>
</div>
<Spin size="large" fix v-if="loading"></Spin>
@@ -41,6 +41,7 @@ export default {
params: { // 请求参数
pageNumber: 1,
pageSize: 10,
storeDisable: "OPEN",
storeName: "",
},
shopsData: [], // 店铺数据

View File

@@ -615,7 +615,7 @@ export const modelData = [{
icon: 'md-image',
options: {
list: [{
name: 'LILI生鲜',
name: '生鲜',
describe: "年货带回家 满199减60",
img: require('@/assets/nav/decorate8.png'),
url: '',
@@ -624,8 +624,8 @@ export const modelData = [{
size: '170*170'
},
{
name: 'LILI众筹',
describe: "备孕有孕检测仪",
name: '众筹',
describe: "年货带回家",
img: require('@/assets/nav/decorate9.png'),
url: '',
fromColor: "#325bb4",
@@ -633,7 +633,7 @@ export const modelData = [{
size: '170*170'
},
{
name: 'LILI生鲜',
name: '生鲜',
describe: "年货带回家 满199减60",
img: require('@/assets/nav/decorate8.png'),
url: '',
@@ -642,7 +642,7 @@ export const modelData = [{
size: '170*170'
},
{
name: 'LILI众筹',
name: '众筹',
describe: "备孕有孕检测仪",
img: require('@/assets/nav/decorate9.png'),
url: '',
@@ -651,7 +651,7 @@ export const modelData = [{
size: '170*170'
},
{
name: 'LILI生鲜',
name: '生鲜',
describe: "年货带回家 满199减60",
img: require('@/assets/nav/decorate8.png'),
url: '',
@@ -660,7 +660,7 @@ export const modelData = [{
size: '170*170'
},
{
name: 'LILI众筹',
name: '众筹',
describe: "备孕有孕检测仪",
img: require('@/assets/nav/decorate9.png'),
url: '',

View File

@@ -22,7 +22,7 @@
<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 || "欢迎来到LiLi Shop" | secrecyMobile }}</div>
<div>Hi{{ userInfo.nickName || "欢迎来到管理后台" | secrecyMobile }}</div>
<div v-if="userInfo.id">
<Button type="error" shape="circle">会员中心</Button>
</div>
@@ -263,7 +263,7 @@ export default {
margin-left: 5px;
}
span:nth-child(1) {
@include content_color($theme_color);
color: $theme_color;
margin-left: 0;
}
span:nth-child(2) {

View File

@@ -43,7 +43,7 @@
<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 || "欢迎来到LiLi Shop" | secrecyMobile }}</div>
<div>Hi{{ userInfo.nickName || "欢迎来到管理后台" | secrecyMobile }}</div>
<div v-if="userInfo.id">
<Button type="error" shape="circle">会员中心</Button>
</div>
@@ -343,7 +343,7 @@ export default {
margin-left: 5px;
}
span:nth-child(1) {
@include content_color($theme_color);
color: $theme_color;
margin-left: 0;
}
span:nth-child(2) {

View File

@@ -141,15 +141,7 @@ export default {
align-items: center;
justify-content: center;
.ivu-tabs-nav-container {
line-height: 2;
font-size: 17px;
box-sizing: border-box;
white-space: nowrap;
overflow: hidden;
position: relative;
zoom: 1;
}
.verify-con {
position: absolute;
top: 150px;
@@ -159,37 +151,27 @@ export default {
.form {
padding-top: 1vh;
.input-verify {
width: 67%;
}
}
.forget-pass,
.other-way {
font-size: 14px;
}
.login-btn,
.other-login {
margin-top: 3vh;
}
.icons {
display: flex;
align-items: center;
}
.other-icon {
.login-btn {
background: linear-gradient(135deg, $theme_color 0%, $warning_color 100%);
height: 40px;
cursor: pointer;
margin-left: 10px;
border-radius: 4px;
display: flex;
align-items: center;
color: rgba(0, 0, 0, 0.2);
:hover {
color: #2d8cf0;
}
justify-content: center;
font-size: 16px;
color: #fff;
width: 100%;
text-align: center;
transition: 0.35s;
}
.login-btn:hover {
opacity: .9;
border-radius: 10px;
}
}
.flex {
justify-content: center;

View File

@@ -1,28 +1,26 @@
<template>
<div class="foot">
<Row type="flex" justify="space-around" class="help">
<a class="item" href="https://pickmall.com" target="_blank">{{ $t('help') }}</a>
<a class="item" href="https://pickmall.com" target="_blank">{{ $t('privacy') }}</a>
<a class="item" href="https://pickmall.com" target="_blank">{{ $t('terms') }}</a>
<a class="item" :href="config.website" target="_blank">帮助</a>
<a class="item" :href="config.website" target="_blank">隐私</a>
<a class="item" :href="config.website" target="_blank">条款</a>
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © {{year}} - Present
<a
href="https://pickmall.cn/"
target="_blank"
style="margin:0 5px;"
>lili-shop</a> {{ $t('rights') }}
<a :href="config.website" class="href" target="_blank" style="margin:0 5px;">{{config.title}}</a>
</Row>
</div>
</template>
<script>
import config from '@/config/index'
export default {
name: "footer",
data() {
return {
year: new Date().getFullYear()
}
config,
year: new Date().getFullYear(), // 年
};
},
};
</script>
@@ -46,4 +44,5 @@ export default {
}
}
}
</style>

View File

@@ -13,7 +13,7 @@
<DropdownItem v-if="res.complain" @click.native="navigateTo('orderComplaint')">
<Badge :count="res.complain">待处理投诉审核 </Badge>
</DropdownItem>
<DropdownItem v-if="res.distributionCash" @click.native="navigateTo('distribution')">
<DropdownItem v-if="res.distributionCash" @click.native="navigateTo('distributionCash')">
<Badge :count="res.distributionCash">待处理分销商提现申请 </Badge>
</DropdownItem>
<DropdownItem v-if="res.goods" @click.native="navigateTo('applyGoods')">

View File

@@ -248,6 +248,6 @@ export default {
}
}
.ivu-tag-primary, .ivu-tag-primary.ivu-tag-dot .ivu-tag-dot-inner{
background: red;
background: $theme_color;
}
</style>

View File

@@ -31,9 +31,11 @@
<script>
import AMapLoader from "@amap/amap-jsapi-loader";
import { getRegion } from "@/api/common.js";
import config from '@/config'
export default {
data() {
return {
config,
showMap: false, // modal显隐
mapSearch: "", // 地图搜索
map: null, // 初始化地图
@@ -71,7 +73,7 @@ export default {
// 初始化地图组件
init() {
AMapLoader.load({
key: "b440952723253aa9fe483e698057bf7d", // 申请好的Web端开发者Key首次调用 load 时必填
key: this.config.aMapKey, // 申请好的Web端开发者Key首次调用 load 时必填
version: "", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: [
"AMap.ToolBar",

View File

@@ -33,7 +33,7 @@
>删除
</Button>
<Button
v-show="scope.row.level != 2"
v-show="scope.row.level != 1"
type="success"
@click="addChildren(scope.row)"
size="small"
@@ -65,14 +65,14 @@
/>
</FormItem>
</div>
<FormItem label="分类名称" prop="name">
<FormItem label="分类名称" prop="articleCategoryName">
<Input
v-model="formAdd.articleCategoryName"
clearable
style="width: 100%"
/>
</FormItem>
<FormItem label="排序值" prop="sort" style="width: 345px">
<FormItem label="排序值" prop="sort">
<InputNumber v-model="formAdd.sort"></InputNumber>
</FormItem>
</Form>
@@ -94,7 +94,7 @@ import {
} from "@/api/pages";
import TreeTable from "@/views/my-components/tree-table/Table/Table";
import uploadPicInput from "@/views/my-components/lili/upload-pic-input";
import { regular } from "@/utils";
export default {
name: "lili-components",
components: {
@@ -114,12 +114,21 @@ export default {
formAdd: {
// 添加或编辑表单对象初始化数据
parentId: "",
name: "",
sort: 1,
level: 0,
articleCategoryName:""
},
// 表单验证规则
formValidate: {},
formValidate: {
articleCategoryName:[
regular.REQUIRED,
regular.VARCHAR20,
],
sort:[
regular.REQUIRED,
regular.INTEGER
]
},
columns: [
{
title: "分类名称",

View File

@@ -48,12 +48,13 @@
<Input v-model="form.title" clearable style="width: 40%" />
</FormItem>
<FormItem label="文章分类" prop="categoryId">
<Select v-model="treeValue" placeholder="请选择" clearable style="width: 180px">
<Option :value="treeValue" style="display: none">{{
treeValue
}}
</Option>
<Tree :data="treeData" @on-select-change="handleCheckChange"></Tree>
<Tree :data="treeDataDefault" @on-select-change="handleCheckChange"></Tree>
</Select>
</FormItem>
<FormItem label="文章排序" prop="sort">
@@ -108,7 +109,7 @@ export default {
modalType: 0, // 添加或编辑标识
modalVisible: false, // 添加或编辑显示
modalTitle: "", // 添加或编辑标题
treeDataDefault: [],
searchForm: {
// 搜索框初始化对象
pageNumber: 1, // 当前页数
@@ -308,6 +309,7 @@ export default {
this.loading = false;
if (res.success) {
this.treeData = this.getTree(res.result);
this.treeDataDefault = this.getTree(res.result);
this.treeData.unshift({
title: "全部",
level: 0,
@@ -350,7 +352,7 @@ export default {
}
}
});
this.total = this.data.length;
this.total = this.data?.length;
this.loading = false;
},
// 添加文章
@@ -388,6 +390,7 @@ export default {
this.modalType = 0;
this.modalTitle = "添加文章";
this.treeValue = '';
this.form = {
sort: 1,
content:''

View File

@@ -20,11 +20,12 @@
</Card>
<Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="500">
<Form ref="form" :model="form" :label-width="100" >
<FormItem label="热词" prop="name">
<Form ref="form" :model="form" :label-width="100"
:rules="formValidate">
<FormItem label="热词" prop="keywords">
<Input v-model="form.keywords" clearable style="width: 100%" />
</FormItem>
<FormItem label="分数" prop="name">
<FormItem label="分数" prop="point">
<Input v-model="form.point" clearable style="width: 100%" />
</FormItem>
</Form>
@@ -39,6 +40,7 @@
<script>
import { getHotWords, setHotWords } from "@/api/index";
import { regular } from "@/utils";
export default {
name: "hotWords",
components: {},
@@ -53,6 +55,18 @@ export default {
point: 0,
},
data: [], // 表单数据
// 表单验证规则
formValidate: {
keywords:[
regular.REQUIRED,
regular.VARCHAR20,
],
point:[
regular.REQUIRED,
regular.NUMBER
]
},
};
},
methods: {
@@ -94,7 +108,6 @@ export default {
this.form.keywords = "";
}
this.form.point = 1;
this.$refs.form.resetFields();
this.modalVisible = true;
},
},

View File

@@ -221,6 +221,7 @@ export default {
if (res.success) {
this.$Message.success("优惠券活动已停止");
this.getDataList();
this.$Modal.remove()
}
}).catch(() => {});
},

View File

@@ -271,6 +271,7 @@ export default {
pageSize: 10,
pageNumber: 0,
couponName: query,
promotionStatus:"START"
};
this.couponLoading = true;
getPlatformCouponList(params).then((res) => {

View File

@@ -8,8 +8,8 @@
<FormItem label="选择商品" prop="scopeType">
<Button type="primary" @click="openSkuList">选择商品</Button>
<Button type="error" ghost style="margin-left: 10px" @click="delSelectGoods">批量删除
</Button>
<!-- <Button type="error" ghost style="margin-left: 10px" @click="delSelectGoods">批量删除
</Button> -->
</FormItem>
<FormItem astyle="width: 100%">
@@ -19,22 +19,18 @@
</template>
<template slot-scope="{ index }" slot="settlementPrice">
<Input type="number" v-model="form.promotionGoodsList[index].settlementPrice" />
<InputNumber :min="0" v-model="form.promotionGoodsList[index].settlementPrice" />
</template>
<template slot-scope="{ index }" slot="lowestPrice">
<Input type="number" v-model="form.promotionGoodsList[index].lowestPrice" />
<InputNumber :min="0" v-model="form.promotionGoodsList[index].lowestPrice" />
</template>
<template slot-scope="{ index }" slot="highestPrice">
<Input type="number" v-model="form.promotionGoodsList[index].highestPrice" />
<InputNumber :min="0" v-model="form.promotionGoodsList[index].highestPrice" />
</template>
<template slot-scope="{ index }" slot="purchasePrice">
<Input type="number" v-model="form.promotionGoodsList[index].purchasePrice" />
</template>
<template slot-scope="{ index }" slot="stock">
<Input type="number" v-model="form.promotionGoodsList[index].stock" />
<InputNumber :min="0" v-model="form.promotionGoodsList[index].stock" />
</template>
</Table>
</FormItem>
@@ -122,12 +118,6 @@ export default {
slot: "highestPrice",
width: 110,
},
{
title: "最低购买金额",
slot: "purchasePrice",
width: 110,
},
{
title: "活动库存",
slot: "stock",
@@ -209,11 +199,7 @@ export default {
this.$Message.error("活动库存不能为0且不能超过商品库存");
return;
}
// 最低购买金额格式校验
if (!regular.money.test(res.purchasePrice)) {
checkResult = false;
this.$Message.error("最低购买金额格式不正确");
}
// 结算价格金额格式校验
if (!regular.money.test(res.settlementPrice)) {
checkResult = false;
@@ -292,28 +278,28 @@ export default {
// 已选商品批量选择
this.selectedGoods = e;
},
delSelectGoods() {
// 多选删除商品
if (this.selectedGoods.length <= 0) {
this.$Message.warning("您还未选择要删除的数据");
return;
}
this.$Modal.confirm({
title: "确认删除",
content: "您确认要删除所选商品吗?",
onOk: () => {
let ids = [];
this.selectedGoods.forEach(function (e) {
ids.push(e.id);
});
this.form.promotionGoodsList = this.form.promotionGoodsList.filter(
(item) => {
return !ids.includes(item.id);
}
);
},
});
},
// delSelectGoods() {
// // 多选删除商品
// if (this.selectedGoods.length <= 0) {
// this.$Message.warning("您还未选择要删除的数据");
// return;
// }
// this.$Modal.confirm({
// title: "确认删除",
// content: "您确认要删除所选商品吗?",
// onOk: () => {
// let ids = [];
// this.selectedGoods.forEach(function (e) {
// ids.push(e.id);
// });
// this.form.promotionGoodsList = this.form.promotionGoodsList.filter(
// (item) => {
// return !ids.includes(item.id);
// }
// );
// },
// });
// },
delGoods(index) {
// 删除商品
this.form.promotionGoodsList.splice(index, 1);
@@ -324,7 +310,7 @@ export default {
item.forEach((e) => {
list.push({
settlementPrice: e.settlementPrice || 0,
purchasePrice: e.purchasePrice || 0,
purchasePrice: 0,
lowestPrice: e.lowestPrice || 0,
highestPrice: e.highestPrice || 0,
stock: e.stock || 0,

View File

@@ -30,16 +30,7 @@
style="width: 260px"
/>
</FormItem>
<FormItem label="最低购买金额" prop="purchasePrice">
<Input
:disabled="onlyView"
type="number"
v-model="form.purchasePrice"
placeholder="请填写最低购买金额"
clearable
style="width: 260px"
/>
</FormItem>
<FormItem label="最低可砍" prop="lowestPrice">
<Input
:disabled="onlyView"
@@ -156,6 +147,7 @@
return {
modalType: 0, // 是否编辑
form: {
purchasePrice:0,
goodsSku: {},
},
id: this.$route.query.id, // 砍价活动id
@@ -166,10 +158,7 @@
{required: true, message: "请输入结算金额"},
{validator: checkSettlementPrice},
],
purchasePrice: [
{required: true, message: "请输入最低购买金额"},
{validator: checkPurchasePrice},
],
lowestPrice: [
{required: true, message: "请输入最低可砍金额"},
{validator: checkLowestPrice},
@@ -227,10 +216,7 @@
this.$Message.error("活动库存不能为0且不能超过商品库存");
return
}
// 最低购买金额格式校验
if (!regular.money.test(params.purchasePrice)) {
this.$Message.error("最低购买金额格式不正确");
}
// 结算价格金额格式校验
if (!regular.money.test(params.settlementPrice)) {
this.$Message.error("结算价格金额格式不正确");

View File

@@ -39,7 +39,7 @@
<Input v-model="formAdd.name" clearable style="width: 100%" />
</FormItem>
<FormItem label="排序值" prop="sortOrder">
<Input v-model="formAdd.sortOrder" clearable style="width: 100%" />
<InputNumber v-model="formAdd.sortOrder" :min="0" clearable style="width: 100%" />
</FormItem>
</Form>
<div slot="footer">
@@ -80,6 +80,7 @@ export default {
name: "",
deleteFlag: 0,
level: 0,
sortOrder:1
},
// 表单验证规则
formValidate: {

View File

@@ -21,7 +21,6 @@
format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择"
clearable
@on-change="applyTimeChange"
style="width: 200px"
>
</DatePicker>
@@ -33,7 +32,6 @@
format="yyyy-MM-dd"
placeholder="请选择"
clearable
@on-change="startTimeChange"
style="width: 200px"
>
</DatePicker>
@@ -176,6 +174,7 @@ export default {
delete this.form.createTime;
delete this.form.updateTime;
delete this.form.endTime;
delete this.form.seckillApplyList;
// 编辑
updateSeckill(this.form).then((res) => {
this.submitLoading = false;

View File

@@ -95,12 +95,12 @@ export default {
});
}
});
if (!this.times[i]) {
this.times.push({
time: i,
check: false,
});
}
}
if (!this.times[i]) {
this.times.push({
time: i,
check: false,
});
}
}
}

View File

@@ -14,7 +14,7 @@
<p slot="title">账单详细</p>
<div class="tips-status">
<span>商品状态</span>
<span>账单状态</span>
<span class="theme_color">{{bill.billStatus | unixSellerBillStatus}}</span>
<Button
v-if="bill.billStatus == 'CHECK'"
@@ -54,12 +54,12 @@
<p>退单产生退还佣金金额</p>
<p class="increase-color">+{{bill.refundCommissionPrice || 0 | unitPrice('¥')}}</p>
</span>
<span>
<p>退单分销返现返还</p>
<p class="increase-color">+{{bill.distributionRefundCommission || 0 | unitPrice('¥')}}</p>
</span>
<span>
<p>退单平台优惠券返还</p>
<p class="increase-color">+{{bill.siteCouponRefundCommission || 0 | unitPrice('¥')}}</p>
@@ -178,7 +178,7 @@ export default {
value: 0,
}
],
id: "", // 账单id
id: "", // 账单id
bill: {}, // 账单详情
order: [], // 订单列表
orderParam: { // 请求参数
@@ -297,13 +297,13 @@ export default {
title: "退款流水编号",
key: "sn",
minWidth: 120,
tooltip: true
tooltip: true
},
{
title: "订单编号",
key: "sn",
minWidth: 120,
tooltip: true
tooltip: true
},
{
title: "退款金额",

View File

@@ -20,7 +20,7 @@
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form>
<Row class="operation padding-row">
<Button @click="delAll">批量删除</Button>
</Row>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-selection-change="changeSelect">
</Table>

View File

@@ -21,10 +21,9 @@
</FormItem>
<FormItem label="是否自营" prop="selfOperated">
<RadioGroup type="button" button-style="solid" v-model="shopForm.selfOperated" >
<Radio :label=true>自营</Radio>
<Radio :label=false>非自营</Radio>
<Radio :label="1">自营</Radio>
<Radio :label="0">非自营</Radio>
</RadioGroup>
</FormItem>
@@ -81,7 +80,6 @@
<FormItem label="小程序唯一标识">
<Input v-model="shopForm.yzfMpSign" clearable style="width: 350px" />
</FormItem>
<Spin fix v-if="loading"></Spin>
</div>
</TabPane>
@@ -167,7 +165,7 @@
<Button @click="handleCLickImg('licencePhoto')" type="primary">选择图片</Button>
</div>
</FormItem>
<Spin fix v-if="loading"></Spin>
</div>
</TabPane>
<TabPane label="经营范围" class="tab" name="category">
@@ -361,11 +359,12 @@ export default {
indeterminate: true, // 复选框全选样式
checkAll: false, // 全选
checkAllGroup: [], // 全选数组
submitLoading: false, // 添加或编辑提交状态
settlementCycle: [], // 结算周期
shopForm: { // 店铺数据
settlementCycle: "",
selfOperated: false,
selfOperated: 0,
memberName: "",
companyName: "",
addressPath: "",
@@ -517,6 +516,8 @@ export default {
if (res.success) {
this.infoResult = res.result;
this.shopForm = res.result;
this.shopForm.selfOperated ? this.shopForm.selfOperated = 1 : this.shopForm.selfOperated = 0
this.checkAllGroup = this.shopForm.goodsManagementCategory.split(",");
if (this.shopForm.settlementCycle) {
this.settlementCycle = this.shopForm.settlementCycle.split(',')
@@ -574,7 +575,7 @@ export default {
},
// 点击定位获取店铺地址
getAddress(item) {
this.shopForm.storeCenter = item.position.lat + "," + item.position.lng;
this.shopForm.storeCenter = item.position.lng + ',' + item.position.lat;
this.$set(this.shopForm, "storeAddressPath", item.addr);
this.$set(this.shopForm, "storeAddressIdPath", item.addrId);
},

View File

@@ -141,6 +141,7 @@
v-model="messageSendForm.content"
:rows="4"
type="textarea"
maxlength="200"
style="max-height:60vh;overflow:auto;width: 70%"
/>
</FormItem>
@@ -288,7 +289,7 @@
import * as API_Other from "@/api/other.js";
import * as API_Shop from "@/api/shops.js";
import userList from "@/views/member/list/index";
import { regular } from "@/utils";
export default {
name: "noticeMessageTemplate",
components: {
@@ -316,10 +317,12 @@
},
messageFormValidate: {
title: [
{required: true, message: '请输入消息标题', trigger: 'blur'},
regular.REQUIRED,
regular.VARCHAR20
],
content: [
{required: true, message: '请输入消息内容', trigger: 'blur'},
regular.REQUIRED,
regular.VARCHAR255
],
},
//管理端消息汇总

View File

@@ -47,7 +47,7 @@
<div>
<Upload
style="display:inline-block;"
:action="baseUrl + '/common/upload/file'"
:action="commonUrl + '/common/upload/file'"
:headers="accessToken"
:on-success="handleSuccess"
:on-error="handleError"
@@ -257,6 +257,7 @@ import {
import DPlayer from "dplayer";
import config from "@/config";
import { commonUrl } from "@/libs/axios";
var dp;
export default {
name: "oss-manage",
@@ -268,8 +269,8 @@ export default {
},
data() {
return {
commonUrl, // 上传文件路径
config, // api地址
baseUrl: "", // 基础路径
selectImage: false, //是否是选择
accessToken: {}, // 上传token鉴权
loading: false, // 表单加载状态
@@ -342,7 +343,7 @@ export default {
if (params.row.fileType.includes("image") > 0) {
return h("img", {
attrs: {
src: params.row.url,
src: params.row.url || '',
alt: "加载图片失败",
},
style: {
@@ -813,10 +814,6 @@ export default {
if(!this.isComponent) { // 是组件的话,初始化不调用接口
this.init();
}
this.baseUrl =
process.env.NODE_ENV === "development"
? this.config.api_dev.common
: this.config.api_prod.common;
},
};

View File

@@ -63,7 +63,7 @@ export default {
data() {
return {
handleSubmit, // 验证规则
picModelFlag: false, // 预览图片显隐
formValidate: { // 表单数据
buyerSideLogo: "",

View File

@@ -0,0 +1,87 @@
<template>
<div class="layout">
<Form ref="formValidate" :label-width="150" label-position="right" :model="formValidate" :rules="ruleValidate">
<FormItem label="云IM地址" prop="httpUrl">
<Input v-model="formValidate.httpUrl"/>
</FormItem>
<FormItem label="平台ID" class="label-item" prop="tenantId">
<Input v-model="formValidate.tenantId"/>
</FormItem>
<div class="label-btns">
<Button type="primary" @click="submit('formValidate')">保存</Button>
</div>
</Form>
</div>
</template>
<script>
import {setSetting} from "@/api/index";
import {handleSubmit} from "./validate";
export default {
data() {
return {
ruleValidate: {}, // 验证规则
formValidate: { // 表单数据
httpUrl: "",
tenantId: ""
},
};
},
props: ["res", "type"],
created() {
this.init();
},
methods: {
// 保存
submit(name) {
let that = this;
if (handleSubmit(that, name)) {
this.setupSetting()
}
},
// 保存设置
setupSetting() {
setSetting(this.type, this.formValidate).then((res) => {
if (res.success) {
this.$Message.success("保存成功!");
} else {
this.$Message.error("保存失败!");
}
});
},
// 实例化数据
init() {
this.res = JSON.parse(this.res);
this.$set(this, "formValidate", {...this.res});
Object.keys(this.formValidate).forEach((item) => {
this.ruleValidate[item] = [
{
required: true,
message: "请填写必填项",
trigger: "blur",
},
];
});
},
},
};
</script>
<style lang="scss" scoped>
@import "./style.scss";
.label-item {
display: flex;
}
/deep/ .ivu-input {
width: 300px !important;
margin: 0 10px;
}
.ivu-input-wrapper {
width: 300px;
margin-right: 10px;
}
</style>

View File

@@ -6,7 +6,7 @@
<span slot="prepend">1积分=</span>
<span slot="append">人民币</span>
</Input>
</FormItem>
<FormItem label="注册账号" prop="register">
@@ -101,10 +101,7 @@ export default {
}
this.formValidate.pointSettingItems.push({
point: "0",
day:
this.formValidate.pointSettingItems[
this.formValidate.pointSettingItems.length - 1
].day + 1,
day: this.formValidate.pointSettingItems.length ,
});
},
// 实例化数据

View File

@@ -22,10 +22,10 @@ export default {
show: true, // 是否显示
setting: [
//基础配置
{
type: "BASE_SETTING",
name: "基础配置",
},
// {
// type: "BASE_SETTING",
// name: "基础配置",
// },
//商品设置
{
type: "GOODS_SETTING",
@@ -57,6 +57,11 @@ export default {
type: "SMS_SETTING",
name: "阿里短信配置",
},
//阿里短信配置
{
type: "IM_SETTING",
name: "客服设置",
},
],
authLogin: [
// 微信设置

View File

@@ -5,6 +5,7 @@ import POINT_SETTING from "./setting/POINT_SETTING";
import KUAIDI_SETTING from "./setting/KUAIDI_SETTING";
import OSS_SETTING from "./setting/OSS_SETTING";
import SMS_SETTING from "./setting/SMS_SETTING";
import IM_SETTING from "./setting/IM_SETTING";
import WITHDRAWAL_SETTING from "./setting/WITHDRAWAL_SETTING";
import ALIPAY_PAYMENT from "./pay/ALIPAY_PAYMENT";
import WECHAT_PAYMENT from "./pay/WECHAT_PAYMENT";
@@ -20,6 +21,7 @@ export default {
KUAIDI_SETTING,
OSS_SETTING,
SMS_SETTING,
IM_SETTING,
WITHDRAWAL_SETTING,
PAYMENT_SUPPORT,
WECHAT_PAYMENT,

View File

@@ -155,6 +155,9 @@ export default {
username: [
{required: true, message: "用户名不能为空", trigger: "blur"}
],
password: [
{required: true, message: "密码不能为空", trigger: "blur"}
],
mobile: [
{required: true, message: "手机号不能为空", trigger: "blur"},
{validator: validateMobile, trigger: "blur"}
@@ -410,6 +413,7 @@ export default {
},
// 重置密码
resetPass() {
if(this.selectCount==0) {this.$Message.warning('请选中数据后重试!'); return}
this.$Modal.confirm({
title: "确认重置",
content:

View File

@@ -1 +1 @@
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/seller-ui-4.2.0:0.0.2 .
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/seller-ui:4.2.2.1 .

View File

@@ -70,7 +70,7 @@
<script src="/config.js"></script>
<noscript>
<strong
>We're sorry but lili-admin doesn't work properly without JavaScript
>We're sorry doesn't work properly without JavaScript
enabled. Please enable it to continue.</strong
>
</noscript>

View File

@@ -1,5 +1,5 @@
// 统一请求路径前缀在libs/axios.js中修改
import {getRequest, postRequest, putRequest, deleteRequest, importRequest, getRequestWithNoToken} from '@/libs/axios';
import {getRequest} from '@/libs/axios';
// 传给后台citycode 获取城市街道等id

View File

@@ -6,6 +6,6 @@ export const getChildRegion = (id) => {
};
// 点地图获取地址信息
export const getRegion = (parpams) => {
return getRequest(`${commonUrl}/common/region/region`, parpams);
export const getRegion = (params) => {
return getRequest(`${commonUrl}/common/region/region`, params);
};

View File

@@ -31,6 +31,12 @@ export const getSellerHomeData = params => {
export const login = params => {
return postRequestWithNoToken("/login/userLogin", params);
};
// 登出
export const logout = () => {
return postRequest("/login/logout");
};
// 获取用户登录信息
export const userInfo = params => {
return getRequest("/user/info", params);

View File

@@ -13,6 +13,14 @@ export default {
* 用来在菜单中显示文字
*/
useI18n: true,
/**
* @description 高德web端申请的api key
*/
aMapKey: "b440952723253aa9fe483e698057bf7d",
/**
* @description 官网地址
*/
website: "https://www.pickmall.cn",
/**
* @description 需要加载的插件
*/

View File

@@ -1,32 +0,0 @@
import axios from 'axios';
import { getDictData } from '@/api/index';
let dictUtil = {
};
// 获取常用的数据字典保存至vuex
dictUtil.initDictData = function (vm) {
// axios.get(getDictData + "sex").then(res => {
// if(res.success){
// vm.$store.commit("setSex", res.result);
// }
// });
// axios.get(getDictData + "message_type").then(res => {
// if(res.success){
// vm.$store.commit("setMessageType", res.result);
// }
// });
// axios.get(getDictData + "priority").then(res => {
// if(res.success){
// vm.$store.commit("setPriority", res.result);
// }
// });
// axios.get(getDictData + "leave_type").then(res => {
// if(res.success){
// vm.$store.commit("setLeaveType", res.result);
// }
// });
};
export default dictUtil;

View File

@@ -1,14 +0,0 @@
const hasPermission = {
install (Vue, options) {
Vue.directive('has', {
inserted (el, binding, vnode) {
let permTypes = vnode.context.$route.meta.permTypes;
if (permTypes&&!permTypes.includes(binding.value)) {
el.parentNode.removeChild(el);
}
}
});
}
};
export default hasPermission;

View File

@@ -1,16 +0,0 @@
import { getStore } from './storage';
const hasRole = {
install (Vue, options) {
Vue.directive('hasRole', {
inserted (el, binding) {
let roles = getStore("roles");
if (roles&&!roles.includes(binding.value)) {
el.parentNode.removeChild(el);
}
}
});
}
};
export default hasRole;

View File

@@ -1,82 +0,0 @@
// 导入表格模版数据
export const userColumns = [
{
title: "username",
key: "username"
},
{
title: "password",
key: "password"
},
{
title: "avatar",
key: "avatar"
},
{
title: "departmentId",
key: "departmentId"
},
{
title: "mobile",
key: "mobile"
},
{
title: "email",
key: "email"
},
{
title: "sex",
key: "sex"
},
{
title: "address",
key: "address"
},
{
title: "type",
key: "type"
},
{
title: "status",
key: "status"
},
{
title: "delFlag",
key: "delFlag"
},
{
title: "defaultRole",
key: "defaultRole"
}
]
export const userData = [
{
username: "【记得删除该说明行】唯一用户名不能为空",
password: "密码不能为空",
avatar: "头像图片链接",
departmentId: "部门表主键id",
email: "邮箱",
mobile: "手机",
sex: "性别 0(女) 1(男)",
address: "地址数据省市编号 请勿乱填",
type: "用户类型 0(普通用户) 1(管理员)",
status: "用户状态 0(正常) -1(禁用)",
delFlag: "删除标志 0(正常) 1(已删)",
defaultRole: "角色 0(不分配默认角色) 1(分配默认注册用户角色)"
},
{
username: "lili",
password: "123456",
avatar: "https://s1.ax1x.com/2018/05/19/CcdVQP.png",
departmentId: "40652338142121984",
email: "1012139570@qq.com",
sex: 1,
address: "[\"510000\",\"510100\",\"510104\"]",
mobile: "18782059038",
type: 0,
status: 0,
delFlag: 0,
defaultRole: 1
}
]

View File

@@ -1,100 +0,0 @@
var idTmr;
function getExplorer () {
var explorer = window.navigator.userAgent;
if (explorer.indexOf('MSIE') >= 0) {
// ie
return 'ie';
} else if (explorer.indexOf('Firefox') >= 0) {
// firefox
return 'Firefox';
} else if (explorer.indexOf('Chrome') >= 0) {
// Chrome
return 'Chrome';
} else if (explorer.indexOf('Opera') >= 0) {
// Opera
return 'Opera';
} else if (explorer.indexOf('Safari') >= 0) {
// Safari
return 'Safari';
};
};
function tranform (table, aId, name) {
let tableHead = table.$children[0].$el;
let tableBody = table.$children[1].$el;
let tableInnerHTML = '<thead><tr>';
if (table.$children.length !== 1) {
let len = tableBody.rows.length;
let i = -1;
while (i < len) {
if (i == -1) {
Array.from(tableHead.rows[0].children).forEach((td) => {
tableInnerHTML = tableInnerHTML + '<th>' + td.children[0].children[0].innerHTML + '</th>';
});
tableInnerHTML += '</tr><thead><tbody>';
} else {
tableInnerHTML += '<tr>';
Array.from(tableBody.rows[i].children).forEach((td) => {
tableInnerHTML = tableInnerHTML + '<td>' + td.children[0].children[0].innerHTML + '</td>';
});
tableInnerHTML += '</tr>';
}
i++;
}
tableInnerHTML += '</tbody>';
}
if (getExplorer() !== 'Safari' && name.substr(-1, 4) !== '.xls') {
name += '.xls';
}
if (getExplorer() == 'ie') {
var curTbl = table;
var oXL = new ActiveXObject('Excel.Application');
var oWB = oXL.Workbooks.Add();
var xlsheet = oWB.Worksheets(1);
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl);
sel.select();
sel.execCommand('Copy');
xlsheet.Paste();
oXL.Visible = true;
try {
var fname = oXL.Application.GetSaveAsFilename('Excel.xls', 'Excel Spreadsheets (*.xls), *.xls');
} catch (e) {
print('Nested catch caught ' + e);
} finally {
oWB.SaveAs(fname);
// oWB.Close(savechanges = false);
oXL.Quit();
oXL = null;
idTmr = setInterval(Cleanup(), 1);
}
} else {
tableToExcel(tableInnerHTML, aId, name);
}
}
function Cleanup () {
window.clearInterval(idTmr);
// CollectGarbage();
}
let tableToExcel = (function () {
let uri = 'data:application/vnd.ms-excel;base64,';
let template = '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>';
let base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))); };
let format = function (s, c) {
return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; });
};
return function (table, aId, name) {
let ctx = {worksheet: name || 'Worksheet', table: table};
document.getElementById(aId).href = uri + base64(format(template, ctx));
document.getElementById(aId).download = name;
document.getElementById(aId).click();
};
})();
const table2excel = {};
table2excel.transform = tranform;
export default table2excel;

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