|
|
@ -1,5 +1,6 @@ |
|
|
|
import io |
|
|
|
import pandas as pd |
|
|
|
import requests |
|
|
|
from datetime import datetime |
|
|
|
from fastapi import Request, UploadFile |
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession |
|
|
@ -34,6 +35,7 @@ from module_admin.service.role_service import RoleService |
|
|
|
from utils.common_util import CamelCaseUtil, export_list2excel, get_excel_template |
|
|
|
from utils.page_util import PageResponseModel |
|
|
|
from utils.pwd_util import PwdUtil |
|
|
|
from config.env import AppConfig |
|
|
|
|
|
|
|
|
|
|
|
class UserService: |
|
|
@ -144,14 +146,19 @@ class UserService: |
|
|
|
return CommonConstant.UNIQUE |
|
|
|
|
|
|
|
@classmethod |
|
|
|
async def add_user_services(cls, query_db: AsyncSession, page_object: AddUserModel): |
|
|
|
async def add_user_services(cls, query_db: AsyncSession, page_object: AddUserModel, |
|
|
|
currentUserName: str, currentPassword: str): |
|
|
|
""" |
|
|
|
新增用户信息service |
|
|
|
|
|
|
|
:param currentPassword: 当前用户密码 |
|
|
|
:param currentUserName: 当前用户名 |
|
|
|
:param query_db: orm对象 |
|
|
|
:param page_object: 新增用户对象 |
|
|
|
:return: 新增用户校验结果 |
|
|
|
""" |
|
|
|
dsPassword = page_object.password |
|
|
|
page_object.password = PwdUtil.md5_hash(page_object.password) |
|
|
|
add_user = UserModel(**page_object.model_dump(by_alias=True)) |
|
|
|
if not await cls.check_user_name_unique_services(query_db, page_object): |
|
|
|
raise ServiceException(message=f'新增用户{page_object.user_name}失败,登录账号已存在') |
|
|
@ -161,6 +168,23 @@ class UserService: |
|
|
|
raise ServiceException(message=f'新增用户{page_object.user_name}失败,邮箱账号已存在') |
|
|
|
else: |
|
|
|
try: |
|
|
|
payload = {'userName': page_object.user_name, |
|
|
|
'userPassword': dsPassword, |
|
|
|
'tenantId': 1, |
|
|
|
'queue': '', |
|
|
|
'email': page_object.email, |
|
|
|
'phone': page_object.phonenumber, |
|
|
|
'state': 1 if page_object.status == '0' else 0 |
|
|
|
} |
|
|
|
headers = {'dashUserName': currentUserName, 'dashPassword': currentPassword} |
|
|
|
response_post = requests.post(url=AppConfig.ds_server_url+'/dolphinscheduler/users/create', |
|
|
|
params=payload, |
|
|
|
headers=headers, verify=False) |
|
|
|
if response_post.status_code != 200: |
|
|
|
if response_post.status_code != 201: |
|
|
|
raise Exception("服务异常,请确保各节点是否在线") |
|
|
|
if not response_post.json().get('success'): |
|
|
|
raise Exception(response_post.json().get('msg')) |
|
|
|
add_result = await UserDao.add_user_dao(query_db, add_user) |
|
|
|
user_id = add_result.user_id |
|
|
|
if page_object.role_ids: |
|
|
@ -176,10 +200,13 @@ class UserService: |
|
|
|
raise e |
|
|
|
|
|
|
|
@classmethod |
|
|
|
async def edit_user_services(cls, query_db: AsyncSession, page_object: EditUserModel): |
|
|
|
async def edit_user_services(cls, query_db: AsyncSession, page_object: EditUserModel, |
|
|
|
currentUserName: str, currentPassword: str): |
|
|
|
""" |
|
|
|
编辑用户信息service |
|
|
|
|
|
|
|
:param currentPassword: 当前用户密码 |
|
|
|
:param currentUserName: 当前用户名称 |
|
|
|
:param query_db: orm对象 |
|
|
|
:param page_object: 编辑用户对象 |
|
|
|
:return: 编辑用户校验结果 |
|
|
@ -201,6 +228,24 @@ class UserService: |
|
|
|
elif page_object.email and not await cls.check_email_unique_services(query_db, page_object): |
|
|
|
raise ServiceException(message=f'修改用户{page_object.user_name}失败,邮箱账号已存在') |
|
|
|
try: |
|
|
|
payload = { |
|
|
|
'id': -1, |
|
|
|
'userName': user_info.data.user_name, |
|
|
|
'userPassword': page_object.password if page_object.password else '', |
|
|
|
'email': page_object.email if page_object.email else '', |
|
|
|
'phone': page_object.phonenumber if page_object.phonenumber else '', |
|
|
|
'tenantId': -1, |
|
|
|
'state': 1 if (page_object.status is None or page_object.status == '0') else 0 |
|
|
|
} |
|
|
|
headers = {'dashUserName': currentUserName, 'dashPassword': currentPassword} |
|
|
|
response_post = requests.post(url=AppConfig.ds_server_url+'/dolphinscheduler/users/update', |
|
|
|
params=payload, |
|
|
|
headers=headers, verify=False) |
|
|
|
if response_post.status_code != 200: |
|
|
|
if response_post.status_code != 201: |
|
|
|
raise Exception("服务异常,请确保各节点是否在线") |
|
|
|
if not response_post.json().get('success'): |
|
|
|
raise Exception(response_post.json().get('msg')) |
|
|
|
await UserDao.edit_user_dao(query_db, edit_user) |
|
|
|
if page_object.type != 'status' and page_object.type != 'avatar' and page_object.type != 'pwd': |
|
|
|
await UserDao.delete_user_role_dao(query_db, UserRoleModel(userId=page_object.user_id)) |
|
|
@ -224,10 +269,13 @@ class UserService: |
|
|
|
raise ServiceException(message='用户不存在') |
|
|
|
|
|
|
|
@classmethod |
|
|
|
async def delete_user_services(cls, query_db: AsyncSession, page_object: DeleteUserModel): |
|
|
|
async def delete_user_services(cls, query_db: AsyncSession, page_object: DeleteUserModel, |
|
|
|
currentUserName: str, currentPassword: str): |
|
|
|
""" |
|
|
|
删除用户信息service |
|
|
|
|
|
|
|
:param currentPassword: 当前用户密码 |
|
|
|
:param currentUserName: 当前用户名称 |
|
|
|
:param query_db: orm对象 |
|
|
|
:param page_object: 删除用户对象 |
|
|
|
:return: 删除用户校验结果 |
|
|
@ -236,9 +284,23 @@ class UserService: |
|
|
|
user_id_list = page_object.user_ids.split(',') |
|
|
|
try: |
|
|
|
for user_id in user_id_list: |
|
|
|
user_info = await cls.user_detail_services(query_db, user_id) |
|
|
|
user_id_dict = dict( |
|
|
|
userId=user_id, updateBy=page_object.update_by, updateTime=page_object.update_time |
|
|
|
) |
|
|
|
payload = { |
|
|
|
'id': -1, |
|
|
|
'userName': user_info.user.user_name |
|
|
|
} |
|
|
|
headers = {'dashUserName': currentUserName, 'dashPassword': currentPassword} |
|
|
|
response_post = requests.post(url=AppConfig.ds_server_url+'/dolphinscheduler/users/delete', |
|
|
|
params=payload, |
|
|
|
headers=headers, verify=False) |
|
|
|
if response_post.status_code != 200: |
|
|
|
if response_post.status_code != 201: |
|
|
|
raise Exception("服务异常,请确保各节点是否在线") |
|
|
|
if not response_post.json().get('success'): |
|
|
|
raise Exception(response_post.json().get('msg')) |
|
|
|
await UserDao.delete_user_role_dao(query_db, UserRoleModel(**user_id_dict)) |
|
|
|
await UserDao.delete_user_post_dao(query_db, UserPostModel(**user_id_dict)) |
|
|
|
await UserDao.delete_user_dao(query_db, UserModel(**user_id_dict)) |
|
|
@ -312,18 +374,23 @@ class UserService: |
|
|
|
) |
|
|
|
|
|
|
|
@classmethod |
|
|
|
async def reset_user_services(cls, query_db: AsyncSession, page_object: ResetUserModel): |
|
|
|
async def reset_user_services(cls, query_db: AsyncSession, page_object: ResetUserModel, |
|
|
|
currentUserName: str, currentPassword: str): |
|
|
|
""" |
|
|
|
重置用户密码service |
|
|
|
|
|
|
|
:param currentPassword: 当前用户密码 |
|
|
|
:param currentUserName: 当前用户名 |
|
|
|
:param query_db: orm对象 |
|
|
|
:param page_object: 重置用户对象 |
|
|
|
:return: 重置用户校验结果 |
|
|
|
""" |
|
|
|
dsPassword = page_object.password |
|
|
|
page_object.password = PwdUtil.md5_hash(page_object.password) |
|
|
|
reset_user = page_object.model_dump(exclude_unset=True, exclude={'admin'}) |
|
|
|
user = (await UserDao.get_user_detail_by_id(query_db, user_id=page_object.user_id)).get('user_basic_info') |
|
|
|
if page_object.old_password: |
|
|
|
user = (await UserDao.get_user_detail_by_id(query_db, user_id=page_object.user_id)).get('user_basic_info') |
|
|
|
if not page_object.old_password == user.password: |
|
|
|
if not PwdUtil.md5_hash(page_object.old_password) == user.password: |
|
|
|
raise ServiceException(message='修改密码失败,旧密码错误') |
|
|
|
elif page_object.password == user.password: |
|
|
|
raise ServiceException(message='新密码不能与旧密码相同') |
|
|
@ -333,8 +400,24 @@ class UserService: |
|
|
|
del reset_user['sms_code'] |
|
|
|
del reset_user['session_id'] |
|
|
|
try: |
|
|
|
# reset_user['password'] = PwdUtil.get_password_hash(page_object.password) |
|
|
|
reset_user['password'] = page_object.password |
|
|
|
payload = { |
|
|
|
'id': -1, |
|
|
|
'userName': user.user_name, |
|
|
|
'userPassword': dsPassword, |
|
|
|
'email': user.email, |
|
|
|
'phone': user.phonenumber, |
|
|
|
'tenantId': -1, |
|
|
|
'state': 1 if user.status == '0' else 0 |
|
|
|
} |
|
|
|
headers = {'dashUserName': currentUserName, 'dashPassword': currentPassword} |
|
|
|
response_post = requests.post(url=AppConfig.ds_server_url+'/dolphinscheduler/users/update', |
|
|
|
params=payload, |
|
|
|
headers=headers, verify=False) |
|
|
|
if response_post.status_code != 200: |
|
|
|
if response_post.status_code != 201: |
|
|
|
raise Exception("服务异常,请确保各节点是否在线") |
|
|
|
if not response_post.json().get('success'): |
|
|
|
raise Exception(response_post.json().get('msg')) |
|
|
|
await UserDao.edit_user_dao(query_db, reset_user) |
|
|
|
await query_db.commit() |
|
|
|
return CrudResponseModel(is_success=True, message='重置成功') |
|
|
@ -380,6 +463,9 @@ class UserService: |
|
|
|
df.rename(columns=header_dict, inplace=True) |
|
|
|
add_error_result = [] |
|
|
|
count = 0 |
|
|
|
pwd = await ConfigService.query_config_list_from_cache_services( |
|
|
|
request.app.state.redis, 'sys.user.initPassword' |
|
|
|
) |
|
|
|
try: |
|
|
|
for index, row in df.iterrows(): |
|
|
|
count = count + 1 |
|
|
@ -396,11 +482,7 @@ class UserService: |
|
|
|
add_user = UserModel( |
|
|
|
deptId=row['dept_id'], |
|
|
|
userName=row['user_name'], |
|
|
|
password=PwdUtil.get_password_hash( |
|
|
|
await ConfigService.query_config_list_from_cache_services( |
|
|
|
request.app.state.redis, 'sys.user.initPassword' |
|
|
|
) |
|
|
|
), |
|
|
|
password=PwdUtil.md5_hash(pwd), |
|
|
|
nickName=row['nick_name'], |
|
|
|
email=row['email'], |
|
|
|
phonenumber=str(row['phonenumber']), |
|
|
@ -436,6 +518,24 @@ class UserService: |
|
|
|
query_db, edit_user_model.dept_id, dept_data_scope_sql |
|
|
|
) |
|
|
|
edit_user = edit_user_model.model_dump(exclude_unset=True) |
|
|
|
payload = { |
|
|
|
'id': -1, |
|
|
|
'userName': user_info.user.user_name, |
|
|
|
'userPassword': '', |
|
|
|
'email': edit_user.email if edit_user.email else '', |
|
|
|
'phone': edit_user.phonenumber if edit_user.phonenumber else '', |
|
|
|
'tenantId': -1, |
|
|
|
'state': 1 if edit_user.status == '0' else 0 |
|
|
|
} |
|
|
|
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password} |
|
|
|
response_post = requests.post(url=AppConfig.ds_server_url+'/dolphinscheduler/users/update', |
|
|
|
params=payload, |
|
|
|
headers=headers, verify=False) |
|
|
|
if response_post.status_code != 200: |
|
|
|
if response_post.status_code != 201: |
|
|
|
raise Exception("服务异常,请确保各节点是否在线") |
|
|
|
if not response_post.json().get('success'): |
|
|
|
raise Exception(response_post.json().get('msg')) |
|
|
|
await UserDao.edit_user_dao(query_db, edit_user) |
|
|
|
else: |
|
|
|
add_error_result.append(f"{count}.用户账号{row['user_name']}已存在") |
|
|
@ -445,6 +545,23 @@ class UserService: |
|
|
|
await DeptService.check_dept_data_scope_services( |
|
|
|
query_db, add_user.dept_id, dept_data_scope_sql |
|
|
|
) |
|
|
|
payload = {'userName': add_user.user_name, |
|
|
|
'userPassword': pwd, |
|
|
|
'tenantId': 1, |
|
|
|
'queue': '', |
|
|
|
'email': add_user.email, |
|
|
|
'phone': add_user.phonenumber, |
|
|
|
'state': 1 if add_user.status == '0' else 0 |
|
|
|
} |
|
|
|
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password} |
|
|
|
response_post = requests.post(url=AppConfig.ds_server_url+'/dolphinscheduler/users/create', |
|
|
|
params=payload, |
|
|
|
headers=headers, verify=False) |
|
|
|
if response_post.status_code != 200: |
|
|
|
if response_post.status_code != 201: |
|
|
|
raise Exception("服务异常,请确保各节点是否在线") |
|
|
|
if not response_post.json().get('success'): |
|
|
|
raise Exception(response_post.json().get('msg')) |
|
|
|
await UserDao.add_user_dao(query_db, add_user) |
|
|
|
await query_db.commit() |
|
|
|
return CrudResponseModel(is_success=True, message='\n'.join(add_error_result)) |
|
|
|