package org.scy.common.web.session;

import org.apache.commons.lang3.StringUtils;
import org.scy.common.Const;
import org.scy.common.web.controller.HttpResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * Session 管理类
 * Created by shicy on 2017/9/3
 */
@Component
@SuppressWarnings("unused")
public final class SessionManager {

    // 用户唯一编号，一个客户端一个编号
    public final static ThreadLocal<String> uuid = new ThreadLocal<String>();

    // 用户登录信息
    public final static ThreadLocal<String> token = new ThreadLocal<String>();

    // 接口访问权限口令
    public final static ThreadLocal<String> accessToken = new ThreadLocal<String>();

    private final static ThreadLocal<Account> accountInfo = new ThreadLocal<Account>();
    private final static ThreadLocal<User> userInfo = new ThreadLocal<User>();

    // Token 属性名称
    public final static String TOKEN_KEY = "token";

    // AccessToken 属性名称
    public final static String ACCESS_TOKEN_KEY = "X-Access-Token";

    private static SessionClient sessionClient;

    @Autowired(required = false)
    private SessionClient sessionClientTemp;

    @PostConstruct
    public void init() {
        sessionClient = sessionClientTemp;
    }

    /**
     * 获取当前用户的 Token 信息
     */
    public static String getToken() {
        return token.get();
    }

    /**
     * 获取当前用户的 AccessToken 信息
     */
    public static String getAccessToken() {
        return accessToken.get();
    }

    /**
     * 判断 AccessToken 是否有效
     */
    public static boolean isAccessEanbled() {
        String _token = accessToken.get();
        if (StringUtils.isBlank(_token))
            return false;
        HttpResult result = sessionClient.isAccessEnabled(_token);
        return "1".equals(result.getData());
    }

    /**
     * 验证当前请求用户是否是登录状态
     */
    public static boolean isSessionValidate() {
        String _token = token.get();
        if (StringUtils.isBlank(_token))
            return false;
        HttpResult result = sessionClient.isSessionValidate(_token);
        return "1".equals(result.getData());
    }

    /**
     * 用户登录，session无期限
     * @param username 登录名称
     * @param password 登录密码
     * @return 返回用户token信息
     */
    public static String doLogin(String username, String password) {
        return doLogin(username, password, 0);
    }

    /**
     * 用户登录，可以使用任何一种登录方式
     * @param username 登录名称
     * @param password 登录密码
     * @param expires 自动过期时间（秒）
     * @return 返回用户token信息
     */
    public static String doLogin(String username, String password, int expires) {
        int loginType = Const.LOGIN_TYPE_NAME | Const.LOGIN_TYPE_MOBILE | Const.LOGIN_TYPE_EMAIL;
        return doLogin(username, password, loginType, expires);
    }

    /**
     * 用户登录
     * @param username 登录名称，用户名、手机号码或邮箱
     * @param password 登录密码
     * @param loginType 登录方式
     * @param expires 自动过期时间（秒），0为无限期
     * @return 返回用户token信息
     */
    public static String doLogin(String username, String password, int loginType, int expires) {
        if (StringUtils.isNotBlank(token.get()))
            doLogout();

        Map<String, Object> params = new HashMap<String, Object>();
        if (StringUtils.isBlank(username))
            throw new RuntimeException("登录用户名称不能为空");
        params.put("username", StringUtils.trimToEmpty(username));
        params.put("password", StringUtils.trimToEmpty(password));
        params.put("loginType", loginType < 0 ? 0 : loginType);
        params.put("expires", expires < 0 ? 0 : expires);

        HttpResult result = sessionClient.login(params);
        if (result.getCode() == HttpResult.OK) {
            token.set("" + result.getData());
        }

        return token.get();
    }

    /**
     * 用户退出登录
     */
    public static void doLogout() {
        String _token = token.get();
        if (StringUtils.isNotBlank(_token)) {
            HttpResult result = sessionClient.logout(_token);
            if (result.getCode() == HttpResult.OK) {
                token.remove();
                userInfo.remove();
            }
        }
    }

    /**
     * 获取帐户信息
     */
    public static Account getAccount() {
        Account account = accountInfo.get();
        if (account == null) {
            String _token = accessToken.get();
            if (StringUtils.isBlank(_token)) {
                HttpResult result = sessionClient.getAccount(_token);
                if (result.getCode() == HttpResult.OK) {
                    account = result.getData(Account.class);
                    accountInfo.set(account);
                }
            }
        }
        return account;
    }

    /**
     * 获取帐户编号
     */
    public static int getAccountId() {
        Account account = getAccount();
        return account != null ? account.getId() : 0;
    }

    /**
     * 获取当前用户信息
     */
    public static User getUser() {
        User user = userInfo.get();
        if (user == null) {
            String _token = token.get();
            if (StringUtils.isNotBlank(_token)) {
                HttpResult result = sessionClient.getUser(_token);
                if (result.getCode() == HttpResult.OK) {
                    user = result.getData(User.class);
                    userInfo.set(user);
                }
            }
        }
        return user;
    }

    /**
     * 获取用户编号
     */
    public static int getUserId() {
        User user = getUser();
        return user != null ? user.getId() : 0;
    }

}

@@ -5588,10 +5588,152 @@
 %0A    %7D%0A%0A
+    /**%0A     * %E5%88%A4%E6%96%AD%E6%98%AF%E4%B8%8D%E6%98%AF%E5%B9%B3%E5%8F%B0%E5%B8%90%E6%88%B7%0A     */%0A    public static boolean isPlatform() %7B%0A        return Const.PLATFORM_CODE.equals(getAccessToken());%0A    %7D%0A%0A
 %7D%0A

添加 SessionManager.isPlatform()