@ -1,34 +1,32 @@ |
|||||||
* [首页](/?t=1565916799573) |
* [首页](/?t=1567561041568) |
||||||
* 开发文档 |
* 开发文档 |
||||||
* [快速体验](files/10010_快速体验.md?t=1565916799577) |
* [快速体验](files/10010_快速体验.md?t=1567561041571) |
||||||
* [项目接入到SOP](files/10011_项目接入到SOP.md?t=1565916799596) |
* [项目接入到SOP](files/10011_项目接入到SOP.md?t=1567561041592) |
||||||
* [新增接口](files/10020_新增接口.md?t=1565916799596) |
* [新增接口](files/10020_新增接口.md?t=1567561041592) |
||||||
* [业务参数校验](files/10030_业务参数校验.md?t=1565916799596) |
* [开发流程](files/10021_开发流程.md?t=1567561041592) |
||||||
* [错误处理](files/10040_错误处理.md?t=1565916799596) |
* [业务参数校验](files/10030_业务参数校验.md?t=1567561041592) |
||||||
* [编写文档](files/10041_编写文档.md?t=1565916799596) |
* [错误处理](files/10040_错误处理.md?t=1567561041592) |
||||||
* [接口交互详解](files/10050_接口交互详解.md?t=1565916799597) |
* [编写文档](files/10041_编写文档.md?t=1567561041592) |
||||||
* [easyopen支持](files/10070_easyopen支持.md?t=1565916799597) |
* [接口交互详解](files/10050_接口交互详解.md?t=1567561041593) |
||||||
* [使用签名校验工具](files/10080_使用签名校验工具.md?t=1565916799597) |
* [easyopen支持](files/10070_easyopen支持.md?t=1567561041593) |
||||||
* [ISV管理](files/10085_ISV管理.md?t=1565916799597) |
* [使用签名校验工具](files/10080_使用签名校验工具.md?t=1567561041593) |
||||||
* [自定义路由](files/10086_自定义路由.md?t=1565916799597) |
* [ISV管理](files/10085_ISV管理.md?t=1567561041593) |
||||||
* [自定义返回结果](files/10087_自定义返回结果.md?t=1565916799597) |
* [自定义返回结果](files/10087_自定义返回结果.md?t=1567561041593) |
||||||
* [自定义过滤器](files/10088_自定义过滤器.md?t=1565916799597) |
* [自定义过滤器](files/10088_自定义过滤器.md?t=1567561041593) |
||||||
* [路由授权](files/10090_路由授权.md?t=1565916799598) |
* [路由授权](files/10090_路由授权.md?t=1567561041594) |
||||||
* [接口限流](files/10092_接口限流.md?t=1565916799598) |
* [接口限流](files/10092_接口限流.md?t=1567561041594) |
||||||
* [监控日志](files/10093_监控日志.md?t=1565916799598) |
* [监控日志](files/10093_监控日志.md?t=1567561041594) |
||||||
* [SDK开发](files/10095_SDK开发.md?t=1565916799598) |
* [SDK开发](files/10095_SDK开发.md?t=1567561041594) |
||||||
* [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1565916799598) |
* [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1567561041594) |
||||||
* [应用授权](files/10097_应用授权.md?t=1565916799598) |
* [应用授权](files/10097_应用授权.md?t=1567561041594) |
||||||
* [传统web开发](files/10100_传统web开发.md?t=1565916799598) |
* [传统web开发](files/10100_传统web开发.md?t=1567561041594) |
||||||
* [文件上传](files/10104_文件上传.md?t=1565916799598) |
* [文件上传](files/10104_文件上传.md?t=1567561041594) |
||||||
* [nacos注册中心](files/10106_nacos注册中心.md?t=1565916799599) |
* [配置Sleuth链路追踪](files/10109_配置Sleuth链路追踪.md?t=1567561041594) |
||||||
* [扩展其它注册中心](files/10107_扩展其它注册中心.md?t=1565916799599) |
* [预发布灰度发布](files/10110_预发布灰度发布.md?t=1567561041595) |
||||||
* [配置Sleuth链路追踪](files/10109_配置Sleuth链路追踪.md?t=1565916799599) |
* [动态修改请求参数](files/10111_动态修改请求参数.md?t=1567561041595) |
||||||
* [预发布灰度发布](files/10110_预发布灰度发布.md?t=1565916799599) |
|
||||||
* [动态修改请求参数](files/10111_动态修改请求参数.md?t=1565916799599) |
|
||||||
* 原理分析 |
* 原理分析 |
||||||
* [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1565916799599) |
* [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1567561041595) |
||||||
* [原理分析之路由存储](files/90011_原理分析之路由存储.md?t=1565916799599) |
* [原理分析之如何存储路由](files/90011_原理分析之如何存储路由.md?t=1567561041595) |
||||||
* [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1565916799599) |
* [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1567561041595) |
||||||
* [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1565916799600) |
* [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1567561041595) |
||||||
* [常见问题](files/90100_常见问题.md?t=1565916799600) |
* [常见问题](files/90100_常见问题.md?t=1567561041595) |
||||||
|
@ -1,23 +0,0 @@ |
|||||||
# 自定义路由 |
|
||||||
|
|
||||||
假设有一个非java开发的接口,比如php开发的接口,然后需要接入到SOP,使用接口名版本号进行路由跳转。 |
|
||||||
|
|
||||||
操作方式如下: |
|
||||||
|
|
||||||
- 登录sop-admin,服务管理--路由管理 |
|
||||||
- 新建一个自定义服务:`php-service` |
|
||||||
|
|
||||||
![新建一个自定义服务](images/10086_1.png "10086_1.png") |
|
||||||
|
|
||||||
- 选中php-service,新建一个路由,输入接口名、版本号、uri |
|
||||||
|
|
||||||
![新建一个路由](images/10086_2.png "10086_2.png") |
|
||||||
|
|
||||||
- 请求网关 |
|
||||||
|
|
||||||
`http://localhost:8081/api?method=php.goods.list&version=1.0`会跳转到`http://www.xxx.com/api/listGoods.php` |
|
||||||
|
|
||||||
注意: |
|
||||||
|
|
||||||
- php接口返回数据必须是json格式,返回其它内容可能会调用失败 |
|
||||||
- 只有自定义服务、路由可以删除 |
|
@ -1,90 +0,0 @@ |
|||||||
# nacos注册中心 |
|
||||||
|
|
||||||
使用nacos作为注册中心,源码在`registry-nacos`分支 |
|
||||||
|
|
||||||
这里演示如何将默认的eureka注册中心替换成nacos,步骤如下: |
|
||||||
|
|
||||||
- 准备工作 |
|
||||||
|
|
||||||
1.安装nacos,前往[最新稳定版本](https://github.com/alibaba/nacos/releases),下载最新版nacos |
|
||||||
|
|
||||||
2.启动nacos服务器,cd nacos/bin |
|
||||||
|
|
||||||
Linux/Unix/Mac,启动命令(standalone代表着单机模式运行,非集群模式): |
|
||||||
|
|
||||||
`sh startup.sh -m standalone` |
|
||||||
|
|
||||||
Windows,启动命令: |
|
||||||
|
|
||||||
`cmd startup.cmd` |
|
||||||
|
|
||||||
或者双击startup.cmd运行文件。 |
|
||||||
|
|
||||||
更多访问:https://nacos.io/zh-cn/docs/quick-start.html |
|
||||||
|
|
||||||
- 微服务端修改 |
|
||||||
|
|
||||||
1.修改微服务应用pom,打开`sop-example/sop-story/sop-story-web/pom.xml`,注释eureka服务发现依赖,添加nacos服务发现依赖 |
|
||||||
|
|
||||||
```xml |
|
||||||
<!-- 注册中心【只能用一个,不用的注释掉】 --> |
|
||||||
<!-- 使用eureka注册中心 |
|
||||||
<dependency> |
|
||||||
<groupId>org.springframework.cloud</groupId> |
|
||||||
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> |
|
||||||
</dependency> |
|
||||||
--> |
|
||||||
|
|
||||||
<!-- 使用nacos注册中心 |
|
||||||
版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。 |
|
||||||
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-nacos-discovery |
|
||||||
--> |
|
||||||
<dependency> |
|
||||||
<groupId>org.springframework.cloud</groupId> |
|
||||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> |
|
||||||
<version>0.2.2.RELEASE</version> |
|
||||||
</dependency> |
|
||||||
<!-- 注册中心end --> |
|
||||||
``` |
|
||||||
|
|
||||||
2.yml文件新增nacos配置,并注释掉eureka相关配置 |
|
||||||
|
|
||||||
```yaml |
|
||||||
spring: |
|
||||||
cloud: |
|
||||||
# nacos注册中心,和eureka只能用一个 |
|
||||||
nacos: |
|
||||||
discovery: |
|
||||||
server-addr: 127.0.0.1:8848 |
|
||||||
``` |
|
||||||
|
|
||||||
- 网关修改 |
|
||||||
|
|
||||||
找到`sop-gateway`工程,步骤同上 |
|
||||||
|
|
||||||
- SOP-admin修改 |
|
||||||
|
|
||||||
|
|
||||||
修改yml文件,设置nacos服务器地址,`registry.name`填nacos |
|
||||||
|
|
||||||
```yaml |
|
||||||
# 注册中心地址,根据实际情况改,这里只是参数,并不会去注册 |
|
||||||
registry: |
|
||||||
eureka-server-addr: http://localhost:1111/eureka/ |
|
||||||
# nacos服务器地址 |
|
||||||
nacos-server-addr: 127.0.0.1:8848 |
|
||||||
# 使用eureka,填:eureka,使用nacos填:nacos |
|
||||||
name: nacos |
|
||||||
``` |
|
||||||
|
|
||||||
- website-server修改 |
|
||||||
|
|
||||||
步骤同`SOP-admin修改` |
|
||||||
|
|
||||||
如果要改成consul注册中心,可参照以上步骤。 |
|
||||||
|
|
||||||
- 参考资料 |
|
||||||
|
|
||||||
1.[nacos介绍及安装](https://nacos.io/zh-cn/docs/quick-start.html) |
|
||||||
|
|
||||||
2.[nacos spring cloud注册发现](https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html) |
|
@ -1,112 +0,0 @@ |
|||||||
# 扩展其它注册中心 |
|
||||||
|
|
||||||
**注: nacos注册中心已经实现,本篇以nacos为例介绍如何扩展,如果要改成consul,可按照此方式进行修改** |
|
||||||
|
|
||||||
SOP默认使用eureka注册中心,如果要换成nacos注册中心,步骤如下: |
|
||||||
|
|
||||||
- 实现`com.gitee.sop.registryapi.service.RegistryService`接口 |
|
||||||
|
|
||||||
1.找到`SOP/sop-common/sop-registry-api`工程,在service.impl包下新建一个类,实现RegistryService接口 |
|
||||||
|
|
||||||
```java |
|
||||||
public class RegistryServiceNacos implements RegistryService { |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<ServiceInfo> listAllService(int pageNo, int pageSize) throws Exception { |
|
||||||
// TODO: 返回服务实例 |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void onlineInstance(ServiceInstance serviceInstance) throws Exception { |
|
||||||
// TODO: 实例上线 |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void offlineInstance(ServiceInstance serviceInstance) throws Exception { |
|
||||||
// TODO: 实例下线 |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
2.在`com.gitee.sop.registryapi.config.BaseRegistryConfig`中新增 |
|
||||||
|
|
||||||
```java |
|
||||||
/** |
|
||||||
* 当配置了registry.name=nacos生效 |
|
||||||
* |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@Bean |
|
||||||
@ConditionalOnProperty(prefix = "registry", name = "name", havingValue = "nacos") |
|
||||||
RegistryService registryServiceNacos() { |
|
||||||
return new RegistryServiceNacos(); |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
其中`@ConditionalOnProperty(prefix = "registry", name = "name", havingValue = "nacos")` |
|
||||||
表示`application.properties`配置了`registry.name=nacos`参数才能生效,registry.name=nacos下文会讲到。 |
|
||||||
|
|
||||||
|
|
||||||
- 微服务端修改 |
|
||||||
|
|
||||||
1.修改微服务应用pom.xml,注释eureka服务发现依赖,添加nacos服务发现依赖 |
|
||||||
|
|
||||||
```xml |
|
||||||
<!-- 注册中心【只能用一个,不用的注释掉】 --> |
|
||||||
<!-- 使用eureka注册中心 |
|
||||||
<dependency> |
|
||||||
<groupId>org.springframework.cloud</groupId> |
|
||||||
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> |
|
||||||
</dependency> |
|
||||||
--> |
|
||||||
|
|
||||||
<!-- 使用nacos注册中心 |
|
||||||
版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。 |
|
||||||
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-nacos-discovery |
|
||||||
--> |
|
||||||
<dependency> |
|
||||||
<groupId>org.springframework.cloud</groupId> |
|
||||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> |
|
||||||
<version>0.2.2.RELEASE</version> |
|
||||||
</dependency> |
|
||||||
<!-- 注册中心end --> |
|
||||||
``` |
|
||||||
|
|
||||||
2.yml文件新增nacos配置,并注释掉eureka相关配置 |
|
||||||
|
|
||||||
```yaml |
|
||||||
spring: |
|
||||||
cloud: |
|
||||||
# nacos注册中心,和eureka只能用一个 |
|
||||||
nacos: |
|
||||||
discovery: |
|
||||||
server-addr: 127.0.0.1:8848 |
|
||||||
``` |
|
||||||
|
|
||||||
- 网关修改 |
|
||||||
|
|
||||||
找到`sop-gateway`工程,步骤同上 |
|
||||||
|
|
||||||
- SOP-admin修改 |
|
||||||
|
|
||||||
|
|
||||||
修改yml文件,新增nacos服务器地址,`registry.name`填nacos |
|
||||||
|
|
||||||
```yaml |
|
||||||
# 注册中心地址,根据实际情况改,这里只是参数,并不会去注册 |
|
||||||
registry: |
|
||||||
# 使用eureka,填:eureka,使用nacos填:nacos |
|
||||||
name: nacos |
|
||||||
eureka-server-addr: http://localhost:1111/eureka/ |
|
||||||
nacos-server-addr: 127.0.0.1:8848 |
|
||||||
``` |
|
||||||
|
|
||||||
- website-server修改 |
|
||||||
|
|
||||||
步骤同`SOP-admin修改` |
|
||||||
|
|
||||||
- 参考资料 |
|
||||||
|
|
||||||
1.[nacos介绍及安装](https://nacos.io/zh-cn/docs/quick-start.html) |
|
||||||
|
|
||||||
2.[nacos spring cloud注册发现](https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html) |
|
@ -1,25 +0,0 @@ |
|||||||
# 原理分析之路由存储 |
|
||||||
|
|
||||||
SOP将路由信息存到了zookeeper当中,服务在启动时,将自己的路由信息上传到zookeeper中。 |
|
||||||
网关监听存放路由的节点,动态更新到本地。 |
|
||||||
|
|
||||||
zookeeper存储路由的结构如下: |
|
||||||
|
|
||||||
```xml |
|
||||||
/com.gitee.sop.route 根节点 |
|
||||||
/serviceId 服务节点,名字为服务名 |
|
||||||
/route1 路由节点,名字为:name+version,存放路由信息 |
|
||||||
/route2 |
|
||||||
/... |
|
||||||
``` |
|
||||||
|
|
||||||
服务启动时,创建`/serviceId`节点,然后遍历创建`/routeN`节点 |
|
||||||
|
|
||||||
同时,网关监听`服务节点`和`路由节点`,当有新服务加入时,网关会获取到新加入的路由节点信息, |
|
||||||
同时路由节点下面的子节点也会被监听到。后续子节点的增删改都会被网关监听到,然后更新到本地。 |
|
||||||
|
|
||||||
服务上传路由相关代码在`com.gitee.sop.servercommon.manager.ServiceZookeeperApiMetaManager`类中 |
|
||||||
|
|
||||||
网关监听相关代码在`com.gitee.sop.gatewaycommon.manager.BaseRouteManager`中 |
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@ |
|||||||
DROP TABLE IF EXISTS `config_common`; |
|
||||||
|
|
||||||
CREATE TABLE `config_common` ( |
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
||||||
`config_group` varchar(64) NOT NULL DEFAULT '' COMMENT '配置分组', |
|
||||||
`config_key` varchar(64) NOT NULL DEFAULT '' COMMENT '配置key', |
|
||||||
`content` varchar(128) NOT NULL DEFAULT '' COMMENT '内容', |
|
||||||
`remark` varchar(128) DEFAULT NULL COMMENT '备注', |
|
||||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
||||||
PRIMARY KEY (`id`), |
|
||||||
UNIQUE KEY `uk_groupkey` (`config_group`,`config_key`) USING BTREE |
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='通用配置表'; |
|
@ -1,20 +0,0 @@ |
|||||||
DROP TABLE IF EXISTS `isv_keys`; |
|
||||||
|
|
||||||
CREATE TABLE `isv_keys` ( |
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
||||||
`app_key` varchar(128) NOT NULL DEFAULT '应用id(交给开发者)', |
|
||||||
`sign_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1:RSA2,2:MD5', |
|
||||||
`secret` varchar(200) NOT NULL DEFAULT '' COMMENT 'sign_type=2时使用', |
|
||||||
`key_format` tinyint(4) NOT NULL DEFAULT '1' COMMENT '秘钥格式,1:PKCS8(JAVA适用),2:PKCS1(非JAVA适用)', |
|
||||||
`public_key_isv` text NOT NULL COMMENT '开发者生成的公钥', |
|
||||||
`private_key_isv` text NOT NULL COMMENT '开发者生成的私钥(交给开发者)', |
|
||||||
`public_key_platform` text NOT NULL COMMENT '平台生成的公钥(交给开发者)', |
|
||||||
`private_key_platform` text NOT NULL COMMENT '平台生成的私钥', |
|
||||||
`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, |
|
||||||
`gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
||||||
PRIMARY KEY (`id`), |
|
||||||
UNIQUE KEY `uk_appkey` (`app_key`) USING BTREE |
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ISV秘钥'; |
|
||||||
|
|
||||||
INSERT INTO `sop`.`isv_keys` (`app_key`,`sign_type`, `secret`,`key_format`, `public_key_isv`, `private_key_isv`, `public_key_platform`, `private_key_platform`) |
|
||||||
select app_key, sign_type, secret, 1, pub_key,pri_key,'','' from isv_info; |
|
@ -1,2 +0,0 @@ |
|||||||
ALTER TABLE `sop`.`isv_info` ADD COLUMN `remark` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注' AFTER `sign_type`; |
|
||||||
|
|
@ -1,11 +0,0 @@ |
|||||||
use sop; |
|
||||||
|
|
||||||
CREATE TABLE `config_ip_blacklist` ( |
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
||||||
`ip` varchar(64) NOT NULL DEFAULT '' COMMENT 'ip', |
|
||||||
`remark` varchar(128) DEFAULT NULL COMMENT '备注', |
|
||||||
`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, |
|
||||||
`gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
||||||
PRIMARY KEY (`id`), |
|
||||||
UNIQUE KEY `uk_ip` (`ip`) USING BTREE |
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='IP黑名单'; |
|
@ -1,25 +0,0 @@ |
|||||||
use sop; |
|
||||||
|
|
||||||
CREATE TABLE `config_gray` ( |
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
||||||
`service_id` varchar(64) NOT NULL DEFAULT '', |
|
||||||
`user_key_content` text COMMENT '用户key,多个用引文逗号隔开', |
|
||||||
`name_version_content` text COMMENT '需要灰度的接口,goods.get1.0=1.2,多个用英文逗号隔开', |
|
||||||
`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, |
|
||||||
`gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
||||||
PRIMARY KEY (`id`), |
|
||||||
UNIQUE KEY `uk_serviceid` (`service_id`) USING BTREE |
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='服务灰度配置'; |
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE `config_gray_instance` ( |
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
||||||
`instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'instance_id', |
|
||||||
`service_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'service_id', |
|
||||||
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:禁用,1:启用', |
|
||||||
`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, |
|
||||||
`gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
||||||
PRIMARY KEY (`id`), |
|
||||||
UNIQUE KEY `uk_instanceid` (`instance_id`) USING BTREE, |
|
||||||
KEY `idx_serviceid` (`service_id`) USING BTREE |
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='开启灰度服务器实例'; |
|
@ -1,3 +0,0 @@ |
|||||||
ALTER TABLE `sop`.`isv_info` ADD COLUMN `sign_type` TINYINT NOT NULL DEFAULT 1 COMMENT '签名类型,1:RSA2,2:MD5' AFTER `status`; |
|
||||||
|
|
||||||
update isv_info set sign_type=2 where secret <> ''; |
|
@ -1,16 +0,0 @@ |
|||||||
DROP TABLE IF EXISTS `user_info`; |
|
||||||
|
|
||||||
CREATE TABLE `user_info` ( |
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
||||||
`username` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', |
|
||||||
`password` varchar(128) NOT NULL DEFAULT '' COMMENT '密码', |
|
||||||
`nickname` varchar(64) NOT NULL DEFAULT '' COMMENT '昵称', |
|
||||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
||||||
PRIMARY KEY (`id`), |
|
||||||
KEY `idx_unamepwd` (`username`,`password`) USING BTREE |
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表'; |
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO `user_info` ( `username`, `password`, `nickname`, `gmt_create`, `gmt_modified`) VALUES |
|
||||||
('zhangsan','123456','张三','2019-04-27 08:32:57','2019-04-27 08:32:57'); |
|
@ -1,32 +0,0 @@ |
|||||||
|
|
||||||
DROP TABLE IF EXISTS `config_limit`; |
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE `config_limit` ( |
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
||||||
`route_id` varchar(128) DEFAULT NULL COMMENT '路由id', |
|
||||||
`app_key` varchar(128) DEFAULT NULL, |
|
||||||
`limit_ip` varchar(300) DEFAULT NULL COMMENT '限流ip,多个用英文逗号隔开', |
|
||||||
`service_id` varchar(64) NOT NULL DEFAULT '' COMMENT '服务id', |
|
||||||
`limit_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '限流策略,1:漏桶策略,2:令牌桶策略', |
|
||||||
`exec_count_per_second` int(11) DEFAULT NULL COMMENT '每秒可处理请求数', |
|
||||||
`limit_code` varchar(64) DEFAULT NULL COMMENT '返回的错误码', |
|
||||||
`limit_msg` varchar(100) DEFAULT NULL COMMENT '返回的错误信息', |
|
||||||
`token_bucket_count` int(11) DEFAULT NULL COMMENT '令牌桶容量', |
|
||||||
`limit_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '限流开启状态,1:开启,0关闭', |
|
||||||
`order_index` int(11) NOT NULL DEFAULT '0' COMMENT '顺序,值小的优先执行', |
|
||||||
`remark` varchar(128) DEFAULT NULL COMMENT '备注', |
|
||||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
|
||||||
PRIMARY KEY (`id`) |
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='限流配置'; |
|
||||||
|
|
||||||
INSERT INTO `config_limit` (`id`, `route_id`, `app_key`, `limit_ip`, `service_id`, `limit_type`, `exec_count_per_second`, `limit_code`, `limit_msg`, `token_bucket_count`, `limit_status`, `order_index`, `remark`, `gmt_create`, `gmt_modified`) VALUES |
|
||||||
(1,'alipay.story.get1.0','','192.168.1.1,172.2.2.3','story-service',2,5,'','',6,1,3,NULL,'2019-05-17 19:21:35','2019-05-21 09:12:15'), |
|
||||||
(2,'alipay.story.get1.0','2019032617262200001','','story-service',1,5,'service-budy','服务器忙',5,1,0,NULL,'2019-05-17 19:39:30','2019-05-21 15:36:52'), |
|
||||||
(3,'alipay.story.find1.0','20190331562013861008375808','','story-service',1,3,'service-busy','服务器忙',5,1,1,NULL,'2019-05-17 20:20:32','2019-05-20 17:40:17'), |
|
||||||
(4,'alipay.story.get1.2','','','story-service',2,5,'','',3,1,1,NULL,'2019-05-20 16:27:21','2019-05-21 15:53:10'), |
|
||||||
(5,'','20190401562373796095328256','','story-service',1,5,'service-busy','服务器忙',5,1,0,'这个appKey调用很频繁,重点照顾','2019-05-21 15:48:08','2019-05-21 18:45:32'), |
|
||||||
(6,'','','10.1.30.54','story-service',1,5,'service-busy','服务器忙',5,1,0,'这个ip在攻击我们','2019-05-21 15:55:33','2019-05-21 18:17:29'), |
|
||||||
(7,'story.get1.1','','10.1.30.54','story-service',1,5,'service-busy','服务器忙',5,1,0,NULL,'2019-05-21 16:30:48','2019-05-21 16:30:48'), |
|
||||||
(8,'','20190513577548661718777857','10.1.30.54','story-service',1,5,'service-busy','服务器忙',5,1,0,NULL,'2019-05-21 17:10:45','2019-05-21 17:10:52'); |
|
@ -1,5 +1,5 @@ |
|||||||
# 后台admin |
# 后台admin |
||||||
|
|
||||||
- sop-admin-front: admin前端layui实现(停止维护,改用sop-admin-vue) |
- sop-admin-server: admin服务端,使用方式见readme.md |
||||||
- sop-admin-server: admin服务端 |
|
||||||
- sop-admin-vue: admin前端vue实现 |
- sop-admin-vue: admin前端vue实现 |
||||||
|
|
||||||
|
@ -1,23 +0,0 @@ |
|||||||
# admin前端页面(停止维护,改用sop-admin-vue) |
|
||||||
|
|
||||||
做到前后端分离。 |
|
||||||
|
|
||||||
当然也可以不分离,直接把前端页面放入到server中。这样做的好处是启动服务器即可访问页面。 |
|
||||||
|
|
||||||
步骤如下: |
|
||||||
|
|
||||||
- cd到sop-admin-front目录,执行命令`mvn clean install` |
|
||||||
- sop-admin-server工程添加maven依赖 |
|
||||||
|
|
||||||
``` |
|
||||||
<dependency> |
|
||||||
<groupId>com.gitee.sop</groupId> |
|
||||||
<artifactId>sop-admin-front</artifactId> |
|
||||||
<version>1.0.0-SNAPSHOT</version> |
|
||||||
</dependency> |
|
||||||
``` |
|
||||||
|
|
||||||
启动服务端,访问:http://localhost:8082 |
|
||||||
|
|
||||||
原理就是springboot访问webjars资源,建议在开发的时候前后端分离,开发完成后再打包成webjars。 |
|
||||||
|
|
@ -1,16 +0,0 @@ |
|||||||
@font-face { |
|
||||||
font-family: 'iconfont'; |
|
||||||
src: url('../fonts/iconfont.eot'); |
|
||||||
src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'), |
|
||||||
url('../fonts/iconfont.woff') format('woff'), |
|
||||||
url('../fonts/iconfont.ttf') format('truetype'), |
|
||||||
url('../fonts/iconfont.svg#iconfont') format('svg'); |
|
||||||
} |
|
||||||
.iconfont{ |
|
||||||
font-family:"iconfont" !important; |
|
||||||
font-size:16px;font-style:normal; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-webkit-text-stroke-width: 0.2px; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
} |
|
||||||
|
|
@ -1,680 +0,0 @@ |
|||||||
@charset "utf-8"; |
|
||||||
@import url(../lib/layui/css/layui.css); |
|
||||||
*{ |
|
||||||
margin: 0px; |
|
||||||
padding: 0px; |
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; |
|
||||||
} |
|
||||||
a{ |
|
||||||
text-decoration: none; |
|
||||||
} |
|
||||||
html{ |
|
||||||
width: 100%; |
|
||||||
height: 100%; |
|
||||||
overflow-x:hidden; |
|
||||||
overflow-y:auto; |
|
||||||
} |
|
||||||
body{ |
|
||||||
width: 100%; |
|
||||||
min-height: 100%; |
|
||||||
} |
|
||||||
.login-bg{ |
|
||||||
/*background: #eeeeee url() 0 0 no-repeat;*/ |
|
||||||
background:url(../images/bg.png) no-repeat center; |
|
||||||
background-size: cover; |
|
||||||
overflow: hidden; |
|
||||||
} |
|
||||||
.login{ |
|
||||||
margin: 120px auto 0 auto; |
|
||||||
min-height: 420px; |
|
||||||
max-width: 420px; |
|
||||||
padding: 40px; |
|
||||||
background-color: #ffffff; |
|
||||||
margin-left: auto; |
|
||||||
margin-right: auto; |
|
||||||
border-radius: 4px; |
|
||||||
/* overflow-x: hidden; */ |
|
||||||
box-sizing: border-box; |
|
||||||
} |
|
||||||
.login a.logo{ |
|
||||||
display: block; |
|
||||||
height: 58px; |
|
||||||
width: 167px; |
|
||||||
margin: 0 auto 30px auto; |
|
||||||
background-size: 167px 42px; |
|
||||||
} |
|
||||||
.login .message { |
|
||||||
margin: 10px 0 0 -58px; |
|
||||||
padding: 18px 10px 18px 60px; |
|
||||||
background: #189F92; |
|
||||||
position: relative; |
|
||||||
color: #fff; |
|
||||||
font-size: 16px; |
|
||||||
} |
|
||||||
.login #darkbannerwrap { |
|
||||||
background: url(../images/aiwrap.png); |
|
||||||
width: 18px; |
|
||||||
height: 10px; |
|
||||||
margin: 0 0 20px -58px; |
|
||||||
position: relative; |
|
||||||
} |
|
||||||
|
|
||||||
.login input[type=text], |
|
||||||
.login input[type=file], |
|
||||||
.login input[type=password], |
|
||||||
.login input[type=email], select { |
|
||||||
border: 1px solid #DCDEE0; |
|
||||||
vertical-align: middle; |
|
||||||
border-radius: 3px; |
|
||||||
height: 50px; |
|
||||||
padding: 0px 16px; |
|
||||||
font-size: 14px; |
|
||||||
color: #555555; |
|
||||||
outline:none; |
|
||||||
width:100%; |
|
||||||
box-sizing: border-box; |
|
||||||
} |
|
||||||
.login input[type=text]:focus, |
|
||||||
.login input[type=file]:focus, |
|
||||||
.login input[type=password]:focus, |
|
||||||
.login input[type=email]:focus, select:focus { |
|
||||||
border: 1px solid #27A9E3; |
|
||||||
} |
|
||||||
.login input[type=submit], |
|
||||||
.login input[type=button]{ |
|
||||||
display: inline-block; |
|
||||||
vertical-align: middle; |
|
||||||
padding: 12px 24px; |
|
||||||
margin: 0px; |
|
||||||
font-size: 18px; |
|
||||||
line-height: 24px; |
|
||||||
text-align: center; |
|
||||||
white-space: nowrap; |
|
||||||
vertical-align: middle; |
|
||||||
cursor: pointer; |
|
||||||
color: #ffffff; |
|
||||||
background-color: #189F92; |
|
||||||
border-radius: 3px; |
|
||||||
border: none; |
|
||||||
-webkit-appearance: none; |
|
||||||
outline:none; |
|
||||||
width:100%; |
|
||||||
} |
|
||||||
.login hr { |
|
||||||
background: #fff 0 0 no-repeat; |
|
||||||
} |
|
||||||
.login hr.hr15 { |
|
||||||
height: 15px; |
|
||||||
border: none; |
|
||||||
margin: 0px; |
|
||||||
padding: 0px; |
|
||||||
width: 100%; |
|
||||||
} |
|
||||||
.login hr.hr20 { |
|
||||||
height: 20px; |
|
||||||
border: none; |
|
||||||
margin: 0px; |
|
||||||
padding: 0px; |
|
||||||
width: 100%; |
|
||||||
} |
|
||||||
.x-body{ |
|
||||||
padding: 10px; |
|
||||||
} |
|
||||||
.x-nav{ |
|
||||||
padding: 0 20px; |
|
||||||
position: relative; |
|
||||||
z-index: 99; |
|
||||||
border-bottom: 1px solid #e5e5e5; |
|
||||||
line-height: 39px; |
|
||||||
height: 37px; |
|
||||||
overflow: hidden; |
|
||||||
} |
|
||||||
xblock{ |
|
||||||
display: block; |
|
||||||
margin-bottom: 10px; |
|
||||||
padding: 5px; |
|
||||||
line-height: 22px; |
|
||||||
/* border-left: 5px solid #009688; */ |
|
||||||
border-radius: 0 2px 2px 0; |
|
||||||
background-color: #f2f2f2; |
|
||||||
} |
|
||||||
.x-right{ |
|
||||||
float: right; |
|
||||||
} |
|
||||||
.x-so{ |
|
||||||
/*text-align: center;*/ |
|
||||||
/*background: #f2f2f2 url() 0 0 no-repeat;*/ |
|
||||||
margin-bottom: 20px; |
|
||||||
} |
|
||||||
.x-so input.layui-input{ |
|
||||||
width: 150px; |
|
||||||
} |
|
||||||
.x-so .layui-form-label{ |
|
||||||
display: inline-block; |
|
||||||
} |
|
||||||
.x-so input.layui-input,.x-so input.layui-btn{ |
|
||||||
display: inline-block; |
|
||||||
} |
|
||||||
.x-red{ |
|
||||||
color: red; |
|
||||||
} |
|
||||||
.x-green{ |
|
||||||
color: green; |
|
||||||
} |
|
||||||
.x-yellow{ |
|
||||||
color: #ffae19; |
|
||||||
} |
|
||||||
.x-a{ |
|
||||||
color: #1AA093; |
|
||||||
} |
|
||||||
.x-a:hover{ |
|
||||||
color: #127F74; |
|
||||||
} |
|
||||||
.x-sort{ |
|
||||||
height: 30px; |
|
||||||
} |
|
||||||
.x-show{ |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
.layui-form-switch{ |
|
||||||
margin-top: 0px; |
|
||||||
} |
|
||||||
.layui-input:focus, .layui-textarea:focus { |
|
||||||
border-color: #189f92!important; |
|
||||||
} |
|
||||||
|
|
||||||
.page{ |
|
||||||
margin-top: 20px; |
|
||||||
text-align: center; |
|
||||||
|
|
||||||
} |
|
||||||
.page a{ |
|
||||||
display: inline-block; |
|
||||||
background: #fff 0 0 no-repeat; |
|
||||||
color: #888; |
|
||||||
padding: 10px; |
|
||||||
min-width: 15px; |
|
||||||
border: 1px solid #E2E2E2; |
|
||||||
|
|
||||||
} |
|
||||||
.page span{ |
|
||||||
display: inline-block; |
|
||||||
padding: 10px; |
|
||||||
min-width: 15px; |
|
||||||
border: 1px solid #E2E2E2; |
|
||||||
} |
|
||||||
.page span.current{ |
|
||||||
display: inline-block; |
|
||||||
background: #009688 0 0 no-repeat; |
|
||||||
color: #fff; |
|
||||||
padding: 10px; |
|
||||||
min-width: 15px; |
|
||||||
border: 1px solid #009688; |
|
||||||
} |
|
||||||
.page .pagination li{ |
|
||||||
display: inline-block; |
|
||||||
margin-right: 5px; |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
.page .pagination li.active span{ |
|
||||||
background: #009688 0 0 no-repeat; |
|
||||||
color: #fff; |
|
||||||
border: 1px solid #009688; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/*登录样式*/ |
|
||||||
/*头部*/ |
|
||||||
.container{ |
|
||||||
width: 100%; |
|
||||||
height: 45px; |
|
||||||
background-color: #222; |
|
||||||
border-bottom: 1px solid rgba(255, 255, 255, 0.2); |
|
||||||
} |
|
||||||
.container .logo a{ |
|
||||||
float: left; |
|
||||||
color: #fff; |
|
||||||
font-size: 18px; |
|
||||||
padding-left: 20px; |
|
||||||
line-height: 45px; |
|
||||||
width: 200px; |
|
||||||
} |
|
||||||
.container .right{ |
|
||||||
background-color:rgba(0,0,0,0); |
|
||||||
float: right; |
|
||||||
|
|
||||||
} |
|
||||||
.container .left_open{ |
|
||||||
height: 45px; |
|
||||||
float: left; |
|
||||||
} |
|
||||||
.container .left_open i{ |
|
||||||
display: block; |
|
||||||
background: rgba(255,255,255,0.1) 0 0 no-repeat; |
|
||||||
color: #fff; |
|
||||||
width: 32px; |
|
||||||
height: 32px; |
|
||||||
line-height: 32px; |
|
||||||
border-radius: 3px; |
|
||||||
text-align: center; |
|
||||||
margin-top: 7px; |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
.container .left_open i:hover{ |
|
||||||
background: rgba(255,255,255,0.3) 0 0 no-repeat; |
|
||||||
} |
|
||||||
|
|
||||||
.container .left{ |
|
||||||
background-color:rgba(0,0,0,0); |
|
||||||
float: left; |
|
||||||
|
|
||||||
} |
|
||||||
.container .layui-nav-item{ |
|
||||||
line-height: 45px; |
|
||||||
} |
|
||||||
.container .layui-nav-more{ |
|
||||||
top: 20px; |
|
||||||
} |
|
||||||
.container .layui-nav-child{ |
|
||||||
top: 50px; |
|
||||||
} |
|
||||||
.container .layui-nav-child i{ |
|
||||||
margin-right: 10px; |
|
||||||
} |
|
||||||
.layui-nav .layui-nav-item a{ |
|
||||||
color: #fff; |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
.layui-nav .layui-nav-child a{ |
|
||||||
color: #333; |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
.left-nav{ |
|
||||||
position: absolute; |
|
||||||
top: 46px; |
|
||||||
bottom: 42px; |
|
||||||
left: 0; |
|
||||||
z-index: 2; |
|
||||||
/*padding-top: 1px;*/ |
|
||||||
background-color: #EEEEEE; |
|
||||||
width: 220px; |
|
||||||
max-width: 220px; |
|
||||||
overflow: auto; |
|
||||||
overflow-x:hidden; |
|
||||||
border-right: 1px solid #e5e5e5; |
|
||||||
|
|
||||||
/*width: 0px;*/ |
|
||||||
} |
|
||||||
.left-nav #nav li{ |
|
||||||
border-bottom: 1px solid #e5e5e5; |
|
||||||
} |
|
||||||
.left-nav #nav li:hover > a{ |
|
||||||
/*color: blue;*/ |
|
||||||
} |
|
||||||
.left-nav #nav .current{ |
|
||||||
background-color: rgba(0, 0, 0, 0.3); |
|
||||||
} |
|
||||||
.left-nav #nav li a{ |
|
||||||
font-size: 14px; |
|
||||||
padding: 10px 15px 10px 20px; |
|
||||||
display: block; |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
.left-nav #nav li a cite{ |
|
||||||
font-size: 14px; |
|
||||||
} |
|
||||||
|
|
||||||
.left-nav #nav li .sub-menu{ |
|
||||||
display: block; |
|
||||||
} |
|
||||||
.left-nav #nav li .opened{ |
|
||||||
display: block; |
|
||||||
} |
|
||||||
.left-nav #nav li .opened:hover{ |
|
||||||
/*background: #fff url() 0 0 no-repeat;*/ |
|
||||||
} |
|
||||||
.left-nav #nav li .opened .current{ |
|
||||||
|
|
||||||
} |
|
||||||
.left-nav #nav li .sub-menu li:hover{ |
|
||||||
/*color: blue;*/ |
|
||||||
/*background: #fff url() 0 0 no-repeat;*/ |
|
||||||
} |
|
||||||
.left-nav #nav li .sub-menu li a{ |
|
||||||
padding: 12px 15px 12px 30px; |
|
||||||
font-size: 14px; |
|
||||||
cursor: pointer; |
|
||||||
} |
|
||||||
.left-nav #nav li .sub-menu li .sub-menu li a{ |
|
||||||
padding-left: 45px; |
|
||||||
} |
|
||||||
.left-nav #nav li .sub-menu li a:hover{ |
|
||||||
color: #148cf1; |
|
||||||
} |
|
||||||
.left-nav #nav li .sub-menu li a i{ |
|
||||||
font-size: 12px; |
|
||||||
margin-left: 8px; |
|
||||||
} |
|
||||||
.left-nav #nav li a i{ |
|
||||||
/*padding-right: 10px;*/ |
|
||||||
line-height: 14px; |
|
||||||
} |
|
||||||
.left-nav #nav li .nav_right{ |
|
||||||
float: right; |
|
||||||
font-size: 16px; |
|
||||||
} |
|
||||||
.left-nav #nav li.active { |
|
||||||
background: #ddd; |
|
||||||
} |
|
||||||
.left-nav #nav li.active a { |
|
||||||
color: #148cf1; |
|
||||||
} |
|
||||||
|
|
||||||
.x-slide_left { |
|
||||||
width: 17px; |
|
||||||
height: 61px; |
|
||||||
position: absolute; |
|
||||||
top: 200px; |
|
||||||
left: 221px; |
|
||||||
cursor: pointer; |
|
||||||
z-index: 3; |
|
||||||
} |
|
||||||
.page-content{ |
|
||||||
position: absolute; |
|
||||||
top: 46px; |
|
||||||
right: 0; |
|
||||||
bottom: 42px; |
|
||||||
left: 221px; |
|
||||||
overflow: hidden; |
|
||||||
z-index: 1; |
|
||||||
} |
|
||||||
.page-content-bg{ |
|
||||||
position: absolute; |
|
||||||
top: 46px; |
|
||||||
right: 0; |
|
||||||
bottom: 42px; |
|
||||||
left: 221px; |
|
||||||
background: rgba(0,0,0,0.5); url() 0 0 no-repeat; |
|
||||||
overflow: hidden; |
|
||||||
z-index: 100; |
|
||||||
display: none; |
|
||||||
} |
|
||||||
|
|
||||||
.page-content .tab{ |
|
||||||
height: 100%; |
|
||||||
width: 100%; |
|
||||||
background: #EFEEF0 0 0 no-repeat; |
|
||||||
margin: 0px; |
|
||||||
} |
|
||||||
.page-content .layui-tab-title{ |
|
||||||
/*padding-top: 5px;*/ |
|
||||||
height: 35px; |
|
||||||
background: #EFEEF0 0 0 no-repeat; |
|
||||||
position: relative; |
|
||||||
z-index: 100; |
|
||||||
} |
|
||||||
.page-content .layui-tab-title li.home i{ |
|
||||||
padding-right: 5px; |
|
||||||
} |
|
||||||
.page-content .layui-tab-title li.home .layui-tab-close{ |
|
||||||
display: none; |
|
||||||
} |
|
||||||
.page-content .layui-tab-title li{ |
|
||||||
line-height: 35px; |
|
||||||
} |
|
||||||
.page-content .layui-tab-title .layui-this:after{ |
|
||||||
height: 36px; |
|
||||||
} |
|
||||||
.page-content .layui-tab-title li .layui-tab-close{ |
|
||||||
border-radius: 50%; |
|
||||||
} |
|
||||||
.page-content .layui-tab-title .layui-this{ |
|
||||||
background: #fff 0 0 no-repeat; |
|
||||||
} |
|
||||||
.page-content .layui-tab-bar{ |
|
||||||
height:34px; |
|
||||||
line-height: 35px; |
|
||||||
} |
|
||||||
.page-content .layui-tab-content{ |
|
||||||
position: absolute; |
|
||||||
top: 36px; |
|
||||||
bottom: 0px; |
|
||||||
width: 100%; |
|
||||||
background: #fff 0 0 no-repeat; |
|
||||||
padding: 0px; |
|
||||||
overflow: hidden; |
|
||||||
} |
|
||||||
.page-content .layui-tab-content .layui-tab-item{ |
|
||||||
width: 100%; |
|
||||||
height: 100%; |
|
||||||
|
|
||||||
} |
|
||||||
.page-content .layui-tab-content .layui-tab-item iframe{ |
|
||||||
width: 100%; |
|
||||||
height: 100%; |
|
||||||
|
|
||||||
} |
|
||||||
.x-admin-carousel,.layui-carousel,.x-admin-carousel>[carousel-item]>* { |
|
||||||
background-color:#fff |
|
||||||
} |
|
||||||
|
|
||||||
.x-admin-backlog .x-admin-backlog-body { |
|
||||||
display:block; |
|
||||||
padding:10px 15px; |
|
||||||
background-color:#f8f8f8; |
|
||||||
color:#999; |
|
||||||
border-radius:2px; |
|
||||||
transition:all .3s; |
|
||||||
-webkit-transition:all .3s |
|
||||||
} |
|
||||||
.x-admin-backlog-body h3 { |
|
||||||
padding-bottom:10px; |
|
||||||
font-size:12px |
|
||||||
} |
|
||||||
.x-admin-backlog-body p cite { |
|
||||||
font-style:normal; |
|
||||||
font-size:30px; |
|
||||||
font-weight:300; |
|
||||||
color:#009688 |
|
||||||
} |
|
||||||
.x-admin-backlog-body:hover { |
|
||||||
background-color:#CFCFCF; |
|
||||||
color:#888 |
|
||||||
} |
|
||||||
|
|
||||||
.welcome-footer{padding: 30px 0; line-height: 30px; text-align: center; background-color: #eee; color: #666; font-weight: 300;} |
|
||||||
body .layui-layout-admin .footer-demo{height: auto; padding: 15px 0; line-height: 26px;} |
|
||||||
.welcome-footer a{padding: 0 5px;} |
|
||||||
|
|
||||||
table th, table td { |
|
||||||
word-break: break-all; |
|
||||||
} |
|
||||||
|
|
||||||
.footer{ |
|
||||||
position: fixed; |
|
||||||
bottom: 0px; |
|
||||||
width: 100%; |
|
||||||
background-color: #222; |
|
||||||
border-top: 1px solid rgba(255, 255, 255, 0.2); |
|
||||||
line-height: 41px; |
|
||||||
color: #fff; |
|
||||||
/*padding-left: 10px;*/ |
|
||||||
} |
|
||||||
.footer .copyright{ |
|
||||||
margin-left: 10px; |
|
||||||
} |
|
||||||
|
|
||||||
/*404页面样式*/ |
|
||||||
.fly-panel { |
|
||||||
margin-bottom: 15px; |
|
||||||
border-radius: 2px; |
|
||||||
background-color: #fff; |
|
||||||
box-shadow: 0 1px 2px 0 rgba(0,0,0,.05); |
|
||||||
} |
|
||||||
.fly-none { |
|
||||||
min-height: 600px; |
|
||||||
text-align: center; |
|
||||||
padding-top: 50px; |
|
||||||
color: #999; |
|
||||||
} |
|
||||||
.fly-none .layui-icon { |
|
||||||
line-height: 300px; |
|
||||||
font-size: 300px; |
|
||||||
color: #393D49; |
|
||||||
} |
|
||||||
.fly-none p { |
|
||||||
margin-top: 50px; |
|
||||||
padding: 0 15px; |
|
||||||
font-size: 20px; |
|
||||||
color: #999; |
|
||||||
font-weight: 300; |
|
||||||
} |
|
||||||
#tab_right{ |
|
||||||
display: none; |
|
||||||
width: 80px; |
|
||||||
position: absolute; |
|
||||||
top: 35px; |
|
||||||
left: 0px; |
|
||||||
} |
|
||||||
#tab_right dl{ |
|
||||||
top: 0px; |
|
||||||
} |
|
||||||
#tab_show{ |
|
||||||
position: absolute; |
|
||||||
top: 36px; |
|
||||||
bottom: 0px; |
|
||||||
width: 100%; |
|
||||||
background:rgb(255, 255, 255); |
|
||||||
padding: 0px; |
|
||||||
overflow: hidden; |
|
||||||
display: none; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@media screen and (max-width: 768px){ |
|
||||||
.fast-add{ |
|
||||||
display: none; |
|
||||||
} |
|
||||||
.layui-nav .to-index{ |
|
||||||
display: none; |
|
||||||
} |
|
||||||
.container .logo a{ |
|
||||||
width: 140px; |
|
||||||
} |
|
||||||
.container .left_open { |
|
||||||
/*float: right;*/ |
|
||||||
} |
|
||||||
.left-nav{ |
|
||||||
left: -221px; |
|
||||||
} |
|
||||||
.page-content{ |
|
||||||
left: 0px; |
|
||||||
} |
|
||||||
.page-content .layui-tab-content .layui-tab-item{ |
|
||||||
-webkit-overflow-scrolling: touch; |
|
||||||
overflow-y: scroll; |
|
||||||
} |
|
||||||
.x-so input.layui-input{ |
|
||||||
width: 100%; |
|
||||||
margin: 10px; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/*精细版样式*/ |
|
||||||
|
|
||||||
.x-admin-sm{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm body{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
/*登录页面样式*/ |
|
||||||
.x-admin-sm .login input[type=submit],.x-admin-sm .login input[type=button]{ |
|
||||||
font-size: 14px; |
|
||||||
} |
|
||||||
.x-admin-sm .login input[type=text], |
|
||||||
.x-admin-sm .login input[type=file], |
|
||||||
.x-admin-sm .login input[type=password], |
|
||||||
.x-admin-sm .login input[type=email], .x-admin-sm select { |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .login .message{ |
|
||||||
font-size: 14px; |
|
||||||
} |
|
||||||
|
|
||||||
.x-admin-sm .layui-table td, .x-admin-sm .layui-table th{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-elem-field legend{ |
|
||||||
font-size: 18px; |
|
||||||
} |
|
||||||
|
|
||||||
.x-admin-sm .x-admin-backlog-body p cite{ |
|
||||||
font-size: 24px; |
|
||||||
} |
|
||||||
.x-admin-sm .left-nav #nav li a cite{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .iconfont{ |
|
||||||
font-size: 14px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-tab-title li{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-icon{ |
|
||||||
font-size: 14px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-nav *{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-breadcrumb>*{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-btn,.x-admin-sm .layui-btn-xs,.x-admin-sm .layui-btn-sm{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
|
|
||||||
.x-admin-sm .layui-laydate{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-btn{ |
|
||||||
height: 30px; |
|
||||||
line-height: 30px; |
|
||||||
padding: 0 10px; |
|
||||||
} |
|
||||||
|
|
||||||
.layui-table-cell .layui-btn { |
|
||||||
height: 27px; |
|
||||||
line-height: 28px; |
|
||||||
} |
|
||||||
|
|
||||||
.x-admin-sm .layui-btn-lg{ |
|
||||||
height: 38px; |
|
||||||
line-height: 38px; |
|
||||||
padding: 0 18px; |
|
||||||
font-size: 14px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-layer-title,.x-admin-sm .layui-layer-dialog .layui-layer-content{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-input,.x-admin-sm .layui-select,.x-admin-sm .layui-textarea{ |
|
||||||
height: 30px; |
|
||||||
} |
|
||||||
|
|
||||||
.x-admin-sm .layui-form-pane .layui-form-label{ |
|
||||||
height: 30px; |
|
||||||
line-height: 14px; |
|
||||||
} |
|
||||||
.x-admin-sm .layui-form-checkbox span{ |
|
||||||
font-size: 12px; |
|
||||||
} |
|
||||||
.x-admin-sm .fly-none .layui-icon { |
|
||||||
line-height: 300px; |
|
||||||
font-size: 300px; |
|
||||||
color: #393D49; |
|
||||||
} |
|
||||||
|
|
||||||
.x-win {display: none;padding: 20px;} |
|
||||||
|
|
||||||
.layui-this{font-weight: bold;} |
|
Before Width: | Height: | Size: 315 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 28 KiB |
@ -1,85 +0,0 @@ |
|||||||
/** |
|
||||||
* 请求工具 |
|
||||||
*/ |
|
||||||
var ApiUtil = (function () { |
|
||||||
var ACCESS_TOKEN_KEY = "sop_admin_access_token"; |
|
||||||
|
|
||||||
// 接口URL,更改此处即可
|
|
||||||
var url = SopConfig.url; |
|
||||||
var URI_CHAR = '/'; |
|
||||||
var params = {}; |
|
||||||
|
|
||||||
(function () { |
|
||||||
var aPairs, aTmp; |
|
||||||
var queryString = window.location.search.toString(); |
|
||||||
queryString = queryString.substring(1, queryString.length); //remove "?"
|
|
||||||
aPairs = queryString.split("&"); |
|
||||||
for (var i = 0; i < aPairs.length; i++) { |
|
||||||
aTmp = aPairs[i].split("="); |
|
||||||
params[aTmp[0]] = decodeURIComponent(aTmp[1]); |
|
||||||
} |
|
||||||
})(); |
|
||||||
|
|
||||||
function formatUri(uri) { |
|
||||||
if (uri.substring(0, 1) !== URI_CHAR) { |
|
||||||
uri = URI_CHAR + uri; |
|
||||||
} |
|
||||||
if (uri.substring(uri.length - 1) !== URI_CHAR) { |
|
||||||
uri = uri + URI_CHAR; |
|
||||||
} |
|
||||||
return uri; |
|
||||||
} |
|
||||||
|
|
||||||
function getAccessToken() { |
|
||||||
return localStorage.getItem(ACCESS_TOKEN_KEY) || ''; |
|
||||||
} |
|
||||||
|
|
||||||
return { |
|
||||||
post: function (uri, params, callback) { |
|
||||||
uri = formatUri(uri); |
|
||||||
sdk.post({ |
|
||||||
url: url + uri |
|
||||||
, data: params // 请求参数
|
|
||||||
, access_token: getAccessToken() |
|
||||||
, callback: function (resp) { // 成功回调
|
|
||||||
var code = resp.code |
|
||||||
if (!code || code === '-9') { |
|
||||||
alert('系统错误'); |
|
||||||
return |
|
||||||
} |
|
||||||
if (code === '-100' || code === '18' || code === '21') { // 未登录
|
|
||||||
ApiUtil.logout() |
|
||||||
return |
|
||||||
} |
|
||||||
if (code === '0') { // 成功
|
|
||||||
callback(resp) |
|
||||||
} else { |
|
||||||
layer.alert(resp.msg); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
, setAccessToken:function (accessToken) { |
|
||||||
localStorage.setItem(ACCESS_TOKEN_KEY,accessToken); |
|
||||||
} |
|
||||||
, getAccessToken: function () { |
|
||||||
return getAccessToken(); |
|
||||||
} |
|
||||||
, logout: function () { |
|
||||||
localStorage.removeItem(ACCESS_TOKEN_KEY); |
|
||||||
top.location.href = '../login/login.html'; |
|
||||||
} |
|
||||||
, getUrl: function () { |
|
||||||
return url; |
|
||||||
} |
|
||||||
, createUrl: function (uri, params) { |
|
||||||
if (!uri) { |
|
||||||
throw new Error('uri不能为空'); |
|
||||||
} |
|
||||||
return url + formatUri(uri) + (params ? '?data=' + encodeURIComponent(JSON.stringify(params)) : ''); |
|
||||||
} |
|
||||||
, getParam: function (paramName) { |
|
||||||
return params[paramName]; |
|
||||||
} |
|
||||||
} |
|
||||||
})(); |
|
@ -1,38 +0,0 @@ |
|||||||
function setCookie(name, value, expires, path, domain, secure) { |
|
||||||
if(typeof is_remember!="undefined") |
|
||||||
return false; |
|
||||||
var today = new Date(); |
|
||||||
today.setTime( today.getTime() ); |
|
||||||
var expires_date = new Date( today.getTime() + (expires) ); |
|
||||||
document.cookie= name + "=" + escape(value) + |
|
||||||
((expires) ? "; expires=" + expires_date.toGMTString() : "") + |
|
||||||
((path) ? "; path=" + path : "") + |
|
||||||
((domain) ? "; domain=" + domain : "") + |
|
||||||
((secure) ? "; secure" : ""); |
|
||||||
} |
|
||||||
function getCookie(name) { |
|
||||||
var dc = document.cookie; |
|
||||||
var prefix = name + "="; |
|
||||||
var begin = dc.indexOf("; " + prefix); |
|
||||||
if (begin == -1) { |
|
||||||
begin = dc.indexOf(prefix); |
|
||||||
if (begin != 0) return null; |
|
||||||
} else { |
|
||||||
begin += 2; |
|
||||||
} |
|
||||||
var end = document.cookie.indexOf(";", begin); |
|
||||||
if (end == -1) { |
|
||||||
end = dc.length; |
|
||||||
} |
|
||||||
return unescape(dc.substring(begin + prefix.length, end)); |
|
||||||
} |
|
||||||
function deleteCookie(name, path, domain) { |
|
||||||
if (getCookie(name)) { |
|
||||||
document.cookie = name + "=" + |
|
||||||
((path) ? "; path=" + path : "") + |
|
||||||
((domain) ? "; domain=" + domain : "") + |
|
||||||
"; expires=Thu, 01-Jan-70 00:00:01 GMT"; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
@ -1,37 +0,0 @@ |
|||||||
$(function () { |
|
||||||
var $pageFrame = $('#pageFrame'); |
|
||||||
var $selectLi = null; |
|
||||||
$('.left-nav').on('click', 'li', function (event) { |
|
||||||
var $tagLi = $(this); |
|
||||||
var $tagA = $tagLi.find('a').eq(0); |
|
||||||
var href = $tagA.prop('href'); |
|
||||||
if (href) { |
|
||||||
$pageFrame.prop('src', href + '?q=' + new Date().getTime()); |
|
||||||
if ($selectLi) { |
|
||||||
$selectLi.removeClass('active') |
|
||||||
} |
|
||||||
$selectLi = $tagLi.addClass('active'); |
|
||||||
} |
|
||||||
return false; |
|
||||||
}); |
|
||||||
|
|
||||||
$('.container .left_open i').click(function(event) { |
|
||||||
if($('.left-nav').css('left')=='0px'){ |
|
||||||
$('.left-nav').animate({left: '-221px'}, 100); |
|
||||||
$('.page-content').animate({left: '0px'}, 100); |
|
||||||
$('.page-content-bg').hide(); |
|
||||||
}else{ |
|
||||||
$('.left-nav').animate({left: '0px'}, 100); |
|
||||||
$('.page-content').animate({left: '221px'}, 100); |
|
||||||
if($(window).width()<768){ |
|
||||||
$('.page-content-bg').show(); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
ApiUtil.post('admin.userinfo.get', {}, function (resp) { |
|
||||||
var userInfo = resp.data; |
|
||||||
$('#username').text(userInfo.username); |
|
||||||
}); |
|
||||||
|
|
||||||
}); |
|
@ -1,22 +0,0 @@ |
|||||||
var RouteRole = { |
|
||||||
loadAllRole: function (form, contentId, callback) { |
|
||||||
ApiUtil.post('role.listall', {}, function (resp) { |
|
||||||
var roles = resp.data; |
|
||||||
var html = [] |
|
||||||
for (var i = 0; i < roles.length; i++) { |
|
||||||
if (i > 0 && i % 5 === 0) { |
|
||||||
html.push('<br>'); |
|
||||||
} |
|
||||||
var role = roles[i]; |
|
||||||
html.push('<input type="checkbox" name="roleCode" value="'+role.roleCode+'" lay-skin="primary" title="'+role.description+'">'); |
|
||||||
} |
|
||||||
$('#' + contentId).html(html.join('')); |
|
||||||
|
|
||||||
// 如果你的HTML是动态生成的,自动渲染就会失效
|
|
||||||
// 因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
|
|
||||||
form.render(); |
|
||||||
|
|
||||||
callback && callback(); |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
@ -1,414 +0,0 @@ |
|||||||
// Array.prototype.remove = function(val) {
|
|
||||||
// var index = this.indexOf(val);
|
|
||||||
// if (index > -1) {
|
|
||||||
// return this.splice(index, 1);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// };
|
|
||||||
|
|
||||||
$(function () { |
|
||||||
|
|
||||||
//加载弹出层
|
|
||||||
layui.use(['form','element'], |
|
||||||
function() { |
|
||||||
layer = layui.layer; |
|
||||||
element = layui.element; |
|
||||||
|
|
||||||
//tab 右键事件
|
|
||||||
$(".layui-tab-title").on('contextmenu', 'li', function(event) { |
|
||||||
var tab_left = $(this).position().left; |
|
||||||
var left = $(this).position().top; |
|
||||||
this_index = $(this).attr('lay-id'); |
|
||||||
$('#tab_right').css({'left':tab_left+50}).show(); |
|
||||||
$('#tab_show').show(); |
|
||||||
return false; |
|
||||||
}); |
|
||||||
|
|
||||||
$('.page-content,#tab_show,.container,.left-nav').click(function(event) { |
|
||||||
$('#tab_right').hide(); |
|
||||||
$('#tab_show').hide(); |
|
||||||
}); |
|
||||||
|
|
||||||
$('#tab_right').on('click', 'dd', function(event) { |
|
||||||
|
|
||||||
if(getCookie('tab_list')){ |
|
||||||
var tab_list = getCookie('tab_list').split(','); |
|
||||||
}else{ |
|
||||||
var tab_list = []; |
|
||||||
} |
|
||||||
|
|
||||||
var type = $(this).attr('data-type'); |
|
||||||
|
|
||||||
if(type=='this'){ |
|
||||||
|
|
||||||
tab.tabDelete(this_index); |
|
||||||
|
|
||||||
var index = -1; |
|
||||||
|
|
||||||
for (var i in tab_list) { |
|
||||||
if(tab_list[i]==(this_index-1)){ |
|
||||||
index = i; |
|
||||||
} |
|
||||||
}
|
|
||||||
if (index > -1) {
|
|
||||||
tab_list.splice(index, 1);
|
|
||||||
} |
|
||||||
|
|
||||||
setCookie('tab_list',tab_list); |
|
||||||
} |
|
||||||
if(type=='all'){ |
|
||||||
|
|
||||||
for (var i in tab_list) { |
|
||||||
tab.tabDelete(Number(tab_list[i])+1);
|
|
||||||
} |
|
||||||
|
|
||||||
setCookie('tab_list',[]); |
|
||||||
} |
|
||||||
|
|
||||||
if(type=='other'){ |
|
||||||
|
|
||||||
for (var i in tab_list) { |
|
||||||
if(tab_list[i]!=(this_index-1)){ |
|
||||||
tab.tabDelete(Number(tab_list[i])+1);
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
setCookie('tab_list',[this_index-1]); |
|
||||||
} |
|
||||||
// alert(this_index);
|
|
||||||
$('#tab_right').hide(); |
|
||||||
}); |
|
||||||
|
|
||||||
// tab 双击事件
|
|
||||||
$(".layui-tab-title").on('dblclick', 'li', function(event) { |
|
||||||
var id = $(this).attr('lay-id'); |
|
||||||
tab.tabDelete(id); |
|
||||||
|
|
||||||
if(getCookie('tab_list')){ |
|
||||||
tab_list = getCookie('tab_list').split(','); |
|
||||||
}else{ |
|
||||||
tab_list = []; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
var index = -1; |
|
||||||
|
|
||||||
for (var i in tab_list) { |
|
||||||
if(tab_list[i]==(id-1)){ |
|
||||||
index = i; |
|
||||||
} |
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (index > -1) {
|
|
||||||
tab_list.splice(index, 1);
|
|
||||||
} |
|
||||||
|
|
||||||
setCookie('tab_list',tab_list); |
|
||||||
return false; |
|
||||||
}); |
|
||||||
|
|
||||||
// tab 删除事件
|
|
||||||
element.on('tabDelete(xbs_tab)', function(data){ |
|
||||||
var id = $(this).parent().attr('lay-id')-1; |
|
||||||
|
|
||||||
if(getCookie('tab_list')){ |
|
||||||
tab_list = getCookie('tab_list').split(','); |
|
||||||
}else{ |
|
||||||
tab_list = []; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
var index = -1; |
|
||||||
|
|
||||||
for (var i in tab_list) { |
|
||||||
if(tab_list[i]==id){ |
|
||||||
index = i; |
|
||||||
} |
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (index > -1) {
|
|
||||||
tab_list.splice(index, 1);
|
|
||||||
} |
|
||||||
|
|
||||||
setCookie('tab_list',tab_list); |
|
||||||
|
|
||||||
}); |
|
||||||
|
|
||||||
if(getCookie('tab_list')){ |
|
||||||
tab_list = getCookie('tab_list').split(','); |
|
||||||
|
|
||||||
for (var i in tab_list) { |
|
||||||
$('.left-nav #nav li').eq(tab_list[i]).click(); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
//触发事件
|
|
||||||
var tab = { |
|
||||||
tabAdd: function(title,url,id){ |
|
||||||
//新增一个Tab项
|
|
||||||
element.tabAdd('xbs_tab', { |
|
||||||
title: title
|
|
||||||
,content: '<iframe tab-id="'+id+'" frameborder="0" src="'+url+'" scrolling="yes" class="x-iframe"></iframe>' |
|
||||||
,id: id |
|
||||||
}) |
|
||||||
} |
|
||||||
,tabDelete: function(othis){ |
|
||||||
//删除指定Tab项
|
|
||||||
element.tabDelete('xbs_tab', othis); //删除:“商品管理”
|
|
||||||
|
|
||||||
|
|
||||||
// othis.addClass('layui-btn-disabled');
|
|
||||||
} |
|
||||||
,tabChange: function(id){ |
|
||||||
//切换到指定Tab项
|
|
||||||
element.tabChange('xbs_tab', id); //切换到:用户管理
|
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
tableCheck = { |
|
||||||
init:function () { |
|
||||||
$(".x-admin .layui-form-checkbox").click(function(event) { |
|
||||||
if($(this).hasClass('layui-form-checked')){ |
|
||||||
$(this).removeClass('layui-form-checked'); |
|
||||||
if($(this).hasClass('header')){ |
|
||||||
$(".x-admin .layui-form-checkbox").removeClass('layui-form-checked'); |
|
||||||
} |
|
||||||
}else{ |
|
||||||
$(this).addClass('layui-form-checked'); |
|
||||||
if($(this).hasClass('header')){ |
|
||||||
$(".x-admin .layui-form-checkbox").addClass('layui-form-checked'); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
}); |
|
||||||
}, |
|
||||||
getData:function () { |
|
||||||
var obj = $(".x-admin .layui-form-checked").not('.header'); |
|
||||||
var arr=[]; |
|
||||||
obj.each(function(index, el) { |
|
||||||
arr.push(obj.eq(index).attr('data-id')); |
|
||||||
}); |
|
||||||
return arr; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// 开启表格多选
|
|
||||||
tableCheck.init(); |
|
||||||
|
|
||||||
|
|
||||||
$('.container .left_open i').click(function(event) { |
|
||||||
if($('.left-nav').css('left')=='0px'){ |
|
||||||
$('.left-nav').animate({left: '-221px'}, 100); |
|
||||||
$('.page-content').animate({left: '0px'}, 100); |
|
||||||
$('.page-content-bg').hide(); |
|
||||||
}else{ |
|
||||||
$('.left-nav').animate({left: '0px'}, 100); |
|
||||||
$('.page-content').animate({left: '221px'}, 100); |
|
||||||
if($(window).width()<768){ |
|
||||||
$('.page-content-bg').show(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
}); |
|
||||||
|
|
||||||
$('.page-content-bg').click(function(event) { |
|
||||||
$('.left-nav').animate({left: '-221px'}, 100); |
|
||||||
$('.page-content').animate({left: '0px'}, 100); |
|
||||||
$(this).hide(); |
|
||||||
}); |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$('.layui-tab-close').click(function(event) { |
|
||||||
$('.layui-tab-title li').eq(0).find('i').remove(); |
|
||||||
}); |
|
||||||
|
|
||||||
$("tbody.x-cate tr[fid!='0']").hide(); |
|
||||||
// 栏目多级显示效果
|
|
||||||
$('.x-show').click(function () { |
|
||||||
if($(this).attr('status')=='true'){ |
|
||||||
$(this).html('');
|
|
||||||
$(this).attr('status','false'); |
|
||||||
cateId = $(this).parents('tr').attr('cate-id'); |
|
||||||
$("tbody tr[fid="+cateId+"]").show(); |
|
||||||
}else{ |
|
||||||
cateIds = []; |
|
||||||
$(this).html(''); |
|
||||||
$(this).attr('status','true'); |
|
||||||
cateId = $(this).parents('tr').attr('cate-id'); |
|
||||||
getCateId(cateId); |
|
||||||
for (var i in cateIds) { |
|
||||||
$("tbody tr[cate-id="+cateIds[i]+"]").hide().find('.x-show').html('').attr('status','true'); |
|
||||||
} |
|
||||||
} |
|
||||||
}) |
|
||||||
|
|
||||||
//左侧菜单效果
|
|
||||||
|
|
||||||
$('.left-nav #nav').on('click', 'li', function(event) { |
|
||||||
|
|
||||||
var index = $('.left-nav #nav li').index($(this)); |
|
||||||
|
|
||||||
if($(this).children('.sub-menu').length){ |
|
||||||
if($(this).hasClass('open')){ |
|
||||||
|
|
||||||
if($(this).parent().hasClass('sub-menu')){ |
|
||||||
deleteCookie('left_menu_son'); |
|
||||||
}else{ |
|
||||||
deleteCookie('left_menu_father'); |
|
||||||
} |
|
||||||
|
|
||||||
$(this).removeClass('open'); |
|
||||||
$(this).find('.nav_right').html(''); |
|
||||||
$(this).children('.sub-menu').stop().slideUp(); |
|
||||||
// $(this).siblings().children('.sub-menu').slideUp();
|
|
||||||
}else{ |
|
||||||
|
|
||||||
|
|
||||||
if($(this).parent().hasClass('sub-menu')){ |
|
||||||
setCookie('left_menu_son',index); |
|
||||||
}else{ |
|
||||||
setCookie('left_menu_father',index); |
|
||||||
} |
|
||||||
|
|
||||||
$(this).addClass('open'); |
|
||||||
$(this).children('a').find('.nav_right').html(''); |
|
||||||
$(this).children('.sub-menu').stop().slideDown(); |
|
||||||
// $(this).siblings().children('.sub-menu').stop().slideUp();
|
|
||||||
// $(this).siblings().find('.nav_right').html('');
|
|
||||||
// $(this).siblings().removeClass('open');
|
|
||||||
} |
|
||||||
}else{ |
|
||||||
|
|
||||||
var url = $(this).children('a').attr('_href'); |
|
||||||
var title = $(this).find('cite').html(); |
|
||||||
// var index = $('.left-nav #nav li').index($(this));
|
|
||||||
|
|
||||||
var is_refresh = $(this).attr('date-refresh')?true:false;
|
|
||||||
|
|
||||||
for (var i = 0; i <$('.x-iframe').length; i++) { |
|
||||||
if($('.x-iframe').eq(i).attr('tab-id')==index+1){ |
|
||||||
tab.tabChange(index+1); |
|
||||||
event.stopPropagation(); |
|
||||||
|
|
||||||
if(is_refresh) |
|
||||||
$('.x-iframe').eq(i).attr("src",$('.x-iframe').eq(i).attr('src')); |
|
||||||
|
|
||||||
return; |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
if(getCookie('tab_list')){ |
|
||||||
tab_list = getCookie('tab_list').split(','); |
|
||||||
}else{ |
|
||||||
tab_list = []; |
|
||||||
} |
|
||||||
|
|
||||||
var is_exist = false; |
|
||||||
|
|
||||||
for (var i in tab_list) { |
|
||||||
if(tab_list[i]==index) |
|
||||||
is_exist = true; |
|
||||||
} |
|
||||||
|
|
||||||
if(!is_exist){ |
|
||||||
tab_list.push(index); |
|
||||||
} |
|
||||||
|
|
||||||
setCookie('tab_list',tab_list); |
|
||||||
|
|
||||||
tab.tabAdd(title,url,index+1); |
|
||||||
tab.tabChange(index+1); |
|
||||||
} |
|
||||||
|
|
||||||
event.stopPropagation(); |
|
||||||
|
|
||||||
}) |
|
||||||
|
|
||||||
// 左侧菜单记忆功能
|
|
||||||
/*if(getCookie('left_menu_father')!=null){ |
|
||||||
$('.left-nav #nav li').eq(getCookie('left_menu_father')).click(); |
|
||||||
} |
|
||||||
|
|
||||||
if(getCookie('left_menu_son')!=null){ |
|
||||||
$('.left-nav #nav li').eq(getCookie('left_menu_son')).click(); |
|
||||||
}*/ |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}) |
|
||||||
|
|
||||||
var cateIds = []; |
|
||||||
function getCateId(cateId) { |
|
||||||
|
|
||||||
$("tbody tr[fid="+cateId+"]").each(function(index, el) { |
|
||||||
id = $(el).attr('cate-id'); |
|
||||||
cateIds.push(id); |
|
||||||
getCateId(id); |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
/*弹出层*/ |
|
||||||
/* |
|
||||||
参数解释: |
|
||||||
title 标题 |
|
||||||
url 请求的url |
|
||||||
id 需要操作的数据id |
|
||||||
w 弹出层宽度(缺省调默认值) |
|
||||||
h 弹出层高度(缺省调默认值) |
|
||||||
*/ |
|
||||||
function x_admin_show(title,url,w,h){ |
|
||||||
if (title == null || title == '') { |
|
||||||
title=false; |
|
||||||
}; |
|
||||||
if (url == null || url == '') { |
|
||||||
url="404.html"; |
|
||||||
}; |
|
||||||
if (w == null || w == '') { |
|
||||||
w=($(window).width()*0.9); |
|
||||||
}; |
|
||||||
if (h == null || h == '') { |
|
||||||
h=($(window).height() - 50); |
|
||||||
}; |
|
||||||
layer.open({ |
|
||||||
type: 2, |
|
||||||
area: [w+'px', h +'px'], |
|
||||||
fix: false, //不固定
|
|
||||||
maxmin: true, |
|
||||||
shadeClose: true, |
|
||||||
shade:0.4, |
|
||||||
title: title, |
|
||||||
content: url, |
|
||||||
success: function(){ |
|
||||||
//窗口加载成功刷新frame
|
|
||||||
// location.replace(location.href);
|
|
||||||
}, |
|
||||||
cancel:function(){ |
|
||||||
//关闭窗口之后刷新frame
|
|
||||||
// location.replace(location.href);
|
|
||||||
}, |
|
||||||
end:function(){ |
|
||||||
//窗口销毁之后刷新frame
|
|
||||||
// location.replace(location.href);
|
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
/*关闭弹出框口*/ |
|
||||||
function x_admin_close(){ |
|
||||||
var index = parent.layer.getFrameIndex(window.name); |
|
||||||
parent.layer.close(index); |
|
||||||
} |
|
||||||
|
|
||||||
function x_admin_father_reload(){ |
|
||||||
|
|
||||||
parent.location.reload(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,136 +0,0 @@ |
|||||||
<!DOCTYPE html> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<meta charset="UTF-8"> |
|
||||||
<title>sdk</title> |
|
||||||
<script type="text/javascript" src="sdk.js"></script> |
|
||||||
<script type="text/javascript"> |
|
||||||
//需要发布到服务器上运行,并且server端需要处理跨域 |
|
||||||
//在IndexController.java上加@CrossOrigin(origins={"*"}) |
|
||||||
|
|
||||||
// 初始化配置,执行一次即可 |
|
||||||
sdk.config({ |
|
||||||
url : 'http://localhost:8080/api' |
|
||||||
,app_key : 'test' |
|
||||||
,secret : '123456' |
|
||||||
}); |
|
||||||
|
|
||||||
sdk.get({ |
|
||||||
name : 'goods.get' // 接口名 |
|
||||||
// ,version:'1.0' |
|
||||||
// ,access_token:'' |
|
||||||
,data : {'goods_name':'iphone'} // 请求参数 |
|
||||||
,callback:function(resp) { // 成功回调 |
|
||||||
console.log(resp) |
|
||||||
} |
|
||||||
}); |
|
||||||
</script> |
|
||||||
</head> |
|
||||||
<body> |
|
||||||
|
|
||||||
<h1>打开F12查看效果</h1> |
|
||||||
|
|
||||||
<fieldset> |
|
||||||
<legend>GET/POST</legend> |
|
||||||
<button onclick="getTest()">GET</button> |
|
||||||
<button onclick="postTest()">POST</button> |
|
||||||
</fieldset> |
|
||||||
<hr> |
|
||||||
<fieldset> |
|
||||||
<legend>上传文件demo</legend> |
|
||||||
<form id="frm"> |
|
||||||
头像图片:<input type="file" name="headImg"/> <br><br> |
|
||||||
身份证图片:<input type="file" name="idcardImg"/> |
|
||||||
</form> |
|
||||||
<br> |
|
||||||
<button onclick="uploadTest()">上传文件请求</button> |
|
||||||
</fieldset> |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<pre> |
|
||||||
//需要发布到服务器上运行,并且server端需要处理跨域 |
|
||||||
//在IndexController.java上加@CrossOrigin(origins={"*"}) |
|
||||||
|
|
||||||
sdk.config({ |
|
||||||
url : 'http://localhost:8080/api' |
|
||||||
,app_key : 'test' |
|
||||||
,secret : '123456' |
|
||||||
}); |
|
||||||
|
|
||||||
sdk.get({ |
|
||||||
name : 'goods.get' // 接口名 |
|
||||||
,data : {'goods_name':'iphone'} // 请求参数 |
|
||||||
,callback:function(resp) { // 成功回调 |
|
||||||
console.log(resp) |
|
||||||
} |
|
||||||
}); // get方式不支持上传 |
|
||||||
|
|
||||||
sdk.post({ |
|
||||||
name : 'goods.get' // 接口名 |
|
||||||
,data : {'goods_name':'iphone'} // 请求参数 |
|
||||||
,callback:function(resp) { // 成功回调 |
|
||||||
console.log(resp) |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
|
|
||||||
/* ****************上传文件**************** */ |
|
||||||
<form id="frm"> |
|
||||||
上传文件1:<input type="file" name="headImg"/> |
|
||||||
上传文件2:<input type="file" name="idcardImg"/> |
|
||||||
</form> |
|
||||||
|
|
||||||
function uploadTest() { |
|
||||||
sdk.get({ |
|
||||||
name : 'file.upload' // 接口名 |
|
||||||
,data : {'goods_name':'iphone'} // 请求参数 |
|
||||||
,form : document.getElementById('frm') |
|
||||||
,callback:function(resp) { // 成功回调 |
|
||||||
if(resp.code == '0') { |
|
||||||
alert('上传成功,' + resp.msg); |
|
||||||
} else { |
|
||||||
alert('上传失败,' + resp.msg) |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
</pre> |
|
||||||
|
|
||||||
<script type="text/javascript"> |
|
||||||
function uploadTest() { |
|
||||||
sdk.post({ |
|
||||||
name : 'file.upload' // 接口名 |
|
||||||
,data : {'goods_name':'iphone'} // 请求参数 |
|
||||||
,form : document.getElementById('frm') |
|
||||||
,callback:function(resp) { // 成功回调 |
|
||||||
if(resp.code == '0') { |
|
||||||
alert('上传成功,' + resp.data); |
|
||||||
} else { |
|
||||||
alert('上传失败,' + resp.msg) |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
function getTest() { |
|
||||||
sdk.get({ |
|
||||||
name : 'goods.get' // 接口名 |
|
||||||
,data : {'goods_name':'iphone'} // 请求参数 |
|
||||||
,callback:function(resp) { // 成功回调 |
|
||||||
console.log(resp); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
function postTest() { |
|
||||||
sdk.post({ |
|
||||||
name : 'goods.get' // 接口名 |
|
||||||
,data : {'goods_name':'iphone'} // 请求参数 |
|
||||||
,callback:function(resp) { // 成功回调 |
|
||||||
console.log(resp); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
</script> |
|
||||||
</body> |
|
||||||
</html> |
|
@ -1,2 +0,0 @@ |
|||||||
/** layui-v2.4.5 MIT License By https://www.layui.com */ |
|
||||||
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} |
|
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 701 B |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 274 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.6 KiB |