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:
MiFaZhan
2026-10-26 14:01:25 +08:00
commit 2ed5dfa6a1
1013 changed files with 138466 additions and 0 deletions
@@ -0,0 +1,236 @@
package system
import (
"context"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
v1 "git.5iot.com/iotlcm-public/iotlcm-app/api/system/v1"
"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/request"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/response"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
)
func (c *ControllerV1) UserInfo(ctx context.Context, req *v1.UserInfoReq) (res *v1.UserInfoRes, err error) {
// 获取token
userId := contexts.GetUserId(ctx)
if userId == 0 {
return nil, gerror.NewCode(gcode.CodeSecurityReason)
}
// 获取用户信息
user, err := service.SysUser().GetUserById(ctx, userId)
if err != nil {
return nil, err
}
menus, err := service.SysMenu().GetUserMenuTree(ctx)
if err != nil {
return nil, err
}
homePath := ""
firstMenu := "404"
if len(menus) > 0 {
for _, menu := range menus {
firstMenu = menu.Path
if len(menu.Children) == 0 {
break
}
for _, menu2 := range menu.Children {
firstMenu = firstMenu + "/" + menu2.Path
if len(menu2.Children) == 0 {
break
}
for _, menu3 := range menu2.Children {
firstMenu = firstMenu + "/" + menu3.Path
if len(menu3.Children) == 0 {
break
}
for _, menu4 := range menu3.Children {
firstMenu = firstMenu + "/" + menu4.Path
if len(menu4.Children) == 0 {
break
}
for _, menu5 := range menu4.Children {
firstMenu = firstMenu + "/" + menu5.Path
if len(menu5.Children) == 0 {
break
}
for _, menu6 := range menu5.Children {
firstMenu = firstMenu + "/" + menu6.Path
if len(menu6.Children) == 0 {
break
}
}
}
}
}
}
}
}
g.Log().Debugf(ctx, "firstMenu: %s", firstMenu)
if homePath == "" {
homePath = "/" + firstMenu
}
return &v1.UserInfoRes{
UserInfo: v1.UserInfo{
Id: user.UserId,
Username: user.UserName,
Nickname: user.NickName,
Avatar: user.Avatar,
Email: user.Email,
HomePath: homePath,
},
}, nil
}
func (c *ControllerV1) UserList(ctx context.Context, req *v1.UserListReq) (res *v1.UserListRes, err error) {
// 获取用户列表
users, total, err := service.SysUser().List(ctx, &req.PageInfo, &req.UserListParam)
if err != nil {
return nil, err
}
return &v1.UserListRes{
Data: users,
PageResult: response.PageResult{
Page: req.Page,
PageSize: req.PageSize,
Total: total,
},
}, nil
}
func (c *ControllerV1) AddUser(ctx context.Context, req *v1.AddUserReq) (res *v1.AddUserRes, err error) {
data, err := service.SysUser().AddUser(ctx, &req.SysUserAddModel)
if err != nil {
return nil, err
}
return &v1.AddUserRes{
Data: data,
}, nil
}
func (c *ControllerV1) UserProfile(ctx context.Context, req *v1.UserProfileReq) (res *v1.UserProfileRes, err error) {
user, err := service.SysUser().Profile(ctx)
if err != nil {
return nil, err
}
return &v1.UserProfileRes{
User: user,
}, nil
}
func (c *ControllerV1) UpdateCurrentUser(ctx context.Context, req *v1.UpdateCurrentUserReq) (res *v1.UpdateCurrentUserRes, err error) {
user, err := service.SysUser().UpdateCurrentUser(ctx, &req.UpdateCurrentUserModel)
if err != nil {
return nil, err
}
return &v1.UpdateCurrentUserRes{
UserInfo: v1.UserInfo{
Id: user.UserId,
Username: user.UserName,
Nickname: user.NickName,
Avatar: user.Avatar,
Email: user.Email,
},
}, nil
}
func (c *ControllerV1) UpdateCurrentUserPassword(ctx context.Context, req *v1.UpdateCurrentUserPasswordReq) (res *v1.UpdateCurrentUserPasswordRes, err error) {
err = service.SysUser().UpdateCurrentUserPassword(ctx, &req.UpdateCurrentUserPasswordModel)
if err != nil {
return nil, err
}
return &v1.UpdateCurrentUserPasswordRes{}, nil
}
func (c *ControllerV1) UpdateUser(ctx context.Context, req *v1.UpdateUserReq) (res *v1.UpdateUserRes, err error) {
err = service.SysUser().UpdateUser(ctx, &req.SysUserUpdateModel)
if err != nil {
return nil, err
}
user, err := service.SysUser().GetUserById(ctx, req.UserId)
if err != nil {
return nil, err
}
return &v1.UpdateUserRes{
SysUserViewModel: *user,
}, nil
}
func (c *ControllerV1) DeleteUser(ctx context.Context, req *v1.DeleteUserReq) (res *v1.DeleteUserRes, err error) {
if req.UserId != 0 {
err = service.SysUser().DeleteUser(ctx, []int64{req.UserId})
} else {
err = service.SysUser().DeleteUser(ctx, req.UserIds)
}
if err != nil {
return nil, err
}
return &v1.DeleteUserRes{}, nil
}
func (c *ControllerV1) GetUser(ctx context.Context, req *v1.GetUserReq) (res *v1.GetUserRes, err error) {
// 如果调用方传入 userId == 0,则不返回错误,直接返回空的用户视图结构
if req.UserId == 0 {
return &v1.GetUserRes{
SysUserViewModel: model.SysUserViewModel{},
}, nil
}
user, err := service.SysUser().GetUserById(ctx, req.UserId)
if err != nil {
return nil, err
}
return &v1.GetUserRes{
SysUserViewModel: *user,
}, nil
}
func (c *ControllerV1) ResetPassword(ctx context.Context, req *v1.ResetPasswordReq) (res *v1.ResetPasswordRes, err error) {
err = service.SysUser().ResetPassword(ctx, req.UserId, req.Password)
if err != nil {
return nil, err
}
return &v1.ResetPasswordRes{}, nil
}
func (c *ControllerV1) GetUserListByDeptId(ctx context.Context, req *v1.GetUserListByDeptIdReq) (res *v1.GetUserListByDeptIdRes, err error) {
users, total, err := service.SysUser().List(ctx, &request.PageInfo{
Page: req.Page,
PageSize: req.PageSize,
}, &model.UserListParam{
DeptId: req.DeptId,
})
if err != nil {
return nil, err
}
miniUsers := make([]*model.SysUserMiniModel, 0)
gconv.Structs(users, &miniUsers)
return &v1.GetUserListByDeptIdRes{
Items: miniUsers,
PageResult: response.PageResult{
Page: req.Page,
PageSize: req.PageSize,
Total: total,
},
}, nil
}
// UserRegister 用户注册
func (c *ControllerV1) UserRegister(ctx context.Context, req *v1.UserRegisterReq) (res *v1.UserRegisterRes, err error) {
err = service.SysUser().Register(ctx, &req.SysUserRegisterModel)
if err != nil {
return nil, err
}
return &v1.UserRegisterRes{}, nil
}
// UserStatus 更新用户状态
func (c *ControllerV1) UserStatus(ctx context.Context, req *v1.UserStatusReq) (res *v1.UserStatusRes, err error) {
err = service.SysUser().Status(ctx, &req.SysUserStatusParam)
if err != nil {
return nil, err
}
return &v1.UserStatusRes{}, nil
}