120 Commits

Author SHA1 Message Date
超凡
d311d50f8b fix:一号通/一号通配置 2025-02-14 17:44:16 +08:00
daZongZi
b0678e772f 修复 XML 有可能出现的注入风险 2025-01-17 18:15:00 +08:00
daZongZi
451c9587c0 祝看到的程序员 2025 写代码没bug 2025-01-08 16:39:05 +08:00
daZongZi
f4c9462bc8 2025 祝愿看到的老板赚大钱,看到的程序员0 bug 2025-01-07 17:57:55 +08:00
daZongZi
cd42e4d119 欢迎体验Java多商户版本
平台端 http://admimplat.merchant.java.crmeb.net/
demo / crmeb.com

商户端 http://adminmer.merchant.java.crmeb.net/
18292417675 / 000000

H5商城 https://h5.merchant.java.crmeb.net/
2024-11-14 14:48:06 +08:00
daZongZi
ab6457d0f0 多商户演示站点
平台端 http://admimplat.merchant.java.crmeb.net/
demo / crmeb.com

商户端 http://adminmer.merchant.java.crmeb.net/
18292417675 / 000000

H5商城 https://h5.merchant.java.crmeb.net/
2024-11-14 11:36:18 +08:00
daZongZi
b7ad7da4a8 CRMEB 双十一狂欢购
巅峰钜惠,正式开玩

11月7日-12日

狂欢大抽奖火热进行中

AppleiPad mini🍎山地自行车🚲️

人体工学护腰坐垫...多种劲爆大奖等着你!

还有秒杀折扣+抽奖优惠券,双重优惠

快来拼运气,双十一省出新高度!
2024-11-08 15:42:40 +08:00
聆听
99dedfb36e update README.md.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-27 01:14:47 +00:00
聆听
80cd315b44 update README.md.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-27 01:06:52 +00:00
聆听
f898ada8f1 update README.md.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-27 01:04:00 +00:00
聆听
fe66f46321 update README.md.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-27 01:01:54 +00:00
聆听
c42831c122 update README.md.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-27 01:00:20 +00:00
聆听
3a2892af9b update README.md.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-27 00:58:46 +00:00
18292417675
005e992d41 环境使用CRMEB java 开源商城 2024-09-19 16:51:43 +08:00
18292417675
cb2d80306b 欢迎使用Crmeb Java 2024-09-19 16:48:07 +08:00
大粽子
35c819ad85 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2024-09-19 08:42:21 +00:00
大粽子
f3efed1c8a update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2024-09-19 08:42:07 +00:00
18292417675
05f2e07c09 Merge branch 'master' of https://gitee.com/ZhongBangKeJi/crmeb_java
* 'master' of https://gitee.com/ZhongBangKeJi/crmeb_java:
  update README.md.
  update LICENSE.
2024-09-19 16:36:34 +08:00
18292417675
d24dbded15 欢迎使用 Crmeb Java 开源商城 2024-09-19 16:36:22 +08:00
聆听
42861506f1 update README.md.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-07 06:51:44 +00:00
聆听
7b23b704a7 update LICENSE.
Signed-off-by: 聆听 <sugar1569@vip.qq.com>
2024-09-07 06:49:15 +00:00
18292417675
0b7acb5aeb 最新的系统介绍和安装前必读 2024-08-26 09:41:35 +08:00
18292417675
da7af2c483 Java 多商户 v1.6 版本正式发布 https://www.crmeb.com/ask/thread/46123 2024-06-26 14:40:20 +08:00
18292417675
b4df491c34 多商户 1.6 版本准备正式发布 2024-06-20 14:12:12 +08:00
18292417675
6bb5a52361 多商户 1.6 版本准备正式发布 2024-06-20 14:11:27 +08:00
18292417675
f40497cf97 多商户 1.6 版本准备发布 2024-06-20 14:07:41 +08:00
18292417675
6f54fc97de 多商户 1.6 版本 准备正式发布 https://crmeb.com/ask/thread/45797 2024-06-20 12:20:23 +08:00
18292417675
5bc0280b56 1.6 正式版准备发布,详情查看 https://crmeb.com/ask/thread/45797 2024-06-20 12:14:19 +08:00
18292417675
8ca7e4cc3b java 多商户 1.6 版本更新 2024-06-19 14:37:44 +08:00
18292417675
f24d6b0deb CRMEB JAVA 618 活动莫错过年度最低 2024-06-13 15:11:49 +08:00
18292417675
b88871f6c3 修复NVDB 检测漏洞 2024-04-23 10:43:35 +08:00
18292417675
f56870bc5d 验证ios 和 android app 后 clear code 和 没有匹配到的平台匹配 2024-04-19 17:01:44 +08:00
hetian
1e3d2da804 v1.0 2024-03-29 09:26:47 +08:00
hetian
4c01405fdf nh 2024-03-12 16:43:27 +08:00
hetian
b941f3feeb Merge branch '20230906_hdq' of https://gitee.com/xazbkj/javaopensource 2024-03-12 14:18:34 +08:00
stivepeim
481a08e01d 1. 删除压缩包代码
2. 替换当前hdq 分支app 的代码为 压缩包中的文件
2024-03-12 10:23:35 +08:00
stivepeim
ef4b5b165c Merge branch 'master' of https://gitee.com/xazbkj/javaopensource
* 'master' of https://gitee.com/xazbkj/javaopensource:
  删除文件 app1
  app
  Create /app1
2024-03-11 17:49:10 +08:00
stivepeim
533ec84d35 修复 国家信息安全漏洞共享平台(CNVD) 测试出的可能出现Sql 注入的问题 2024-03-11 17:48:50 +08:00
何天
e4ba375901 app 2024-03-11 02:49:37 +00:00
何天
2af823b34a 删除文件 app1 2024-03-11 02:48:41 +00:00
何天
a4adc9b2e4 app 2024-03-11 02:48:06 +00:00
何天
8818fbcf85 Create /app1 2024-03-11 02:44:38 +00:00
stivepeim
1bab07a1fb clear QQ Channel 2024-02-29 11:14:23 +08:00
stivepeim
72d03d5cd7 感谢开发团队 2023-12-28 17:53:53 +08:00
stivepeim
1718108ee4 CRMEB开源技术交流群
扫码进群可领取开源版接口文档、产品功能清单、高清UI设计图、思维脑图!
2023-12-28 17:44:15 +08:00
stivepeim
58c527bd93 欢迎加入Java群讨论有趣的话题 2023-12-28 17:39:15 +08:00
stivepeim
b689d74472 修复切片 2023-10-07 15:32:06 +08:00
stivepeim
6c6ccce625 Merge branch 'master' of https://gitee.com/ZhongBangKeJi/crmeb_java
* 'master' of https://gitee.com/ZhongBangKeJi/crmeb_java:
  fix: 优品推荐请求不登录可以访问修改。
  fix:修改商品添加中商品的价格校验,最小值为0.01,库存正整数。
  fix:修改商品添加中商品的价格校验,最小值为0.01,库存正整数。
  update README.md.
2023-09-11 10:07:26 +08:00
stivepeim
d8968eb05d 感谢热情网友指出 2023-09-11 09:47:50 +08:00
guaishoudemao
04129529bc fix: 优品推荐请求不登录可以访问修改。 2023-08-24 09:16:09 +08:00
guaishoudemao
44dedf3e89 fix:修改商品添加中商品的价格校验,最小值为0.01,库存正整数。 2023-08-22 18:12:38 +08:00
guaishoudemao
de2c57e6bc fix:修改商品添加中商品的价格校验,最小值为0.01,库存正整数。 2023-08-21 15:01:50 +08:00
大粽子
61d4065be8 !28 update README.md.
Merge pull request !28 from Handson/N/A
2023-07-15 09:02:47 +00:00
Handson
f70424921d update README.md.
Signed-off-by: Handson <7420044+handson1107@user.noreply.gitee.com>
2023-07-15 08:58:38 +00:00
stivepeim
4e08a5d24b readme 格式优化 2023-07-15 16:40:44 +08:00
stivepeim
1fd1c99d1d Merge branch 'master' of https://gitee.com/ZhongBangKeJi/crmeb_java
* 'master' of https://gitee.com/ZhongBangKeJi/crmeb_java:
  update README.md.
  update README.md.

# Conflicts:
#	README.md
2023-07-15 16:10:20 +08:00
stivepeim
1e7457a682 更新联系我们 2023-07-15 16:08:14 +08:00
大粽子
140f0c0f3f !26 update README.md.
Merge pull request !26 from Handson/N/A
2023-07-15 08:02:16 +00:00
大粽子
87d88420e4 !25 update README.md.
Merge pull request !25 from Handson/N/A
2023-07-15 08:02:00 +00:00
Handson
e7824928bc update README.md.
Signed-off-by: Handson <7420044+handson1107@user.noreply.gitee.com>
2023-07-15 06:19:43 +00:00
Handson
ed8cb43baf update README.md.
Signed-off-by: Handson <7420044+handson1107@user.noreply.gitee.com>
2023-07-15 04:32:28 +00:00
stivepeim
29a4dad980 更新联系我们 2023-07-15 11:52:09 +08:00
stivepeim
29d2820160 update 2023-07-15 09:48:38 +08:00
stivepeim
24fba07e8a 详情更新 2023-07-15 09:41:13 +08:00
stivepeim
c7484de2a4 更新关键链接 2023-06-25 18:13:10 +08:00
stivepeim
d6d2a145f0 gif 弱网优化 2023-06-25 17:37:05 +08:00
大粽子
0ae71d2d06 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 09:16:43 +00:00
大粽子
3e091bb462 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 09:14:20 +00:00
大粽子
d123c793f2 删除文件 15webPCadmin.gif 2023-06-25 09:10:56 +00:00
大粽子
579bb29dfd 删除文件 14yijianhuanse.gif 2023-06-25 09:10:48 +00:00
大粽子
bf6d53a2cb 删除文件 13yemiandesiner.gif 2023-06-25 09:10:39 +00:00
大粽子
7b210ba147 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 08:58:11 +00:00
大粽子
116ac9dfa1 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 08:57:09 +00:00
大粽子
34cc74d4c9 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 08:54:43 +00:00
大粽子
4423f08c71 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 08:52:44 +00:00
大粽子
52d23093b9 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 08:50:57 +00:00
大粽子
9c6828a817 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-06-25 08:49:58 +00:00
stivepeim
5426b1b32c 2023 618 活动圆满结束 2023-06-25 16:15:45 +08:00
stivepeim
198cf19d57 useUnicode=true 数据库链接 避免出现em 无法存储的问题 2023-06-15 12:07:51 +08:00
大粽子
38ffe7e823 !20 🐛 修复在JDK 17的环境下无sun相关的包
Merge pull request !20 from 徐晓伟/master-sun
2023-06-15 03:21:56 +00:00
大粽子
abae259a32 !21 🐛 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
Merge pull request !21 from 徐晓伟/master-equals
2023-06-15 03:19:42 +00:00
大粽子
185b7ec757 !23 删除重复依赖io.swagger:swagger-models
Merge pull request !23 from 徐晓伟/swagger-models
2023-06-15 03:16:48 +00:00
大粽子
24bf644a71 !24 🐛 防止循环依赖引用错误
Merge pull request !24 from 徐晓伟/ApplicationContext
2023-06-15 03:16:09 +00:00
stivepeim
b46a4d3a5d 修复Stream 1.4.17 出现的漏洞 2023-06-14 17:47:29 +08:00
stivepeim
e7ce8a8e01 欢庆20230618官方活动 2023-06-12 16:23:40 +08:00
stivepeim
cffc59f46a 感谢各位同学,新开QQ3群欢迎加入拍砖讨论 2023-06-01 11:39:18 +08:00
stivepeim
0003d68828 update tel service 2023-04-18 18:03:16 +08:00
stivepeim
6f8a245801 update version desc 2023-04-06 18:28:56 +08:00
stivepeim
d9a47d1b54 update install info 2023-04-06 18:26:56 +08:00
徐晓伟
b7fe6fb1d2 🐛 防止循环依赖引用错误
使用 ApplicationContext 获取 Bean 来进行注入
2023-03-30 10:56:40 +08:00
徐晓伟
647b5a3a21 删除重复依赖io.swagger:swagger-models
防止使用 io.fabric8:docker-maven-plugin 打包为docker时异常
2023-03-29 10:20:33 +08:00
徐晓伟
a25c771991 💡 加解密补充说明 2023-03-29 10:16:14 +08:00
徐晓伟
e36deee626 Merge branch 'master' of https://gitee.com/xuxiaowei-com-cn/crmeb_java into master-sun
# Conflicts:
#	crmeb/crmeb-common/src/main/java/com/zbkj/common/utils/CrmebUtil.java
2023-03-29 10:12:53 +08:00
大粽子
1983d002b4 !18 update crmeb/pom.xml.
Merge pull request !18 from mingtian00081/N/A
2023-03-21 07:37:28 +00:00
stivepeim
3a6191a721 更新代码包演示账号 2023-03-15 18:07:28 +08:00
stivepeim
da26405550 规整演示数据 管理端 admin / 123456 移动端 18292417675 / crmeb@123456 2023-03-15 18:02:30 +08:00
徐晓伟
270db3b53e 🐛 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。 2023-03-15 08:35:52 +08:00
徐晓伟
f2acafda7a 🐛 修复在JDK 17的环境下无sun相关的包
1. 使用hutool替换sun
2. 删除未使用的包导入
2023-03-14 16:50:15 +08:00
mingtian00081
5666011e5d update crmeb/pom.xml.
升级fastjson版本到1.2.83,1.2.83版本之前存在代码执行漏洞风险,CVE-2022-25845

Signed-off-by: mingtian00081 <12513234+mingtian00081@user.noreply.gitee.com>
2023-02-26 12:20:09 +00:00
大粽子
68d9148fa7 update README.md.
遇到问题不要怕,问题提交到issue或者直接论坛发帖,大佬会尽快回复和处理哦!
认准官方论坛 https://www.crmeb.com/ask/thread/list/152

Signed-off-by: 大粽子 <stivepeim@outlook.com>
2023-02-23 10:06:48 +00:00
stivepeim
90b377a6e7 update license 2023-02-06 10:28:18 +08:00
stivepeim
95505dd146 更新 readme 2023-01-04 12:20:28 +08:00
stivepeim
cd5d31cfcc 更新readme 2023-01-04 12:17:07 +08:00
stivepeim
cf6071a396 更新客服链接 2023-01-04 12:03:49 +08:00
stivepeim
1321a2b0e5 宽屏预览 2022-12-30 16:08:02 +08:00
stivepeim
12c548c062 素材格式调整 2022-12-30 15:55:57 +08:00
stivepeim
7851ea10bb 素材更新 2022-12-30 15:50:08 +08:00
stivepeim
c949c86a99 update md 2022-12-30 15:38:29 +08:00
大粽子
ba72b18dad update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2022-12-30 07:36:37 +00:00
大粽子
25670d5af9 update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2022-12-30 07:30:58 +00:00
stivepeim
02f4e595cc 调整图片 2022-12-30 15:22:08 +08:00
stivepeim
295b58c9de readme 更新 2022-12-30 15:16:39 +08:00
大粽子
a183ced5ef update README.md.
Signed-off-by: 大粽子 <stivepeim@outlook.com>
2022-12-30 07:04:02 +00:00
stivepeim
1010a22c7e 更新素材路径 2022-12-30 14:24:04 +08:00
stivepeim
cd96dbf7e6 readme 图片路径更新 2022-12-30 14:20:32 +08:00
stivepeim
4d70bab54b update readme 2022-12-29 17:52:42 +08:00
stivepeim
33dd341669 更新描述文件 2022-12-26 19:05:53 +08:00
stivepeim
c9773b2b69 修正客服更新和新论坛地址 2022-12-12 10:52:05 +08:00
stivepeim
96cf53257d 新论坛地址指向对应tab 2022-11-08 12:02:06 +08:00
stivepeim
8f43328b60 更新新的论坛地址 2022-11-08 11:46:34 +08:00
121 changed files with 1710 additions and 2771 deletions

3
.gitignore vendored
View File

@@ -3,3 +3,6 @@ app/unpackage
Crmeb-2022-01-04.log
crmeb_front_log
crmeb/LOG_HOME_IS_UNDEFINED
*.
*.
.DS_Store

View File

Binary file not shown.

225
LICENSE
View File

@@ -1,34 +1,201 @@
版权所有 (c)2017-2027西安众邦网络科技有限公司 保留所有权利。
感谢您选择CrmEb开源客户管理+电商系统简称CRMEBCRMEB是国内最稳定、最强大、最先进的互联网电商平台解决方案之一
CRMEB java版本基于 jdk1.8 + SptingBoot + MySQL + 的技术框架开发。
为了使你正确并合法的使用本软件,请你在使用前务必阅读清楚下面的协议条款:
本授权协议适用且仅适用于CRMEB java 版本CRMEB官方对本授权协议的最终解释权和修改权。
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
一、协议许可的权利
1、您可以在完全遵守本最终用户授权协议的基础上将本软件应用于非商业用途而不必支付软件版权授权费用。
2、您可以在协议规定的约束和限制范围内修改 CRMEB java 源代码或界面风格以适应您的网站要求。
3、您拥有使用本软件构建的网站全部内容所有权并独立承担与这些内容的相关法律义务。
4、获得商业授权之后您可以将本软件应用于商业用途同时依据所购买的授权类型中确定的技术支持内容。商业授权用户享有反映和提出意见的权力相关意见将被作为首要考虑但没有一定被采纳的承诺或保证。
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
二、协议许可的权利和限制
1、未获商业授权之前不得删除网站底部及相应的官方版权信息和链接。购买商业授权请联系西安众邦网络科技有限公司了解最新说明。CRMEB java著作权已在中华人民共和国国家版权局注册(中国国家版权局著作权登记号 2018SR024463),著作权受到法律和国际公约保护。
2、未经官方许可不得对本软件或与之关联的商业授权进行出租、出售、抵押或发放子许可证。
3、不管你的网站是否整体使用 CRMEB java ,还是部份栏目使用 CRMEB java在你使用了 CRMEB java 的网站主页上必须加上 CRMEB 官方网址(www.crmeb.com)的链接。
4、未经官方许可禁止在 CRMEB java 的整体或任何部分基础上以发展任何派生版本、修改版本或第三方版本用于重新分发。
5、如果您未能遵守本协议的条款您的授权将被终止所被许可的权利将被收回并承担相应法律责任。
1. Definitions.
三、有限担保和免责声明
1、本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的。
2、用户出于自愿而使用本软件您必须了解使用本软件的风险在尚未购买产品技术服务之前我们不承诺对免费用户提供任何形式的技术支持、使用担保也不承担任何因使用本软件而产生问题的相关责任。
3、电子文本形式的授权协议如同双方书面签署的协议一样具有完全的和等同的法律效力。您一旦开始确认本协议并安装 CRMEB即被视为完全理解并接受本协议的各项条款在享有上述条款授予的权力的同时受到相关的约束和限制。协议许可范围以外的行为将直接违反本授权协议并构成侵权我们有权随时终止授权责令停止损害并保留追究相关责任的权力。
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
协议发布时间: 2017年8月01日
版本最新更新: 2020年12月23日 By CRMEB
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
CRMEB官方网站http://www.crmeb.com
CRMEB java 版本演示站https://admin.java.crmeb.net
-----------------------------------------------------
运营团队: 众邦科技
电 话: 400-8888-794
箱: admin@xazbkj.com
址: http://www.xazbkj.com
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

369
README.md
View File

@@ -1,196 +1,209 @@
<h1 align="center"> CRMEB客户管理+电商营销系统Java版</h1>
<p align="center">
<div align="center" >
<img src="https://images.gitee.com/uploads/images/2021/1109/164354_0aafe3d2_892944.gif" />
</div>
<div align="center">
CRMEB开源商城系统Java版
</div>
<div align="center" >
<a href="http://www.crmeb.com">
</p>
<p align="center">
<b>如果对您有帮助,您可以点右上角 "Star" ❤️ 支持一下 谢谢!</b>
</p>
<img src="https://img.shields.io/badge/License-apache2.0-green.svg?style=flat" />
</a>
<a href='https://gitee.com/ZhongBangKeJi/crmeb_java/members'>
<img src='https://gitee.com/ZhongBangKeJi/crmeb_java/badge/fork.svg?theme=dark' alt='fork'></img>
</a>
<a href='https://gitee.com/ZhongBangKeJi/crmeb_java/stargazers'>
<img src='https://gitee.com/ZhongBangKeJi/crmeb_java/badge/star.svg?theme=dark' alt='star'></img>
</a>
</div>
## 项目介绍
####
<div align="center">
[官网](https://www.crmeb.com/) |
[在线体验](https://admin.java.crmeb.net) |
[帮助文档](https://doc.crmeb.com/java/crmeb_java) |
[技术社区](https://www.crmeb.com/ask/)
[comment]: <> ([宽屏预览]&#40;https://gitee.com/ZhongBangKeJi/crmeb_java/blob/master/README.md&#41;)
</div>
<div align="center" >
<a href="https://gitee.com/ZhongBangKeJi/crmeb_java/blob/master/README.md">宽 屏 预 览</a>
</div>
<div align="center">
如果对您有帮助,您可以点右上角 "Star" ❤️ 支持一下 谢谢!
</div>
---
### 📖 简介:
CRMEB 开源商城系统Java版基于Java+Vue+Uni-app开发在微信公众号、小程序、H5移动端都能使用代码全开源无加密独立部署二开很方便还支持免费商用能满足企业新零售、分销推广、拼团、砍价、秒杀等多种经营需求自用、做二开项目都很合适。
CRMEB开源商城PHPhttps://gitee.com/ZhongBangKeJi/CRMEB
系统代码全开源无加密,独立部署、二开方便,适用于企业新零售、分销、拼团、砍价,秒杀等各种业务需求。
---
### 💡 系统亮点:
>1.SpringBoot 框架开发业界主流。 </br>
>2.【前端】Web PC 管理端 Vue + Element UI。<br>
>3.【前端】移动端使用 Uni-app 框架,前后端分离开发。<br>
>4.标准RESTful 接口、标准数据传输逻辑层次更明确更多的提高api复用。<br>
>5.支持Redis队列降低流量高峰解除耦合高可用。<br>
>6.数据导出,方便个性化分析。<br>
>7.数据统计分析,使用ECharts图表统计实现用户、产品、订单、资金等统计分析。<br>
>8.Spring Security 权限管理,后台多种角色,多重身份权限管理,权限可以控制到按钮级别的操作。<br>
>9.Vue表单生成控件拖拽配置表单减少前端重复表单工作量提高前端开发效率。<br>
---
### 💻 运行环境及框架:
~~~
1. 移动端uniapp开发框架 可生成H5 公众号 微信小程序
2. WEB Pc 管理后台使用Vue + Element UI 开发 兼容主流浏览器 ie11+
3. 后台服务 Java SpringBoot + Mybatis-plus + Mysql + redis
4. 运行环境 linux和windows等都支持,只要有Java环境和对应的数据库 redis
5. 运行条件 Java 1.8 Mysql5.7
~~~
---
### 🔧 Java项目框架 和 WEB PC 项目运行环境
~~~
1. SpringBoot 2.2.6.RELEASE
2. Maven 3.6.1
3. swagger-bootstrap-ui 1.0
4. Mybatis Plus 3.3.1
5. npm 6
6. node 14
7. vue 2.x
8. element ui 2.13
~~~
CRMEB 是西安众邦网络科技有限公司旗下品牌众邦科技8年专注电商的技术沉淀和行业积累
专业打造行业领先功能强大易用性强扩展性强产品CRMEB现有CRMEB单商户系统(Java版本)、
CRMEB Pro系统、CRMEB 多商户系统、知识付费系统等系统产品。
---
JAVA版商城系统是基于Java(SpringBoot) + Vue(Element UI) + UniApp开发的
一套新零售移动电商系统CRMEB系统就是集客户关系管理 + 营销电商系统,
能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、会员维护、
网络营销的一款企业应用,更适合企业二次开发。
~~~~
![](/crmeb/crmebimage/crmebimage/demoimage/01qiyejiangxiang.webp)
## 预览
![二维码预览](/crmeb/crmebimage/crmebimage/demoimage/02yulan.jpg)
帮助手册:[https://doc.crmeb.com/web/java/crmeb_java](https://doc.crmeb.com/web/java/crmeb_java)
论坛地址:[https://q.crmeb.net](https://q.crmeb.net)
官网地址:[https://www.crmeb.com](https://www.crmeb.com)
授权价格:[http://crmeb.com/web/auth/apply](http://crmeb.com/web/auth/apply)
GitHub地址[https://github.com/crmeb/crmeb_java](https://github.com/crmeb/crmeb_java)
码云地址: [https://gitee.com/ZhongBangKeJi/crmeb_java](https://gitee.com/ZhongBangKeJi/crmeb_java)
移动端:[https://java.crmeb.net](https://java.crmeb.net)
WEBPC管理端[https://admin.java.crmeb.net](https://admin.java.crmeb.net)
账号密码:后台账号 demo 密码 crmeb.com
购买商业版: [http://crmeb.com/web/index/java](http://crmeb.com/web/index/java)
自己搭建后admin / 123456
## 反馈交流
技术交流社区https://q.crmeb.net
CRMEB JAVA 技术交流QQ群 1群 🈵️
[CRMEB JAVA 技术交流QQ群 2群 482685880 🔥](<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=Ss382XU1MITXy9B-qx15GC3G7WVaImIG&jump_from=webapi"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="CRMEB Java技术交流2群" title="CRMEB Java技术交流2群"> 点击添加群 482685880</a>)
使用中遇到bug 或者问题可以在gitee 上提 [Issues](https://gitee.com/ZhongBangKeJi/crmeb_java/issues)
如果直接点击加群无反应可复制QQ号码手动加入
## 主要特点
### 🧭 项目代码包介绍
~~~
1:有详细的代码注释,有完整系统手册。
2:基于 SpringBoot 框架开发业界主流。
3:【前端】Web PC 管理端 vue + element UI。
4:【前端】移动端使用 UniApp 框架,前后端分离开发。
5:标准RESTful 接口、标准数据传输逻辑层次更明确更多的提高api复用。
6:支持Redis队列降低流量高峰解除耦合高可用。
7:无缝事件机制,行为扩展更方便,方便二次开发。
8:数据导出,方便个性化分析。
9:数据统计分析,使用ECharts图表统计实现用户、产品、订单、资金等统计分析。
10:权限管理,后台多种角色,多重身份权限管理,权限可以控制到按钮级别的操作。
11:Vue表单生成控件拖拽配置表单减少前端重复表单工作量提高前端开发效率。
1. admin WEB程序 PC端管理端 VUE + ElementUi
2. app 移动商城 UniApp标准开发(H5 + 微信小程序)
3. crmeb Api Java SpringBoot + mybatisPlus
4. 接口文档 Api对应的接口文档也可以部署项目后查看
~~~
## 移动端预览
![](/crmeb/crmebimage/crmebimage/demoimage/03-mobile-01.png)
![](/crmeb/crmebimage/crmebimage/demoimage/04-mobile-02.png)
![](/crmeb/crmebimage/crmebimage/demoimage/05-mobile-03.png)
## 功能图预览
![项目基本功能介绍](/crmeb/crmebimage/crmebimage/demoimage/06-optionList.jpg)
## WEB PC 管理端预览
![控制台](/crmeb/crmebimage/crmebimage/demoimage/07-pc-01.png)
![商品管理](/crmeb/crmebimage/crmebimage/demoimage/08-pc-02.png)
![订单管理](/crmeb/crmebimage/crmebimage/demoimage/09-pc-03.png)
![复制第三方平台商品](/crmeb/crmebimage/crmebimage/demoimage/10-pc-04.png)
![营销功能](/crmeb/crmebimage/crmebimage/demoimage/11-pc-05.png)
![自定义表单组件](/crmeb/crmebimage/crmebimage/demoimage/12-pc-06.png)
# 商业版特色小功能
## 页面设计
![页面设计](https://api.java.crmeb.net/crmebimage/fordemo/13yemiandesiner.gif)
## 一键换色
![一键换色](https://api.java.crmeb.net/crmebimage/fordemo/14yijianhuanse.gif)
## WEB PC 更多便捷操作方式
![](https://api.java.crmeb.net/crmebimage/fordemo/15webPCadmin.gif)
## 项目源码
| 平台| 源码地址|
|--- |--- |
|gitHub| https://github.com/crmeb/crmeb_java|
|gitee|https://gitee.com/ZhongBangKeJi/crmeb_java|
## 运行环境及框架
~~~
Java项目运行环境
1.Java Jdk1.8
2.Redis 5+
3.Mysql 5.7+
4.Nginx
Java项目框架
1.SpringBoot 2.2.6.RELEASE
2.Maven 3.6.1
3.swagger-bootstrap-ui 1.0
4.Mybatis Plus 3.3.1
WEB PC 项目运行环境
1.npm 6
2.node 14
3.vue 2.x
4.element ui 2.13
移动端 uniapp 开发 使用 HbuilderX 开发
~~~
## 项目代码包介绍
~~~
---
1:admin WEB程序 PC端管理端 VUE + ElementUi
2:app 移动商城 UniApp标准开发(H5 + 微信小程序)
3:crmeb Api Java SpringBoot + mybatisPlus ...
4:接口文档 Api对应的接口文档也可以部署项目后查看
~~~
## 素材说明
建议使用自己的素材文件,我们提供基础浏览素材 链接
https://help.crmeb.net/crmeb_java/2312166
## 版本更新日志
http://bbs.crmeb.net/thread-5725-1-1.html
## 内推荐项目
~~~
CRMEB知识付费项目https://gitee.com/ZhongBangKeJi/crmeb_zzff_class
CRMEB打通版https://gitee.com/ZhongBangKeJi/CRMEB
~~~
## 反馈交流
技术交流社区https://q.crmeb.net
[CRMEB JAVA 技术交流QQ群 2群 482685880 🔥](<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=Ss382XU1MITXy9B-qx15GC3G7WVaImIG&jump_from=webapi"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="CRMEB Java技术交流2群" title="CRMEB Java技术交流2群"> 点击添加群 482685880</a>)
CRMEB JAVA 技术交流QQ群 1群 🈵️
使用中遇到bug 或者问题可以在gitee 上提 [Issues](https://gitee.com/ZhongBangKeJi/crmeb_java/issues)
如果直接点击加群无反应可复制QQ号码手动加入
视频教程
[B站视频教程 持续更新中](https://space.bilibili.com/388666686)
[![](https://z3.ax1x.com/2021/05/19/g4J9W6.jpg)](https://space.bilibili.com/388666686)
[![](crmeb/crmebimage/crmebimage/demoimage/gitee-广告_java多商户.jpg)](https://www.crmeb.com/index/java_merchant)
## 开源版使用须知
~~~
1.允许用于个人学习、毕业设计、教学案例、公益事业;
2.如果商用必须保留版权信息,如果需要去版权请联系客服;
3.禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负。
~~~
### 🎬 系统演示:
![](crmeb/crmebimage/crmebimage/demoimage/c1.jpg)
移动端https://java.crmeb.net<br>
WEBPC管理端https://admin.java.crmeb.net<br>
账号密码: demo/crmeb.com<br>
## 联系客服
自己搭建演示账号
移动端 18292417675 / crmeb@123456
管理端 admin / 123456
![联系客服](/crmeb/crmebimage/crmebimage/demoimage/17lianxikefu.png)
[想了解CRMEB开源商城系统Java版整体框架你可以戳这里快速掌握](https://doc.crmeb.com/java/crmeb_java/2049)
## 版权信息
本项目包含的第三方源码和二进制文件之版权信息另行标注。
版权所有Copyright © 2017-2021 by CRMEB (http://www.crmeb.com)
---
All rights reserved。
### 📃 系统资料
需要系统文档的朋友看过来,安装文档、产品介绍、技术文档...你想要的我都有!
[https://doc.crmeb.com/java/crmeb_java](https://doc.crmeb.com/java/crmeb_java)
CRMEB® 商标和著作权所有者为西安众邦网络科技有限公司。
要安装系统跟着视频更顺畅CRMEB开源商城系统Java版安装视频给你奉上
视频教程 B站视频教程 持续更新中 [点击观看 💻🖥️](https://www.bilibili.com/video/BV1bP4y1n76P/?vd_source=40854aeda5bba4b8766afd5a99623b16)
---
### 💟 UI界面
#### 核心功能
![](crmeb/crmebimage/crmebimage/demoimage/javaop2.jpg)
### 📱 移动端预览
<!-- ![](crmeb/crmebimage/crmebimage/demoimage/03-mobile-01.png)
![](crmeb/crmebimage/crmebimage/demoimage/04-mobile-02.png)
![](crmeb/crmebimage/crmebimage/demoimage/05-mobile-03.png) -->
![](crmeb/crmebimage/crmebimage/demoimage/001front.jpg)
### WEB PC管理端预览
<!-- ![](crmeb/crmebimage/crmebimage/demoimage/07-pc-01.png)
![](crmeb/crmebimage/crmebimage/demoimage/08-pc-02.png)
![](crmeb/crmebimage/crmebimage/demoimage/09-pc-03.png)
![](crmeb/crmebimage/crmebimage/demoimage/10-pc-04.png)
![](crmeb/crmebimage/crmebimage/demoimage/11-pc-05.png)
![](crmeb/crmebimage/crmebimage/demoimage/12-pc-06.png) -->
![](crmeb/crmebimage/crmebimage/demoimage/001admin.jpg)
![](crmeb/crmebimage/crmebimage/demoimage/13yemiandesiner-min.gif)
![](crmeb/crmebimage/crmebimage/demoimage/14yijianhuanse-min.gif)
![](crmeb/crmebimage/crmebimage/demoimage/15webPCadmin-min.gif)
---
### 📲 CRMEB开源技术交流群
扫码进群可领取开源版接口文档、产品功能清单、高清UI设计图、思维脑图
![](crmeb/crmebimage/crmebimage/demoimage/wellcomJavaGroup.jpg)
#### 📈 技术社区
找方法、提bug、看官方消息、拿活跃大奖
https://www.crmeb.com/ask/thread/list/152
#### 📞 技术交流
跟着官方不迷路欢迎扫码加入CRMEB 开源项目群,一手消息及资源,尽在掌握!<br>
CRMEB JAVA 技术交流QQ群 1群 🈵️<br>
CRMEB JAVA 技术交流QQ群 2群 🈵️<br>
CRMEB JAVA 技术交流QQ群 3群 640230510 🈵️ 群已满<br>
<!-- [CRMEB开源商城系统开发QQ频道已开启点击加入一起交流学习](https://pd.qq.com/s/1v2yb4e0p)<br>
![](crmeb/crmebimage/crmebimage/demoimage/qqcus.jpg) -->
使用中遇到bug 或者问题可以在gitee 上提 Issues
<!-- ---
### 💌 特别鸣谢
核心开发团队
产品: 木子刀客
技术: ❄指缝de阳光, 怪兽的猫, 乡关何处
团队打杂: 大粽子
UI: 被子横盖显得高🐰
测试: 请叫我绵绵🐏, 夏天
--- -->
### 🔔 使用须知
1.允许用于个人学习、毕业设计、教学案例、公益事业、商业使用;<br>
2.如果商用必须保留版权信息,请自觉遵守;<br>
3.禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负。<br>
---
### 🪪 版权信息
本项目包含的第三方源码和二进制文件之版权信息另行标注。<br>
版权所有Copyright © 2017-2024 by CRMEB (https://www.crmeb.com)<br>
All rights reserved。<br>
CRMEB® 商标和著作权所有者为西安众邦网络科技有限公司。<br>
---

View File

@@ -8,51 +8,51 @@
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import request from '@/utils/request'
import request from "@/utils/request";
export function configCheckUnique(pram) {
const data = {
name: pram.name
}
};
return request({
url: '/admin/system/config/check',
method: 'GET',
url: "/admin/system/config/check",
method: "GET",
params: data
})
});
}
export function configDelete(pram) {
const data = {
id: pram.id
}
};
return request({
url: '/admin/system/config/delete',
method: 'GET',
url: "/admin/system/config/delete",
method: "GET",
params: data
})
});
}
export function configInfo(pram) {
const data = {
formId: pram.id
}
};
return request({
url: '/admin/system/config/info',
method: 'GET',
url: "/admin/system/config/info",
method: "GET",
params: data
})
});
}
export function configList(pram) {
const data = {
page: pram.page,
limit: pram.limit
}
};
return request({
url: '/admin/system/config/list',
method: 'GET',
url: "/admin/system/config/list",
method: "GET",
params: data
})
});
}
export function configSave(pram) {
@@ -67,55 +67,73 @@ export function configSave(pram) {
type: pram.type,
value: pram.value // value 存储表单配置数据,其他的参数来自于父级数据 justForAPI
}
}
};
return request({
url: '/admin/system/config/save',
method: 'POST',
url: "/admin/system/config/save",
method: "POST",
params: data
})
});
}
export function configSaveForm(pram) {
return request({
url: '/admin/system/config/save/form',
method: 'POST',
url: "/admin/system/config/save/form",
method: "POST",
data: pram
})
});
}
export function configUpdate(pram) {
const data = {
id: pram.id,
systemConfigRequest: pram.systemConfigRequest
}
};
return request({
url: '/admin/system/config/update',
method: 'POST',
url: "/admin/system/config/update",
method: "POST",
params: data
})
});
}
export function configSaveUniq(pram) {
const data = {
key: pram.key,
value: pram.value
}
};
return request({
url: '/admin/system/config/saveuniq',
method: 'POST',
url: "/admin/system/config/saveuniq",
method: "POST",
params: data
})
});
}
export function configGetUniq(pram) {
const data = {
key: pram.key
}
};
return request({
url: '/admin/system/config/getuniq',
method: 'GET',
url: "/admin/system/config/getuniq",
method: "GET",
params: data
})
});
}
/**
* @description 一号通 应用保存
*/
export function passAppSaveApi(data) {
return request({
url: "/admin/pass/appsave",
method: "post",
data
});
}
/**
* @description 一号通 应用详情获取
*/
export function passAppInfoApi() {
return request({
url: "/admin/pass/appget",
method: "get"
});
}

View File

@@ -106,6 +106,7 @@ export default {
imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
default_link_target: '_blank',
link_title: false,
convert_urls: false, //防止路径被转化为相对路径
nonbreaking_force_tab: true, // inserting nonbreaking space &nbsp; need Nonbreaking Space Plugin
init_instance_callback: editor => {
if (_this.value) {

View File

@@ -8,157 +8,182 @@
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import Layout from '@/layout'
import Layout from "@/layout";
const operationRouter = {
path: '/operation',
path: "/operation",
component: Layout,
redirect: '/operation/setting',
name: 'Operation',
redirect: "/operation/setting",
name: "Operation",
meta: {
title: '设置',
icon: 'clipboard',
roles: ['admin']
title: "设置",
icon: "clipboard",
roles: ["admin"]
},
children: [
{
path: 'setting',
name: 'setting',
component: () => import('@/views/systemSetting/setting'),
path: "setting",
name: "setting",
component: () => import("@/views/systemSetting/setting"),
meta: {
title: '系统设置',
icon: 'clipboard'
title: "系统设置",
icon: "clipboard"
}
},
{
path:'notification',
name:'notification',
component: () => import('@/views/systemSetting/notification'),
meta:{
title:'消息通知',
icon:'clipboard'
path: "notification",
name: "notification",
component: () => import("@/views/systemSetting/notification"),
meta: {
title: "消息通知",
icon: "clipboard"
}
},
{
path: 'onePass',
name: 'onePass',
component: () => import('@/views/sms/smsConfig'),
path: "onePass",
name: "onePass",
component: () => import("@/views/sms/smsConfig"),
meta: {
title: '一号通',
icon: 'clipboard'
title: "一号通",
icon: "clipboard"
}
},
{
path: 'roleManager',
name: 'RoleManager',
component: () => import('@/views/systemSetting/administratorAuthority'),
path: "onePassConfig",
name: "onePassConfig",
component: () => import("@/views/sms/smsConfig/config"),
meta: {
title: '管理权限',
icon: 'clipboard',
roles: ['admin']
title: "一号通配置",
icon: "clipboard"
}
},
{
path: "roleManager",
name: "RoleManager",
component: () => import("@/views/systemSetting/administratorAuthority"),
meta: {
title: "管理权限",
icon: "clipboard",
roles: ["admin"]
},
children: [
{
path: 'identityManager',
component: () => import('@/views/systemSetting/administratorAuthority/identityManager'),
name: 'identityManager',
meta: { title: '角色管理', icon: '' }
path: "identityManager",
component: () =>
import("@/views/systemSetting/administratorAuthority/identityManager"),
name: "identityManager",
meta: { title: "角色管理", icon: "" }
},
{
path: 'adminList',
component: () => import('@/views/systemSetting/administratorAuthority/adminList'),
name: 'adminList',
meta: { title: '管理员列表', icon: '' }
path: "adminList",
component: () =>
import("@/views/systemSetting/administratorAuthority/adminList"),
name: "adminList",
meta: { title: "管理员列表", icon: "" }
},
{
path: 'promiseRules',
component: () => import('@/views/systemSetting/administratorAuthority/permissionRules'),
name: 'promiseRules',
meta: { title: '权限规则', icon: '' }
path: "promiseRules",
component: () =>
import("@/views/systemSetting/administratorAuthority/permissionRules"),
name: "promiseRules",
meta: { title: "权限规则", icon: "" }
}
]
},
{
path: 'systemSms',
component: () => import('@/views/sms'),
name: 'systemSms',
path: "systemSms",
component: () => import("@/views/sms"),
name: "systemSms",
meta: {
title: '短信设置',
icon: 'clipboard',
roles: ['admin']
title: "短信设置",
icon: "clipboard",
roles: ["admin"]
},
children: [
{
path: 'config',
component: () => import('@/views/sms/smsConfig'),
name: 'SmsConfig',
meta: { title: '短信账户', noCache: true }
path: "config",
component: () => import("@/views/sms/smsConfig"),
name: "SmsConfig",
meta: { title: "短信账户", noCache: true }
},
{
path: 'template',
component: () => import('@/views/sms/smsTemplate'),
name: 'SmsTemplate',
meta: { title: '短信模板', noCache: true, activeMenu: `/operation/onePass` }
path: "template",
component: () => import("@/views/sms/smsTemplate"),
name: "SmsTemplate",
meta: {
title: "短信模板",
noCache: true,
activeMenu: `/operation/onePass`
}
},
{
path: 'pay',
component: () => import('@/views/sms/smsPay'),
name: 'SmsPay',
meta: { title: '短信购买', noCache: true, activeMenu: `/operation/onePass` }
path: "pay",
component: () => import("@/views/sms/smsPay"),
name: "SmsPay",
meta: {
title: "短信购买",
noCache: true,
activeMenu: `/operation/onePass`
}
},
{
path: 'message',
component: () => import('@/views/sms/smsMessage'),
name: 'SmsMessage',
meta: { title: '短信开关', noCache: true }
path: "message",
component: () => import("@/views/sms/smsMessage"),
name: "SmsMessage",
meta: { title: "短信开关", noCache: true }
}
]
},
{
path: 'deliverGoods',
name: 'deliverGoods',
path: "deliverGoods",
name: "deliverGoods",
alwaysShow: true,
component: () => import('@/views/systemSetting/deliverGoods'),
component: () => import("@/views/systemSetting/deliverGoods"),
meta: {
title: '发货设置',
roles: ['admin']
title: "发货设置",
roles: ["admin"]
},
children: [
{
path: 'takeGoods',
component: () => import('@/views/systemSetting/deliverGoods/takeGoods'),
name: 'takeGoods',
meta: { title: '提货设置', noCache: true,roles: ['admin'] },
path: "takeGoods",
component: () =>
import("@/views/systemSetting/deliverGoods/takeGoods"),
name: "takeGoods",
meta: { title: "提货设置", noCache: true, roles: ["admin"] },
children: [
{
path: 'deliveryAddress',
component: () => import('@/views/systemSetting/deliverGoods/takeGoods/deliveryAddress'),
name: 'deliveryAddress',
meta: { title: '提货点', icon: '' }
path: "deliveryAddress",
component: () =>
import("@/views/systemSetting/deliverGoods/takeGoods/deliveryAddress"),
name: "deliveryAddress",
meta: { title: "提货点", icon: "" }
},
{
path: 'collateOrder',
component: () => import('@/views/systemSetting/deliverGoods/takeGoods/collateOrder'),
name: 'collateOrder',
meta: { title: '核销订单', icon: '' }
path: "collateOrder",
component: () =>
import("@/views/systemSetting/deliverGoods/takeGoods/collateOrder"),
name: "collateOrder",
meta: { title: "核销订单", icon: "" }
},
{
path: 'collateUser',
component: () => import('@/views/systemSetting/deliverGoods/takeGoods/collateUser'),
name: 'collateUser',
meta: { title: '核销员', icon: '' }
},
path: "collateUser",
component: () =>
import("@/views/systemSetting/deliverGoods/takeGoods/collateUser"),
name: "collateUser",
meta: { title: "核销员", icon: "" }
}
]
},
{
path: 'freightSet',
component: () => import('@/views/systemSetting/deliverGoods/freightSet'),
name: 'freightSet',
meta: { title: '运费模板', noCache: true }
},
path: "freightSet",
component: () =>
import("@/views/systemSetting/deliverGoods/freightSet"),
name: "freightSet",
meta: { title: "运费模板", noCache: true }
}
]
},
}
]
}
};
export default operationRouter //collate
export default operationRouter; //collate

View File

@@ -8,7 +8,7 @@
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import store from '@/store'
import store from "@/store";
/**
* 根据需求过滤掉treeData中的child.length === 0的数据
@@ -16,38 +16,51 @@ import store from '@/store'
* @returns {Uint8Array | BigInt64Array | any[] | Float64Array | Int8Array | Float32Array | Int32Array | Uint32Array | Uint8ClampedArray | BigUint64Array | Int16Array | Uint16Array}
*/
export function clearTreeData(treeData) {
return treeData.map((item) => {
return treeData.map(item => {
if (item.child.length === 0) {
delete item.child
delete item.child;
} else {
clearTreeData(item.child)
clearTreeData(item.child);
}
return item
})
return item;
});
}
export function addTreeListLabel(treeData) { // 因树形控件在slot-scope模式下显示字段只能为label为此自定义添加label字段和child=children
return treeData.map((item) => {
if ((item.name === '设置' || item.name === '管理员列表' ||
item.name === '身份管理' || item.name === '管理权限' ||
item.name === '管理员列表' || item.name === '权限规则') && store.getters.name !== 'admin') {
item.disabled = true
export function addTreeListLabel(treeData) {
// 因树形控件在slot-scope模式下显示字段只能为label为此自定义添加label字段和child=children
return treeData.map(item => {
if (
(item.name === "设置" ||
item.name === "管理员列表" ||
item.name === "身份管理" ||
item.name === "管理权限" ||
item.name === "管理员列表" ||
item.name === "权限规则") &&
store.getters.name !== "admin"
) {
item.disabled = true;
}
item.label = item.name
return item
})
item.label = item.name;
return item;
});
}
export function addTreeListLabelForCasCard(treeData, child) {
treeData.map((item) => {
if ((item.name === '设置' || item.name === '管理员列表' ||
item.name === '身份管理' || item.name === '管理权限' ||
item.name === '管理员列表' || item.name === '权限规则') && store.getters.name !== 'admin') {
item.disabled = true
treeData.map(item => {
if (
(item.name === "设置" ||
item.name === "管理员列表" ||
item.name === "身份管理" ||
item.name === "管理权限" ||
item.name === "管理员列表" ||
item.name === "权限规则") &&
store.getters.name !== "admin"
) {
item.disabled = true;
}
item.label = item.name
return item
})
item.label = item.name;
return item;
});
}
//加法函数,用来得到精确的加法结果
@@ -58,14 +71,14 @@ export function Add(arg1, arg2) {
arg2 = parseFloat(arg2);
var r1, r2, m;
try {
r1 = arg1.toString().split(".")[1].length
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0
r2 = 0;
}
m = Math.pow(100, Math.max(r1, r2));
return (this.Mul(arg1, m) + this.Mul(arg2, m)) / m;
@@ -82,30 +95,46 @@ export function Mul(arg1, arg2) {
s1 = arg1.toString(),
s2 = arg2.toString();
try {
m += s1.split(".")[1].length
m += s1.split(".")[1].length;
} catch (e) {}
try {
m += s2.split(".")[1].length
m += s2.split(".")[1].length;
} catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
return (
(Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) /
Math.pow(10, m)
);
}
//替换安全域名
export function setDomain(url) {
url = url ? url.toString() : '';
url = url ? url.toString() : "";
// 正则替换存在的转义符
url = url.replace(/\\/g,'');
url = window.location.protocol==='https:'? url.replace('http://','https://') : url;
if(url.startsWith('src="')){
url = url.replaceAll('src="','');
url = url.replace(/\\/g, "");
url =
window.location.protocol === "https:"
? url.replace("http://", "https://")
: url;
if (url.startsWith('src="')) {
url = url.replaceAll('src="', "");
}
if(url.startsWith('//img') && window.location.protocol==='https:'){
url = url.replace('//img','https://img');
if (url.startsWith("//img") && window.location.protocol === "https:") {
url = url.replace("//img", "https://img");
}
return url;
}
// 过滤富文本中的 img 相对路径访问
export function replaceImgSrcHttps(content) {
return content.replaceAll('src="//','src="https://');
return content.replaceAll('src="//', 'src="https://');
}
/**
*计算table固定高度
*/
export function getTableHeight(height) {
let windowHeight =
document.documentElement.clientHeight || document.body.clientHeight;
let herderHeight = 100;
let footerHeight = 20;
return windowHeight - herderHeight - footerHeight - height;
}

View File

@@ -134,8 +134,8 @@ export default {
}
},
loginForm: {
account: 'demo', // admin
pwd: 'crmeb.com',
account: 'admin', // admin
pwd: '123456',
key: '',
code: '',
wxCode: ''
@@ -599,4 +599,4 @@ export default {
right: 0;
bottom: 6px;
}
</style>
</style>

View File

@@ -1,238 +0,0 @@
<template>
<div class="login-container">
<el-steps :active="current" align-center>
<el-step title="验证账号信息"></el-step>
<el-step title="修改账户密码"></el-step>
<el-step title="登录"></el-step>
</el-steps>
<el-form ref="formInline" :model="formInline" size="medium" :rules="ruleInline" class="login-form" autocomplete="on" label-position="left">
<template v-if="current === 0">
<el-form-item prop="phone">
<el-input type="text" v-model="formInline.phone" prefix="ios-contact-outline"
placeholder="请输入手机号" size="large" :readonly="infoData.phone?true:false"/>
</el-form-item>
<el-form-item prop="code" class="captcha">
<div class="acea-row" style="flex-wrap: nowrap;">
<el-input
ref="username"
v-model="formInline.code"
placeholder="验证码"
name="username"
type="text"
tabindex="1"
autocomplete="off"
prefix-icon="el-icon-message"
style="width: 90%"
/>
<el-button size="mini" :disabled=!this.canClick @click="cutDown" v-hasPermi="['admin:pass:send:code']">{{cutNUm}}</el-button>
</div>
</el-form-item>
</template>
<template v-if="current === 1">
<el-form-item prop="password" class="maxInpt">
<el-input type="password" v-model="formInline.password" prefix="ios-lock-outline"
placeholder="请输入新密码" size="large"/>
</el-form-item>
<el-form-item prop="checkPass" class="maxInpt">
<el-input type="password" v-model="formInline.checkPass" prefix="ios-lock-outline"
placeholder="请验证新密码" size="large"/>
</el-form-item>
</template>
<template v-if="current === 2">
<el-form-item prop="phone" class="maxInpt">
<el-input type="text" v-model="formInline.phone" prefix="ios-contact-outline"
placeholder="请输入手机号"/>
</el-form-item>
<el-form-item prop="password" class="maxInpt">
<el-input type="password" v-model="formInline.password" prefix="ios-lock-outline"
placeholder="请输入密码"/>
</el-form-item>
</template>
<el-form-item class="maxInpt">
<el-button v-if="current === 0" type="primary" @click="handleSubmit1('formInline',current)" class="mb20 width100">下一步</el-button>
<el-button v-if="current === 1" type="primary" @click="handleSubmit2('formInline',current)" class="mb20 width100">提交</el-button>
<el-button v-if="current === 2" type="primary" @click="handleSubmit('formInline',current)" class="mb20 width100">登录</el-button>
<el-button @click="returns('formInline')" class="width100" style="margin-left: 0px;">返回</el-button>
</el-form-item>
<!--<el-button v-if="current === 0" size="mini" :loading="loading" type="primary" style="width:100%;margin-bottom:20px;" @click="handleSubmit('formInline')">注册</el-button>-->
<!--<el-button size="mini" type="primary" style="width:100%;margin-bottom:20px;" @click="changelogo">立即登录</el-button>-->
</el-form>
</div>
</template>
<script>
import { updatePasswordApi, captchaApi, configApi } from '@/api/sms';
export default {
name: 'forgetPassword',
data () {
const validatePhone = (rule, value, callback) => {
if (!value) {
return callback(new Error('请填写手机号'));
} else if (!/^1[3456789]\d{9}$/.test(value)) {
callback(new Error('手机号格式不正确!'));
} else {
callback();
}
};
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
}else {
if(this.current === 1){
if (this.formInline.checkPass !== '') {
this.$refs.formInline.validateField('checkPass');
}
callback();
}else{
if(value !== this.formInline.checkPass){
callback(new Error('请输入正确密码!'));
}
callback();
}
}
};
var validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('请再次输入密码'));
} else if (value !== this.formInline.password) {
callback(new Error('两次输入密码不一致!'));
} else {
callback();
}
};
return {
isReadonly: false,
cutNUm: '获取验证码',
canClick: true,
current: 0,
formInline: {
account: '',
phone: '',
code: '',
password: '',
checkPass: '',
},
ruleInline: {
phone: [
{ required: true, validator: validatePhone, trigger: 'blur' }
],
code: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
],
password: [
{ validator: validatePass, trigger: 'blur' }
],
checkPass: [
{ validator: validatePass2, trigger: 'blur' }
],
}
}
},
props:{
infoData: {
type: Object,
default: null
}
},
mounted(){
this.infoData ? this.formInline.phone = this.infoData.phone : this.formInline.phone = '';
},
methods: {
// 短信验证码
cutDown () {
if (this.formInline.phone) {
if (!this.canClick) return;
this.canClick = false;
this.cutNUm = 60;
let data = {
phone: this.formInline.phone,
types: 1
};
captchaApi(data).then(async res => {
this.$message.success(res.msg);
})
let time = setInterval(() => {
this.cutNUm--;
if (this.cutNUm === 0) {
this.cutNUm = '获取验证码';
this.canClick = true;
clearInterval(time)
}
}, 1000)
} else {
this.$message.warning('请填写手机号!');
}
},
handleSubmit1 (name, current) {
this.$refs[name].validate((valid) => {
if (valid) {
this.current = 1;
} else {
return false;
}
})
},
handleSubmit2(name) {
this.formInline.account = this.formInline.phone
this.$refs[name].validate((valid) => {
if (valid) {
updatePasswordApi(this.formInline).then(async res => {
this.$message.success('修改成功');
this.current = 2;
})
} else {
return false;
}
})
},
//登录
handleSubmit (name) {
this.$refs[name].validate((valid) => {
if (valid) {
configApi({
account: this.formInline.account,
password: this.formInline.password
}).then(async res => {
this.$message.success('登录成功!');
this.$emit('on-Login');
})
} else {
return false;
}
})
},
returns () {
this.current === 0 ? this.$emit('goback'): this.current = 0
}
}
}
</script>
<style scoped lang="scss">
.login-form {
flex: 1;
padding: 32px 0;
text-align: center;
width: 384px;
margin: 0 auto;
overflow: hidden;
}
.width100{
width: 100%;
}
.maxInpt{
max-width:400px;
margin-left:auto;
margin-right:auto;
}
.code {
display: flex;
align-items: center;
justify-content: center;
}
.ivu-steps-item:last-child{
width: unset!important;
}
</style>

View File

@@ -1,220 +0,0 @@
<template>
<div class="login-container">
<el-steps :active="current" align-center>
<el-step title="验证账号信息"></el-step>
<el-step title="修改手机号码"></el-step>
<el-step title="登录"></el-step>
</el-steps>
<el-form ref="formInline" :model="formInline" size="medium" :rules="ruleInline" class="login-form" autocomplete="on" label-position="left">
<template v-if="current === 0">
<el-form-item prop="account">
<el-input type="text" v-model="formInline.account" prefix="ios-contact-outline"
placeholder="请输入当前账号" size="large"/>
</el-form-item>
<el-form-item prop="password">
<el-input type="password" v-model="formInline.password" prefix="ios-contact-outline"
placeholder="请输入密码" size="large"/>
</el-form-item>
</template>
<template v-if="current === 1">
<el-form-item prop="phone" class="maxInpt">
<el-input type="text" v-model="formInline.phone" prefix="ios-lock-outline"
placeholder="请输入新手机号" size="large"/>
</el-form-item>
<el-form-item prop="code" class="captcha">
<div class="acea-row" style="flex-wrap: nowrap;">
<el-input
ref="username"
v-model="formInline.code"
placeholder="验证码"
name="username"
type="text"
tabindex="1"
autocomplete="off"
prefix-icon="el-icon-message"
style="width: 90%"
/>
<el-button size="mini" :disabled=!this.canClick @click="cutDown">{{cutNUm}}</el-button>
</div>
</el-form-item>
</template>
<template v-if="current === 2">
<el-form-item prop="phone" class="maxInpt">
<el-input type="text" v-model="formInline.phone" prefix="ios-contact-outline"
placeholder="请输入手机号"/>
</el-form-item>
<el-form-item prop="password" class="maxInpt">
<el-input type="password" v-model="formInline.password" prefix="ios-lock-outline"
placeholder="请输入密码"/>
</el-form-item>
</template>
<el-form-item class="maxInpt">
<el-button v-if="current === 0" type="primary" @click="handleSubmit1('formInline',current)" class="mb20 width100">下一步</el-button>
<el-button v-if="current === 1" type="primary" @click="handleSubmit2('formInline',current)" class="mb20 width100" v-hasPermi="['admin:pass:update:phone']">提交</el-button>
<el-button v-if="current === 2" type="primary" @click="handleSubmit('formInline',current)" class="mb20 width100">登录</el-button>
<el-button @click="returns('formInline')" class="width100" style="margin-left: 0px;">返回</el-button>
</el-form-item>
<!--<el-button v-if="current === 0" size="mini" :loading="loading" type="primary" style="width:100%;margin-bottom:20px;" @click="handleSubmit('formInline')">注册</el-button>-->
<!--<el-button size="mini" type="primary" style="width:100%;margin-bottom:20px;" @click="changelogo">立即登录</el-button>-->
</el-form>
</div>
</template>
<script>
import { captchaApi, configApi, updateHoneApi, phoneValidatorApi } from '@/api/sms';
export default {
name: 'forgetPhone',
props: {
isIndex: {
type: Boolean,
default: false
}
},
data () {
const validatePhone = (rule, value, callback) => {
if (!value) {
return callback(new Error('请填写手机号'));
} else if (!/^1[3456789]\d{9}$/.test(value)) {
callback(new Error('手机号格式不正确!'));
} else {
callback();
}
};
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
if (this.formInline.checkPass !== '') {
this.$refs.formInline.validateField('checkPass');
}
callback();
}
};
return {
cutNUm: '获取验证码',
canClick: true,
current: 0,
formInline: {
account: '',
phone: '',
code: '',
password: '',
},
ruleInline: {
phone: [
{ required: true, validator: validatePhone, trigger: 'blur' }
],
code: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
],
account: [
{ required: true, message: '请输入当前账号', trigger: 'blur' }
]
}
}
},
methods: {
// 短信验证码
cutDown () {
if (this.formInline.phone) {
if (!this.canClick) return;
this.canClick = false;
this.cutNUm = 60;
let data = {
phone: this.formInline.phone,
types: 1
};
captchaApi(data).then(async res => {
this.$message.success(res.msg);
})
let time = setInterval(() => {
this.cutNUm--;
if (this.cutNUm === 0) {
this.cutNUm = '获取验证码';
this.canClick = true;
clearInterval(time)
}
}, 1000)
} else {
this.$message.warning('请填写手机号!');
}
},
handleSubmit1 (name) {
this.$refs[name].validate((valid) => {
if (valid) {
phoneValidatorApi(this.formInline).then(async res => {
this.$message.success('操作成功')
this.current = 1;
})
} else {
return false;
}
})
},
handleSubmit2(name) {
this.$refs[name].validate((valid) => {
if (valid) {
updateHoneApi(this.formInline).then(async res => {
this.$message.success('操作成功')
this.current = 2;
})
} else {
return false;
}
})
},
//登录
handleSubmit (name,num) {
this.$refs[name].validate((valid) => {
if (valid) {
configApi({
account: this.formInline.account,
password: this.formInline.password
}).then(async res => {
num===1?this.$message.success("原手机号密码正确"):this.$message.success("登录成功");
num===1?this.current = 1:this.$emit('on-Login');
})
} else {
return false;
}
})
},
returns () {
this.current === 0 ? this.$emit('gobackPhone'): this.current = 0
}
}
}
</script>
<style scoped lang="scss">
.login-form {
flex: 1;
padding: 32px 0;
text-align: center;
width: 384px;
margin: 0 auto;
overflow: hidden;
}
.width100{
width: 100%;
}
.maxInpt{
max-width:400px;
margin-left:auto;
margin-right:auto;
}
.code {
display: flex;
align-items: center;
justify-content: center;
}
.ivu-steps-item:last-child{
width: unset!important;
}
</style>

View File

@@ -1,188 +0,0 @@
<template>
<div class="login-container">
<el-row type="flex">
<el-col :span="24">
<el-form ref="formInline" size="small" :model="formInline" :rules="ruleInline" class="login-form"
autocomplete="on" label-position="left">
<div class="title-container">
<h3 class="title mb15">短信账户登录</h3>
</div>
<el-form-item prop="account">
<el-input
ref="account"
v-model="formInline.account"
placeholder="用户名"
prefix-icon="el-icon-user"
name="username"
type="text"
tabindex="1"
autocomplete="off"
/>
</el-form-item>
<el-form-item prop="password">
<el-input
:key="passwordType"
ref="password"
v-model="formInline.password"
:type="passwordType"
placeholder="密码"
name="password"
tabindex="2"
auto-complete="off"
prefix-icon="el-icon-lock"
/>
<span class="show-pwd" @click="showPwd">
<svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'"/>
</span>
</el-form-item>
<el-button size="mini" :loading="loading" type="primary" style="width:100%;margin-bottom:20px;"
@click="handleSubmit('formInline')">登录
</el-button>
<div class="acea-row row-center-wrapper mb20">
<el-button size="mini" type="text" style="margin-left: 0" @click="changePassword">忘记密码</el-button>
<el-divider direction="vertical"></el-divider>
<el-button size="mini" type="text" style="margin-left: 0" @click="changeReg">注册账户</el-button>
</div>
<el-tooltip class="item" effect="dark" content="
一号通为我司一个第三方平台
专门提供短信 物流查询,商品复制,电子面单等个性化服务
省去了自己单独接入功能的麻烦
初次运行代码默认是没有账号的,需要自行注册,
登录成功后根据提示购买自己需要用到的服务即可" placement="bottom">
<span style="margin-left: 0">平台说明</span>
</el-tooltip>
</el-form>
</el-col>
</el-row>
</div>
</template>
<script>
import { configApi } from '@/api/sms'
export default {
name: 'Login',
data() {
return {
formInline: {
account: '',
password: ''
},
ruleInline: {
account: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
},
passwordType: 'password',
loading: false
}
},
created() {
var _this = this
document.onkeydown = function(e) {
const key = window.event.keyCode
if (key === 13) {
_this.handleSubmit('formInline')
}
}
},
methods: {
showPwd() {
if (this.passwordType === 'password') {
this.passwordType = ''
} else {
this.passwordType = 'password'
}
this.$nextTick(() => {
this.$refs.password.focus()
})
},
handleSubmit(name) {
this.$refs[name].validate((valid) => {
if (valid) {
this.loading = true;
configApi(this.formInline).then(async res => {
this.$message.success('登录成功!')
this.$store.dispatch('user/isLogin')
this.$emit('on-Login')
this.loading = false;
}).catch(()=>{
this.loading = false;
})
} else {
return false
}
})
},
// 修改密码
changePassword() {
this.$emit('on-change')
},
changeReg() {
this.$emit('on-changes')
}
}
}
</script>
<style lang="scss" scoped>
.title{
text-align: center;
}
.captcha{
display: flex;
align-items: flex-start;
}
$bg: #2d3a4b;
$dark_gray: #889aa4;
$light_gray: #eee;
.imgs{
img{
height: 36px;
}
}
.login-form {
flex: 1;
padding: 32px 0;
text-align: center;
width: 384px;
margin: 0 auto;
overflow: hidden;
}
.tips {
font-size: 14px;
color: #fff;
margin-bottom: 10px;
span {
&:first-of-type {
margin-right: 16px;
}
}
}
.svg-container {
padding: 6px 5px 6px 15px;
color: $dark_gray;
vertical-align: middle;
width: 30px;
display: inline-block;
}
.show-pwd {
position: absolute;
right: 10px;
top: 7px;
font-size: 16px;
color: $dark_gray;
cursor: pointer;
user-select: none;
::v-deep.svg-icon {
vertical-align: 0.3em;
}
}
.thirdparty-button {
position: absolute;
right: 0;
bottom: 6px;
}
</style>

View File

@@ -1,225 +0,0 @@
<template>
<div class="login-container">
<el-form ref="formInline" size="small" :model="formInline" :rules="ruleInline" class="login-form" autocomplete="on" label-position="left">
<div class="title-container">
<h3 class="title mb15">一号通账户注册</h3>
</div>
<el-form-item prop="phone">
<el-input
v-model="formInline.phone"
placeholder="请输入您的手机号"
prefix-icon="el-icon-phone-outline"
/>
</el-form-item>
<el-form-item prop="password">
<el-input
:key="passwordType"
v-model="formInline.password"
:type="passwordType"
placeholder="密码"
tabindex="2"
auto-complete="off"
prefix-icon="el-icon-lock"
/>
<span class="show-pwd" @click="showPwd">
<svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
</span>
</el-form-item>
<el-form-item prop="domain">
<el-input
v-model="formInline.domain"
placeholder="请输入网址域名"
prefix-icon="el-icon-position"
/>
</el-form-item>
<el-form-item prop="code" class="captcha">
<div class="acea-row" style="flex-wrap: nowrap;">
<el-input
v-model="formInline.code"
placeholder="验证码"
type="text"
tabindex="1"
autocomplete="off"
prefix-icon="el-icon-message"
style="width: 90%"
/>
<el-button size="mini" :disabled=!this.canClick @click="cutDown" v-hasPermi="['admin:pass:send:code']">{{cutNUm}}</el-button>
</div>
</el-form-item>
<el-button :loading="loading" type="primary" style="width:100%;margin-bottom:20px;" @click="handleSubmit('formInline')" v-hasPermi="['admin:pass:register']">注册</el-button>
<el-button type="primary" style="width:100%;margin-bottom:20px;" @click="changelogo" v-hasPermi="['admin:pass:login']">立即登录</el-button>
</el-form>
</div>
</template>
<script>
import { captchaApi, registerApi } from '@/api/sms'
export default {
name: 'Register',
data() {
const validatePhone = (rule, value, callback) => {
if (!value) {
return callback(new Error('请填写手机号'))
} else if (!/^1[3456789]\d{9}$/.test(value)) {
callback(new Error('手机号格式不正确!'))
} else {
callback()
}
}
return {
loading: false,
passwordType: 'password',
captchatImg: '',
cutNUm: '获取验证码',
canClick: true,
formInline: {
account: '',
code: '',
domain: '',
phone: '',
password: ''
},
ruleInline: {
password: [
{ required: true, message: '请输入短信平台密码/token', trigger: 'blur' }
],
domain: [
{ required: true, message: '请输入网址域名', trigger: 'blur' }
],
phone: [
{ required: true, validator: validatePhone, trigger: 'blur' }
],
code: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
]
}
}
},
methods: {
showPwd() {
if (this.passwordType === 'password') {
this.passwordType = ''
} else {
this.passwordType = 'password'
}
this.$nextTick(() => {
this.$refs.password.focus()
})
},
// 短信验证码
cutDown() {
if (this.formInline.phone) {
if (!this.canClick) return
this.canClick = false
this.cutNUm = 60
captchaApi({
phone: this.formInline.phone,
types: 0
}).then(async res => {
this.$message.success('发送成功')
})
const time = setInterval(() => {
this.cutNUm--
if (this.cutNUm === 0) {
this.cutNUm = '获取验证码'
this.canClick = true
clearInterval(time)
}
}, 1000)
} else {
this.$message.warning('请填写手机号!')
}
},
// 注册
handleSubmit(name) {
this.formInline.account = this.formInline.phone
this.$refs[name].validate((valid) => {
if (valid) {
this.loading = true;
registerApi(this.formInline).then(async res => {
this.$message.success('注册成功')
setTimeout(() => {
this.changelogo()
}, 1000)
this.loading = false;
}).catch(()=>{
this.loading = false;
})
} else {
return false
}
})
},
// 立即登录
changelogo() {
this.$emit('on-change')
}
}
}
</script>
<style lang="scss" scoped>
.el-button+.el-button{
margin-left: 0px !important;
}
.title{
text-align: center;
}
.captcha{
display: flex;
align-items: flex-start;
::v-deep.el-form-item__content{
width: 100%;
}
}
$bg: #2d3a4b;
$dark_gray: #889aa4;
$light_gray: #eee;
.imgs{
img{
height: 36px;
}
}
.login-form {
flex: 1;
padding: 32px 0;
text-align: center;
width: 384px;
margin: 0 auto;
overflow: hidden;
}
.tips {
font-size: 14px;
color: #fff;
margin-bottom: 10px;
span {
&:first-of-type {
margin-right: 16px;
}
}
}
.svg-container {
padding: 6px 5px 6px 15px;
color: $dark_gray;
vertical-align: middle;
width: 30px;
display: inline-block;
}
.show-pwd {
position: absolute;
right: 10px;
top: 7px;
font-size: 16px;
color: $dark_gray;
cursor: pointer;
user-select: none;
::v-deep.svg-icon {
vertical-align: 0.3em;
}
}
.thirdparty-button {
position: absolute;
right: 0;
bottom: 6px;
}
</style>

View File

@@ -1,693 +0,0 @@
<template>
<div>
<el-tabs v-model="tableFrom.type" @tab-click="onChangeType">
<el-tab-pane label="短信" name="sms"></el-tab-pane>
<el-tab-pane label="商品采集" name="copy"></el-tab-pane>
<el-tab-pane label="物流查询" name="expr_query"></el-tab-pane>
<el-tab-pane label="电子面单打印" name="expr_dump"></el-tab-pane>
</el-tabs>
<!--短信列表-->
<div class="note" v-if="(tableFrom.type==='sms' && sms.open === 1) || (tableFrom.type==='expr_query' && query.open === 1) || (tableFrom.type==='copy' && copy.open === 1) || (tableFrom.type==='expr_dump' && dump.open === 1)">
<div class="filter-container flex-between mb20" v-if="tableFrom.type === 'sms'">
<div class="demo-input-suffix">
<span class="seachTiele">短信状态</span>
<el-radio-group v-model="tableFrom.status" size="small" @change="getList" class="mr20">
<el-radio-button label="3">全部</el-radio-button>
<el-radio-button label="1">成功</el-radio-button>
<el-radio-button label="2">失败</el-radio-button>
<el-radio-button label="0">发送中</el-radio-button>
</el-radio-group>
</div>
<div>
<router-link :to="{path: '/operation/systemSms/template'}">
<el-button type="primary" class="mr20" v-hasPermi="['admin:sms:temps']">短信模板</el-button>
</router-link>
<el-button @click="editSign" v-hasPermi="['admin:sms:modify:sign']">修改签名</el-button>
</div>
</div>
<el-table
v-loading="listLoading"
:data="tableData.data"
style="width: 100%"
highlight-current-row
:header-cell-style=" {fontWeight:'bold'}"
>
<el-table-column
v-for="(item, index) in columns2" :key="index"
:prop="item.key"
:label="item.title"
:min-width="item.minWidth">
<template slot-scope="scope">
<div v-if="['content'].indexOf(item.key) > -1 && tableFrom.type==='expr_query'" class="demo-image__preview">
<span>{{scope.row[item.key].num}}</span>
</div>
<span v-else>{{ scope.row[item.key] }}</span>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination
:page-sizes="[20, 40, 60, 80]"
:page-size="tableFrom.limit"
:current-page="tableFrom.page"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="pageChange"
/>
</div>
</div>
<!--无开通-->
<div v-else>
<!--开通按钮-->
<div v-if="(tableFrom.type==='sms' && !isSms) || (tableFrom.type==='expr_dump' && !isDump) || ((tableFrom.type==='copy' || tableFrom.type==='expr_query') && !isCopy)" class="wuBox acea-row row-column-around row-middle">
<div class="wuTu"><img src="../../../../assets/imgs/wutu.png"></div>
<div class="mb15">
<span class="wuSp1">{{tableFrom.type | onePassTypeFilter}}未开通哦</span>
<span class="wuSp2">点击立即开通按钮即可使用{{tableFrom.type | onePassTypeFilter}}服务哦</span>
</div>
<el-button size="medium" type="primary" @click="onOpenIndex(tableFrom.type)">立即开通</el-button>
</div>
<!--短信立即开通/开通电子面单服务-->
<div class="smsBox" v-if="(isDump && tableFrom.type==='expr_dump') || (isSms && tableFrom.type==='sms')">
<div class="index_from page-account-container">
<div class="page-account-top">
<span class="page-account-top-tit">开通{{tableFrom.type | onePassTypeFilter}}服务</span>
</div>
<el-form ref="formInlineDump" :model="formInlineDump" :rules="ruleInline" @submit.native.prevent @keyup.enter="handleSubmitDump('formInlineDump')">
<el-form-item prop="sign" class="maxInpt" v-if="isSms && tableFrom.type==='sms'" key="1">
<el-input type="text" v-model="formInlineDump.sign" prefix="ios-contact-outline" placeholder="请输入短信签名"/>
</el-form-item>
<template v-if="isDump && tableFrom.type==='expr_dump'">
<el-form-item prop="com" class="maxInpt">
<el-select v-model="formInlineDump.com" filterable placeholder="请选择快递公司" @change="onChangeExport" style="text-align: left;" class="width10">
<el-option v-for="(item,index) in exportList" :value="item.code" :key="index" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="temp_id" class="tempId maxInpt">
<div class="acea-row">
<el-select v-model="formInlineDump.tempId" placeholder="请选择电子面单模板" style="text-align: left;" :class="[formInlineDump.tempId?'width9':'width10']" @change="onChangeImg">
<el-option v-for="(item, index) in exportTempList" :value="item.temp_id" :key="index" :label="item.title"></el-option>
</el-select>
<div v-if="formInlineDump.tempId" style="position: relative;">
<!--<span class="tempImg" @click="">预览</span>-->
<div class="tempImgList ml10">
<div class="demo-image__preview">
<el-image
style="width: 36px; height: 36px"
:src="tempImg"
:preview-src-list="[tempImg]"
/>
</div>
</div>
</div>
</div>
</el-form-item>
<el-form-item prop="toName" class="maxInpt">
<el-input type="text" v-model="formInlineDump.toName" prefix="ios-contact-outline"
placeholder="请填写寄件人姓名"/>
</el-form-item>
<el-form-item prop="toTel" class="maxInpt">
<el-input type="text" v-model="formInlineDump.toTel" prefix="ios-contact-outline"
placeholder="请填写寄件人电话"/>
</el-form-item>
<el-form-item prop="toAddress" class="maxInpt">
<el-input type="text" v-model="formInlineDump.toAddress" prefix="ios-contact-outline"
placeholder="请填写寄件人详细地址"/>
</el-form-item>
<el-form-item prop="siid" class="maxInpt">
<el-input type="text" v-model="formInlineDump.siid" prefix="ios-contact-outline"
placeholder="请填写云打印编号"/>
</el-form-item>
</template>
<el-form-item class="maxInpt">
<el-button type="primary" size="medium" :loading="loading" @click="handleSubmitDump('formInlineDump')" class="btn width10">立即开通</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
<!--修改签名-->
<el-dialog
title="短信账户签名修改"
:visible.sync="dialogVisible"
width="500px"
:before-close="handleClose">
<el-form ref="formInline" size="small" :model="formInline" :rules="ruleInlineSign" class="login-form" autocomplete="on" label-position="left">
<el-form-item>
<el-input v-model="formInline.account" :disabled="true" prefix-icon="el-icon-user">
</el-input>
</el-form-item>
<el-form-item prop="sign">
<el-input
v-model="formInline.sign"
placeholder="请输入短信签名例如CRMEB"
prefix-icon="el-icon-document"
>
</el-input>
</el-form-item>
<el-form-item prop="phone">
<el-input
v-model="formInline.phone"
placeholder="请输入您的手机号"
:disabled="true"
prefix-icon="el-icon-phone-outline"
>
</el-input>
</el-form-item>
<el-form-item prop="code" class="captcha">
<div class="acea-row" style="flex-wrap: nowrap;">
<el-input
ref="username"
v-model="formInline.code"
placeholder="验证码"
name="username"
type="text"
tabindex="1"
autocomplete="off"
prefix-icon="el-icon-message"
style="width: 90%"
/>
<el-button size="mini" :disabled=!this.canClick @click="cutDown" v-hasPermi="['admin:pass:send:code']">{{cutNUm}}</el-button>
</div>
</el-form-item>
<el-form-item>
<el-alert title="短信签名提交后需要审核才会生效,请耐心等待或者联系客服" type="success"></el-alert>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit('formInline')"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { smsLstApi, serviceOpenApi, exportTempApi, expressAllApi, captchaApi, smsSignApi } from '@/api/sms'
import * as commFilter from '@/filters/commFilter';
import Template from "../../../appSetting/wxAccount/wxTemplate/index";
import { checkPermi } from "@/utils/permission"; // 权限判断函数
import {Debounce} from '@/utils/validate'
export default {
name: 'TableList',
props: {
copy: {
type: Object,
default: null
},
dump: {
type: Object,
default: null
},
query: {
type: Object,
default: null
},
sms: {
type: Object,
default: null
},
accountInfo: {
type: Object,
default: null
}
},
components: {Template},
data() {
const validatePhone = (rule, value, callback) => {
if (!value) {
return callback(new Error('请填写手机号'));
} else if (!/^1[3456789]\d{9}$/.test(value)) {
callback(new Error('手机号格式不正确!'));
} else {
callback();
}
};
return {
dialogVisible: false,
listLoading: false,
tableData: {
data: [],
total: 0
},
tableFrom: {
page: 1,
limit: 20,
status: '3',
type: 'sms'
},
columns2: [],
isSms: false, // 是否开通短信
isDump: false, // 是否开通电子面单,是否开通物流查询
isCopy: false, // 是否开通商品采集
modals: false,
loading: false,
formInlineDump: {
tempId: '',
sign: '',
com: '',
toName: '',
toTel: '',
siid: '',
toAddress: '',
type: ''
},
ruleInline: {
sign: [
{ required: true, message: '请输入短信签名', trigger: 'blur' }
],
phone: [
{ required: true, validator: validatePhone, trigger: 'blur' }
],
code: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
],
com: [
{ required: true, message: '请选择快递公司', trigger: 'change' }
],
tempId: [
{ required: true, message: '请选择打印模板', trigger: 'change' }
],
toName: [
{ required: true, message: '请输寄件人姓名', trigger: 'blur' }
],
toTel: [
{ required: true, validator: validatePhone, trigger: 'blur' }
],
siid: [
{ required: true, message: '请输入云打印机编号', trigger: 'blur' }
],
toAddress: [
{ required: true, message: '请输寄件人地址', trigger: 'blur' }
]
},
tempImg: '', // 图片
exportTempList: [], // 电子面单模板
exportList: [], // 快递公司列表
formInline: {
phone: '',
code: '',
sign: ''
},
ruleInlineSign: {
sign: [
{ required: true, message: '请输入短信签名', trigger: 'blur' }
],
phone: [
{ required: true, validator: validatePhone, trigger: 'blur' }
],
code: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
]
},
cutNUm: '获取验证码',
canClick: true,
}
},
watch: {
sms (n) {
if (n.open === 1) this.getList();
}
},
mounted() {
if (this.sms.open === 1) this.getList();
// if (this.isChecked === '1' && this.sms.open === 1) this.getList();
},
methods: {
editSign(){
this.formInline.account = this.accountInfo.account;
this.formInline.sign = this.accountInfo.sms.sign;
this.formInline.phone = this.accountInfo.phone;
this.dialogVisible = true;
},
//修改签名
handleSubmit:Debounce(function(name) {
this.$refs[name].validate((valid) => {
if (valid) {
smsSignApi(this.formInline).then(async res => {
this.$message.success('修改签名之后一号通需要审核过后通过!');
this.dialogVisible = false;
this.$refs[formName].resetFields();
})
} else {
return false;
}
})
}),
// 短信验证码
cutDown () {
if (this.formInline.phone) {
if (!this.canClick) return;
this.canClick = false;
this.cutNUm = 60;
let data = {
phone: this.formInline.phone,
types: 1
};
captchaApi(data).then(async res => {
this.$message.success(res.msg);
})
let time = setInterval(() => {
this.cutNUm--;
if (this.cutNUm === 0) {
this.cutNUm = '获取验证码';
this.canClick = true;
clearInterval(time)
}
}, 1000)
} else {
this.$message.warning('请填写手机号!');
}
},
handleClose(){
this.dialogVisible = false
this.$refs['formInline'].resetFields();
},
// 首页去开通
onOpenIndex (val) {
this.tableFrom.type = val;
switch (val) {
case 'sms':
this.isSms = true;
break;
case 'expr_dump':
this.openDump();
break;
default:
this.openOther();
break;
}
},
// 开通其他
openOther () {
this.$confirm(`确定开通${commFilter.onePassTypeFilter(this.tableFrom.type)}吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// this.handleSubmitDump('formInlineDump');
serviceOpenApi({type: this.tableFrom.type}).then(async res => {
this.$message.success('开通成功!');
this.getList();
this.$emit('openService')
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
})
})
},
// 开通电子面单
openDump () {
this.exportTempAllList();
this.isDump = true;
},
// 物流公司
exportTempAllList () {
expressAllApi({type:'elec'}).then(async res => {
this.exportList = res;
})
},
// 快递公司选择
onChangeExport (val) {
this.formInlineDump.tempId = '';
this.exportTemp(val);
},
// 电子面单模板
exportTemp (val) {
exportTempApi({ com: val }).then(async res => {
this.exportTempList = res.data.data || [];
})
},
onChangeImg (item) {
this.exportTempList.map(i => {
if (i.temp_id === item) this.tempImg = i.pic
})
},
handleSubmitDump (name) {
this.formInlineDump.type = this.tableFrom.type;
this.$refs[name].validate((valid) => {
if (valid) {
this.loading = true;
serviceOpenApi(this.formInlineDump).then(async res => {
this.$emit('openService');
this.$message.success('开通成功!');
this.getList();
this.loading = false;
}).catch(()=>{
this.loading = false;
})
} else {
return false;
}
})
},
onChangeType () {
this.tableFrom.page = 1
this.getList()
},
// 列表
getList() {
this.listLoading = true
smsLstApi(this.tableFrom).then(res => {
this.tableData.data = res.data;
if(this.tableFrom.type == 'sms'){
let obj = new Object();
let newArr = new Array();
res.data.forEach(item=>{
obj = item;
switch(item.status) {
case 0:
obj.status = '发送中'
break;
case 1:
obj.status = '成功'
break;
case 2:
obj.status = '失败'
break;
case 3:
obj.status = '全部'
break;
}
newArr.push(obj);
this.tableData.data = newArr;
})
}
this.tableData.total = res.count
switch (this.tableFrom.type) {
case 'sms':
this.columns2 = [
{
title: '手机号',
key: 'phone',
minWidth: 100
},
{
title: '模板内容',
key: 'content',
minWidth: 590
},
{
title: '发送时间',
key: 'add_time',
minWidth: 150
},
// {
// title: '状态',
// key: 'status',
// minWidth: 100
// }
]
break;
case 'expr_dump':
this.columns2 = [
// {
// title: '订单号',
// key: 'order_id',
// minWidth: 150
// },
{
title: '发货人',
key: 'from_name',
minWidth: 120
},
{
title: '收货人',
key: 'to_name',
minWidth: 120
},
{
title: '快递单号',
key: 'num',
minWidth: 120
},
{
title: '快递公司编码',
key: 'code',
minWidth: 120
},
{
title: '状态',
key: '_resultcode',
minWidth: 100
},
{
title: '打印时间',
key: 'add_time',
minWidth: 150
}
]
break;
case 'expr_query':
this.columns2 = [
{
title: '快递单号',
key: 'content',
minWidth: 120
},
{
title: '快递公司编码',
key: 'code',
minWidth: 120
},
{
title: '状态',
key: '_resultcode',
minWidth: 120
},
{
title: '添加时间',
key: 'add_time',
minWidth: 150
}
]
break;
default:
this.columns2 = [
{
title: '复制URL',
key: 'url',
minWidth: 400
},
{
title: '请求状态',
key: '_resultcode',
minWidth: 120
},
{
title: '添加时间',
key: 'add_time',
minWidth: 150
}
]
break;
}
this.listLoading = false
}).catch(res => {
this.listLoading = false
})
},
pageChange(page) {
this.tableFrom.page = page
this.getList()
},
handleSizeChange(val) {
this.tableFrom.limit = val
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
/*@aaa: ~'>>>';*/
.order_box ::v-deep.ivu-form-item-content{
margin-left: 50px!important;
}
.maxInpt{
max-width:400px;
margin-left:auto;
margin-right:auto;
}
.smsBox .page-account-top{
text-align: center;
margin: 70px 0 30px 0;
}
.note{
margin-top: 15px;
}
.tempImg{
cursor: pointer;
margin-left: 11px;
color: #1890FF;
}
.tempImgList{
// opacity: 1;
width: 38px !important;
height: 30px !important;
// margin-top: -30px;
cursor: pointer;
position: absolute;
z-index: 11;
img{
width: 38px !important;
height: 30px !important;
}
}
.width9{
width: 90%;
}
.width10{
width: 100%;
}
.wuBox{
width: 100%;
}
.wuSp1{
display: block;
text-align: center;
color: #000000;
font-size: 21px;
font-weight: 500;
line-height: 32px;
margin-top: 23px;
margin-bottom: 5px;
}
.wuSp2{
opacity: 45%;
font-weight: 400;
color: #000000;
line-height: 22px;
margin-bottom: 30px;
}
.page-account-top-tit{
font-size: 21px;
color: #1890FF;
}
.wuTu{
width: 295px;
height: 164px;
margin-top: 54px;
img{
width: 100%;
height: 100%;
}
+ span {
margin-bottom: 20px;
}
}
.tempId{
.ivu-form-item-content{
text-align: left !important;
}
}
.flex-between{
display: flex;
justify-content: space-between;
}
</style>

View File

@@ -0,0 +1,61 @@
<template>
<div class="divBox">
<el-card class="box-card">
<zb-parser
:form-id="formId"
:is-create="isCreate"
:edit-data="editData"
@submit="handlerSubmit"
@resetForm="resetForm"
v-if="isShow && checkPermi(['admin:pass:appget'])"
/>
</el-card>
</div>
</template>
<script>
import zbParser from '@/components/FormGenerator/components/parser/ZBParser';
import { passAppSaveApi, configInfo, passAppInfoApi } from '@/api/systemConfig.js';
import { checkPermi } from '@/utils/permission'; // 权限判断函数
export default {
name: 'onePassConfig',
components: { zbParser },
data() {
return {
isShow: true,
isCreate: 0,
editData: {},
formId: 144, //一号通配置
};
},
mounted() {
if (checkPermi(['admin:pass:appget'])) this.getPassAppInfo();
},
methods: {
checkPermi,
resetForm(formValue) {
this.isShow = false;
},
handlerSubmit(data) {
passAppSaveApi(data).then((res) => {
this.getPassAppInfo();
this.$message.success('操作成功');
});
},
//获取配置详情
getPassAppInfo() {
passAppInfoApi().then((res) => {
this.isShow = false;
this.editData = res;
this.isCreate = 1;
setTimeout(() => {
// 让表单重复渲染待编辑数据
this.isShow = true;
}, 80);
});
},
},
};
</script>
<style scoped></style>

View File

@@ -1,329 +1,35 @@
<template>
<div class="divBox">
<el-card v-if="isShowList" v-loading="fullscreenLoading" class="box-card mb20">
<div class="content acea-row row-middle">
<div class="demo-basic--circle acea-row row-middle">
<div class="circleUrl mr20"><img :src="circleUrl"></div>
<!--<el-avatar :size="50" :src="circleUrl" class="mr20" />-->
<div class="dashboard-workplace-header-tip">
<div class="dashboard-workplace-header-tip-title">{{ smsAccount }}祝您每一天开心</div>
<div class="dashboard-workplace-header-tip-desc">
<span class="mr10" @click="onChangePassswordIndex" v-if="checkPermi(['admin:pass:update:password'])">修改密码</span>
<span class="mr10" @click="onChangePhone" v-if="checkPermi(['admin:pass:update:phone'])">修改手机号</span>
<span @click="signOut" class="mr10" v-if="checkPermi(['admin:pass:logout'])">退出登录</span>
<!-- <el-tooltip class="item" effect="dark" content="
一号通为我司一个第三方平台
专门提供短信 物流查询,商品复制,电子面单等个性化服务
省去了自己单独接入功能的麻烦
初次运行代码默认是没有账号的,需要自行注册,
登录成功后根据提示购买自己需要用到的服务即可" placement="right">
<span class="mr10">平台说明</span>
</el-tooltip> -->
<template>
<el-popover trigger="hover" placement="right" >
<span class="mr10" slot="reference">平台说明</span>
<div class="pup_card">
一号通为我司一个第三方平台专门提供短信 物流查询商品复制电子面单等个性化服务省去了自己单独接入功能的麻烦初次运行代码默认是没有账号的需要自行注册
登录成功后根据提示购买自己需要用到的服务即可
</div>
</el-popover>
</template>
</div>
</div>
</div>
<div class="dashboard">
<div class="dashboard-workplace-header-extra">
<div class="acea-row">
<div class="header-extra">
<p class="mb5"><span>短信条数</span></p>
<p class="mb5">{{sms.num || 0}}</p>
<el-button size="mini" type="primary" @click="sms.open ===0?onOpen('sms'):mealPay('sms')" v-text="sms.open ===0?'开通服务':'套餐购买'" v-hasPermi="['admin:pass:meal:code', 'admin:pass:service:open']"></el-button>
</div>
<div class="header-extra">
<p class="mb5"><span>采集次数</span></p>
<p class="mb5">{{copy.num || 0}}</p>
<el-button size="mini" type="primary" @click="copy.open ===0?onOpen('copy'):mealPay('copy')" v-text="copy.open ===0?'开通服务':'套餐购买'" v-hasPermi="['admin:pass:meal:code', 'admin:pass:service:open']"></el-button>
</div>
<div class="header-extra">
<p class="mb5"><span>物流查询次数</span></p>
<p class="mb5">{{query.num || 0}}</p>
<el-button size="mini" type="primary" @click="query.open ===0?onOpen('expr_query'):mealPay('expr_query')" v-text="query.open ===0?'开通服务':'套餐购买'" v-hasPermi="['admin:pass:meal:code', 'admin:pass:service:open']"></el-button>
</div>
<div class="header-extra" style="border: none;">
<p class="mb5"><span>面单打印次数</span> </p>
<p class="mb5">{{dump.num || 0}}</p>
<el-button size="mini" type="primary" @click="dump.open ===0?onOpen('expr_dump'):mealPay('expr_dump')" v-text="dump.open ===0?'开通服务':'套餐购买'" v-hasPermi="['admin:pass:meal:code', 'admin:pass:service:open']"></el-button>
</div>
</div>
</div>
</div>
</div>
</el-card>
<el-card class="box-card" v-loading="loading">
<table-list v-if="isShowList" ref="tableLists" :sms="sms" :copy="copy" :dump="dump" :query="query" :accountInfo="accountInfo" @openService="openService"/>
<login-from v-if="isShowLogn" @on-change="onChangePasssword" @on-changes="onChangeReg" @on-Login="onLogin" />
<forget-password :infoData="infoData" v-if="isShow" @goback="goback" @on-Login="onLogin" :isIndex="isIndex"></forget-password>
<forget-phone v-if="isForgetPhone" @gobackPhone="gobackPhone" @on-Login="onLogin"></forget-phone>
<register-from v-if="isShowReg" @on-change="logoup" />
</el-card>
<div>
<iframe
ref="iframes"
src="https://api.crmeb.com/"
width="100%"
:height="iframeHeight"
style="border: none"
></iframe>
</div>
</template>
<script>
import tableList from './components/tableList'
import loginFrom from './components/loginFrom'
import registerFrom from './components/register'
import forgetPassword from './components/forgetPassword';
import forgetPhone from './components/forgetPhone';
import { logoutApi, smsNumberApi, smsInfoApi } from '@/api/sms'
import { mapGetters } from 'vuex'
import { checkPermi } from "@/utils/permission"; // 权限判断函数
export default {
name: 'SmsConfig',
components: { tableList, loginFrom, registerFrom, forgetPassword, forgetPhone },
name: "SmsConfig",
data() {
return {
fullscreenLoading: false,
loading: false,
smsAccount: '',
circleUrl: 'https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png',
accountInfo:{},
spinShow: false,
isForgetPhone: false, // 修改手机号
isIndex: false, // 判断忘记密码返回的路径
isShowLogn: false, // 登录
isShow: false, // 修改密码
isShowReg: false, // 注册
isShowList: false, // 登录之后列表
sms: { open: 0 }, // 短信信息
query: { open: 0 }, // 物流查询
dump: { open: 0 }, // 电子面单打印
copy: { open: 0 }, // 商品采集,
infoData: {},
}
iframeHeight: 0
};
},
computed: {
...mapGetters([
'isLogin'
])
created() {
window.addEventListener("resize", this.handleResize);
},
mounted() {
this.onIsLogin()
// if (!this.isLogin) {
// this.onIsLogin()
// } else {
// this.isShowList = true
// }
this.$nextTick(() => {
this.iframeHeight = this.$selfUtil.getTableHeight(0);
});
},
methods: {
checkPermi,
// 开通服务
openService (val) {
this.getNumber();
},
onOpen (val) {
this.$refs.tableLists.onOpenIndex(val);
},
// 手机号返回
gobackPhone () {
this.isShowList = true;
this.isForgetPhone = false;
},
onChangePhone () {
this.isForgetPhone = true
this.isShowLogn = false;
this.isShowList = false;
},
// 密码返回
goback () {
if (this.isIndex) {
this.isShowList = true;
this.isShow = false;
} else {
this.isShowLogn = true;
this.isShow = false;
}
},
// 修改密码
onChangePassswordIndex () {
this.isIndex = true;
this.passsword();
},
// 忘记密码
onChangePasssword () {
this.isIndex = false;
this.passsword();
// this.isShowLogn = false;
// this.isShow = true;
// this.isShowList = false;
},
passsword () {
this.isShowLogn = false;
this.isShow = true;
this.isShowList = false;
},
mealPay (val) {
this.$router.push({ path:'/operation/systemSms/pay',query:{type:val}});
},
// 剩余条数
getNumber() {
this.loading = true;
smsInfoApi().then(async res => {
let data = res;
this.infoData = res;
this.sms = {
num: data.sms.num,
open: data.sms.open,
surp: data.sms.open
};
this.query = {
num: data.query.num,
open: data.query.open,
surp: data.query.open
};
this.dump = {
num: data.dump.num,
open: data.dump.open,
surp: data.dump.open
};
this.copy = {
num: data.copy.num,
open: data.copy.open,
surp: data.copy.open
};
this.loading = false;
this.smsAccount = data.account;
this.accountInfo = data;
}).catch(res => {
this.isShowLogn = true;
this.isShowList = false;
this.loading = false;
})
},
// 登录跳转
onLogin() {
const url = this.$route.query.url
if (url) {
this.$router.replace(url)
} else {
this.getNumber()
this.isShowLogn = false
this.isShow = false
this.isShowReg = false
this.isShowList = true
}
},
// 查看是否登录
onIsLogin() {
this.fullscreenLoading = true
this.$store.dispatch('user/isLogin').then(async res => {
const data = res
this.isShowLogn = !data.status
this.isShowList = data.status
if (data.status) {
this.smsAccount = data.info
this.getNumber()
}
this.fullscreenLoading = false
}).catch(res => {
this.fullscreenLoading = false
this.isShowLogn = true
})
},
// 退出登录
signOut() {
logoutApi().then(async res => {
this.isShowLogn = true
this.isShowList = false
this.infoData.phone = '';
this.$store.dispatch('user/isLogin')
})
},
// 立即注册
onChangeReg() {
this.isShowLogn = false
this.isShow = false
this.isShowReg = true
},
// 立即登录
logoup() {
this.isShowLogn = true
this.isShow = false
this.isShowReg = false
handleResize(event) {
this.iframeHeight = this.$selfUtil.getTableHeight(0);
}
}
}
};
</script>
<style scoped lang="scss">
.dashboard{
width: auto !important;
min-width: 300px;
}
.header-extra{
/*width: 25%;*/
border-right: 1px solid #E9E9E9;
text-align: center;
padding: 0 18px;
}
$cursor: #1890ff;
.content{
justify-content: space-between;
}
.circleUrl{
width: 50px;
height: 50px;
}
.circleUrl img{
width: 100%;
height: 100%;
border-radius: 50%;
overflow: hidden;
}
.rR{
text-align: center;
font-size: 22px;
display: block;
}
.dashboard-workplace-header-tip {
display: inline-block;
vertical-align: middle;
}
.dashboard-workplace-header-tip-title {
font-size: 20px;
font-weight: 700;
margin-bottom: 12px;
}
.dashboard-workplace-header-tip-desc{
/*line-height: 0 !important;*/
display: block;
span{
font-size: 12px;
color: $cursor;
cursor: pointer;
display: inline-block;
}
}
.dashboard-workplace-header-extra{
width: auto!important;
min-width: 400px;
}
.pfont{
font-size: 12px;
color: #808695;
}
.text_overflow{
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.pup_card{
width: 240px;
border-radius: 5px;
padding: 5px;
box-sizing: border-box;
font-size: 12px;
line-height: 16px;
}
</style>

View File

@@ -177,7 +177,7 @@
</el-table-column>
<el-table-column v-for="(item,iii) in attrValue" :key="iii" :label="formThead[iii].title" align="center" min-width="120">
<template slot-scope="scope">
<el-input v-model="scope.row[iii]" :type="formThead[iii].title==='商品编号'?'text':'number'" :min="0" class="priceBox" @keyup.native='keyupEvent($event,oneFormBatch,scope.$index,iii, 1)' />
<el-input v-model="scope.row[iii]" maxlength="9" min="0.01" class="priceBox" @blur="keyupEvent(iii, scope.row[iii], scope.$index, 1)"/>
</template>
</el-table-column>
<template v-if="formValidate.isSub">
@@ -216,7 +216,7 @@
</el-table-column>
<el-table-column v-for="(item,iii) in attrValue" :key="iii" :label="formThead[iii].title" align="center" min-width="120">
<template slot-scope="scope">
<el-input :disabled="isDisabled" v-model="scope.row[iii]" :type="formThead[iii].title==='商品编号'?'text':'number'" :min="0" class="priceBox" @keyup.native='keyupEvent($event,oneFormBatch,scope.$index,iii, 2)' />
<el-input :disabled="isDisabled" v-model="scope.row[iii]" maxlength="9" min="0.01" class="priceBox" @blur="keyupEvent(iii, scope.row[iii], scope.$index, 2)" />
</template>
</el-table-column>
<template v-if="formValidate.isSub">
@@ -260,7 +260,8 @@
<el-table-column v-for="(item,iii) in attrValue" :key="iii" :label="formThead[iii].title" align="center" min-width="120">
<template slot-scope="scope">
<!-- <span>scope.row:{{scope.row}}</span>-->
<el-input :disabled="isDisabled" v-model="scope.row[iii]" :type="formThead[iii].title==='商品编号'?'text':'number'" class="priceBox" @keyup.native='keyupEvent($event,oneFormBatch,scope.$index,iii, 3)' />
<el-input :disabled="isDisabled" maxlength="9" min="0.01"
v-model="scope.row[iii]" class="priceBox" @blur="keyupEvent(iii, scope.row[iii], scope.$index, 3)" />
</template>
</el-table-column>
<el-table-column align="center" label="一级返佣(元)" min-width="120" v-if="formValidate.isSub">
@@ -585,33 +586,39 @@
this.getGoodsType()
},
methods: {
keyupEvent(e,array,index,row,num){
e.target.value=e.target.value.replace(/[^\d.]/g, '');
e.target.value=e.target.value.replace(/\.{2,}/g, '.');
e.target.value=e.target.value.replace(/^\./g, '0.');
e.target.value=e.target.value.replace(/^\d*\.\d*\./g, e.target.value.substring(0,e.target.value.length-1));
e.target.value=e.target.value.replace(/^0[^\.]+/g, '0')
e.target.value=e.target.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2')
// 校验输入框不能输入0保留2位小数库存为正整数
keyupEvent(key, val, index, num) {
if (key === 'barCode') return;
var re = /^\D*([0-9]\d*\.?\d{0,2})?.*$/;
switch (num) {
case 1:
if(row == 'stock'){
this.oneFormBatch[index][row]=parseInt(e.target.value)
}else{
this.oneFormBatch[index][row]=e.target.value
if (val == 0) {
this.oneFormBatch[index][key] = key === 'stock' ? 0 : 0.01;
} else {
this.oneFormBatch[index][key] =
key === 'stock'
? parseInt(val)
: this.$set(this.oneFormBatch[index], key, val.toString().replace(re, '$1'));
}
break;
case 2:
if(row == 'stock'){
this.OneattrValue[index][row]=parseInt(e.target.value)
}else{
this.OneattrValue[index][row]=e.target.value
if (val == 0) {
this.OneattrValue[index][key] = key === 'stock' ? 0 : 0.01;
} else {
this.OneattrValue[index][key] =
key === 'stock'
? parseInt(val)
: this.$set(this.OneattrValue[index], key, val.toString().replace(re, '$1'));
}
break;
default:
if(row == 'stock'){
this.ManyAttrValue[index][row]=parseInt(e.target.value)
}else{
this.ManyAttrValue[index][row]=e.target.value
if (val == 0) {
this.ManyAttrValue[index][key] = key === 'stock' ? 0 : 0.01;
} else {
this.ManyAttrValue[index][key] =
key === 'stock'
? parseInt(val)
: this.$set(this.ManyAttrValue[index], key, val.toString().replace(re, '$1'));
}
break;
}

View File

@@ -2,6 +2,10 @@
// launchtype项可配置值为local或remote, local代表前端连本地云函数remote代表前端连云端云函数
"version": "0.0",
"configurations": [{
"app-plus" :
{
"launchtype" : "remote"
},
"default" :
{
"launchtype" : "remote"

View File

@@ -186,6 +186,11 @@
@import 'static/iconfont/iconfont.css';
@import 'static/css/guildford.css';
@import 'static/css/style.scss';
// #ifdef APP
@import 'static/iconfont/iconfont.css';
@import 'static/iconfont/iconfont-app.css';
// #endif
/* 条件编译仅在H5平台生效 */
// #ifdef H5

View File

@@ -175,7 +175,7 @@ export function storeListApi(data) {
* @param object data
*/
export function getProductGood() {
return request.get('product/good');
return request.get('product/good',{},{ noAuth : true});
}
/**
@@ -185,7 +185,7 @@ export function getProductGood() {
*
*/
export function getReplyProduct(id) {
return request.get('reply/product/' + id, {
return request.get('reply/product/' + id, {},{
noAuth: true
})
}

View File

@@ -450,7 +450,8 @@ export function computeUser(){
data: {
host:window.location.host,
https:document.location.protocol,
version:'CRMEB-JAVA-KY-V2.0',
version:'CRMEB-JAVA-KY-V1.3.4',
version_code:'gitee',
ip:Cache.has('Ip') ? Cache.get('Ip') : ''
},
dataType:'json',

View File

@@ -1,12 +1,23 @@
let domain = 'http://127.0.0.1:20101'
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
//移动端商城API
let domain = 'http://your Front API domain'
module.exports = {
// 请求域名 格式: https://您的域名
HTTP_REQUEST_URL:domain,
// #ifdef MP
HTTP_REQUEST_URL: domain,
// #endif
HTTP_ADMIN_URL:'xxx.xxx.xxx', //PC后台的API请求地址上传图片用
HTTP_ADMIN_URL:'http://your h5 domain', //PC后台的API请求地址上传图片用,影响h5上传头像
// #ifdef H5
//H5接口是浏览器地址
// HTTP_REQUEST_URL: window.location.protocol+"//"+window.location.host,

View File

@@ -21,6 +21,15 @@ export function _toLogin(push, pathLogin) {
store.commit("LOGOUT");
let path = prePage();
let login_back_url = Cache.get(BACK_URL);
// #ifdef APP
uni.navigateTo({
url: '/pages/users/login/index'
})
return
// #endif
// #ifdef H5
// path = location.href;
path = location.pathname + location.search;

View File

@@ -1,7 +1,7 @@
{
"name" : "crmeb",
"appid" : "__UNI__E8BDBA5",
"description" : "crmeb商城",
"name" : "CRMEB Java 商城",
"appid" : "__UNI__E0D9AB1",
"description" : "CRMEB Java 商城",
"versionName" : "1.0.0",
"versionCode" : 1001,
"transformPx" : false,
@@ -16,7 +16,13 @@
"delay" : 0
},
/* */
"modules" : {},
"modules" : {
"Share" : {},
"VideoPlayer" : {},
"OAuth" : {},
"Payment" : {},
"Geolocation" : {}
},
/* */
"distribute" : {
/* android */
@@ -31,35 +37,92 @@
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"abiFilters" : []
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
},
/* ios */
"ios" : {
"idfa" : false
"idfa" : false,
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {},
"icons" : {}
"sdkConfigs" : {
"ad" : {},
"geolocation" : {
"amap" : {
"__platform__" : [ "ios", "android" ],
"appkey_ios" : "",
"appkey_android" : "111111"
}
},
"payment" : {
"weixin" : {
"__platform__" : [ "ios", "android" ],
"appid" : "111111",
"UniversalLinks" : ""
}
},
"share" : {
"weixin" : {
"appid" : "111111",
"UniversalLinks" : ""
}
},
"oauth" : {
"weixin" : {
"appid" : "111111",
"UniversalLinks" : ""
}
}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "123",
"appid" : "111111",
"setting" : {
"urlCheck" : true,
"minified" : true,

View File

@@ -13,18 +13,33 @@
{
"path": "pages/order_addcart/order_addcart",
"style": {
"navigationBarTitleText": "购物车"
"navigationBarTitleText": "购物车",
"navigationBarBackgroundColor": "#E93323",
"navigationStyle": "custom",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "pages/user/index",
"style": {
"navigationBarTitleText": "个人中心",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
//"navigationBarTitleText": "个人中心",
// #ifdef MP || APP-PLUS
"navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#E93323",
// #endif
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
@@ -36,7 +51,15 @@
{
"path": "pages/goods_cate/goods_cate",
"style": {
"navigationBarTitleText": "商品分类"
"navigationBarBackgroundColor": "#E93323",
//"navigationBarTitleText": "商品分类",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
@@ -62,33 +85,65 @@
{
"path": "pages/goods_list/index",
"style": {
"navigationBarTitleText": "商品列表"
}
},
"navigationBarTitleText": "商品列表",
"navigationBarBackgroundColor": "#E93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "pages/news_list/index",
"style": {
"navigationBarTitleText": "资讯"
//"navigationBarTitleText": "资讯",
"navigationBarBackgroundColor": "#E93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "pages/news_details/index",
"style": {
"navigationBarTitleText": "资讯详情"
//"navigationBarTitleText": "资讯详情",
"navigationBarBackgroundColor": "#E93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
//#ifdef H5
{
"path": "pages/auth/index",
"style": {
"navigationBarTitleText": "CRMEB"
//"navigationBarTitleText": "CRMEB"
}
},
//#endif
{
"path": "pages/goods_search/index",
"style": {
"navigationBarTitleText": "搜索商品"
//"navigationBarTitleText": "搜索商品",
"navigationBarBackgroundColor": "#E93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
@@ -100,12 +155,15 @@
{
"path": "pages/order_details/index",
"style": {
"navigationBarTitleText": "订单详情",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
//"navigationBarTitleText": "订单详情",
"navigationBarBackgroundColor": "#E93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
}, {
"path": "pages/index/components/a_seckill",
@@ -139,114 +197,230 @@
{
"path": "user_info/index",
"style": {
"navigationBarTitleText": "个人资料"
//"navigationBarTitleText": "个人资料",
"navigationBarBackgroundColor": "#E93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_get_coupon/index",
"style": {
"navigationBarTitleText": "领取优惠券"
//"navigationBarTitleText": "领取优惠券",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_goods_collection/index",
"style": {
"navigationBarTitleText": "收藏商品"
//"navigationBarTitleText": "收藏商品",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_sgin/index",
"style": {
"navigationBarTitleText": "签到"
//"navigationBarTitleText": "签到",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_sgin_list/index",
"style": {
"navigationBarTitleText": "签到记录"
}
},
//"navigationBarTitleText": "签到记录",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_money/index",
"style": {
"navigationBarTitleText": "我的账户"
}
},
//"navigationBarTitleText": "我的账户",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_bill/index",
"style": {
"navigationBarTitleText": "账单明细"
}
},
//"navigationBarTitleText": "账单明细",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_integral/index",
"style": {
"navigationBarTitleText": "积分详情"
}
},
//"navigationBarTitleText": "积分详情",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_coupon/index",
"style": {
"navigationBarTitleText": "我的优惠券"
//"navigationBarTitleText": "我的优惠券",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_spread_user/index",
"style": {
"navigationBarTitleText": "我的推广",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
// #endif
}
"navigationBarBackgroundColor": "#e93323",
"navigationBarTextStyle": "#fff",
"app-plus": {
"titleNView": {
"type": "default"
}
}
}
},
{
"path": "user_spread_code/index",
"style": {
"navigationBarTitleText": "分销海报"
}
},
//"navigationBarTitleText": "分销海报",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_spread_money/index",
"style": {
"navigationBarTitleText": "佣金记录",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
// #endif
}
"navigationBarBackgroundColor": "#e93323",
"navigationBarTextStyle": "#fff",
"app-plus": {
"titleNView": {
"type": "default"
}
}
}
},
{
"path": "user_cash/index",
"style": {
"navigationBarTitleText": "提现",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
// #endif
}
"navigationBarBackgroundColor": "#e93323",
"navigationBarTextStyle": "#fff",
"app-plus": {
"titleNView": {
"type": "default"
}
}
}
},
{
"path": "user_vip/index",
"style": {
"navigationBarTitleText": "会员中心"
}
},
"navigationBarTitleText": "会员中心",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default",
"backgroundColor": "#fff"
}
// #endif
}
}
},
{
"path": "user_address_list/index",
"style": {
"navigationBarTitleText": "地址管理"
}
},
"navigationBarTitleText": "地址管理",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_address/index",
"style": {
"navigationBarTitleText": "添加地址"
}
},
"navigationBarTitleText": "添加地址",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_phone/index",
"style": {
@@ -278,101 +452,194 @@
{
"path": "order_confirm/index",
"style": {
"navigationBarTitleText": "提交订单"
}
},
"navigationBarTitleText": "提交订单",
"navigationBarBackgroundColor": "#e93323",
// "navigationStyle": "custom",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "goods_details_store/index",
"style": {
"navigationBarTitleText": "门店列表"
}
},
"navigationBarTitleText": "门店列表",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "promoter-list/index",
"style": {
"navigationBarTitleText": "推广人列表",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
// #endif
}
"navigationBarBackgroundColor": "#e93323",
"navigationBarTextStyle": "#fff",
"app-plus": {
"titleNView": {
"type": "default"
}
}
}
},
{
"path": "promoter-order/index",
"style": {
"navigationBarTitleText": "推广人订单",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
// #endif
}
"navigationBarBackgroundColor": "#e93323",
"navigationBarTextStyle": "#fff",
"app-plus": {
"titleNView": {
"type": "default"
}
}
}
},
{
"path": "promoter_rank/index",
"style": {
"navigationBarTitleText": "推广人排行",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
// #endif
}
"path": "promoter_rank/index",
"style": {
"navigationBarTitleText": "推广人排行",
"navigationBarBackgroundColor": "#e93323",
"navigationBarTextStyle": "#fff",
"app-plus": {
"titleNView": {
"type": "default"
}
}
}
},
{
"path": "commission_rank/index",
"style": {
"navigationBarTitleText": "佣金排行",
"navigationBarBackgroundColor": "#e93323"
// #ifdef MP
,
"navigationBarTextStyle": "#fff"
// #endif
}
"navigationBarBackgroundColor": "#e93323",
"navigationBarTextStyle": "#fff",
"app-plus": {
"titleNView": {
"type": "default"
}
}
}
},
{
"path": "order_list/index",
"style": {
"navigationBarTitleText": "我的订单"
}
},
"navigationBarTitleText": "我的订单",
"navigationBarBackgroundColor": "#e93323",
"navigationStyle": "custom",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "goods_logistics/index",
"style": {
"navigationBarTitleText": "物流信息"
}
},
"navigationBarTitleText": "物流信息",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "user_return_list/index",
"style": {
"navigationBarTitleText": "退货列表"
}
},
"navigationBarTitleText": "退货列表",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "goods_return/index",
"style": {
"navigationBarTitleText": "申请退货"
}
},
"navigationBarTitleText": "申请退货",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "login/index",
"style": {
"navigationBarTitleText": "登录"
}
},
"navigationBarTitleText": "登录",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "goods_comment_list/index",
"style": {
"navigationBarTitleText": "商品评分"
}
},
"navigationBarTitleText": "商品评分",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "goods_comment_con/index",
"style": {
"navigationBarTitleText": "商品评价"
}
},
"navigationBarTitleText": "商品评价",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "wechat_login/index",
"style": {
@@ -428,15 +695,31 @@
{
"path": "goods_combination_details/index",
"style": {
"navigationStyle": "custom"
}
},
"navigationStyle": "custom",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "goods_combination_status/index",
"style": {
"navigationBarTitleText": "拼团"
}
},
"navigationBarTitleText": "拼团",
"navigationBarBackgroundColor": "#e93323",
"app-plus": {
// #ifdef APP-PLUS
"titleNView": {
"type": "default"
}
// #endif
}
}
},
{
"path": "goods_seckill/index",
"style": {
@@ -490,8 +773,8 @@
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "crmeb",
"navigationBarBackgroundColor": "#fff",
//"navigationBarTitleText": "crmeb",
"navigationBarBackgroundColor": "#ff5500",
"backgroundColor": "#F8F8F8",
"titleNView": false,
"rpxCalcMaxDeviceWidth": 960,

View File

@@ -135,8 +135,8 @@
<style scoped lang="scss">
.productSort .header {
width: 100%;
height: 96rpx;
margin-top:var(--status-bar-height);
height: 78rpx;
background-color: #fff;
position: fixed;
left: 0;

View File

@@ -1376,6 +1376,7 @@
<style scoped lang="scss">
.product-con {
height: 100%;
}
@@ -1846,6 +1847,7 @@
}
.icon-xiangzuo {
margin-top: var(--status-bar-height);
/* #ifdef H5 */
top: 20rpx !important;
/* #endif */

View File

@@ -150,6 +150,7 @@
<style lang="scss">
page {
margin-top: var(--status-bar-height);
background-color: #fff !important;
}

View File

@@ -1,7 +1,7 @@
<template>
<view>
<view class="page-index" :class="{'bgf':navIndex >0}">
<!-- #ifdef H5 -->
<!-- #ifdef H5||APP||MP-WEIXIN -->
<view class="header">
<view class="serch-wrapper flex">
<view class="logo">
@@ -13,21 +13,6 @@
</view>
</view>
<!-- #endif -->
<!-- #ifdef MP -->
<view class="mp-header">
<view class="sys-head" :style="{ height: statusBarHeight }"></view>
<view class="serch-box" style="height: 40px;">
<view class="serch-wrapper flex">
<view class="logo">
<image :src="logoUrl" mode=""></image>
</view>
<navigator url="/pages/goods_search/index" class="input" hover-class="none"><text
class="iconfont icon-xiazai5"></text>
搜索商品</navigator>
</view>
</view>
</view>
<!-- #endif -->
<!-- 首页展示 -->
<view class="page_content" :style="'margin-top:'+(marTop)+'px;'" v-if="navIndex == 0">
<view class="mp-bg"></view>
@@ -52,8 +37,8 @@
</view>
<text class='line'>|</text>
<view class='swipers'>
<swiper :indicator-dots="indicatorDots" :autoplay="autoplay" interval="2500" duration="500" vertical="true"
circular="true">
<swiper :indicator-dots="indicatorDots" :autoplay="autoplay" interval="2500" duration="500"
vertical="true" circular="true">
<block v-for="(item,index) in roll" :key='index'>
<swiper-item>
<navigator class='item' :url='item.url' hover-class='none'>
@@ -94,11 +79,16 @@
</navigator>
</view>
<view class="listBox acea-row">
<view class="list" :class='item.isUse ? "listHui" : "listActive" ' v-for="(item, index) in couponList.slice(0,2)" :key="index">
<view class="tit line1" :class='item.isUse ? "pricehui" : "titActive" '>{{item.name}}</view>
<view class="price" :class='item.isUse ? "pricehui" : "icon-color" '>{{item.money?Number(item.money):''}}<text class="yuan"></text></view>
<view class="ling" v-if="!item.isUse" :class='item.isUse ? "pricehui" : "icon-color" ' @click="getCoupon(item.id,index)">领取</view>
<view class="ling" v-else :class='item.isUse ? "pricehui fonthui" : "icon-color" '>已领取</view>
<view class="list" :class='item.isUse ? "listHui" : "listActive" '
v-for="(item, index) in couponList.slice(0,2)" :key="index">
<view class="tit line1" :class='item.isUse ? "pricehui" : "titActive" '>{{item.name}}
</view>
<view class="price" :class='item.isUse ? "pricehui" : "icon-color" '>
{{item.money?Number(item.money):''}}<text class="yuan"></text></view>
<view class="ling" v-if="!item.isUse" :class='item.isUse ? "pricehui" : "icon-color" '
@click="getCoupon(item.id,index)">领取</view>
<view class="ling" v-else :class='item.isUse ? "pricehui fonthui" : "icon-color" '>已领取
</view>
<view class="priceM">{{item.minPrice?Number(item.minPrice):''}}元可用</view>
</view>
</view>
@@ -247,6 +237,7 @@
},
data() {
return {
pageHeight: 0,
loaded: false,
loading: false,
isAuto: false, //没有授权的不会自动授权
@@ -622,7 +613,7 @@
get_host_product: function() {
let that = this;
that.loading = true;
if (that.hotScroll) return
getProductHot(
that.hotPage,
@@ -687,7 +678,7 @@
}
</style>
<style lang="scss">
.notice{
.notice {
width: 100%;
height: 70rpx;
border-radius: 10rpx;
@@ -695,22 +686,27 @@
margin-bottom: 25rpx;
line-height: 70rpx;
padding: 0 14rpx;
.line {
color: #CCCCCC;
}
.pic{
.pic {
width: 130rpx;
height: 36rpx;
image{
image {
width: 100%;
height: 100%;
display: block !important;
}
}
.swipers {
height: 100%;
width: 444rpx;
overflow: hidden;
swiper {
height: 100%;
width: 100%;
@@ -719,11 +715,13 @@
color: #333333;
}
}
.iconfont {
color: #999999;
font-size: 20rpx;
}
}
}
.couponIndex {
width: auto;
height: 238rpx;
@@ -731,7 +729,7 @@
background-size: 100% 100%;
padding-left: 42rpx;
margin-bottom: 30rpx;
.titBox {
padding: 47rpx 0;
text-align: center;
@@ -746,12 +744,13 @@
.tit2 {
color: #FFEBD2;
font-size: 22rpx;
margin:10rpx 0 26rpx 0;
margin: 10rpx 0 26rpx 0;
}
.tit3 {
color: #FFDAAF;
font-size: 24rpx;
.iconfont {
font-size: 20rpx;
}
@@ -796,9 +795,11 @@
.pricehui {
color: #B2B2B2;
}
.fonthui{
.fonthui {
background-color: #F5F5F5 !important;
}
.yuan {
font-size: 24rpx;
}
@@ -832,7 +833,7 @@
/* #ifdef H5*/
top: var(--window-top);
/* #endif */
z-index: 99;
flex-direction: row;
margin: 0px;
@@ -962,12 +963,20 @@
background: linear-gradient(180deg, #fff 0%, #f5f5f5 100%);
.header {
position: sticky;
top: 0;
z-index: 200000;
width: 100%;
background-color: $theme-color;
padding: 28rpx 30rpx;
.serch-wrapper {
margin-top: var(--status-bar-height);
align-items: center;
/* #ifdef MP-WEIXIN */
width: 75%;
/* #endif */
.logo {
@@ -1006,14 +1015,14 @@
}
}
/* #ifdef MP */
/* #ifdef MP||APP */
.mp-header {
z-index: 999;
position: fixed;
left: 0;
top: 0;
width: 100%;
/* #ifdef H5 */
/* #ifdef H5||APP */
padding-bottom: 20rpx;
/* #endif */
background-color: $theme-color;
@@ -1032,7 +1041,7 @@
.input {
display: flex;
align-items: center;
/* #ifdef MP */
/* #ifdef MP||APP */
width: 305rpx;
/* #endif */
height: 50rpx;
@@ -1369,5 +1378,17 @@
height: 304rpx;
background: linear-gradient(180deg, #E93323 0%, #F5F5F5 100%, #751A12 100%);
// border-radius: 0 0 30rpx 30rpx;
}
</style>
.stats {
position: absolute;
left: 0px;
top: 0px;
z-index: 2000000;
width: 750rpx;
height: var(--status-bar-height);
background: #ffffff;
}
</style>

View File

@@ -9,13 +9,13 @@
<view class="borRadius14 cartBox">
<view
v-if="(cartList.valid.length === 0 && cartList.invalid.length === 0) || (cartList.valid.length > 0)"
class='nav acea-row row-between-wrapper'>
class='nav acea-row row-between-wrapper my_nav'>
<view>购物数量 <text class='num font-color'>{{cartCount}}</text></view>
<view v-if="cartList.valid.length > 0 || cartList.invalid.length > 0"
class='administrate acea-row row-center-wrapper' @click='manage'>{{ footerswitch ? '管理' : '取消'}}
</view>
</view>
<view v-if="cartList.valid.length > 0 || cartList.invalid.length > 0" class="pad30">
<view v-if="cartList.valid.length > 0 || cartList.invalid.length > 0" class="pad30 my_nav_top">
<view class='list'>
<checkbox-group @change="checkboxChange">
<block v-for="(item,index) in cartList.valid" :key="index">
@@ -904,6 +904,7 @@
}
.shoppingCart .labelNav {
position: sticky;
height: 178rpx;
padding: 30rpx 30rpx 0 30rpx;
font-size: 22rpx;
@@ -915,6 +916,13 @@
background-color: $theme-color;
z-index: 5;
top: 0;
/* #ifdef MP-WEIXIN */
// top: calc(44px + 88rpx);
height: calc(178rpx + 44px + 45rpx);
padding-top: calc(44px + 50rpx);
// background-color: #282828;
/* #endif */
}
.shoppingCart .labelNav .item .iconfont {
@@ -1224,4 +1232,17 @@
.uni-p-b-96 {
height: 96rpx;
}
</style>
.my_nav {
/* #ifdef MP-WEIXIN */
top: calc(44px + 88rpx + 50rpx) !important;
// background-color: #00aaff;
/* #endif */
}
.my_nav_top{
/* #ifdef MP-WEIXIN */
margin-top: calc(44px + 88rpx + 30rpx + 105rpx) !important;
// background-color: #00aaff;
/* #endif */
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<view class="new-users copy-data" :style="{height:pageHeight}">
<view class="new-users copy-data" ><!-- 去掉了 :style="{height:pageHeight}" -->
<view class="mid" style="flex:1;overflow: hidden;">
<scroll-view scroll-y="true" style="height: 100%;">
<view class="bg"></view>
@@ -391,6 +391,7 @@
}
.new-users {
//margin-top: var(--status-bar-height);
display: flex;
flex-direction: column;
height: 100%;

View File

@@ -408,6 +408,16 @@
if (backUrl.indexOf('/pages/users/login/index') !== -1) {
backUrl = '/pages/index/index';
}
// #ifdef APP
uni.reLaunch({
url: "/pages/index/index"
});
return
// #endif
console.log(69999);
console.log(backUrl);
uni.reLaunch({
url: backUrl
});

View File

@@ -359,7 +359,6 @@
* 生命周期函数--监听页面隐藏
*/
// onHide: function() {
// console.log(999);
// this.isClose = true
// },
methods: {
@@ -949,7 +948,7 @@
mark: that.mark,
storeId: that.system_store.id || 0,
shippingType: that.$util.$h.Add(that.shippingType, 1),
payChannel: that.payChannel
payChannel: that.payChannel||'weixinh5'
};
if (data.payType == 'yue' && parseFloat(that.userInfo.nowMoney) < parseFloat(that.totalPrice))

View File

@@ -1,5 +1,8 @@
<template>
<view>
<!-- #ifdef APP-->
<view class='status'></view>
<!-- #endif -->
<form @submit="formSubmit" report-submit='true'>
<view class='addAddress pad30'>
<view class='list borRadius14'>
@@ -575,4 +578,12 @@
position: absolute;
right:0;
}
.status{
display: flex;
width: 750rpx;
// background-color: #E93323;
height: var(--status-bar-height);
}
</style>

View File

@@ -1,5 +1,8 @@
<template>
<view>
<!-- #ifdef APP-->
<view class='status_1'></view>
<!-- #endif -->
<view class='line'>
<image src='../../../static/images/line.jpg' v-if="addressList.length"></image>
</view>
@@ -44,9 +47,16 @@
<view class='addressBnt wxbnt' @click='getWxAddress'><text class='iconfont icon-weixin2'></text>导入微信地址</view>
<!-- #endif -->
<!-- #ifdef H5-->
<view class='addressBnt bg-color' :class="this.$wechat.isWeixin()?'':'on'" @click='addAddress'><text class='iconfont icon-tianjiadizhi'></text>添加新地址</view>
<view v-if="this.$wechat.isWeixin()" class='addressBnt wxbnt' @click='getAddress'><text class='iconfont icon-weixin2'></text>导入微信地址</view>
<!-- #endif -->
<!-- #ifdef APP-->
<view class='addressBnt on bg-color' @click='addAddress'><text class='iconfont icon-tianjiadizhi'></text>添加新地址</view>
<!-- #endif -->
</view>
<!-- #ifdef MP -->
<!-- <authorize @onLoadFun="onLoadFun" :isAuto="isAuto" :isShowAuth="isShowAuth" @authColse="authColse"></authorize> -->
@@ -458,4 +468,10 @@
.footer .addressBnt.wxbnt {
background-color: #fe960f;
}
.status_1{
display: flex;
width: 750rpx;
// background-color: #E93323;
height: var(--status-bar-height);
}
</style>

29
app/project.config.json Normal file
View File

@@ -0,0 +1,29 @@
{
"appid": "wxd29e5ba4ccbcca2f",
"compileType": "miniprogram",
"libVersion": "3.1.4",
"packOptions": {
"ignore": [],
"include": []
},
"setting": {
"coverView": true,
"es6": true,
"postcss": true,
"minified": true,
"enhance": true,
"showShadowRootInWxmlPanel": true,
"packNpmRelationList": [],
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"condition": false
},
"condition": {},
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
}
}

View File

@@ -0,0 +1,8 @@
{
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
"projectname": "app",
"setting": {
"compileHotReLoad": true
},
"libVersion": "3.1.4"
}

View File

@@ -8,7 +8,7 @@ import Cache from "@/utils/cache";
export function silenceBindingSpread() {
//#ifdef H5
//#ifdef H5 || APP
let puid = Cache.get('spread');
//#endif

View File

@@ -33,6 +33,7 @@ function baseRequest(url, method, data, {
}
if (store.state.app.token) header[TOKENNAME] = store.state.app.token;
return new Promise((reslove, reject) => {
Url=HTTP_REQUEST_URL||'http://api.front.hdq.xbdzz.cn'
uni.request({
url: Url + '/api/front/' + url,
method: method || 'GET',

5
crmeb/.gitignore vendored
View File

@@ -4,6 +4,7 @@ target/
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
@@ -40,3 +41,7 @@ src/main/java/com/.DS_Store
src/main/java/.DS_Store
src/main/.DS_Store
.DS_Store
xx

View File

@@ -9,7 +9,6 @@
3. Swagger 2.9.2
4. Mybatis Plus 3.3.1
# 部署
1. 拿到jar包上传到web目录下宝塔配置的域名指向的web目录下即可
2. 在 jar包同级目录下运行 `start.sh (运行命令为 ./start.sh )` 脚本即可启动项目
@@ -17,11 +16,12 @@
4. 看到 `Completed 200 OK` 表示启动成功
5. 默认启动 `20000` 端口号
#
# 注意事项
1. web端口号不可以设置为`20000`
2. 反向代理地址: `http://127.0.0.1:20000` 【外网域名指向这个地址】
# 二次开发帮助文档
##注解参考:
1. `@NotNull` 注解 作用类型 解释 任何类型 属性不能为 `null`

View File

@@ -1,4 +1,4 @@
package com.zbkj.common.acpect;
package com.zbkj.admin.acpect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -29,7 +29,7 @@ public class ControllerAspect {
Logger logger = LoggerFactory.getLogger(ControllerAspect.class);
@Pointcut("execution(* com.zbkj.crmeb.system.controller.*.*(..))")
@Pointcut("execution(* com.zbkj.admin.controller.*.*(..))")
private void pointCutMethodController() {
}

View File

@@ -90,7 +90,7 @@ public class StoreProductController {
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
public CommonResult<String> delete(@RequestBody @PathVariable Integer id, @RequestParam(value = "type", required = false, defaultValue = "recycle")String type) {
if (storeProductService.deleteProduct(id, type)) {
if (type.equals("recycle")) {
if ("recycle".equals(type)) {
storeCartService.productStatusNotEnable(id);
} else {
storeCartService.productDelete(id);

View File

@@ -30,14 +30,13 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
# url: jdbc:mysql://121.196.17.222:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/crmeb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: crmeb
password: 111111
redis:
host: 127.0.0.1 #地址
port: 6379 #端口
password: 123456
password: 111111
timeout: 10000 # 连接超时时间(毫秒)
database: 3 #默认数据库
jedis:

View File

@@ -24,13 +24,13 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/crmeb_java_dev?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/crmeb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: crmeb
password: 111111
redis:
host: 127.0.0.1 #地址
port: 6379 #端口
password: 123456
password: 111111
timeout: 10000 # 连接超时时间(毫秒)
database: 10 #默认数据库
jedis:

View File

@@ -24,13 +24,13 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/crmeb_java?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/crmeb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: crmeb
password: 1111111
redis:
host: 127.0.0.1 #地址
port: 6379 #端口
password: 123456
password: 111111
timeout: 10000 # 连接超时时间(毫秒)
database: 15 #默认数据库
jedis:
@@ -62,5 +62,5 @@ swagger:
basic:
enable: true #是否开启界面
check: true #是否打开验证
username: crmeb #访问swagger的账号
password: crmeb.com #访问swagger的密码
username: #访问swagger的账号
password: #访问swagger的密码

View File

@@ -7,7 +7,7 @@ crmeb:
wechat-js-api-beta: true #微信js api是否是beta版本
asyncConfig: false #是否同步config表数据到redis
asyncWeChatProgramTempList: false #是否同步小程序公共模板库
imagePath: /Users/stivepeim/Documents/ZBKJ/OpenSource/CRMEBJava/crmeb/crmebimage/ # 服务器图片路径配置 斜杠结尾
imagePath: /当前项目更根目录的素材文件(绝对路径)/crmebimage/ # 服务器图片路径配置 斜杠结尾
database: mysql
# 配置端口
@@ -23,7 +23,6 @@ server:
spring:
profiles:
# 配置的环境
# active: #spring.profiles.active#
active:
servlet:
multipart:
@@ -39,14 +38,14 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://118.178.234.105:3306/crmeb_os?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: crmeb_os
password: cGEfaaRDbwd6cc2k
url: jdbc:mysql://127.0.0.1:3306/crmeb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: crmeb
password: 111111
redis:
host: 118.178.234.105 #地址
host: 127.0.0.1 #地址
port: 6379 #端口
password: 1qazxsw2
password: 111111
timeout: 30000 # 连接超时时间(毫秒)
database: 15 #默认数据库
jedis:

View File

@@ -125,11 +125,6 @@
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
<!-- doc -->
<dependency>
<groupId>io.springfox</groupId>
@@ -271,6 +266,7 @@
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.18</version>
</dependency>
<!-- 开发阶段热部署-->

View File

@@ -1,12 +1,12 @@
package com.zbkj.common.interceptor;
import cn.hutool.core.codec.Base64;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import sun.misc.BASE64Decoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -52,7 +52,7 @@ public class SwaggerInterceptor extends HandlerInterceptorAdapter {
public boolean httpBasicAuth(String authorization) throws IOException {
if(check){
if (authorization != null && authorization.split(" ").length == 2) {
String userAndPass = new String(new BASE64Decoder().decodeBuffer(authorization.split(" ")[1]));
String userAndPass = Base64.decodeStr(authorization.split(" ")[1]);
String username = userAndPass.split(":").length == 2 ? userAndPass.split(":")[0] : null;
String password = userAndPass.split(":").length == 2 ? userAndPass.split(":")[1] : null;
return this.username.equals(username) && this.password.equals(password);

View File

@@ -1,7 +1,6 @@
package com.zbkj.common.request;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sun.org.apache.xpath.internal.operations.Bool;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -9,11 +8,8 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* 商品表

View File

@@ -1,23 +1,19 @@
package com.zbkj.common.utils;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zbkj.common.constants.Constants;
import com.zbkj.common.exception.CrmebException;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.Security;
import java.text.NumberFormat;
import java.util.*;
import java.util.regex.Matcher;
@@ -37,43 +33,26 @@ import java.util.regex.Pattern;
*/
public class CrmebUtil {
public static String encryptPassword(String pwd, String key){
try {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key _key = getDESSercretKey(key);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, _key);
byte[] data = pwd.getBytes(StandardCharsets.UTF_8);
byte[] result = cipher.doFinal(data);
return new sun.misc.BASE64Encoder().encode(result);
}catch (Exception e){
throw new CrmebException("密码处理异常");
}
public static String encryptPassword(String pwd, String key) {
DES des = new DES(getDESSercretKey(key));
byte[] result = des.encrypt(pwd);
return Base64.encode(result);
}
/**
* 解密密码
*/
public static String decryptPassowrd(String pwd, String key)
throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key aKey = getDESSercretKey(key);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, aKey);
byte[] data = new sun.misc.BASE64Decoder().decodeBuffer(pwd);
byte[] result = cipher.doFinal(data);
return new String(result, StandardCharsets.UTF_8);
public static String decryptPassowrd(String pwd, String key) {
DES des = new DES(getDESSercretKey(key));
return des.decryptStr(pwd);
}
/**
* 获得DES加密秘钥
* @param key
* @return
* @throws UnsupportedEncodingException
*/
public static SecretKey getDESSercretKey(String key) throws UnsupportedEncodingException {
public static byte[] getDESSercretKey(String key) {
byte[] result = new byte[8];
byte[] keys = null;
keys = key.getBytes(StandardCharsets.UTF_8);
@@ -84,7 +63,7 @@ public class CrmebUtil {
result[i] = 0x01;
}
}
return new SecretKeySpec(result, "DES");
return result;
}
/**
@@ -135,7 +114,23 @@ public class CrmebUtil {
*/
public static void main(String[] args) throws Exception {
// System.out.println(encryptPassword("123456", "admin"));
System.out.println(decryptPassowrd("", ""));
// System.out.println(decryptPassowrd("", ""));
String key = "123456";
String data = "中国123ABCabc";
System.out.println("原始数据:" + data);
String encryptPassword = encryptPassword(data, key);
System.out.println("加密结果:" + encryptPassword);
String decryptPassowrd = decryptPassowrd(encryptPassword, key);
System.out.println("解密结果:" + decryptPassowrd);
// 执行结果如下:
// 原始数据中国123ABCabc
// 加密结果5JNGj04iE/XUuTZM75zMrA==
// 解密结果中国123ABCabc
System.out.println(encryptPassword("crmeb@123456", "18292417675"));
// 执行结果f6mcpGQ8NEmwbab2TlkpUg==
// 与 SQL 中的数据一致
}
/**
@@ -396,7 +391,7 @@ public class CrmebUtil {
}
ip = request.getRemoteAddr();
if(ip.equals("0:0:0:0:0:0:0:1")){
if("0:0:0:0:0:0:0:1".equals(ip)){
//本地 localhost访问 ipv6
ip = "127.0.0.1";
}
@@ -419,11 +414,11 @@ public class CrmebUtil {
return false;
}
if(ip.equals("unKnown")){
if("unKnown".equals(ip)){
return false;
}
if(ip.equals("unknown")){
if("unknown".equals(ip)){
return false;
}

View File

@@ -73,7 +73,7 @@ public class ImageMergeUtil {
File file = new File(fileName);
BufferedImage read = ImageIO.read(file);
if(bufferedImage == null || bufferedImage.equals("")){
if(bufferedImage == null || "".equals(bufferedImage)){
imageMergeUtilVo.setX(0);
imageMergeUtilVo.setY(0);
//创建新的画布,宽高以第一个图为准

View File

@@ -41,7 +41,7 @@ public class UrlUtil {
return entity;
}
url = url.trim();
if (url.equals("")) {
if ("".equals(url)) {
return entity;
}
String[] urlParts = url.split("\\?");

View File

@@ -40,37 +40,37 @@ public class ValidateFormUtil {
List<String> val = CrmebUtil.stringToArrayStrRegex(value, ":");
////必填
if(val.get(0).equals("required") && val.get(1).equals("true")){
if("required".equals(val.get(0)) && "true".equals(val.get(1))){
isRequire(systemConfig.getValue(), systemConfig.getTitle());
continue;
}
//数字
if(val.get(0).equals("number") && val.get(1).equals("true")){
if("number".equals(val.get(0)) && "true".equals(val.get(1))){
isNumber(systemConfig.getValue(), systemConfig.getTitle());
continue;
}
//最大值
if(val.get(0).equals("max")){
if("max".equals(val.get(0))){
isNumber(systemConfig.getValue(), systemConfig.getTitle());
continue;
}
//最小值
if(val.get(0).equals("min")){
if("min".equals(val.get(0))){
isNumber(systemConfig.getValue(), systemConfig.getTitle());
continue;
}
//邮箱
if(val.get(0).equals("email") && val.get(1).equals("true")){
if("email".equals(val.get(0)) && "true".equals(val.get(1))){
isEmail(systemConfig.getValue(), systemConfig.getTitle());
continue;
}
//手机
if(val.get(0).equals("phone") && val.get(1).equals("true")){
if("phone".equals(val.get(0)) && "true".equals(val.get(1))){
isPhone(systemConfig.getValue(), systemConfig.getTitle());
}
}

View File

@@ -55,7 +55,7 @@ public class WxUtil {
if(ObjectUtil.isNull(result)){
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if(result.containsKey("errcode") && result.getString("errcode").equals("0")){
if(result.containsKey("errcode") && "0".equals(result.getString("errcode"))){
return result;
}
if(result.containsKey("errmsg")){

View File

@@ -8,17 +8,20 @@ import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
@@ -29,7 +32,7 @@ import java.util.Map;
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
* | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
@@ -44,13 +47,14 @@ public class XmlUtil {
InputStream in = null;
try {
in = request.getInputStream();
setReaderFeature(reader);
Document doc = reader.read(in);
Element root = doc.getRootElement();
List<Element> list = root.elements();
for (Element element : list) {
map.put(element.getName(), element.getText());
}
} catch (IOException | DocumentException e) {
} catch (IOException | DocumentException | SAXException e) {
e.printStackTrace();
} finally {
try {
@@ -66,26 +70,56 @@ public class XmlUtil {
/**
* 将发送消息封装成对应的xml格式
*/
public static HashMap<String, Object> xmlToMap(String strxml) throws Exception {
strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
// public static HashMap<String, Object> xmlToMap(String strxml) throws Exception {
// strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
//
// HashMap<String, Object> map = new HashMap<>();
// SAXReader reader = new SAXReader();
// InputStream inputStream = new ByteArrayInputStream(strxml.getBytes(StandardCharsets.UTF_8));
//
// if (StringUtils.isBlank(strxml)) {
// return null;
// }
//
// Document document = reader.read(inputStream);
// Element root = document.getRootElement();
// List<Element> list = root.elements();
//
// for (Element e : list) {
// map.put(e.getName(), e.getText());
// }
// inputStream.close();
//
// return map;
// }
HashMap<String, Object> map = new HashMap<>();
SAXReader reader = new SAXReader();
InputStream inputStream = new ByteArrayInputStream(strxml.getBytes(StandardCharsets.UTF_8));
public static void setReaderFeature(SAXReader reader) throws SAXException {
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
}
public static HashMap<String, Object> xmlToMap(String strxml) {
strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
if (StringUtils.isBlank(strxml)) {
return null;
}
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> list = root.elements();
for (Element e : list) {
map.put(e.getName(), e.getText());
HashMap<String, Object> map = new HashMap<>();
try {
DocumentBuilder documentBuilder = WXPayXmlUtil.newDocumentBuilder();
org.w3c.dom.Document document = documentBuilder.parse(new InputSource(new StringReader(strxml)));
org.w3c.dom.Element element = document.getDocumentElement();
NodeList nodeList = element.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
map.put(node.getNodeName(), node.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
inputStream.close();
return map;
}

View File

@@ -91,7 +91,7 @@ public class GenCodeUtils {
columnEntity.setAttrType(attrType);
if (!hasBigDecimal && attrType.equals("BigDecimal")) {
if (!hasBigDecimal && "BigDecimal".equals(attrType)) {
hasBigDecimal = true;
}
if (!hasList && "array".equals(columnEntity.getExtra())) {

View File

@@ -50,7 +50,7 @@ public class QrCodeServiceImpl implements QrCodeService {
Map<Object, Object> dataMap = JSONObject.toJavaObject(data, Map.class);
for (Map.Entry<Object, Object> m : dataMap.entrySet()) {
if(m.getKey().equals("path")){
if("path".equals(m.getKey())){
//前端路由, 不需要拼参数
page = m.getValue().toString();
continue;

View File

@@ -951,10 +951,10 @@ public class UserCenterServiceImpl extends ServiceImpl<UserDao, User> implements
* 绑定手机号数据校验
*/
private void checkBindingPhone(WxBindingPhoneRequest request) {
if (!request.getType().equals("public") && !request.getType().equals("routine") && !request.getType().equals("iosWx") && !request.getType().equals("androidWx")) {
if (!"public".equals(request.getType()) && !"routine".equals(request.getType()) && !"iosWx".equals(request.getType()) && !"androidWx".equals(request.getType())) {
throw new CrmebException("未知的用户类型");
}
if (request.getType().equals("public")) {
if ("public".equals(request.getType())) {
if (StrUtil.isBlank(request.getCaptcha())) {
throw new CrmebException("验证码不能为空");
}

View File

@@ -13,7 +13,7 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: root
password: 123456
redis:

View File

@@ -13,7 +13,7 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/crmeb_java_dev?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
url: jdbc:mysql://127.0.0.1:3306/crmeb_java_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: root
password: 123456
redis:

View File

@@ -13,7 +13,7 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/crmeb_java?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
url: jdbc:mysql://127.0.0.1:3306/crmeb_java?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: root
password: 123456
redis:
@@ -51,5 +51,5 @@ swagger:
basic:
enable: true #是否开启界面
check: true #是否打开验证
username: crmeb #访问swagger的账号
password: crmeb.com #访问swagger的密码
username: #访问swagger的账号
password: #访问swagger的密码

View File

@@ -33,13 +33,13 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/crmeb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8
username: crmeb
password: 111111
redis:
host: 127.0.0.1 #地址
port: 6379 #端口
password: 123456
password: 111111
timeout: 30000 # 连接超时时间(毫秒)
database: 3 #默认数据库
jedis:

View File

@@ -68,13 +68,13 @@ public class OrderUtils {
payType = payType.toLowerCase();
switch (payType){
case PayConstants.PAY_TYPE_WE_CHAT:
result = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_PAY_WEIXIN_OPEN).equals("1");
result = "1".equals(systemConfigService.getValueByKey(SysConfigConstants.CONFIG_PAY_WEIXIN_OPEN));
break;
case PayConstants.PAY_TYPE_YUE:
result = (systemConfigService.getValueByKey(SysConfigConstants.CONFIG_YUE_PAY_STATUS).equals("1"));
result = ("1".equals(systemConfigService.getValueByKey(SysConfigConstants.CONFIG_YUE_PAY_STATUS)));
break;
case PayConstants.PAY_TYPE_ALI_PAY:
result = (systemConfigService.getValueByKey(SysConfigConstants.CONFIG_ALI_PAY_STATUS).equals("1"));
result = ("1".equals(systemConfigService.getValueByKey(SysConfigConstants.CONFIG_ALI_PAY_STATUS)));
break;
}
return result;

View File

@@ -285,7 +285,7 @@ public class CallbackServiceImpl implements CallbackService {
public String weChatRefund(String xmlInfo) {
MyRecord notifyRecord = new MyRecord();
MyRecord refundRecord = refundNotify(xmlInfo, notifyRecord);
if (refundRecord.getStr("status").equals("fail")) {
if ("fail".equals(refundRecord.getStr("status"))) {
logger.error("微信退款回调失败==>" + refundRecord.getColumns() + ", rawData==>" + xmlInfo + ", data==>" + notifyRecord);
return refundRecord.getStr("returnXml");
}

View File

@@ -133,7 +133,7 @@ public class ExpressServiceImpl extends ServiceImpl<ExpressDao, Express> impleme
public List<Express> findAll(String type) {
LambdaQueryWrapper<Express> lqw = new LambdaQueryWrapper<>();
lqw.eq(Express::getIsShow, true);
if (type.equals("elec")) {
if ("elec".equals(type)) {
lqw.eq(Express::getStatus, true);
}
lqw.orderByDesc(Express::getSort);

View File

@@ -76,7 +76,7 @@ public class LogisticsServiceImpl implements LogisticService {
return JSONObject.toJavaObject(result, LogisticsResultVo.class);
}
String logisticsType = systemConfigService.getValueByKeyException("logistics_type");
if (logisticsType.equals("1")) {// 平台查询
if ("1".equals(logisticsType)) {// 平台查询
OnePassLogisticsQueryVo queryVo = onePassService.exprQuery(expressNo, com);
if (ObjectUtil.isNull(queryVo)) {
return resultVo;
@@ -86,11 +86,11 @@ public class LogisticsServiceImpl implements LogisticService {
String jsonString = JSONObject.toJSONString(resultVo);
saveCache(JSONObject.parseObject(jsonString));
}
if (logisticsType.equals("2")) {// 阿里云查询
if ("2".equals(logisticsType)) {// 阿里云查询
String appCode = systemConfigService.getValueByKey(Constants.CONFIG_KEY_LOGISTICS_APP_CODE);
// 顺丰请输入单号 : 收件人或寄件人手机号后四位。例如123456789:1234
if (StrUtil.isNotBlank(com) && com.equals("shunfengkuaiyun")) {
if (StrUtil.isNotBlank(com) && "shunfengkuaiyun".equals(com)) {
expressNo = expressNo.concat(":").concat(StrUtil.sub(phone, 7, -1));
}
String url = Constants.LOGISTICS_API_URL + "?no=" + expressNo;
@@ -162,7 +162,7 @@ public class LogisticsServiceImpl implements LogisticService {
* @since 2020-07-06
*/
private void checkResult(JSONObject data) {
if (!data.getString("status").equals("0")){
if (!"0".equals(data.getString("status"))){
throw new CrmebException(data.getString("msg"));
}
}

View File

@@ -390,7 +390,7 @@ public class OnePassServiceImpl implements OnePassService {
params.add("num", expressNo);
JSONObject post = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_EXPRESS_QUEARY_URI, params, header);
String dataStr = post.getString("data");
if (StrUtil.isBlank(dataStr) || dataStr.equals("[]")) {
if (StrUtil.isBlank(dataStr) || "[]".equals(dataStr)) {
return null;
}
JSONObject jsonObject = post.getJSONObject("data");

View File

@@ -233,9 +233,9 @@ public class OrderPayServiceImpl implements OrderPayService {
// 分销员逻辑
if (!user.getIsPromoter()) {
String funcStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_BROKERAGE_FUNC_STATUS);
if (funcStatus.equals("1")) {
if ("1".equals(funcStatus)) {
String broQuota = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_BROKERAGE_QUOTA);
if (!broQuota.equals("-1") && storeOrder.getPayPrice().compareTo(new BigDecimal(broQuota)) >= 0) {// -1 不成为分销员
if (!"-1".equals(broQuota) && storeOrder.getPayPrice().compareTo(new BigDecimal(broQuota)) >= 0) {// -1 不成为分销员
user.setIsPromoter(true);
user.setPromoterTime(cn.hutool.core.date.DateUtil.date());
}
@@ -413,7 +413,7 @@ public class OrderPayServiceImpl implements OrderPayService {
private List<UserBrokerageRecord> assignCommission(StoreOrder storeOrder) {
// 检测商城是否开启分销功能
String isOpen = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_IS_OPEN);
if(StrUtil.isBlank(isOpen) || isOpen.equals("0")){
if(StrUtil.isBlank(isOpen) || "0".equals(isOpen)){
return CollUtil.newArrayList();
}
// 营销产品不参与
@@ -535,7 +535,7 @@ public class OrderPayServiceImpl implements OrderPayService {
}
// 判断分销模式
String model = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_MODEL);
if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadUser.getIsPromoter()) {
if (StrUtil.isNotBlank(model) && "1".equals(model) && !spreadUser.getIsPromoter()) {
// 指定分销模式下:不是推广员不参与分销
return recordList;
}
@@ -549,7 +549,7 @@ public class OrderPayServiceImpl implements OrderPayService {
if (ObjectUtil.isNull(spreadSpreadUser)) {
return recordList;
}
if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadSpreadUser.getIsPromoter()) {
if (StrUtil.isNotBlank(model) && "1".equals(model) && !spreadSpreadUser.getIsPromoter()) {
// 指定分销模式下:不是推广员不参与分销
return recordList;
}
@@ -926,10 +926,10 @@ public class OrderPayServiceImpl implements OrderPayService {
integralRecord.setTitle(IntegralRecordConstants.BROKERAGE_RECORD_TITLE_ORDER);
integralRecord.setIntegral(integral);
integralRecord.setBalance(balance);
if (type.equals("order")){
if ("order".equals(type)){
integralRecord.setMark(StrUtil.format("用户付款成功,订单增加{}积分", integral));
}
if (type.equals("product")) {
if ("product".equals(type)) {
integralRecord.setMark(StrUtil.format("用户付款成功,商品增加{}积分", integral));
}
integralRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE);
@@ -1002,7 +1002,7 @@ public class OrderPayServiceImpl implements OrderPayService {
for (int i = 0; i < couponsForGiveUser.size();) {
StoreProductCoupon storeProductCoupon = couponsForGiveUser.get(i);
MyRecord record = storeCouponUserService.paySuccessGiveAway(storeProductCoupon.getIssueCouponId(), storeOrder.getUid());
if (record.getStr("status").equals("fail")) {
if ("fail".equals(record.getStr("status"))) {
logger.error(StrUtil.format("支付成功领取优惠券失败,失败原因:{}", record.getStr("errMsg")));
couponsForGiveUser.remove(i);
continue;

View File

@@ -46,6 +46,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -118,9 +119,13 @@ public class OrderServiceImpl implements OrderService {
@Autowired
private StoreSeckillService storeSeckillService;
@Autowired
private StoreCombinationService storeCombinationService;
@Autowired
public void setStoreCombinationService(ApplicationContext applicationContext) {
this.storeCombinationService = applicationContext.getBean(StoreCombinationService.class);
}
@Autowired
private StoreBargainService storeBargainService;
@@ -314,7 +319,7 @@ public class OrderServiceImpl implements OrderService {
Boolean execute = transactionTemplate.execute(e -> {
storeOrderService.updateById(existStoreOrder);
storeOrderStatusService.createLog(existStoreOrder.getId(), Constants.ORDER_LOG_REFUND_APPLY, "用户申请退款原因:" + request.getExplain());
storeOrderStatusService.createLog(existStoreOrder.getId(), Constants.ORDER_LOG_REFUND_APPLY, "用户申请退款原因:" + request.getText());
return Boolean.TRUE;
});
@@ -942,7 +947,7 @@ public class OrderServiceImpl implements OrderService {
}
// 自提开关是否打开
String storeSelfMention = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_SELF_MENTION);
if (storeSelfMention.equals("false")) {
if ("false".equals(storeSelfMention)) {
throw new CrmebException("请先联系管理员开启门店自提");
}
SystemStore systemStore = systemStoreService.getById(request.getStoreId());
@@ -1332,12 +1337,12 @@ public class OrderServiceImpl implements OrderService {
private OrderInfoVo validatePreOrderRequest(PreOrderRequest request, User user) {
OrderInfoVo orderInfoVo = new OrderInfoVo();
List<OrderInfoDetailVo> detailVoList = CollUtil.newArrayList();
if (request.getPreOrderType().equals("shoppingCart")) {// 购物车购买
if ("shoppingCart".equals(request.getPreOrderType())) {// 购物车购买
detailVoList = validatePreOrderShopping(request, user);
List<Long> cartIdList = request.getOrderDetails().stream().map(PreOrderDetailRequest::getShoppingCartId).distinct().collect(Collectors.toList());
orderInfoVo.setCartIdList(cartIdList);
}
if (request.getPreOrderType().equals("buyNow")) {// 立即购买
if ("buyNow".equals(request.getPreOrderType())) {// 立即购买
// 立即购买只会有一条详情
PreOrderDetailRequest detailRequest = request.getOrderDetails().get(0);
if (detailRequest.getSeckillId() > 0) {// 秒杀
@@ -1409,7 +1414,7 @@ public class OrderServiceImpl implements OrderService {
detailVoList.add(detailVo);
}
}
if (request.getPreOrderType().equals("again")) {// 再次购买
if ("again".equals(request.getPreOrderType())) {// 再次购买
PreOrderDetailRequest detailRequest = request.getOrderDetails().get(0);
detailVoList = validatePreOrderAgain(detailRequest, user);
}
@@ -1891,7 +1896,7 @@ public class OrderServiceImpl implements OrderService {
// 全场满额包邮金额
String storeFreePostageString = systemConfigService.getValueByKey(SysConfigConstants.STORE_FEE_POSTAGE);
BigDecimal storePostage = BigDecimal.ZERO;
if (postageSwitchString.equals("true") && (storeFreePostageString.equals("0") || orderInfoVo.getProTotalFee().compareTo(new BigDecimal(storeFreePostageString)) >= 0)) {
if ("true".equals(postageSwitchString) && ("0".equals(storeFreePostageString) || orderInfoVo.getProTotalFee().compareTo(new BigDecimal(storeFreePostageString)) >= 0)) {
storePostage = BigDecimal.ZERO;
} else if (ObjectUtil.isNull(userAddress) || userAddress.getCityId() <= 0) {
// 用户地址不存在默认运费为0元

View File

@@ -282,7 +282,7 @@ public class OrderTaskServiceImpl implements OrderTaskService {
// 根据订单状态表判断订单是否可以自动完成
for (StoreOrder order : orderList) {
StoreOrderStatus orderStatus = storeOrderStatusService.getLastByOrderId(order.getId());
if (!orderStatus.getChangeType().equals("user_take_delivery")) {
if (!"user_take_delivery".equals(orderStatus.getChangeType())) {
logger.error("订单自动完成订单记录最后一条不是收货状态orderId = " + order.getId());
continue ;
}

View File

@@ -59,7 +59,7 @@ public class ShippingTemplatesFreeServiceImpl extends ServiceImpl<ShippingTempla
for (ShippingTemplatesFreeRequest shippingTemplatesFreeRequest : shippingTemplatesFreeRequestList) {
String uniqueKey = DigestUtils.md5Hex(shippingTemplatesFreeRequest.toString());
if(shippingTemplatesFreeRequest.getCityId().equals("all") || shippingTemplatesFreeRequest.getCityId().equals("0")){
if("all".equals(shippingTemplatesFreeRequest.getCityId()) || "0".equals(shippingTemplatesFreeRequest.getCityId())){
cityIdList = getCityIdList();
}else{
cityIdList = CrmebUtil.stringToArray(shippingTemplatesFreeRequest.getCityId());

View File

@@ -69,7 +69,7 @@ public class ShippingTemplatesRegionServiceImpl extends ServiceImpl<ShippingTemp
for (ShippingTemplatesRegionRequest shippingTemplatesRegionRequest : shippingTemplatesRegionRequestList) {
String uniqueKey = DigestUtils.md5Hex(shippingTemplatesRegionRequest.toString());
if(shippingTemplatesRegionRequest.getCityId().equals("all") || shippingTemplatesRegionRequest.getCityId().equals("0")){
if("all".equals(shippingTemplatesRegionRequest.getCityId()) || "0".equals(shippingTemplatesRegionRequest.getCityId())){
cityIdList = getCityIdList();
}else{
cityIdList = CrmebUtil.stringToArray(shippingTemplatesRegionRequest.getCityId());

View File

@@ -744,12 +744,12 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
@Override
public Boolean operationStock(Integer id, Integer num, String type) {
UpdateWrapper<StoreBargain> updateWrapper = new UpdateWrapper<>();
if (type.equals("add")) {
if ("add".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock + {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales - {}", num));
updateWrapper.setSql(StrUtil.format("quota = quota + {}", num));
}
if (type.equals("sub")) {
if ("sub".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock - {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales + {}", num));
updateWrapper.setSql(StrUtil.format("quota = quota - {}", num));
@@ -887,7 +887,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
}
// 回滚商品库存/销量 并更新
boolean isPlus = storeProductStockRequest.getOperationType().equals("add");
boolean isPlus = "add".equals(storeProductStockRequest.getOperationType());
int productStock = isPlus ? existProduct.getStock() + storeProductStockRequest.getNum() : existProduct.getStock() - storeProductStockRequest.getNum();
existProduct.setStock(productStock);
existProduct.setSales(existProduct.getSales() - storeProductStockRequest.getNum());

View File

@@ -154,7 +154,7 @@ public class StoreCartServiceImpl extends ServiceImpl<StoreCartDao, StoreCart> i
Integer userId = userService.getUserIdException();
Map<String, Integer> map = new HashMap<>();
int num;
if (request.getType().equals("total")) {
if ("total".equals(request.getType())) {
num = getUserCountByStatus(userId, request.getNumType());
} else {
num = getUserSumByStatus(userId, request.getNumType());

View File

@@ -35,6 +35,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@@ -90,9 +91,13 @@ public class StoreCombinationServiceImpl extends ServiceImpl<StoreCombinationDao
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private OrderService orderService;
@Autowired
public void setOrderService(ApplicationContext applicationContext) {
this.orderService = applicationContext.getBean(OrderService.class);
}
@Autowired
private RedisUtil redisUtil;
@@ -961,12 +966,12 @@ public class StoreCombinationServiceImpl extends ServiceImpl<StoreCombinationDao
@Override
public Boolean operationStock(Integer id, Integer num, String type) {
UpdateWrapper<StoreCombination> updateWrapper = new UpdateWrapper<>();
if (type.equals("add")) {
if ("add".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock + {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales - {}", num));
updateWrapper.setSql(StrUtil.format("quota = quota + {}", num));
}
if (type.equals("sub")) {
if ("sub".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock - {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales + {}", num));
updateWrapper.setSql(StrUtil.format("quota = quota - {}", num));
@@ -1069,7 +1074,7 @@ public class StoreCombinationServiceImpl extends ServiceImpl<StoreCombinationDao
}
// 回滚商品库存/销量 并更新
boolean isPlus = storeProductStockRequest.getOperationType().equals("add");
boolean isPlus = "add".equals(storeProductStockRequest.getOperationType());
int productStock = isPlus ? existCombination.getStock() + storeProductStockRequest.getNum() : existCombination.getStock() - storeProductStockRequest.getNum();
existCombination.setStock(productStock);
existCombination.setSales(existCombination.getSales() - storeProductStockRequest.getNum());

View File

@@ -165,7 +165,7 @@ public class StoreCouponServiceImpl extends ServiceImpl<StoreCouponDao, StoreCou
}
//看是否过期
if (!(storeCoupon.getReceiveEndTime() == null || storeCoupon.getReceiveEndTime().equals(""))) {
if (!(storeCoupon.getReceiveEndTime() == null || "".equals(storeCoupon.getReceiveEndTime()))) {
//非永久可领取
String date = DateUtil.nowDateTimeStr();
int result = DateUtil.compareDate(date, DateUtil.dateToStr(storeCoupon.getReceiveEndTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT);

View File

@@ -299,11 +299,11 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
LambdaQueryWrapper<StoreCouponUser> lqw = new LambdaQueryWrapper<>();
lqw.eq(StoreCouponUser::getUid, userId);
if (type.equals("usable")) {
if ("usable".equals(type)) {
lqw.eq(StoreCouponUser::getStatus, CouponConstants.STORE_COUPON_USER_STATUS_USABLE);
lqw.orderByDesc(StoreCouponUser::getId);
}
if (type.equals("unusable")) {
if ("unusable".equals(type)) {
lqw.gt(StoreCouponUser::getStatus, CouponConstants.STORE_COUPON_USER_STATUS_USABLE);
lqw.last(StrUtil.format(" order by case `status` when {} then {} when {} then {} when {} then {} end", 0, 1, 1, 2, 2, 3));
}

View File

@@ -126,14 +126,14 @@ public class StoreProductAttrValueServiceImpl extends ServiceImpl<StoreProductAt
@Override
public Boolean operationStock(Integer id, Integer num, String operationType, Integer type) {
UpdateWrapper<StoreProductAttrValue> updateWrapper = new UpdateWrapper<>();
if (operationType.equals("add")) {
if ("add".equals(operationType)) {
updateWrapper.setSql(StrUtil.format("stock = stock + {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales - {}", num));
if (type > 0) {
updateWrapper.setSql(StrUtil.format("quota = quota + {}", num));
}
}
if (operationType.equals("sub")) {
if ("sub".equals(operationType)) {
updateWrapper.setSql(StrUtil.format("stock = stock - {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales + {}", num));
if (type > 0) {

View File

@@ -688,7 +688,7 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
*/
private List<String> getProductActivityList(String activityStr) {
List<String> activityList = CollUtil.newArrayList();
if (activityStr.equals("0, 1, 2, 3")) {
if ("0, 1, 2, 3".equals(activityStr)) {
activityList.add(Constants.PRODUCT_TYPE_NORMAL_STR);
activityList.add(Constants.PRODUCT_TYPE_SECKILL_STR);
activityList.add(Constants.PRODUCT_TYPE_BARGAIN_STR);
@@ -975,7 +975,7 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
}
// 回滚商品库存/销量 并更新
boolean isPlus = storeProductStockRequest.getOperationType().equals("add");
boolean isPlus = "add".equals(storeProductStockRequest.getOperationType());
int productStock = isPlus ? existProduct.getStock() + storeProductStockRequest.getNum() : existProduct.getStock() - storeProductStockRequest.getNum();
existProduct.setStock(productStock);
existProduct.setSales(existProduct.getSales() - storeProductStockRequest.getNum());
@@ -1003,7 +1003,7 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
throw new CrmebException("请先进行采集商品配置");
}
int copyNum = 0;
if (copyType.equals("1")) {// 一号通
if ("1".equals(copyType)) {// 一号通
JSONObject info = onePassService.info();
copyNum = Optional.ofNullable(info.getJSONObject("copy").getInteger("num")).orElse(0);
}
@@ -1035,11 +1035,11 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
@Override
public Boolean operationStock(Integer id, Integer num, String type) {
UpdateWrapper<StoreProduct> updateWrapper = new UpdateWrapper<>();
if (type.equals("add")) {
if ("add".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock + {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales - {}", num));
}
if (type.equals("sub")) {
if ("sub".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock - {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales + {}", num));
// 扣减时加乐观锁保证库存不为负

View File

@@ -829,12 +829,12 @@ public class StoreSeckillServiceImpl extends ServiceImpl<StoreSeckillDao, StoreS
@Override
public Boolean operationStock(Integer id, Integer num, String type) {
UpdateWrapper<StoreSeckill> updateWrapper = new UpdateWrapper<>();
if (type.equals("add")) {
if ("add".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock + {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales - {}", num));
updateWrapper.setSql(StrUtil.format("quota = quota + {}", num));
}
if (type.equals("sub")) {
if ("sub".equals(type)) {
updateWrapper.setSql(StrUtil.format("stock = stock - {}", num));
updateWrapper.setSql(StrUtil.format("sales = sales + {}", num));
updateWrapper.setSql(StrUtil.format("quota = quota - {}", num));
@@ -916,7 +916,7 @@ public class StoreSeckillServiceImpl extends ServiceImpl<StoreSeckillDao, StoreS
}
// 回滚商品库存/销量 并更新
boolean isPlus = storeProductStockRequest.getOperationType().equals("add");
boolean isPlus = "add".equals(storeProductStockRequest.getOperationType());
int productStock = isPlus ? existProduct.getStock() + storeProductStockRequest.getNum() : existProduct.getStock() - storeProductStockRequest.getNum();
existProduct.setStock(productStock);
existProduct.setSales(existProduct.getSales() - storeProductStockRequest.getNum());

View File

@@ -129,7 +129,7 @@ public class SystemCityServiceImpl extends ServiceImpl<SystemCityDao, SystemCity
public List<Integer> getCityIdList() {
Object data = redisUtil.get(Constants.CITY_LIST_LEVEL_1);
List<Integer> collect;
if (data == null || data.equals("")) {
if (data == null || "".equals(data)) {
LambdaQueryWrapper<SystemCity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(SystemCity::getCityId);
lambdaQueryWrapper.eq(SystemCity::getLevel, 1);

View File

@@ -88,7 +88,7 @@ public class SystemFormTempServiceImpl extends ServiceImpl<SystemFormTempDao, Sy
systemConfigFormItemVo = JSONObject.parseObject(item, SystemConfigFormItemVo.class);
String model = systemConfigFormItemVo.get__vModel__(); //字段 name
if(systemConfigFormItemVo.get__config__().getRequired() && map.get(model).equals("")) {
if(systemConfigFormItemVo.get__config__().getRequired() && "".equals(map.get(model))) {
throw new CrmebException(systemConfigFormItemVo.get__config__().getLabel() + "不能为空!");
}
//正则验证

View File

@@ -100,10 +100,10 @@ public class SystemMenuServiceImpl extends ServiceImpl<SystemMenuDao, SystemMenu
*/
@Override
public Boolean add(SystemMenuRequest request) {
if (request.getMenuType().equals("C") && StrUtil.isEmpty(request.getComponent())) {
if ("C".equals(request.getMenuType()) && StrUtil.isEmpty(request.getComponent())) {
throw new CrmebException("菜单类型的组件路径不能为空");
}
if (request.getMenuType().equals("A") && StrUtil.isEmpty(request.getPerms())) {
if ("A".equals(request.getMenuType()) && StrUtil.isEmpty(request.getPerms())) {
throw new CrmebException("按钮类型的权限表示不能为空");
}
SystemMenu systemMenu = new SystemMenu();
@@ -125,7 +125,7 @@ public class SystemMenuServiceImpl extends ServiceImpl<SystemMenuDao, SystemMenu
public Boolean deleteById(Integer id) {
SystemMenu systemMenu = getInfoById(id);
systemMenu.setIsDelte(true);
if (systemMenu.getMenuType().equals("A")) {
if ("A".equals(systemMenu.getMenuType())) {
boolean update = updateById(systemMenu);
if (update) {
redisUtil.delete(CACHE_LIST_KEY);
@@ -159,10 +159,10 @@ public class SystemMenuServiceImpl extends ServiceImpl<SystemMenuDao, SystemMenu
if (ObjectUtil.isNull(request.getId())) {
throw new CrmebException("系统菜单id不能为空");
}
if (request.getMenuType().equals("C") && StrUtil.isEmpty(request.getComponent())) {
if ("C".equals(request.getMenuType()) && StrUtil.isEmpty(request.getComponent())) {
throw new CrmebException("菜单类型的组件路径不能为空");
}
if (request.getMenuType().equals("A") && StrUtil.isEmpty(request.getPerms())) {
if ("A".equals(request.getMenuType()) && StrUtil.isEmpty(request.getPerms())) {
throw new CrmebException("按钮类型的权限表示不能为空");
}
SystemMenu systemMenu = new SystemMenu();

View File

@@ -131,7 +131,7 @@ public class SystemNotificationServiceImpl extends ServiceImpl<SystemNotificatio
public NotificationInfoResponse getDetail(NotificationInfoRequest request) {
SystemNotification notification = getByIdException(request.getId());
NotificationInfoResponse response = new NotificationInfoResponse();
if (request.getDetailType().equals("wechat")) {
if ("wechat".equals(request.getDetailType())) {
if (notification.getIsWechat().equals(0)) {
throw new CrmebException("请先配置公众号模板消息");
}
@@ -139,7 +139,7 @@ public class SystemNotificationServiceImpl extends ServiceImpl<SystemNotificatio
BeanUtils.copyProperties(templateMessage, response);
response.setStatus(notification.getIsWechat());
}
if (request.getDetailType().equals("routine")) {
if ("routine".equals(request.getDetailType())) {
if (notification.getIsRoutine().equals(0)) {
throw new CrmebException("请先配置小程序订阅消息");
}
@@ -147,7 +147,7 @@ public class SystemNotificationServiceImpl extends ServiceImpl<SystemNotificatio
BeanUtils.copyProperties(templateMessage, response);
response.setStatus(notification.getIsRoutine());
}
if (request.getDetailType().equals("sms")) {
if ("sms".equals(request.getDetailType())) {
if (notification.getIsSms().equals(0)) {
throw new CrmebException("请先配置短信模板");
}
@@ -193,11 +193,11 @@ public class SystemNotificationServiceImpl extends ServiceImpl<SystemNotificatio
*/
@Override
public Boolean modify(NotificationUpdateRequest request) {
if (!request.getDetailType().equals("sms") && StrUtil.isEmpty(request.getTempId())) {
if (!"sms".equals(request.getDetailType()) && StrUtil.isEmpty(request.getTempId())) {
throw new CrmebException("模板id不能为空");
}
SystemNotification notification = getByIdException(request.getId());
if (request.getDetailType().equals("wechat")) {
if ("wechat".equals(request.getDetailType())) {
if (notification.getIsWechat().equals(0)) {
throw new CrmebException("请先为通知配置公众号模板");
}
@@ -217,7 +217,7 @@ public class SystemNotificationServiceImpl extends ServiceImpl<SystemNotificatio
return Boolean.TRUE;
});
}
if (request.getDetailType().equals("routine")) {
if ("routine".equals(request.getDetailType())) {
if (notification.getIsRoutine().equals(0)) {
throw new CrmebException("请先为通知配置小程序订阅模板");
}
@@ -237,7 +237,7 @@ public class SystemNotificationServiceImpl extends ServiceImpl<SystemNotificatio
return Boolean.TRUE;
});
}
if (request.getDetailType().equals("sms") && !notification.getIsSms().equals(request.getStatus())) {
if ("sms".equals(request.getDetailType()) && !notification.getIsSms().equals(request.getStatus())) {
notification.setIsSms(request.getStatus());
return updateById(notification);
}

View File

@@ -193,16 +193,16 @@ public class UploadServiceImpl implements UploadService {
try{
// 构造一个带指定Zone对象的配置类, 默认华东
Configuration cfg = new Configuration(Region.huadong());
if(cloudVo.getRegion().equals("huabei")){
if("huabei".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.huabei());
}
if(cloudVo.getRegion().equals("huanan")){
if("huanan".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.huanan());
}
if(cloudVo.getRegion().equals("beimei")){
if("beimei".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.beimei());
}
if(cloudVo.getRegion().equals("dongnanya")){
if("dongnanya".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.xinjiapo());
}
@@ -266,7 +266,7 @@ public class UploadServiceImpl implements UploadService {
break;
}
systemAttachmentService.save(systemAttachment);
if (!fileIsSave.equals("1")) {
if (!"1".equals(fileIsSave)) {
// 删除本地文件
file.delete();
}
@@ -380,7 +380,7 @@ public class UploadServiceImpl implements UploadService {
}
// 判断是否保存本地
String fileIsSave = systemConfigService.getValueByKeyException("file_is_save");
if (fileIsSave.equals("1")) {
if ("1".equals(fileIsSave)) {
multipartFile.transferTo(file);
}
@@ -401,16 +401,16 @@ public class UploadServiceImpl implements UploadService {
try{
// 构造一个带指定Zone对象的配置类, 默认华东
Configuration cfg = new Configuration(Region.huadong());
if(cloudVo.getRegion().equals("huabei")){
if("huabei".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.huabei());
}
if(cloudVo.getRegion().equals("huanan")){
if("huanan".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.huanan());
}
if(cloudVo.getRegion().equals("beimei")){
if("beimei".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.beimei());
}
if(cloudVo.getRegion().equals("dongnanya")){
if("dongnanya".equals(cloudVo.getRegion())){
cfg = new Configuration(Region.xinjiapo());
}

View File

@@ -70,7 +70,7 @@ public class UserBillServiceImpl extends ServiceImpl<UserBillDao, UserBill> impl
if (request.getSort() == null) {
queryWrapper.orderByDesc("create_time");
}else{
if (request.getSort().equals("asc")) {
if ("asc".equals(request.getSort())) {
queryWrapper.orderByAsc("number");
}else{
queryWrapper.orderByDesc("number");
@@ -123,7 +123,7 @@ public class UserBillServiceImpl extends ServiceImpl<UserBillDao, UserBill> impl
//关联id
if (StringUtils.isNotBlank(request.getLinkId())) {
if (request.getLinkId().equals("gt")) {
if ("gt".equals(request.getLinkId())) {
queryWrapper.ne("link_id", 0);
}else{
queryWrapper.eq("link_id", request.getLinkId());

View File

@@ -108,7 +108,7 @@ public class WeChatPayServiceImpl implements WeChatPayService {
}
// 切割字符串,判断是支付订单还是充值订单
String pre = StrUtil.subPre(orderNo, 5);
if (pre.equals("order")) {// 支付订单
if ("order".equals(pre)) {// 支付订单
StoreOrder storeOrder = storeOrderService.getByOderId(orderNo);
if (ObjectUtil.isNull(storeOrder)) {
throw new CrmebException("订单不存在");
@@ -253,12 +253,12 @@ public class WeChatPayServiceImpl implements WeChatPayService {
String appId = "";
String mchId = "";
String signKey = "";
if (userRecharge.getRechargeType().equals("public")) {// 公众号
if ("public".equals(userRecharge.getRechargeType())) {// 公众号
appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID);
mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID);
signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY);
}
if (userRecharge.getRechargeType().equals("routine")) {// 小程序
if ("routine".equals(userRecharge.getRechargeType())) {// 小程序
appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID);
mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID);
signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY);
@@ -423,11 +423,11 @@ public class WeChatPayServiceImpl implements WeChatPayService {
throw new CrmebException("微信下单失败!");
}
CreateOrderResponseVo responseVo = CrmebUtil.mapToObj(map, CreateOrderResponseVo.class);
if (responseVo.getReturnCode().toUpperCase().equals("FAIL")) {
if ("FAIL".equals(responseVo.getReturnCode().toUpperCase())) {
throw new CrmebException("微信下单失败1" + responseVo.getReturnMsg());
}
if (responseVo.getResultCode().toUpperCase().equals("FAIL")) {
if ("FAIL".equals(responseVo.getResultCode().toUpperCase())) {
throw new CrmebException("微信下单失败2" + responseVo.getErrCodeDes());
}

View File

@@ -145,7 +145,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(data, "微信获取开放平台access_token异常");
@@ -169,7 +169,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(data, "微信获取开放平台用户信息异常");
@@ -198,7 +198,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(data, "微信小程序登录凭证校验异常");
@@ -261,7 +261,7 @@ public class WechatNewServiceImpl implements WechatNewService {
JSONObject data = JSONObject.parseObject(response);
// 保存到微信异常表
wxExceptionDispose(data, "微信小程序生成小程序码异常");
if (data.getString("errcode").equals("40001")) {
if ("40001".equals(data.getString("errcode"))) {
redisUtil.delete(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY);
miniAccessToken = getMiniAccessToken();
url = StrUtil.format(WeChatConstants.WECHAT_MINI_QRCODE_UNLIMITED_URL, miniAccessToken);
@@ -310,7 +310,7 @@ public class WechatNewServiceImpl implements WechatNewService {
WechatPayInfo wechatPayInfo = createWechatPayInfo(unifiedorderVo);
CreateOrderResponseVo responseVo = CrmebUtil.mapToObj(map, CreateOrderResponseVo.class);
if (responseVo.getReturnCode().toUpperCase().equals("FAIL")) {
if ("FAIL".equals(responseVo.getReturnCode().toUpperCase())) {
// 保存到微信异常表
wxPayExceptionDispose(map, "微信支付预下单异常");
wechatPayInfo.setErrCode(map.get("return_code").toString());
@@ -318,7 +318,7 @@ public class WechatNewServiceImpl implements WechatNewService {
throw new CrmebException("微信下单失败1" + responseVo.getReturnMsg());
}
if (responseVo.getResultCode().toUpperCase().equals("FAIL")) {
if ("FAIL".equals(responseVo.getResultCode().toUpperCase())) {
wxPayExceptionDispose(map, "微信支付预下单业务异常");
wechatPayInfo.setErrCode(map.get("err_code").toString());
wechatPayInfoService.save(wechatPayInfo);
@@ -381,16 +381,16 @@ public class WechatNewServiceImpl implements WechatNewService {
throw new CrmebException("微信订单查询失败!");
}
record.setColums(map);
if (record.getStr("return_code").toUpperCase().equals("FAIL")) {
if ("FAIL".equals(record.getStr("return_code").toUpperCase())) {
wxPayQueryExceptionDispose(record, "微信支付查询订单通信异常");
throw new CrmebException("微信订单查询失败1" + record.getStr("return_msg"));
}
if (record.getStr("result_code").toUpperCase().equals("FAIL")) {
if ("FAIL".equals(record.getStr("result_code").toUpperCase())) {
wxPayQueryExceptionDispose(record, "微信支付查询订单结果异常");
throw new CrmebException("微信订单查询失败2" + record.getStr("err_code") + record.getStr("err_code_des"));
}
if (!record.getStr("trade_state").toUpperCase().equals("SUCCESS")) {
if (!"SUCCESS".equals(record.getStr("trade_state").toUpperCase())) {
wxPayQueryExceptionDispose(record, "微信支付查询订单状态异常");
throw new CrmebException("微信订单支付失败3" + record.getStr("trade_state"));
}
@@ -417,7 +417,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
wxExceptionDispose(data, "微信公众号发送模板消息异常");
throw new CrmebException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg"));
@@ -441,15 +441,15 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.getString("errcode").equals("40001")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if ("40001".equals(data.getString("errcode"))) {
wxExceptionDispose(data, "微信小程序发送订阅消息异常");
redisUtil.delete(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY);
accessToken = getMiniAccessToken();
url = StrUtil.format(WeChatConstants.WECHAT_MINI_SEND_SUBSCRIBE_URL, accessToken);
result = restTemplateUtil.postJsonData(url, messAge);
JSONObject data2 = JSONObject.parseObject(result);
if (data2.containsKey("errcode") && !data2.getString("errcode").equals("0")) {
if (data2.containsKey("errcode") && !"0".equals(data2.getString("errcode"))) {
if (data2.containsKey("errmsg")) {
wxExceptionDispose(data2, "微信小程序发送订阅消息重试异常");
throw new CrmebException("微信接口调用失败:" + data2.getString("errcode") + data2.getString("errmsg"));
@@ -479,7 +479,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(result)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (result.containsKey("errcode") && result.getString("errcode").equals("0")) {
if (result.containsKey("errcode") && "0".equals(result.getString("errcode"))) {
return result;
}
if (result.containsKey("errmsg")) {
@@ -504,7 +504,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(jsonObject)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (jsonObject.containsKey("errcode") && jsonObject.getString("errcode").equals("0")) {
if (jsonObject.containsKey("errcode") && "0".equals(jsonObject.getString("errcode"))) {
return Boolean.TRUE;
}
if (jsonObject.containsKey("errmsg")) {
@@ -526,7 +526,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(result)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (result.containsKey("errcode") && result.getString("errcode").equals("0")) {
if (result.containsKey("errcode") && "0".equals(result.getString("errcode"))) {
return Boolean.TRUE;
}
if (result.containsKey("errmsg")) {
@@ -571,12 +571,12 @@ public class WechatNewServiceImpl implements WechatNewService {
}
WxRefundResponseVo responseVo = CrmebUtil.mapToObj(map, WxRefundResponseVo.class);
if (responseVo.getReturnCode().toUpperCase().equals("FAIL")) {
if ("FAIL".equals(responseVo.getReturnCode().toUpperCase())) {
wxPayExceptionDispose(map, "微信申请退款异常1");
throw new CrmebException("微信申请退款失败1" + responseVo.getReturnMsg());
}
if (responseVo.getResultCode().toUpperCase().equals("FAIL")) {
if ("FAIL".equals(responseVo.getResultCode().toUpperCase())) {
wxPayExceptionDispose(map, "微信申请退款业务异常");
throw new CrmebException("微信申请退款失败2" + responseVo.getErrCodeDes());
}
@@ -596,7 +596,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(jsonObject)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (jsonObject.containsKey("errcode") && !jsonObject.getString("errcode").equals("0")) {
if (jsonObject.containsKey("errcode") && !"0".equals(jsonObject.getString("errcode"))) {
if (jsonObject.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(jsonObject, StrUtil.format("获取我的公众号模板消息列表异常"));
@@ -625,7 +625,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
wxExceptionDispose(data, "删除微信公众号模板消息异常");
throw new CrmebException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg"));
@@ -651,7 +651,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
wxExceptionDispose(data, "添加公众号模板消息异常");
throw new CrmebException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg"));
@@ -672,7 +672,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(jsonObject)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (jsonObject.containsKey("errcode") && !jsonObject.getString("errcode").equals("0")) {
if (jsonObject.containsKey("errcode") && !"0".equals(jsonObject.getString("errcode"))) {
if (jsonObject.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(jsonObject, StrUtil.format("获取小程序当前帐号下的个人模板列表异常"));
@@ -700,7 +700,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
wxExceptionDispose(data, "删除微信小程序订阅消息异常");
throw new CrmebException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg"));
@@ -722,7 +722,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(jsonObject)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (jsonObject.containsKey("errcode") && !jsonObject.getString("errcode").equals("0")) {
if (jsonObject.containsKey("errcode") && !"0".equals(jsonObject.getString("errcode"))) {
if (jsonObject.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(jsonObject, "获取小程序平台上的标准模板异常");
@@ -754,7 +754,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
wxExceptionDispose(data, "添加小程序订阅消息异常");
throw new CrmebException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg"));
@@ -794,7 +794,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(data, "微信获取JS-SDK的ticket异常");
@@ -819,7 +819,7 @@ public class WechatNewServiceImpl implements WechatNewService {
if (ObjectUtil.isNull(data)) {
throw new CrmebException("微信平台接口异常,没任何数据返回!");
}
if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
if (data.containsKey("errcode") && !"0".equals(data.getString("errcode"))) {
if (data.containsKey("errmsg")) {
// 保存到微信异常表
wxExceptionDispose(data, StrUtil.format("微信获取accessToken异常{}端", type));
@@ -853,7 +853,7 @@ public class WechatNewServiceImpl implements WechatNewService {
private void wxPayExceptionDispose(HashMap<String, Object> map, String remark) {
WechatExceptions wechatExceptions = new WechatExceptions();
String returnCode = (String) map.get("return_code");
if (returnCode.toUpperCase().equals("FAIL")) {
if ("FAIL".equals(returnCode.toUpperCase())) {
wechatExceptions.setErrcode("-100");
wechatExceptions.setErrmsg(map.get("return_msg").toString());
} else {
@@ -874,13 +874,13 @@ public class WechatNewServiceImpl implements WechatNewService {
*/
private void wxPayQueryExceptionDispose(MyRecord record, String remark) {
WechatExceptions wechatExceptions = new WechatExceptions();
if (record.getStr("return_code").toUpperCase().equals("FAIL")) {
if ("FAIL".equals(record.getStr("return_code").toUpperCase())) {
wechatExceptions.setErrcode("-200");
wechatExceptions.setErrmsg(record.getStr("return_msg"));
} else if (record.getStr("result_code").toUpperCase().equals("FAIL")) {
} else if ("FAIL".equals(record.getStr("result_code").toUpperCase())) {
wechatExceptions.setErrcode(record.getStr("err_code"));
wechatExceptions.setErrmsg(record.getStr("err_code_des"));
} else if (!record.getStr("trade_state").toUpperCase().equals("SUCCESS")) {
} else if (!"SUCCESS".equals(record.getStr("trade_state").toUpperCase())) {
wechatExceptions.setErrcode("-201");
wechatExceptions.setErrmsg(record.getStr("trade_state"));
}

View File

@@ -36,7 +36,7 @@ public class WechatPublicServiceImpl implements WechatPublicService {
@Override
public Object getCustomizeMenus() {
Object list = redisUtil.get(WeChatConstants.REDIS_PUBLIC_MENU_KEY);
if (list == null || list.equals("")) {
if (list == null || "".equals(list)) {
//如果没有, 去读取
JSONObject tagsList = wechatNewService.getPublicCustomMenu();
redisUtil.set(WeChatConstants.REDIS_PUBLIC_MENU_KEY, tagsList);

View File

@@ -24,13 +24,13 @@ public class RequestMethod {
}
private static boolean CCIsNull(String client_id, String client_secret) {
if (ClientId != null && ClientSecret != null && !ClientId.equals("") && !ClientSecret.equals(""))
if (ClientId != null && ClientSecret != null && !"".equals(ClientId) && !"".equals(ClientSecret))
return true;
return false;
}
public String getCodeOpen(String redirect_uri) {
if (ClientId != null && !ClientId.equals(""))
if (ClientId != null && !"".equals(ClientId))
return UtilUrl.openType + "?response_type=code&client_id=" + ClientId + "&redirect_uri=" + redirect_uri + "&state=1";
return example;
}

View File

@@ -29,7 +29,7 @@ public class Utils {
}
public static boolean isNull(String content) {
if (content != null && !content.equals(""))
if (content != null && !"".equals(content))
return false;
return true;
}

View File

@@ -20,6 +20,6 @@
and u.brokerage_price >= #{min, jdbcType=DECIMAL}
</if>
GROUP BY u.uid
order by total_brokerage ${sort}
order by total_brokerage #{sort}
</select>
</mapper>

View File

@@ -3,7 +3,7 @@
<mapper namespace="com.zbkj.service.dao.SystemStoreDao">
<select id="getNearList" resultType="com.zbkj.common.vo.SystemStoreNearVo" parameterType="com.zbkj.common.request.StoreNearRequest">
SELECT *, (round(6367000 * 2 * asin(sqrt(pow(sin(((latitude * pi()) / 180 - (${latitude} * pi()) / 180) / 2), 2) + cos((${latitude} * pi()) / 180) * cos((latitude * pi()) / 180) * pow(sin(((longitude * pi()) / 180 - (${longitude} * pi()) / 180) / 2), 2))))) AS distance
SELECT *, (round(6367000 * 2 * asin(sqrt(pow(sin(((latitude * pi()) / 180 - (#{latitude} * pi()) / 180) / 2), 2) + cos((#{latitude} * pi()) / 180) * cos((latitude * pi()) / 180) * pow(sin(((longitude * pi()) / 180 - (#{longitude} * pi()) / 180) / 2), 2))))) AS distance
FROM eb_system_store WHERE is_show = 1 and is_del = 0
ORDER BY distance asc
</select>

View File

@@ -11,7 +11,7 @@
<if test="keywords != '' and keywords != null ">
and ( u.real_name like #{keywords, jdbcType=VARCHAR} or u.nickname like #{keywords, jdbcType=VARCHAR})
</if>
ORDER BY ${sortKey} ${sortValue}
ORDER BY #{sortKey} #{sortValue}
</select>
<select id="findAdminList" resultType="com.zbkj.common.model.user.User" parameterType="Map">
@@ -24,32 +24,32 @@
</if>
where 1 = 1
<if test="isPromoter != null and isPromoter !='' or isPromoter == 0 ">
and u.is_promoter = ${isPromoter}
and u.is_promoter = #{isPromoter}
</if>
<if test="groupId != null and groupId !='' ">
and u.group_id in (${groupId})
and u.group_id in (#{groupId})
</if>
<if test="tagIdSql != null and tagIdSql !='' ">
and ${tagIdSql}
</if>
<if test="level != null and level !='' ">
and u.level in (${level})
and u.level in (#{level})
</if>
<if test="sex != null and sex !='' or sex == 0">
and u.sex = ${sex}
and u.sex = #{sex}
</if>
<if test="country != null and country !='' ">
and u.country = #{country}
</if>
<if test="addres != null and addres !='' ">
and u.addres like '%${addres}'
and u.addres like concat('%',#{addres}, '%')
</if>
<if test="payCount != null and payCount !='' or payCount == 0 ">
<if test="payCount &lt;= 0">
and u.pay_count = 0
</if>
<if test="payCount > 0">
and u.pay_count >= ${payCount}
and u.pay_count >= #{payCount}
</if>
</if>
<if test="status != null and status !='' or status == 0 ">

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 MiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

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