ecshop对接1688社交电商平台

ecshop对接1688社交电商平台

基于微信生态的社交电商在2019年俨然成为风口

https://www.kugent.com/ 上海空正网络科技有限公司 已完成1688百万商户社交电商对接,微信小程序社交电商商城。可搜索小程序或公众号《抱抱邻》查看演示效果

联系微信:jiaivr

SpringBoot2.0整合Disconf配置中心实战

Disconf简介

配置中心使用开源 Distributed Configuration Management Platform(分布式配置管理平台) 统一管理配置
配置中心
包括 百度、滴滴打车、银联、网易、拉勾网 等知名互联网公司正在使用!

主要目标

  • 部署简单:同一个上线包,无须改动配置,即可在 多个环境中(dev/qa/pre/prod) 上线
  • 部署动态化:更改配置,无需重新打包或重启,即可 实时生效
  • 统一管理:提供web平台,统一管理 多个环境(dev/qa/pre/prod)、多个产品 的所有配置
  • 支持微服务架构

配置中心选型

  • 关于配置中心选型资料详见 《开源配置中心对比》

对接注意事项

  • httpclient 4.2.1以下的版本会报错, 推荐使用4.5.9 GA版本
  • 配置文件请保证配置正确性,如:配置项前后存在空格,配置格式,特殊字符,配置项编码等
  • spring5原client需重写ReloadingPropertyPlaceholderConfigurer类,super.parseStringValue 方法

SpringBoot对接

以下SpringBoot2 DisconfConfig 代码注入Bean配置对接方式可有效解决集成需要启动两次配置才生效的问题

1.  新建Disconf配置类DisconfConfig

import java.io.IOException;
import java.util.List;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.baidu.disconf.client.DisconfMgrBean;
import com.baidu.disconf.client.DisconfMgrBeanSecond;
import com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean;
import com.baidu.disconf.client.config.inner.DisInnerConfigAnnotation;
import com.baidu.disconf.client.support.DisconfAutowareConfig;
import com.google.common.collect.Lists;

/**
 * Disconf配置中心
 * @author ByWei.Cn
 * @date 2019/08/28
 */
@Configuration
public class DisconfConfig {

    @DisInnerConfigAnnotation(name = "disconf.scanpackage")
    public String scanpackage;
    
    @DisInnerConfigAnnotation(name = "disconf.locations")
    public String locations;
    
    public DisconfConfig() {
        super();
        try {
            DisconfAutowareConfig.autowareConfig(this, "disconf.properties");
        } catch (Exception e) {
        }
    }

    @Bean(destroyMethod = "destroy")
    public DisconfMgrBean disconfMgrBean() {
        DisconfMgrBean mgr = new DisconfMgrBean();
        mgr.setScanPackage(scanpackage);
        return mgr;
    }

    @Bean(initMethod = "init", destroyMethod = "destroy")
    public DisconfMgrBeanSecond disconfMgrBeanSecond() {
        return new DisconfMgrBeanSecond();
    }
    
    @Bean
    public ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean() {
        ReloadablePropertiesFactoryBean reloadProp = new ReloadablePropertiesFactoryBean();
        String[] props = locations.split(",");
        List propsList = Lists.newArrayList();
        for (String prop : props) {
            propsList.add("classpath:"+prop);
        }
        reloadProp.setLocations(propsList);
        return reloadProp;
    }

    @Bean
    public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer(ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean) {
        PropertyPlaceholderConfigurer prop = new PropertyPlaceholderConfigurer();
        prop.setIgnoreResourceNotFound(true);
        prop.setIgnoreUnresolvablePlaceholders(true);
        try {
            prop.setPropertiesArray(reloadablePropertiesFactoryBean.getObject());
        } catch (IOException e) {
             e.printStackTrace();
        }
        return prop;
    }
}

2.  在disconf.properties文件中新增自定义扩展配置

# scan package
disconf.scanpackage=cn.bywei.demo
# properties locations','split
disconf.locations=bywei-conf.properties

 

Disconf对接小技巧

  • 获取disconf配置项:DisClientConfig.getInstance().ENV
  • 多配置可通过自定义启动变量:
    xml获取- #{environment[‘project.channel’]} ;
    注解JAVA代码获取-DisconfConfig implements EnvironmentAware

图片加载失败404处理方案:JavaScript处理或者nginx服务返回端默认图片

在网站设计制作或者小程序开发等前端开发工作过程中,图片作为直达用户的有效媒介,涉及到图片能否正常加载显示,是产品用户体验的关键环节。本文将针对图片加载失败的情况提出相关的解决方案。
图片加载失败

网页端处理图片加载失败方案

网站加载图片404时,一般会设置默认显示图片,通过占位符的形式体现。前端可使用JavaScript的onerror设置默认图像显示代替alt。

图片XX

nginx配置返回默认图方案

另外一种思路就是在nginx服务端直接返回默认图片,简单来说就是nginx图片不存在时给一张默认图片,并且还可以自定义状态码标记,以便收集统计该类型错误,这种方法也适用于小程序加载图片失败默认图片的替换方法。具体示例如下

1、将选好的nopic.gif默认图片放在对应目录下html/qiqufang;目录下;

2、修改nginx的配置文件:

        error_page 404 =423  @404;

        location @404 {
           if ( $request_uri ~* \.(gif|jpg|jpeg|png|bmp)$ ) {
             root html/qiqufang;
             rewrite ^(.*)$ /nopic.gif break;
           }
        }

3、图片加载失败演示效果

图片404加载失败

Swagger-Lazydoc版本更新-API文档管理UI介绍及使用

swagger版本更新

待实现功能列表
支持API 测试用例 Mock功能
云服务端支持多用户
云服务端支持开放API管理
支持导出swagger PDF或者HTML文档

swagger-lazydoc v1.0.2
测试用例响应JSON字符串超长自动换行
增加本地权限控制
增加云登录权限控制
增加云服务端管理
增加测试用例保存功能

swagger-lazydoc v1.0.0
项目初始化构想设计
优化文档管理界面风格
测试用例页面增加格式化响应报文
测试用例页面增加响应头信息

HTTP Basic Authorization身份认证模式,抢先认证HttpClient 4.5.3 实例

Basic认证

关于HTTP BASIC认证

Basic 认证是服务器与客户端之间进行认证的一种方式,最初是在HTTP 1.0 规范(RFC 1945)中定义,后续的有关安全的信息可以在HTTP 1.1规范(RFC 2616)和HTTP认证规范(RFC 2617)中找到。HTTP Basic Authentication认证的服务,需要提供用户名和密码,否则服务器就会返回401。

HTTP BASIC认证流程原理

HTTP使用BASIC认证的原理是在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法。
实现方法:当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码, 用户输入后,客户端将用户名和密码中间用“:”分隔合并,并将合并后的字符串用BASE64编码,在每次请求数据 时,将密文附加于请求头(Request Header)Authorization: Basic XXXXXXX中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64编码的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

JAVA HttpClient 4.5.3 抢先认证实例

原HttpClient 4.1.1 实例方法DefaultHttpClient等已过时废弃, 如下测试实例中,实现了两种方法:
1)通过HttpClient提供的抢先认证方式,直接跳过验证是否登录,把Basic Authorization信息发送给服务器
2)直接添加header的方式,HttpClient抢先认证方式原理同理

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Base64;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
public class HttpsClientTest {

	@Test
	public void test_auth_basic_should_success() throws Exception {
		String url ="http://192.168.1.100:8080/bywei/api/authtest";
		HttpHost targetHost = new HttpHost("192.168.1.100", 8080, "http");
		HttpGet get = new HttpGet(url);
		UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("test-auth", "=^ad.*sa:_2_RXa*23");
		
		// 使用 AuthCache 方式将使用RestClient 中的 MainClientExec方法,在发送请求时直接携带Authorization header信息
    	       AuthCache authCache = new BasicAuthCache();
    	       // Generate BASIC scheme object and add it to the local auth cache
    	      BasicScheme basicAuth = new BasicScheme();
    	      authCache.put(targetHost, basicAuth);
    	      // Add AuthCache to the execution context
    	      BasicHttpContext localcontext = new BasicHttpContext();
    	      localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
		
		String content = doExecute(get, targetHost, credentials, localcontext);
		System.out.println("Authorization Basic认证authCache请求响应:"+content);
	}
	
	@Test
	public void test_auth_header_should_success() throws Exception {
		String url ="http://192.168.1.100:8080/bywei/api/authtest";
		HttpHost targetHost = new HttpHost("192.168.1.100", 8080, "http");
		HttpGet get = new HttpGet(url);
		String token = "test-auth:=^ad.*sa:_2_RXa*23";
		byte[] auth = Base64.getEncoder().encode(token.getBytes("UTF-8"));
		get.addHeader("Authorization", "Basic " + new String(auth));
		HttpClientContext context = HttpClientContext.create();
		String content = doExecute(get, targetHost, null, context);
		System.out.println("Authorization Basic认证header请求响应:"+content);
	}
	
	private CloseableHttpClient getHttpClient(UsernamePasswordCredentials credentials){
	    RequestConfig requestConf = RequestConfig.custom().setAuthenticationEnabled(false).build();
	    HttpClientBuilder httpClientBuilder = HttpClients.custom();
	    if(credentials != null) {
	    	CredentialsProvider provider = new BasicCredentialsProvider();
	    	provider.setCredentials(AuthScope.ANY, credentials);
	    	httpClientBuilder.setDefaultCredentialsProvider(provider);
	    }
	    CloseableHttpClient client = httpClientBuilder.setDefaultRequestConfig(requestConf).build();
	    return  client;
	}
	
	private String doExecute(HttpGet get, HttpHost targetHost, UsernamePasswordCredentials credentials, HttpContext contenxt) throws Exception {
		CloseableHttpResponse response = null;
		String content = "";
        try {
        	
        	//指定Client使用HttpContext,包含属性:http.auth.auth-cache
            response = getHttpClient(credentials).execute(get, contenxt);
            HttpEntity entity = response.getEntity();
            if(entity!=null) {
                Charset charset = ContentType.getOrDefault(entity).getCharset();
                content = EntityUtils.toString(entity, charset);
                EntityUtils.consume(entity);
                return content;
            }
        } catch(Exception ie) {
            ie.printStackTrace();
            throw ie;
        } finally {
            try {
                if(response!=null) {
                    response.close();
                }
            } catch(IOException e) {
            }
            if(get!=null) {
            	get.releaseConnection();
            } 
        }
        return content;
	}
}

绿盾儿童安全上网桌面手机控制电脑软件

简介

该移动端配合绿盾安全桌面使用,可在手机端控制安全桌面软件的使用时长、强制开关机等功能。儿童上网教育辅助软件,界面简洁、控制人性化。真正起到电脑桌面端的智能控制,家长引导,帮助小朋友健康成长。

传送门:绿盾安全桌面

手机控制电脑软件

功能效果演示

功能简介

  1. 移动端首页强制开关机按钮,防止小朋友过度使用电脑,引导规律使用
  2. 可控制调整桌面端电脑休息时长,合理分配小朋友使用电脑时间
  3. 自助绑定电脑移动端账号信息,支持多账号控制

界面效果

绿盾安全桌面手机版
移动版

绿盾安全移动端下载

软件信息

  • 资源大小:3.78 MB
  • 月下载量:1,025 次
  • 软件属性:简体中文 免费软件
  • 更新时间:2019-06-24
  • 系统平台:Android (ios待发布)
  • 官方网站:ByWei.Cn

下载地址

swagger-lazydoc-ui 在线文档管理利器-API接口文档自动生成

在介绍API在线文档管理工具swagger-lazydoc-ui之前,不得不先简单介绍一下其依赖的强大的一款RESTFUL接口的文档在线自动生成+功能测试功能软件Swagger UI。
API接口

概述

在常规的开发过程中,经常会使用word的形式编写响应的API接口请求响应接口报文的描述说明文档,俗称API接口文档.相信大部分的研发同学都苦于编写文档的繁琐、大材小用了。也经常在接口更新之后懒于在更新word文档。特别是在项目需求变化越来越频繁,接口维护增加越来越多的情况一下,常规的文档管理的方式已经不利于现状。再加上现今前后端分离方式,合作协调开发等等场景。

为了解决上述描述的问题,Swagger UI应运而生。

Swagger UI可以让我们把定义的接口以配置文件或者代码注解的方式编写,最后生成一个可视化较高的网站。在开发过程中随手而写的注释时,就已经把文档编写完成了。如此强大的工具,如果你还没引进,继续阅读下文,将对你的工作提升十倍的效率。

Swagger官网:http://swagger.io
Swagger官方描述:The World’s Most Popular Framework for APIs.

Swagger ui 的原生UI管理界面如下:

swagger-ui

关于swagger-lazydoc-ui

swagger-ui-layer针对原生的UI显示重新进行了设计,以使界面更加符合文档的管理方式,在请求和响应描述处使用表格展示的形式比原生的UI更加直观, 在此感谢swagger-ui-layer作者提供了Swagger 自定义UI界面方案。
在此基础上做了部分改进,SpringMVC/Springboot实战集成Swagger2, 后期还在持续更新中,本章可作为Swagger入门教程。具体进度将抽时间更新该文章:

  • 优化文档管理界面的风格样式
  • 解决文档展示信息的不全引起的bug
  • 增加接口调试相关的头信息
  • 增加接口调试信息的记录
  • 增加云端拆分部署的方式
  • 增加接口数据的Mock

其他功能还在持续优化进行中,欢迎提供建议或意见

当前的效果图如下:

swagger-lazydoc-ui

安装部署

1、引入jar包

首先需要在你的 pom.xml 中引入swagger的包, 相关jar已发布在maven中央仓库上,或者直接下载jar 
swagger-lazydoc jar Maven仓库:https://mvnrepository.com/artifact/cn.bywei



    cn.bywei
    swagger-lazydoc-ui
    1.0.2

 

2、添加swagger自定义配置文件信息

spring boot项目在配置文件中根据具体需求添加如下内容

#swagger lazydoc config
#配置是否启用swagger lazydoc生成文档
swagger.lazydoc.enable=true
#配置生成的swagger lazydoc文档版本
swagger.lazydoc.version=2.0
#文档展示标题
swagger.lazydoc.title=swagger lazydoc apis
#文档展示描述信息
swagger.lazydoc.description=swagger lazydoc Project!
#文档联系人
swagger.lazydoc.contact.name=ByWei.Cn
#文档联系网址
swagger.lazydoc.contact.url=http://swagger-lazydoc.bywei.cn
#文档联系邮箱
swagger.lazydoc.contact.mail=master@bywei.cn
#生成文档包路径
swagger.lazydoc.basePackage=cn.bywei.api.controller
#是否启用权限验证,为true则必须验证后登录,并配置本地权限验证用户名密码
swagger.lazydoc.auth=true
#开启本地权限验证swagger.lazydoc.auth=true后,登录用户名
swagger.lazydoc.username=lazydocuser
#开启本地权限验证swagger.lazydoc.auth=true后,登录密码
swagger.lazydoc.password=lazydocpwd123
#配置云服务地址(非必须),可下载开源代码自定义部署
swagger.lazydoc.cloudUrl=http://swagger-lazydoc.bywei.cn/cloud

 

3、启用swagger

  • spring boot项目启动项添加@EnableSwaggerLazydoc:
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import cn.bywei.swaggerlazydoc.core.EnableSwaggerLazydoc;
    
    @SpringBootApplication
    @EnableSwaggerLazydoc
    public class SwaggerlazydocTestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SwaggerlazydocTestApplication.class, args);
        }
    }
    
    
  • spring-mvc注入Bean:
    @Configuration
    @EnableSwaggerLazydoc
    @EnableWebMvc
    public class SwaggerLazydocConfig {
    }
    

4、添加swagger注解

常用的swagger注解如下,具体可以参考swagger官方注解文档:http://docs.swagger.io/swagger-core/apidocs/index.html

Annotation Type Description
Api
Marks a class as a Swagger resource.
ApiImplicitParam
Represents a single parameter in an API Operation.
ApiImplicitParams
A wrapper to allow a list of multiple ApiImplicitParam objects.
ApiModel
Provides additional information about Swagger models.
ApiModelProperty
Adds and manipulates data of a model property.
ApiOperation
Describes an operation or typically a HTTP method against a specific path.
ApiParam
Adds additional meta-data for operation parameters.
ApiResponse
Describes a possible response of an operation.
ApiResponses
A wrapper to allow a list of multiple ApiResponse objects.
Authorization
Declares an authorization scheme to be used on a resource or an operation.
AuthorizationScope
Describes an OAuth2 authorization scope.

示例Controller方法

 @ApiOperation(value = "发送邮箱验证码",notes ="type类型和mail邮箱地址为必传项" )
 @RequestMapping(value = "/sendValidateCodeForMail",method = RequestMethod.POST)
 public BaseResponse<String> sendValidateCodeForMail(
 @RequestBody @ApiParam(name="发送邮件验证码对象",value="传入json格式",required=true)
 SendValidateCodeForMailReq req){
     ...
 return null;
 }

示例请求参数SendValidateCodeForMailReq 注解, 响应对象注解类似

@ApiModel(value="SendValidateCodeForMailReq",description="发送邮箱验证码请求对象")
public class SendValidateCodeForMailReq {
    @ApiModelProperty(value="验证类型 1:忘记密码验证码  2:新用户校验邮箱",name="type",required=true,example="1")
    private int type;	
    @ApiModelProperty(hidden=true)
    private String mebid;
    @ApiModelProperty(value="邮箱地址",name="mail",required=true)
    private String mail; 
    @ApiModelProperty(value="语言类型  LANG_ZH:中文 LANG_EN:英文",name="language")
    private LanguageTypeEnum  language;

    ... 

 

5、查看API接口文档

swagger-lazydoc-ui 的默认访问地址是:

http://${host}:${port}/swagger-lazydoc.html

 

开源地址

swagger lazydoc github :

https://github.com/bywei/SwaggerLazydoc

截图去除水印软件-快捷键屏幕截图软件

最近企业微信最新发布了一个版本,突然发现在微信聊天背景上被悄然打上了水印标志。如果要是使用一般截图工具对聊天窗口截图,则会携带背景上的水印标志。遇到某种情况(你懂的!)将十分不方便。

业余时间做了下面的截图自动去掉水印的小工具,有需要的拿走吧!

截图自动去水印

特性介绍

截屏软件效果演示:

背景存在水印的企业微信聊天窗口

 

capturescreen截图后,生成的截屏无水印的图片

 

截图软件下载

截屏软件概要

  • 资源大小:1.44 MB
  • 月下载量:10,765 次
  • 软件属性:简体中文 免费软件
  • 更新时间:2019-05-09
  • 系统平台:Win10/Win7/WinVista/WinXP/Win2000/Win8 兼容软件
  • 官方网站:ByWei.Cn
  • 软件说明:截屏/截图/抓图自动去除图片背景水印,企业微信截图去水印,默认使用快捷键: Ctrl + Alt + A

截屏软件下载地址

  1. 推荐百度网盘下载:  链接: https://pan.baidu.com/s/1RZQP_FnfCokWmMqzyGJWkg   提取码:  vigc
  2. 百味博客官方下载