All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jladder.actions.impl.UpmsAction Maven / Gradle / Ivy

package com.jladder.actions.impl;

import com.jladder.Ladder;
import com.jladder.data.Record;
import com.jladder.data.*;
import com.jladder.datamodel.IDataModel;
import com.jladder.db.Cnd;
import com.jladder.db.DaoSeesion;
import com.jladder.hub.DataHub;
import com.jladder.hub.WebHub;
import com.jladder.lang.*;
import com.jladder.logger.LogFoRequest;
import com.jladder.net.http.HttpHelper;
import com.jladder.utils.RedisHelper;
import com.jladder.utils.VCodeGenerator;
import com.jladder.web.WebContext;
import jakarta.servlet.http.Cookie;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 用户权限类
 */
public class UpmsAction {

    private static final Record My_Cache=new Record();
    public static final String Developer="developer";
    public static final String Org="org";
    private static final Map LatestUserRequest = new ConcurrentHashMap<>();

    public static Map getUserList(){
        return LatestUserRequest;
    }
    public static void addActivity(String username,LogFoRequest log){
        if(RedisHelper.Instance.isConfigured()&&false){
            LogFoRequest old = LatestUserRequest.get(username);
            if(old==null || (Times.getTime())-old.starttime.getTime()>100*60*5){
                RedisHelper.Instance.setMapObject(username,log,"UserList_Site_"+Ladder.Settings().getSite(),5L,-1);
            }
        }
        LatestUserRequest.put(username,log);
    }

    /**
     * 用户体系本地存储
     */
    private static final Map My_UserStorage = new HashMap();
    public static UserStorage getUserStorage(){
        return My_UserStorage.get(Developer);
    }
    public static UserStorage getUserStorage(String name){
        return My_UserStorage.get(name);
    }

    static {
        My_UserStorage.put(Developer,new UserStorage().setDeveloper());
        My_UserStorage.put(Org,new UserStorage().setOrg());
    }

    public static UserStorage setUserStorage(UserStorage storage){
        if(storage==null)return null;
        My_UserStorage.put(storage.getName(),storage);
        return storage;
    }
    public static ReStruct getCheckCode(){
        VCodeGenerator vcode = new VCodeGenerator();
        String code = vcode.generatorVCode();
        BufferedImage bImage = vcode.generatorRotateVCodeImage(code, true);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            ImageIO.write(bImage, "png", out);
        } catch (IOException e) {
            return new ReStruct<>(e.getMessage());
        }
        byte[] data = out.toByteArray();
        return new ReStruct<>(true,code ,Security.encryptByBase64(data));
    }

    /***
     * 活跃
     * @param userinfo 用户信息
     * @param token 密钥
     * @param clazz 用户类
     * @param  泛型
     */

    public static  AjaxResult active(String userinfo, String token, Class clazz){
        if (WebHub.IsDebug){
            if (Strings.hasValue(userinfo) && userinfo != "{}"){
                return new AjaxResult(Json.toObject(userinfo,clazz)).setStatusCode(111);
            }
            BaseUserInfo info = UpmsAction.getUserInfo(clazz);
            if (info == null){
                //var cookies = WebContext.Current.Request.Cookies;
            }
            return new AjaxResult(UpmsAction.getUserInfo(clazz)).setStatusCode(111);
        }
        if (Strings.isBlank(userinfo) || Regex.isMatch(userinfo, "\\s*\\{\\s*\\}\\s*")){
            T info = Strings.isBlank(token)?getUserInfo(clazz):getUserInfo(token,clazz);
            if (info == null){
                //Logs.WriteLog($"uuid:{GetUuid()};UserSessionUUID:{WebContext.Current.Session.GetString("UserSessionUUID")};GetCookies:{HttpHelper.GetCookies("UserSessionUUID")};SessionID{WebContext.Current.Session.Id}", "UpmsService");
            }
            if (Regex.isMatch(HttpHelper.getIp(), "(127.0.0.1)|(localhost)")) return new AjaxResult(200).setData(info);
            //if (Strings.isBlank(info.uuid)) info.uuid = GetUuid();
            return new AjaxResult(info == null ? -401 : 200).setData(info);
        }
        else{
            T info = Json.toObject(userinfo,clazz);
            if (info == null || Strings.isBlank(info.getUsername())) return new AjaxResult(-401);
            UserStorage storage = getUserStorage(info.getStorage());
            if(storage==null)return new AjaxResult(-401);
            Record record = QueryAction.getRecord(storage.getTable_user(), new Cnd(storage.getField_username(), info.getUsername()),null,null);
            if (record.getString(storage.getField_uuid()) != info.uuid && !Regex.isMatch(HttpHelper.getIp(), "(127.0.0.1)|(localhost)")){
                return new AjaxResult(333, "用户在他处登录").setData(record.getString("ip"));
            }
            setUserInfo(info,false);
            return new AjaxResult().setData(info);
        }
    }

    /**
     * 获取登录的用户名
     * @return
     */
    public static String getUserName(){
        try{
            if (WebContext.getSession()!= null){
                BaseUserInfo userinfo = getUserInfo(BaseUserInfo.class);
                return userinfo==null?"":userinfo.getUsername();
            }
        }
        catch (Exception e) {
            //Logs.Write(new LogForError(e.Message,"用户测试"),LogOption.Error);
            return "";
        }
        return "";
    }

    /**
     * 是否存在客户端
     * @param uuid 客户端编码
     * @return
     */
    public static boolean exist(String uuid){
        if(Strings.isBlank(uuid))return false;
        BaseUserInfo user = (BaseUserInfo) WebContext.getSession().getAttribute("_userinfo_");
        if(user!=null&&uuid.equals(user.uuid))return true;
        boolean has = DataHub.WorkCache.hasModuleCache(uuid,"_user_");
        if(has)return true;
        return false;
    }

    public static  T getUserInfo(Class clazz){
        return getUserInfo(getUuid(),clazz);
    }

    /**
     * 获取登录的用户信息
     * @param uuid
     * @param clazz
     * @param 
     * @return
     */
    public static  T getUserInfo(String uuid, Class clazz){
        try{
            if(Strings.isBlank(uuid))return null;
            if (WebContext.getSession() != null){
                T userInfo = (T)My_Cache.get(uuid);
                if(userInfo!=null)return userInfo;
                userInfo = DataHub.WorkCache.getModuleCache(uuid, "_user_");
                if (userInfo == null){
                    if (userInfo == null && WebContext.getSession().getAttribute("AgainLogin") != null) return null;
                    if (userInfo == null && WebContext.getSession().getAttribute("AgainLogin") == null){
                        WebContext.getSession().setAttribute("AgainLogin","1");
                    }
                    if (userInfo != null){
                        DataHub.WorkCache.addModuleCache(uuid, userInfo,  "_user_",60*60*2);
                        My_Cache.put(uuid,userInfo);
                        WebContext.getSession().removeAttribute("AgainLogin");
                    }
                }
                else{
                    WebContext.getSession().removeAttribute("AgainLogin");
                }
                return userInfo;
            }
        }
        catch (Exception e){
            return null;
        }
        return null;
    }

    /**
     * 设置登录用户信息
     * @param userinfo 用户信息
     * @param firstLogin 首次登录
     * @param 
     */
    public static  void setUserInfo(T userinfo,boolean firstLogin){
        if(userinfo==null)return;
        userinfo.uuid= getUuid();
        userinfo.setSessionid(WebContext.getSession().getId());
        if (firstLogin){
            UserStorage storage = My_UserStorage.get(userinfo.getStorage());
            if(storage==null)return;
            WebContext.getSession().removeAttribute("AgainLogin");
            String old = QueryAction.getValue(storage.getTable_user(), storage.getField_uuid(), new Cnd(storage.getField_username(), userinfo.getUsername()), null, String.class);
            if (!userinfo.uuid.equals(old)){
                DataHub.WorkCache.removeModuleCache(userinfo.uuid,"_user_");
                SaveAction.update(storage.getTable_user(),new Record(storage.getField_uuid(),userinfo.uuid), new Cnd(storage.getField_username(), userinfo.getUsername()));
            }
            try{
                List keys=new ArrayList<>();
                My_Cache.forEach((k,v)->{
                    if(userinfo.getUsername().equals(((BaseUserInfo)v).getUsername())){
                        keys.add(k);
                    }
                });
                if(keys.size()>0){
                    keys.forEach(x->My_Cache.remove(x));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            My_Cache.put(userinfo.uuid,userinfo);
        }
        DataHub.WorkCache.addModuleCache(userinfo.uuid, userinfo,  "_user_",20*60);
    }
    /**
     * 获取用户信息
     * @param cnd 用户条件
     * @param glass 泛型类型
     * @param  泛型
     * @return
     */
    public static  T getUserInfo(Cnd cnd,Class glass){
        return getUserInfo(Developer,cnd,glass);
    }
    /**
     * 获取用户信息
     * @param cnd 用户条件
     * @param glass 泛型类型
     * @param  泛型
     * @return
     */
    public static  T getUserInfo(String storage,Cnd cnd,Class glass){
        if(Strings.isBlank(storage))storage=Developer;
        UserStorage userstorage = getUserStorage(storage);
        if(userstorage==null)return null;
        return repair(QueryAction.getObject(userstorage.getTable_user(), cnd,null,null,glass),userstorage);
    }
    public static  T getUserInfo(String value,String propname,Class clazz){
        return getUserInfo(Developer,value,propname,clazz);
    }
    /**
     * 获取用户信息
     * @param value 用户名或其他数据值
     * @param propname 属性名称
     * @param clazz 类型
     * @param  泛型
     * @return
     */
    public static  T getUserInfo(String storage,String value,String propname,Class clazz){
        UserStorage userstorage = My_UserStorage.get(storage);
        if(userstorage==null)return null;
        if (Strings.isBlank(propname)) propname = userstorage.getField_username();
        return repair(QueryAction.getObject(userstorage.getTable_user(), new Cnd(propname, value), null, null, clazz),userstorage);
    }

    /**
     * 修复用户信息
     * @param userinfo 用户信息
     * @param  泛型
     * @return
     */
    private static  T repair(T userinfo,UserStorage storage){
        if(userinfo==null)return null;
        if(storage==null)storage=My_UserStorage.get(Developer);
        if(storage==null)return null;
        if (Strings.hasValue(userinfo.getGroupid())){
            TreeModel tm = new TreeModel();
            IDataModel dm = DaoSeesion.getDataModel(storage.getTable_usergroup());
            String tableName = dm.getTableName();
            tm.RecurFromTable(userinfo.getGroupid(), tableName);
            List cids = tm.GetIds();
            cids.add(userinfo.getGroupid());
            userinfo.setGroups(cids);
        }else{
            userinfo.setGroupid("_default_");
            List groups = new ArrayList();
            groups.add("_default_");
            userinfo.setGroups(groups);
        }
        return userinfo;
    }

    /**
     * 退出
     */
    public static void loginout(){
        loginout(null);
    }
    /***
     * 退出登录
     */
    public static void loginout(String uuid){
        if(Strings.isBlank(uuid))uuid=getUuid();
        DataHub.WorkCache.removeModuleCache(uuid, "_user_");
        WebContext.getSession().removeAttribute("UserSessionUUID");
        WebContext.getSession().setAttribute("AgainLogin", 11);
        RedisHelper.Instance.delete(uuid);
    }
    /// 
    ///获取用户标题
    /// 
    /// 
    public static String getUserTitle(){
        try{
/*            if (RunTime.IsWeb && WebContext.Current?.Session != null)
            {
                var userinfo = GetUserInfo();
                if (userinfo == null) return "";
                return userinfo.username+"{}[{userinfo.FullName}]";
            }*/
        }
        catch (Exception e){
            return "";
        }
        return "";
    }
    /// 
    /// 获取的用户的Token
    /// 
    /// 
    public static String getUserToken(){
        try{
/*            if (RunTime.IsWeb && WebContext.Current?.Session != null)
            {
                var userinfo = GetUserInfo();
                if (userinfo == null) return "";
                return userinfo.UserToken;
            }*/
        }
        catch (Exception e){
            return "";
        }
        return "";
    }
    /**
     * 获取账户中心token
     * @param username 用户名
     * @return
     */
    public static ReStruct genUserToken(String username){
        String ssoserver = Ladder.Settings().getBusiness().getSso();
        String site = Ladder.Settings().getSite();
        if(site==null)site = Ladder.Settings().getSite();
        String resultInfo = HttpHelper.request(ssoserver + "/LoginBySub.aspx?systemcode=" + site + "&username=" + username, null, "GET",null).getData();
        if (!Strings.isBlank(resultInfo))
        {
            Record ret = Record.parse(resultInfo);
            if (ret != null &&   "200".equals(ret.getString("Code", true)))
            {
                String token = ret.getString("Result", true);
                return new ReStruct(true, token, ret.getString("Rel"));
            }
        }
        return new ReStruct(false);
    }
    public static void setUuid(String uuid){
        try {
            WebContext.setAttribute("_user_uuid_",uuid);
            WebContext.getSession().setAttribute("UserSessionUUID", uuid.toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 获取客户端的UUID
     * @return
     */
    public static String getUuid(){
        int step = 0;
        String uuid=WebContext.getAttributeString("_user_uuid_");
        if(Strings.hasValue(uuid)){
            return uuid;
        }
        uuid = Core.toString(WebContext.getSession().getAttribute("UserSessionUUID"));
        if (Strings.isBlank(uuid)){
            step = 1;
            uuid = WebContext.getCookie("UserSessionUUID");
        }
        else{
            Cookie[] cookies = WebContext.getRequest().getCookies();
            if (cookies!=null && cookies.length < 1) step = 2;
        }
        if (Strings.isBlank(uuid)){
            step = 2;
            try{
                uuid = WebContext.getSession().getId();
            }
            catch (Exception e){
                uuid = "";
            }
        }
        if (Strings.isBlank(uuid)){
            step = 3;
            uuid = Core.genUuid();
        }
        try{
            if (step > 0) WebContext.getSession().setAttribute("UserSessionUUID", uuid);
            if (step > 1) WebContext.getResponse().addCookie(new Cookie("UserSessionUUID", uuid));
        }
        catch (Exception e){
            // ignored
        }
        return uuid;
    }



}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy