1.登录注册,禁止解禁账号

2.基本信息新增/查询
This commit is contained in:
李伟 2022-08-02 16:28:38 +08:00
parent 8cb1391844
commit 5a2a2eb316
12 changed files with 382 additions and 40 deletions

View File

@ -1,20 +1,27 @@
import operator import operator
import os import os
import re import re
from typing import Any
import pandas as pd import pandas as pd
import pymongo import pymongo
from fastapi import APIRouter, Depends, Request, File, UploadFile from fastapi import APIRouter, Depends, Request, File, UploadFile
from fastapi.security import OAuth2PasswordRequestForm
from motor.motor_asyncio import AsyncIOMotorDatabase from motor.motor_asyncio import AsyncIOMotorDatabase
from api import deps from api import deps
from utils.dingding import get_redis_alluid, send_dates # from utils.dingding import get_redis_alluid, send_dates,unionid,get_alluid_list
from core import security
from core.config import settings
from core.security import get_password_hash
from utils.dingding import *
from utils.jianli import get_resume from utils.jianli import get_resume
import crud, schemas import crud, schemas
from datetime import datetime from datetime import datetime
from core.configuration import * from core.configuration import *
from db import get_database from db import get_database
from db.ckdb import get_ck_db, CKDrive from db.ckdb import get_ck_db, CKDrive
from datetime import timedelta
from models.interview_zsgc import InterviewDo from models.interview_zsgc import InterviewDo
from utils import get_time, qujian_time, Download_xlsx, send_str_mail from utils import get_time, qujian_time, Download_xlsx, send_str_mail
@ -245,19 +252,19 @@ async def interview_insert(
if data_in.time_type == 'now': if data_in.time_type == 'now':
# 查询返回的数据一共多少条 # 查询返回的数据一共多少条
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) == '{times}' ORDER BY event_time""" len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) == '{times}' ORDER BY event_time"""
sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid, sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid,interview_id,
feedback,interview_name from HR.resumes where {where} and toDate(star_time) == '{times}' ORDER BY event_time feedback,interview_name from HR.resumes where {where} and toDate(star_time) == '{times}' ORDER BY event_time
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}""" LIMIT 10 OFFSET {(data_in.pages - 1) * 10}"""
# 明天及之后的面试 # 明天及之后的面试
elif data_in.time_type == 'tomorrow': elif data_in.time_type == 'tomorrow':
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) > '{times}' ORDER BY event_time""" len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) > '{times}' ORDER BY event_time"""
sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid, sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid,interview_id,
feedback,interview_name from HR.resumes where {where} and toDate(star_time) > '{times}' ORDER BY event_time feedback,interview_name from HR.resumes where {where} and toDate(star_time) > '{times}' ORDER BY event_time
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}""" LIMIT 10 OFFSET {(data_in.pages - 1) * 10}"""
# 昨天及以前的面试 # 昨天及以前的面试
else: else:
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) < '{times}' ORDER BY event_time""" len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) < '{times}' ORDER BY event_time"""
sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid, sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid,interview_id,
feedback,interview_name from HR.resumes where {where} and toDate(star_time) < '{times}' ORDER BY event_time feedback,interview_name from HR.resumes where {where} and toDate(star_time) < '{times}' ORDER BY event_time
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}""" LIMIT 10 OFFSET {(data_in.pages - 1) * 10}"""
if where == '': if where == '':
@ -291,6 +298,7 @@ async def interview_insert(
date1['type'] = int(df['feedback'][i]) date1['type'] = int(df['feedback'][i])
date1['name'] = df['interview_name'][i] date1['name'] = df['interview_name'][i]
dates['type'] = date1 dates['type'] = date1
dates['interview_id'] = df['interview_id'][i]
datas.append(dates) datas.append(dates)
data = {'lens': len_date, data = {'lens': len_date,
'data': datas 'data': datas
@ -831,3 +839,140 @@ async def event_edit(
else: else:
await crud.email_record.up_hint(db, data_in) await crud.email_record.up_hint(db, data_in)
return schemas.Msg(code=200, msg='ok', data='') return schemas.Msg(code=200, msg='ok', data='')
@router.post("/login")
async def login(
data_in: schemas.Login,
data: OAuth2PasswordRequestForm = Depends(),
db: AsyncIOMotorDatabase = Depends(get_database)
) -> Any:
"""
OAuth2兼容令牌登录获取将来令牌的访问令牌
"""
user_id = Unionid(data_in.unionid)
user_list = get_alluid_list()
if user_id not in user_list:
return schemas.Msg(code=-1, msg='密码或用户名错误')
user = await crud.user.gets_user(db, user_id=user_id)
if user.state == 1:
return schemas.Msg(code=-1, msg='您的账号已被锁定,请联系管理员解锁')
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
await crud.user.update_login_time(db, user.id) # 更新最后一次登录时间
return {
'data': {
'name': user.name, # 名字
'email': user.email, # 邮箱
'tel': user.tel, # 电话
'user_id': user.id, # 钉钉id
'rank': user.rank, # 区分hr和面试官
'token': security.create_access_token(
expires_delta=access_token_expires, user_id=user.user_id, email=user.email,
tel=user.tel, name=user.name),
"token_type": "bearer"},
'access_token': security.create_access_token(
expires_delta=access_token_expires, user_id=user.user_id, email=user.email,
tel=user.tel, name=user.name
),
"token_type": "bearer",
'code': 200,
'msg': 'success',
}
@router.post("/reset_password")
async def reset_password(request: Request,
data_in: schemas.UserRestPassword,
db: AsyncIOMotorDatabase = Depends(get_database),
#current_user: schemas.User = Depends(deps.get_current_user)
) -> Any:
"""
修改其他人密码
"""
try:
await crud.user.reset_password(db, data_in)
except Exception as e:
return schemas.Msg(code=-9, msg='修改失败', data={'username': data_in})
return schemas.Msg(code=200, msg='ok')
@router.post("/reset_my_password")
async def reset_password(request: Request,
data_in: schemas.UserRestMyPassword,
db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.User = Depends(deps.get_current_user)
) -> Any:
"""
修改自己的密码
"""
await crud.user.reset_password(db,
schemas.UserRestPassword(user_id=current_user.user_id, password=data_in.password))
return schemas.Msg(code=200, msg='ok')
@router.post("/add_account")
async def all_account(
request: Request,
data_in: schemas.Createuser,
db: AsyncIOMotorDatabase = Depends(get_database),
# current_user: schemas.User = Depends(deps.get_current_user)
) -> schemas.Msg:
"""
创建新账号
"""
user_id = Unionid(data_in.unionid)
user_list = get_alluid_list()
if user_id not in user_list:
return schemas.Msg(code=-9, msg="不是本公司的员工")
if is_exists := await crud.user.exists(db, {'user_id': user_id}):
return schemas.Msg(code=-9, msg='已创建该账号')
else:
new_account = schemas.UserCreate(name=data_in.name, hashed_password=get_password_hash('123'),
unionid=data_in.unionid,
rank=data_in.rank, email=data_in.email, tel=data_in.tel, user_id=user_id)
await crud.user.create(db, new_account) # 创建账号
return schemas.Msg(code=200, msg='创建成功', data='')
@router.post("/forbid_login")
async def forbid_lojin(request: Request,
data_in: schemas.Get_userid,
db: AsyncIOMotorDatabase = Depends(get_database),
#current_user: schemas.User = Depends(deps.get_current_user)
) -> schemas.Msg:
"""
禁止/解禁用户登录功能
"""
if data_in.type == 1:
await crud.user.forbid_lojin(db, data_in,1)
elif data_in.type == 0:
await crud.user.forbid_lojin(db, data_in, 0)
return schemas.Msg(code=200, msg='ok', data='')
@router.post("/owner_list")
async def event_list(
request: Request,
data_in: schemas.Getdate,
db: AsyncIOMotorDatabase = Depends(get_database),
#current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""获取基本信息列表"""
try:
res = await crud.basic_data.one_owner(db, data_in)
except Exception as e:
return schemas.Msg(code=-9, msg='查无数据', data='')
return schemas.Msg(code=200, msg='ok', data=res)
@router.post("/owner_edit")
async def event_edit(
request: Request,
data_in: schemas.Ownername,
db: AsyncIOMotorDatabase = Depends(get_database),
#current_user: schemas.UserDB = Depends(deps.get_current_user)
) -> schemas.Msg:
"""新增,删除基本信息"""
await crud.basic_data.update(db, data_in)
return schemas.Msg(code=200, msg='ok', data='')

View File

@ -14,14 +14,12 @@ from db import get_database
from db.ckdb import CKDrive, get_ck_db from db.ckdb import CKDrive, get_ck_db
reusable_oauth2 = OAuth2PasswordBearer( reusable_oauth2 = OAuth2PasswordBearer(
tokenUrl=f"{settings.API_V1_STR}/user/login" tokenUrl=f"{settings.API_V1_STR}/itr/login"
) )
def get_current_user(token: str = Depends(reusable_oauth2) def get_current_user(token: str = Depends(reusable_oauth2)
) -> schemas.UserDB: ) -> schemas.UserDB:
# def get_current_user(token: str
# ) -> schemas.UserDBBase:
try: try:
payload = jwt.decode( payload = jwt.decode(
token, settings.SECRET_KEY, algorithms=[security.ALGORITHM] token, settings.SECRET_KEY, algorithms=[security.ALGORITHM]

View File

@ -21,7 +21,7 @@ class Settings(BaseSettings):
DEFAULT_PASSWORD = '123456' DEFAULT_PASSWORD = '123456'
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8 ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 # 登录后一天过期
SECRET_KEY: str = 'ZaFX6EypK6PtuhGv11q4DLRvAb0csiLx4dbKUwLwCe8' SECRET_KEY: str = 'ZaFX6EypK6PtuhGv11q4DLRvAb0csiLx4dbKUwLwCe8'
REDIS_CONF = { REDIS_CONF = {

View File

@ -30,3 +30,4 @@ from .crud_interview_record import interview_record
from .crud_worker_info import worker_info from .crud_worker_info import worker_info
from .crud_owner_info import owner_info from .crud_owner_info import owner_info
from .crud_count_in_worker import count_in_worker from .crud_count_in_worker import count_in_worker
from .crud_basic_data import basic_data

28
crud/crud_basic_data.py Normal file
View File

@ -0,0 +1,28 @@
from motor.motor_asyncio import AsyncIOMotorDatabase
import schemas
from crud.base import CRUDBase
__all__ = 'basic_data',
class CRUDOwnername(CRUDBase):
# 获取所有的基本信息数据
async def all_owner(self, db: AsyncIOMotorDatabase):
return await self.find_many(db, {}, {'_id': 0, 'chinese': 0})
# 获取对应的基础数据
async def one_owner(self, db: AsyncIOMotorDatabase, data_in: schemas.Getdate):
return await self.find_one(db, {'name': data_in.name}, {'_id': 0, 'chinese': 0})
# 修改、添加渠道数据
async def update(self, db: AsyncIOMotorDatabase, data_in: schemas.Ownername):
await self.update_one(db, {'name': data_in.name}, {'$set': {'date': data_in.date}})
# 插入数据
# async def create(self, db: AsyncIOMotorDatabase, data_in: schemas.ProjectnumberInsert):
# # await self.update_one(db, {'xiangmu': data_in.xiangmu}, {'$set': data_in.dict()}, upsert=True)
# await self.update_one(db, {data_in.game, data_in.ditch}, upsert=True)
#
basic_data = CRUDOwnername('basic_data')

View File

@ -21,31 +21,31 @@ class CRUDUser(CRUDBase):
res = await db[self.coll_name].find_one({'name': name}) res = await db[self.coll_name].find_one({'name': name})
return res return res
# 获取用户信息
async def get_user(self, db: AsyncIOMotorDatabase, user_id: str):
res = await db[self.coll_name].find_one({'user_id': user_id})
return res
async def edit_profile(self, db: AsyncIOMotorDatabase, data_id: schemas.UserProfileEdit, user_id): async def edit_profile(self, db: AsyncIOMotorDatabase, data_id: schemas.UserProfileEdit, user_id):
if data_id.nickname: if data_id.nickname:
await self.update_one(db, {'_id': user_id}, {'$set': {'nickname': data_id.nickname}}) await self.update_one(db, {'_id': user_id}, {'$set': {'nickname': data_id.nickname}})
if data_id.tel: if data_id.tel:
await self.update_one(db, {'_id': user_id}, {'$set': {'tel': data_id.tel}}) await self.update_one(db, {'_id': user_id}, {'$set': {'tel': data_id.tel}})
async def update_login_time(self, db, name): async def update_login_time(self, db, id):
await self.update_one(db, {'name': name}, await self.update_one(db, {'id': id},
{'$set': {'last_login_ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}}) {'$set': {'last_login_ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}})
pass
async def create(self, db: AsyncIOMotorDatabase, obj_in: UserCreate): async def create(self, db: AsyncIOMotorDatabase, obj_in: UserCreate):
db_obj = UserDBRW( db_obj = UserDBRW(
email=obj_in.email, **obj_in.dict(),
hashed_password=get_password_hash(obj_in.password),
name=obj_in.name,
is_superuser=obj_in.is_superuser,
nickname=obj_in.nickname,
_id=get_uid() _id=get_uid()
) )
await db[self.coll_name].insert_one(db_obj.dict(by_alias=True)) await db[self.coll_name].insert_one(db_obj.dict(by_alias=True))
return db_obj.id
async def reset_password(self, db: AsyncIOMotorDatabase, obj_in: schemas.UserRestPassword): async def reset_password(self, db: AsyncIOMotorDatabase, obj_in: schemas.UserRestPassword):
hashed_password = get_password_hash(obj_in.password) hashed_password = get_password_hash(obj_in.password)
await self.update_one(db, {'name': obj_in.username}, {'$set': {'hashed_password': hashed_password}}) await self.update_one(db, {'user_id': obj_in.user_id}, {'$set': {'hashed_password': hashed_password}})
async def authenticate(self, db: AsyncIOMotorDatabase, name: str, password: str): async def authenticate(self, db: AsyncIOMotorDatabase, name: str, password: str):
user_obj = await self.get_by_user(db, name=name) user_obj = await self.get_by_user(db, name=name)
@ -72,5 +72,14 @@ class CRUDUser(CRUDBase):
async def create_index(self, db: AsyncIOMotorDatabase): async def create_index(self, db: AsyncIOMotorDatabase):
await db[self.coll_name].create_index('name', unique=True) await db[self.coll_name].create_index('name', unique=True)
# 登录时获取用户的基本信息
async def gets_user(self, db: AsyncIOMotorDatabase, user_id: str):
user_obj = await self.get_user(db, user_id=user_id)
user_obj = UserDBRW(**user_obj)
return user_obj
# 修改登录权限
async def forbid_lojin(self, db: AsyncIOMotorDatabase, obj_in: schemas.Get_userid,state):
await self.update_one(db, {'user_id': obj_in.user_id}, {'$set': {'state': state}})
user = CRUDUser('user') user = CRUDUser('user')

View File

@ -253,3 +253,53 @@ api:/api/v1/itr/up_hint
请求方式post 请求方式post
参数: 参数:
hint_id: List[str] # 要修改已读的数据id hint_id: List[str] # 要修改已读的数据id
#登录
api:/api/v1/itr/login
请求方式post
参数:
unionid: str # 通过钉钉扫码获取的unionid
#修改其他人密码
api:/api/v1/itr/reset_password
请求方式post
参数:
user_id: str = ...
password: str = ...
#修改自己的密码
api:/api/v1/itr/reset_my_password
请求方式post
参数:
password: str = ...
#创建新账号
api:/api/v1/itr/add_account
请求方式post
参数:
unionid: str # 通过钉钉扫码获取的unionid
rank: int # 判断是hr还是面试官
email: str # 邮箱
tel: str # 手机号
name: str # 名字
#禁止/解禁用户登录功能
api:/api/v1/itr/forbid_login
请求方式post
参数:
user_id: str # 钉钉的唯一标识
type: int # 0为解禁1为禁止
#获取基本信息列表
api:/api/v1/itr/owner_list
请求方式post
参数:
name: str # 基本资料的名称
#新增,删除基本信息
api:/api/v1/itr/owner_edit
请求方式post
参数:
date: List[str] # 各种基本资料
name: str # 基本资料的名称 现有渠道owner_name工作经验job_exp
职能类别function_type职位级别job_rank学历要求education部门sector

View File

@ -36,3 +36,4 @@ from .interview_record import *
from .worker import * from .worker import *
from .owner_info import * from .owner_info import *
from .count_in_worker import * from .count_in_worker import *
from .basic_data import *

17
schemas/basic_data.py Normal file
View File

@ -0,0 +1,17 @@
from pydantic import BaseModel
from typing import List
class Ownername(BaseModel):
date: List[str] # 各种基本资料
name: str # 基本资料的名称
class Basic_data(BaseModel):
date: List[str] # 各种基本资料
name: str # 基本资料的名称
chinese: str # 中文名
class Getdate(BaseModel):
name: str # 基本资料的名称

View File

@ -85,5 +85,23 @@ class Up_hint(BaseModel):
hint_id: List[str] # 要修改已读的数据id hint_id: List[str] # 要修改已读的数据id
type: str type: str
class Get_hr(BaseModel): class Get_hr(BaseModel):
hr_name: str hr_name: str
class Login(BaseModel):
unionid: str # 通过钉钉扫码获取的unionid
class Createuser(BaseModel):
unionid: str # 通过钉钉扫码获取的unionid
rank: int # 判断是hr还是面试官
email: str # 邮箱
tel: str # 手机号
name: str # 名字
class Get_userid(BaseModel):
user_id: str # 钉钉的唯一标识
type: int # 0为解禁1为禁止

View File

@ -1,3 +1,4 @@
from datetime import datetime
from typing import Optional, List, Any from typing import Optional, List, Any
from schemas.base import DBBase from schemas.base import DBBase
@ -20,7 +21,7 @@ class UserProfileEdit(BaseModel):
class User(UserBase): class User(UserBase):
name: str user_id: str
class Users(BaseModel): class Users(BaseModel):
@ -37,7 +38,7 @@ class UserLogin(BaseModel):
class UserRestPassword(BaseModel): class UserRestPassword(BaseModel):
username: str = ... user_id: str = ...
password: str = ... password: str = ...
@ -46,8 +47,13 @@ class UserRestMyPassword(BaseModel):
class UserCreate(UserBase): class UserCreate(UserBase):
password: str hashed_password: str
name: str name: str # 名字
unionid: str # 通过钉钉扫码获取的unionid
rank: int # 判断是hr还是面试官
email: str # 邮箱
tel: str # 手机号
user_id: str # 钉钉的用户id
# **************************************************************************** # ****************************************************************************
@ -64,5 +70,14 @@ class UserDB(DBBase):
data_where: dict = dict() data_where: dict = dict()
class UserDBRW(UserDB): class UserDBRW(DBBase):
hashed_password: str hashed_password: str # 密码
unionid: str # 通过钉钉扫码获取的unionid
rank: int # 判断是hr还是面试官
email: str # 邮箱
tel: str # 手机号
name: str # 名字
last_login_ts: str = '尚未登录' # 登录时间
create_date: datetime = datetime.now() # 创建账号的时间
state: int = 0 # 默认刚创账号是不锁定的
user_id:str # 钉钉里面的用户id

View File

@ -1,9 +1,11 @@
import json import json
import pprint
import redis import redis
import requests import requests
from core.config import Settings from core.config import Settings
Settings = Settings() Settings = Settings()
host = Settings.REDIS_CONF.get('host') host = Settings.REDIS_CONF.get('host')
port = Settings.REDIS_CONF.get('port') port = Settings.REDIS_CONF.get('port')
@ -12,6 +14,7 @@ password=Settings.REDIS_CONF.get('password')
# redisdb = redis.Redis(host=host, port=port, db=db,password=password) # redisdb = redis.Redis(host=host, port=port, db=db,password=password)
redisdb = redis.Redis(host=host, port=port, db=db) redisdb = redis.Redis(host=host, port=port, db=db)
def get_token(): def get_token():
""" """
获取钉钉token 获取钉钉token
@ -171,7 +174,7 @@ def get_all_uid():
def get_redis_alluid(): def get_redis_alluid():
""" """
获取redis中存的所有部门钉钉用户id如没有重新获取再存数据库中再获取 获取redis中存的所有部门钉钉用户id如没有重新获取再存数据库中再获取
:return: list :return: list #包含有所在部门
""" """
redisuid = redisdb.get('user_id') redisuid = redisdb.get('user_id')
if redisuid == None: if redisuid == None:
@ -182,6 +185,7 @@ def get_redis_alluid():
user = redisuid.decode() user = redisuid.decode()
return json.loads(user) return json.loads(user)
def send_dates(content, userid_list): def send_dates(content, userid_list):
""" """
发送消息至钉钉的通用模板 发送消息至钉钉的通用模板
@ -209,6 +213,62 @@ def send_dates(content,userid_list):
# 发送消息到钉钉 # 发送消息到钉钉
requests.post(url=url, params=query, data=json_data) requests.post(url=url, params=query, data=json_data)
def Unionid(unionid):
"""
根据unionid获取用户userid
:param unionid: 企业账号范围内的唯一标识
:return: 用户userid
"""
url = "https://oapi.dingtalk.com/topapi/user/getbyunionid"
query = {
'access_token': get_redistoken()
}
data = {'unionid': unionid}
r = requests.post(url=url, params=query, data=data)
datas = r.json()
return datas.get('result').get('userid')
def user_details(userid):
"""
根据userid获取用户详情
:param userid: 钉钉用户userid
:return:
"""
url = "https://oapi.dingtalk.com/topapi/v2/user/get"
query = {
'access_token': get_redistoken()
}
data = {'userid': userid}
r = requests.post(url=url, params=query, data=data)
datas = r.json()
return datas
def get_user_list():
"""
获取所有部门钉钉用户id,list返回
"""
user=get_redis_alluid()
user_list = []
for i in user:
for ii in i.get('user_id'):
user_list.append(ii.get('userid'))
return user_list
def get_alluid_list():
"""
获取redis中存的所有部门钉钉用户id如没有重新获取再存数据库中再获取
:return: list #直接列表里面包含user_id,没有其他的
"""
redisuid = redisdb.get('user_id_list')
if redisuid == None:
user_list = get_user_list()
user_list = json.dumps(user_list)
redisdb.set(name='user_id_list', value=user_list, ex=86400) # 存一天时间
redisuid = redisdb.get('user_id_list')
user = redisuid.decode()
return json.loads(user)
if __name__ == '__main__': if __name__ == '__main__':
a=get_redis_alluid() #a = user_details('16371426094531014')
print(a) a=get_alluid_list()
pprint.pprint(a)