JRT菜单

上一章搭建了登录界面的雏形和抽取了登录接口。给多组使用登录和菜单功能提供预留,做到不强行入侵别人业务。任何产品只需要按自己表实现登录接口后配置到容器即可共用登录界面和菜单部分。最后自己的用户关联到JRT角色表即可。

登录效果
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这次构建菜单体系

首先用dbo.JRTForm描述页面路径资源
在这里插入图片描述
用dbo.JRTFormFunction描述页面的控制点
在这里插入图片描述

然后用菜单dbo.JRTMenu表描述菜单树
在这里插入图片描述

最后用角色和角色菜单把菜单数据通过角色暴露给业务模块
在这里插入图片描述

在这里插入图片描述

这样业务模块就很自由了,可以自由的用自己的用户表,自己的用户角色关系。最终只需要有关系对应上JRTRole表就行了,在登录接口实现执行角色就能共用整套登录和菜单体系了。比如检验的用户登录的工作组。
在这里插入图片描述
登录接口实现类按具体表和菜单暴露的角色表对接,JRT开头的表是给大家共用的
在这里插入图片描述

效果
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

JRT提供执行SQL语句的api,不到万不得已的时候JRT不鼓励用SQL语句写业务,因为一旦用SQL之后,跨数据库就成为无稽之谈,目前没有发现使用SQL语句的必要性。

系统页面维护后台代码

import JRT.Core.CustomAttributes.Trans;
import JRT.Core.Dto.OutValue;
import JRT.Core.Util.TxtUtil;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;
import JRT.Core.Dto.HashParam;
import JRT.Core.Dto.ParamDto;
import JRT.Core.Dto.OutParam;
import JRT.Model.Entity.*;
import JRT.Core.Util.Convert;
import JRT.Core.MultiPlatform.JRTContext;

import java.io.File;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * 界面资源维护的后台代码
 */
public class ashJRTForm extends BaseHttpHandlerNoSession {

    /**
     * 保存数据,前台按表的属性名提交
     *
     * @return 字符串
     */
    public String SaveJRTForm() throws Exception {
        JRTForm dto = new JRTForm();
        //主键
        dto.RowID = Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), dto.RowID);
        //名称
        dto.CName = Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), dto.CName);
        //序号
        dto.Sequence = Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), dto.Sequence);
        //激活  {1:true,0:false}
        dto.Active = Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), dto.Active);
        //相对路径
        dto.Path = Helper.ValidParam(JRTContext.GetRequest(Request, "Path"), dto.Path);
        //说明
        dto.Remark = Helper.ValidParam(JRTContext.GetRequest(Request, "Remark"), dto.Remark);
        //帮助信息
        dto.FormHelp = Helper.ValidParam(JRTContext.GetRequest(Request, "FormHelp"), dto.FormHelp);
        //宽度
        dto.HelpWidth = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpWidth"), dto.HelpWidth);
        //高度
        dto.HelpHeight = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpHeight"), dto.HelpHeight);
        //帮助文档路径
        dto.HelpDoc = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpDoc"), dto.HelpDoc);
        OutParam out = new OutParam();
        int ret = 0;
        //更新
        if (dto.RowID > 0) {
            ret = EntityManager().Update(dto, null, out, null, null, null);
        }
        //插入数据
        else {
            ret = EntityManager().Save(dto, out);
        }
        if (ret == 1) {
            return Helper.Success();
        } else {
            return Helper.Error(out);
        }
    }


    /**
     * 删除数据,多个RowID以上尖号分割
     *
     * @return 字符串
     */
    @Trans
    public String DeleteJRTForm() throws Exception {
        String RowIDS = Helper.ValidParam(JRTContext.GetRequest(Request, "RowIDS"), "");
        if (RowIDS.isEmpty()) {
            return Helper.Error("请传入要删除数据的RowID,多个以^分割!");
        }
        //分割主键
        String[] arr = RowIDS.split("^");
        //循环删除数据
        for (int i = 0; i < arr.length; i++) {
            int formDR = Convert.ToInt32(arr[i]);
            //删除页面功能点
            List<JRTFormFunction> formFunList = EntityManager().FindByColVal(JRTFormFunction.class, "FormDR", formDR);
            if (formFunList != null && formFunList.size() > 0) {
                for (JRTFormFunction f : formFunList) {
                    int ret = EntityManager().Remove(f, ErrRet());
                    if (ret != 1) {
                        throw new Exception(Err.GetString());
                    }
                }
            }
            //删除页面数据
            int ret = EntityManager().RemoveById(JRTForm.class, formDR, ErrRet());
            if (ret != 1) {
                throw new Exception(Err.GetString());
            }
        }
        return Helper.Success();
    }


    /**
     * 查询数据,前台按表的属性名提交
     *
     * @return 字符串
     */
    public String QryJRTForm() throws Exception {
        //预留的取前台参数代码
        //参数
        List<ParamDto> para = new ArrayList<>();
        //sql连接符号
        List<String> joiner = new ArrayList<>();
        //sql比较符号
        List<String> operators = new ArrayList<>();
        //模糊查询
        String Filter = Helper.ValidParam(JRTContext.GetRequest(Request, "Filter"), "");
        //预留参数
        //主键
        String RowID = Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), "");
        //名称
        String CName = Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), "");
        //序号
        String Sequence = Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), "");
        //激活  {1:true,0:false}
        String Active = Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), "");
        //相对路径
        String Path = Helper.ValidParam(JRTContext.GetRequest(Request, "Path"), "");
        //说明
        String Remark = Helper.ValidParam(JRTContext.GetRequest(Request, "Remark"), "");
        //帮助信息
        String FormHelp = Helper.ValidParam(JRTContext.GetRequest(Request, "FormHelp"), "");
        //宽度
        String HelpWidth = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpWidth"), "");
        //高度
        String HelpHeight = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpHeight"), "");
        //帮助文档路径
        String HelpDoc = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpDoc"), "");
        //模糊查询
        if (!Filter.isEmpty()) {
            ParamDto p = null;
            //名称
            p = new ParamDto();
            p.Key = "CName";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //相对路径
            p = new ParamDto();
            p.Key = "Path";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //说明
            p = new ParamDto();
            p.Key = "Remark";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //帮助信息
            p = new ParamDto();
            p.Key = "FormHelp";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //帮助文档路径
            p = new ParamDto();
            p.Key = "HelpDoc";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
        }
        //调用查询
        String json = EntityManager().QueryAllWithFK(JRTForm.class, para, "", true, -1, -1, "", joiner, operators);
        return json;
    }

    /**
     * 得到页面的功能点
     *
     * @return
     */
    public String GetFormFunction() throws Exception {
        int FormDR = Helper.ValidParam(JRTContext.GetRequest(Request, "FormDR"), 0);
        List<FormFunctionDto> retList = GetFunctionList(FormDR);
        if (retList == null || retList.size() == 0) {
            return "[{\"RowID\":\"-2\",\"Name\":\"" + "\"无功能点控制\"" + "\"}]";
        } else {
            //取功能点名称
            for (FormFunctionDto one : retList) {
                if (one.FunctionDR != null) {
                    JRTFunction fun = EntityManager().DolerGet(JRTFunction.class, one.FunctionDR);
                    one.FunctionName = fun.CName;
                }
            }
        }
        return Helper.Object2Json(retList);
    }

    /**
     * 得到页面功能点列表
     *
     * @param formDR 页面主键
     * @return 页面功能点
     * @throws Exception
     */
    private List<FormFunctionDto> GetFunctionList(int formDR) throws Exception {
        List<FormFunctionDto> retList = new ArrayList<>();
        HashParam hs = new HashParam();
        hs.Add("FormDR", formDR);
        //页面功能点
        List<FormFunctionDto> formFunctions = EntityManager().FindAll(FormFunctionDto.class, hs, "", -1, -1, "", null, null);
        //读取指定文件中的功能点
        //基地址
        String basePath = JRTContext.MapPath("");
        //得到页面数据
        JRTForm form = EntityManager().GetById(JRTForm.class, formDR);
        if (form != null) {
            String codeStr = GetFormCode(form, basePath);
            //调用方法读取代码中功能点集合
            List<String> functionCodes = GetFunctionCode(codeStr);
            //功能点
            JRTFunction functionOne = null;
            //实际页面功能点
            List<JRTFunction> realFunctions = new ArrayList<>();
            if (functionCodes != null) {
                for (String functionCode : functionCodes) {
                    functionOne = EntityManager().GetByColVal(JRTFunction.class, "Code", functionCode);
                    if (functionOne != null) {
                        realFunctions.add(functionOne);
                    } else {
                        JRTFunction funcDto = new JRTFunction();
                        funcDto.Active = true;
                        funcDto.CName = functionCode;
                        funcDto.Code = functionCode;
                        funcDto.Sequence = 1;
                        OutValue key = new OutValue();
                        int ret = EntityManager().Save(funcDto, key, ErrRet());
                        if (ret == 1) {
                            funcDto.RowID = key.GetInerger();
                            realFunctions.add(funcDto);
                        }
                    }
                }
            }

            //遍历页面功能点检测页面不提供的功能点,数据库有页面没有的功能点
            for (FormFunctionDto f : formFunctions) {
                boolean isHas = false;
                for (JRTFunction rf : realFunctions) {
                    if (rf.RowID == f.FunctionDR) {
                        isHas = true;
                        break;
                    }
                }
                if (isHas == false) {
                    //应该删除的数据
                    f.FormDR = -1;
                }
                retList.add(f);
            }
            //页面有数据库没有的功能点功能点
            for (JRTFunction rf1 : realFunctions) {
                boolean isHas = false;
                for (FormFunctionDto f1 : formFunctions) {
                    if (rf1.RowID == f1.FunctionDR) {
                        isHas = true;
                        break;
                    }
                }
                if (isHas == false) {
                    FormFunctionDto dto = new FormFunctionDto();
                    //该添加的数据
                    dto.RowID = -1;
                    dto.FormDR = formDR;
                    dto.FunctionDR = rf1.RowID;
                    retList.add(dto);
                }
            }
            return retList;
        } else {
            return retList;
        }
    }

    /**
     * 得到页面的代码
     *
     * @param form     页面
     * @param basePath 根地址
     * @return 页面代码
     * @throws Exception
     */
    private String GetFormCode(JRTForm form, String basePath) throws Exception {
        String formPath = form.Path;
        formPath = formPath.split("\\?")[0];
        //路径存在
        if (formPath != null && formPath.length() > 1) {
            formPath = formPath.replace("../../", "").replace("../", "").replace("/", (char) 0 + "");
            String[] arr = formPath.split((char) 0 + "");
            String pathR = arr[0];
            for (int i = 1; i < arr.length; i++) {
                pathR = Paths.get(pathR, arr[i]).toString();
            }
            formPath = Paths.get(basePath, pathR).toString();
            if (formPath.toLowerCase().contains(".pdf")) {
                return "";
            }
            int index = formPath.indexOf(".aspx");
            formPath = formPath.substring(0, index + 5);

            File fi = new File(formPath);
            //如果文件存在,读取文件信息
            if (fi.exists()) {
                //读取所有代码
                String codeStr = TxtUtil.ReadTextStr(formPath);
                return codeStr;
            }
        }
        return "";
    }

    /**
     * 处理功能点的特色字符
     *
     * @param data 数据
     * @return 剔除特殊字符的数据
     */
    public String DealSpChar(String data) {
        for (int i = 0; i <= 31; i++) {
            data = data.replace((char) i + "", "");
        }
        data = data.replace((char) 127 + "", "");
        data = data.replace("\r\n", "");
        data = data.replace(";", "");
        return data;
    }

    /**
     * 得到页面功能点代码
     *
     * @param codeStr 页面代码串
     * @return
     */
    private List<String> GetFunctionCode(String codeStr) {
        List<String> codes = new ArrayList<>();
        int curIndex = 0;
        int startIndex = 0;
        while (curIndex == 0) {
            String funStrFlag1 = "SYSPageCommonInfo.GetFunction(";
            curIndex = codeStr.indexOf(funStrFlag1, startIndex);
            if (curIndex > 0) {
                //得到功能点后下标
                int endIndex = codeStr.indexOf(")", curIndex + funStrFlag1.length() + 1);
                //得到功能点串
                String funStr = codeStr.substring(curIndex + funStrFlag1.length() + 1, endIndex - 1);
                funStr = DealSpChar(funStr);
                //没有就添加到集合,有就不要
                if (!codes.contains(funStr)) {
                    codes.add(funStr);
                }
                curIndex = 0;
                startIndex = endIndex;
                continue;
            }
        }
        return codes;
    }


    /**
     * 同步功能点
     *
     * @return
     * @throws Exception
     */
    public String RsyncFun() throws Exception {
        int formDR = Helper.ValidParam(JRTContext.GetRequest(Request, "FormDR"), 0);
        List<FormFunctionDto> list = GetFunctionList(formDR);
        if (list != null && list.size() > 0) {
            for (FormFunctionDto v : list) {
                //删除
                if (v.FormDR == -1) {
                    int ret = EntityManager().RemoveById(JRTFormFunction.class, v.RowID, ErrRet());
                }
                //添加
                if (v.RowID == -1) {
                    int ret = EntityManager().Save(v);
                }
            }
        }
        return Helper.Success();
    }

    /**
     * 页面功能点返回实体
     */
    public static class FormFunctionDto extends JRTFormFunction {
        /**
         * 功能点名称
         */
        public String FunctionName;

    }
}

菜单维护的后台代码

import JRT.Core.CustomAttributes.Trans;
import JRT.Core.Dto.OutValue;
import JRT.Core.Util.TxtUtil;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;
import JRT.Core.Dto.HashParam;
import JRT.Core.Dto.ParamDto;
import JRT.Core.Dto.OutParam;
import JRT.Model.Entity.*;
import JRT.Core.Util.Convert;
import JRT.Core.MultiPlatform.JRTContext;

import java.io.File;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * 菜单资源维护的后台代码
 */
public class ashJRTMenu extends BaseHttpHandlerNoSession {

    /**
     * 查询所有页面数据
     *
     * @return
     * @throws Exception
     */
    public String QueryAllForm() throws Exception {
        //预留的取前台参数代码
        //参数
        List<ParamDto> para = new ArrayList<>();
        //sql连接符号
        List<String> joiner = new ArrayList<>();
        //sql比较符号
        List<String> operators = new ArrayList<>();
        //模糊查询
        String Filter = Helper.ValidParam(JRTContext.GetRequest(Request, "Filter"), "");
        //预留参数
        //主键
        String RowID = Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), "");
        //名称
        String CName = Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), "");
        //序号
        String Sequence = Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), "");
        //激活  {1:true,0:false}
        String Active = Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), "");
        //相对路径
        String Path = Helper.ValidParam(JRTContext.GetRequest(Request, "Path"), "");
        //说明
        String Remark = Helper.ValidParam(JRTContext.GetRequest(Request, "Remark"), "");
        //帮助信息
        String FormHelp = Helper.ValidParam(JRTContext.GetRequest(Request, "FormHelp"), "");
        //宽度
        String HelpWidth = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpWidth"), "");
        //高度
        String HelpHeight = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpHeight"), "");
        //帮助文档路径
        String HelpDoc = Helper.ValidParam(JRTContext.GetRequest(Request, "HelpDoc"), "");
        //模糊查询
        if (!Filter.isEmpty()) {
            ParamDto p = null;
            //名称
            p = new ParamDto();
            p.Key = "CName";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //相对路径
            p = new ParamDto();
            p.Key = "Path";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //说明
            p = new ParamDto();
            p.Key = "Remark";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //帮助信息
            p = new ParamDto();
            p.Key = "FormHelp";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
            //帮助文档路径
            p = new ParamDto();
            p.Key = "HelpDoc";
            p.Value = "%" + Filter + "%";
            para.add(p);
            joiner.add("or");
            operators.add("like");
        }
        //调用查询
        String json = EntityManager().QueryAllWithFK(JRTForm.class, para, "", false, -1, -1, "", joiner, operators);
        return json;
    }

    /**
     * 查询所有菜单
     *
     * @return
     * @throws Exception
     */
    public String GetAllMenu() throws Exception {
        String SystemDR = Helper.ValidParam(JRTContext.GetRequest(Request, "SystemDR"), "");
        MenuTreeDto retMenu = new MenuTreeDto();
        retMenu.isFolder = "1";
        retMenu.id = "0";
        retMenu.RowID = 0;
        retMenu.Level = 0;
        HashParam hs = new HashParam();
        if (!SystemDR.isEmpty()) {
            retMenu.SystemDR = Convert.ToInt32(SystemDR);
            hs.Add("SystemDR", Convert.ToInt32(SystemDR));
            JRTSystem sysDto = EntityManager().DolerGet(JRTSystem.class, Convert.ToInt32(SystemDR));
            retMenu.text = sysDto.SysName;
            retMenu.CName = sysDto.SysName;
        }
        //查询角色系统的全部菜单数据
        List<JRTMenu> allMenu = EntityManager().FindAll(JRTMenu.class, hs, "Sequence asc", "", null, null);
        int seqIndex = 0;
        List<String> upCol = new ArrayList<>();
        upCol.add("Sequence");
        for (JRTMenu m : allMenu) {
            //一级菜单
            if (m.ParentDR == null) {
                seqIndex++;
                //更新序号
                if (m.Sequence != seqIndex * 5) {
                    m.Sequence = seqIndex * 5;
                    int ret = EntityManager().Update(m, ErrRet(), upCol);
                }
                MenuTreeDto one = MenuToMenuDto(m);
                one.isFolder = "1";
                one.state = "closed";
                one.Level = retMenu.Level + 1;
                retMenu.children.add(one);
                AddChildMenu(one, allMenu);
            }
        }
        return "[" + Helper.Object2Json(retMenu) + "]";
    }

    /**
     * 更新菜单序号
     *
     * @return
     * @throws Exception
     */
    public String UpdateSequence() throws Exception {
        int RowID = Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), -1);
        int Sequence = Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), -1);
        JRTMenu curMenu = EntityManager().GetById(JRTMenu.class, RowID);
        if (curMenu == null) {
            return Helper.Error("没有找到菜单数据!");
        }
        curMenu.Sequence = Sequence;
        List<String> upCol = new ArrayList<>();
        upCol.add("Sequence");
        int ret = EntityManager().Update(curMenu, ErrRet(), upCol);
        if (ret == -1) {
            return Helper.Error(this.Err);
        }
        return Helper.Success();
    }

    /**
     * 粘贴菜单,复制的才能只能粘贴到复制级别的上级,或者整个菜单树
     *
     * @return
     */
    @Trans
    public String PasteMenu() throws Exception {
        //老节点
        int OldDR = Helper.ValidParam(JRTContext.GetRequest(Request, "OldDR"), 0);
        //新节点
        int NewDR = Helper.ValidParam(JRTContext.GetRequest(Request, "NewDR"), 0);
        //目标系统
        int SystemDR = Helper.ValidParam(JRTContext.GetRequest(Request, "SystemDR"), 0);
        //源头系统
        int OldSystemDR = Helper.ValidParam(JRTContext.GetRequest(Request, "OldSystemDR"), 0);
        //复制整个菜单树
        if (OldDR == 0) {
            HashParam hs = new HashParam();
            hs.Add("SystemDR", OldSystemDR);
            //查询角色系统的全部菜单数据
            List<JRTMenu> allMenu = EntityManager().FindAllSimple(JRTMenu.class, hs);
            for (JRTMenu one : allMenu) {
                if (one.ParentDR == null) {
                    int oneOldID = one.RowID;
                    one.SystemDR = SystemDR;
                    OutValue key = new OutValue();
                    int ret = EntityManager().Save(one, key, ErrRet());
                    if (ret == 1) {
                        for (JRTMenu tow : allMenu) {
                            if (tow.ParentDR != null && tow.ParentDR == oneOldID) {
                                tow.ParentDR = one.RowID;
                                tow.SystemDR = SystemDR;
                                int ret1 = EntityManager().Save(tow, key, ErrRet());
                                if (ret1 != 1) {
                                    throw new Exception("复制2级菜单异常:" + ErrRet().GetString());
                                }
                            }
                        }
                    } else {
                        throw new Exception("复制1级菜单异常:" + ErrRet().GetString());
                    }
                }
            }
        } else {
            JRTMenu menuOld = EntityManager().GetById(JRTMenu.class, OldDR);
            //复制目录到根节点
            if (NewDR == 0) {
                HashParam hs = new HashParam();
                hs.Add("ParentDR", OldDR);
                //查询角色系统的全部菜单数据
                List<JRTMenu> allChildMenu = EntityManager().FindAllSimple(JRTMenu.class, hs);
                menuOld.SystemDR = SystemDR;
                OutValue key = new OutValue();
                int ret = EntityManager().Save(menuOld, key, ErrRet());
                if (ret == 1) {
                    for (JRTMenu tow : allChildMenu) {
                        tow.ParentDR = menuOld.RowID;
                        tow.SystemDR = SystemDR;
                        int ret1 = EntityManager().Save(tow, key, ErrRet());
                        if (ret1 != 1) {
                            throw new Exception("复制2级菜单异常:" + ErrRet().GetString());
                        }
                    }
                } else {
                    throw new Exception("复制1级菜单异常:" + ErrRet().GetString());
                }
            }
            //复制子菜单到目录
            else {
                OutValue key = new OutValue();
                menuOld.ParentDR = NewDR;
                menuOld.SystemDR = SystemDR;
                int ret = EntityManager().Save(menuOld, key, ErrRet());
                if (ret != 1) {
                    throw new Exception("复制1级菜单异常:" + ErrRet().GetString());
                }
            }
        }
        return Helper.Success();
    }


    /**
     * 保存数据,前台按表的属性名提交
     *
     * @return 字符串
     */
    public String SaveJRTMenu() throws Exception {
        JRTMenu dto = new JRTMenu();
        //主键
        dto.RowID = Helper.ValidParam(JRTContext.GetRequest(Request, "RowID"), dto.RowID);
        //名称
        dto.CName = Helper.ValidParam(JRTContext.GetRequest(Request, "CName"), dto.CName);
        //上级
        dto.ParentDR = Helper.ValidParam(JRTContext.GetRequest(Request, "ParentDR"), dto.ParentDR);
        //页面路径
        dto.FormDR = Helper.ValidParam(JRTContext.GetRequest(Request, "FormDR"), dto.FormDR);
        //功能描述
        dto.Description = Helper.ValidParam(JRTContext.GetRequest(Request, "Description"), dto.Description);
        //图标
        dto.Icon = Helper.ValidParam(JRTContext.GetRequest(Request, "Icon"), dto.Icon);
        //序号
        dto.Sequence = Helper.ValidParam(JRTContext.GetRequest(Request, "Sequence"), dto.Sequence);
        //激活  {1:true,0:false}
        dto.Active = Helper.ValidParam(JRTContext.GetRequest(Request, "Active"), dto.Active);
        //是否置顶显示  {1:true,0:false}
        dto.IsTop = Helper.ValidParam(JRTContext.GetRequest(Request, "IsTop"), dto.IsTop);
        //子系统
        dto.SystemSubDR = Helper.ValidParam(JRTContext.GetRequest(Request, "SystemSubDR"), dto.SystemSubDR);
        //系统模块
        dto.SystemDR = Helper.ValidParam(JRTContext.GetRequest(Request, "SystemDR"), dto.SystemDR);
        //空:在Tab页打印,0:弹窗打开,1:独立打开
        dto.OpenModel = Helper.ValidParam(JRTContext.GetRequest(Request, "OpenModel"), dto.OpenModel);
        //打开宽度
        dto.OpenWidth = Helper.ValidParam(JRTContext.GetRequest(Request, "OpenWidth"), dto.OpenWidth);
        //打开高度
        dto.OpenHeight = Helper.ValidParam(JRTContext.GetRequest(Request, "OpenHeight"), dto.OpenHeight);
        //根节点
        if(dto.ParentDR==0)
        {
            dto.ParentDR=null;
        }
        OutParam out = new OutParam();
        int ret = 0;
        //更新
        if (dto.RowID > 0) {
            ret = EntityManager().Update(dto, null, out, null, null, null);
        }
        //插入数据
        else {
            ret = EntityManager().Save(dto, out);
        }
        if (ret == 1) {
            return Helper.Success();
        } else {
            return Helper.Error(out);
        }
    }

    /**
     * 删除数据,多个RowID以上尖号分割
     *
     * @return 字符串
     */
    public String DeleteJRTMenu() throws Exception {
        String RowIDS = Helper.ValidParam(JRTContext.GetRequest(Request, "RowIDS"), "");
        if (RowIDS.isEmpty()) {
            return Helper.Error("请传入要删除数据的RowID,多个以^分割!");
        }
        //分割主键
        String[] arr = RowIDS.split("^");
        //out参数
        OutParam out = new OutParam();
        //循环删除数据
        for (int i = 0; i < arr.length; i++) {
            //是否有子菜单
            List<JRTMenu> child=EntityManager().FindByColVal(JRTMenu.class,"ParentDR",Convert.ToInt32(arr[i]));
            if(child!=null&&child.size()>0)
            {
                return Helper.Error("当前菜单已经有子菜单数据,请先删除子项!");
            }
            int ret = EntityManager().RemoveById(JRTMenu.class, Convert.ToInt32(arr[i]), out);
            if (ret != 1) {
                return Helper.Error(out);
            }
        }
        return Helper.Success();
    }


    /**
     * 添加子菜单
     *
     * @param one     一级菜单
     * @param allMenu 所有菜单
     */
    private void AddChildMenu(MenuTreeDto one, List<JRTMenu> allMenu) throws Exception {
        int seqIndex = 0;
        List<String> upCol = new ArrayList<>();
        upCol.add("Sequence");
        for (JRTMenu m : allMenu) {
            if (m.ParentDR != null && one.RowID == m.ParentDR) {
                seqIndex++;
                //更新序号
                if (m.Sequence != seqIndex * 5) {
                    m.Sequence = seqIndex * 5;
                    int ret = EntityManager().Update(m, ErrRet(), upCol);
                }
                MenuTreeDto child = MenuToMenuDto(m);
                child.Level = one.Level + 1;
                one.children.add(child);
                AddChildMenu(child, allMenu);
            }
        }
    }

    /**
     * 菜单表是实体得到菜单数据的实体
     *
     * @param menu 菜单表数据
     * @return 菜单树数据
     * @throws Exception
     */
    private MenuTreeDto MenuToMenuDto(JRTMenu menu) throws Exception {
        MenuTreeDto oneMenu = new MenuTreeDto();
        oneMenu.RowID = menu.RowID;
        oneMenu.id = String.valueOf(menu.RowID);
        oneMenu.CName = menu.CName;
        oneMenu.text = menu.CName;
        oneMenu.isFolder = "0";
        oneMenu.FormDR = menu.FormDR;
        //页面路径
        if(menu.FormDR!=null)
        {
            JRTForm form=EntityManager().DolerGet(JRTForm.class,menu.FormDR);
            oneMenu.FormPath=form.Path;
        }
        if (menu.ParentDR == null) {
            oneMenu.ParentDR = 0;
        } else {
            oneMenu.ParentDR = menu.ParentDR;
        }
        oneMenu.Description = menu.Description;
        oneMenu.Icon = menu.Icon;
        oneMenu.iconCls = "icon iconfont " + menu.Icon;
        oneMenu.Sequence = menu.Sequence;
        oneMenu.Active = menu.Active;
        oneMenu.IsTop = menu.IsTop;
        oneMenu.OpenModel = menu.OpenModel;
        if (menu.OpenWidth == null) {
            oneMenu.OpenWidth = "";
        } else {
            oneMenu.OpenWidth = String.valueOf(menu.OpenWidth);
        }
        if (menu.OpenHeight == null) {
            oneMenu.OpenHeight = "";
        } else {
            oneMenu.OpenHeight = String.valueOf(menu.OpenHeight);
        }
        oneMenu.SystemDR = menu.SystemDR;
        return oneMenu;
    }

    /**
     * 菜单树实体
     */
    public static class MenuTreeDto {
        /**
         * 构造函数
         */
        public MenuTreeDto() {
            id = "";
            text = "";
            iconCls = "";
            isFolder = "";
            state = "";
            checked = "";
            RowID = 0;
            Level = 0;
            CName = "";
            FormDR = null;
            ParentDR = 0;
            Description = "";
            Icon = "";
            Sequence = 0;
            Active = true;
            IsTop = false;
            OpenModel = "";
            OpenWidth = "";
            OpenHeight = "";
            children = new ArrayList<>();
            SystemDR = 0;
            FormPath="";
        }

        /**
         * 树id
         */
        public String id;

        /**
         * 树文本
         */
        public String text;

        /**
         * 树图标
         */
        public String iconCls;

        /**
         * 是否是文件夹
         */
        public String isFolder;

        /**
         * 树的状态
         */
        public String state;

        /**
         * 是否选择
         */
        public String checked;

        /**
         * 层级
         */
        public int Level;

        /**
         * 菜单主键
         */
        public int RowID;

        /**
         * 菜单名称
         */
        public String CName;

        /**
         * 菜单路径
         */
        public Integer FormDR;

        /**
         * 菜单父级
         */
        public int ParentDR;

        /**
         * 菜单描述
         */
        public String Description;

        /**
         * 菜单图标
         */
        public String Icon;

        /**
         * 菜单序号
         */
        public int Sequence;

        /**
         * 是否激活
         */
        public Boolean Active;

        /**
         * 是否在顶部
         */
        public Boolean IsTop;

        /**
         * 打开模式
         */
        public String OpenModel;

        /**
         * 打开宽度
         */
        public String OpenWidth;

        /**
         * 打开高度
         */
        public String OpenHeight;

        /**
         * 子菜单
         */
        public List<MenuTreeDto> children;

        /**
         * 系统
         */
        public int SystemDR;

        /**
         * 页面路径
         */
        public String FormPath;
    }

}

登录界面的后台

import JRT.Core.Dto.HashParam;
import JRT.Core.MultiPlatform.JRTConfigurtaion;
import JRT.Core.MultiPlatform.JRTContext;
import JRT.Core.Util.IPMacUtil;
import JRT.Core.Util.Md5Util;
import JRT.Core.Util.PassWordUtil;
import JRT.Core.Util.TimeParser;
import JRT.DAL.ORM.EntityManager.EntityManagerImpl;
import JRT.Login.ILogin;
import JRT.Login.SelectRoleDto;
import JRT.Model.Bussiness.Sessions;
import JRT.Model.Entity.JRTUserLog;
import JRT.Model.Entity.SYSParameter;
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"), "LIS");
        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);
    }

    /**
     * 校验用户
     * @return
     */
    public String CheckUser() throws Exception
    {
        //用户名
        String UserCode = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "UserCode"), "");
        //密码
        String Password = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "Password"), "");

        //解密密码
        Password=JRT.Core.Util.RsaUtil.RsaDecrypt(Password);
        //验证密码
        boolean ret=Login().CheckUser(UserCode,Password);
        if(ret==false)
        {
            return Helper.Error("用户名或密码错误!");
        }
        else
        {
            //用户名加上时间构成时间戳
            String timeSpan=JRT.Core.Util.RsaUtil.RsaEncrypt(JRT.Core.Util.TimeParser.GetNowTime()+"^"+UserCode);
            //得到选择的角色数据
            List<SelectRoleDto> roleList=Login().GetSelectRole(UserCode);
            HashMap map=new HashMap();
            //系统标题
            map.put("TimeSpan",timeSpan);
            map.put("RoleList",roleList);
            return Helper.Success(Helper.Object2Json(map));
        }
    }

    /**
     * 登录并且构造会话
     * @return
     */
    public String LoginSys() throws Exception
    {
        //用户名
        String UserCode = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "UserCode"), "");
        //密码
        String Password = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "Password"), "");
        //角色
        String RoleJson = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "RoleJson"), "");
        //登录类型
        String LoginType=Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "LoginType"), "LIS");
        //解密密码
        Password=JRT.Core.Util.RsaUtil.RsaDecrypt(Password);
        //验证密码
        boolean ret=Login().CheckUser(UserCode,Password);
        if(ret==false)
        {
            return Helper.Error("用户名或密码错误!");
        }
        //角色对象
        SelectRoleDto role=(SelectRoleDto)Helper.Json2Object(RoleJson,SelectRoleDto.class);
        //会话ID
        String SYSSessionID="";
        String SessionKey="JRTUserSession";
        //取会话对象
        Sessions session=JRTContext.GetSession(Session,SessionKey);
        if(session!=null)
        {
            SYSSessionID=LoginType+"-"+role.UserID+"-"+role.GroupID+"-"+role.RoleDR;
            SYSSessionID= Md5Util.GetMd5Hash(SYSSessionID);
            SessionKey="JRTUserSession-"+SYSSessionID;
        }
        Sessions sessionNew=new Sessions();
        sessionNew.IpAddress= JRTContext.GetClientIP(Request);
        sessionNew.UserCode=role.UserCode;
        sessionNew.UserID=role.UserID;
        sessionNew.UserName=role.UserName;
        sessionNew.SessionStr=role.SessionStr;
        sessionNew.GroupID=role.GroupID;
        sessionNew.RoleDR=role.RoleDR;
        sessionNew.RoleName=role.RoleName;
        sessionNew.SYSSessionID=SYSSessionID;
        sessionNew.LoginDate=Helper.GetNowDate();
        sessionNew.LoginTime=Helper.GetNowTime();
        sessionNew.LoginType=LoginType;
        JRTContext.SetSession(Session,SessionKey,sessionNew);
        return Helper.Success(SYSSessionID);
    }

    /**
     * 修改密码
     * @return
     */
    public String ChangePassword() throws Exception
    {
        //用户名
        String UserCode = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "UserCode"), "");
        //密码
        String Password = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "Password"), "");
        //解密密码
        Password=JRT.Core.Util.RsaUtil.RsaDecrypt(Password);
        //新密码
        String PasswordNew = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "PasswordNew"), "");
        //解密密码
        PasswordNew=JRT.Core.Util.RsaUtil.RsaDecrypt(PasswordNew);
        String ret=Login().ChangePassword(UserCode,Password,PasswordNew);
        if(ret.isEmpty())
        {
            //修改密码日志
            SaveUserLog(UserCode,"UP","修改密码");
            return Helper.Success();
        }
        else
        {
            return Helper.Error(ret);
        }
    }

    /**
     * 保存用户日志
     * @param UserCode
     * @param LogType
     * @param Remark
     * @throws Exception
     */
    private void SaveUserLog(String UserCode,String LogType,String Remark) throws Exception
    {
        //登录类型
        String LoginType=Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "LoginType"), "LIS");
        JRTUserLog log=new JRTUserLog();
        log.AddDate= Helper.GetNowDate();
        log.AddTime=Helper.GetNowTime();
        log.IPAddress=Helper.GetClientIP(Request);
        log.LogType=LogType;
        log.Remark=Remark;
        log.Site=IPMacUtil.GetLocalIPv4Address();
        log.SysCode=LoginType;
        log.UserCode=UserCode;
        EntityManager().Save(log);
    }

    /**
     * 得到修改密码信息
     * @return
     */
    public String GetChangePassInfo() throws Exception
    {
        //用户名
        String UserCode = Helper.ValidParam(JRT.Core.MultiPlatform.JRTContext.GetRequest(Request, "UserCode"), "");
        int changePassDay=-1;
        //查询系统参数
        SYSParameter dto = EntityManager().GetByColVal(SYSParameter.class, "Code", "SYSChangePassDay");
        if (dto != null) {
            if (dto.ParaValue != null && !dto.ParaValue.isEmpty()) {
                changePassDay=Integer.valueOf(dto.ParaValue);
            }
        }
        //要求定期换密码
        if(changePassDay>0)
        {
            HashParam hs=new HashParam();
            hs.Add("UserCode",UserCode);
            hs.Add("LogType","UP");
            //按日期倒序取top1
            List<JRTUserLog> logLast=EntityManager().FindAllTop(JRTUserLog.class,1,hs,"AddDate desc","",null,null);
            //没日志插入一个
            if(logLast==null||logLast.size()==0)
            {
                //修改密码日志
                SaveUserLog(UserCode,"UP","修改密码");
                return "";
            }
            //超期没改密码
            if(TimeParser.DaysBetween(Helper.GetNowDate(),logLast.get(0).AddDate)>changePassDay)
            {
                return "系统已开启密码天数检测:系统检测到您的密码已经超过"+changePassDay+"天未修改";
            }
        }
        return "";
    }

}




为了提高效率会用M方法把所有表的实体、后台、前端代码统一生成到Copy目录供开发拷贝表操作和界面的基础逻辑
在这里插入图片描述

在这里插入图片描述

这些功能在PostGreSql和人大金仓跑起来是一样的,因为没使用SQL,都是基于ORM的api实现的功能。之所以用IRIS开发是因为表结构来回调整直接k表数据方便,效率还是很重要的,jrtlis计划的最终目标将以此开发质控系统、鉴定过程、检验系统。

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

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

相关文章

错误记录

Packet for query is too large 错误原因 一般是没有修改Mysql允许传输的最大数据包大小&#xff0c;使用 SHOW VARIABLES LIKE %max_allowed_packet%;可以看到默认的大小&#xff0c;一般默认为1M。 处理方法 暂时修改&#xff1a;重启mysql后失效 --修改为10M set global…

使用 Web Components 实现输入法更换皮肤 (vue)

更换皮肤 (界面外观) 是拼音输入法的常见功能. 要实现更换皮肤, 有许多种不同的具体技术方案可以使用. 本文选择 Web Components 技术 (vue) 来实现这个功能. 目录 1 效果展示 1.1 发布新版本 2 Web Components 简介3 vue 使用 Web Components 3.1 使用 vue 实现 Web Compon…

比对word文档并提取差异片段(java版)

整体比较 有时候&#xff0c;我们想比对两个word文档&#xff0c;标记出两个文档之间的差异&#xff0c;这样一眼就能看出来修改了哪些地方&#xff0c;如下图,左边文档中的扩招2000人删除了&#xff0c;辞呈改成了说明&#xff0c;新增了并且加重处罚等文字&#xff0c;是否一…

DP背包模型

目录 采药&#xff08;01背包&#xff09;代码实现 装箱问题&#xff08;01背包&#xff09;代码实现 *宠物小精灵之收服&#xff08;二维费用01背包&#xff09;题目分析代码实现 数字组合&#xff08;01背包&#xff09;代码实现 买书&#xff08;完全背包&#xff09;代码实…

【学习】软件测试中误区汇总分析

大家有没有想过这个问题&#xff1a;软件测试中有哪些误区呢&#xff1f;想起这个题目&#xff0c;是因为最近遇到好几次关于这方面的讨论。发觉即便做过几年测试的老员工也或多或少有些这方面的困惑。当然一家之言&#xff0c;仅作抛砖引玉之谈。 误区一&#xff1a;测试就是…

git提交-分支开发合并-控制台操作

git提交-分支开发合并-控制台操作 git的基本概念工作区、暂存区和版本库工作区&#xff1a;就是你在电脑里能看到的目录&#xff08;隐藏目录 .git不算工作区&#xff09;。暂存区&#xff1a;英文叫 stage 或 index。一般存放在本地的.git目录下的index 文件&#xff08;.git/…

【机器学习之---数学】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派&#xff08;传统学派&#xff09;认为样本信息来自总体&#xff0c;通过对样本信息的研究可以合理地推断和估计总体信息…

为什么requests不是python标准库?

在知乎上看到有人问&#xff1a;为什么requests不是python标准库&#xff1f; 这确实是部分人困惑的问题&#xff0c;requests作为python最受欢迎的http请求库&#xff0c;已经成为爬虫必备利器&#xff0c;为什么不把requests直接装到python标准库里呢&#xff1f;可以省去第…

rostopic echo /tf 筛选特定数据

rostopic echo /tf 筛选特定数据 在使用rostopic echo命令时&#xff0c;您可以使用参数-n指定输出的消息数量&#xff0c;并且可以使用参数-p将输出以消息格式打印。然而&#xff0c;rostopic echo命令本身并不支持直接筛选指定的消息。 如果想要筛选特定的消息&#xff0c;…

【Java程序设计】【C00368】基于(JavaWeb)Springboot的箱包存储系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

Mybatis-核心配置文件 / Mybatis增删改查

1. 核心配置文件 1.1. 概述 核心配置文件是MyBatis框架中用于集中定义全局配置信息的XML文件&#xff0c;其内部包含了一系列预设标签&#xff0c;用于设置数据库连接、对象映射、类型处理等关键参数。这些标签遵循特定的排列顺序&#xff0c;尽管并非所有标签都是强制性的&a…

【LVGL-选项卡部件(lv_tabview_create)】

LVGL-选项卡部件&#xff08;lv_tabview_create&#xff09; ■ LVGL-选项卡部件&#xff08;lv_tabview_create&#xff09;■ 综合示例&#xff1a; ■ LVGL-选项卡部件&#xff08;lv_tabview_create&#xff09; ■ 综合示例&#xff1a; 装饰部分

06_Request

文章目录 前置知识点URL和URIHTTP请求报文和HTTP响应报文 Request请求行请求头请求体特殊信息获取客户机和服务器主机信息 请求参数直接封装引用类型 POST请求请求参数乱码文件上传案例&#xff08;与前面的getServletContext结合&#xff09; Request做请求的转发 前置知识点 …

pip安装pyqt5报错

已解决pip安装pyqt5报错 ERROR: Could not build wheels for PyQt5-sip, which is required to install pyproject.toml-based projects 安装C生成工具

查询 in条件下按顺序排序

查询语句 select * from user where id in (5,21,6);查询结果是不是按照参数顺序排列的&#xff0c;为了保证查询顺序可以使用 select * from sj_user where id in(5,21,6) order by FIELD(id,5,21,6); //或者 select * from sj_user where id in(5,21,6) order by FIND_IN_S…

MFC标签设计工具 图片控件上,移动鼠标显示图片控件内的鼠标xy的水平和垂直辅助线要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 源码

需求&#xff1a;要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 我生成标签时&#xff0c;需要对齐和 调文字字体大小。这工具微调 能快速知道位置 和字体大小。 标签设计(点击图片&#xff0c;上下左右箭头移动 或-调字体) 已经够用了&#xff0c;滚动条还没完…

使用docker-compose搭建wordpress博客

1、从远程仓库拉取worldpress镜像到本地 2、新建一个项目&#xff0c;然后在新建的项目目录里面新建一个docker-compose.yml模版文件。 3、编写docker-compose.yml文件 4、docker-compose up 运行项目。 5、在浏览器测试 使用docker-compose搭建wordpress博客实验成功。

过滤器 Filter

目录 1、Filter是什么 2、原理 3、怎样使用 步骤&#xff1a; Filter的执行流程&#xff1a; 拦截路径配置&#xff1a; 配置方式&#xff1a; 过滤器链&#xff1a; 1、Filter是什么 Filter是一个在计算机中用于筛选、过滤和修改数据的组件或模块。它在数据传输和处理…

python入门题:输入输出练习

以下是Python基础语法的练习&#xff0c;项目要求和代码如下&#xff1a; """ 例3&#xff1a;小精灵&#xff1a;你好&#xff0c;欢迎古灵阁&#xff0c;请问您需要帮助吗&#xff1f;需要or不需要&#xff1f; 你&#xff1a;需要 小精灵&#xff1a;请问你需…

python 中判断文件、目录是否存在的方法

判断目录是否存在并创建目录 一、实现上传文件功能二、判断目录是否存在的办法2.1、使用os模块2.1.1、判断目录是否存在2.1.2、os.makedirs()&#xff1a;递归创建目录 2.2、使用pathlib模块2.2.1、path.exist()判断目录是否存在2.2.1、path.mkdir()&#xff1a;创建目录 2.3、…