Browse Source

Merge branch 'dev' of ssh://10.10.100.21/source/saas-platform into dev

zhuth 7 years ago
parent
commit
845e51c5d8
55 changed files with 594 additions and 258 deletions
  1. 65 0
      README.md
  2. 20 0
      applications/commons/commons-server/src/main/resources/config/application-docker-prod.yml
  3. 1 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/BomMapper.java
  4. 5 4
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/BomServiceImpl.java
  5. 3 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java
  6. 3 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/VendorServiceImpl.java
  7. 23 0
      applications/document/document-server/src/main/resources/config/application-docker-prod.yml
  8. 2 2
      applications/document/document-server/src/main/resources/mapper/BomMapper.xml
  9. 4 3
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthreceiptsServiceImpl.java
  10. 23 0
      applications/money/money-server/src/main/resources/config/application-docker-prod.yml
  11. 5 2
      applications/purchase/purchase-server/src/main/resources/application.yml
  12. 20 0
      applications/purchase/purchase-server/src/main/resources/config/application-docker-prod.yml
  13. 20 0
      applications/sale/sale-server/src/main/resources/config/application-docker-prod.yml
  14. 4 1
      applications/storage/storage-server/src/main/resources/application.yml
  15. 20 0
      applications/storage/storage-server/src/main/resources/config/application-docker-prod.yml
  16. 25 0
      base-servers/account/account-server/src/main/resources/config/application-docker-prod.yml
  17. 9 0
      base-servers/admin-server/src/main/resources/config/application-docker-prod.yml
  18. 26 0
      base-servers/auth/auth-server/src/main/resources/config/application-docker-prod.yml
  19. 7 0
      base-servers/eureka-server/src/main/resources/config/application-docker-prod.yml
  20. 1 1
      base-servers/file/file-server/src/main/java/com/usoftchina/saas/file/controller/FileController.java
  21. 26 0
      base-servers/file/file-server/src/main/resources/config/application-docker-prod.yml
  22. 5 3
      base-servers/file/file-server/src/test/java/com/usoftchina/saas/file/controller/FileControllerTest.java
  23. 19 0
      base-servers/gateway-server/src/main/resources/config/application-docker-prod.yml
  24. 23 0
      base-servers/mail/mail-server/src/main/resources/config/application-docker-prod.yml
  25. 19 0
      base-servers/socket/socket-server/src/main/resources/config/application-docker-prod.yml
  26. 19 0
      base-servers/ui-server/src/main/resources/config/application-docker-prod.yml
  27. 13 0
      base-servers/zipkin-server/src/main/resources/config/application-docker-prod.yml
  28. BIN
      frontend/saas-portal-web/build/logo.png
  29. 0 3
      frontend/saas-portal-web/src/App.vue
  30. BIN
      frontend/saas-portal-web/src/assets/logo.png
  31. 71 43
      frontend/saas-portal-web/src/components/conenter/addgongsi.vue
  32. 3 7
      frontend/saas-portal-web/src/components/conenter/company.vue
  33. 7 9
      frontend/saas-portal-web/src/components/conenter/enterprise.vue
  34. 16 18
      frontend/saas-portal-web/src/components/conenter/home.vue
  35. 1 3
      frontend/saas-portal-web/src/components/conenter/qiyexiangxi.vue
  36. 0 55
      frontend/saas-portal-web/src/components/header/header.vue
  37. 0 2
      frontend/saas-portal-web/src/main.js
  38. 0 4
      frontend/saas-portal-web/static/css/gongsi.css
  39. 2 47
      frontend/saas-portal-web/static/css/main.css
  40. 0 9
      frontend/saas-portal-web/static/js/mains.js
  41. 10 0
      frontend/saas-web/app/Application.scss
  42. 14 10
      frontend/saas-web/app/view/core/query/QueryFormPanel.js
  43. 20 5
      frontend/saas-web/app/view/core/query/QueryPanel.scss
  44. 4 2
      frontend/saas-web/app/view/core/query/QueryPanelController.js
  45. 6 5
      frontend/saas-web/app/view/document/kind/ChildForm.js
  46. 9 5
      frontend/saas-web/app/view/stock/inventory/EditDataList.js
  47. 1 1
      frontend/saas-web/app/view/stock/make/FormPanelController.js
  48. 1 1
      frontend/saas-web/app/view/sys/baseconfig/FormPanel.js
  49. 2 2
      frontend/saas-web/app/view/sys/config/FormPanel.js
  50. 2 2
      frontend/saas-web/app/view/sys/guide/FormPanel.js
  51. BIN
      frontend/saas-web/resources/images/default/hide.png
  52. BIN
      frontend/saas-web/resources/images/default/show.png
  53. 9 0
      script/mysql/init/auth.sql
  54. 5 1
      script/mysql/init/base.sql
  55. 1 1
      script/mysql/init/mail.sql

+ 65 - 0
README.md

@@ -83,6 +83,8 @@
 | --------   | :-----: | :-----:  | :----:  | :----: | :------  |
 | saas_account | mysql | 192.168.253.12:3306 |  root  | select111*** |  账户中心  |
 | saas_auth | mysql | 192.168.253.12:3306 |  root  | select111*** |  鉴权系统  |
+| saas_file | mysql | 192.168.253.12:3306 |  root  | select111*** |  文件系统  |
+| saas_mail | mysql | 192.168.253.12:3306 |  root  | select111*** |  邮件系统  |
 | saas_biz | mysql | 192.168.253.12:3306 |  root  | select111*** |  业务系统  |
 | saas_ui | mongo | 192.168.253.12:27017 |    |  |  UI配置  |
 
@@ -124,4 +126,67 @@
 * [admin](http://192.168.0.181:8520) **账号** admin **密码** select111***
 * [zipkin](http://192.168.0.181:8540) **账号** admin **密码** select111***
 
+> 访问
 
+* [门户 https://saas-dev.usoftchina.com:5443](https://saas-dev.usoftchina.com:5443)
+* [系统 https://trade-dev.usoftchina.com:5443](https://trade-dev.usoftchina.com:5443)
+* [打印 https://saas-report-dev.usoftchina.com:5443](https://saas-report-dev.usoftchina.com:5443)
+* [接口 https://saas-api-dev.usoftchina.com:5443](https://saas-api-dev.usoftchina.com:5443)
+
+# 生产环境
+
+> 数据库
+
+| 数据库      | 类型   | 地址   |  账号  |  密码  |  说明  |
+| --------   | :-----: | :-----:  | :----:  | :----: | :------  |
+| saas_account | mysql | 10.10.100.18:3306 |  saas  | select111*** |  账户中心  |
+| saas_auth | mysql | 10.10.100.18:3306 |  saas  | select111*** |  鉴权系统  |
+| saas_file | mysql | 10.10.100.18:3306 |  saas  | select111*** |  文件系统  |
+| saas_mail | mysql | 10.10.100.18:3306 |  saas  | select111*** |  邮件系统  |
+| saas_biz | mysql | 10.10.100.18:3306 |  saas  | select111*** |  业务系统  |
+| saas_ui | mongo | 10.10.100.123:27017 |    |  |  UI配置  |
+
+> 中间件
+
+| 类型 | 地址 | 账号 | 密码 | 说明 |
+| ---- | :----: | :----: | :----: | ---- |
+| rabbitmq | 10.10.100.103:5672 | saas | select123*** | 消息中间件 [控制台](http://10.10.100.103:15672)|
+| redis | 10.10.100.173:6379 | | | 内存数据库 |
+
+
+> 服务器
+
+| IP      |  账号  |  密码  |  环境  |  资源  |
+| --------   | :----:  | :----: | :------:  | :------:  |
+| 10.10.100.103 |  centos  | mykey.key |  CentOS6, RabbitMQ  | Cpu: 4, Mem: 8G, Disk: 35G |
+| 10.10.100.123 |  centos  | mykey.key |  CentOS6, MongoDB  | Cpu: 8, Mem: 8G, Disk: 60G |
+| 10.10.100.160 |  centos  | mykey.key |  CentOS6, ELK  | Cpu: 8, Mem: 8G, Disk: 60G |
+| 10.10.100.173 |  centos  | mykey.key |  CentOS6, Redis  | Cpu: 4, Mem: 8G, Disk: 35G |
+| 10.10.100.23 |  root  | 62cddbcc624b1b072d84117cc0e5a4db |  CentOS7, Docker  | Cpu: 40, Mem: 128G, Disk: 800G |
+| 10.10.100.24 |  root  | 4fd19c28ee472ef9ebc3c06de9277c1b |  CentOS7, Docker  | Cpu: 40, Mem: 128G, Disk: 800G |
+| 10.10.100.25 |  root  | 61a12a65cd42ef77a52dfef8e436bacc |  CentOS7, Docker  | Cpu: 40, Mem: 128G, Disk: 800G |
+| 10.10.100.26 |  root  | 8743e445c7a308edf4588b7997b21c73 |  CentOS7, Docker  | Cpu: 40, Mem: 128G, Disk: 800G |
+
+> 构建
+
+* [jenkins](http://10.10.100.200:5001/job/saas/prod) **账号** admin **密码** select123***
+
+> 日志
+
+* [kibana](http://10.10.100.160:5601)
+* [logstash](tcp://10.10.100.160:5000)
+* [elasticsearch](http://10.10.100.160:9200/_search?pretty)
+
+> 服务
+
+* [eureka http://10.10.100.23:8500](http://10.10.100.23:8500) **账号** admin **密码** select111***
+* [gateway http://10.10.100.23:8560](http://10.10.100.23:8560)
+* [admin](http://10.10.100.23:8520) **账号** admin **密码** select111***
+* [zipkin](http://10.10.100.23:8540) **账号** admin **密码** select111***
+
+> 访问
+
+* [门户 https://saas.usoftchina.com](https://saas.usoftchina.com)
+* [系统 https://trade.usoftchina.com](https://trade.usoftchina.com)
+* [打印 https://saas-report.usoftchina.com](https://saas-report.usoftchina.com)
+* [接口 https://saas-api.usoftchina.com](https://saas-api.usoftchina.com)

+ 20 - 0
applications/commons/commons-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,20 @@
+eureka:
+  instance:
+    hostname: saas-commons-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+logging:
+  destination: 10.10.100.160:5000

+ 1 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/BomMapper.java

@@ -23,14 +23,13 @@ public interface BomMapper extends CommonBaseMapper<Bom> {
 
     int validCodeAndVersionWhenUpdate(@Param("code") String code, @Param("id") Long id, @Param("version") String version, @Param("companyId") Long companyId);
 
-
     int validateCodeWhenInsert(@Param("code") String code, @Param("companyId") Long companyId);
 
     int validateCodeWhenUpdate(@Param("code") String code, @Param("id") Long id, @Param("companyId") Long company);
 
     List<Bom> getListData(@Param("condition") String condition, @Param("companyId") Long companyId);
 
-    int getCountFromMake(Long id);
+    int getCountFromMake(@Param("code") String code,@Param("version") String version);
 
     void updateCreator(@Param("userId") Long userId,@Param("userName") String userName,@Param("id") Long id);
 }

+ 5 - 4
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/BomServiceImpl.java

@@ -124,7 +124,8 @@ public class BomServiceImpl extends CommonBaseServiceImpl<BomMapper, Bom> implem
         }
         //校验BOM资料是否已被使用
         Long prodId = getMapper().selectByPrimaryKey(id).getBo_motherid();
-        int count = getMapper().getCountFromMake(prodId);
+        Bom bom = getMapper().selectByPrimaryKey(id);
+        int count = getMapper().getCountFromMake(bom.getBo_mothercode(),bom.getBo_version());
         if (count > 0){
             throw new BizException(BizExceptionCode.BIZ_RELDELETE);
         }
@@ -194,12 +195,13 @@ public class BomServiceImpl extends CommonBaseServiceImpl<BomMapper, Bom> implem
         if(id != null && id > 0){
             //校验BOM资料是否已被使用
             Long prodId = getMapper().selectByPrimaryKey(id).getBo_motherid();
-            int count = getMapper().getCountFromMake(prodId);
+            Bom bom = getMapper().selectByPrimaryKey(id);
+            int count = getMapper().getCountFromMake(bom.getBo_mothercode(),bom.getBo_version());
             if (count > 0){
                 throw new BizException(BizExceptionCode.BIZ_RELCLOSE);
             }
 
-            Bom bom = new Bom();
+            bom = new Bom();
             bom.setId(id);
             bom.setBo_status(Status.CLOSE.getDisplay());
             bom.setBo_statuscode(Status.CLOSE.name());
@@ -232,7 +234,6 @@ public class BomServiceImpl extends CommonBaseServiceImpl<BomMapper, Bom> implem
                 bom.setBo_status(Status.OPEN.getDisplay());
                 bom.setUpdateTime(new Date());
                 bom.setUpdaterId(BaseContextHolder.getUserId());
-
                 getMapper().updateByPrimaryKeySelective(bom);
                 //记录LOG
                 DocBaseDTO docBaseDTO = generateMsgObj(id, code);

+ 3 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java

@@ -213,8 +213,9 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
 
                 //限制关联单据不可修改金额
                 Customer customer1 = getMapper().selectByPrimaryKey(customer.getId());
-                if (customer.getCu_beginaramount() != customer1.getCu_beginaramount() ||
-                        customer.getCu_beginprerecamount() != customer1.getCu_beginprerecamount()){
+                if (customer.getCu_beginaramount().doubleValue() != customer1.getCu_beginaramount().doubleValue() ||
+                        customer.getCu_beginprerecamount().doubleValue() != customer1.getCu_beginprerecamount().doubleValue() ||
+                        customer1.getCu_begindate().compareTo(customer.getCu_begindate()) != 0){
                     throw new BizException(BizExceptionCode.BIZ_RELUPDATE_AMOUNT);
                 }
             }

+ 3 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/VendorServiceImpl.java

@@ -198,8 +198,9 @@ public class VendorServiceImpl extends CommonBaseServiceImpl<VendorMapper, Vendo
             if(!StringUtils.isEmpty(result)){
                 //限制关联单据不可修改金额
                 Vendor vendor = getMapper().selectByPrimaryKey(main.getId());
-                if (vendor.getVe_beginapamount() != main.getVe_beginapamount() ||
-                        vendor.getVe_beginprepayamount() != main.getVe_beginprepayamount()){
+                if (vendor.getVe_beginapamount().doubleValue() != main.getVe_beginapamount().doubleValue() ||
+                        vendor.getVe_beginprepayamount().doubleValue() != main.getVe_beginprepayamount().doubleValue() ||
+                        vendor.getVe_begindate().compareTo(main.getVe_begindate()) != 0){
                     throw new BizException(BizExceptionCode.BIZ_RELUPDATE_AMOUNT);
                 }
             }
@@ -313,7 +314,6 @@ public class VendorServiceImpl extends CommonBaseServiceImpl<VendorMapper, Vendo
         }
     }
 
-
     /**
      * 关闭
      * @param id

+ 23 - 0
applications/document/document-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,23 @@
+eureka:
+  instance:
+    hostname: saas-document-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 2 - 2
applications/document/document-server/src/main/resources/mapper/BomMapper.xml

@@ -295,8 +295,8 @@
     </where>
     ORDER BY BO_ID DESC
   </select>
-  <select id="getCountFromMake" parameterType="java.lang.Long" resultType="int">
-      SELECT COUNT(*) FROM MAKE WHERE MA_PRODID = #{id}
+  <select id="getCountFromMake" resultType="int">
+      SELECT COUNT(*) FROM MAKE WHERE  ma_prodcode = #{code} and ma_version = #{version}
   </select>
 
   <update id="updateCreator">

+ 4 - 3
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/OthreceiptsServiceImpl.java

@@ -162,8 +162,8 @@ public class OthreceiptsServiceImpl extends CommonBaseServiceImpl<OthreceiptsMap
             Customer customer = new Customer();
             customer.setId(Long.valueOf(othreceipts.getOr_custid()));
             customer.setCu_preamount(preamount);
-            customer.setCu_recamount(recamount - or_amount);
-            customer.setCu_leftamount(beginapamount - beginprepayamount + recamount - or_amount - preamount);
+            customer.setCu_recamount(recamount + or_amount);
+            customer.setCu_leftamount(beginapamount - beginprepayamount + recamount + or_amount - preamount);
             recbalanceMapper.updateCustomerByPrimaryKeySelective(customer);
 
             //插入subledger中间表
@@ -218,6 +218,7 @@ public class OthreceiptsServiceImpl extends CommonBaseServiceImpl<OthreceiptsMap
         othreceipts = othreceiptsMapper.selectByPrimaryKey(id);
         banksubledgerMapper.deleteByPrimaryKey(othreceipts.getOr_code(), "其他收入单");
 
+
         //更新资金
         Double amount = banksubledgerMapper.selectThisamount(othreceipts.getOr_bankcode());
         List<Othreceiptsdetail> othreceiptsdetailList = othreceiptsdetailMapper.selectByPrimaryKey(id);
@@ -260,7 +261,7 @@ public class OthreceiptsServiceImpl extends CommonBaseServiceImpl<OthreceiptsMap
             customer.setId(Long.valueOf(othreceipts.getOr_custid()));
             customer.setCu_preamount(preamount);
             customer.setCu_recamount(recamount - or_amount);
-            customer.setCu_leftamount(beginapamount + beginprepayamount - recamount + or_amount + preamount);
+            customer.setCu_leftamount(beginapamount + beginprepayamount + recamount - or_amount - preamount);
             recbalanceMapper.updateCustomerByPrimaryKeySelective(customer);
             subledgerMapper.deleteByPrimaryKey(othreceipts.getOr_code(), "其他收入单");
         }

+ 23 - 0
applications/money/money-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,23 @@
+eureka:
+  instance:
+    hostname: saas-money-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 5 - 2
applications/purchase/purchase-server/src/main/resources/application.yml

@@ -47,7 +47,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
 management:
   endpoints:
     web:
@@ -70,4 +70,7 @@ mybatis:
   type-aliases-package: com.usoftchina.saas.purchase.po
   mapper-locations: classpath:mapper/*.xml
 auth:
-  public-key: auth/pub.key
+  public-key: auth/pub.key
+ribbon:
+  ReadTimeout: 6000
+  ConnectTimeout: 2000

+ 20 - 0
applications/purchase/purchase-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,20 @@
+eureka:
+  instance:
+    hostname: saas-purchase-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+logging:
+  destination: 10.10.100.160:5000

+ 20 - 0
applications/sale/sale-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,20 @@
+eureka:
+  instance:
+    hostname: saas-sale-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+logging:
+  destination: 10.10.100.160:5000

+ 4 - 1
applications/storage/storage-server/src/main/resources/application.yml

@@ -70,4 +70,7 @@ mybatis:
   type-aliases-package: com.usoftchina.saas.storage.entities
   mapper-locations: classpath:mapper/*.xml
 auth:
-  public-key: auth/pub.key
+  public-key: auth/pub.key
+ribbon:
+  ReadTimeout: 6000
+  ConnectTimeout: 2000

+ 20 - 0
applications/storage/storage-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,20 @@
+eureka:
+  instance:
+    hostname: saas-storage-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+logging:
+  destination: 10.10.100.160:5000

+ 25 - 0
base-servers/account/account-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,25 @@
+eureka:
+  instance:
+    hostname: saas-account-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_account?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000
+sso:
+  base-url: https://sso.ubtob.com

+ 9 - 0
base-servers/admin-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,9 @@
+eureka:
+  instance:
+    hostname: saas-admin-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+logging:
+  destination: 10.10.100.160:5000

+ 26 - 0
base-servers/auth/auth-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,26 @@
+eureka:
+  instance:
+    hostname: saas-auth-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    virtual-host: docker
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_auth?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 7 - 0
base-servers/eureka-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,7 @@
+eureka:
+  instance:
+    hostname: saas-eureka-server
+server:
+  port: 8500
+logging:
+  destination: 10.10.100.160:5000

+ 1 - 1
base-servers/file/file-server/src/main/java/com/usoftchina/saas/file/controller/FileController.java

@@ -199,7 +199,7 @@ public class FileController {
 
     @ApiOperation(value = "查看子文件")
     @GetMapping(value = "/list")
-    public Result<List<FileInfoDTO>> listFiles(@RequestParam("folderId") Long folderId) {
+    public Result<List<FileInfoDTO>> listFiles(@RequestParam(value = "folderId", required = false) Long folderId) {
         List<FileInfo> files = fileService.findByFolderId(checkFolder(folderId).getId());
         return Result.success(BeanMapper.mapList(files, FileInfoDTO.class));
     }

+ 26 - 0
base-servers/file/file-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,26 @@
+eureka:
+  instance:
+    hostname: saas-file-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_file?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+fdfs:
+  tracker-list:
+    - 10.10.100.200:22122
+logging:
+  destination: 10.10.100.160:5000

+ 5 - 3
base-servers/file/file-server/src/test/java/com/usoftchina/saas/file/controller/FileControllerTest.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.file.controller;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.file.dto.FileInfoDTO;
 import com.usoftchina.saas.file.dto.FolderDTO;
+import com.usoftchina.saas.file.dto.FolderSaveDTO;
 import com.usoftchina.saas.file.util.RandomTextFile;
 import com.usoftchina.saas.test.BaseControllerTest;
 import org.apache.commons.lang.RandomStringUtils;
@@ -28,9 +29,10 @@ public class FileControllerTest extends BaseControllerTest {
     public static Long folder_1_2_1;
 
     private FolderDTO newFolder(Long folderId, String name) throws Exception{
-        MvcResult mvcResult = mockMvc.perform(post("/folder")
-                .param("folderId", String.valueOf(folderId))
-                .param("name", name))
+        FolderSaveDTO folderSaveDTO = new FolderSaveDTO();
+        folderSaveDTO.setFolderId(folderId);
+        folderSaveDTO.setName(name);
+        MvcResult mvcResult = mockMvc.perform(requestBody("/folder", folderSaveDTO))
                 .andExpect(isSuccess())
                 .andReturn();
         Result<FolderDTO> result = result(mvcResult, FolderDTO.class);

+ 19 - 0
base-servers/gateway-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,19 @@
+eureka:
+  instance:
+    hostname: saas-gateway-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 23 - 0
base-servers/mail/mail-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,23 @@
+eureka:
+  instance:
+    hostname: saas-mail-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_mail?characterEncoding=utf-8&useSSL=false
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 19 - 0
base-servers/socket/socket-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,19 @@
+eureka:
+  instance:
+    hostname: saas-socket-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 19 - 0
base-servers/ui-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,19 @@
+eureka:
+  instance:
+    hostname: saas-ui-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  data:
+    mongodb:
+      uri: mongodb://10.10.100.123:27017/saas_ui
+logging:
+  destination: 10.10.100.160:5000

+ 13 - 0
base-servers/zipkin-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,13 @@
+eureka:
+  instance:
+    hostname: saas-zipkin-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+zipkin:
+  collector:
+    rabbitmq:
+      uri: amqp://saas:select123***@10.10.100.103:5672/docker
+logging:
+  destination: 10.10.100.160:5000

BIN
frontend/saas-portal-web/build/logo.png


+ 0 - 3
frontend/saas-portal-web/src/App.vue

@@ -1,17 +1,14 @@
 <template>
   <div id="app">
-    <!-- <headers></headers> -->
     <router-view/>
     <footers></footers>
   </div>
 </template>
 <script>
-// import Headers from './components/header/header.vue';
 import footers from './components/footer/footer.vue';
 export default {
   name: 'App',
   components: {
-      // Headers,
       footers
   },
 }

BIN
frontend/saas-portal-web/src/assets/logo.png


+ 71 - 43
frontend/saas-portal-web/src/components/conenter/addgongsi.vue

@@ -26,15 +26,14 @@
                             </select>
                         </li>
                         <li style="height:60px;">
-                            <span class="qy-biaoti">公司地址</span>
-                            <div class="addbiaoqian">
-                                <v-distpicker @province= 'qyprovince'
-                                              @city= 'qycity'
-                                              @area= 'qyarea'
-                                >
-                                </v-distpicker>
-                                <input ref="address" class="qy-xiangxi" type="text" placeholder="输入企业详细地址">
+                            <span class="qy-biaoti left">公司地址</span>
+                            <div class="addbiaoqian" style="float: left;margin: 0;">
+                                <!-- <v-distpicker @province= 'qyprovince' @city= 'qycity' @area= 'qyarea'></v-distpicker> -->
+                                <v-distpicker @selected= 'selected'></v-distpicker>
+                                <input ref="address" @change="address" class="qy-xiangxi" type="text" placeholder="输入企业详细地址">
+                                
                             </div>
+                            <span ref="ress" style="color:red;margin-top: 40px;display: inline-block;"></span>
                         </li>
                     </ul>
                 </div>
@@ -73,7 +72,12 @@ import VDistpicker from 'v-distpicker'
                 area:'',//区
                 qymingzi: false,//企业名是否注册
                 Email: '',
-                mytoken: JSON.parse(localStorage.getItem('app-state-session'))//本地储存的用户信息
+                mytoken: JSON.parse(localStorage.getItem('app-state-session')),//本地储存的用户信息
+                // reg: new RegExp("[`~!@#$^&*()=+-|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]"),
+                reg: new RegExp(/[\@\#\$\%\&\*!\¥]/),
+                isaddress: false,//公司地址验证
+                isname: false,//姓名验证
+                isspaceName: false,//公司名验证
             }
         },
         components:{
@@ -90,42 +94,68 @@ import VDistpicker from 'v-distpicker'
             },
             //测试企业名称
             spaceName(){
-                let qyname = this.$refs.qyname.value;//公司名字
+                let qyname = this.$refs.qyname.value.replace(/\s+/g, "");//公司名字过滤空格
                 if(qyname == ''){
                     this.$refs.qyno.innerHTML = '企业名不能为空';
                 } else {
-                    this.$refs.qyno.innerHTML = '';
-                    let token = this.mytoken.token;
-                    this.$ajax({
-                        url: this.$url.api+"/api/account/accountCenter/checkSpaceName"+`?spaceName=${qyname}`,
-                        method :'get',
-                        headers: {
-                            "Authorization":token
-                        }
-                    })
-                    .then(res=>{
-                        if (res.data.data.success) {
-                            this.qymingzi = true;
-                        } else {
-                            this.$refs.qyno.innerHTML = '企业已注册';
-                            this.qymingzi = false
-                        }
-                    })
-                    .catch(err=>{
-                        console.log("请求错误",err);
-                    })
+                    if (this.reg.test(qyname)) {
+                        this.$refs.qyno.innerHTML = '包含非法字符';
+                        this.isspaceName = false;
+                    } else {
+                        this.$refs.qyno.innerHTML = '';
+                        this.isspaceName = true;
+                        let token = this.mytoken.token;
+                        this.$ajax({
+                            url: this.$url.api+"/api/account/accountCenter/checkSpaceName"+`?spaceName=${qyname}`,
+                            method :'get',
+                            headers: {
+                                "Authorization":token
+                            }
+                        })
+                        .then(res=>{
+                            if (res.data.data.success) {
+                                this.qymingzi = true;
+                            } else {
+                                this.$refs.qyno.innerHTML = '企业已注册';
+                                this.qymingzi = false
+                            }
+                        })
+                        .catch(err=>{
+                            // console.log("请求错误",err);
+                        })
+                    }
                 }
             },
             //验证个人姓名
             yzusername(){
-                let name = this.$refs.name.value;//个人姓名
+                let name = this.$refs.name.value.replace(/\s+/g, "");//姓名过滤空格
                 if (name == '') {
                     this.$refs.usname.innerHTML = '姓名不能为空'
                 } else {
-                    this.$refs.usname.innerHTML = ''
+                    if (this.reg.test(name)) {
+                        this.$refs.usname.innerHTML = '包含非法字符'
+                        this.isname = false
+                    } else {
+                        this.$refs.usname.innerHTML = ''
+                        this.isname = true
+                    }
+                }
+            },
+            //验证公司详细地址
+            address(){
+                let address = this.$refs.address.value.replace(/\s+/g, "");//过滤空格
+                if (address == '') {
+                    this.$refs.ress.innerHTML = '地址不能为空'
+                } else {
+                    if (this.reg.test(address)) {
+                        this.$refs.ress.innerHTML = '包含非法字符'
+                        this.isaddress = false
+                    } else {
+                        this.$refs.ress.innerHTML = ''
+                        this.isaddress = true
+                    }
                 }
             },
-            
             email(){
                 let reg = new RegExp("^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$"); 
                 let email = this.$refs.email.value;//邮箱
@@ -134,14 +164,13 @@ import VDistpicker from 'v-distpicker'
                 } else {
                     this.Email = ''
                 }
-
             },
             //保存
             Preservation(){
-                let qyname = this.$refs.qyname.value;//公司名字
+                let qyname = this.$refs.qyname.value.replace(/\s+/g, "");//公司名字
                 let qyindustry = this.$refs.qyindustry.value;//所属行业
-                let address = this.province+this.city+this.area+this.$refs.address.value;//公司详细地址
-                let name = this.$refs.name.value;//个人姓名
+                let address = this.province+this.city+this.area+this.$refs.address.value.replace(/\s+/g, "");//公司详细地址
+                let name = this.$refs.name.value.replace(/\s+/g, "");//个人姓名
                 let email = this.$refs.email.value;//邮箱
                 let mytoken = JSON.parse(localStorage.getItem('app-state-session'));
                 let token = String(mytoken.token);
@@ -149,7 +178,7 @@ import VDistpicker from 'v-distpicker'
                 let mobile = mytoken.account.mobile;//手机号
                 let company = {'name':qyname,'address':address};
                 let account = {'realname':name,'email':email,'mobile':mobile, 'uu':uu}
-                if (name != '' && qyname != '' && this.qymingzi) {
+                if (name != '' && qyname != '' && this.qymingzi && this.isaddress && this.isname && this.isspaceName) {
                     this.$ajax({
                         url: this.$url.api+"/api/account/accountCenter/companyAccount/save",//http://192.168.253.31:8560
                         method: 'post',
@@ -163,19 +192,18 @@ import VDistpicker from 'v-distpicker'
                         }
                     })
                     .then(res=>{
-                        console.log("请求成功",res)
+                        // console.log("请求成功",res)
                         document.documentElement.scrollTop = 0;
-                        // this.$router.push({name:'company', params:{company:company,account:account}});
                         this.$router.push({name:'company'})
                     })
                     .catch(err=>{
-                        console.log("请求失败",err)
+                        // console.log("请求失败",err)
                     })
                 } else {
-                    this.$refs.tjtishi.innerHTML = '企业名称或姓名不能为空'
+                    this.$refs.tjtishi.innerHTML = '企业名称或姓名不能为空或包含有非法字符'
                     setTimeout(() => {
                         this.$refs.tjtishi.innerHTML = ''
-                    }, 2000);
+                    }, 3000);
                 }
                 
             },

+ 3 - 7
frontend/saas-portal-web/src/components/conenter/company.vue

@@ -1,6 +1,5 @@
 <template>
   <div>
-    <!-- <iframe hidden :src="setTokenPage"></iframe> -->
     <!-- 遮罩 -->
     <div class="zhezhao" v-if="issetDefault || isOpensaas || isNoopen"></div>
     <!-- 设置默认弹窗 -->
@@ -121,7 +120,6 @@
         mounted(){
             let mytoken = JSON.parse(localStorage.getItem('app-state-session'));
             let token = String(mytoken.token);
-            // console.log(mytoken.account)
             //企业列表
             this.$ajax({
                     url: this.$url.api+"/api/account/accountCenter/company/list",
@@ -154,7 +152,7 @@
                     // console.log(res.data.data)
                 })
                 .catch(err=>{
-                    console.log("请求失败",err)
+                    // console.log("请求失败",err)
                 })
             this.boxheight();
         },
@@ -177,7 +175,6 @@
                     },
                     headers: {
                         "Authorization":token,
-                        // "Content-Type":'application/x-www-form-urlencoded'
                     }
                 })
                 .then(res=>{
@@ -186,7 +183,7 @@
                     this.$router.go(0);
                 })
                 .catch(err=>{
-                    console.log('请求失败',err);
+                    // console.log('请求失败',err);
                 });
                 
             },
@@ -211,7 +208,7 @@
                     window.location.href = this.$url.web
                 })
                 .catch(err=>{
-                    console.log('请求失败',err)
+                    // console.log('请求失败',err)
                 })
             
             },
@@ -275,7 +272,6 @@
             //查看企业详情
             getEnterpriseInfo(d){
                 document.documentElement.scrollTop = 0;
-                // this.$router.push({path:'/details',query:{content:d}});
                 this.$router.push({path:'/details'});
                 window.sessionStorage.setItem('content',JSON.stringify(d))
             },

+ 7 - 9
frontend/saas-portal-web/src/components/conenter/enterprise.vue

@@ -20,9 +20,9 @@
                 <ul id="nav" class="nav navbar-nav menu">
                     <li><router-link to="/home"><a href="#"><span style="color: white">首页</span></a></router-link></li>
                     <li><a href="https://uas.usoftchina.com/about" target="_blank"><span>关于我们</span></a></li>
-                    <li>
+                    <li style="margin-left:30px">
                         <span style="color:#fff;font-size: 16px;">
-                            <img style="width: 24px;" src="/static/img/assets/denglu3x.png" alt="">
+                            <img style="width: 20px;" src="/static/img/assets/denglu3x.png" alt="">
                             {{mytoken.realname}}
                         </span>
                         <a href=""><span @click="loginout">【退出】</span></a>
@@ -124,8 +124,7 @@ import Session from '@/utils/session'
             }
         },
         mounted(){
-            console.log(window.frames[window.frames.length - 1])
-            console.log(window.frames.length)
+
         },
         methods: {
             // tab切换
@@ -144,9 +143,8 @@ import Session from '@/utils/session'
 </script>
 
 <style scoped>
-.navbar-inverse {
-    /* background-color: rgba(0, 0, 0, 0.77);
-    height: 70px;
-    line-height: 70px; */
-}
+    .div {
+        padding-top: 100px;
+        background: #FDFDFD;
+    }
 </style>

+ 16 - 18
frontend/saas-portal-web/src/components/conenter/home.vue

@@ -1,10 +1,5 @@
 <template>
     <div>
-      <div id="preloader" style="display:none">
-        <div class="loder-box">
-          <div class="battery"></div>
-        </div>
-      </div>
 		<div id="navigation" class="navbar-inverse navbar-fixed-top animated-header">
         <div class="container">
             <div class="navbar-header">
@@ -31,7 +26,7 @@
             <li><a href="#service"><span>功能</span></a></li>
             <!-- <li><a href="#prototype"><span>帮助中心</span></a></li> -->
             <li><a href="https://uas.usoftchina.com/about" target="_blank"><span>关于我们</span></a></li>
-            <li class="login" v-if="!account" style="margin-left: 20px;">
+            <li class="login" v-if="!account" style="margin-left: 30px;">
               <span @click="login"><img src="/static/img/assets/denglu3x.png" alt="">登录  &nbsp;</span>
               <span @click="register"><img src="/static/img/assets/zhuce3x.png" alt="">注册</span>
             </li>
@@ -66,14 +61,14 @@
       <div class="tiyan" v-if="isexperience">
         <img @click="Closeexperience" class="tc-on ty-out" src="/static/img/qiye/x.png" alt="" />
         <div><img class="ty-logo" src="/static/img/assets/dalogo@2x.png" alt=""></div>
-        <div><p class="ty-logotxt">欢迎你访问U企云服</p></div>
-        <div class="ty-title"><span>填写手机号后,即刻体验电子行业贸易版所有功能</span></div>
+        <!-- <div><p class="ty-logotxt">欢迎你访问U企云服</p></div> -->
+        <!-- <div class="ty-title"><span>填写手机号后,即刻体验电子行业贸易版所有功能</span></div> -->
         <div class="ty-phone over">
           <div class="left ty-input">
             <span><img style="margin: 6px 8px 10px 15px;" src="/static/img/assets/phone.png" alt=""></span>
             <input ref="typhone" type="text" placeholder="请输入您的11位手机号">
           </div>
-          <div class="left" style="margin-left: 8px;"><button @click="experience1">立即试用</button></div>
+          <div class="left" style="margin-left: 8px;"><button @click="experience1">立即体验</button></div>
         </div>
         <div style="text-align: left;">
           <span class="Caution" ref="Caution"></span>
@@ -308,7 +303,7 @@
 <script>
   import {subscribe, disconnect} from '@/api/socket'
   import Session from '@/utils/session'
-import { setTimeout } from 'timers';
+  import { setTimeout } from 'timers'
 
   export default {
     data() {
@@ -319,7 +314,7 @@ import { setTimeout } from 'timers';
         account: null,
         isexperience: false,
         arr: ["操作文档","常见手册"],
-        Nowindex: 0
+        Nowindex: 0,
       }
     },
     mounted() {
@@ -413,12 +408,15 @@ import { setTimeout } from 'timers';
         let reg = new RegExp('^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$')
         if (phone == '') {
           this.$refs.Caution.innerHTML = '号码不能为空'
+          setTimeout(()=>{
+            this.$refs.Caution.innerHTML = ''
+          },3000)
         } else {
           if (!reg.test(phone)) {
-            this.$refs.Caution.innerHTML = '号码格式错误'
-            // setTimeout(()=>{
-            //   this.$refs.Caution.innerHTML = ''
-            // },2000)
+            this.$refs.Caution.innerHTML = '请输入正确的手机号码'
+            setTimeout(()=>{
+              this.$refs.Caution.innerHTML = ''
+            },3000)
           } else {
             this.$refs.Caution.innerHTML = ''
             this.$ajax({
@@ -470,9 +468,9 @@ import { setTimeout } from 'timers';
   top: 50%;
   left: 50%;
 	width: 640px;
-	height: 320px;
+	height: 283px;
 	margin-left: -320px;
-  margin-top: -160px;
+  margin-top: -141px;
   z-index: 10001;
   background: white;
   padding: 24px;
@@ -485,7 +483,7 @@ import { setTimeout } from 'timers';
 }
 .ty-logo {
   width: 140px;
-  margin: 15px 0 10px 13px;
+  margin: 15px 0 50px 13px;
 }
 .ty-logotxt {
   font-family: PingFangSC-Regular;

+ 1 - 3
frontend/saas-portal-web/src/components/conenter/qiyexiangxi.vue

@@ -9,7 +9,6 @@
                 <div class="tc-conent"><img src="/static/img/qiye/buneng kaitong@1x.png" alt=""></div>
                 <div class="tc-text">
                 <p>您不是管理员不能修改企业信息</p>
-                <!-- <p>不能再继续开通服务</p> -->
                 </div>
             </div>
         </div>
@@ -96,7 +95,6 @@
         data(){
             return {
                 xiugai:true,
-                // content: this.$route.query.content,
                 content: JSON.parse(window.sessionStorage.getItem("content")),
                 Email: '',
                 mytoken: JSON.parse(localStorage.getItem('app-state-session')),//本地储存的用户信息
@@ -172,7 +170,7 @@
                     // this.isTipsmail = true;
                     setTimeout(()=>{
                         this.$refs.Tips.innerHTML= ""
-                    },2000)
+                    },3000)
                 }
             },
             //返回

+ 0 - 55
frontend/saas-portal-web/src/components/header/header.vue

@@ -1,55 +0,0 @@
-<template>
-    <div>
-        <!-- 页面加载loding -->
-        <!-- <div id="preloader">
-            <div class="loder-box">
-            	<div class="battery"></div>
-            </div>
-		</div> -->
-        <div id="navigation" class="navbar-inverse navbar-fixed-top animated-header">
-        <div class="container">
-            <div class="navbar-header">
-                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
-                    <span class="sr-only">Toggle navigation</span>
-                    <span class="icon-bar"></span>
-                    <span class="icon-bar"></span>
-                    <span class="icon-bar"></span>
-                </button>
-                <h1 class="navbar-brand">
-                    <a href="#">
-                        <img class="logo-img" src="../../../static/img/assets/dalogo3x.png" alt="">
-                    </a>
-                </h1>
-            </div>
-            <div class="collapse navbar-collapse navbar-right" role="navigation">
-                <ul id="nav" class="nav navbar-nav menu">
-                    <li><a href="#"><span>首页</span></a></li>
-                    <!-- <li @click= "home"><router-link to="/home"><a href="#"><span>首页</span></a></router-link></li> -->
-                    <!-- <li><a href="#feature"><span>特色</span></a></li> -->
-                    <li @click= "home"><router-link to="/enterprise"><a href="#"><span>特色</span></a></router-link></li>
-                    <li><a href="#service"><span>功能</span></a></li>
-                    <li><a href="#prototype"><span>帮助中心</span></a></li>
-                    <li><a href="#prototype"><span>联系我们</span></a></li>
-                    <li class="login">
-                        <span class="btn1"><img src="../../../static/img/assets/denglu3x.png" alt="">登录  &nbsp;</span>
-                        <span class="register"><img src="../../../static/img/assets/zhuce3x.png" alt="">注册</span>
-                    </li>
-                </ul>
-            </div>
-        </div>
-        </div>
-    </div>
-</template>
-<script>
-    export default {
-        methods:{
-            home(){
-                document.documentElement.scrollTop = 0;
-            }
-        }
-    }
-</script>
-
-<style>
-
-</style>

+ 0 - 2
frontend/saas-portal-web/src/main.js

@@ -1,5 +1,3 @@
-// The Vue build version to load with the `import` command
-// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
 
 import Vue from 'vue'
 import App from './App'

+ 0 - 4
frontend/saas-portal-web/static/css/gongsi.css

@@ -1,7 +1,3 @@
-.div {
-    padding-top: 100px;
-    background: #FDFDFD;
-}
 .xs:hover {
     cursor:pointer;
     border-bottom: 1px solid #2868c8;

+ 2 - 47
frontend/saas-portal-web/static/css/main.css

@@ -1,14 +1,3 @@
-/**
-*
-* ---------------------------------------------------------------------------
-*
-* Template : Blue - A One-Page HTML Portfolio/Business Template
-* Author : Muhammad Morshd
-* Author URI : http://morshed.im
-*
-* ---------------------------------------------------------------------------
-*
-*/
 
 /* =================================== */
 /*	Basic Style
@@ -79,8 +68,7 @@ main > section {
     background-color: #0aa6bd;
 }
 .logo-img {
-    width: 123px;
-    height: 50px;
+    width: 120px;
     margin-top: -4px;
 }
 /* 遮罩 */
@@ -95,9 +83,6 @@ main > section {
     z-index: 10000;
 }
 /* 登录弹窗 */
-/* input {
-    outline: none;
-} */
 .tishi {
     font-size: 12px;
     color: #FF6A1A;
@@ -283,7 +268,7 @@ main > section {
    margin: 0 15px;
 }
 .login img,.profile img {
-    width: 24px;
+    width: 20px;
     margin-right: 5px;
 }
 .login > span:hover,.profile > span:hover{
@@ -325,30 +310,9 @@ main > section {
     position: absolute;
     top: 76%;
     left: 7%;
-    /* z-index: 5; */
-    /* width: 468px;
-    height: 300px; */
-}
-.sy-dianzi {
-    width: 100%;
-    height: 50px;
-}
-.sy-mb {
-    margin-bottom: 25px;
-}
-.sy-mb img{
-    width: 100px;
-    height: 36px;
-}
-.sy-mbimg2 {
-    width: 150px !important;
-}
-.sy-mb>img:nth-child(2) {
-    margin-left: 15px;
 }
 .my-tiyan {
     background: #5172DD;
-    /* box-shadow: 0 0 19px 0 rgba(137,143,164,0.63); */
     border-radius: 4px;
     width: 100px;
     height: 36px;
@@ -357,15 +321,6 @@ main > section {
     color: #FFFFFF;
     border: 0;
 }
-.chrw {
-    width: 486px;
-    height: 508px;
-}
-.sy-img {
-    position: absolute;
-    top: 100px;
-    right: 130px;
-}
 /* 特色 .......................................*/
 .ts-worp {
     width: 100%;

+ 0 - 9
frontend/saas-portal-web/static/js/mains.js

@@ -13,20 +13,15 @@ jQuery(window).load(function(){
 /* ========================================================================= */
 
 $(function() {
-
     var Page = (function() {
-
         var $navArrows = $( '#nav-arrows' ),
             $nav = $( '#nav-dots > span' ),
             slitslider = $( '#slider' ).slitslider( {
                 onBeforeChange : function( slide, pos ) {
-
                     $nav.removeClass( 'nav-dot-current' );
                     $nav.eq( pos ).addClass( 'nav-dot-current' );
-
                 }
             } ),
-
             init = function() {
                 initEvents();
             },
@@ -36,7 +31,6 @@ $(function() {
                     slitslider.next();
                     return false;
                 } );
-
                 $navArrows.children( ':first' ).on( 'click', function() {
                     slitslider.previous();
                     return false;
@@ -59,7 +53,6 @@ $(function() {
 });
 
 
-
 $(document).ready(function(){
     /* ========================================================================= */
     /*  Portfolio
@@ -135,8 +128,6 @@ $(document).ready(function(){
     //     $('#home-slider, #slider, .sl-slider, .sl-content-wrapper').css('height',slideHeight);
     // });
 	
-	
-	
 	$("#works, #testimonial").owlCarousel({	 
 		navigation : true,
 		pagination : false,

+ 10 - 0
frontend/saas-web/app/Application.scss

@@ -163,6 +163,16 @@ body.launching {
   }
 }
 
+.x-main-master{
+  .x-btn-wrap{
+    .x-btn-button{
+      .x-btn-inner{
+        color:#999 !important;
+      }
+    }
+  }
+}
+
 .x-keyboard-mode .x-btn-focus.x-btn-default-toolbar-small {
   background: inherit;
   opacity: 1;

+ 14 - 10
frontend/saas-web/app/view/core/query/QueryFormPanel.js

@@ -24,7 +24,7 @@ Ext.define('saas.view.core.query.QueryFormPanel', {
 
     dockedItems: [{
         width:140,
-        height: 40,
+        height: 70,
         xtype: 'toolbar',
         dock: 'right',
         items: [{
@@ -32,23 +32,23 @@ Ext.define('saas.view.core.query.QueryFormPanel', {
             xtype: 'buttongroup',
             cls:'x-query-buttongroup',
             items:[{
-                height:24,
-                width:50,
+                height:32,
+                width:70,
                 style:'min-width: 0px;min-height: 0px;',
                 xtype: 'button',
                 name:'query',
                 text: '查询',
                 handler: 'onQuery',
             },{
-                height:24,
-                style:'margin-left: 2px;min-width: 0px;min-height: 0px;border-color: #fff;background-color: #fff; height: 24px;width: 36px;margin-top: -4px;',
+                style:'min-width: 0px;min-height: 0px;border-color: #fff;background-color: #fff;padding: 0px;margin-top: -1px;margin-left: -2px;',
                 xtype: 'button',
-                iconCls:'x-fa fa-caret-square-o-down',
+                iconCls:'x-btn-show',
                 handler: 'showMore',
                 name:'showMore',
                 tooltip:'更多',
                 listeners:{
                     afterrender:function(b){
+                        var count = window.innerHeight - 110>=800?2:1;
                         var columnWidthCount = 0;
                         var items = b.ownerCt.ownerCt.ownerCt.items.items;
                         Ext.each(items, function(item, index){
@@ -57,7 +57,7 @@ Ext.define('saas.view.core.query.QueryFormPanel', {
                             }
                         });
                         columnWidthCount = Math.ceil(columnWidthCount);
-                        if(columnWidthCount<=1){
+                        if(columnWidthCount<=count){
                             b.hide();
                         }
                     }
@@ -65,17 +65,21 @@ Ext.define('saas.view.core.query.QueryFormPanel', {
             },{
                 name:'hideMore',
                 hidden:true,
-                height:24,
                 tooltip:'隐藏',
-                style:'margin-left: 2px;min-width: 0px;min-height: 0px;border-color: #fff;background-color: #fff; height: 24px;width: 36px;margin-top: -4px;',
+                style:'min-width: 0px;min-height: 0px;border-color: #fff;background-color: #fff;padding: 0px;margin-top: -1px;margin-left: -2px;',
                 xtype: 'button',
-                iconCls:'x-fa fa-caret-square-o-up',
+                iconCls:'x-btn-hide',
                 handler: 'hideMore'
             }]
         },'->']
     }],
 
     listeners: {
+        boxReady:function(form){
+            if(window.innerHeight - 110 >= 800){
+                form.setHeight(112);
+            }
+        },
         beforerender: function(form) {
             // var fiels = form.getForm().getFields();
             // fiels.each(function(f) {

+ 20 - 5
frontend/saas-web/app/view/core/query/QueryPanel.scss

@@ -19,9 +19,9 @@
                                 padding: 6px 0 16px 8px;
 
                                 .x-box-inner {
-                                    height: 36px !important;
+                                    height: 46px !important;
                                     background: #FFFFFF;
-        
+                                    margin-top: -4px;
                                 }
                             }
                         }
@@ -58,7 +58,22 @@
     .x-btn-group-body-default-framed .x-table-layout{
         border-spacing: 2px !important;
     }
-    .x-btn-default-toolbar-small .x-btn-inner-default-toolbar-small{
-        height:24px !important;
-    }
+}
+
+.x-btn-show{
+    height: 32px;
+    width: 32px !important;
+    margin-top: 0px;
+    background: url(../../../../resources/images/default/show.png) 0 0 no-repeat; 
+    background-size: 32px 32px;
+    background-position: center;
+}
+
+.x-btn-hide{
+    height: 32px;
+    width: 32px !important;
+    margin-top: 0px;
+    background: url(../../../../resources/images/default/hide.png) 0 0 no-repeat; 
+    background-size: 32px 32px;
+    background-position: center;
 }

+ 4 - 2
frontend/saas-web/app/view/core/query/QueryPanelController.js

@@ -34,7 +34,8 @@ Ext.define('saas.view.core.query.QueryPanelController', {
             }
         });
         columnWidthCount = Math.ceil(columnWidthCount);
-        if(columnWidthCount>1){
+        var count = window.innerHeight - 110>=800?2:1;
+        if(columnWidthCount>count){
             //展开
             queryForm.animate({dynamic: true, duration: 500, to: {height: (24+42*columnWidthCount)+'px'}})
             queryForm.dockedItems.items[0].down('[name=showMore]').hide();
@@ -48,7 +49,8 @@ Ext.define('saas.view.core.query.QueryPanelController', {
         queryPanel = me.getView(),
         queryForm = queryPanel.down('core-query-queryformpanel');
         //收缩
-        queryForm.animate({dynamic: true, duration: 500, to: {height: '56px'}})
+        var count = window.innerHeight - 110>=800?2:1;
+        queryForm.animate({dynamic: true, duration: 500, to: {height: count*56 + 'px'}})
         queryForm.dockedItems.items[0].down('[name=hideMore]').hide();
         queryForm.dockedItems.items[0].down('[name=showMore]').show();
         var b = queryForm.dockedItems.items[0].down('[name=query]');

+ 6 - 5
frontend/saas-web/app/view/document/kind/ChildForm.js

@@ -278,8 +278,9 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                 listeners:{
                     blur:function(f,a,b,c){
                         var form = f.ownerCt;
-                        form.setLoading(true);
-                        if(f.value&&f.value!=''&&f.isValid()){
+                        if(f.value&&f.value!=''&&f.isValid()&&f._lastCheckValue!=f.value){
+                            form.setLoading(true);
+                            f._lastCheckValue = f.value
                             Ext.Ajax.request({
                                 url: '/api/account/account/checkMobile?mobile='+f.value,
                                 method: 'GET',
@@ -291,10 +292,10 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
                                     form.setLoading(false);
                                     var localJson = Ext.decode(response.responseText);
                                     if(localJson.success){
-                                        if(!localJson.data.hasRegister){
-                                            saas.util.BaseUtil.showSuccessToast('校验成功:手机号未被注册');
+                                        if(localJson.data.hasRegister){
+                                            saas.util.BaseUtil.showSuccessToast('校验成功:手机号已在优软云注册');
                                         }else{
-                                            saas.util.BaseUtil.showErrorToast('校验失败:手机号已被注册');
+                                            saas.util.BaseUtil.showErrorToast('校验失败:手机号未在优软云注册');
                                             f.setValue('');
                                         }
                                     }else{

+ 9 - 5
frontend/saas-web/app/view/stock/inventory/EditDataList.js

@@ -92,7 +92,7 @@ Ext.define('saas.view.stock.inventory.EditDataList', {
         }
     },'->',{
         xtype:'button',
-        text:'保存',
+        text:'保存盘点结果',
         listeners: {
             click:function(b){
                 var me = this.ownerCt.ownerCt;
@@ -101,7 +101,7 @@ Ext.define('saas.view.stock.inventory.EditDataList', {
         }
     },{
         xtype:'button',
-        text:'导出',
+        text:'导出系统库存',
         listeners: {
             click:function(b){
                 var me = this.ownerCt.ownerCt;
@@ -153,13 +153,13 @@ Ext.define('saas.view.stock.inventory.EditDataList', {
     {
         text : "物料类别", 
         dataIndex : "st_prodkind", 
-        width : 150.0, 
+        width : 100.0, 
         xtype : "", 
     },
     {
         text : "单位", 
         dataIndex : "st_produnit", 
-        width : 150.0, 
+        width : 75.0, 
         xtype : "", 
     },
     {
@@ -171,7 +171,8 @@ Ext.define('saas.view.stock.inventory.EditDataList', {
     {
         text : "仓库编号", 
         dataIndex : "st_whcode", 
-        width : 150.0, 
+        width : 0,
+        hidden:true, 
         xtype : "", 
     },
     {
@@ -432,6 +433,9 @@ Ext.define('saas.view.stock.inventory.EditDataList', {
                         initId: intValue
                     });
                 }
+                if(!localJson.data.outData && !localJson.data.inData){
+                    saas.util.BaseUtil.showErrorToast('没有需要生成的盘盈盘亏单');
+                }
             }
         })
         .catch(function(res) {

+ 1 - 1
frontend/saas-web/app/view/stock/make/FormPanelController.js

@@ -100,7 +100,7 @@ Ext.define('saas.view.stock.make.FormPanelController', {
 
         //请求bom资料
         saas.util.BaseUtil.request({
-            url: form._getBomUrl+v,
+            url: form._getBomUrl+'/'+v,
             method: 'GET',
         })
         .then(function(localJson) {

+ 1 - 1
frontend/saas-web/app/view/sys/baseconfig/FormPanel.js

@@ -11,7 +11,7 @@ Ext.define('saas.view.sys.baseconfig.FormPanel', {
     //字段属性
     _idField: 'id',
     _readUrl:'/api/commons/configs/list',
-    _saveUrl:'/api/commons/configs/update',
+    _saveUrl:'/api/commons/configs/save',
 
     //基础属性
     frame:true,

+ 2 - 2
frontend/saas-web/app/view/sys/config/FormPanel.js

@@ -188,9 +188,9 @@ Ext.define('saas.view.sys.config.FormPanel', {
                         },
                         success: function (response, opts) {
                             form.setLoading(false);
-                            saas.util.BaseUtil.showSuccessToast('上传成功');
                             var res = Ext.decode(response.responseText);
                             if(res.success){
+                                saas.util.BaseUtil.showSuccessToast('上传成功');
                                 var data = res.data;
                                 var name = data.name + "  (" + Ext.util.Format.fileSize(data.size) + ")";
                                 myForm.down('[name=signet]').setValue(data.fullPath);
@@ -315,9 +315,9 @@ Ext.define('saas.view.sys.config.FormPanel', {
                         },
                         success: function (response, opts) {
                             form.setLoading(false);
-                            saas.util.BaseUtil.showSuccessToast('上传成功');
                             var res = Ext.decode(response.responseText);
                             if(res.success){
+                                saas.util.BaseUtil.showSuccessToast('上传成功');
                                 var data = res.data;
                                 var name = data.name + "  (" + Ext.util.Format.fileSize(data.size) + ")";
                                 myForm.down('[name=logoUrl]').setValue(data.fullPath);

+ 2 - 2
frontend/saas-web/app/view/sys/guide/FormPanel.js

@@ -115,7 +115,7 @@ Ext.define('saas.view.sys.guide.FormPanel', {
                         '<tpl if="!product">x-guide-mask </tpl>',
                         '"src="resources/images/guide/point.png" style="margin: 2px 0px 0 0;" align ="center" width="16" height="16" >',
                         "<br>",
-                        '<div class="x-guide-line"  height="1"  style="border:1px solid #E4F7FF;margin: -9px 0 0 0;width: 654px !important;" align ="center"></div>',
+                        '<div class="x-guide-line"  height="1"  style="border:1px solid #beecff;margin: -9px 0 0 0;width: 654px !important;" align ="center"></div>',
                     '</div>',
                     '<div class="x-guide-item" align ="center">',
 
@@ -174,7 +174,7 @@ Ext.define('saas.view.sys.guide.FormPanel', {
                         '<tpl if="!begin">x-guide-mask </tpl>',
                         '" src="resources/images/guide/point.png" style="margin: 2px 0px 0 0;" align ="center" width="16" height="16" >',
                         "<br>",
-                        '<div class="x-guide-line"  height="1"  style="border:1px solid #E4F7FF;margin: -9px 0 0 0;width: 654px !important;" align ="center"></div>',
+                        '<div class="x-guide-line"  height="1"  style="border:1px solid #beecff;margin: -9px 0 0 0;width: 654px !important;" align ="center"></div>',
                     '</div>',
                 '</div>',
                 '</tpl>'

BIN
frontend/saas-web/resources/images/default/hide.png


BIN
frontend/saas-web/resources/images/default/show.png


+ 9 - 0
script/mysql/init/auth.sql

@@ -8,4 +8,13 @@ create table `au_authorize_log` (
   client_ip varchar(100) comment '客户端IP',
   user_agent varchar(300) comment 'User Agent',
   login_time datetime comment '登录时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='登录日志';
+
+create table `au_virtual_authorize_log` (
+  id int unsigned primary key not null auto_increment,
+  app_id varchar(30) comment '应用',
+  mobile varchar(20) not null comment '手机号',
+  client_ip varchar(100) comment '客户端IP',
+  user_agent varchar(300) comment 'User Agent',
+  login_time datetime comment '登录时间'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='登录日志';

+ 5 - 1
script/mysql/init/base.sql

@@ -1,3 +1,7 @@
 CREATE USER 'saas'@'%' IDENTIFIED BY 'select111***';
-GRANT All privileges ON 'saas_*'.* TO 'saas'@'%';
+GRANT All privileges ON saas_account.* TO 'saas'@'%' identified by 'select111***' with grant option;
+GRANT All privileges ON saas_auth.* TO 'saas'@'%' identified by 'select111***' with grant option;
+GRANT All privileges ON saas_file.* TO 'saas'@'%' identified by 'select111***' with grant option;
+GRANT All privileges ON saas_mail.* TO 'saas'@'%' identified by 'select111***' with grant option;
+GRANT All privileges ON saas_biz.* TO 'saas'@'%' identified by 'select111***' with grant option;
 flush privileges;

+ 1 - 1
script/mysql/init/mail.sql

@@ -14,7 +14,7 @@ create table `m_log` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='邮件日志';
 
 create table `m_template` (
-  `id` varchar(300) primary key not null,
+  `id` varchar(100) primary key not null,
   `subject` varchar(300) not null comment '主题',
   `text` text comment '内容'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='邮件模板';