月度归档:2017年05月

token的使用

token的使用分为两类:一种是加密 api本身,对于WEB服务来说,也就是加密URL,api_token = md5 (‘模块名’ + ‘控制器名’ + ‘方法名’ + ‘2013-12-18’ + ‘加密密钥’) = 770fed4ca2aabd20ae9a5dd774711de2

第二种方式就是用于登录验证,避免每次请求都要验证用户名密码,由于api的调用可能没有办法发送cookie,比如安卓app,所以使用 token就可以避免大量调用不用重复验证密码,减轻服务器的压力.也会更加安全,避免用户名和密码频繁的在网络中传送.

具体的实现方法
服务器端,采用一定的算法生成唯一的字符串,可以存储进入数据库,不过据说可以放入Memcached.设置过期时间,数据库的话,可以设置字段创建时间,查询的时候只需要限制时间就可以了.客户端退出登录,要删除该token.这样应该也没有多人登录的问题,如果多个人或者多个终端登录同一个账户的话,生成的token是不同的,并不会有什么影响.

安卓app客户端的话,使用SharedPreferences存储token应该是不错的选择.每次请求参数中加入 token就可以了.

参考文章 http://www.cnblogs.com/bjfy/p/5909690.html

给 SweetAlertDialog 设置监听器

SweetAlertDialog这个库很好用,是关于对话框的第三方库。

package com.baozhuwanglei.android.xiaofanghuiluandroidbzw.xiaofanghuiluandroidbzw.common;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baozhuwanglei.android.xiaofanghuiluandroidbzw.xiaofanghuiluandroidbzw.R;
import com.baozhuwanglei.android.xiaofanghuiluandroidbzw.xiaofanghuiluandroidbzw.api.Api;
import com.baozhuwanglei.android.xiaofanghuiluandroidbzw.xiaofanghuiluandroidbzw.service.DownloadService;

import cn.pedant.SweetAlert.SweetAlertDialog;

/**
 * Created by baozhuwanglei on 17-4-13.
 */
public class DialogManager {
    private static DialogManager instance;
    private SweetAlertDialog loadDialog;

    private DialogManager() {}

    public static DialogManager getInstance() {
        if (instance == null) {
            instance = new DialogManager();
        }
        return instance;
    }

    /**
     * @param context 上下文
     * @param title   标题
     *                

* 加载中 */ public void loadDialog(Context context, String title) { loadDialog = new SweetAlertDialog(context, SweetAlertDialog.PROGRESS_TYPE); loadDialog.getProgressHelper().setBarColor(ContextCompat.getColor(context, R.color.colorPrimaryDark)); loadDialog.setTitleText(title); loadDialog.setCancelable(false); loadDialog.show(); } public void loadDialogDismiss() { if (loadDialog.isShowing()) { loadDialog.dismiss(); } } /** * 显示消息 * @param context 上下文 * @param title 标题 * @param content 内容 * @param type 类型 */ public void showMsgDialog(Context context, String title, String content, int type) { SweetAlertDialog msgDialog = new SweetAlertDialog(context, type); msgDialog.setTitleText(title); msgDialog.setContentText(content); msgDialog.show(); } /** * 重载 加入监听器 */ public void showMsgDialog(Context context, String title, String content, int type, SweetAlertDialog.OnSweetClickListener listener) { SweetAlertDialog msgDialog = new SweetAlertDialog(context, type); msgDialog.setTitleText(title); msgDialog.setContentText(content); msgDialog.setConfirmText("确定"); msgDialog.show(); msgDialog.setConfirmClickListener(listener); } /** * 网络超时 */ public void errorDialog(Context context) { SweetAlertDialog msgDialog = new SweetAlertDialog(context, SweetAlertDialog.ERROR_TYPE); msgDialog.setTitleText("提示"); msgDialog.getProgressHelper().setBarColor(R.color.colorPrimary); msgDialog.setContentText("网络超时,请重试"); msgDialog.setConfirmText("确定"); msgDialog.show(); msgDialog.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() { @Override public void onClick(SweetAlertDialog sweetAlertDialog) { sweetAlertDialog.dismiss(); } }); } /** * 警告 * confirm */ public void showWarmDialog(Context context, String title, String content, String confirmText, SweetAlertDialog.OnSweetClickListener listener) { SweetAlertDialog dialog = new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE); dialog.setTitleText(title); dialog.setContentText(content); dialog.setConfirmText(confirmText); dialog.setCancelText("取消"); dialog.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() { @Override public void onClick(SweetAlertDialog sweetAlertDialog) { sweetAlertDialog.dismiss(); } }); dialog.setConfirmClickListener(listener); dialog.show(); } /** * 版本更新 dialog */ public void showUpdateDialog(final Context context, final Activity activity, String titleString, String contentString) { final Dialog dialog = new Dialog(context, R.style.dialog); dialog.setCancelable(false); dialog.setContentView(R.layout.update_app_dialog); TextView mTitleTv = (TextView) dialog.findViewById(R.id.c_title_tv); TextView contentTv = (TextView) dialog.findViewById(R.id.update_content_tv); Button mNegativeButton = (Button) dialog.findViewById(R.id.negative_btn); Button mPositiveButton = (Button) dialog.findViewById(R.id.positive_btn); mTitleTv.setText(titleString); contentTv.setText(contentString); mNegativeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); mPositiveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(activity, DownloadService.class); intent.putExtra("downUrl", Api.VERSION_UPDATE); activity.startService(intent); dialog.dismiss(); Toast.makeText(context, "后台加载中...", Toast.LENGTH_SHORT).show(); } }); dialog.show(); } }

这个类封装了 SweetAlertDialog,这个类不是我写的,但是我加入了一个重载方法,这样就可以让showMsgDialog方法能够去设置监听器了。实现监听器类很简单:

new SweetAlertDialog.OnSweetClickListener() {
            @Override
            public void onClick(SweetAlertDialog sweetAlertDialog) {
                sweetAlertDialog.dismiss();
            }
        });

使用 convert命令制作 git动画

convert -delay 40 *.png out.gif

把当前文件夹的.png文件制作成为 out.gif动画,间隔是40*10毫秒.

参考:http://blog.csdn.net/tge7618291/article/details/7553807

还可以用 mplayer把视频文件先生成一系列图片,然后再生成gif动画,但是这个很费时间.
参考:http://www.xuehuile.com/blog/c08f0ecc3fa249ce9646c50caf54f5ad.html