main.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. # fastapi
  2. from fastapi import FastAPI, Request, Response, HTTPException, status, Depends , Form
  3. from fastapi import templating
  4. from fastapi.templating import Jinja2Templates
  5. from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
  6. from fastapi.middleware.cors import CORSMiddleware
  7. from fastapi.staticfiles import StaticFiles
  8. # fastapi view function parameters
  9. from typing import List, Optional
  10. import json
  11. # path
  12. import sys
  13. from sqlalchemy.sql.elements import False_
  14. # time
  15. # import datetime
  16. from datetime import timedelta, datetime
  17. # db
  18. import dataset
  19. from passlib import context
  20. import models
  21. from random import randint
  22. # authorize
  23. from passlib.context import CryptContext
  24. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  25. import jwt
  26. from fastapi_jwt_auth import AuthJWT
  27. from fastapi_jwt_auth.exceptions import AuthJWTException
  28. from fastapi.security import OAuth2AuthorizationCodeBearer, OAuth2PasswordRequestForm
  29. import numpy as np
  30. import pymysql
  31. pymysql.install_as_MySQLdb()
  32. db_settings = {
  33. "host": "db.ptt.cx",
  34. "port": 3306,
  35. "user": "choozmo",
  36. "password": "pAssw0rd",
  37. "db": "Water_tower",
  38. "charset": "utf8mb4"
  39. }
  40. # app
  41. app = FastAPI()
  42. app.add_middleware(
  43. CORSMiddleware,
  44. allow_origins=["*"],
  45. allow_credentials=True,
  46. allow_methods=["*"],
  47. allow_headers=["*"],
  48. )
  49. SECRET_KEY = "df2f77bd544240801a048bd4293afd8eeb7fff3cb7050e42c791db4b83ebadcd"
  50. ALGORITHM = "HS256"
  51. ACCESS_TOKEN_EXPIRE_MINUTES = 3000
  52. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  53. #
  54. app.mount(path='/templates', app=StaticFiles(directory='templates'), name='templates')
  55. app.mount(path='/static', app=StaticFiles(directory='static'), name='static ')
  56. #
  57. templates = Jinja2Templates(directory='templates')
  58. @AuthJWT.load_config
  59. def get_config():
  60. return models.Settings()
  61. # view
  62. @app.get('/', response_class=HTMLResponse)
  63. async def index(request: Request):
  64. print(request)
  65. return templates.TemplateResponse(name='index.html', context={'request': request})
  66. @app.get('/login', response_class=HTMLResponse)
  67. async def login(request: Request):
  68. return templates.TemplateResponse(name='login.html', context={'request': request})
  69. @app.post("/login")
  70. async def login_for_access_token(request: Request, form_data: OAuth2PasswordRequestForm = Depends(), Authorize: AuthJWT = Depends()):
  71. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  72. user = authenticate_user(form_data.username, form_data.password)
  73. if not user:
  74. raise HTTPException(
  75. status_code=status.HTTP_401_UNAUTHORIZED,
  76. detail="Incorrect username or password",
  77. headers={"WWW-Authenticate": "Bearer"},
  78. )
  79. access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
  80. access_token = create_access_token(
  81. data={"sub": user.username}, expires_delta=access_token_expires
  82. )
  83. table = db['users']
  84. user.token = access_token
  85. print(user)
  86. table.update(dict(user), ['username'],['password'])
  87. access_token = Authorize.create_access_token(subject=user.username)
  88. refresh_token = Authorize.create_refresh_token(subject=user.username)
  89. Authorize.set_access_cookies(access_token)
  90. Authorize.set_refresh_cookies(refresh_token)
  91. #return templates.TemplateResponse("home.html", {"request": request, "msg": 'Login'})
  92. return {"access_token": access_token, "token_type": "bearer"} # 回傳token給前端
  93. @app.get('/register', response_class=HTMLResponse)
  94. async def login(request: Request):
  95. return templates.TemplateResponse(name='rigister_test.html', context={'request': request})
  96. @app.post('/register')
  97. async def register(request: Request, form_data: OAuth2PasswordRequestForm = Depends()):
  98. user = models.User(**await request.form())
  99. print(form_data.username, form_data.password, user)
  100. user.id = randint(1000, 9999)
  101. user.isAdmin = 0 #預設為非管理者
  102. user.roleType = 0 #預設為employee
  103. # 密碼加密
  104. #user.password = get_password_hash(user.password)
  105. # 存入DB
  106. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  107. user_table = db['users']
  108. user_table.insert(dict(user))
  109. # 跳轉頁面至登入
  110. return templates.TemplateResponse(name='login.html', context={'request': request})
  111. @app.get('/home', response_class=HTMLResponse)
  112. async def home(request: Request):
  113. return templates.TemplateResponse(name='home.html', context={'request': request})
  114. @app.get('/tower', response_class=HTMLResponse)
  115. async def tower(request: Request, Authorize: AuthJWT = Depends()):
  116. try:
  117. Authorize.jwt_required()
  118. except Exception as e:
  119. print(e)
  120. return RedirectResponse('/login')
  121. current_user = Authorize.get_jwt_subject()
  122. result = get_user_under_organization(current_user)
  123. result.append({'Data' : get_tower_info('dev001')})
  124. return templates.TemplateResponse(name='tower.html', context={"request":request})
  125. @app.get('/tower/org', response_class=HTMLResponse)
  126. async def tower(request: Request, Authorize: AuthJWT = Depends()):
  127. try:
  128. Authorize.jwt_required()
  129. except Exception as e:
  130. print(e)
  131. return RedirectResponse('/login')
  132. current_user = Authorize.get_jwt_subject()
  133. result = get_user_under_organization(current_user)
  134. return json.dumps(result,ensure_ascii=False)
  135. @app.get('/tower/', response_class=HTMLResponse)
  136. async def tower(request: Request,company:str,factory:str,department:str,towerGroup:str, Authorize: AuthJWT = Depends()):
  137. try:
  138. Authorize.jwt_required()
  139. except Exception as e:
  140. print(e)
  141. return RedirectResponse('/login')
  142. #current_user = Authorize.get_jwt_subject()
  143. tower_arr = get_tower(company,factory,department,towerGroup)
  144. result = []
  145. for tower in tower_arr:
  146. result.append({'tower_name': tower,'tower_data': get_tower_info(tower)})
  147. print(result)
  148. return json.dumps(result,ensure_ascii=False)
  149. @app.get('/optim', response_class=HTMLResponse)
  150. async def optim(request: Request, Authorize: AuthJWT = Depends()):
  151. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  152. statement = 'SELECT value FROM record_tower WHERE record_tower.key = "hotTemp"'
  153. x = 0
  154. y = 0
  155. z = 0
  156. for temp in db.query(statement):
  157. print(temp['value'])
  158. x=temp['value']
  159. statement2 = 'SELECT value FROM record_tower WHERE record_tower.key = "coldTempData2"'
  160. for temp2 in db.query(statement2):
  161. print(temp2['value'])
  162. y=temp2['value']
  163. statement3 = 'SELECT value FROM record_tower WHERE record_tower.key = "wetTemp"'
  164. for temp3 in db.query(statement3):
  165. print(temp3['value'])
  166. z=temp3['value']
  167. try:
  168. Authorize.jwt_required()
  169. except Exception as e:
  170. print(e)
  171. return RedirectResponse('/login')
  172. return templates.TemplateResponse(name='optim.html',context={'request': request,"x":x,"y":y,"z":z})
  173. @app.get('/vibration', response_class=HTMLResponse)
  174. async def vibration(request: Request, Authorize: AuthJWT = Depends()):
  175. try:
  176. Authorize.jwt_required()
  177. except Exception as e:
  178. print(e)
  179. return RedirectResponse('/login')
  180. # current_user = Authorize.get_jwt_subject()
  181. return templates.TemplateResponse(name='vibration.html', context={'request': request})
  182. @app.get('/history', response_class=HTMLResponse)
  183. async def history(request: Request, Authorize: AuthJWT = Depends()):
  184. try:
  185. Authorize.jwt_required()
  186. except Exception as e:
  187. print(e)
  188. return RedirectResponse('/login')
  189. # current_user = Authorize.get_jwt_subject()
  190. return templates.TemplateResponse(name='history.html', context={'request': request})
  191. @app.get('/device', response_class=HTMLResponse)
  192. async def device(request: Request, Authorize: AuthJWT = Depends()):
  193. try:
  194. Authorize.jwt_required()
  195. except Exception as e:
  196. print(e)
  197. return RedirectResponse('/login')
  198. # current_user = Authorize.get_jwt_subject()
  199. return templates.TemplateResponse(name='device.html', context={'request': request})
  200. @app.get('/system', response_class=HTMLResponse)
  201. async def system(request: Request, Authorize: AuthJWT = Depends()):
  202. try:
  203. Authorize.jwt_required()
  204. except Exception as e:
  205. print(e)
  206. return RedirectResponse('/login')
  207. # current_user = Authorize.get_jwt_subject()
  208. return templates.TemplateResponse(name='system.html', context={'request': request})
  209. @app.get('/member', response_class=HTMLResponse)
  210. async def get_member(request: Request, Authorize: AuthJWT = Depends()):
  211. """獲取所有帳號資訊"""
  212. try:
  213. Authorize.jwt_required()
  214. except Exception as e:
  215. print(e)
  216. return RedirectResponse('/login')
  217. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  218. statement = 'SELECT id,username,isAdmin FROM users'
  219. json_dic = []
  220. for row in db.query(statement):
  221. #print(row['id'],row['username'])
  222. json_dic.append({'username':row['username'],'isAdmin':row['isAdmin'],'roleType':check_role_type(row['username']),'role_name' :get_role_name(check_role_type(row['username']))})
  223. result = json.dumps(json_dic,ensure_ascii=False)
  224. return result
  225. @app.get('/member/edit/', response_class=HTMLResponse)
  226. async def login(request: Request, name:str,isAdmin:int,isEnable:int ,Authorize: AuthJWT = Depends()):
  227. try:
  228. Authorize.jwt_required()
  229. except Exception as e:
  230. print(e)
  231. return RedirectResponse('/login')
  232. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  233. current_user = Authorize.get_jwt_subject()
  234. current_user_roleType = check_role_type(current_user)
  235. del_user_roleType = check_role_type(name)
  236. statement = 'SELECT isAdmin FROM users WHERE userName = "'+current_user+'"'
  237. for row in db.query(statement):
  238. if row['isAdmin']!=1:
  239. return json.dumps([{'msg':'你沒有權限'}],ensure_ascii=False)
  240. if del_user_roleType == None:
  241. return json.dumps([{'msg':'不存在使用者'}],ensure_ascii=False)
  242. elif current_user_roleType>del_user_roleType or current_user_roleType==del_user_roleType:
  243. return json.dumps([{'msg':'你沒有權限'}],ensure_ascii=False)
  244. user_dic = get_user(name)
  245. print(user_dic)
  246. user_dic.isAdmin = isAdmin
  247. user_dic.isEnable = isEnable
  248. table = db['users']
  249. table.update(dict(user_dic), ['username'])
  250. return json.dumps([{'msg':"成功更改"}],ensure_ascii=False)
  251. @app.get('/member_delete', response_class=HTMLResponse)
  252. async def login(request: Request, Authorize: AuthJWT = Depends()):
  253. try:
  254. Authorize.jwt_required()
  255. except Exception as e:
  256. print(e)
  257. return RedirectResponse('/login')
  258. return templates.TemplateResponse(name='delete_member_test2.html', context={'request': request})
  259. @app.post('/member_delete')
  260. async def delete_member(request: Request):
  261. """刪除成員"""
  262. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  263. del_user = models.del_user(**await request.form())
  264. delete_name = del_user.del_name
  265. statement = 'SELECT * FROM users'
  266. current_user = ''
  267. for row in db.query(statement):
  268. if row['token'] != None :
  269. if compare_jwt_token(row['token'],del_user.access_token):
  270. current_user = row['username']
  271. if current_user == '':
  272. return {'msg':'尚未登入'}
  273. statement = 'SELECT isAdmin FROM users WHERE userName = "'+current_user+'"'
  274. for row in db.query(statement):
  275. if row['isAdmin']!=1:
  276. return {'msg': ' 你沒有權限'}
  277. current_user_roleType = check_role_type(current_user)
  278. del_user_roleType = check_role_type(delete_name)
  279. if del_user_roleType == None:
  280. return {'msg':'不存在使用者'}
  281. elif current_user_roleType>del_user_roleType or current_user_roleType==del_user_roleType:
  282. return {'msg': ' 你沒有權限'}
  283. else :
  284. table = db['users']
  285. table.delete(username=delete_name)
  286. return {'msg': ' 成功刪除'}
  287. @app.get('/member_authority/{edit_one}', response_class=HTMLResponse)
  288. async def member_authority(request:Request,edit_one: int,Authorize: AuthJWT = Depends()):
  289. """設定成員權限"""
  290. try:
  291. Authorize.jwt_required()
  292. except Exception as e:
  293. print(e)
  294. return RedirectResponse('/login')
  295. context = {'request': request}
  296. current_user = Authorize.get_jwt_subject()
  297. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  298. statement = check_isAdmin(current_user)
  299. if statement == "no user":
  300. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'no user' })
  301. elif statement == 0:
  302. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':"沒有權限" })
  303. current_user_roleType = check_role_type(current_user)
  304. if edit_one == None:
  305. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'no role' })
  306. elif int(current_user_roleType)>int(edit_one) or int(current_user_roleType)==int(edit_one):
  307. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':"沒有權限" })
  308. result = check_role_acl(edit_one)
  309. if result == []:
  310. cmd = 'SELECT id FROM module'
  311. for row in db.query(cmd):
  312. dic_tmp = {'id':0,'isView':0,'isAdd':0 ,'isEdit':0,'isDel':0,'role_id' : edit_one}
  313. context[get_modul_name(row['id']) ] = dic_tmp
  314. else:
  315. for dic in result:
  316. modul_name = get_modul_name(dic['module_id'])
  317. del dic['module_id']
  318. context[modul_name ] = dic
  319. return templates.TemplateResponse(name='member_authority_test.html', context=context)
  320. @app.post('/member_authority')
  321. async def member_authority(request: Request):
  322. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  323. edit_one = models.user_authority(**await request.form())
  324. statement = 'SELECT * FROM users'
  325. current_user = ''
  326. for row in db.query(statement):
  327. if row['token'] != None :
  328. if compare_jwt_token(row['token'],edit_one.access_token):
  329. current_user = row['username']
  330. if current_user == '':
  331. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'尚未登入'})
  332. statement = check_isAdmin(current_user)
  333. if statement == "no user":
  334. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':statement })
  335. elif statement == 0:
  336. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg':'你沒有權限' })
  337. current_user_roleType = check_role_type(current_user)
  338. edit_one_roleType = edit_one.role_id
  339. if current_user_roleType>edit_one_roleType or current_user_roleType==edit_one_roleType:
  340. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg': ' 你沒有權限'})
  341. else :
  342. row = ['ai_prediction' ,'channel' ,'device', 'event', 'index' ,'performance', 'record', 'setting_device' ,'setting_system','tower']
  343. if check_role_acl(edit_one.role_id) == []:
  344. for module in row :
  345. new_dict = edit_one.get_acl_from_module_name(module)
  346. new_dict["id"]= None
  347. table = db['role_acl']
  348. table.insert(new_dict)
  349. else:
  350. for module in row :
  351. new_dict = edit_one.get_acl_from_module_name(module)
  352. table = db['role_acl']
  353. table.update(new_dict, ['id'])
  354. return templates.TemplateResponse(name='notice.html', context={"request":request,'msg': '成功更改權限'})
  355. # 溫度API
  356. @app.get('/temperature')
  357. async def get_temperatures():
  358. """ 撈DB溫度 """
  359. return {'hot_water': 30.48, 'cold_water': 28.10, 'wet_ball': 25.14}
  360. @app.post("/example")
  361. async def example(request: Request,Authorize: AuthJWT = Depends()):
  362. try:
  363. Authorize.jwt_required()
  364. except Exception as e:
  365. print(e)
  366. current_user = Authorize.get_jwt_subject()
  367. #form_data = await request.form()
  368. print( current_user)
  369. return current_user
  370. @app.post('/user')
  371. def user(Authorize: AuthJWT = Depends()):
  372. Authorize.jwt_required()
  373. current_user = Authorize.get_jwt_subject()
  374. return {"user": current_user}
  375. @app.get("/example", response_class=HTMLResponse)
  376. async def example(request: Request,Authorize: AuthJWT = Depends()):
  377. try:
  378. Authorize.jwt_required()
  379. except Exception as e:
  380. print(e)
  381. return RedirectResponse('/login')
  382. current_user = Authorize.get_jwt_subject()
  383. print( current_user)
  384. return current_user
  385. @app.get('/health')
  386. async def get_health(date: str):
  387. """ 撈健康指標、預設健康指標 """
  388. date = str(datetime.strptime(date, "%Y-%m-%d"))[:10]
  389. print(date)
  390. print(str(datetime.today()))
  391. print(str(datetime.today()-timedelta(days=1)))
  392. fake_data = {
  393. str(datetime.today())[:10]: {'curr_health': 0.7, 'pred_health': 0.8},
  394. str(datetime.today()-timedelta(days=1))[:10]: {'curr_health': 0.6, 'pred_health': 0.7},
  395. }
  396. return fake_data[date]
  397. @app.get('/history_data')
  398. async def get_history(time_end: str):
  399. """ 透過終點時間,抓取歷史資料。 """
  400. date = str(datetime.strptime(time_end, "%Y-%m-%d"))[:10]
  401. print(date)
  402. print(str(datetime.today()))
  403. print(str(datetime.today()-timedelta(days=1)))
  404. fake_data = {
  405. str(datetime.today())[:10]: {
  406. 'curr_history': {
  407. 'RPM_1X': list(np.random.rand(13)),
  408. 'RPM_2X': list(np.random.rand(13)),
  409. 'RPM_3X': list(np.random.rand(13)),
  410. 'RPM_4X': list(np.random.rand(13)),
  411. 'RPM_5X': list(np.random.rand(13)),
  412. 'RPM_6X': list(np.random.rand(13)),
  413. 'RPM_7X': list(np.random.rand(13)),
  414. 'RPM_8X': list(np.random.rand(13)),
  415. 'Gear_1X': list(np.random.rand(13)),
  416. 'Gear_2X': list(np.random.rand(13)),
  417. 'Gear_3X': list(np.random.rand(13)),
  418. 'Gear_4X': list(np.random.rand(13)),
  419. },
  420. 'past_history': {
  421. 'RPM_1X': list(np.random.rand(13)),
  422. 'RPM_2X': list(np.random.rand(13)),
  423. 'RPM_3X': list(np.random.rand(13)),
  424. 'RPM_4X': list(np.random.rand(13)),
  425. 'RPM_5X': list(np.random.rand(13)),
  426. 'RPM_6X': list(np.random.rand(13)),
  427. 'RPM_7X': list(np.random.rand(13)),
  428. 'RPM_8X': list(np.random.rand(13)),
  429. 'Gear_1X': list(np.random.rand(13)),
  430. 'Gear_2X': list(np.random.rand(13)),
  431. 'Gear_3X': list(np.random.rand(13)),
  432. 'Gear_4X': list(np.random.rand(13)),
  433. }
  434. },
  435. str(datetime.today()-timedelta(days=1))[:10]: {
  436. 'curr_history': {
  437. 'RPM_1X': list(np.random.rand(13)),
  438. 'RPM_2X': list(np.random.rand(13)),
  439. 'RPM_3X': list(np.random.rand(13)),
  440. 'RPM_4X': list(np.random.rand(13)),
  441. 'RPM_5X': list(np.random.rand(13)),
  442. 'RPM_6X': list(np.random.rand(13)),
  443. 'RPM_7X': list(np.random.rand(13)),
  444. 'RPM_8X': list(np.random.rand(13)),
  445. 'Gear_1X': list(np.random.rand(13)),
  446. 'Gear_2X': list(np.random.rand(13)),
  447. 'Gear_3X': list(np.random.rand(13)),
  448. 'Gear_4X': list(np.random.rand(13)),
  449. },
  450. 'past_history': {
  451. 'RPM_1X': list(np.random.rand(13)),
  452. 'RPM_2X': list(np.random.rand(13)),
  453. 'RPM_3X': list(np.random.rand(13)),
  454. 'RPM_4X': list(np.random.rand(13)),
  455. 'RPM_5X': list(np.random.rand(13)),
  456. 'RPM_6X': list(np.random.rand(13)),
  457. 'RPM_7X': list(np.random.rand(13)),
  458. 'RPM_8X': list(np.random.rand(13)),
  459. 'Gear_1X': list(np.random.rand(13)),
  460. 'Gear_2X': list(np.random.rand(13)),
  461. 'Gear_3X': list(np.random.rand(13)),
  462. 'Gear_4X': list(np.random.rand(13)),
  463. }
  464. },
  465. }
  466. return fake_data[date]
  467. # Login funtion part
  468. def check_user_exists(username):
  469. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  470. if int(next(iter(db.query('SELECT COUNT(*) FROM Water_tower.users WHERE userName = "'+username+'"')))['COUNT(*)']) > 0:
  471. return True
  472. else:
  473. return False
  474. def get_user(username: str):
  475. """ 取得使用者資訊(Model) """
  476. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  477. if not check_user_exists(username): # if user don't exist
  478. return False
  479. user_dict = next(
  480. iter(db.query('SELECT * FROM Water_tower.users where userName ="'+username+'"')))
  481. user = models.User(**user_dict)
  482. return user
  483. def user_register(user):
  484. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  485. table = db['users']
  486. #user.password = get_password_hash(user.password)
  487. table.insert(dict(user))
  488. def get_password_hash(password):
  489. """ 加密密碼 """
  490. return pwd_context.hash(password)
  491. def verify_password(plain_password, hashed_password):
  492. """ 驗證密碼(hashed) """
  493. return pwd_context.verify(plain_password, hashed_password)
  494. def authenticate_user(username: str, password: str):
  495. """ 連線DB,讀取使用者是否存在。 """
  496. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  497. if not check_user_exists(username): # if user don't exist
  498. return False
  499. user_dict = next(iter(db.query('SELECT * FROM Water_tower.users where userName ="'+username+'"')))
  500. user = models.User(**user_dict)
  501. #if not verify_password(password, user.password):
  502. #return False
  503. return user
  504. def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
  505. """ 創建token,並設定過期時間。 """
  506. to_encode = data.copy()
  507. if expires_delta:
  508. expire = datetime.utcnow() + expires_delta
  509. else:
  510. expire = datetime.utcnow() + timedelta(minutes=15)
  511. to_encode.update({"exp": expire})
  512. encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
  513. return encoded_jwt
  514. def compare_jwt_token(access_token: str, token: str):
  515. """比對jwt token"""
  516. if len(access_token) < len(token):
  517. if access_token in token:
  518. return True
  519. else :
  520. return False
  521. elif len(access_token) > len(token):
  522. if token in access_token:
  523. return True
  524. else :
  525. return False
  526. else :
  527. if token == access_token:
  528. return True
  529. else :
  530. return False
  531. def check_isAdmin(user_name:str):
  532. """查看是否為管理員"""
  533. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  534. isAdmin = None
  535. cmd = 'SELECT isAdmin FROM users WHERE userName = "'+user_name+'"'
  536. for row in db.query(cmd) :
  537. isAdmin = row['isAdmin']
  538. if isAdmin== None:
  539. return "no user"
  540. return isAdmin
  541. def check_role_type(user_name:str)->int:
  542. """查看使用者權限"""
  543. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  544. cmd = 'SELECT user_role.role_id FROM `users` JOIN `user_role` ON `users`.id = `user_role`.user_id where `users`.username = "'+user_name+'"'
  545. role_type = None
  546. for row in db.query(cmd) :
  547. role_type = row['role_id']
  548. return role_type
  549. def check_role_acl(role:int):
  550. """查看權限"""
  551. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  552. cmd = 'SELECT * FROM role_acl where role_id = '+str(role)
  553. result = []
  554. for row in db.query(cmd) :
  555. dic ={}
  556. for col_name in db['role_acl'].columns:
  557. dic[col_name] = row[col_name]
  558. if dic != {}:
  559. result.append(dic)
  560. return result
  561. def get_role_name(role_id:int):
  562. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  563. cmd = 'SELECT * FROM role where id = '+str(role_id)
  564. role:str
  565. for row in db.query(cmd) :
  566. role = row['name']
  567. return role
  568. def get_user_under_organization(user_name:str):
  569. """查看所屬公司"""
  570. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  571. user_role = check_role_type(user_name)
  572. #print(user_name,user_role)
  573. cmd = 'SELECT * FROM organization'
  574. result = []
  575. if int(user_role) == 1 :
  576. num=0
  577. for row in db.query(cmd) :
  578. company = row['Company']
  579. factory = row['Factory']
  580. department = row['Department']
  581. result.append({})
  582. cmd2 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  583. group = []
  584. for row2 in db.query(cmd2):
  585. if row2['TowerGroupCode'] not in group :
  586. group.append(row2['TowerGroupCode'])
  587. result[num] = {'company':company,'factory':factory,'department':department,'group':group,'able':1}
  588. num = num +1
  589. elif int(user_role) == 2:
  590. cmd2 = 'SELECT company FROM user WHERE user.username = '+user_name
  591. company_able:str
  592. num = 0
  593. for row in db.query(cmd2) :
  594. company_able = row['company']
  595. for row in db.query(cmd) :
  596. company = row['Company']
  597. factory = row['Factory']
  598. department = row['Department']
  599. cmd3 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  600. group = []
  601. for row2 in db.query(cmd3):
  602. group.append(row2['TowerGroupCode'])
  603. if company == company_able:
  604. result[num] = {'company':company,'factory':factory,'department':department,'group':group,'able':1}
  605. else:
  606. result[num] = {'company':company,'factory':factory,'department':department,'group':group,'able':0}
  607. num = num +1
  608. elif int(user_role) == 3:
  609. cmd2 = 'SELECT company,factory FROM users WHERE users.username = '+user_name
  610. company_able:str
  611. factory_able:str
  612. num = 0
  613. for row in db.query(cmd2) :
  614. company = row['company']
  615. factory = row['factory']
  616. for row in db.query(cmd) :
  617. company = row['Company']
  618. factory = row['Factory']
  619. department = row['Department']
  620. cmd3 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  621. group = []
  622. for row2 in db.query(cmd3):
  623. group.append(row2['TowerGroupCode'])
  624. if company == company_able and factory==factory_able:
  625. result[num] = {'company':company,'factory':factory,'department':department,'group':group,'able':1}
  626. else:
  627. result[num] = {'company':company,'factory':factory,'department':department,'group':group,'able':0}
  628. num=num+1
  629. elif int(user_role) == 4:
  630. cmd2 = 'SELECT company,factory,department FROM users WHERE username = '+user_name
  631. company_able:str
  632. factory_able:str
  633. department_able:str
  634. num = 0
  635. for row in db.query(cmd2) :
  636. company_able = row['company']
  637. factory_able = row['factory']
  638. department_able = row['Department']
  639. for row in db.query(cmd) :
  640. company = row['Company']
  641. factory = row['Factory']
  642. department = row['Department']
  643. cmd3 = 'SELECT TowerGroupCode FROM device WHERE CompanyCode = "' + company + '" AND FactoryCode = "' + factory + '" AND DepartmentCode = "' + department + '"'
  644. group = []
  645. for row2 in db.query(cmd3):
  646. group.append(row2['TowerGroupCode'])
  647. if company == company_able and factory==factory_able and department==department_able:
  648. result[num] = {'company':company,'factory':factory,'department':department,'group':group,'able':1}
  649. else:
  650. result[num] = {'company':company,'factory':factory,'department':department,'group':group,'able':1}
  651. num = num +1
  652. else :
  653. result =[ {'msg':"error"}]
  654. return result
  655. def get_user_id(user_name:str):
  656. """獲取user id"""
  657. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  658. cmd = 'SELECT id FROM `users` where username = "'+user_name+'"'
  659. id = None
  660. for row in db.query(cmd) :
  661. id = row['id']
  662. return id
  663. def get_user_name(user_id:int):
  664. """獲取user name"""
  665. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  666. cmd = 'SELECT username FROM `users` where id = "'+user_id+'"'
  667. id = None
  668. for row in db.query(cmd) :
  669. id = row['username']
  670. return id
  671. def get_modul_name(modul_id:str):
  672. """獲取modul名稱"""
  673. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  674. cmd = 'SELECT moduleName FROM `module` where id = "'+modul_id+'"'
  675. modul_name = None
  676. for row in db.query(cmd) :
  677. modul_name = row['moduleName']
  678. return modul_name
  679. def get_tower_info(tower_id:str):
  680. """獲取水塔資料"""
  681. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  682. cmd = 'SELECT * FROM `record_dcs` where device_id = "'+tower_id+'"'
  683. result ={'DCS':{},'Fan':{},'Moter':{}}
  684. for row in db.query(cmd) :
  685. result['DCS'][row['key']]=row['value']
  686. cmd = 'SELECT * FROM `record_tower` where device_id = "'+tower_id+'"'
  687. for row in db.query(cmd) :
  688. result['Fan'][row['key']]=row['value']
  689. result['Moter'] = []
  690. cmd = 'SELECT * FROM `vibration` where device_id = "'+tower_id+'"'
  691. for row in db.query(cmd) :
  692. result['Moter'].append({'channel_name':row['channelName'],'Vrms':row['DataValue'],'CV' :row['CVIndex'],'threshold':row['threshold']})
  693. return result
  694. def get_tower(company:str,factory:str,department:str,towerGroup:str):
  695. towergroup_arr =[]
  696. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/Water_tower?charset=utf8mb4')
  697. cmd = 'SELECT id FROM `device` where CompanyCode = "'+company+'" AND FactoryCode = "' +factory+'" AND DepartmentCode = "'+department+'" AND TowerGroupCode = "' + towerGroup + '"'
  698. for row in db.query(cmd) :
  699. towergroup_arr.append(row['id'])
  700. return towergroup_arr