会不定时更新,有些项目需要重构,可能造成链接失效
Android
第30行,通过自定义的ImagePipelineConfig和OkHttpClient,在自定义的OkHttpClient中加入SSL证书。
通过实现okhttp的Interceptor实现,在me/jcala/xmarket/network/ReqExecutor.java的61行进行注册。
在第47行,证书所在位置R.raw.xmarket,证书利用JDK的keytool工具生成。
第41行,需要导入依赖compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
实现了安卓的Service,设置onStartCommand方法的返回值可以设置后台轮询的类型,使用了RxJava的Observable.interval方法。如果需要后台服务更新ui,可以通过在需要更新ui的页面接收广播实现。
目的:减少Activity代码量,实现分层,提高可维护性
目的:降耦合,不是类似spring ioc的反射注入,而是编译生成代码注入,不会降低性能,但也明显不如spring ioc或者google guice的简洁
每次打开Activity,从Realm中读取数据(37行),每次下拉刷新后,先删除原有数据,再存入新的数据(69行)。这里没有判断新数据与原数据相同,一并删除,可以自己判断下
public class SplashActivity extends BaseActivity {
//...
protected void initVariables() {
view=(SimpleDraweeView)findViewById(R.id.loading_gif);
DraweeController builder = Fresco.newDraweeControllerBuilder()
.setAutoPlayAnimations(true)
.setUri(Uri.parse("res://drawable/" + R.drawable.splash_loading))//设置uri
.build();
view.setController(builder);
}
//...
}
通过CommonAdapter和me/jcala/xmarket/view/ViewHolder,在me/jcala/xmarket/mvp/sort/TradeTagPresenterImpl.java的47行有对他的使用
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/info_avatar"
android:layout_width="56dp"
android:layout_height="56dp"
fresco:roundedCornerRadius="56dp"
fresco:roundBottomLeft="true"
fresco:roundBottomRight="true"
fresco:placeholderImage="@mipmap/person"
android:layout_margin="16dp"/>
retrofit的接口方法,这里通过在ReqExecutor单例中通过tradeReq()方法获取TradeReq的实例
public interface TradeReq {
@GET(ApiConf.get_school_trades)
Observable>> getSchoolTrades(
@Path("schoolName") String school,
@Query("page") int page,
@Query("size") int size
);
}
retrofit中的接口方法需要将图片文件转为MultipartBody.Part类型(me/jcala/xmarket/mvp/trade/add/TradeAddPresenterImpl.java的77行)
public interface TradeReq {
@Multipart
@POST(ApiConf.create_trade)
Observable> addTrade(
@Part("trade") RequestBody trade,
@Part List parts);
}
java web
在MongoRepository满足不了要求可通过MongoTemplate实现,spring中已经有MongoTemplate的实例,直接注入使用即可
安卓客户端部分如上:retrofit实现多图片和javabean同时上传
获取x-access-token的值,验证成功返回自定义的HTTP状态码210,否则返回401
返回值为Docket的方法即是配置swagger的配置类,在me/jcala/xmarket/server/ctrl包下的控制器类有swagger的注解
默认读取一个记录的所有属性,只读取特定的属性,可通过@Query(fields = "{ 'id': 1,'title':1}")设置
第99行,在application.yml中设置了JWT的密匙和生命周期
xmarket.keystore数字证书通过keytool生成
ssl:
key-store: classpath:xmarket.keystore
key-store-password: 546sdhjdf
key-password: sdjkasl465sd
keyAlias: xmarketkey
enabled: true
keytool -genkey -alias xmarketkey -keyalg RSA -keysize 1024 -keypass sdjkasl465sd -validity 365 -keystore g:\home\xmarket.keystore -storepass 546sdhjdf //生成证书
keytool -list -v -keystore g:\home\xmarket.keystore -storepass 546sdhjdf //查看证书
keytool -export -alias xmarketkey -keystore g:\home\xmarket.keystore -file g:\home\xmarket.crt -storepass 546sdhjdf //导出证书
keytool -printcert -file g:\home\xmarket.crt //查看证书
第60行有其配置,通过org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1整合
注解对复杂操作也越来越好,如插入之后返回id值(89行)
需要在application.yml中配置宏文件位置,如velocimacro.library: VM_global_library.vm。
将spring.datasource.initialize设置为true; spring.datasource.schema指向创建数据库和表的sql文件,如classpath:import.sql;spring.datasource.data指向初始数据sql文件
server:
compression:
min-response-size: 512 #压缩文件最小大小(kb)
enabled: true #是否压缩
mime-types: text/html,text/css,text/javascript,application/javascript,image/gif,image/png,image/jpg #要压缩的文件格式
加密过程: 获取图片md5值--md5的16个字节加到图片最末尾。验证过程: 取出图片末尾16个字节--并删除图片末尾16个字节--重新获取图片的md5值--两个md5进行比对。这里只是简单实现,代码没有进行优化
前端
包括getters,mutations,actions等,components下的组件中有其具体调用方式。
将图片放到static文件夹下,npm run dev时node的server会将static目录加入到服务器中,url如/static/img/wood.jpg即可访问