Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
cms
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
iuav
cms
Commits
ace6ad4a
提交
ace6ad4a
authored
5月 26, 2023
作者:
zhenjie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
后台用户相关接口
上级
dd11be86
隐藏空白字符变更
内嵌
并排
正在显示
40 个修改的文件
包含
2442 行增加
和
19 行删除
+2442
-19
BaseAccountDTO.java
...main/java/com/mmc/iuav/user/model/dto/BaseAccountDTO.java
+38
-0
LoginSuccessDTO.java
...ain/java/com/mmc/iuav/user/model/dto/LoginSuccessDTO.java
+25
-0
UserAccountSimpleDTO.java
...ava/com/mmc/iuav/user/model/dto/UserAccountSimpleDTO.java
+5
-0
BUserAccountQO.java
.../main/java/com/mmc/iuav/user/model/qo/BUserAccountQO.java
+69
-0
LoginUserQO.java
...src/main/java/com/mmc/iuav/user/model/qo/LoginUserQO.java
+26
-0
BUserAccountVO.java
.../main/java/com/mmc/iuav/user/model/vo/BUserAccountVO.java
+83
-0
UserAccountVO.java
...c/main/java/com/mmc/iuav/user/model/vo/UserAccountVO.java
+6
-0
UserTagVO.java
...l/src/main/java/com/mmc/iuav/user/model/vo/UserTagVO.java
+26
-0
JwtUtil.java
...-common-util/src/main/java/com/mmc/iuav/auth/JwtUtil.java
+3
-4
CodeUtil.java
...mon-util/src/main/java/com/mmc/iuav/general/CodeUtil.java
+4
-0
Create.java
...-common-util/src/main/java/com/mmc/iuav/group/Create.java
+9
-0
Freeze.java
...-common-util/src/main/java/com/mmc/iuav/group/Freeze.java
+9
-0
UpdatePassword.java
...util/src/main/java/com/mmc/iuav/group/UpdatePassword.java
+9
-0
BizException.java
...on-util/src/main/java/com/mmc/iuav/http/BizException.java
+90
-0
BaseInfoQO.java
...mmon-util/src/main/java/com/mmc/iuav/page/BaseInfoQO.java
+44
-0
PageResult.java
...mmon-util/src/main/java/com/mmc/iuav/page/PageResult.java
+49
-0
TimePage.java
...common-util/src/main/java/com/mmc/iuav/page/TimePage.java
+34
-0
ResultEnum.java
...-util/src/main/java/com/mmc/iuav/response/ResultEnum.java
+14
-1
BCrypt.java
...ice-user/src/main/java/com/mmc/iuav/user/auth/BCrypt.java
+927
-0
BCryptPasswordEncoder.java
...in/java/com/mmc/iuav/user/auth/BCryptPasswordEncoder.java
+156
-0
PasswordEncoder.java
...src/main/java/com/mmc/iuav/user/auth/PasswordEncoder.java
+40
-0
PwdUtil.java
...ce-user/src/main/java/com/mmc/iuav/user/auth/PwdUtil.java
+18
-0
AuthController.java
...ain/java/com/mmc/iuav/user/controller/AuthController.java
+16
-0
BackUserAccountController.java
...m/mmc/iuav/user/controller/BackUserAccountController.java
+93
-0
BaseController.java
...ain/java/com/mmc/iuav/user/controller/BaseController.java
+34
-0
CooperationController.java
...a/com/mmc/iuav/user/controller/CooperationController.java
+7
-0
UserAccountController.java
...a/com/mmc/iuav/user/controller/UserAccountController.java
+4
-7
CooperationDao.java
...r/src/main/java/com/mmc/iuav/user/dao/CooperationDao.java
+20
-0
UserServiceDao.java
...r/src/main/java/com/mmc/iuav/user/dao/UserServiceDao.java
+59
-0
UserAccountDO.java
...src/main/java/com/mmc/iuav/user/entity/UserAccountDO.java
+22
-2
UserTagDO.java
...ser/src/main/java/com/mmc/iuav/user/entity/UserTagDO.java
+37
-0
UserAccountStatus.java
.../main/java/com/mmc/iuav/user/enums/UserAccountStatus.java
+34
-0
AuthService.java
.../src/main/java/com/mmc/iuav/user/service/AuthService.java
+15
-0
CooperationService.java
...in/java/com/mmc/iuav/user/service/CooperationService.java
+8
-0
UserAccountService.java
...in/java/com/mmc/iuav/user/service/UserAccountService.java
+61
-0
AuthServiceImpl.java
.../java/com/mmc/iuav/user/service/impl/AuthServiceImpl.java
+53
-3
CooperationServiceImpl.java
...om/mmc/iuav/user/service/impl/CooperationServiceImpl.java
+17
-0
UserAccountServiceImpl.java
...om/mmc/iuav/user/service/impl/UserAccountServiceImpl.java
+142
-0
CooperationDao.xml
...service-user/src/main/resources/mapper/CooperationDao.xml
+16
-0
UserServiceDao.xml
...service-user/src/main/resources/mapper/UserServiceDao.xml
+120
-2
没有找到文件。
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/dto/BaseAccountDTO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
dto
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年11月4日 下午2:38:36
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
BaseAccountDTO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2979712090903806216L
;
private
Integer
id
;
private
String
uid
;
private
String
accountPhone
;
private
String
accountNo
;
private
String
accountName
;
private
String
tokenPort
;
// @ApiModelProperty(value = "角色ID")
// private Integer roleId;
// @ApiModelProperty(value = "是否为管理角色:0否 1是")
// private Integer admin;// 是否为管理角色
// @ApiModelProperty(value = "是否为运营角色:0否 1是")
// private Integer operate;
// @ApiModelProperty(value = "是否PMC发货专员:0否 1是")
// private Integer pmc;
// @ApiModelProperty(value = "单位信息")
// private CompanyCacheDTO companyInfo;// 单位信息
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/dto/LoginSuccessDTO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
dto
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午8:06:14
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
LoginSuccessDTO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
1200834589953161925L
;
private
String
token
;
private
Integer
userAccountId
;
private
String
accountNo
;
// private RoleInfoDTO roleInfo;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/dto/UserAccountSimpleDTO.java
浏览文件 @
ace6ad4a
...
...
@@ -22,6 +22,8 @@ public class UserAccountSimpleDTO implements Serializable {
private
Integer
id
;
@ApiModelProperty
(
value
=
"用户类型"
)
private
Integer
accountType
;
@ApiModelProperty
(
value
=
"用户账号"
)
private
String
accountNo
;
@ApiModelProperty
(
value
=
"用户uid"
)
private
String
uid
;
@ApiModelProperty
(
value
=
"手机号"
)
...
...
@@ -44,4 +46,6 @@ public class UserAccountSimpleDTO implements Serializable {
private
Integer
portType
;
@ApiModelProperty
(
value
=
"企业认证状态, 0未通过,1通过"
)
private
Integer
companyAuthStatus
;
@ApiModelProperty
(
value
=
"合作标签id"
)
private
Integer
cooperationTagId
;
}
\ No newline at end of file
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/qo/BUserAccountQO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
qo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.springframework.data.domain.Page
;
import
javax.validation.constraints.Min
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* @author: zj
* @Date: 2023/5/25 13:32
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
BUserAccountQO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
value
=
"关键字"
,
required
=
false
)
private
String
keyword
;
@ApiModelProperty
(
value
=
"地区"
,
required
=
false
)
private
String
area
;
@ApiModelProperty
(
value
=
"省份编码"
,
required
=
false
)
private
Integer
provinceCode
;
@ApiModelProperty
(
value
=
"城市编码"
,
required
=
false
)
private
Integer
cityCode
;
@ApiModelProperty
(
value
=
"县区编码"
,
required
=
false
)
private
Integer
districtCode
;
@ApiModelProperty
(
value
=
"角色id"
,
required
=
false
)
private
Integer
roleId
;
@ApiModelProperty
(
value
=
"账号状态:0禁用 1可用"
)
private
Integer
accountStatus
;
@ApiModelProperty
(
value
=
"账号状态:0合伙人 1员工"
)
private
Integer
userType
;
@ApiModelProperty
(
value
=
"用户id集合"
)
private
List
<
Integer
>
userIds
;
@ApiModelProperty
(
value
=
"推荐单位id"
)
private
Integer
rcdCompanyId
;
@ApiModelProperty
(
value
=
"单位集合"
,
hidden
=
true
)
private
List
<
Integer
>
companys
;
@ApiModelProperty
(
value
=
"页码"
,
required
=
true
)
@NotNull
(
message
=
"页码不能为空"
,
groups
=
Page
.
class
)
@Min
(
value
=
1
,
groups
=
Page
.
class
)
private
Integer
pageNo
;
@ApiModelProperty
(
value
=
"每页显示数"
,
required
=
true
)
@NotNull
(
message
=
"每页显示数不能为空"
,
groups
=
Page
.
class
)
@Min
(
value
=
1
,
groups
=
Page
.
class
)
private
Integer
pageSize
;
public
void
buildCurrentPage
()
{
this
.
pageNo
=
(
pageNo
-
1
)
*
pageSize
;
}
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/qo/LoginUserQO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
qo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
/**
* @author: zj
* @Date: 2023/5/25 10:39
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
LoginUserQO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
6148830939265702460L
;
@ApiModelProperty
(
value
=
"登录账号"
)
@NotNull
(
message
=
"登录账号不能为空"
)
private
String
accountNo
;
@ApiModelProperty
(
value
=
"登录密码"
)
@NotNull
(
message
=
"登录密码不能为空"
)
private
String
passWord
;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/BUserAccountVO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
vo
;
import
com.mmc.iuav.group.Create
;
import
com.mmc.iuav.group.Update
;
import
com.mmc.iuav.group.UpdatePassword
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
javax.validation.constraints.Email
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
/**
* @author: zj
* @Date: 2023/5/25 11:15
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
BUserAccountVO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
5809674104674997410L
;
@ApiModelProperty
(
value
=
"id"
)
@NotNull
(
message
=
"更新时ID不能为空"
,
groups
=
{
Update
.
class
,
UpdatePassword
.
class
})
private
Integer
id
;
@ApiModelProperty
(
value
=
"账号"
,
example
=
"developer"
)
@NotEmpty
(
message
=
"账号不能为空"
,
groups
=
{
Create
.
class
,
Update
.
class
})
private
String
accountNo
;
@ApiModelProperty
(
value
=
"姓名"
,
example
=
"张三丰"
)
@NotEmpty
(
message
=
"姓名不能为空"
,
groups
=
{
Create
.
class
,
Update
.
class
})
private
String
userName
;
@ApiModelProperty
(
value
=
"电话"
,
example
=
"13700137000"
)
@NotEmpty
(
message
=
"创建,修改时电话不能为空"
,
groups
=
{
Create
.
class
,
Update
.
class
})
private
String
phoneNum
;
@ApiModelProperty
(
value
=
"密码"
,
example
=
"123456"
)
@NotEmpty
(
message
=
"创建密码不能为空"
,
groups
=
{
Create
.
class
,
UpdatePassword
.
class
})
private
String
passWord
;
@ApiModelProperty
(
value
=
"确认密码"
,
example
=
"123456"
)
@NotEmpty
(
message
=
"确认密码不能为空"
,
groups
=
{
Create
.
class
,
UpdatePassword
.
class
})
private
String
alertPwd
;
@ApiModelProperty
(
value
=
"备注"
,
example
=
"一个备注"
)
private
String
remark
;
@ApiModelProperty
(
value
=
"状态"
,
example
=
"1"
)
@NotNull
(
message
=
"状态不能为空"
,
groups
=
{
Update
.
class
})
private
Integer
accountStatus
;
@ApiModelProperty
(
value
=
"角色"
,
example
=
"1"
,
hidden
=
true
)
//@NotNull(message = "角色不能为空", groups = {Create.class, Update.class})
private
Integer
roleId
;
@ApiModelProperty
(
value
=
"能控制的用户资源来源"
,
hidden
=
true
)
private
Integer
controlSource
;
@ApiModelProperty
(
value
=
"电子邮箱"
,
example
=
"220700100213@163.com"
)
@Email
private
String
email
;
@ApiModelProperty
(
value
=
"所属公司ID"
,
example
=
"1"
,
hidden
=
true
)
private
Integer
companyId
;
@ApiModelProperty
(
value
=
"账号类型:0合伙人 1员工"
,
example
=
"1"
,
hidden
=
true
)
private
Integer
userType
;
@ApiModelProperty
(
value
=
"省份编码"
,
required
=
false
)
private
Integer
provinceCode
;
@ApiModelProperty
(
value
=
"城市编码"
,
required
=
false
)
private
Integer
cityCode
;
@ApiModelProperty
(
value
=
"县区编码"
,
required
=
false
)
private
Integer
districtCode
;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/UserAccountVO.java
浏览文件 @
ace6ad4a
...
...
@@ -30,6 +30,8 @@ public class UserAccountVO implements Serializable {
private
Integer
accountType
;
@ApiModelProperty
(
value
=
"用户uid"
)
private
String
uid
;
@ApiModelProperty
(
value
=
"用户账号"
)
private
String
accountNo
;
@ApiModelProperty
(
value
=
"手机号"
)
private
String
phoneNum
;
@ApiModelProperty
(
value
=
"用户名称"
)
...
...
@@ -53,5 +55,9 @@ public class UserAccountVO implements Serializable {
private
Integer
portType
;
@ApiModelProperty
(
value
=
"注册时间"
)
private
Date
createTime
;
@ApiModelProperty
(
value
=
"企业认证状态, 0未通过,1通过"
)
private
Integer
companyAuthStatus
;
@ApiModelProperty
(
value
=
"合作标签id"
)
private
Integer
cooperationTagId
;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/UserTagVO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
vo
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* @author: zj
* @Date: 2023/5/26 20:58
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public
class
UserTagVO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2693784088480292773L
;
private
Integer
id
;
private
Integer
cooperationTagId
;
private
Integer
userAccountId
;
private
Date
createTime
;
private
Date
updateTime
;
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/auth/JwtUtil.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
auth
;
import
com.mmc.iuav.general.CodeUtil
;
import
io.jsonwebtoken.Claims
;
import
io.jsonwebtoken.JwtBuilder
;
import
io.jsonwebtoken.Jwts
;
import
io.jsonwebtoken.SignatureAlgorithm
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultEnum
;
import
io.jsonwebtoken.*
;
import
javax.crypto.spec.SecretKeySpec
;
import
javax.xml.bind.DatatypeConverter
;
...
...
cms-common/cms-common-util/src/main/java/com/mmc/iuav/general/CodeUtil.java
浏览文件 @
ace6ad4a
...
...
@@ -25,4 +25,8 @@ public class CodeUtil {
public
static
String
randomCode
(
int
i
)
{
return
CodeUtil
.
getRandomNum
(
i
);
}
public
static
String
removeUserAccount
()
{
return
"DELETE"
+
CodeUtil
.
getRandomNum
(
15
);
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/group/Create.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
group
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月28日 下午5:37:44
* @explain 类说明
*/
public
interface
Create
{
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/group/Freeze.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
group
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年9月18日 上午11:22:40
* @explain 类说明
*/
public
interface
Freeze
{
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/group/UpdatePassword.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
group
;
/**
* author:zhenjie
* Date:2021/10/8
* time:16:26
*/
public
interface
UpdatePassword
{
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/http/BizException.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
http
;
import
com.mmc.iuav.response.BaseErrorInfoInterface
;
import
com.mmc.iuav.response.ResultEnum
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月13日 上午9:25:43
* @explain 类说明
*/
public
class
BizException
extends
RuntimeException
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 错误码
*/
protected
String
errorCode
;
/**
* 错误信息
*/
protected
String
errorMsg
;
public
BizException
()
{
super
();
}
public
BizException
(
BaseErrorInfoInterface
errorInfoInterface
)
{
super
(
errorInfoInterface
.
getResultCode
());
this
.
errorCode
=
errorInfoInterface
.
getResultCode
();
this
.
errorMsg
=
errorInfoInterface
.
getResultMsg
();
}
public
BizException
(
BaseErrorInfoInterface
errorInfoInterface
,
Throwable
cause
)
{
super
(
errorInfoInterface
.
getResultCode
(),
cause
);
this
.
errorCode
=
errorInfoInterface
.
getResultCode
();
this
.
errorMsg
=
errorInfoInterface
.
getResultMsg
();
}
public
BizException
(
ResultEnum
enums
)
{
super
(
enums
.
getResultCode
());
this
.
errorCode
=
enums
.
getResultCode
();
this
.
errorMsg
=
enums
.
getResultMsg
();
}
public
BizException
(
String
errorMsg
)
{
super
(
errorMsg
);
this
.
errorCode
=
"-1"
;
this
.
errorMsg
=
errorMsg
;
}
public
BizException
(
String
errorCode
,
String
errorMsg
)
{
super
(
errorCode
);
this
.
errorCode
=
errorCode
;
this
.
errorMsg
=
errorMsg
;
}
public
BizException
(
String
errorCode
,
String
errorMsg
,
Throwable
cause
)
{
super
(
errorCode
,
cause
);
this
.
errorCode
=
errorCode
;
this
.
errorMsg
=
errorMsg
;
}
public
String
getErrorCode
()
{
return
errorCode
;
}
public
void
setErrorCode
(
String
errorCode
)
{
this
.
errorCode
=
errorCode
;
}
public
String
getErrorMsg
()
{
return
errorMsg
;
}
public
void
setErrorMsg
(
String
errorMsg
)
{
this
.
errorMsg
=
errorMsg
;
}
@Override
public
String
getMessage
()
{
return
errorMsg
;
}
@Override
public
Throwable
fillInStackTrace
()
{
return
this
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/page/BaseInfoQO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
page
;
import
com.mmc.iuav.group.Freeze
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.springframework.data.domain.Page
;
import
javax.validation.constraints.Min
;
import
javax.validation.constraints.NotNull
;
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
BaseInfoQO
{
@ApiModelProperty
(
value
=
"开始时间"
)
private
String
startTime
;
@ApiModelProperty
(
value
=
"结束时间"
)
private
String
endTime
;
@ApiModelProperty
(
value
=
"页码"
)
@NotNull
(
message
=
"页码不能为空"
,
groups
=
{
Page
.
class
,
Freeze
.
class
})
@Min
(
value
=
1
,
groups
=
Page
.
class
,
message
=
"pageNo不能少于1"
)
private
Integer
pageNo
;
@ApiModelProperty
(
value
=
"每页显示数"
)
@NotNull
(
message
=
"每页显示数不能为空"
,
groups
=
{
Page
.
class
,
Freeze
.
class
})
@Min
(
value
=
1
,
groups
=
Page
.
class
,
message
=
"pageSize不能少于1"
)
private
Integer
pageSize
;
/**
* 初始化起始查询行并返回当前页
*/
public
Integer
buildCurrentPage
()
{
Integer
pageNo
=
this
.
pageNo
;
this
.
pageNo
=
(
pageNo
-
1
)
*
pageSize
;
return
pageNo
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/page/PageResult.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
page
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月28日 下午3:18:21
* @explain 分页工具类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
PageResult
<
T
>
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2848996493573325801L
;
private
int
pageNo
;
// 分页起始页
private
int
pageSize
;
// 每页记录数
private
T
list
;
// 返回的记录集合
private
long
totalCount
;
// 总记录条数
private
long
totalPage
;
// 总页数
public
static
PageResult
buildPage
(
int
pageNo
,
int
pageSize
,
int
totalCount
)
{
PageResult
page
=
new
PageResult
();
page
.
pageNo
=
pageNo
;
page
.
pageSize
=
pageSize
;
page
.
totalCount
=
totalCount
;
page
.
totalPage
=
(
totalCount
%
pageSize
==
0
)
?
(
totalCount
/
pageSize
)
:
(
totalCount
/
pageSize
+
1
);
return
page
;
}
public
static
<
T
>
PageResult
buildPage
(
int
pageNo
,
int
pageSize
,
int
totalCount
,
T
list
)
{
PageResult
page
=
PageResult
.
buildPage
(
pageNo
,
pageSize
,
totalCount
);
page
.
setList
(
list
);
return
page
;
}
public
static
PageResult
buildPage
(
BaseInfoQO
qo
,
int
totalCount
)
{
PageResult
page
=
new
PageResult
();
page
.
pageNo
=
qo
.
getPageNo
();
Integer
pageSize
=
qo
.
getPageSize
();
page
.
pageSize
=
pageSize
;
page
.
totalCount
=
totalCount
;
page
.
totalPage
=
(
totalCount
%
pageSize
==
0
)
?
(
totalCount
/
pageSize
)
:
(
totalCount
/
pageSize
+
1
);
return
page
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/page/TimePage.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
page
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年11月10日 上午11:40:34
* @explain 类说明
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
TimePage
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2530498038870578257L
;
private
int
pageNo
;
// 分页起始页
private
int
pageSize
;
// 每页记录数
private
long
totalCount
;
// 总记录条数
private
long
totalPage
;
// 总页数
private
long
ctime
;
public
static
TimePage
buildPage
(
int
pageNo
,
int
pageSize
,
int
totalCount
,
long
ctime
)
{
TimePage
page
=
new
TimePage
();
page
.
pageNo
=
pageNo
;
page
.
pageSize
=
pageSize
;
page
.
totalCount
=
totalCount
;
page
.
totalPage
=
(
totalCount
%
pageSize
==
0
)
?
(
totalCount
/
pageSize
)
:
(
totalCount
/
pageSize
+
1
);
page
.
setCtime
(
ctime
);
return
page
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/response/ResultEnum.java
浏览文件 @
ace6ad4a
...
...
@@ -14,12 +14,25 @@ public enum ResultEnum implements BaseErrorInfoInterface{
COMPANY_NOT_AUTH_ERROR
(
"1001"
,
"未进行企业认证"
),
BUSINESS_LICENSE_CHECK_PARAMETER_ERROR
(
"1002"
,
"企业信息与营业执照信息不一致,请重新上传"
),
LOGIN_ACCOUNT_NOT_EXIT_ERROR
(
"5005"
,
"账号不存在"
),
LOGIN_PASSWORD_ERROR
(
"5006"
,
"密码错误"
),
LOGIN_ACCOUNT_STATUS_ERROR
(
"5008"
,
"外部访问"
),
//微信相关
PASSWORD_INCONSISTENT
(
"5026"
,
"新密码与确认密码不一致,请确认一致"
),
WX_ACCESS_TOKEN_ERROR
(
"5027"
,
"获取微信AccessToken失败"
),
APPLET_QR_CODE_CREATE_ERROR
(
"5030"
,
"生成小程序码错误:"
),
PWD_CREATE_ERROR
(
"6001"
,
"创建密码失败"
),
PWD_CONPARED_ERROR
(
"6002"
,
"密码错误"
),
PWD_ALERT_ERROR
(
"6003"
,
"密码不一致"
),
PWD_REQUEST_AUTH_ERROR
(
"6003"
,
"密码请求验证"
),
APPLET_PORT_TYPE_ERROR
(
"7001"
,
"小程序端口类型错误"
),
APPLET_LOGIN_ERROR
(
"7002"
,
"获取小程序登录失败"
);
APPLET_LOGIN_ERROR
(
"7002"
,
"获取小程序登录失败"
),
UPDATE_USER_ACCOUNT_REPEAT
(
"7003"
,
"修改后的账户名已存在"
),
ADD_USER_ACCOUNT_NAME_EXISTS
(
"7004"
,
"新增账户名已经存在"
);
/**
* 错误码
...
...
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/BCrypt.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
// Copyright (c) 2006 Damien Miller <djm@mindrot.org>
//
// Permission to use, copy, modify, and distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
import
java.nio.charset.StandardCharsets
;
import
java.security.MessageDigest
;
import
java.security.SecureRandom
;
import
java.util.Arrays
;
/**
* BCrypt implements OpenBSD-style Blowfish password hashing using
* the scheme described in "A Future-Adaptable Password Scheme" by
* Niels Provos and David Mazieres.
* <p>
* This password hashing system tries to thwart off-line password
* cracking using a computationally-intensive hashing algorithm,
* based on Bruce Schneier's Blowfish cipher. The work factor of
* the algorithm is parameterised, so it can be increased as
* computers get faster.
* <p>
* Usage is really simple. To hash a password for the first time,
* call the hashpw method with a random salt, like this:
* <p>
* <code>
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); <br />
* </code>
* <p>
* To check whether a plaintext password matches one that has been
* hashed previously, use the checkpw method:
* <p>
* <code>
* if (BCrypt.checkpw(candidate_password, stored_hash))<br />
* System.out.println("It matches");<br />
* else<br />
* System.out.println("It does not match");<br />
* </code>
* <p>
* The gensalt() method takes an optional parameter (log_rounds)
* that determines the computational complexity of the hashing:
* <p>
* <code>
* String strong_salt = BCrypt.gensalt(10)<br />
* String stronger_salt = BCrypt.gensalt(12)<br />
* </code>
* <p>
* The amount of work increases exponentially (2**log_rounds), so
* each increment is twice as much work. The default log_rounds is
* 10, and the valid range is 4 to 31.
*
* @author Damien Miller
* @version 0.3
*/
public
class
BCrypt
{
// BCrypt parameters
private
static
final
int
GENSALT_DEFAULT_LOG2_ROUNDS
=
10
;
private
static
final
int
BCRYPT_SALT_LEN
=
16
;
// Blowfish parameters
private
static
final
int
BLOWFISH_NUM_ROUNDS
=
16
;
// Initial contents of key schedule
private
static
final
int
P_orig
[]
=
{
0x243f6a88
,
0x85a308d3
,
0x13198a2e
,
0x03707344
,
0xa4093822
,
0x299f31d0
,
0x082efa98
,
0xec4e6c89
,
0x452821e6
,
0x38d01377
,
0xbe5466cf
,
0x34e90c6c
,
0xc0ac29b7
,
0xc97c50dd
,
0x3f84d5b5
,
0xb5470917
,
0x9216d5d9
,
0x8979fb1b
};
private
static
final
int
S_orig
[]
=
{
0xd1310ba6
,
0x98dfb5ac
,
0x2ffd72db
,
0xd01adfb7
,
0xb8e1afed
,
0x6a267e96
,
0xba7c9045
,
0xf12c7f99
,
0x24a19947
,
0xb3916cf7
,
0x0801f2e2
,
0x858efc16
,
0x636920d8
,
0x71574e69
,
0xa458fea3
,
0xf4933d7e
,
0x0d95748f
,
0x728eb658
,
0x718bcd58
,
0x82154aee
,
0x7b54a41d
,
0xc25a59b5
,
0x9c30d539
,
0x2af26013
,
0xc5d1b023
,
0x286085f0
,
0xca417918
,
0xb8db38ef
,
0x8e79dcb0
,
0x603a180e
,
0x6c9e0e8b
,
0xb01e8a3e
,
0xd71577c1
,
0xbd314b27
,
0x78af2fda
,
0x55605c60
,
0xe65525f3
,
0xaa55ab94
,
0x57489862
,
0x63e81440
,
0x55ca396a
,
0x2aab10b6
,
0xb4cc5c34
,
0x1141e8ce
,
0xa15486af
,
0x7c72e993
,
0xb3ee1411
,
0x636fbc2a
,
0x2ba9c55d
,
0x741831f6
,
0xce5c3e16
,
0x9b87931e
,
0xafd6ba33
,
0x6c24cf5c
,
0x7a325381
,
0x28958677
,
0x3b8f4898
,
0x6b4bb9af
,
0xc4bfe81b
,
0x66282193
,
0x61d809cc
,
0xfb21a991
,
0x487cac60
,
0x5dec8032
,
0xef845d5d
,
0xe98575b1
,
0xdc262302
,
0xeb651b88
,
0x23893e81
,
0xd396acc5
,
0x0f6d6ff3
,
0x83f44239
,
0x2e0b4482
,
0xa4842004
,
0x69c8f04a
,
0x9e1f9b5e
,
0x21c66842
,
0xf6e96c9a
,
0x670c9c61
,
0xabd388f0
,
0x6a51a0d2
,
0xd8542f68
,
0x960fa728
,
0xab5133a3
,
0x6eef0b6c
,
0x137a3be4
,
0xba3bf050
,
0x7efb2a98
,
0xa1f1651d
,
0x39af0176
,
0x66ca593e
,
0x82430e88
,
0x8cee8619
,
0x456f9fb4
,
0x7d84a5c3
,
0x3b8b5ebe
,
0xe06f75d8
,
0x85c12073
,
0x401a449f
,
0x56c16aa6
,
0x4ed3aa62
,
0x363f7706
,
0x1bfedf72
,
0x429b023d
,
0x37d0d724
,
0xd00a1248
,
0xdb0fead3
,
0x49f1c09b
,
0x075372c9
,
0x80991b7b
,
0x25d479d8
,
0xf6e8def7
,
0xe3fe501a
,
0xb6794c3b
,
0x976ce0bd
,
0x04c006ba
,
0xc1a94fb6
,
0x409f60c4
,
0x5e5c9ec2
,
0x196a2463
,
0x68fb6faf
,
0x3e6c53b5
,
0x1339b2eb
,
0x3b52ec6f
,
0x6dfc511f
,
0x9b30952c
,
0xcc814544
,
0xaf5ebd09
,
0xbee3d004
,
0xde334afd
,
0x660f2807
,
0x192e4bb3
,
0xc0cba857
,
0x45c8740f
,
0xd20b5f39
,
0xb9d3fbdb
,
0x5579c0bd
,
0x1a60320a
,
0xd6a100c6
,
0x402c7279
,
0x679f25fe
,
0xfb1fa3cc
,
0x8ea5e9f8
,
0xdb3222f8
,
0x3c7516df
,
0xfd616b15
,
0x2f501ec8
,
0xad0552ab
,
0x323db5fa
,
0xfd238760
,
0x53317b48
,
0x3e00df82
,
0x9e5c57bb
,
0xca6f8ca0
,
0x1a87562e
,
0xdf1769db
,
0xd542a8f6
,
0x287effc3
,
0xac6732c6
,
0x8c4f5573
,
0x695b27b0
,
0xbbca58c8
,
0xe1ffa35d
,
0xb8f011a0
,
0x10fa3d98
,
0xfd2183b8
,
0x4afcb56c
,
0x2dd1d35b
,
0x9a53e479
,
0xb6f84565
,
0xd28e49bc
,
0x4bfb9790
,
0xe1ddf2da
,
0xa4cb7e33
,
0x62fb1341
,
0xcee4c6e8
,
0xef20cada
,
0x36774c01
,
0xd07e9efe
,
0x2bf11fb4
,
0x95dbda4d
,
0xae909198
,
0xeaad8e71
,
0x6b93d5a0
,
0xd08ed1d0
,
0xafc725e0
,
0x8e3c5b2f
,
0x8e7594b7
,
0x8ff6e2fb
,
0xf2122b64
,
0x8888b812
,
0x900df01c
,
0x4fad5ea0
,
0x688fc31c
,
0xd1cff191
,
0xb3a8c1ad
,
0x2f2f2218
,
0xbe0e1777
,
0xea752dfe
,
0x8b021fa1
,
0xe5a0cc0f
,
0xb56f74e8
,
0x18acf3d6
,
0xce89e299
,
0xb4a84fe0
,
0xfd13e0b7
,
0x7cc43b81
,
0xd2ada8d9
,
0x165fa266
,
0x80957705
,
0x93cc7314
,
0x211a1477
,
0xe6ad2065
,
0x77b5fa86
,
0xc75442f5
,
0xfb9d35cf
,
0xebcdaf0c
,
0x7b3e89a0
,
0xd6411bd3
,
0xae1e7e49
,
0x00250e2d
,
0x2071b35e
,
0x226800bb
,
0x57b8e0af
,
0x2464369b
,
0xf009b91e
,
0x5563911d
,
0x59dfa6aa
,
0x78c14389
,
0xd95a537f
,
0x207d5ba2
,
0x02e5b9c5
,
0x83260376
,
0x6295cfa9
,
0x11c81968
,
0x4e734a41
,
0xb3472dca
,
0x7b14a94a
,
0x1b510052
,
0x9a532915
,
0xd60f573f
,
0xbc9bc6e4
,
0x2b60a476
,
0x81e67400
,
0x08ba6fb5
,
0x571be91f
,
0xf296ec6b
,
0x2a0dd915
,
0xb6636521
,
0xe7b9f9b6
,
0xff34052e
,
0xc5855664
,
0x53b02d5d
,
0xa99f8fa1
,
0x08ba4799
,
0x6e85076a
,
0x4b7a70e9
,
0xb5b32944
,
0xdb75092e
,
0xc4192623
,
0xad6ea6b0
,
0x49a7df7d
,
0x9cee60b8
,
0x8fedb266
,
0xecaa8c71
,
0x699a17ff
,
0x5664526c
,
0xc2b19ee1
,
0x193602a5
,
0x75094c29
,
0xa0591340
,
0xe4183a3e
,
0x3f54989a
,
0x5b429d65
,
0x6b8fe4d6
,
0x99f73fd6
,
0xa1d29c07
,
0xefe830f5
,
0x4d2d38e6
,
0xf0255dc1
,
0x4cdd2086
,
0x8470eb26
,
0x6382e9c6
,
0x021ecc5e
,
0x09686b3f
,
0x3ebaefc9
,
0x3c971814
,
0x6b6a70a1
,
0x687f3584
,
0x52a0e286
,
0xb79c5305
,
0xaa500737
,
0x3e07841c
,
0x7fdeae5c
,
0x8e7d44ec
,
0x5716f2b8
,
0xb03ada37
,
0xf0500c0d
,
0xf01c1f04
,
0x0200b3ff
,
0xae0cf51a
,
0x3cb574b2
,
0x25837a58
,
0xdc0921bd
,
0xd19113f9
,
0x7ca92ff6
,
0x94324773
,
0x22f54701
,
0x3ae5e581
,
0x37c2dadc
,
0xc8b57634
,
0x9af3dda7
,
0xa9446146
,
0x0fd0030e
,
0xecc8c73e
,
0xa4751e41
,
0xe238cd99
,
0x3bea0e2f
,
0x3280bba1
,
0x183eb331
,
0x4e548b38
,
0x4f6db908
,
0x6f420d03
,
0xf60a04bf
,
0x2cb81290
,
0x24977c79
,
0x5679b072
,
0xbcaf89af
,
0xde9a771f
,
0xd9930810
,
0xb38bae12
,
0xdccf3f2e
,
0x5512721f
,
0x2e6b7124
,
0x501adde6
,
0x9f84cd87
,
0x7a584718
,
0x7408da17
,
0xbc9f9abc
,
0xe94b7d8c
,
0xec7aec3a
,
0xdb851dfa
,
0x63094366
,
0xc464c3d2
,
0xef1c1847
,
0x3215d908
,
0xdd433b37
,
0x24c2ba16
,
0x12a14d43
,
0x2a65c451
,
0x50940002
,
0x133ae4dd
,
0x71dff89e
,
0x10314e55
,
0x81ac77d6
,
0x5f11199b
,
0x043556f1
,
0xd7a3c76b
,
0x3c11183b
,
0x5924a509
,
0xf28fe6ed
,
0x97f1fbfa
,
0x9ebabf2c
,
0x1e153c6e
,
0x86e34570
,
0xeae96fb1
,
0x860e5e0a
,
0x5a3e2ab3
,
0x771fe71c
,
0x4e3d06fa
,
0x2965dcb9
,
0x99e71d0f
,
0x803e89d6
,
0x5266c825
,
0x2e4cc978
,
0x9c10b36a
,
0xc6150eba
,
0x94e2ea78
,
0xa5fc3c53
,
0x1e0a2df4
,
0xf2f74ea7
,
0x361d2b3d
,
0x1939260f
,
0x19c27960
,
0x5223a708
,
0xf71312b6
,
0xebadfe6e
,
0xeac31f66
,
0xe3bc4595
,
0xa67bc883
,
0xb17f37d1
,
0x018cff28
,
0xc332ddef
,
0xbe6c5aa5
,
0x65582185
,
0x68ab9802
,
0xeecea50f
,
0xdb2f953b
,
0x2aef7dad
,
0x5b6e2f84
,
0x1521b628
,
0x29076170
,
0xecdd4775
,
0x619f1510
,
0x13cca830
,
0xeb61bd96
,
0x0334fe1e
,
0xaa0363cf
,
0xb5735c90
,
0x4c70a239
,
0xd59e9e0b
,
0xcbaade14
,
0xeecc86bc
,
0x60622ca7
,
0x9cab5cab
,
0xb2f3846e
,
0x648b1eaf
,
0x19bdf0ca
,
0xa02369b9
,
0x655abb50
,
0x40685a32
,
0x3c2ab4b3
,
0x319ee9d5
,
0xc021b8f7
,
0x9b540b19
,
0x875fa099
,
0x95f7997e
,
0x623d7da8
,
0xf837889a
,
0x97e32d77
,
0x11ed935f
,
0x16681281
,
0x0e358829
,
0xc7e61fd6
,
0x96dedfa1
,
0x7858ba99
,
0x57f584a5
,
0x1b227263
,
0x9b83c3ff
,
0x1ac24696
,
0xcdb30aeb
,
0x532e3054
,
0x8fd948e4
,
0x6dbc3128
,
0x58ebf2ef
,
0x34c6ffea
,
0xfe28ed61
,
0xee7c3c73
,
0x5d4a14d9
,
0xe864b7e3
,
0x42105d14
,
0x203e13e0
,
0x45eee2b6
,
0xa3aaabea
,
0xdb6c4f15
,
0xfacb4fd0
,
0xc742f442
,
0xef6abbb5
,
0x654f3b1d
,
0x41cd2105
,
0xd81e799e
,
0x86854dc7
,
0xe44b476a
,
0x3d816250
,
0xcf62a1f2
,
0x5b8d2646
,
0xfc8883a0
,
0xc1c7b6a3
,
0x7f1524c3
,
0x69cb7492
,
0x47848a0b
,
0x5692b285
,
0x095bbf00
,
0xad19489d
,
0x1462b174
,
0x23820e00
,
0x58428d2a
,
0x0c55f5ea
,
0x1dadf43e
,
0x233f7061
,
0x3372f092
,
0x8d937e41
,
0xd65fecf1
,
0x6c223bdb
,
0x7cde3759
,
0xcbee7460
,
0x4085f2a7
,
0xce77326e
,
0xa6078084
,
0x19f8509e
,
0xe8efd855
,
0x61d99735
,
0xa969a7aa
,
0xc50c06c2
,
0x5a04abfc
,
0x800bcadc
,
0x9e447a2e
,
0xc3453484
,
0xfdd56705
,
0x0e1e9ec9
,
0xdb73dbd3
,
0x105588cd
,
0x675fda79
,
0xe3674340
,
0xc5c43465
,
0x713e38d8
,
0x3d28f89e
,
0xf16dff20
,
0x153e21e7
,
0x8fb03d4a
,
0xe6e39f2b
,
0xdb83adf7
,
0xe93d5a68
,
0x948140f7
,
0xf64c261c
,
0x94692934
,
0x411520f7
,
0x7602d4f7
,
0xbcf46b2e
,
0xd4a20068
,
0xd4082471
,
0x3320f46a
,
0x43b7d4b7
,
0x500061af
,
0x1e39f62e
,
0x97244546
,
0x14214f74
,
0xbf8b8840
,
0x4d95fc1d
,
0x96b591af
,
0x70f4ddd3
,
0x66a02f45
,
0xbfbc09ec
,
0x03bd9785
,
0x7fac6dd0
,
0x31cb8504
,
0x96eb27b3
,
0x55fd3941
,
0xda2547e6
,
0xabca0a9a
,
0x28507825
,
0x530429f4
,
0x0a2c86da
,
0xe9b66dfb
,
0x68dc1462
,
0xd7486900
,
0x680ec0a4
,
0x27a18dee
,
0x4f3ffea2
,
0xe887ad8c
,
0xb58ce006
,
0x7af4d6b6
,
0xaace1e7c
,
0xd3375fec
,
0xce78a399
,
0x406b2a42
,
0x20fe9e35
,
0xd9f385b9
,
0xee39d7ab
,
0x3b124e8b
,
0x1dc9faf7
,
0x4b6d1856
,
0x26a36631
,
0xeae397b2
,
0x3a6efa74
,
0xdd5b4332
,
0x6841e7f7
,
0xca7820fb
,
0xfb0af54e
,
0xd8feb397
,
0x454056ac
,
0xba489527
,
0x55533a3a
,
0x20838d87
,
0xfe6ba9b7
,
0xd096954b
,
0x55a867bc
,
0xa1159a58
,
0xcca92963
,
0x99e1db33
,
0xa62a4a56
,
0x3f3125f9
,
0x5ef47e1c
,
0x9029317c
,
0xfdf8e802
,
0x04272f70
,
0x80bb155c
,
0x05282ce3
,
0x95c11548
,
0xe4c66d22
,
0x48c1133f
,
0xc70f86dc
,
0x07f9c9ee
,
0x41041f0f
,
0x404779a4
,
0x5d886e17
,
0x325f51eb
,
0xd59bc0d1
,
0xf2bcc18f
,
0x41113564
,
0x257b7834
,
0x602a9c60
,
0xdff8e8a3
,
0x1f636c1b
,
0x0e12b4c2
,
0x02e1329e
,
0xaf664fd1
,
0xcad18115
,
0x6b2395e0
,
0x333e92e1
,
0x3b240b62
,
0xeebeb922
,
0x85b2a20e
,
0xe6ba0d99
,
0xde720c8c
,
0x2da2f728
,
0xd0127845
,
0x95b794fd
,
0x647d0862
,
0xe7ccf5f0
,
0x5449a36f
,
0x877d48fa
,
0xc39dfd27
,
0xf33e8d1e
,
0x0a476341
,
0x992eff74
,
0x3a6f6eab
,
0xf4f8fd37
,
0xa812dc60
,
0xa1ebddf8
,
0x991be14c
,
0xdb6e6b0d
,
0xc67b5510
,
0x6d672c37
,
0x2765d43b
,
0xdcd0e804
,
0xf1290dc7
,
0xcc00ffa3
,
0xb5390f92
,
0x690fed0b
,
0x667b9ffb
,
0xcedb7d9c
,
0xa091cf0b
,
0xd9155ea3
,
0xbb132f88
,
0x515bad24
,
0x7b9479bf
,
0x763bd6eb
,
0x37392eb3
,
0xcc115979
,
0x8026e297
,
0xf42e312d
,
0x6842ada7
,
0xc66a2b3b
,
0x12754ccc
,
0x782ef11c
,
0x6a124237
,
0xb79251e7
,
0x06a1bbe6
,
0x4bfb6350
,
0x1a6b1018
,
0x11caedfa
,
0x3d25bdd8
,
0xe2e1c3c9
,
0x44421659
,
0x0a121386
,
0xd90cec6e
,
0xd5abea2a
,
0x64af674e
,
0xda86a85f
,
0xbebfe988
,
0x64e4c3fe
,
0x9dbc8057
,
0xf0f7c086
,
0x60787bf8
,
0x6003604d
,
0xd1fd8346
,
0xf6381fb0
,
0x7745ae04
,
0xd736fccc
,
0x83426b33
,
0xf01eab71
,
0xb0804187
,
0x3c005e5f
,
0x77a057be
,
0xbde8ae24
,
0x55464299
,
0xbf582e61
,
0x4e58f48f
,
0xf2ddfda2
,
0xf474ef38
,
0x8789bdc2
,
0x5366f9c3
,
0xc8b38e74
,
0xb475f255
,
0x46fcd9b9
,
0x7aeb2661
,
0x8b1ddf84
,
0x846a0e79
,
0x915f95e2
,
0x466e598e
,
0x20b45770
,
0x8cd55591
,
0xc902de4c
,
0xb90bace1
,
0xbb8205d0
,
0x11a86248
,
0x7574a99e
,
0xb77f19b6
,
0xe0a9dc09
,
0x662d09a1
,
0xc4324633
,
0xe85a1f02
,
0x09f0be8c
,
0x4a99a025
,
0x1d6efe10
,
0x1ab93d1d
,
0x0ba5a4df
,
0xa186f20f
,
0x2868f169
,
0xdcb7da83
,
0x573906fe
,
0xa1e2ce9b
,
0x4fcd7f52
,
0x50115e01
,
0xa70683fa
,
0xa002b5c4
,
0x0de6d027
,
0x9af88c27
,
0x773f8641
,
0xc3604c06
,
0x61a806b5
,
0xf0177a28
,
0xc0f586e0
,
0x006058aa
,
0x30dc7d62
,
0x11e69ed7
,
0x2338ea63
,
0x53c2dd94
,
0xc2c21634
,
0xbbcbee56
,
0x90bcb6de
,
0xebfc7da1
,
0xce591d76
,
0x6f05e409
,
0x4b7c0188
,
0x39720a3d
,
0x7c927c24
,
0x86e3725f
,
0x724d9db9
,
0x1ac15bb4
,
0xd39eb8fc
,
0xed545578
,
0x08fca5b5
,
0xd83d7cd3
,
0x4dad0fc4
,
0x1e50ef5e
,
0xb161e6f8
,
0xa28514d9
,
0x6c51133c
,
0x6fd5c7e7
,
0x56e14ec4
,
0x362abfce
,
0xddc6c837
,
0xd79a3234
,
0x92638212
,
0x670efa8e
,
0x406000e0
,
0x3a39ce37
,
0xd3faf5cf
,
0xabc27737
,
0x5ac52d1b
,
0x5cb0679e
,
0x4fa33742
,
0xd3822740
,
0x99bc9bbe
,
0xd5118e9d
,
0xbf0f7315
,
0xd62d1c7e
,
0xc700c47b
,
0xb78c1b6b
,
0x21a19045
,
0xb26eb1be
,
0x6a366eb4
,
0x5748ab2f
,
0xbc946e79
,
0xc6a376d2
,
0x6549c2c8
,
0x530ff8ee
,
0x468dde7d
,
0xd5730a1d
,
0x4cd04dc6
,
0x2939bbdb
,
0xa9ba4650
,
0xac9526e8
,
0xbe5ee304
,
0xa1fad5f0
,
0x6a2d519a
,
0x63ef8ce2
,
0x9a86ee22
,
0xc089c2b8
,
0x43242ef6
,
0xa51e03aa
,
0x9cf2d0a4
,
0x83c061ba
,
0x9be96a4d
,
0x8fe51550
,
0xba645bd6
,
0x2826a2f9
,
0xa73a3ae1
,
0x4ba99586
,
0xef5562e9
,
0xc72fefd3
,
0xf752f7da
,
0x3f046f69
,
0x77fa0a59
,
0x80e4a915
,
0x87b08601
,
0x9b09e6ad
,
0x3b3ee593
,
0xe990fd5a
,
0x9e34d797
,
0x2cf0b7d9
,
0x022b8b51
,
0x96d5ac3a
,
0x017da67d
,
0xd1cf3ed6
,
0x7c7d2d28
,
0x1f9f25cf
,
0xadf2b89b
,
0x5ad6b472
,
0x5a88f54c
,
0xe029ac71
,
0xe019a5e6
,
0x47b0acfd
,
0xed93fa9b
,
0xe8d3c48d
,
0x283b57cc
,
0xf8d56629
,
0x79132e28
,
0x785f0191
,
0xed756055
,
0xf7960e44
,
0xe3d35e8c
,
0x15056dd4
,
0x88f46dba
,
0x03a16125
,
0x0564f0bd
,
0xc3eb9e15
,
0x3c9057a2
,
0x97271aec
,
0xa93a072a
,
0x1b3f6d9b
,
0x1e6321f5
,
0xf59c66fb
,
0x26dcf319
,
0x7533d928
,
0xb155fdf5
,
0x03563482
,
0x8aba3cbb
,
0x28517711
,
0xc20ad9f8
,
0xabcc5167
,
0xccad925f
,
0x4de81751
,
0x3830dc8e
,
0x379d5862
,
0x9320f991
,
0xea7a90c2
,
0xfb3e7bce
,
0x5121ce64
,
0x774fbe32
,
0xa8b6e37e
,
0xc3293d46
,
0x48de5369
,
0x6413e680
,
0xa2ae0810
,
0xdd6db224
,
0x69852dfd
,
0x09072166
,
0xb39a460a
,
0x6445c0dd
,
0x586cdecf
,
0x1c20c8ae
,
0x5bbef7dd
,
0x1b588d40
,
0xccd2017f
,
0x6bb4e3bb
,
0xdda26a7e
,
0x3a59ff45
,
0x3e350a44
,
0xbcb4cdd5
,
0x72eacea8
,
0xfa6484bb
,
0x8d6612ae
,
0xbf3c6f47
,
0xd29be463
,
0x542f5d9e
,
0xaec2771b
,
0xf64e6370
,
0x740e0d8d
,
0xe75b1357
,
0xf8721671
,
0xaf537d5d
,
0x4040cb08
,
0x4eb4e2cc
,
0x34d2466a
,
0x0115af84
,
0xe1b00428
,
0x95983a1d
,
0x06b89fb4
,
0xce6ea048
,
0x6f3f3b82
,
0x3520ab82
,
0x011a1d4b
,
0x277227f8
,
0x611560b1
,
0xe7933fdc
,
0xbb3a792b
,
0x344525bd
,
0xa08839e1
,
0x51ce794b
,
0x2f32c9b7
,
0xa01fbac9
,
0xe01cc87e
,
0xbcc7d1f6
,
0xcf0111c3
,
0xa1e8aac7
,
0x1a908749
,
0xd44fbd9a
,
0xd0dadecb
,
0xd50ada38
,
0x0339c32a
,
0xc6913667
,
0x8df9317c
,
0xe0b12b4f
,
0xf79e59b7
,
0x43f5bb3a
,
0xf2d519ff
,
0x27d9459c
,
0xbf97222c
,
0x15e6fc2a
,
0x0f91fc71
,
0x9b941525
,
0xfae59361
,
0xceb69ceb
,
0xc2a86459
,
0x12baa8d1
,
0xb6c1075e
,
0xe3056a0c
,
0x10d25065
,
0xcb03a442
,
0xe0ec6e0e
,
0x1698db3b
,
0x4c98a0be
,
0x3278e964
,
0x9f1f9532
,
0xe0d392df
,
0xd3a0342b
,
0x8971f21e
,
0x1b0a7441
,
0x4ba3348c
,
0xc5be7120
,
0xc37632d8
,
0xdf359f8d
,
0x9b992f2e
,
0xe60b6f47
,
0x0fe3f11d
,
0xe54cda54
,
0x1edad891
,
0xce6279cf
,
0xcd3e7e6f
,
0x1618b166
,
0xfd2c1d05
,
0x848fd2c5
,
0xf6fb2299
,
0xf523f357
,
0xa6327623
,
0x93a83531
,
0x56cccd02
,
0xacf08162
,
0x5a75ebb5
,
0x6e163697
,
0x88d273cc
,
0xde966292
,
0x81b949d0
,
0x4c50901b
,
0x71c65614
,
0xe6c6c7bd
,
0x327a140a
,
0x45e1d006
,
0xc3f27b9a
,
0xc9aa53fd
,
0x62a80f00
,
0xbb25bfe2
,
0x35bdd2f6
,
0x71126905
,
0xb2040222
,
0xb6cbcf7c
,
0xcd769c2b
,
0x53113ec0
,
0x1640e3d3
,
0x38abbd60
,
0x2547adf0
,
0xba38209c
,
0xf746ce76
,
0x77afa1c5
,
0x20756060
,
0x85cbfe4e
,
0x8ae88dd8
,
0x7aaaf9b0
,
0x4cf9aa7e
,
0x1948c25c
,
0x02fb8a8c
,
0x01c36ae4
,
0xd6ebe1f9
,
0x90d4f869
,
0xa65cdea0
,
0x3f09252d
,
0xc208e69f
,
0xb74e6132
,
0xce77e25b
,
0x578fdfe3
,
0x3ac372e6
};
// bcrypt IV: "OrpheanBeholderScryDoubt"
static
private
final
int
bf_crypt_ciphertext
[]
=
{
0x4f727068
,
0x65616e42
,
0x65686f6c
,
0x64657253
,
0x63727944
,
0x6f756274
};
// Table for Base64 encoding
static
private
final
char
base64_code
[]
=
{
'.'
,
'/'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
,
'g'
,
'h'
,
'i'
,
'j'
,
'k'
,
'l'
,
'm'
,
'n'
,
'o'
,
'p'
,
'q'
,
'r'
,
's'
,
't'
,
'u'
,
'v'
,
'w'
,
'x'
,
'y'
,
'z'
,
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
};
// Table for Base64 decoding
static
private
final
byte
index_64
[]
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
0
,
1
,
54
,
55
,
56
,
57
,
58
,
59
,
60
,
61
,
62
,
63
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
17
,
18
,
19
,
20
,
21
,
22
,
23
,
24
,
25
,
26
,
27
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
28
,
29
,
30
,
31
,
32
,
33
,
34
,
35
,
36
,
37
,
38
,
39
,
40
,
41
,
42
,
43
,
44
,
45
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
53
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
};
static
final
int
MIN_LOG_ROUNDS
=
4
;
static
final
int
MAX_LOG_ROUNDS
=
31
;
// Expanded Blowfish key
private
int
P
[];
private
int
S
[];
/**
* Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note
* that this is <strong>not</strong> compatible with the standard MIME-base64
* encoding.
*
* @param d the byte array to encode
* @param len the number of bytes to encode
* @param rs the destination buffer for the base64-encoded string
* @exception IllegalArgumentException if the length is invalid
*/
static
void
encode_base64
(
byte
d
[],
int
len
,
StringBuilder
rs
)
throws
IllegalArgumentException
{
int
off
=
0
;
int
c1
,
c2
;
if
(
len
<=
0
||
len
>
d
.
length
)
{
throw
new
IllegalArgumentException
(
"Invalid len"
);
}
while
(
off
<
len
)
{
c1
=
d
[
off
++]
&
0xff
;
rs
.
append
(
base64_code
[(
c1
>>
2
)
&
0x3f
]);
c1
=
(
c1
&
0x03
)
<<
4
;
if
(
off
>=
len
)
{
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
break
;
}
c2
=
d
[
off
++]
&
0xff
;
c1
|=
(
c2
>>
4
)
&
0x0f
;
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
c1
=
(
c2
&
0x0f
)
<<
2
;
if
(
off
>=
len
)
{
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
break
;
}
c2
=
d
[
off
++]
&
0xff
;
c1
|=
(
c2
>>
6
)
&
0x03
;
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
rs
.
append
(
base64_code
[
c2
&
0x3f
]);
}
}
/**
* Look up the 3 bits base64-encoded by the specified character,
* range-checking againt conversion table
* @param x the base64-encoded value
* @return the decoded value of x
*/
private
static
byte
char64
(
char
x
)
{
if
((
int
)
x
<
0
||
(
int
)
x
>=
index_64
.
length
)
return
-
1
;
return
index_64
[(
int
)
x
];
}
/**
* Decode a string encoded using bcrypt's base64 scheme to a
* byte array. Note that this is *not* compatible with
* the standard MIME-base64 encoding.
* @param s the string to decode
* @param maxolen the maximum number of bytes to decode
* @return an array containing the decoded bytes
* @throws IllegalArgumentException if maxolen is invalid
*/
static
byte
[]
decode_base64
(
String
s
,
int
maxolen
)
throws
IllegalArgumentException
{
StringBuilder
rs
=
new
StringBuilder
();
int
off
=
0
,
slen
=
s
.
length
(),
olen
=
0
;
byte
ret
[];
byte
c1
,
c2
,
c3
,
c4
,
o
;
if
(
maxolen
<=
0
)
throw
new
IllegalArgumentException
(
"Invalid maxolen"
);
while
(
off
<
slen
-
1
&&
olen
<
maxolen
)
{
c1
=
char64
(
s
.
charAt
(
off
++));
c2
=
char64
(
s
.
charAt
(
off
++));
if
(
c1
==
-
1
||
c2
==
-
1
)
break
;
o
=
(
byte
)
(
c1
<<
2
);
o
|=
(
c2
&
0x30
)
>>
4
;
rs
.
append
((
char
)
o
);
if
(++
olen
>=
maxolen
||
off
>=
slen
)
break
;
c3
=
char64
(
s
.
charAt
(
off
++));
if
(
c3
==
-
1
)
break
;
o
=
(
byte
)
((
c2
&
0x0f
)
<<
4
);
o
|=
(
c3
&
0x3c
)
>>
2
;
rs
.
append
((
char
)
o
);
if
(++
olen
>=
maxolen
||
off
>=
slen
)
break
;
c4
=
char64
(
s
.
charAt
(
off
++));
o
=
(
byte
)
((
c3
&
0x03
)
<<
6
);
o
|=
c4
;
rs
.
append
((
char
)
o
);
++
olen
;
}
ret
=
new
byte
[
olen
];
for
(
off
=
0
;
off
<
olen
;
off
++)
ret
[
off
]
=
(
byte
)
rs
.
charAt
(
off
);
return
ret
;
}
/**
* Blowfish encipher a single 64-bit block encoded as
* two 32-bit halves
* @param lr an array containing the two 32-bit half blocks
* @param off the position in the array of the blocks
*/
private
void
encipher
(
int
lr
[],
int
off
)
{
int
i
,
n
,
l
=
lr
[
off
],
r
=
lr
[
off
+
1
];
l
^=
P
[
0
];
for
(
i
=
0
;
i
<=
BLOWFISH_NUM_ROUNDS
-
2
;)
{
// Feistel substitution on left word
n
=
S
[(
l
>>
24
)
&
0xff
];
n
+=
S
[
0x100
|
((
l
>>
16
)
&
0xff
)];
n
^=
S
[
0x200
|
((
l
>>
8
)
&
0xff
)];
n
+=
S
[
0x300
|
(
l
&
0xff
)];
r
^=
n
^
P
[++
i
];
// Feistel substitution on right word
n
=
S
[(
r
>>
24
)
&
0xff
];
n
+=
S
[
0x100
|
((
r
>>
16
)
&
0xff
)];
n
^=
S
[
0x200
|
((
r
>>
8
)
&
0xff
)];
n
+=
S
[
0x300
|
(
r
&
0xff
)];
l
^=
n
^
P
[++
i
];
}
lr
[
off
]
=
r
^
P
[
BLOWFISH_NUM_ROUNDS
+
1
];
lr
[
off
+
1
]
=
l
;
}
/**
* Cycically extract a word of key material
* @param data the string to extract the data from
* @param offp a "pointer" (as a one-entry array) to the
* current offset into data
* @param signp a "pointer" (as a one-entry array) to the
* cumulative flag for non-benign sign extension
* @return correct and buggy next word of material from data as int[2]
*/
private
static
int
[]
streamtowords
(
byte
data
[],
int
offp
[],
int
signp
[])
{
int
i
;
int
words
[]
=
{
0
,
0
};
int
off
=
offp
[
0
];
int
sign
=
signp
[
0
];
for
(
i
=
0
;
i
<
4
;
i
++)
{
words
[
0
]
=
(
words
[
0
]
<<
8
)
|
(
data
[
off
]
&
0xff
);
words
[
1
]
=
(
words
[
1
]
<<
8
)
|
(
int
)
data
[
off
];
// sign extension bug
if
(
i
>
0
)
sign
|=
words
[
1
]
&
0x80
;
off
=
(
off
+
1
)
%
data
.
length
;
}
offp
[
0
]
=
off
;
signp
[
0
]
=
sign
;
return
words
;
}
/**
* Cycically extract a word of key material
* @param data the string to extract the data from
* @param offp a "pointer" (as a one-entry array) to the
* current offset into data
* @return the next word of material from data
*/
private
static
int
streamtoword
(
byte
data
[],
int
offp
[])
{
int
signp
[]
=
{
0
};
return
streamtowords
(
data
,
offp
,
signp
)[
0
];
}
/**
* Cycically extract a word of key material, with sign-extension bug
* @param data the string to extract the data from
* @param offp a "pointer" (as a one-entry array) to the
* current offset into data
* @return the next word of material from data
*/
private
static
int
streamtoword_bug
(
byte
data
[],
int
offp
[])
{
int
signp
[]
=
{
0
};
return
streamtowords
(
data
,
offp
,
signp
)[
1
];
}
/**
* Initialise the Blowfish key schedule
*/
private
void
init_key
()
{
P
=
P_orig
.
clone
();
S
=
S_orig
.
clone
();
}
/**
* Key the Blowfish cipher
* @param key an array containing the key
* @param sign_ext_bug true to implement the 2x bug
* @param safety bit 16 is set when the safety measure is requested
*/
private
void
key
(
byte
key
[],
boolean
sign_ext_bug
,
int
safety
)
{
int
i
;
int
koffp
[]
=
{
0
};
int
lr
[]
=
{
0
,
0
};
int
plen
=
P
.
length
,
slen
=
S
.
length
;
for
(
i
=
0
;
i
<
plen
;
i
++)
if
(!
sign_ext_bug
)
P
[
i
]
=
P
[
i
]
^
streamtoword
(
key
,
koffp
);
else
P
[
i
]
=
P
[
i
]
^
streamtoword_bug
(
key
,
koffp
);
for
(
i
=
0
;
i
<
plen
;
i
+=
2
)
{
encipher
(
lr
,
0
);
P
[
i
]
=
lr
[
0
];
P
[
i
+
1
]
=
lr
[
1
];
}
for
(
i
=
0
;
i
<
slen
;
i
+=
2
)
{
encipher
(
lr
,
0
);
S
[
i
]
=
lr
[
0
];
S
[
i
+
1
]
=
lr
[
1
];
}
}
/**
* Perform the "enhanced key schedule" step described by
* Provos and Mazieres in "A Future-Adaptable Password Scheme"
* https://www.openbsd.org/papers/bcrypt-paper.ps
* @param data salt information
* @param key password information
* @param sign_ext_bug true to implement the 2x bug
* @param safety bit 16 is set when the safety measure is requested
*/
private
void
ekskey
(
byte
data
[],
byte
key
[],
boolean
sign_ext_bug
,
int
safety
)
{
int
i
;
int
koffp
[]
=
{
0
},
doffp
[]
=
{
0
};
int
lr
[]
=
{
0
,
0
};
int
plen
=
P
.
length
,
slen
=
S
.
length
;
int
signp
[]
=
{
0
};
// non-benign sign-extension flag
int
diff
=
0
;
// zero iff correct and buggy are same
for
(
i
=
0
;
i
<
plen
;
i
++)
{
int
words
[]
=
streamtowords
(
key
,
koffp
,
signp
);
diff
|=
words
[
0
]
^
words
[
1
];
P
[
i
]
=
P
[
i
]
^
words
[
sign_ext_bug
?
1
:
0
];
}
int
sign
=
signp
[
0
];
/*
* At this point, "diff" is zero iff the correct and buggy algorithms produced
* exactly the same result. If so and if "sign" is non-zero, which indicates
* that there was a non-benign sign extension, this means that we have a
* collision between the correctly computed hash for this password and a set of
* passwords that could be supplied to the buggy algorithm. Our safety measure
* is meant to protect from such many-buggy to one-correct collisions, by
* deviating from the correct algorithm in such cases. Let's check for this.
*/
diff
|=
diff
>>
16
;
/* still zero iff exact match */
diff
&=
0xffff
;
/* ditto */
diff
+=
0xffff
;
/* bit 16 set iff "diff" was non-zero (on non-match) */
sign
<<=
9
;
/* move the non-benign sign extension flag to bit 16 */
sign
&=
~
diff
&
safety
;
/* action needed? */
/*
* If we have determined that we need to deviate from the correct algorithm,
* flip bit 16 in initial expanded key. (The choice of 16 is arbitrary, but
* let's stick to it now. It came out of the approach we used above, and it's
* not any worse than any other choice we could make.)
*
* It is crucial that we don't do the same to the expanded key used in the main
* Eksblowfish loop. By doing it to only one of these two, we deviate from a
* state that could be directly specified by a password to the buggy algorithm
* (and to the fully correct one as well, but that's a side-effect).
*/
P
[
0
]
^=
sign
;
for
(
i
=
0
;
i
<
plen
;
i
+=
2
)
{
lr
[
0
]
^=
streamtoword
(
data
,
doffp
);
lr
[
1
]
^=
streamtoword
(
data
,
doffp
);
encipher
(
lr
,
0
);
P
[
i
]
=
lr
[
0
];
P
[
i
+
1
]
=
lr
[
1
];
}
for
(
i
=
0
;
i
<
slen
;
i
+=
2
)
{
lr
[
0
]
^=
streamtoword
(
data
,
doffp
);
lr
[
1
]
^=
streamtoword
(
data
,
doffp
);
encipher
(
lr
,
0
);
S
[
i
]
=
lr
[
0
];
S
[
i
+
1
]
=
lr
[
1
];
}
}
static
long
roundsForLogRounds
(
int
log_rounds
)
{
if
(
log_rounds
<
4
||
log_rounds
>
31
)
{
throw
new
IllegalArgumentException
(
"Bad number of rounds"
);
}
return
1L
<<
log_rounds
;
}
/**
* Perform the central password hashing step in the
* bcrypt scheme
* @param password the password to hash
* @param salt the binary salt to hash with the password
* @param log_rounds the binary logarithm of the number
* of rounds of hashing to apply
* @param sign_ext_bug true to implement the 2x bug
* @param safety bit 16 is set when the safety measure is requested
* @return an array containing the binary hashed password
*/
private
byte
[]
crypt_raw
(
byte
password
[],
byte
salt
[],
int
log_rounds
,
boolean
sign_ext_bug
,
int
safety
)
{
int
rounds
,
i
,
j
;
int
cdata
[]
=
bf_crypt_ciphertext
.
clone
();
int
clen
=
cdata
.
length
;
byte
ret
[];
if
(
log_rounds
<
4
||
log_rounds
>
31
)
throw
new
IllegalArgumentException
(
"Bad number of rounds"
);
rounds
=
1
<<
log_rounds
;
if
(
salt
.
length
!=
BCRYPT_SALT_LEN
)
throw
new
IllegalArgumentException
(
"Bad salt length"
);
init_key
();
ekskey
(
salt
,
password
,
sign_ext_bug
,
safety
);
for
(
i
=
0
;
i
<
rounds
;
i
++)
{
key
(
password
,
sign_ext_bug
,
safety
);
key
(
salt
,
false
,
safety
);
}
for
(
i
=
0
;
i
<
64
;
i
++)
{
for
(
j
=
0
;
j
<
(
clen
>>
1
);
j
++)
encipher
(
cdata
,
j
<<
1
);
}
ret
=
new
byte
[
clen
*
4
];
for
(
i
=
0
,
j
=
0
;
i
<
clen
;
i
++)
{
ret
[
j
++]
=
(
byte
)
((
cdata
[
i
]
>>
24
)
&
0xff
);
ret
[
j
++]
=
(
byte
)
((
cdata
[
i
]
>>
16
)
&
0xff
);
ret
[
j
++]
=
(
byte
)
((
cdata
[
i
]
>>
8
)
&
0xff
);
ret
[
j
++]
=
(
byte
)
(
cdata
[
i
]
&
0xff
);
}
return
ret
;
}
/**
* Hash a password using the OpenBSD bcrypt scheme
* @param password the password to hash
* @param salt the salt to hash with (perhaps generated
* using BCrypt.gensalt)
* @return the hashed password
*/
public
static
String
hashpw
(
String
password
,
String
salt
)
{
byte
passwordb
[];
passwordb
=
password
.
getBytes
(
StandardCharsets
.
UTF_8
);
return
hashpw
(
passwordb
,
salt
);
}
/**
* Hash a password using the OpenBSD bcrypt scheme
* @param passwordb the password to hash, as a byte array
* @param salt the salt to hash with (perhaps generated
* using BCrypt.gensalt)
* @return the hashed password
*/
public
static
String
hashpw
(
byte
passwordb
[],
String
salt
)
{
com
.
mmc
.
iuav
.
user
.
auth
.
BCrypt
B
;
String
real_salt
;
byte
saltb
[],
hashed
[];
char
minor
=
(
char
)
0
;
int
rounds
,
off
;
StringBuilder
rs
=
new
StringBuilder
();
if
(
salt
==
null
)
{
throw
new
IllegalArgumentException
(
"salt cannot be null"
);
}
int
saltLength
=
salt
.
length
();
if
(
saltLength
<
28
)
{
throw
new
IllegalArgumentException
(
"Invalid salt"
);
}
if
(
salt
.
charAt
(
0
)
!=
'$'
||
salt
.
charAt
(
1
)
!=
'2'
)
throw
new
IllegalArgumentException
(
"Invalid salt version"
);
if
(
salt
.
charAt
(
2
)
==
'$'
)
off
=
3
;
else
{
minor
=
salt
.
charAt
(
2
);
if
((
minor
!=
'a'
&&
minor
!=
'x'
&&
minor
!=
'y'
&&
minor
!=
'b'
)
||
salt
.
charAt
(
3
)
!=
'$'
)
throw
new
IllegalArgumentException
(
"Invalid salt revision"
);
off
=
4
;
}
// Extract number of rounds
if
(
salt
.
charAt
(
off
+
2
)
>
'$'
)
throw
new
IllegalArgumentException
(
"Missing salt rounds"
);
if
(
off
==
4
&&
saltLength
<
29
)
{
throw
new
IllegalArgumentException
(
"Invalid salt"
);
}
rounds
=
Integer
.
parseInt
(
salt
.
substring
(
off
,
off
+
2
));
real_salt
=
salt
.
substring
(
off
+
3
,
off
+
25
);
saltb
=
decode_base64
(
real_salt
,
BCRYPT_SALT_LEN
);
if
(
minor
>=
'a'
)
// add null terminator
passwordb
=
Arrays
.
copyOf
(
passwordb
,
passwordb
.
length
+
1
);
B
=
new
com
.
mmc
.
iuav
.
user
.
auth
.
BCrypt
();
hashed
=
B
.
crypt_raw
(
passwordb
,
saltb
,
rounds
,
minor
==
'x'
,
minor
==
'a'
?
0x10000
:
0
);
rs
.
append
(
"$2"
);
if
(
minor
>=
'a'
)
rs
.
append
(
minor
);
rs
.
append
(
"$"
);
if
(
rounds
<
10
)
rs
.
append
(
"0"
);
rs
.
append
(
rounds
);
rs
.
append
(
"$"
);
encode_base64
(
saltb
,
saltb
.
length
,
rs
);
encode_base64
(
hashed
,
bf_crypt_ciphertext
.
length
*
4
-
1
,
rs
);
return
rs
.
toString
();
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param prefix the prefix value (default $2a)
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @param random an instance of SecureRandom to use
* @return an encoded salt value
* @exception IllegalArgumentException if prefix or log_rounds is invalid
*/
public
static
String
gensalt
(
String
prefix
,
int
log_rounds
,
SecureRandom
random
)
throws
IllegalArgumentException
{
StringBuilder
rs
=
new
StringBuilder
();
byte
rnd
[]
=
new
byte
[
BCRYPT_SALT_LEN
];
if
(!
prefix
.
startsWith
(
"$2"
)
||
(
prefix
.
charAt
(
2
)
!=
'a'
&&
prefix
.
charAt
(
2
)
!=
'y'
&&
prefix
.
charAt
(
2
)
!=
'b'
))
{
throw
new
IllegalArgumentException
(
"Invalid prefix"
);
}
if
(
log_rounds
<
4
||
log_rounds
>
31
)
{
throw
new
IllegalArgumentException
(
"Invalid log_rounds"
);
}
random
.
nextBytes
(
rnd
);
rs
.
append
(
"$2"
);
rs
.
append
(
prefix
.
charAt
(
2
));
rs
.
append
(
"$"
);
if
(
log_rounds
<
10
)
rs
.
append
(
"0"
);
rs
.
append
(
log_rounds
);
rs
.
append
(
"$"
);
encode_base64
(
rnd
,
rnd
.
length
,
rs
);
return
rs
.
toString
();
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param prefix the prefix value (default $2a)
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @return an encoded salt value
* @exception IllegalArgumentException if prefix or log_rounds is invalid
*/
public
static
String
gensalt
(
String
prefix
,
int
log_rounds
)
throws
IllegalArgumentException
{
return
gensalt
(
prefix
,
log_rounds
,
new
SecureRandom
());
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @param random an instance of SecureRandom to use
* @return an encoded salt value
* @exception IllegalArgumentException if log_rounds is invalid
*/
public
static
String
gensalt
(
int
log_rounds
,
SecureRandom
random
)
throws
IllegalArgumentException
{
return
gensalt
(
"$2a"
,
log_rounds
,
random
);
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @return an encoded salt value
* @exception IllegalArgumentException if log_rounds is invalid
*/
public
static
String
gensalt
(
int
log_rounds
)
throws
IllegalArgumentException
{
return
gensalt
(
log_rounds
,
new
SecureRandom
());
}
public
static
String
gensalt
(
String
prefix
)
{
return
gensalt
(
prefix
,
GENSALT_DEFAULT_LOG2_ROUNDS
);
}
/**
* Generate a salt for use with the BCrypt.hashpw() method,
* selecting a reasonable default for the number of hashing
* rounds to apply
* @return an encoded salt value
*/
public
static
String
gensalt
()
{
return
gensalt
(
GENSALT_DEFAULT_LOG2_ROUNDS
);
}
/**
* Check that a plaintext password matches a previously hashed
* one
* @param plaintext the plaintext password to verify
* @param hashed the previously-hashed password
* @return true if the passwords match, false otherwise
*/
public
static
boolean
checkpw
(
String
plaintext
,
String
hashed
)
{
return
equalsNoEarlyReturn
(
hashed
,
hashpw
(
plaintext
,
hashed
));
}
/**
* Check that a password (as a byte array) matches a previously hashed
* one
* @param passwordb the password to verify, as a byte array
* @param hashed the previously-hashed password
* @return true if the passwords match, false otherwise
* @since 5.3
*/
public
static
boolean
checkpw
(
byte
[]
passwordb
,
String
hashed
)
{
return
equalsNoEarlyReturn
(
hashed
,
hashpw
(
passwordb
,
hashed
));
}
static
boolean
equalsNoEarlyReturn
(
String
a
,
String
b
)
{
return
MessageDigest
.
isEqual
(
a
.
getBytes
(
StandardCharsets
.
UTF_8
),
b
.
getBytes
(
StandardCharsets
.
UTF_8
));
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/BCryptPasswordEncoder.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Component
;
import
java.security.SecureRandom
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* Implementation of PasswordEncoder that uses the BCrypt strong hashing function. Clients
* can optionally supply a "version" ($2a, $2b, $2y) and a "strength" (a.k.a. log rounds in BCrypt)
* and a SecureRandom instance. The larger the strength parameter the more work will have to be done
* (exponentially) to hash the passwords. The default value is 10.
*
*/
@Component
public
class
BCryptPasswordEncoder
implements
PasswordEncoder
{
private
Pattern
BCRYPT_PATTERN
=
Pattern
.
compile
(
"\\A\\$2(a|y|b)?\\$(\\d\\d)\\$[./0-9A-Za-z]{53}"
);
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
com
.
mmc
.
iuav
.
user
.
auth
.
BCryptPasswordEncoder
.
class
);
private
final
int
strength
;
private
final
BCryptVersion
version
;
private
final
SecureRandom
random
;
public
BCryptPasswordEncoder
()
{
this
(-
1
);
}
/**
* @param strength the log rounds to use, between 4 and 31
*/
public
BCryptPasswordEncoder
(
int
strength
)
{
this
(
strength
,
null
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
)
{
this
(
version
,
null
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param random the secure random instance to use
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
,
SecureRandom
random
)
{
this
(
version
,
-
1
,
random
);
}
/**
* @param strength the log rounds to use, between 4 and 31
* @param random the secure random instance to use
*/
public
BCryptPasswordEncoder
(
int
strength
,
SecureRandom
random
)
{
this
(
BCryptVersion
.
$
2
A
,
strength
,
random
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param strength the log rounds to use, between 4 and 31
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
,
int
strength
)
{
this
(
version
,
strength
,
null
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param strength the log rounds to use, between 4 and 31
* @param random the secure random instance to use
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
,
int
strength
,
SecureRandom
random
)
{
if
(
strength
!=
-
1
&&
(
strength
<
BCrypt
.
MIN_LOG_ROUNDS
||
strength
>
BCrypt
.
MAX_LOG_ROUNDS
))
{
throw
new
IllegalArgumentException
(
"Bad strength"
);
}
this
.
version
=
version
;
this
.
strength
=
strength
==
-
1
?
10
:
strength
;
this
.
random
=
random
;
}
public
String
encode
(
CharSequence
rawPassword
)
{
if
(
rawPassword
==
null
)
{
throw
new
IllegalArgumentException
(
"rawPassword cannot be null"
);
}
String
salt
;
if
(
random
!=
null
)
{
salt
=
BCrypt
.
gensalt
(
version
.
getVersion
(),
strength
,
random
);
}
else
{
salt
=
BCrypt
.
gensalt
(
version
.
getVersion
(),
strength
);
}
return
BCrypt
.
hashpw
(
rawPassword
.
toString
(),
salt
);
}
public
boolean
matches
(
CharSequence
rawPassword
,
String
encodedPassword
)
{
if
(
rawPassword
==
null
)
{
throw
new
IllegalArgumentException
(
"rawPassword cannot be null"
);
}
if
(
encodedPassword
==
null
||
encodedPassword
.
length
()
==
0
)
{
logger
.
warn
(
"Empty encoded password"
);
return
false
;
}
if
(!
BCRYPT_PATTERN
.
matcher
(
encodedPassword
).
matches
())
{
logger
.
warn
(
"Encoded password does not look like BCrypt"
);
return
false
;
}
return
BCrypt
.
checkpw
(
rawPassword
.
toString
(),
encodedPassword
);
}
@Override
public
boolean
upgradeEncoding
(
String
encodedPassword
)
{
if
(
encodedPassword
==
null
||
encodedPassword
.
length
()
==
0
)
{
logger
.
warn
(
"Empty encoded password"
);
return
false
;
}
Matcher
matcher
=
BCRYPT_PATTERN
.
matcher
(
encodedPassword
);
if
(!
matcher
.
matches
())
{
throw
new
IllegalArgumentException
(
"Encoded password does not look like BCrypt: "
+
encodedPassword
);
}
else
{
int
strength
=
Integer
.
parseInt
(
matcher
.
group
(
2
));
return
strength
<
this
.
strength
;
}
}
/**
* Stores the default bcrypt version for use in configuration.
*
* @author Lin Feng
*/
public
enum
BCryptVersion
{
$
2
A
(
"$2a"
),
$
2
Y
(
"$2y"
),
$
2
B
(
"$2b"
);
private
final
String
version
;
BCryptVersion
(
String
version
)
{
this
.
version
=
version
;
}
public
String
getVersion
()
{
return
this
.
version
;
}
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/PasswordEncoder.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
/**
* Service interface for encoding passwords.
*
* The preferred implementation is {@code BCryptPasswordEncoder}.
*
* @author Keith Donald
*/
public
interface
PasswordEncoder
{
/**
* Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or
* greater hash combined with an 8-byte or greater randomly generated salt.
*/
String
encode
(
CharSequence
rawPassword
);
/**
* Verify the encoded password obtained from storage matches the submitted raw
* password after it too is encoded. Returns true if the passwords match, false if
* they do not. The stored password itself is never decoded.
*
* @param rawPassword the raw password to encode and match
* @param encodedPassword the encoded password from storage to compare with
* @return true if the raw password, after encoding, matches the encoded password from
* storage
*/
boolean
matches
(
CharSequence
rawPassword
,
String
encodedPassword
);
/**
* Returns true if the encoded password should be encoded again for better security,
* else false. The default implementation always returns false.
* @param encodedPassword the encoded password to check
* @return true if the encoded password should be encoded again for better security,
* else false.
*/
default
boolean
upgradeEncoding
(
String
encodedPassword
)
{
return
false
;
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/PwdUtil.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
import
java.math.BigInteger
;
import
java.security.MessageDigest
;
import
java.security.NoSuchAlgorithmException
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午4:39:06
* @explain 密码加密
*/
public
class
PwdUtil
{
public
static
String
securityPwd
(
String
passWord
)
throws
NoSuchAlgorithmException
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"SHA"
);
md
.
update
(
passWord
.
getBytes
());
return
new
BigInteger
(
md
.
digest
()).
toString
(
32
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/AuthController.java
浏览文件 @
ace6ad4a
...
...
@@ -2,6 +2,7 @@ package com.mmc.iuav.user.controller;
import
com.mmc.iuav.group.Insert
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.AppUserSucVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
import
com.mmc.iuav.user.service.AuthService
;
...
...
@@ -28,4 +29,19 @@ public class AuthController {
public
ResultBody
appletLogin
(
@Validated
(
value
=
{
Insert
.
class
})
@RequestBody
WxLoginVO
wxLoginVO
){
return
authService
.
appletLogin
(
wxLoginVO
);
}
@ApiOperation
(
value
=
"平台账号密码登录"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)
})
@PostMapping
(
"backEndLogin"
)
public
ResultBody
backEndLogin
(
@ApiParam
(
value
=
"账号登录QO"
,
required
=
true
)
@Validated
@RequestBody
LoginUserQO
param
)
{
return
authService
.
backEndLogin
(
param
);
}
@ApiOperation
(
value
=
"测试-小程序unionId登录/注册"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
AppUserSucVO
.
class
)
})
@PostMapping
(
"testAppletLogin"
)
public
ResultBody
testAppletLogin
(
@RequestParam
String
unionId
){
return
authService
.
testAppletLogin
(
unionId
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/BackUserAccountController.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
controller
;
import
com.mmc.iuav.group.Create
;
import
com.mmc.iuav.group.Update
;
import
com.mmc.iuav.group.UpdatePassword
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.dto.BaseAccountDTO
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.service.UserAccountService
;
import
io.swagger.annotations.*
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
springfox.documentation.annotations.ApiIgnore
;
import
javax.servlet.http.HttpServletRequest
;
import
java.security.NoSuchAlgorithmException
;
import
java.util.List
;
/**
* @author: zj
* @Date: 2023/5/25 11:22
*/
@Api
(
tags
=
"后台用户相关接口"
)
@RequestMapping
(
"/back-user/"
)
@RestController
public
class
BackUserAccountController
extends
BaseController
{
@Autowired
private
UserAccountService
userAccountService
;
@ApiOperation
(
value
=
"账号-新增"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"insertBAccount"
)
public
ResultBody
insertBAccount
(
@Validated
(
value
=
{
Create
.
class
})
@RequestBody
BUserAccountVO
bUserAccountVO
)
{
return
userAccountService
.
insertBAccount
(
bUserAccountVO
);
}
@ApiOperation
(
value
=
"账号-修改"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"updateBAccount"
)
public
ResultBody
updateBAccount
(
@Validated
(
value
=
{
Update
.
class
})
@RequestBody
BUserAccountVO
bUserAccountVO
)
{
return
userAccountService
.
updateBAccount
(
bUserAccountVO
);
}
@ApiOperation
(
value
=
"账号-删除"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"removeBAccount"
)
public
ResultBody
removeBAccount
(
@RequestParam
Integer
userAccountId
)
{
return
userAccountService
.
removeBAccount
(
userAccountId
);
}
@ApiOperation
(
value
=
"账号-列表"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"listBAccountPage"
)
public
ResultBody
<
UserAccountSimpleDTO
>
listBAccountPage
(
@ApiParam
(
value
=
"账号查询QO"
,
required
=
true
)
@RequestBody
BUserAccountQO
bUserAccountQO
)
{
return
userAccountService
.
listBAccountPage
(
bUserAccountQO
);
}
@ApiOperation
(
value
=
"账号-用户列表-内部调用"
,
hidden
=
true
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
List
.
class
)})
@PostMapping
(
"feignListBAccountPage"
)
public
List
<
UserAccountSimpleDTO
>
feignListBAccountPage
(
@ApiParam
(
value
=
"账号查询QO"
,
required
=
true
)
@RequestBody
BUserAccountQO
bUserAccountQO
)
{
return
userAccountService
.
feignListBAccountPage
(
bUserAccountQO
);
}
@ApiOperation
(
value
=
"账号管理-修改密码"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"updatePassword"
)
public
ResultBody
updatePassword
(
@Validated
(
value
=
{
UpdatePassword
.
class
})
@RequestBody
BUserAccountVO
account
)
throws
NoSuchAlgorithmException
{
return
userAccountService
.
updatePassword
(
account
);
}
@ApiOperation
(
value
=
"feign-验证用户密码"
)
@ApiIgnore
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@GetMapping
(
"feignAuthUserPwd"
)
public
ResultBody
feignAuthUserPwd
(
@RequestParam
(
required
=
true
)
Integer
id
,
@RequestParam
(
required
=
true
)
String
authPwd
)
{
return
userAccountService
.
feignAuthUserPwd
(
id
,
authPwd
);
}
@ApiOperation
(
value
=
"test"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"listTest"
)
public
ResultBody
listTest
(
HttpServletRequest
request
)
{
return
ResultBody
.
success
(
this
.
getUserLoginInfo
(
request
));
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/BaseController.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
controller
;
import
com.mmc.iuav.auth.JwtConstant
;
import
com.mmc.iuav.auth.JwtUtil
;
import
com.mmc.iuav.http.BizException
;
import
com.mmc.iuav.user.model.dto.BaseAccountDTO
;
import
io.jsonwebtoken.Claims
;
import
javax.servlet.http.HttpServletRequest
;
/**
* @author: zj
* @Date: 2023/5/25 18:11
*/
public
abstract
class
BaseController
{
/**
* 解析token,获取用户信息
* @param request
* @return
*/
public
BaseAccountDTO
getUserLoginInfo
(
HttpServletRequest
request
)
{
String
token
=
request
.
getHeader
(
"token"
);
try
{
Claims
claims
=
JwtUtil
.
parseJwt
(
token
);
String
userId
=
claims
.
get
(
JwtConstant
.
USER_ACCOUNT_ID
).
toString
();
// String roleId = claims.get("").toString();
String
tokenType
=
claims
.
get
(
JwtConstant
.
TOKEN_TYPE
).
toString
();
return
BaseAccountDTO
.
builder
().
id
(
Integer
.
parseInt
(
userId
)).
tokenPort
(
tokenType
).
build
();
}
catch
(
Exception
e
){
throw
new
BizException
(
"Invalid token"
);
}
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/CooperationController.java
浏览文件 @
ace6ad4a
...
...
@@ -35,4 +35,11 @@ public class CooperationController {
public
ResultBody
apply
(
@Validated
(
value
=
{
Insert
.
class
})
@RequestBody
UserApplyTagVO
userApplyTagVO
){
return
cooperationService
.
apply
(
userApplyTagVO
);
}
@ApiOperation
(
value
=
"后台设置小程序用户标签"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)
})
@GetMapping
(
"changeUserTag"
)
public
ResultBody
changeUserTag
(
@RequestParam
(
"userAccountId"
)
Integer
userAccountId
,
@RequestParam
(
"cooperationTagId"
)
Integer
cooperationTagId
)
{
return
cooperationService
.
changeUserTag
(
userAccountId
,
cooperationTagId
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/UserAccountController.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
controller
;
import
com.mmc.iuav.group.Insert
;
import
com.mmc.iuav.group.Update
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.vo.AppUserSucVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
import
com.mmc.iuav.user.service.UserAccountService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -16,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.List
;
/**
...
...
@@ -25,7 +23,7 @@ import java.util.List;
@Api
(
tags
=
"账号相关接口"
)
@RequestMapping
(
"/user-account/"
)
@RestController
public
class
UserAccountController
{
public
class
UserAccountController
extends
BaseController
{
@Autowired
private
UserAccountService
userAccountService
;
...
...
@@ -33,8 +31,8 @@ public class UserAccountController {
@ApiOperation
(
value
=
"获取用户信息"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
UserAccountVO
.
class
)
})
@GetMapping
(
"info"
)
public
ResultBody
info
(
@RequestParam
Integer
userAccountId
)
{
return
ResultBody
.
success
(
userAccountService
.
getUserAccountById
(
userAccountId
));
public
ResultBody
info
(
HttpServletRequest
request
)
{
return
ResultBody
.
success
(
userAccountService
.
getUserAccountById
(
this
.
getUserLoginInfo
(
request
).
getId
()
));
}
@ApiOperation
(
value
=
"修改用户信息"
)
...
...
@@ -58,5 +56,4 @@ public class UserAccountController {
return
userAccountService
.
feignListUserAccountIds
(
provinceCode
,
cityCode
,
districtCode
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/dao/CooperationDao.java
浏览文件 @
ace6ad4a
...
...
@@ -2,6 +2,7 @@ package com.mmc.iuav.user.dao;
import
com.mmc.iuav.user.entity.CooperationTagDO
;
import
com.mmc.iuav.user.entity.UserApplyTagDO
;
import
com.mmc.iuav.user.entity.UserTagDO
;
import
org.apache.ibatis.annotations.Mapper
;
import
java.util.List
;
...
...
@@ -36,4 +37,23 @@ public interface CooperationDao {
* @param userApplyTagDO
*/
void
updateUserApplyTag
(
UserApplyTagDO
userApplyTagDO
);
/**
* 根据用户id查询渠道登记
* @param userAccountId
* @return
*/
UserTagDO
getUserTag
(
Integer
userAccountId
);
/**
* 用户设置渠道等级
* @param userTagDO
*/
void
insertUserTag
(
UserTagDO
userTagDO
);
/**
* 修改用户渠道等级
* @param userTagDO
*/
void
updateUserTag
(
UserTagDO
userTagDO
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/dao/UserServiceDao.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
dao
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
org.apache.ibatis.annotations.Mapper
;
import
java.util.List
;
...
...
@@ -45,4 +46,62 @@ public interface UserServiceDao {
* @return
*/
List
<
Integer
>
listUserAccountIdsByDistrictCode
(
Integer
provinceCode
,
Integer
cityCode
,
Integer
districtCode
);
/**
* 登录账号密码查询用户信息
* @param accountNo
* @param passWord
* @return
*/
UserAccountDO
getUserLoginInfo
(
String
accountNo
,
String
passWord
);
/**
* 批量获取用户信息
* @param bUserAccountQO
* @return
*/
List
<
UserAccountDO
>
feignListBAccountPage
(
BUserAccountQO
bUserAccountQO
);
/**
* 删除用户
* @param removeNO
* @param userAccountId
*/
void
removeUserAccount
(
String
removeNO
,
Integer
userAccountId
);
/**
* 根据账号名称查询数量
* @param excludeId
* @param accountNo
* @return
*/
int
countUserAccountNo
(
Integer
excludeId
,
String
accountNo
);
/**
* 查询用户数量
* @param param
* @return
*/
int
countListBAccountPage
(
BUserAccountQO
param
);
/**
* 查询用户信息
* @param param
* @return
*/
List
<
UserAccountDO
>
listBAccountPage
(
BUserAccountQO
param
);
/**
* 修改用户密码
* @param id
* @param passWord
*/
void
updatePassword
(
Integer
id
,
String
passWord
);
/**
* 获取用户密码
* @param id
* @return
*/
UserAccountDO
getUserAuthPwdInfo
(
Integer
id
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/entity/UserAccountDO.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
entity
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
...
...
@@ -19,7 +21,9 @@ import java.util.Date;
public
class
UserAccountDO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
5007589179946146721L
;
private
Integer
id
;
private
String
accountNo
;
private
Integer
accountType
;
private
String
password
;
private
String
uid
;
private
String
phoneNum
;
private
String
userName
;
...
...
@@ -36,6 +40,9 @@ public class UserAccountDO implements Serializable {
private
Integer
deleted
;
private
Date
createTime
;
private
Date
updateTime
;
private
Integer
provinceCode
;
private
Integer
cityCode
;
private
Integer
districtCode
;
public
UserAccountDO
(
UserAccountVO
userAccountVO
)
{
this
.
id
=
userAccountVO
.
getId
();
...
...
@@ -50,14 +57,27 @@ public class UserAccountDO implements Serializable {
this
.
portType
=
userAccountVO
.
getPortType
();
}
public
UserAccountDO
(
BUserAccountVO
bUserAccountVO
)
{
this
.
id
=
bUserAccountVO
.
getId
();
this
.
accountNo
=
bUserAccountVO
.
getAccountNo
();
this
.
phoneNum
=
bUserAccountVO
.
getPhoneNum
();
this
.
userName
=
bUserAccountVO
.
getUserName
();
this
.
email
=
bUserAccountVO
.
getEmail
();
this
.
accountStatus
=
bUserAccountVO
.
getAccountStatus
();
this
.
remark
=
bUserAccountVO
.
getRemark
();
this
.
provinceCode
=
bUserAccountVO
.
getProvinceCode
();
this
.
cityCode
=
bUserAccountVO
.
getCityCode
();
this
.
districtCode
=
bUserAccountVO
.
getDistrictCode
();
}
public
UserAccountVO
buildUserAccountVO
()
{
return
UserAccountVO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
accountType
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
return
UserAccountVO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
account
No
(
this
.
accountNo
).
account
Type
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
.
userImg
(
this
.
userImg
).
userSex
(
this
.
userSex
).
email
(
this
.
email
).
source
(
this
.
source
).
accountStatus
(
this
.
accountStatus
).
remark
(
this
.
remark
).
portType
(
this
.
portType
)
.
createTime
(
this
.
createTime
).
build
();
}
public
UserAccountSimpleDTO
buildUserAccountSimpleDTO
()
{
return
UserAccountSimpleDTO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
accountType
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
return
UserAccountSimpleDTO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
account
No
(
this
.
accountNo
).
account
Type
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
.
userImg
(
this
.
userImg
).
userSex
(
this
.
userSex
).
email
(
this
.
email
).
source
(
this
.
source
).
accountStatus
(
this
.
accountStatus
).
portType
(
this
.
portType
)
.
build
();
}
...
...
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/entity/UserTagDO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
entity
;
import
com.mmc.iuav.user.model.vo.UserTagVO
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* @author: zj
* @Date: 2023/5/26 20:55
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
UserTagDO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
5355286947297870886L
;
private
Integer
id
;
private
Integer
cooperationTagId
;
private
Integer
userAccountId
;
private
Integer
deleted
;
private
Date
createTime
;
private
Date
updateTime
;
public
UserTagDO
(
UserTagVO
userTagVO
)
{
this
.
id
=
userTagVO
.
getId
();
this
.
userAccountId
=
userTagVO
.
getUserAccountId
();
this
.
cooperationTagId
=
userTagVO
.
getCooperationTagId
();
}
public
UserTagVO
buildUserTagVO
()
{
return
UserTagVO
.
builder
().
id
(
this
.
id
).
cooperationTagId
(
this
.
cooperationTagId
).
userAccountId
(
this
.
userAccountId
).
build
();
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/enums/UserAccountStatus.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
enums
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年9月7日 下午3:06:26
* @explain 类说明
*/
public
enum
UserAccountStatus
{
NORMAL
(
1
,
"正常可用"
),
DISABLE
(
0
,
"禁用"
);
UserAccountStatus
(
int
accountStatus
,
String
statusName
)
{
this
.
accountStatus
=
accountStatus
;
this
.
statusName
=
statusName
;
}
private
Integer
accountStatus
;
private
String
statusName
;
public
Integer
getAccountStatus
()
{
return
accountStatus
;
}
public
void
setAccountStatus
(
Integer
accountStatus
)
{
this
.
accountStatus
=
accountStatus
;
}
public
String
getStatusName
()
{
return
statusName
;
}
public
void
setStatusName
(
String
statusName
)
{
this
.
statusName
=
statusName
;
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/AuthService.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
service
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
/**
...
...
@@ -14,4 +15,18 @@ public interface AuthService {
* @return
*/
ResultBody
appletLogin
(
WxLoginVO
wxLoginVO
);
/**
* 后台用户登录
* @param param
* @return
*/
ResultBody
backEndLogin
(
LoginUserQO
param
);
/**
* 小程序用户登录
* @param unionId
* @return
*/
ResultBody
testAppletLogin
(
String
unionId
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/CooperationService.java
浏览文件 @
ace6ad4a
...
...
@@ -20,4 +20,12 @@ public interface CooperationService {
* @return
*/
ResultBody
apply
(
UserApplyTagVO
cooperationTagVO
);
/**
* 后台用户设置小程序用户等级标签
* @param userAccountId
* @param cooperationTagId
* @return
*/
ResultBody
changeUserTag
(
Integer
userAccountId
,
Integer
cooperationTagId
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/UserAccountService.java
浏览文件 @
ace6ad4a
...
...
@@ -3,6 +3,9 @@ package com.mmc.iuav.user.service;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
java.util.List
;
...
...
@@ -54,4 +57,62 @@ public interface UserAccountService {
* @return
*/
List
<
Integer
>
feignListUserAccountIds
(
Integer
provinceCode
,
Integer
cityCode
,
Integer
districtCode
);
/**
* 添加后台用户
* @param bUserAccountVO
* @return
*/
ResultBody
insertBAccount
(
BUserAccountVO
bUserAccountVO
);
/**
* 删除用户信
* @param userAccountId
* @return
*/
ResultBody
removeBAccount
(
Integer
userAccountId
);
/**
* 后台用户列表
* @param bUserAccountQO
* @return
*/
ResultBody
listBAccountPage
(
BUserAccountQO
bUserAccountQO
);
/**
* 登录账号密码查询用户信息
* @param accountNo
* @param passWord
* @return
*/
UserAccountDO
getUserLoginInfo
(
String
accountNo
,
String
passWord
);
/**
* 内部获取用户列表
* @param bUserAccountQO
* @return
*/
List
<
UserAccountSimpleDTO
>
feignListBAccountPage
(
BUserAccountQO
bUserAccountQO
);
/**
* 修改用户信息
* @param bUserAccountVO
* @return
*/
ResultBody
updateBAccount
(
BUserAccountVO
bUserAccountVO
);
/**
* 修改用户密码
* @param account
* @return
*/
ResultBody
updatePassword
(
BUserAccountVO
account
);
/**
* 验证用户密码
* @param id
* @param authPwd
* @return
*/
ResultBody
feignAuthUserPwd
(
Integer
id
,
String
authPwd
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/impl/AuthServiceImpl.java
浏览文件 @
ace6ad4a
...
...
@@ -7,8 +7,12 @@ import com.mmc.iuav.auth.JwtUtil;
import
com.mmc.iuav.general.CodeUtil
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultEnum
;
import
com.mmc.iuav.user.auth.PwdUtil
;
import
com.mmc.iuav.user.constant.WxConstant
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.enums.UserAccountStatus
;
import
com.mmc.iuav.user.model.dto.LoginSuccessDTO
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.AppUserSucVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
...
...
@@ -16,9 +20,11 @@ import com.mmc.iuav.user.service.AuthService;
import
com.mmc.iuav.user.service.UserAccountService
;
import
com.mmc.iuav.user.service.WxService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.security.NoSuchAlgorithmException
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -44,7 +50,7 @@ public class AuthServiceImpl implements AuthService {
if
(
wxLoginVO
.
getFromPort
().
toString
().
equals
(
WxConstant
.
APP
.
toString
()))
{
//调用小程序登录接口,里面包含unionId
String
appWxJson
=
wxService
.
appLogin
(
wxLoginVO
);
if
(
appWxJson
==
null
)
{
if
(
StringUtils
.
isBlank
(
appWxJson
)
)
{
return
ResultBody
.
error
(
ResultEnum
.
APPLET_PORT_TYPE_ERROR
);
}
log
.
info
(
"wx appLogin msg==>"
+
JSONObject
.
toJSONString
(
appWxJson
));
...
...
@@ -59,7 +65,7 @@ public class AuthServiceImpl implements AuthService {
}
else
if
(
wxLoginVO
.
getFromPort
().
equals
(
WxConstant
.
WEB
)){
//获取access_token接口,里面包含unionId
String
pcWxJson
=
wxService
.
pcLogin
(
wxLoginVO
);
if
(
pcWxJson
==
null
)
{
if
(
StringUtils
.
isBlank
(
pcWxJson
)
)
{
return
ResultBody
.
error
(
ResultEnum
.
APPLET_PORT_TYPE_ERROR
);
}
log
.
info
(
"wx pcLogin msg==>"
+
JSONObject
.
toJSONString
(
pcWxJson
));
...
...
@@ -89,11 +95,55 @@ public class AuthServiceImpl implements AuthService {
}
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
map
.
put
(
JwtConstant
.
USER_ACCOUNT_ID
,
userAccountVO
.
getId
());
map
.
put
(
JwtConstant
.
ROLE_ID
,
0
);
//
map.put(JwtConstant.ROLE_ID, 0);
map
.
put
(
JwtConstant
.
TOKEN_TYPE
,
JwtConstant
.
IUAV_TOKEN
);
String
token
=
JwtUtil
.
createJwt
(
map
);
return
ResultBody
.
success
(
AppUserSucVO
.
builder
().
token
(
token
).
uid
(
userAccountVO
.
getUid
()).
phoneNum
(
userAccountVO
.
getPhoneNum
())
.
nickName
(
userAccountVO
.
getNickName
()).
userAccountId
(
userAccountVO
.
getId
()).
sessionKey
(
sessionKey
).
build
());
}
@Override
public
ResultBody
backEndLogin
(
LoginUserQO
param
)
{
//查询用户信息
UserAccountDO
user
=
userAccountService
.
getUserLoginInfo
(
param
.
getAccountNo
(),
param
.
getPassWord
());
if
(
user
==
null
)
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_ACCOUNT_NOT_EXIT_ERROR
);
}
if
(
user
.
getAccountStatus
()
.
equals
(
UserAccountStatus
.
DISABLE
.
getAccountStatus
())
)
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_ACCOUNT_STATUS_ERROR
);
}
String
loginPwd
=
""
;
try
{
loginPwd
=
PwdUtil
.
securityPwd
(
param
.
getPassWord
());
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CONPARED_ERROR
);
}
if
(!
loginPwd
.
equals
(
user
.
getPassword
()))
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_PASSWORD_ERROR
);
}
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
map
.
put
(
JwtConstant
.
USER_ACCOUNT_ID
,
user
.
getId
());
//map.put(JwtConstant.ROLE_ID, 0);
map
.
put
(
JwtConstant
.
TOKEN_TYPE
,
JwtConstant
.
M_TOKEN
);
String
token
=
JwtUtil
.
createJwt
(
map
);
return
ResultBody
.
success
(
LoginSuccessDTO
.
builder
().
token
(
token
).
userAccountId
(
user
.
getId
()).
accountNo
(
user
.
getAccountNo
()).
build
());
}
@Override
public
ResultBody
testAppletLogin
(
String
unionId
)
{
UserAccountVO
userAccountVO
=
userAccountService
.
getUserAccountInfoByUnionId
(
unionId
);
if
(
userAccountVO
!=
null
)
{
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
map
.
put
(
JwtConstant
.
USER_ACCOUNT_ID
,
userAccountVO
.
getId
());
map
.
put
(
JwtConstant
.
TOKEN_TYPE
,
JwtConstant
.
IUAV_TOKEN
);
String
token
=
JwtUtil
.
createJwt
(
map
);
return
ResultBody
.
success
(
AppUserSucVO
.
builder
().
token
(
token
).
uid
(
userAccountVO
.
getUid
()).
phoneNum
(
userAccountVO
.
getPhoneNum
())
.
nickName
(
userAccountVO
.
getNickName
()).
userAccountId
(
userAccountVO
.
getId
()).
build
());
}
return
null
;
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/impl/CooperationServiceImpl.java
浏览文件 @
ace6ad4a
...
...
@@ -7,6 +7,7 @@ import com.mmc.iuav.user.dao.CooperationDao;
import
com.mmc.iuav.user.entity.CompanyAuthDO
;
import
com.mmc.iuav.user.entity.CooperationTagDO
;
import
com.mmc.iuav.user.entity.UserApplyTagDO
;
import
com.mmc.iuav.user.entity.UserTagDO
;
import
com.mmc.iuav.user.model.vo.CooperationTagVO
;
import
com.mmc.iuav.user.model.vo.UserApplyTagVO
;
import
com.mmc.iuav.user.service.CooperationService
;
...
...
@@ -60,4 +61,20 @@ public class CooperationServiceImpl implements CooperationService {
cooperationDao
.
addApply
(
userApplyTagDO
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
changeUserTag
(
Integer
userAccountId
,
Integer
cooperationTagId
)
{
UserTagDO
userTagDO
=
cooperationDao
.
getUserTag
(
userAccountId
);
if
(
userTagDO
==
null
){
//直接插入
userTagDO
=
new
UserTagDO
();
userTagDO
.
setUserAccountId
(
userAccountId
);
userTagDO
.
setCooperationTagId
(
cooperationTagId
);
cooperationDao
.
insertUserTag
(
userTagDO
);
}
//修改渠道等级
userTagDO
.
setCooperationTagId
(
cooperationTagId
);
cooperationDao
.
updateUserTag
(
userTagDO
);
return
ResultBody
.
success
();
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/impl/UserAccountServiceImpl.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
service
.
impl
;
import
com.mmc.iuav.auth.JwtConstant
;
import
com.mmc.iuav.general.CodeUtil
;
import
com.mmc.iuav.page.PageResult
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultEnum
;
import
com.mmc.iuav.user.auth.PwdUtil
;
import
com.mmc.iuav.user.constant.UserSystemConstant
;
import
com.mmc.iuav.user.dao.CooperationDao
;
import
com.mmc.iuav.user.dao.UserServiceDao
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.entity.UserTagDO
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.CompanyAuthVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.service.CompanyAuthService
;
import
com.mmc.iuav.user.service.UserAccountService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
import
java.security.NoSuchAlgorithmException
;
import
java.util.List
;
import
java.util.stream.Collectors
;
/**
* @author: zj
...
...
@@ -26,6 +39,9 @@ public class UserAccountServiceImpl implements UserAccountService {
@Autowired
private
CompanyAuthService
companyAuthService
;
@Autowired
private
CooperationDao
cooperationDao
;
@Override
public
UserAccountVO
getUserAccountInfoByUnionId
(
String
unionId
)
{
UserAccountDO
userAccountDO
=
userServiceDao
.
getUserAccountInfoByUnionId
(
unionId
);
...
...
@@ -43,7 +59,20 @@ public class UserAccountServiceImpl implements UserAccountService {
@Override
public
UserAccountVO
getUserAccountById
(
Integer
userAccountId
)
{
UserAccountDO
userAccountDO
=
userServiceDao
.
getUserAccountById
(
userAccountId
);
if
(
userAccountDO
==
null
)
{
return
null
;
}
UserAccountVO
userAccountVO
=
userAccountDO
.
buildUserAccountVO
();
CompanyAuthVO
companyAuthVO
=
companyAuthService
.
getCompanyAuthByUId
(
userAccountId
);
if
(
companyAuthVO
!=
null
)
{
userAccountVO
.
setCompanyAuthStatus
(
companyAuthVO
.
getAuthStatus
());
}
else
{
userAccountVO
.
setCompanyAuthStatus
(
0
);
}
UserTagDO
userTag
=
cooperationDao
.
getUserTag
(
userAccountId
);
if
(
userTag
!=
null
){
userAccountVO
.
setCooperationTagId
(
userTag
.
getCooperationTagId
());
}
return
userAccountVO
;
}
...
...
@@ -64,6 +93,10 @@ public class UserAccountServiceImpl implements UserAccountService {
}
else
{
userAccountSimpleDTO
.
setCompanyAuthStatus
(
0
);
}
UserTagDO
userTag
=
cooperationDao
.
getUserTag
(
userAccountId
);
if
(
userTag
!=
null
){
userAccountSimpleDTO
.
setCooperationTagId
(
userTag
.
getCooperationTagId
());
}
return
userAccountSimpleDTO
;
}
...
...
@@ -72,4 +105,113 @@ public class UserAccountServiceImpl implements UserAccountService {
List
<
Integer
>
ids
=
userServiceDao
.
listUserAccountIdsByDistrictCode
(
provinceCode
,
cityCode
,
districtCode
);
return
ids
;
}
@Override
public
ResultBody
insertBAccount
(
BUserAccountVO
bUserAccountVO
)
{
if
(!
bUserAccountVO
.
getPassWord
().
equals
(
bUserAccountVO
.
getAlertPwd
()))
{
// 两次密码不一致
return
ResultBody
.
error
(
ResultEnum
.
PWD_ALERT_ERROR
);
}
// 获取新增的账户名是否已经存在
int
count
=
userServiceDao
.
countUserAccountNo
(
null
,
bUserAccountVO
.
getAccountNo
());
if
(
count
>
0
)
{
return
ResultBody
.
error
(
ResultEnum
.
ADD_USER_ACCOUNT_NAME_EXISTS
);
}
UserAccountDO
userAccountDO
=
new
UserAccountDO
(
bUserAccountVO
);
try
{
userAccountDO
.
setPassword
(
PwdUtil
.
securityPwd
(
bUserAccountVO
.
getPassWord
()));
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CREATE_ERROR
);
}
userAccountDO
.
setUid
(
CodeUtil
.
generateUserUID
());
userAccountDO
.
setAccountType
(
0
);
userAccountDO
.
setPortType
(
0
);
userAccountDO
.
setOpenId
(
userAccountDO
.
getUid
());
userAccountDO
.
setUnionId
(
userAccountDO
.
getUid
());
userServiceDao
.
insertUserAccount
(
userAccountDO
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
removeBAccount
(
Integer
userAccountId
)
{
String
removeNO
=
CodeUtil
.
removeUserAccount
();
userServiceDao
.
removeUserAccount
(
removeNO
,
userAccountId
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
listBAccountPage
(
BUserAccountQO
param
)
{
int
count
=
userServiceDao
.
countListBAccountPage
(
param
);
if
(
count
==
0
)
{
return
ResultBody
.
success
(
PageResult
.
buildPage
(
param
.
getPageNo
(),
param
.
getPageSize
(),
count
));
}
Integer
pageNo
=
param
.
getPageNo
();
param
.
buildCurrentPage
();
List
<
UserAccountDO
>
users
=
userServiceDao
.
listBAccountPage
(
param
);
List
<
UserAccountVO
>
collect
=
users
.
stream
().
map
(
UserAccountDO:
:
buildUserAccountVO
).
collect
(
Collectors
.
toList
());
return
ResultBody
.
success
(
PageResult
.
buildPage
(
pageNo
,
param
.
getPageSize
(),
count
,
collect
));
}
@Override
public
UserAccountDO
getUserLoginInfo
(
String
accountNo
,
String
passWord
)
{
UserAccountDO
userAccountDO
=
userServiceDao
.
getUserLoginInfo
(
accountNo
,
passWord
);
return
userAccountDO
;
}
@Override
public
List
<
UserAccountSimpleDTO
>
feignListBAccountPage
(
BUserAccountQO
bUserAccountQO
)
{
List
<
UserAccountDO
>
list
=
userServiceDao
.
feignListBAccountPage
(
bUserAccountQO
);
List
<
UserAccountSimpleDTO
>
accountSimpleDTOS
=
list
.
stream
().
map
(
UserAccountDO:
:
buildUserAccountSimpleDTO
).
collect
(
Collectors
.
toList
());
return
accountSimpleDTOS
;
}
@Override
public
ResultBody
updateBAccount
(
BUserAccountVO
bUserAccountVO
)
{
// 判断账号是否重复
if
(!
StringUtils
.
isEmpty
(
bUserAccountVO
.
getAccountNo
()))
{
// 如果传入的名字不为空,就查找数据库,看名字是否重复
int
count
=
userServiceDao
.
countUserAccountNo
(
bUserAccountVO
.
getId
(),
bUserAccountVO
.
getAccountNo
());
if
(
count
>
0
)
{
return
ResultBody
.
error
(
ResultEnum
.
UPDATE_USER_ACCOUNT_REPEAT
);
}
}
UserAccountDO
userAccountDO
=
new
UserAccountDO
(
bUserAccountVO
);
userServiceDao
.
update
(
userAccountDO
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
updatePassword
(
BUserAccountVO
account
)
{
if
(!
account
.
getPassWord
().
equals
(
account
.
getAlertPwd
()))
{
return
ResultBody
.
error
(
ResultEnum
.
PASSWORD_INCONSISTENT
);
}
try
{
account
.
setPassWord
(
PwdUtil
.
securityPwd
(
account
.
getPassWord
()));
userServiceDao
.
updatePassword
(
account
.
getId
(),
account
.
getPassWord
());
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CONPARED_ERROR
);
}
// RoleInfoDO roleInfo = roleInfoDao.getRoleInfoByUser(account.getId());// 查询账号的角色信息
// this.disableOneToken(account.getId(), roleInfo.getId(), JwtConstant.SXTB_ACCOUNT_TOKEN);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
feignAuthUserPwd
(
Integer
id
,
String
authPwd
)
{
UserAccountDO
account
=
userServiceDao
.
getUserAuthPwdInfo
(
id
);
if
(
account
==
null
)
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_ACCOUNT_NOT_EXIT_ERROR
);
}
String
pwd
=
""
;
try
{
pwd
=
PwdUtil
.
securityPwd
(
authPwd
);
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CREATE_ERROR
);
}
if
(!
pwd
.
equals
(
account
.
getPassword
()))
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CONPARED_ERROR
);
}
return
ResultBody
.
success
();
}
}
csm-service/cms-service-user/src/main/resources/mapper/CooperationDao.xml
浏览文件 @
ace6ad4a
...
...
@@ -9,6 +9,11 @@
values(#{cooperationTagId}, #{userAccountId}, #{applyName}, #{applyPhone}, #{remark}, NOW())
</insert>
<insert
id=
"insertUserTag"
useGeneratedKeys=
"true"
parameterType=
"com.mmc.iuav.user.entity.UserTagDO"
keyProperty=
"id"
>
insert into user_tag(user_account_id, cooperation_tag_id, create_time)
values(#{userAccountId}, #{cooperationTagId}, NOW());
</insert>
<update
id=
"updateUserApplyTag"
parameterType=
"com.mmc.iuav.user.entity.UserApplyTagDO"
>
UPDATE user_apply_tag
<set>
...
...
@@ -34,6 +39,10 @@
WHERE id = #{id};
</update>
<update
id=
"updateUserTag"
>
update user_tag set cooperation_tag_id = #{cooperationTagId} where id = #{id}
</update>
<select
id=
"listTags"
resultType=
"com.mmc.iuav.user.entity.CooperationTagDO"
>
select id, tag_name, tag_img, tag_description, create_time from cooperation_tag
</select>
...
...
@@ -43,4 +52,10 @@
from user_apply_tag
where user_account_id = #{userAccountId} and is_deleted = 0
</select>
<select
id=
"getUserTag"
resultType=
"com.mmc.iuav.user.entity.UserTagDO"
>
select id, user_account_id, cooperation_tag_id,is_deleted as deleted, create_time, update_time
from user_tag
where user_account_id = #{userAccountId} and is_deleted = 0
</select>
</mapper>
\ No newline at end of file
csm-service/cms-service-user/src/main/resources/mapper/UserServiceDao.xml
浏览文件 @
ace6ad4a
...
...
@@ -27,13 +27,16 @@
<insert
id=
"insertUserAccount"
parameterType=
"com.mmc.iuav.user.entity.UserAccountDO"
useGeneratedKeys=
"true"
keyProperty=
"id"
>
insert into user_account(account_type, uid,
phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, sourc
e, remark, port_type, create_time)
values(#{accountType}, #{uid}, #{
phoneNum}, #{userName}, #{nickName}, #{userImg}, #{openId}, #{unionId}, #{userSex}, #{email}, #{sourc
e}, #{remark}, #{portType}, NOW())
insert into user_account(account_type, uid,
account_no, pass_word, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source,province_code, city_code, district_cod
e, remark, port_type, create_time)
values(#{accountType}, #{uid}, #{
accountNo}, #{password}, #{phoneNum}, #{userName}, #{nickName}, #{userImg}, #{openId}, #{unionId}, #{userSex}, #{email}, #{source}, #{provinceCode}, #{cityCode}, #{districtCod
e}, #{remark}, #{portType}, NOW())
</insert>
<update
id=
"update"
parameterType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
update user_account
<set>
<if
test=
"accountNo != null"
>
account_no = #{accountNo},
</if>
<if
test=
"phoneNum != null"
>
phone_num = #{phoneNum},
</if>
...
...
@@ -55,6 +58,15 @@
<if
test=
"accountStatus != null"
>
account_status = #{accountStatus},
</if>
<if
test=
"provinceCode != null"
>
province_code = #{provinceCode},
</if>
<if
test=
"cityCode != null"
>
city_code = #{cityCode},
</if>
<if
test=
"districtCode != null"
>
district_code = #{districtCode},
</if>
<if
test=
"remark != null"
>
remark = #{remark},
</if>
...
...
@@ -67,6 +79,16 @@
</where>
</update>
<update
id=
"removeUserAccount"
>
update user_account set is_deleted = 1, union_id = #{removeNO} where id = #{userAccountId}
</update>
<update
id=
"updatePassword"
>
update user_account
set pass_word=#{passWord}
where id = #{id}
</update>
<select
id=
"getUserAccountInfoByUnionId"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
select id, account_type, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted, create_time, update_time
...
...
@@ -94,4 +116,99 @@
and district_code = #{districtCode}
</if>
</select>
<select
id=
"getUserLoginInfo"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
select ua.id,
ua.account_no,
ua.pass_word,
ua.account_status,
ua.account_type,
ua.user_name
from user_account ua
where ua.is_deleted = 0
and BINARY ua.account_no = #{accountNo}
</select>
<select
id=
"feignListBAccountPage"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
parameterType=
"com.mmc.iuav.user.model.qo.BUserAccountQO"
>
select id, account_type, account_no, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted as deleted, create_time, update_time
from user_account
where is_deleted = 0 and port_type = 0
<if
test=
" userIds != null "
>
<foreach
collection=
"userIds"
item=
"id"
open=
"and id in ("
close=
")"
separator=
","
>
#{id}
</foreach>
</if>
<if
test=
"provinceCode != null"
>
and province_code = #{provinceCode}
</if>
<if
test=
"cityCode != null"
>
and city_code = #{cityCode}
</if>
<if
test=
"districtCode != null"
>
and district_code = #{districtCode}
</if>
</select>
<select
id=
"countUserAccountNo"
resultType=
"java.lang.Integer"
>
select count(*) from user_account
where account_no = #{accountNo} and is_deleted = 0 and port_type = 0
<if
test=
"excludeId != null"
>
and id != #{excludeId}
</if>
</select>
<select
id=
"countListBAccountPage"
resultType=
"java.lang.Integer"
parameterType=
"com.mmc.iuav.user.model.qo.BUserAccountQO"
>
select count(*) from user_account
where is_deleted = 0 and port_type = 0
<if
test=
" keyword != null and keyword != '' "
>
and ( account_no like CONCAT("%",#{keyword},"%") or
user_name like CONCAT("%",#{keyword},"%") )
</if>
<if
test=
"provinceCode != null"
>
and province_code = #{provinceCode}
</if>
<if
test=
"cityCode != null"
>
and city_code = #{cityCode}
</if>
<if
test=
"districtCode != null"
>
and district_code = #{districtCode}
</if>
<if
test=
"accountStatus != null"
>
and account_status = #{accountStatus}
</if>
</select>
<select
id=
"listBAccountPage"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
parameterType=
"com.mmc.iuav.user.model.qo.BUserAccountQO"
>
select id, account_type, account_no, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted as deleted, create_time, update_time
from user_account
where is_deleted = 0 and port_type = 0
<if
test=
" keyword != null and keyword != '' "
>
and ( account_no like CONCAT("%",#{keyword},"%") or
user_name like CONCAT("%",#{keyword},"%") )
</if>
<if
test=
"provinceCode != null"
>
and province_code = #{provinceCode}
</if>
<if
test=
"cityCode != null"
>
and city_code = #{cityCode}
</if>
<if
test=
"districtCode != null"
>
and district_code = #{districtCode}
</if>
<if
test=
"accountStatus != null"
>
and account_status = #{accountStatus}
</if>
</select>
<select
id=
"getUserAuthPwdInfo"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
select id,
account_no,
pass_word
from user_account
where is_deleted = 0
and id =
#{id}
</select>
</mapper>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论