From 28afabd4493506f84f7b283051594230a5ad3602 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Thu, 20 Jul 2023 15:57:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=9E=E5=90=8D=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=A3=80=E6=B5=8B=E5=AD=90?= =?UTF-8?q?=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/adminDept.go | 8 ++++ api/dao/adminMenu.go | 9 ++++ api/service/dept.go | 7 +++ api/service/menu.go | 7 +++ api/service/userDoctor.go | 13 ++++++ extend/verifyDun/bankCard.go | 1 + extend/verifyDun/base.go | 32 ++++++++++++++ extend/verifyDun/idCard.go | 82 ++++++++++++++++++++++++++++++++++++ go.mod | 1 + go.sum | 2 + 10 files changed, 162 insertions(+) create mode 100644 extend/verifyDun/bankCard.go create mode 100644 extend/verifyDun/base.go create mode 100644 extend/verifyDun/idCard.go diff --git a/api/dao/adminDept.go b/api/dao/adminDept.go index 6ec7ab7..f38a3c6 100644 --- a/api/dao/adminDept.go +++ b/api/dao/adminDept.go @@ -27,6 +27,14 @@ func (r *AdminDeptDao) GetAdminDeptList(maps interface{}) (m []*model.AdminDept, return m, nil } +func (r *AdminDeptDao) GetAdminDeptByParentId(parentId int64) (m *model.AdminDept, err error) { + err = global.Db.Where("parent_id = ?", parentId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // AddAdminDept 新增部门 func (r *AdminDeptDao) AddAdminDept(tx *gorm.DB, model *model.AdminDept) (*model.AdminDept, error) { if err := tx.Create(model).Error; err != nil { diff --git a/api/dao/adminMenu.go b/api/dao/adminMenu.go index 843820b..6d4693c 100644 --- a/api/dao/adminMenu.go +++ b/api/dao/adminMenu.go @@ -36,6 +36,15 @@ func (r *AdminMenuDao) GetAdminMenuById(menuId int64) (m *model.AdminMenu, err e return m, nil } +// GetAdminMenuByParentId 获取菜单数据-菜单id +func (r *AdminMenuDao) GetAdminMenuByParentId(parentId int64) (m *model.AdminMenu, err error) { + err = global.Db.Where("parent_id = ?", parentId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // GetAdminMenuListNormalSortOrderNum 获取全部正常菜单列表-排序 func (r *AdminMenuDao) GetAdminMenuListNormalSortOrderNum() (m []*model.AdminMenu, err error) { err = global.Db.Where("menu_status = ?", 1).Order("order_num asc").Find(&m).Error diff --git a/api/service/dept.go b/api/service/dept.go index fbaceb4..1696fdf 100644 --- a/api/service/dept.go +++ b/api/service/dept.go @@ -126,6 +126,13 @@ func (r *DeptService) DeleteDept(deleteDeptRequest requests.DeleteDept) (bool, e return false, errors.New("删除失败") } + // 检测部门是否存在子集 + childrenAdminDept, err := adminDeptDao.GetAdminDeptByParentId(v) + if err != nil || childrenAdminDept != nil { + tx.Rollback() + return false, errors.New("存在下级部门,删除失败") + } + // 修改部门为删除 data := make(map[string]interface{}) data["dept_status"] = 2 diff --git a/api/service/menu.go b/api/service/menu.go index 7bee8e9..27a1d08 100644 --- a/api/service/menu.go +++ b/api/service/menu.go @@ -280,6 +280,13 @@ func (r *MenuService) DeleteMenu(c *gin.Context, DeleteMenuRequest requests.Dele return false, errors.New("系统菜单,请勿删除") } + // 检测菜单是否存在子级 + childrenAdminMenu, err := adminMenuDao.GetAdminMenuByParentId(v) + if err != nil || childrenAdminMenu != nil { + tx.Rollback() + return false, errors.New("存在下级菜单,删除失败") + } + // 删除菜单关联api err = adminMenuApiDao.DeleteAdminMenuApiByMenuId(tx, v) if err != nil { diff --git a/api/service/userDoctor.go b/api/service/userDoctor.go index b403ee1..9dcdae1 100644 --- a/api/service/userDoctor.go +++ b/api/service/userDoctor.go @@ -15,6 +15,7 @@ import ( "hospital-admin-api/config" "hospital-admin-api/extend/ca" "hospital-admin-api/extend/tencentIm" + "hospital-admin-api/extend/verifyDun" "hospital-admin-api/global" "hospital-admin-api/utils" "strconv" @@ -731,6 +732,18 @@ func (r *UserDoctorService) AddUserDoctor(userId string, req requests.AddUserDoc return false, errors.New("身份证号错误") } + // if config.C.Env == "prod" { + // 身份证号码实证认证 + res, err = verifyDun.CheckIdCard(req.CardName, req.CardNum) + if err != nil { + return false, errors.New(err.Error()) + } + + if !res { + return false, errors.New("身份证认证失败") + } + // } + // 检测身份证号是否重复 maps = make(map[string]interface{}) maps["card_num"] = req.CardNum diff --git a/extend/verifyDun/bankCard.go b/extend/verifyDun/bankCard.go new file mode 100644 index 0000000..521cb63 --- /dev/null +++ b/extend/verifyDun/bankCard.go @@ -0,0 +1 @@ +package verifyDun diff --git a/extend/verifyDun/base.go b/extend/verifyDun/base.go new file mode 100644 index 0000000..3eeadf6 --- /dev/null +++ b/extend/verifyDun/base.go @@ -0,0 +1,32 @@ +package verifyDun + +import ( + "crypto/md5" + "encoding/hex" + "net/url" + "sort" +) + +const ( + apiUrl = "https://verify.dun.163.com" // 本机认证服务身份证实人认证在线检测接口地址 + version = "v1" + secretId = "0bcf9a5633eb9ca9d196583e67c3762b" // 产品密钥ID,产品标识 + secretKey = "b31e8220d115b6531a22ee71d1e89936" // 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 +) + +// GenSignature 生成签名信息 +func GenSignature(params url.Values) string { + var paramStr string + keys := make([]string, 0, len(params)) + for k := range params { + keys = append(keys, k) + } + sort.Strings(keys) + for _, key := range keys { + paramStr += key + params[key][0] + } + paramStr += secretKey + md5Reader := md5.New() + md5Reader.Write([]byte(paramStr)) + return hex.EncodeToString(md5Reader.Sum(nil)) +} diff --git a/extend/verifyDun/idCard.go b/extend/verifyDun/idCard.go new file mode 100644 index 0000000..384eafd --- /dev/null +++ b/extend/verifyDun/idCard.go @@ -0,0 +1,82 @@ +package verifyDun + +import ( + "encoding/json" + "errors" + "io" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +// 请求返回值 +type responseData struct { + Code int `json:"code"` // 接口调用状态。200:正常;其它值:调用出错 + Msg string `json:"msg"` // 结果说明。如果接口调用出错,那么返回错误描述。成功则返回 ok + Result result `json:"result"` // 接口返回结果,各个接口自定义,数据结构参考具体文档说明 +} + +type result struct { + Status int `json:"status"` // 认证结果,1-通过 2-不通过(原因见reasonType) 0-待定 + ReasonType int `json:"reasonType"` // 原因详情 + TaskId string `json:"taskId"` // 本次请求数据标识,可以根据该标识在控制台进行数据查询 + IsPayed int `json:"isPayed"` // 本次请求是否收费标识,1代表收费,0代表不收费 +} + +// CheckIdCard 实证认证 +func CheckIdCard(name, cardNo string) (bool, error) { + formData := url.Values{} + formData.Set("name", name) + formData.Set("cardNo", cardNo) + formData.Set("secretId", secretId) + formData.Set("businessId", "45a8fd254b4649e9bd25d773ac7ab666") + formData.Set("version", "v1") + formData.Set("timestamp", strconv.FormatInt(time.Now().UnixNano()/1000000, 10)) + formData.Set("nonce", string(make([]byte, 32))) + formData.Set("signature", GenSignature(formData)) + + resp, err := http.Post(apiUrl+"/"+version+"/idcard/check", "application/x-www-form-urlencoded", strings.NewReader(formData.Encode())) + if err != nil { + return false, errors.New("调用API接口失败:" + err.Error()) + } + + defer func(Body io.ReadCloser) { + _ = Body.Close() + }(resp.Body) + + body, err := io.ReadAll(resp.Body) + if err != nil { + return false, err + } + + var responseData responseData + err = json.Unmarshal(body, &responseData) + if err != nil { + // json解析失败 + return false, err + } + + if responseData.Code != 200 { + if responseData.Msg != "" { + return false, errors.New(responseData.Msg) + } else { + return false, errors.New("身份证认证失败") + } + } + + if responseData.Result.Status == 2 { + if responseData.Result.ReasonType == 2 { + return false, errors.New("输入姓名和身份证号不一致") + } else if responseData.Result.ReasonType == 3 { + return false, errors.New("查无此身份证") + } else if responseData.Result.ReasonType == 4 { + return false, errors.New("身份证照片信息与输入信息不一致") + } else { + return false, errors.New("身份证认证失败") + } + } + + return true, nil +} diff --git a/go.mod b/go.mod index 80cd2be..e6be5e8 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( require ( github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 // indirect github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible // indirect + github.com/bitly/go-simplejson v0.5.1 // indirect github.com/bwmarrin/snowflake v0.3.0 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect diff --git a/go.sum b/go.sum index 847da22..b26a22f 100644 --- a/go.sum +++ b/go.sum @@ -58,6 +58,8 @@ github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCE github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible h1:KpbJFXwhVeuxNtBJ74MCGbIoaBok2uZvkD7QXp2+Wis= github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= +github.com/bitly/go-simplejson v0.5.1 h1:xgwPbetQScXt1gh9BmoJ6j9JMr3TElvuIyjR8pgdoow= +github.com/bitly/go-simplejson v0.5.1/go.mod h1:YOPVLzCfwK14b4Sff3oP1AmGhI9T9Vsg84etUnlyp+Q= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=