JRTLIS登录

之前一直没做登录一是登录涉及业务,框架还没完成的情况不想涉及业务。二是没想好怎么提供多产品适用的登录界面。

不同产品可能登录的组是不同的,如:医生的科室、护士的病区、检验的工作组、试剂的试剂组、血库的输血科。如果登录要把大家都融合进来势必增加登录的逻辑复杂度、同时绑死了各个业务快,这样不太合适,但是大家验证用户密码后都会选个角色,为此把验证成功后的选择称为角色(可以是检验的工作组、医生的科室、试剂的试剂组等),这样就能提供一个大家共用的登录界面。

首先抽取角色表
在这里插入图片描述
然后抽取角色菜单表
在这里插入图片描述

再抽取菜单功能点表
在这里插入图片描述

角色和菜单这些表大家共用,共用就可以共用登录和菜单逻辑代码。用户表以及用户和角色关联的表各种系统自由定义。

例如检验系统的用户角色定义
在这里插入图片描述

基于上面表设计提供登录接口供各个业务实现,登录的差异性由接口抽象出来,包含登录界面显示的标题、系统名称、角色名称、密码安全级别、密码长度、验证用户、返回角色密码、修改密码:

package JRT.Login;

import java.util.List;

import JRT.Login.SelectRoleDto;

/**
 * 作为JRT实现登录的抽象接口,不同系统登录实现该接口,把接口实现类配置到容器里,通过给登录界面URL指定LoginType为配置对象ID实现不同系统的登录,
 * 从而方便各个依赖JRT开发的系统共享登录和菜单功能部分,可以快速把登录和菜单并入自己系统而又不需要介入太多,自己可以用自己的用户表和用户权限部分。
 */
public interface ILogin {
    /**
     * 得到登录界面显示的大标题
     *
     * @return 大标题
     */
    String GetSystemTitle();

    /**
     * 得到登录界面用户密码框上面显示的系统名称
     *
     * @return 系统名称
     */
    String GetSystemName();

    /**
     * 得到登录界面Url显示的名称
     *
     * @return URL名称
     */
    String GetUrlTitle();

    /**
     * 得到登录的角色类型名称,如:工作组、科室、试剂组等
     *
     * @return URL名称
     */
    String GetRoleTypeName();

    /**
     * 返回空就是不要求密码强度,1,2,3密码要求加强
     *
     * @return
     */
    String GetSYSPasswordLevel() throws Exception;

    /**
     * 返回要求的密码长度限制,有密码级别要求才限制强度
     *
     * @return
     */
    int GetSYSPasswordLength() throws Exception;

    /**
     * 检查用户名和密码
     *
     * @param userCode 用户在登录界面输入的用户名
     * @param pass     用户在登录界面输入的密码
     * @return 是否验证通过
     */
    boolean CheckUser(String userCode, String pass) throws Exception;

    /**
     * 检查用户名和密码
     *
     * @param userCode 用户在登录界面输入的用户名
     * @return 是否验证通过
     */
    List<SelectRoleDto> GetSelectRole(String userCode) throws Exception;

    /**
     * 修改用户密码,用户密码强度不符合时候修改密码调用的接口
     *
     * @param userCode 用户在登录界面输入的用户名
     * @param passOld  用户在登录界面输入的老密码
     * @param passNew  用户在登录界面输入的新密码
     * @return 成功返回空,否则返回失败原因
     */
    String ChangePassword(String userCode, String passOld, String passNew) throws Exception;
}

返回角色列表的实体类,登录时候借助此信息构造会话对象:

package JRT.Login;

/**
 * 用户登录界面选择的角色数据实体
 */
public class SelectRoleDto {
    /**
     * 必须是JRTRole表的主键,用户选择角色后按此值加载菜单数据,会在登录时候放入会话对象
     */
    public int RoleDR;

    /**
     * 登录界面选择角色下拉框显示的名称,会在登录时候放入会话对象
     */
    public String RoleName;

    /**
     * 以^分割的会话信息串,给需要的地方直接使用,不同系统自己约定每位存什么,会在登录时候放入会话对象
     */
    public String SessionStr;

    /**
     * 存用户主键,会在登录时候放入会话对象
     */
    public String UserID;

    /**
     * 存用户代码,会在登录时候放入会话对象
     */
    public String UserCode;

    /**
     * 存用户名称,会在登录时候放入会话对象
     */
    public String UserName;

    /**
     * 用户登录的工作组或科室ID,会在登录时候放入会话对象
     */
    public String GroupID;
}

检验的登录实现类:

package JRT.Login;

import JRT.Core.Dto.HashParam;
import JRT.Core.Util.LogUtils;
import JRT.Core.Util.PassWordUtil;
import JRT.DAL.ORM.EntityManager.EntityManagerFactory;
import JRT.DAL.ORM.EntityManager.IEntityManager;
import JRT.Login.SelectRoleDto;
import JRT.Model.Entity.*;

import java.util.ArrayList;
import java.util.List;

/**
 * 作为登录到检验工作组的实现类,其他登录科室和试剂组的登录实现参照此类即可,由登录界面通过URL上的LoginType从容器获取登录实现类
 */
public class LoginLIS implements JRT.Login.ILogin {

    /**
     * 访问数据库
     */
    private IEntityManager entityManager = null;

    /**
     * 给业务脚本提供的操作数据库的对象
     */
    public IEntityManager EntityManager() {
        if (entityManager == null) {
            entityManager = EntityManagerFactory.CreateEntityManager("");
        }
        return entityManager;
    }

    /**
     * 得到登录界面显示的大标题
     *
     * @return 大标题
     */
    @Override
    public String GetSystemTitle() {
        return "检验信息管理系统";
    }

    /**
     * 得到登录界面用户密码框上面显示的系统名称
     *
     * @return 系统名称
     */
    @Override
    public String GetSystemName() {
        return "检验系统";
    }

    /**
     * 得到登录界面Url显示的名称
     *
     * @return URL名称
     */
    @Override
    public String GetUrlTitle() {
        return "JRTLIS © 1.0";
    }

    /**
     * 得到登录的角色类型名称,如:工作组、科室、试剂组等
     *
     * @return URL名称
     */
    @Override
    public String GetRoleTypeName() {
        return "工作组";
    }

    /**
     * 返回空就是不要求密码强度,1,2,3密码要求加强
     *
     * @return
     */
    @Override
    public String GetSYSPasswordLevel() throws Exception {
        //查询系统参数
        SYSParameter dto = EntityManager().GetByColVal(SYSParameter.class, "Code", "SYSPasswordLevel");
        if (dto != null) {
            return dto.ParaValue;
        }
        return "";
    }

    /**
     * 返回要求的密码长度限制,有密码级别要求才限制强度
     *
     * @return
     */
    @Override
    public int GetSYSPasswordLength() throws Exception {
        //查询系统参数
        SYSParameter dto = EntityManager().GetByColVal(SYSParameter.class, "Code", "SYSPasswordLength");
        if (dto != null) {
            if (dto.ParaValue != null && !dto.ParaValue.isEmpty()) {
                return Integer.valueOf(dto.ParaValue);
            }
        }
        return 9;
    }

    /**
     * 检查用户名和密码
     *
     * @param userCode 用户在登录界面输入的用户名
     * @param pass     用户在登录界面输入的密码
     * @return 是否验证通过, 验证不通过的前端都统一返回用户名或密码错误
     */
    @Override
    public boolean CheckUser(String userCode, String pass) throws Exception {
        //按代码查询用户
        SYSUser user = EntityManager().GetByColVal(SYSParameter.class, "Code", userCode);
        //没查到用户
        if (user == null) {
            LogUtils.WriteDebugLog("用户:" + userCode + "不存在");
            return false;
        }
        //比较密码
        boolean checkRes = PassWordUtil.PassCompare(pass, user.Password);
        return checkRes;
    }

    /**
     * 检查用户名和密码
     *
     * @param userCode 用户在登录界面输入的用户名
     * @return 是否验证通过
     */
    @Override
    public List<SelectRoleDto> GetSelectRole(String userCode) throws Exception {
        List<SelectRoleDto> retList = new ArrayList<>();
        //按代码查询用户
        SYSUser user = EntityManager().GetByColVal(SYSParameter.class, "Code", userCode);
        //没查到用户
        if (user == null) {
            return retList;
        }
        HashParam para = new HashParam();
        para.Add("UserDR", user.RowID);
        List<SYSUserRole> roleList = EntityManager().FindAllSimple(SYSUserRole.class, para);
        if (roleList != null && roleList.size() > 0) {
            for (SYSUserRole dto : roleList) {
                //取工作组数据
                BTWorkGroup wgDto = EntityManager().DolerGet(BTWorkGroup.class, dto.WorkGroupDR);
                //得到科室
                BTDepartment depDto = EntityManager().DolerGet(BTDepartment.class, wgDto.DepartmentDR);
                //得到医院
                BTHospital hosDto = EntityManager().DolerGet(BTHospital.class, depDto.HospitalDR);
                //岗位名称
                String postName = "";
                if (dto.PostDR != null) {
                    //取岗位数据
                    SYSPost postDto = EntityManager().DolerGet(BTWorkGroup.class, dto.WorkGroupDR);
                    postName = "[" + postDto.CName + "]";
                }
                SelectRoleDto role = new SelectRoleDto();
                role.RoleDR = dto.RoleDR;
                role.RoleName = wgDto.CName + postName;
                //放工作组
                role.GroupID = String.valueOf(dto.WorkGroupDR);
                role.UserID = String.valueOf(user.RowID);
                role.UserCode = user.Code;
                role.UserName = user.CName;
                role.SessionStr = user.RowID + "^" + dto.WorkGroupDR + "^" + depDto.RowID + "^" + dto.RoleDR + "^" + hosDto.RowID;
                retList.add(role);
            }
        }
        return retList;
    }

    /**
     * 修改用户密码,用户密码强度不符合时候修改密码调用的接口
     *
     * @param userCode 用户在登录界面输入的用户名
     * @param passOld  用户在登录界面输入的老密码
     * @param passNew  用户在登录界面输入的新密码
     * @return 成功返回空,否则返回失败原因
     */
    @Override
    public String ChangePassword(String userCode, String passOld, String passNew) throws Exception {
        //按代码查询用户
        SYSUser user = EntityManager().GetByColVal(SYSParameter.class, "Code", userCode);
        //没查到用户
        if (user == null) {
            return "用户:" + userCode + "不存在!";
        }
        //比较密码
        boolean checkRes = PassWordUtil.PassCompare(passOld, user.Password);
        if (checkRes == false) {
            return "用户名或密码不正确!";
        }
        //加密密码
        user.Password = PassWordUtil.PassEntry(passNew);
        //更新密码
        List<String> upCol = new ArrayList<>();
        upCol.add("Password");
        int ret = EntityManager().Update(user, upCol);
        if (ret == 1) {
            return "";
        } else {
            return "修改密码发送错误!";
        }
    }
}

把检验的登录实现类配置到容器
在这里插入图片描述

登录后台通过容器取实现类为登录界面服务

import JRT.Core.Dto.HashParam;
import JRT.Core.MultiPlatform.JRTConfigurtaion;
import JRT.Core.MultiPlatform.JRTContext;
import JRT.DAL.ORM.EntityManager.EntityManagerImpl;
import JRT.Login.ILogin;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;

import java.util.HashMap;
import java.util.List;

/**
 * 作为登录界面的后台实现类,实现用户验证和修改密码登,为登录构造会话
 */
public class ashLogin extends BaseHttpHandlerNoSession {

    /**
     * 登录接口
     */
    private ILogin login=null;

    /**
     * 得到登录的实现类
     * @return
     * @throws Exception
     */
    private ILogin Login() throws Exception
    {
        //登录类型
        String LoginType=Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "LoginType"), "LisLogin");
        if(login==null) {
            login = (ILogin) JRT.Core.Context.ObjectContainer.GetObject(LoginType);
        }
        return login;
    }

    /**
     * 得到登录信息
     * @return 常用信息的键值对
     */
    public String GetLoginInfo() throws Exception
    {
        HashMap map=new HashMap();
        //系统标题
        map.put("SystemTitle",Login().GetSystemTitle());
        //系统名称
        map.put("SystemName",Login().GetSystemName());
        //模块名称
        map.put("UrlTitle",Login().GetUrlTitle());
        //选择的角色名称
        map.put("RoleTypeName",Login().GetRoleTypeName());
        //密码级别
        map.put("SYSPasswordLevel",Login().GetSYSPasswordLevel());
        //密码长度
        map.put("SYSPasswordLength",Login().GetSYSPasswordLength());
        //显示的服务器IP
        String ServiceShowIP= JRTConfigurtaion.Configuration("ServiceShowIP");
        //密码长度
        map.put("ServiceShowIP",ServiceShowIP);
        //密码长度
        map.put("ClientIP",JRTContext.GetClientIP(Request));
        return Helper.Object2Json(map);
    }

}




登录界面1.0,其他不同登录实现登录接口后配置到容器即可,给登录界面URL指定LoginType为配置的容器对象id即可
在这里插入图片描述

在这里插入图片描述

这样就可以极大的简化登录逻辑,让登录满足多种系统,这里依赖容器对登录实现进行解耦,把具体系统的登录业务和公共逻辑剥离,借助容器解耦是一种良好的编程模式,滥用容器就不是了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/274681.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度交易中台之系统对账篇

作者 | 天空 导读 introduction 百度交易中台作为集团移动生态战略的基础设施&#xff0c;面向收银交易与清分结算场景&#xff0c;赋能业务、提供高效交易生态搭建。目前支持百度体系内多个产品线&#xff0c;主要包括&#xff1a;度小店、小程序、地图打车、文心一言等。本文…

MNN createSession 之创建流水线后端(四)

系列文章目录 MNN createFromBuffer&#xff08;一&#xff09; MNN createRuntime&#xff08;二&#xff09; MNN createSession 之 Schedule&#xff08;三&#xff09; MNN createSession 之创建流水线后端&#xff08;四&#xff09; MNN Session::resize 之流水线编码&am…

记录解决问题--activiti8.2 流程图图片由png改为svg前端不显示图片问题

1.说明 如果是vue svg显示&#xff0c;请查阅其他标准资料&#xff0c;类似使用svg标签。我这里讲的另外一种情况&#xff0c;链接返回的是svg文件&#xff0c;需要用v-html显示图片。 2.activiti6流程图图片格式 ①png格式。可以查看链接返回&#xff0c;以png开头。 ②前端…

常见传感器的原理 和 常见滤波算法实现

阅读引言&#xff1a; 分析常见的传感器的电路原理、向大家提供一些ADC常见的滤波算法的实现, 介绍声、光、热、电、力、气和磁传感器的大致工作原理。 目录 一、常见传感器工作原理 1.声音传感器-动圈&电容咪头 2.光传感器-光敏电阻 3.热传感器-热电偶 4.电传感器-电…

开源模型应用落地-安全合规篇-模型输出合规性检测(三)

一、前言 为什么我们需要花大力气对用户输入的内容和模型生成的输出进行合规性检测,一方面是严格遵守各项法规要求,具体如下:互联网信息服务深度合成管理规定https://www.gov.cn/zhengce/zhengceku/2022-12/12/content_5731431.htm ​ 其次,受限于模型本身的一些缺陷,…

Bert的一些理解

Bert的一些理解 Masked Language Model (MLM)Next Sentence Prediction (NSP)总结 参考链接1 参考链接2 BERT 模型的训练数据集通常是以预训练任务的形式来构建的&#xff0c;其中包括两个主要任务&#xff1a;Masked Language Model (MLM) 和 Next Sentence Prediction (NSP)。…

(简单成功)Mac:命令设置别名

案例&#xff1a;给"ls -l"命令&#xff0c;设置别名通过”ll“快速访问 1、在项目根目录底下查看有无.bash_profile文件&#xff0c;注意这个是个隐藏文件&#xff0c;需要使用ls -a命令查看&#xff1a; 没有.bash_profile新建一个文件&#xff0c; 在最后添加一行…

原生html vue3使用element plus 的树tree上移下移案例源码

上效果 html源码 <!DOCTYPE html> <html lang"en"> <!-- * Name: mallSalesReports.html * Description: * Author Lani * date 2024-02-28 18:32:36 --> <head><meta charset"UTF-8"><meta name"viewport" …

轻松解锁微博视频:基于Perl的下载解决方案

引言 随着微博成为中国最受欢迎的社交平台之一&#xff0c;其内容已经变得丰富多彩&#xff0c;特别是视频内容吸引了大量用户的关注。然而&#xff0c;尽管用户对微博上的视频内容感兴趣&#xff0c;但却面临着无法直接下载这些视频的难题。本文旨在介绍一个基于Perl的解决方…

java算法题每日多道

274. H 指数 题目 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;…

行业模板|DataEase制造行业大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

Angular进阶之八: Angular Animation在项目中的实践经验

使用 Angular 进行项目开发的程序员应该都很熟悉 Angular Animation。这是一个 Angular 原生的动画库&#xff0c;它可以替代或者辅助完成原本需要使用 css 的动画功能。 Angular 在国内的运用是很有限的&#xff0c;可借鉴的文档并不很丰富。尤其对于 Angular 动画模块的应用…

【leetcode热题】二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

微信小程序 canvas层级过高覆盖原生组件

一、背景 微信小程序中使用signature第三方插件完成签名效果&#xff0c;但真机调试时发现canvas层级过高遮挡了按钮 二、具体问题 问题原因&#xff1a;签名后点击按钮无法生效 问题代码&#xff1a; <template><view class"sign_page" v-cloak>&l…

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级

目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…

【linux】Debian访问Debian上的共享目录

要在Debian系统上访问共享目录&#xff0c;通常意味着要访问通过网络共享的文件夹&#xff0c;比如通过SMB/CIFS&#xff08;Server Message Block/Common Internet File System&#xff09;协议共享的Windows共享文件夹。以下是访问共享目录的步骤&#xff1a; 1. 安装必要的…

kafka2.x版本配置SSL进行加密和身份验证

背景&#xff1a;找了一圈资料&#xff0c;都是东讲讲西讲讲&#xff0c;最后我还没搞好&#xff0c;最终决定参考官网说明。 官网指导手册地址&#xff1a;Apache Kafka 需要预备的知识&#xff0c;keytool和openssl 关于keytool的参考&#xff1a;keytool的使用-CSDN博客 …

MacOS Xcode 使用LLDB调试Qt的 QString

环境&#xff1a; MacOS&#xff1a; 14.3Xcode&#xff1a; Version 15.0Qt&#xff1a;Qt 6.5.3 前言 Xcode 中显示 预览 QString 特别不方便, 而Qt官方的 lldb 脚本debugger/lldbbridge.py一直加载失败&#xff0c;其他第三方的脚本都 不兼容当前的 环境。所以自己研究写…

使用华为云HECS服务器+nodejs开启web服务

简介: 在华为云HECS服务器上使用nodejs开启一个web服务。 目录 1.开通华为云服务器 2.远程登录 2.1 使用华为官方的网页工具登录 ​编辑 2.2 使用MobaXterm登录 3 安装node 3.1 下载 2. 配置环境变量 4. 安装express模块 5.开启外网访问 1.开通华为云服务器 这…

Flutter-底部弹出框(Widget层级)

需求 支持底部弹出对话框。支持手势滑动关闭。支持在widget中嵌入引用。支持底部弹出框弹出后不影响其他操作。支持弹出框中内容固定头部和下面列表时&#xff0c;支持触摸头部并在列表不在头部的时候支持滑动关闭 简述 通过上面的需求可知&#xff0c;就是在界面中可以支持…
最新文章