提交 cbc6757c 编写于 作者: W wuhanqing

ADD API /api/user/logout

上级 9fd252dc
......@@ -10,4 +10,5 @@ go.sum
.env
*.exe
*.bk
easyim
\ No newline at end of file
easyim
docs/apidoc
\ No newline at end of file
......@@ -76,12 +76,24 @@ IM数据通讯的长连接,支持数据传输 `json`, `protobuf` 两种格式
## 在线文档
全局安装 `docsify` 文档生成工具:
### docsify 文档工具
```
# 全局安装 docsify 文档生成工具
npm i docsify-cli -g
# 文档初始化
docsify init ./docs
# 本地预览. 默认地址: http://localhost:3000
docsify serve docs
```
- 文档初始化: `docsify init ./docs`
### apidoc 文档工具
- 本地预览: `docsify serve docs`
\ No newline at end of file
```
# 全局安装 apidoc 文档工具,可以根据代码注释,生成API文档
npm install -g apidoc
# 扫描 server/handler 目录中的代码注释,在 docs/apidoc 目录生成API文档
apidoc -i server/handler -o docs/apidoc
# 配置文件 apidoc.json
# 默认地址: http://localhost:3000/apidoc/index.html
```
\ No newline at end of file
......@@ -95,21 +95,18 @@ func (u User) Register(password string) (User, error) {
user.Account = u.Account
GetModel(user)
if user.ID > 0 {
return User{}, fmt.Errorf("注册失败!登录账号已存在")
return User{}, fmt.Errorf("登录账号已存在")
}
}
if u.Mobile != "" {
user.Mobile = u.Mobile
GetModel(user)
if user.ID > 0 {
return User{}, fmt.Errorf("注册失败!手机号已存在")
return User{}, fmt.Errorf("手机号已存在")
}
}
if user.ID > 0 {
return User{}, fmt.Errorf("error: Regiser Fail. User exists")
}
if u.Account == "" && u.Mobile == "" {
return User{}, fmt.Errorf("注册失败!登录账号不能为空")
return User{}, fmt.Errorf("登录账号不能为空")
}
user.Account = u.Account
user.Mobile = u.Mobile
......
......@@ -43,13 +43,29 @@ type UserRegisterForm struct {
Nickname string `json:"nickname"`
}
/**
* @apiDefine LoginParams
* @apiBody {String} account 用户登录账号
* @apiBody {String} password 用户登录密码
*/
/**
* @api {post} /api/user/register 用户注册
* @apiName 用户注册接口
* @apiGroup 注册登录
* @apiUse LoginParams
* @apiBody {String} nickname 用户昵称
* @apiUse PublicCommonParams
* @apiErrorExample {json} 请求异常示例
* {"code":400,"msg":"注册失败!登录账号已存在","data":{}}
* @apiUse LoginOrRegisterSuccessBlock
*/
func userRegister(req *model.Request) error {
postData := UserRegisterForm{}
err := req.GetHttpBodyToJson(&postData)
if err != nil {
return req.ResponseJson(model.ResponseQueryArgsError(err.Error()))
}
u := database.User{Account: postData.Account, Nickname: postData.Nickname}
u, err = u.Register(postData.Password)
if err != nil {
......@@ -58,6 +74,16 @@ func userRegister(req *model.Request) error {
return loginOrRegisterSuccess(u, *req)
}
/**
* @api {post} /api/user/login 用户登录
* @apiName 用户登录
* @apiGroup 注册登录
* @apiUse LoginParams
* @apiUse PublicCommonParams
* @apiErrorExample {json} 请求异常示例
* {"code":400,"msg":"密码不正确","data":{}}
* @apiUse LoginOrRegisterSuccessBlock
*/
func userLogin(req *model.Request) error {
postData := UserLoginForm{}
err := req.GetHttpBodyToJson(&postData)
......@@ -76,6 +102,17 @@ func userLogin(req *model.Request) error {
return loginOrRegisterSuccess(*user, *req)
}
/**
* @apiDefine LoginOrRegisterSuccessBlock
* @apiSuccess {String} data.id 用户ID
* @apiSuccess {String} data.nickname 用户昵称
* @apiSuccess {String} data.avatar 用户头像
* @apiSuccess {String} data.access_token 通讯凭证,在IM通讯中或需要身份鉴权的API中使用。 有效期7200秒(2小时)
* @apiSuccess {String} data.expires_in access_token(通讯凭证)的有效期(一般为7200秒)
* @apiSuccess {String} data.refresh_token 用于刷新access_token(通讯凭证),有效期30天
* @apiSuccessExample {json} 请求成功示例
* {"code":200,"msg":"success","data":{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjoiYWNjb3VudFd1aGFucWluZyIsImF2YXRhciI6IiIsImV4cCI6MTY3NzQ3NDkxNCwiaWQiOjE2Mjk0MjA5MjQ5MTI1Mzc2MDB9.IucceY2x7FSB81-nxEj_yMYggYaBnCzEX1GA8LdzPCE","avatar":"https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png","expires_in":7200,"id":"1629420924912537600","nickname":"飞天的猪","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjoiYWNjb3VudFd1aGFucWluZyIsImF2YXRhciI6IiIsImV4cCI6MTY4MDA1OTcxNCwiaWQiOjE2Mjk0MjA5MjQ5MTI1Mzc2MDB9.Mu4N8-uegCdq26ocIx7HINmoUgLyrwpqo4cYDslHwzs"}}
*/
func loginOrRegisterSuccess(u database.User, req model.Request) error {
jwtInfo := u.GetJwtInfo()
data := model.JsonObject{
......@@ -89,8 +126,39 @@ func loginOrRegisterSuccess(u database.User, req model.Request) error {
return model.ResponseApi(data, "success", 200).Write(req)
}
type UserLogoutData struct {
Account string `json:"account"`
AccessToken string `json:"access_token"`
}
/**
* @api {post} /api/user/logout 退出登录
* @apiGroup 注册登录
* @apiBody {String} access_token 通讯凭证
* @apiUse PublicCommonParams
* @apiErrorExample {json} 请求异常示例
* {"code":400,"msg":"access_token不正确","data":{}}
* @apiSuccessExample {json} 请求成功示例
* {}
*/
func userLogout(req *model.Request) error {
return nil
postData := UserLogoutData{}
err := req.GetHttpBodyToJson(&postData)
if err != nil {
return req.ResponseJson(model.ResponseQueryArgsError(err.Error()))
}
u := database.User{}
u, err = u.GetUserByJwt(postData.AccessToken)
if err != nil {
return model.ResponseFail(err.Error(), 400).Write(*req)
}
u.ResetSalt()
_, err = database.UpdateModel(&u, map[string]interface{}{"salt": u.Salt})
if err != nil {
return model.ResponseServerError().Write(*req)
}
return model.ResponseOk("退出登录成功").Write(*req)
}
func getUserAccessToken(req *model.Request) error {
......@@ -100,3 +168,24 @@ func getUserAccessToken(req *model.Request) error {
func getUserRefreshToken(req *model.Request) error {
return nil
}
/**
* @apiDefine PublicCommonParams
* @apiSuccess {integer} code 状态码(请求成功为200)
* @apiSuccess {string} msg 请求成功提示信息
* @apiSuccess {Object} data 响应数据
* @apiSuccess {integer} code 请求异常状态码
* @apiError {string} msg 请求异常提示信息
*/
/**
* @apiDefine ErrorServer
* @apiErrorExample {json} 请求异常示例
* {"code":500,"msg":"ServerError.服务器内部错误","data":{}}
*/
/**
* @apiDefine PublicCommonBlock
* @apiUse PublicCommonParams
* @apiUse ErrorServer
*/
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册