Compare commits
120 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d311d50f8b | ||
|
|
b0678e772f | ||
|
|
451c9587c0 | ||
|
|
f4c9462bc8 | ||
|
|
cd42e4d119 | ||
|
|
ab6457d0f0 | ||
|
|
b7ad7da4a8 | ||
|
|
99dedfb36e | ||
|
|
80cd315b44 | ||
|
|
f898ada8f1 | ||
|
|
fe66f46321 | ||
|
|
c42831c122 | ||
|
|
3a2892af9b | ||
|
|
005e992d41 | ||
|
|
cb2d80306b | ||
|
|
35c819ad85 | ||
|
|
f3efed1c8a | ||
|
|
05f2e07c09 | ||
|
|
d24dbded15 | ||
|
|
42861506f1 | ||
|
|
7b23b704a7 | ||
|
|
0b7acb5aeb | ||
|
|
da7af2c483 | ||
|
|
b4df491c34 | ||
|
|
6bb5a52361 | ||
|
|
f40497cf97 | ||
|
|
6f54fc97de | ||
|
|
5bc0280b56 | ||
|
|
8ca7e4cc3b | ||
|
|
f24d6b0deb | ||
|
|
b88871f6c3 | ||
|
|
f56870bc5d | ||
|
|
1e3d2da804 | ||
|
|
4c01405fdf | ||
|
|
b941f3feeb | ||
|
|
481a08e01d | ||
|
|
ef4b5b165c | ||
|
|
533ec84d35 | ||
|
|
e4ba375901 | ||
|
|
2af823b34a | ||
|
|
a4adc9b2e4 | ||
|
|
8818fbcf85 | ||
|
|
1bab07a1fb | ||
|
|
72d03d5cd7 | ||
|
|
1718108ee4 | ||
|
|
58c527bd93 | ||
|
|
b689d74472 | ||
|
|
6c6ccce625 | ||
|
|
d8968eb05d | ||
|
|
04129529bc | ||
|
|
44dedf3e89 | ||
|
|
de2c57e6bc | ||
|
|
61d4065be8 | ||
|
|
f70424921d | ||
|
|
4e08a5d24b | ||
|
|
1fd1c99d1d | ||
|
|
1e7457a682 | ||
|
|
140f0c0f3f | ||
|
|
87d88420e4 | ||
|
|
e7824928bc | ||
|
|
ed8cb43baf | ||
|
|
29a4dad980 | ||
|
|
29d2820160 | ||
|
|
24fba07e8a | ||
|
|
c7484de2a4 | ||
|
|
d6d2a145f0 | ||
|
|
0ae71d2d06 | ||
|
|
3e091bb462 | ||
|
|
d123c793f2 | ||
|
|
579bb29dfd | ||
|
|
bf6d53a2cb | ||
|
|
7b210ba147 | ||
|
|
116ac9dfa1 | ||
|
|
34cc74d4c9 | ||
|
|
4423f08c71 | ||
|
|
52d23093b9 | ||
|
|
9c6828a817 | ||
|
|
5426b1b32c | ||
|
|
198cf19d57 | ||
|
|
38ffe7e823 | ||
|
|
abae259a32 | ||
|
|
185b7ec757 | ||
|
|
24bf644a71 | ||
|
|
b46a4d3a5d | ||
|
|
e7ce8a8e01 | ||
|
|
cffc59f46a | ||
|
|
0003d68828 | ||
|
|
6f8a245801 | ||
|
|
d9a47d1b54 | ||
|
|
b7fe6fb1d2 | ||
|
|
647b5a3a21 | ||
|
|
a25c771991 | ||
|
|
e36deee626 | ||
|
|
1983d002b4 | ||
|
|
3a6191a721 | ||
|
|
da26405550 | ||
|
|
270db3b53e | ||
|
|
f2acafda7a | ||
|
|
5666011e5d | ||
|
|
68d9148fa7 | ||
|
|
90b377a6e7 | ||
|
|
95505dd146 | ||
|
|
cd5d31cfcc | ||
|
|
cf6071a396 | ||
|
|
1321a2b0e5 | ||
|
|
12c548c062 | ||
|
|
7851ea10bb | ||
|
|
c949c86a99 | ||
|
|
ba72b18dad | ||
|
|
25670d5af9 | ||
|
|
02f4e595cc | ||
|
|
295b58c9de | ||
|
|
a183ced5ef | ||
|
|
1010a22c7e | ||
|
|
cd96dbf7e6 | ||
|
|
4d70bab54b | ||
|
|
33dd341669 | ||
|
|
c9773b2b69 | ||
|
|
96cf53257d | ||
|
|
8f43328b60 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,3 +3,6 @@ app/unpackage
|
||||
Crmeb-2022-01-04.log
|
||||
crmeb_front_log
|
||||
crmeb/LOG_HOME_IS_UNDEFINED
|
||||
*.
|
||||
*.
|
||||
.DS_Store
|
||||
|
||||
BIN
CRMEB 开源商城系统(Java版)安装必读.docx
Normal file
BIN
CRMEB 开源商城系统(Java版)安装必读.docx
Normal file
Binary file not shown.
225
LICENSE
225
LICENSE
@@ -1,34 +1,201 @@
|
||||
版权所有 (c)2017-2027,西安众邦网络科技有限公司 保留所有权利。
|
||||
感谢您选择CrmEb开源客户管理+电商系统(简称CRMEB),CRMEB是国内最稳定、最强大、最先进的互联网电商平台解决方案之一,
|
||||
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
369
README.md
@@ -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]: <> ([宽屏预览](https://gitee.com/ZhongBangKeJi/crmeb_java/blob/master/README.md))
|
||||
|
||||
</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开源商城PHP:https://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系统就是集客户关系管理 + 营销电商系统,
|
||||
能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、会员维护、
|
||||
网络营销的一款企业应用,更适合企业二次开发。
|
||||
|
||||
~~~~
|
||||

|
||||
|
||||
## 预览
|
||||

|
||||
|
||||
帮助手册:[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对应的接口文档也可以部署项目后查看
|
||||
~~~
|
||||
|
||||
## 移动端预览
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
## 功能图预览
|
||||

|
||||
|
||||
## WEB PC 管理端预览
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
# 商业版特色小功能
|
||||
## 页面设计
|
||||
|
||||

|
||||
|
||||
## 一键换色
|
||||

|
||||
|
||||
## WEB PC 更多便捷操作方式
|
||||
|
||||

|
||||
|
||||
## 项目源码
|
||||
|
||||
| 平台| 源码地址|
|
||||
|--- |--- |
|
||||
|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://space.bilibili.com/388666686)
|
||||
[](https://www.crmeb.com/index/java_merchant)
|
||||
|
||||
|
||||
## 开源版使用须知
|
||||
~~~
|
||||
1.允许用于个人学习、毕业设计、教学案例、公益事业;
|
||||
2.如果商用必须保留版权信息,如果需要去版权请联系客服;
|
||||
3.禁止将本项目的代码和资源进行任何形式的出售,产生的一切任何后果责任由侵权者自负。
|
||||
~~~
|
||||
### 🎬 系统演示:
|
||||

|
||||
移动端:https://java.crmeb.net<br>
|
||||
WEBPC管理端:https://admin.java.crmeb.net<br>
|
||||
账号密码: demo/crmeb.com<br>
|
||||
|
||||
## 联系客服
|
||||
自己搭建演示账号
|
||||
移动端 18292417675 / crmeb@123456
|
||||
管理端 admin / 123456
|
||||
|
||||

|
||||
[想了解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界面
|
||||
#### 核心功能
|
||||

|
||||
|
||||
|
||||
|
||||
### 📱 移动端预览
|
||||
<!-- 
|
||||

|
||||
 -->
|
||||

|
||||
|
||||
### WEB PC管理端预览
|
||||
<!-- 
|
||||

|
||||

|
||||

|
||||

|
||||
 -->
|
||||

|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
---
|
||||
### 📲 CRMEB开源技术交流群
|
||||
扫码进群可领取开源版接口文档、产品功能清单、高清UI设计图、思维脑图!
|
||||

|
||||
|
||||
|
||||
#### 📈 技术社区
|
||||
找方法、提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>
|
||||
 -->
|
||||
使用中遇到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>
|
||||
|
||||
---
|
||||
@@ -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"
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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 need Nonbreaking Space Plugin
|
||||
init_instance_callback: editor => {
|
||||
if (_this.value) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
61
admin/src/views/sms/smsConfig/config.vue
Normal file
61
admin/src/views/sms/smsConfig/config.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
// launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
|
||||
"version": "0.0",
|
||||
"configurations": [{
|
||||
"app-plus" :
|
||||
{
|
||||
"launchtype" : "remote"
|
||||
},
|
||||
"default" :
|
||||
{
|
||||
"launchtype" : "remote"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
539
app/pages.json
539
app/pages.json
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -150,6 +150,7 @@
|
||||
|
||||
<style lang="scss">
|
||||
page {
|
||||
margin-top: var(--status-bar-height);
|
||||
background-color: #fff !important;
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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%;
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
29
app/project.config.json
Normal 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
|
||||
}
|
||||
}
|
||||
8
app/project.private.config.json
Normal file
8
app/project.private.config.json
Normal 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"
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import Cache from "@/utils/cache";
|
||||
export function silenceBindingSpread() {
|
||||
|
||||
|
||||
//#ifdef H5
|
||||
//#ifdef H5 || APP
|
||||
let puid = Cache.get('spread');
|
||||
//#endif
|
||||
|
||||
|
||||
@@ -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
5
crmeb/.gitignore
vendored
@@ -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
|
||||
@@ -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`
|
||||
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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的密码
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
<!-- 开发阶段热部署-->
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 商品表
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
//创建新的画布,宽高以第一个图为准
|
||||
|
||||
@@ -41,7 +41,7 @@ public class UrlUtil {
|
||||
return entity;
|
||||
}
|
||||
url = url.trim();
|
||||
if (url.equals("")) {
|
||||
if ("".equals(url)) {
|
||||
return entity;
|
||||
}
|
||||
String[] urlParts = url.split("\\?");
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")){
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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("验证码不能为空");
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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的密码
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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元
|
||||
|
||||
@@ -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 ;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
// 扣减时加乐观锁保证库存不为负
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() + "不能为空!");
|
||||
}
|
||||
//正则验证
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 <= 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 ">
|
||||
|
||||
BIN
crmeb/crmebimage/crmebimage/demoimage/001admin.jpg
Normal file
BIN
crmeb/crmebimage/crmebimage/demoimage/001admin.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 680 KiB |
BIN
crmeb/crmebimage/crmebimage/demoimage/001front.jpg
Normal file
BIN
crmeb/crmebimage/crmebimage/demoimage/001front.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 114 KiB |
BIN
crmeb/crmebimage/crmebimage/demoimage/13yemiandesiner-min.gif
Normal file
BIN
crmeb/crmebimage/crmebimage/demoimage/13yemiandesiner-min.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 MiB |
BIN
crmeb/crmebimage/crmebimage/demoimage/14yijianhuanse-min.gif
Normal file
BIN
crmeb/crmebimage/crmebimage/demoimage/14yijianhuanse-min.gif
Normal 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
Reference in New Issue
Block a user