chore: 初始开源发布
iotlcm-app:小程序端 + 用户端服务。 - app/:uni-app 小程序前端(基于 unibest,MIT) - 微信 AppID → YOUR_WX_APPID,uni-app AppID → __UNI__YOURAPPID - 内网后端地址 → admin.iotlcm.example.com - 应用标题与 unibest 模板 README 重写(保留上游致谢与 MIT 声明) - server/:GoFrame 用户端服务(基于 XiuAdmin,Apache-2.0) - module xiuadmin → git.5iot.com/iotlcm-public/iotlcm-app(360 文件) - 支付回调地址 → app.iotlcm.example.com,商户名与应用名泛化 - 真实手机号 → 合法 11 位编造号(保留号段前 3 位 + 后 4 位) - 依赖号码尾部的断言同步更新 - 补 server/LICENSE(Apache-2.0) - 移除内部资产:CI 触发器 - 补根 README,LF 行尾 + .gitattributes 已知:TestSysDept_RefreshDeptAncestors 在源仓同一提交上同样失败,属既有缺陷。
This commit is contained in:
@@ -0,0 +1,589 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
)
|
||||
|
||||
type sAppUser struct{}
|
||||
|
||||
func NewAppUser() *sAppUser {
|
||||
return &sAppUser{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAppUser(NewAppUser())
|
||||
}
|
||||
|
||||
func (s *sAppUser) Info(ctx context.Context) (res *model.AppUserInfoModel, err error) {
|
||||
userId := contexts.GetUserId(ctx)
|
||||
if userId == 0 {
|
||||
return nil, gerror.New("登录已过期")
|
||||
}
|
||||
return getAppUserInfoById(ctx, userId)
|
||||
}
|
||||
|
||||
func (s *sAppUser) UpdateInfo(ctx context.Context, param *model.AppUpdateUserInfoParam) (res *model.AppUserInfoModel, err error) {
|
||||
userId := contexts.GetUserId(ctx)
|
||||
if userId == 0 {
|
||||
return nil, gerror.New("登录已过期")
|
||||
}
|
||||
if param == nil {
|
||||
return nil, gerror.New("请求参数不能为空")
|
||||
}
|
||||
|
||||
now := gtime.Now()
|
||||
err = dao.SysUser.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
||||
var user *entity.SysUser
|
||||
if err := dao.SysUser.Ctx(ctx).TX(tx).
|
||||
Where(dao.SysUser.Columns().UserId, userId).
|
||||
Scan(&user); err != nil {
|
||||
return err
|
||||
}
|
||||
if user == nil {
|
||||
return gerror.New("用户不存在")
|
||||
}
|
||||
if !appIsTerminalUser(ctx, user) {
|
||||
return gerror.New("代理商账号仅支持查看资料")
|
||||
}
|
||||
|
||||
phone := strings.TrimSpace(param.Phone)
|
||||
if phone == "" {
|
||||
phone = strings.TrimSpace(user.Phonenumber)
|
||||
}
|
||||
if phone == "" {
|
||||
return gerror.New("联系电话不能为空")
|
||||
}
|
||||
if phone != "" && phone != strings.TrimSpace(user.Phonenumber) {
|
||||
var exists *entity.SysUser
|
||||
if err := dao.SysUser.Ctx(ctx).TX(tx).
|
||||
Where(dao.SysUser.Columns().TenantId, user.TenantId).
|
||||
Where(dao.SysUser.Columns().Phonenumber, phone).
|
||||
WhereNot(dao.SysUser.Columns().UserId, userId).
|
||||
WhereNull(dao.SysUser.Columns().DeletedAt).
|
||||
Limit(1).
|
||||
Scan(&exists); err != nil {
|
||||
return err
|
||||
}
|
||||
if exists != nil && exists.UserId > 0 {
|
||||
return gerror.New("手机号已被其他账号使用")
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := dao.SysUser.Ctx(ctx).TX(tx).
|
||||
Where(dao.SysUser.Columns().UserId, userId).
|
||||
Data(do.SysUser{
|
||||
NickName: param.NickName,
|
||||
Avatar: param.Avatar,
|
||||
Email: strings.TrimSpace(param.Email),
|
||||
Phonenumber: phone,
|
||||
Sex: param.Sex,
|
||||
UpdatedBy: userId,
|
||||
UpdatedAt: now,
|
||||
}).
|
||||
OmitNil().
|
||||
Update(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
user.NickName = strings.TrimSpace(param.NickName)
|
||||
user.Email = strings.TrimSpace(param.Email)
|
||||
user.Phonenumber = phone
|
||||
return syncTerminalUserProfile(ctx, tx, user, param, now)
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return getAppUserInfoById(ctx, userId)
|
||||
}
|
||||
|
||||
func (s *sAppUser) BindWechat(ctx context.Context, param *model.AppWechatBindParam) (res *model.AppWechatBindModel, err error) {
|
||||
user, err := appCurrentUser(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = service.AppAuth().BindWechatOpenIdByLoginCode(ctx, user, param.WxCode); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
userInfo, err := getAppUserInfoById(ctx, user.UserId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &model.AppWechatBindModel{
|
||||
Success: true,
|
||||
UserInfo: userInfo,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func syncTerminalUserProfile(ctx context.Context, tx gdb.TX, user *entity.SysUser, param *model.AppUpdateUserInfoParam, now *gtime.Time) error {
|
||||
nickName := strings.TrimSpace(param.NickName)
|
||||
terminalName := strings.TrimSpace(appFirstNotEmpty(param.TerminalName, nickName, user.NickName, user.UserName))
|
||||
phone := strings.TrimSpace(appFirstNotEmpty(param.Phone, user.Phonenumber))
|
||||
email := strings.TrimSpace(appFirstNotEmpty(param.Email, user.Email))
|
||||
establishTime, err := appParseProfileDate(param.EstablishTime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var terminal *entity.TTerminal
|
||||
if err = dao.TTerminal.Ctx(ctx).TX(tx).
|
||||
Where(dao.TTerminal.Columns().TerminalId, user.UserId).
|
||||
Scan(&terminal); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if terminal == nil {
|
||||
if _, err := dao.TTerminal.Ctx(ctx).TX(tx).Data(do.TTerminal{
|
||||
TerminalId: user.UserId,
|
||||
TerminalName: terminalName,
|
||||
Phone: phone,
|
||||
Email: email,
|
||||
Status: consts.SysUserStatusNormal,
|
||||
CreditCode: strings.TrimSpace(param.CreditCode),
|
||||
AreaCode: strings.TrimSpace(param.AreaCode),
|
||||
Address: strings.TrimSpace(param.Address),
|
||||
FullName: strings.TrimSpace(appFirstNotEmpty(param.FullName, terminalName)),
|
||||
Industry: strings.TrimSpace(param.Industry),
|
||||
LegalPersonName: strings.TrimSpace(appFirstNotEmpty(param.LegalPersonName, terminalName)),
|
||||
LegalPersonIdCard: strings.TrimSpace(appFirstNotEmpty(param.LegalPersonIdCard, "000000000000000000")),
|
||||
CompanyType: strings.TrimSpace(param.CompanyType),
|
||||
EstablishTime: establishTime,
|
||||
BankName: strings.TrimSpace(param.BankName),
|
||||
BankAccount: strings.TrimSpace(param.BankAccount),
|
||||
Balance: 0,
|
||||
TenantId: user.TenantId,
|
||||
CreatedDept: appUserDeptOrDefault(user),
|
||||
CreatedBy: user.UserId,
|
||||
CreatedAt: now,
|
||||
UpdatedBy: user.UserId,
|
||||
UpdatedAt: now,
|
||||
}).Insert(); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if _, err := dao.TTerminal.Ctx(ctx).TX(tx).
|
||||
Where(dao.TTerminal.Columns().TerminalId, user.UserId).
|
||||
Data(do.TTerminal{
|
||||
TerminalName: terminalName,
|
||||
Phone: phone,
|
||||
Email: email,
|
||||
CreditCode: strings.TrimSpace(param.CreditCode),
|
||||
AreaCode: strings.TrimSpace(param.AreaCode),
|
||||
Address: strings.TrimSpace(param.Address),
|
||||
FullName: strings.TrimSpace(param.FullName),
|
||||
Industry: strings.TrimSpace(param.Industry),
|
||||
LegalPersonName: strings.TrimSpace(param.LegalPersonName),
|
||||
LegalPersonIdCard: strings.TrimSpace(param.LegalPersonIdCard),
|
||||
CompanyType: strings.TrimSpace(param.CompanyType),
|
||||
EstablishTime: establishTime,
|
||||
BankName: strings.TrimSpace(param.BankName),
|
||||
BankAccount: strings.TrimSpace(param.BankAccount),
|
||||
UpdatedBy: user.UserId,
|
||||
UpdatedAt: now,
|
||||
}).
|
||||
OmitNil().
|
||||
Update(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := dao.TSimTerminal.Ctx(ctx).TX(tx).
|
||||
Where(dao.TSimTerminal.Columns().TenantId, user.TenantId).
|
||||
Where(dao.TSimTerminal.Columns().TerminalId, user.UserId).
|
||||
Data(do.TSimTerminal{
|
||||
TerminalName: terminalName,
|
||||
UpdatedBy: user.UserId,
|
||||
UpdatedAt: now,
|
||||
}).
|
||||
OmitNil().
|
||||
Update(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := dao.TPackageTerminal.Ctx(ctx).TX(tx).
|
||||
Where(dao.TPackageTerminal.Columns().TenantId, user.TenantId).
|
||||
Where(dao.TPackageTerminal.Columns().TerminalId, user.UserId).
|
||||
Data(do.TPackageTerminal{
|
||||
TerminalName: terminalName,
|
||||
UpdatedBy: user.UserId,
|
||||
UpdatedAt: now,
|
||||
}).
|
||||
OmitNil().
|
||||
Update(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func appParseProfileDate(value string) (*gtime.Time, error) {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
return nil, nil
|
||||
}
|
||||
parsed, err := time.Parse("2006-01-02", value)
|
||||
if err != nil {
|
||||
return nil, gerror.New("成立时间格式应为YYYY-MM-DD")
|
||||
}
|
||||
return gtime.NewFromTime(parsed), nil
|
||||
}
|
||||
|
||||
func getAppUserInfoById(ctx context.Context, userId int64) (res *model.AppUserInfoModel, err error) {
|
||||
var user *entity.SysUser
|
||||
err = dao.SysUser.Ctx(ctx).
|
||||
Where(dao.SysUser.Columns().UserId, userId).
|
||||
Scan(&user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if user == nil {
|
||||
return nil, gerror.New("用户不存在")
|
||||
}
|
||||
|
||||
isTerminal := appIsTerminalUser(ctx, user)
|
||||
canEnterpriseBusiness := !isTerminal && user.DeptId > 0
|
||||
balance := float64(0)
|
||||
role := "企业用户"
|
||||
phoneText := appMaskPhone(user.Phonenumber)
|
||||
var enterpriseProfile *model.AppEnterpriseProfileModel
|
||||
var terminalProfile *model.AppTerminalProfileModel
|
||||
if isTerminal {
|
||||
role = "终端用户"
|
||||
phoneText = strings.TrimSpace(user.Phonenumber)
|
||||
var terminal *entity.TTerminal
|
||||
if err = dao.TTerminal.Ctx(ctx).
|
||||
Where(dao.TTerminal.Columns().TenantId, user.TenantId).
|
||||
Where(dao.TTerminal.Columns().TerminalId, user.UserId).
|
||||
Limit(1).
|
||||
Scan(&terminal); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if terminal != nil {
|
||||
balance = terminal.Balance
|
||||
terminalProfile = appTerminalProfileModel(terminal)
|
||||
}
|
||||
} else if user.DeptId > 0 {
|
||||
var agentBalance *entity.TAgentBalance
|
||||
if err = dao.TAgentBalance.Ctx(ctx).
|
||||
Where(dao.TAgentBalance.Columns().TenantId, user.TenantId).
|
||||
Where(dao.TAgentBalance.Columns().DeptId, user.DeptId).
|
||||
Scan(&agentBalance); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if agentBalance != nil {
|
||||
balance = agentBalance.Balance
|
||||
}
|
||||
enterpriseProfile, err = appEnterpriseProfileByDept(ctx, user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
roleName, roleKey, roleNames := appLoadBoundRoleNames(ctx, user.UserId)
|
||||
|
||||
wechatBound, wechatBindText, err := appUserWechatBindingStatus(ctx, user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &model.AppUserInfoModel{
|
||||
UserId: user.UserId,
|
||||
TenantId: user.TenantId,
|
||||
DeptId: user.DeptId,
|
||||
Username: user.UserName,
|
||||
NickName: user.NickName,
|
||||
Phone: phoneText,
|
||||
Avatar: user.Avatar,
|
||||
Sex: user.Sex,
|
||||
UserType: user.UserType,
|
||||
IsTerminal: isTerminal,
|
||||
CanEnterpriseBusiness: canEnterpriseBusiness,
|
||||
WechatBound: wechatBound,
|
||||
WechatBindText: wechatBindText,
|
||||
Balance: balance,
|
||||
Role: role,
|
||||
RoleName: roleName,
|
||||
RoleKey: roleKey,
|
||||
RoleNames: roleNames,
|
||||
EnterpriseProfile: enterpriseProfile,
|
||||
TerminalProfile: terminalProfile,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// appLoadBoundRoleNames 读取账户在 sys_user_role 中绑定的角色,并关联 sys_role 返回真实角色名称。
|
||||
// 这样既保留原有账号类型 role,又能让前端按真实的角色表名称展示账户身份标识。
|
||||
func appLoadBoundRoleNames(ctx context.Context, userId int64) (roleName string, roleKey string, roleNames []string) {
|
||||
roleNames = make([]string, 0)
|
||||
var userRoles []*entity.SysUserRole
|
||||
if err := dao.SysUserRole.Ctx(ctx).
|
||||
Where(dao.SysUserRole.Columns().UserId, userId).
|
||||
Scan(&userRoles); err != nil || len(userRoles) == 0 {
|
||||
return "", "", roleNames
|
||||
}
|
||||
roleIds := make([]int64, 0, len(userRoles))
|
||||
for _, ur := range userRoles {
|
||||
if ur != nil && ur.RoleId > 0 {
|
||||
roleIds = append(roleIds, ur.RoleId)
|
||||
}
|
||||
}
|
||||
if len(roleIds) == 0 {
|
||||
return "", "", roleNames
|
||||
}
|
||||
var roles []*entity.SysRole
|
||||
if err := dao.SysRole.Ctx(ctx).
|
||||
WhereIn(dao.SysRole.Columns().RoleId, roleIds).
|
||||
Scan(&roles); err != nil || len(roles) == 0 {
|
||||
return "", "", roleNames
|
||||
}
|
||||
for _, r := range roles {
|
||||
if r == nil {
|
||||
continue
|
||||
}
|
||||
if name := strings.TrimSpace(r.RoleName); name != "" {
|
||||
roleNames = append(roleNames, name)
|
||||
}
|
||||
}
|
||||
if roles[0] != nil {
|
||||
roleName = strings.TrimSpace(roles[0].RoleName)
|
||||
roleKey = strings.TrimSpace(roles[0].RoleKey)
|
||||
}
|
||||
return roleName, roleKey, roleNames
|
||||
}
|
||||
|
||||
func appUserWechatBindingStatus(ctx context.Context, user *entity.SysUser) (bool, string, error) {
|
||||
if user == nil || user.UserId <= 0 {
|
||||
return false, "未绑定", nil
|
||||
}
|
||||
var social *entity.SysSocial
|
||||
err := dao.SysSocial.Ctx(ctx).
|
||||
Fields(dao.SysSocial.Columns().Id).
|
||||
Where(dao.SysSocial.Columns().TenantId, user.TenantId).
|
||||
Where(dao.SysSocial.Columns().UserId, user.UserId).
|
||||
Where(dao.SysSocial.Columns().Source, consts.SourceWechatMp).
|
||||
Where(dao.SysSocial.Columns().OpenId+" IS NOT NULL").
|
||||
Where(dao.SysSocial.Columns().OpenId+" <> ?", "").
|
||||
WhereNull(dao.SysSocial.Columns().DeletedAt).
|
||||
OrderDesc(dao.SysSocial.Columns().Id).
|
||||
Limit(1).
|
||||
Scan(&social)
|
||||
if err != nil {
|
||||
return false, "", gerror.Wrap(err, "查询微信绑定状态失败")
|
||||
}
|
||||
if social == nil || social.Id == 0 {
|
||||
return false, "未绑定", nil
|
||||
}
|
||||
return true, "已绑定", nil
|
||||
}
|
||||
|
||||
func appEnterpriseProfileByDept(ctx context.Context, user *entity.SysUser) (*model.AppEnterpriseProfileModel, error) {
|
||||
if user == nil || user.DeptId <= 0 {
|
||||
return nil, nil
|
||||
}
|
||||
var dept *entity.SysDept
|
||||
if err := dao.SysDept.Ctx(ctx).
|
||||
Where(dao.SysDept.Columns().TenantId, user.TenantId).
|
||||
Where(dao.SysDept.Columns().DeptId, user.DeptId).
|
||||
Limit(1).
|
||||
Scan(&dept); err != nil {
|
||||
return nil, gerror.Wrap(err, "查询企业基础信息失败")
|
||||
}
|
||||
if dept == nil || dept.DeptId == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var enterprise *entity.TAgentEnterprise
|
||||
if err := dao.TAgentEnterprise.Ctx(ctx).
|
||||
Where(dao.TAgentEnterprise.Columns().TenantId, user.TenantId).
|
||||
Where(dao.TAgentEnterprise.Columns().DeptId, user.DeptId).
|
||||
Limit(1).
|
||||
Scan(&enterprise); err != nil {
|
||||
return nil, gerror.Wrap(err, "查询企业客户档案失败")
|
||||
}
|
||||
|
||||
profile := &model.AppEnterpriseProfileModel{
|
||||
DeptId: dept.DeptId,
|
||||
DeptName: strings.TrimSpace(dept.DeptName),
|
||||
DeptKey: strings.TrimSpace(dept.DeptKey),
|
||||
Phone: appMaskPhone(dept.Phone),
|
||||
Email: appMaskEmail(dept.Email),
|
||||
StatusText: appDeptStatusText(dept.Status),
|
||||
CreditCode: appMaskCreditCode(dept.CreditCode),
|
||||
AreaCode: strings.TrimSpace(dept.AreaCode),
|
||||
Address: appMaskAddress(dept.Address),
|
||||
FullName: strings.TrimSpace(dept.DeptName),
|
||||
RealNameStatus: "实名资料待完善",
|
||||
}
|
||||
if enterprise != nil && enterprise.Id > 0 {
|
||||
profile.FullName = appFirstNotEmpty(enterprise.FullName, dept.DeptName)
|
||||
profile.Industry = strings.TrimSpace(enterprise.Industry)
|
||||
profile.LegalPersonName = appMaskName(enterprise.LegalPersonName)
|
||||
profile.LegalPersonIdCard = appMaskIdCard(enterprise.LegalPersonIdCard)
|
||||
profile.CompanyType = strings.TrimSpace(enterprise.CompanyType)
|
||||
profile.EstablishTime = appProfileDate(enterprise.EstablishTime)
|
||||
profile.BankName = strings.TrimSpace(enterprise.BankName)
|
||||
profile.BankAccount = appMaskBankAccount(enterprise.BankAccount)
|
||||
profile.RealNameStatus = appRealNameStatus(enterprise.FullName, enterprise.LegalPersonName, enterprise.LegalPersonIdCard)
|
||||
}
|
||||
return profile, nil
|
||||
}
|
||||
|
||||
func appTerminalProfileModel(terminal *entity.TTerminal) *model.AppTerminalProfileModel {
|
||||
if terminal == nil || terminal.TerminalId == 0 {
|
||||
return nil
|
||||
}
|
||||
return &model.AppTerminalProfileModel{
|
||||
TerminalId: terminal.TerminalId,
|
||||
TerminalName: strings.TrimSpace(terminal.TerminalName),
|
||||
Phone: strings.TrimSpace(terminal.Phone),
|
||||
Email: strings.TrimSpace(terminal.Email),
|
||||
Status: strings.TrimSpace(terminal.Status),
|
||||
StatusText: appTerminalStatusText(terminal.Status),
|
||||
CreditCode: strings.TrimSpace(terminal.CreditCode),
|
||||
AreaCode: strings.TrimSpace(terminal.AreaCode),
|
||||
Address: strings.TrimSpace(terminal.Address),
|
||||
FullName: strings.TrimSpace(terminal.FullName),
|
||||
Industry: strings.TrimSpace(terminal.Industry),
|
||||
LegalPersonName: strings.TrimSpace(terminal.LegalPersonName),
|
||||
LegalPersonIdCard: strings.TrimSpace(terminal.LegalPersonIdCard),
|
||||
CompanyType: strings.TrimSpace(terminal.CompanyType),
|
||||
EstablishTime: appProfileDate(terminal.EstablishTime),
|
||||
BankName: strings.TrimSpace(terminal.BankName),
|
||||
BankAccount: strings.TrimSpace(terminal.BankAccount),
|
||||
Balance: appRoundAmount(terminal.Balance),
|
||||
RealNameStatus: appRealNameStatus(terminal.FullName, terminal.LegalPersonName, terminal.LegalPersonIdCard),
|
||||
}
|
||||
}
|
||||
|
||||
func appProfileDate(value *gtime.Time) string {
|
||||
if value == nil || value.IsZero() {
|
||||
return ""
|
||||
}
|
||||
return value.Format("Y-m-d")
|
||||
}
|
||||
|
||||
func appTerminalStatusText(status string) string {
|
||||
switch strings.TrimSpace(status) {
|
||||
case consts.SysUserStatusNormal:
|
||||
return "正常"
|
||||
case "1":
|
||||
return "停用"
|
||||
case "":
|
||||
return "未设置"
|
||||
default:
|
||||
return "未知"
|
||||
}
|
||||
}
|
||||
|
||||
func appRealNameStatus(fullName string, legalPersonName string, legalPersonIdCard string) string {
|
||||
if strings.TrimSpace(fullName) == "" && strings.TrimSpace(legalPersonName) == "" {
|
||||
return "资料待完善"
|
||||
}
|
||||
idCard := strings.TrimSpace(legalPersonIdCard)
|
||||
if idCard == "" || idCard == "000000000000000000" {
|
||||
return "实名资料待完善"
|
||||
}
|
||||
return "已录入实名资料"
|
||||
}
|
||||
|
||||
func appMaskIdCard(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" || value == "000000000000000000" {
|
||||
return ""
|
||||
}
|
||||
runes := []rune(value)
|
||||
if len(runes) <= 8 {
|
||||
return value
|
||||
}
|
||||
return string(runes[:4]) + strings.Repeat("*", len(runes)-8) + string(runes[len(runes)-4:])
|
||||
}
|
||||
|
||||
func appMaskBankAccount(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
return ""
|
||||
}
|
||||
runes := []rune(value)
|
||||
if len(runes) <= 8 {
|
||||
return value
|
||||
}
|
||||
return string(runes[:4]) + strings.Repeat("*", len(runes)-8) + string(runes[len(runes)-4:])
|
||||
}
|
||||
|
||||
func appMaskPhone(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
runes := []rune(value)
|
||||
if len(runes) < 7 {
|
||||
return value
|
||||
}
|
||||
return string(runes[:3]) + "****" + string(runes[len(runes)-4:])
|
||||
}
|
||||
|
||||
func appMaskEmail(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
return ""
|
||||
}
|
||||
parts := strings.SplitN(value, "@", 2)
|
||||
if len(parts) != 2 {
|
||||
return appMaskMiddle(value, 1, 1)
|
||||
}
|
||||
name := []rune(parts[0])
|
||||
if len(name) <= 1 {
|
||||
return "*" + "@" + parts[1]
|
||||
}
|
||||
return string(name[:1]) + strings.Repeat("*", len(name)-1) + "@" + parts[1]
|
||||
}
|
||||
|
||||
func appMaskCreditCode(value string) string {
|
||||
return appMaskMiddle(value, 4, 4)
|
||||
}
|
||||
|
||||
func appMaskAddress(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
return ""
|
||||
}
|
||||
runes := []rune(value)
|
||||
if len(runes) <= 6 {
|
||||
return strings.Repeat("*", len(runes))
|
||||
}
|
||||
return string(runes[:6]) + strings.Repeat("*", len(runes)-6)
|
||||
}
|
||||
|
||||
func appMaskName(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
return ""
|
||||
}
|
||||
runes := []rune(value)
|
||||
if len(runes) <= 1 {
|
||||
return "*"
|
||||
}
|
||||
return string(runes[:1]) + strings.Repeat("*", len(runes)-1)
|
||||
}
|
||||
|
||||
func appMaskMiddle(value string, prefix int, suffix int) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
return ""
|
||||
}
|
||||
runes := []rune(value)
|
||||
if len(runes) <= prefix+suffix {
|
||||
if len(runes) <= 2 {
|
||||
return strings.Repeat("*", len(runes))
|
||||
}
|
||||
return string(runes[:1]) + strings.Repeat("*", len(runes)-2) + string(runes[len(runes)-1:])
|
||||
}
|
||||
return string(runes[:prefix]) + strings.Repeat("*", len(runes)-prefix-suffix) + string(runes[len(runes)-suffix:])
|
||||
}
|
||||
Reference in New Issue
Block a user