日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Tornado笔记——用Tornado搭建假单统计考勤系统(九)

發(fā)布時間:2023/12/20 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tornado笔记——用Tornado搭建假单统计考勤系统(九) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在上一篇博客中,我們完成了考勤系統(tǒng)的基本功能。現(xiàn)在,讓我們繼續(xù)開發(fā)請假系統(tǒng)。

十一 構(gòu)建事件種類

還記得我們之前建立的考勤事件么?在當(dāng)前的設(shè)計中,考勤事件有兩個字段:事件代碼和事件名稱,現(xiàn)在我們決定給考勤事件增加一個種類的字段,來表明該事件屬于何種事件。

我們需要建立一個新表來存儲考勤事件的種類,就叫它TimeSheetEventCategory吧。

在database目錄下建立tbltimesheeteventcategory.py,輸入以下代碼:

# database/tbltimesheeteventcategory.pyfrom database.tablebase import Base from sqlalchemy import Column,String,Integer,Date,Booleanclass TimeSheetEventCategory(Base):__tablename__ = 'timesheeteventcategory'id = Column(Integer,autoincrement=True,primary_key=True)# 類別名稱eventcategoryname = Column(String,unique=True,nullable=False)# 創(chuàng)建時間createdate = Column(Date,nullable=False)def __repr__(self):return '<timesheeteventcategory(eventcategoryname=%s)>' % (self.eventcategoryname)

該表很簡單,只有三個字段:內(nèi)部編號id,類別名稱eventcategoryname和創(chuàng)建時間createdate。

進(jìn)入migrate目錄下,在powershell輸入以下命令:

alembic revision -m "add timesheeteventcategory"

在新生成的py文件中,編寫upgrade函數(shù):

def upgrade():op.create_table('timesheeteventcategory',sa.Column('id', sa.Integer, primary_key=True, autoincrement=True),sa.Column('eventcategoryname', sa.String, nullable=False),sa.Column('createdate', sa.Date, nullable=False),)

然后運(yùn)行以下命令,完成建表。?

alembic upgrade head

接下來,讓我們開始編寫創(chuàng)建事件類別的后端部分。打開util/timesheet/timesheetutil.py,實(shí)現(xiàn)createtimesheeteventcategory函數(shù):

# util/timesheet/timesheetutil.py # ... from database.tbltimesheeteventcategory import TimeSheetEventCategorydef createtimesheeteventcategory(categoryname):timesheeteventcategory = session.query(TimeSheetEventCategory).filter(TimeSheetEventCategory.eventcategoryname == categoryname)result = 'Fail'if type(timesheeteventcategory) is not TimeSheetEventCategory:newtimesheeteventcategory = TimeSheetEventCategory(eventcategoryname=categoryname,createdate=datetime.date.today())result = insertdata(newtimesheeteventcategory)return result

然后,在apps/timesheet_app/timesheet_app.py中實(shí)現(xiàn)CreateTimeSheetEventCategory:

# apps/timesheet_app/timesheet_app.py # ... from database.tbltimesheeteventcategory import TimeSheetEventCategory from util.timesheet.timesheetutil import createtimesheeteventcategoryclass CreateTimeSheetEventCategory(BaseHandler):def get(self):timesheeteventpath = gettemplatepath('createtimesheeteventcategory.html')timesheeteventcategorys = session.query(TimeSheetEventCategory)self.render(timesheeteventpath,timesheeteventcategorys=timesheeteventcategorys)def post(self):categoryname = self.get_argument('categoryname')result = createtimesheeteventcategory(categoryname)resultpath = gettemplatepath('result.html')if result == 'Fail':self.render(resultpath,result=result)else:self.redirect('/createtimesheeteventcategory')# server/main.py # ... routelist = [# ...(r"/createtimesheeteventcategory", CreateTimeSheetEventCategory),# ... ]

這個頁面的上半部分會顯示出目前建立的事件類別,而底下會提供一個表單來建立新的事件類別,前端部分代碼如下:

<!--createtimesheeteventcategory-->{% block content %}<div class="page-wrapper"><!-- ============================================================== --><!-- Container fluid --><!-- ============================================================== --><div class="container-fluid"><!-- ============================================================== --><!-- Bread crumb and right sidebar toggle --><!-- ============================================================== --><div class="row page-titles"><div class="col-md-6 col-8 align-self-center"><h3 class="text-themecolor m-b-0 m-t-0">創(chuàng)建考勤事件類別</h3><ol class="breadcrumb"><li class="breadcrumb-item"><a href="/">Home</a></li><li class="breadcrumb-item active">創(chuàng)建考勤事件類別</li></ol></div></div><!-- ============================================================== --><!-- End Bread crumb and right sidebar toggle --><!-- ============================================================== --><!-- ============================================================== --><!-- Start Page Content --><!-- ============================================================== --><!-- Row --><div class="row"><!-- Column --><div class="col-lg-8 col-xlg-9 col-md-7"><div class="card"><div class="card-block"><h4 class="card-title">當(dāng)前考勤事件類別</h4><div class="table-responsive"><table class="table"><thead><tr><th>#</th><th>事件類別</th><th>創(chuàng)建時間</th></tr></thead><tbody>{% for category in timesheeteventcategorys %}<tr><td>{{ category.id }}</td><td>{{ escape(category.eventcategoryname) }}</td><td>{{ category.createdate }}</td></tr>{% end %}</tbody></table></div></div><div class="card-block"><form class="form-horizontal form-material" action="/createtimesheeteventcategory" method="post" ><div class="form-group"><label class="col-md-12">事件類 *</label><div class="col-md-12"><input type="text" class="form-control form-control-line" required=true name="categoryname" id="categoryname"/></div></div><div class="form-group"><div class="col-sm-12"><button type="submit" class="btn btn-success">創(chuàng)建</button></div></div></form></div></div></div><!-- Column --></div><!-- Row --><!-- ============================================================== --><!-- End PAge Content --><!-- ============================================================== --></div><!-- ============================================================== --><!-- End Container fluid --><!-- ============================================================== --><!-- ============================================================== --><!-- footer --><!-- ============================================================== --><footer class="footer text-center">? 2020 Tornado考勤系統(tǒng)</footer><!-- ============================================================== --><!-- End footer --><!-- ============================================================== --></div>{% end %}

效果如下:

從圖中可知,我們建立了三個事件類別:Vacation、Work和Weekend,而在底下的表單中我們可以隨時增加新的事件類別。

現(xiàn)在,讓我們對之前的創(chuàng)建考勤事件功能做一些小改動,讓考勤事件與類別相關(guān)聯(lián),并且也給已經(jīng)建立好的考勤事件賦予類別。

首先別忘了給TimeSheetEvent添加eventcategory欄位,該欄位為String類型,這里不再贅述。

打開util/timesheet/timesheetutil.py,修改createtimesheetevent函數(shù):

# util/timesheet/timesheetutil.py# ... def createtimesheetevent(eventcode,nickname,eventcategory):timesheetevent = session.query(TimeSheetEvent).filter(TimeSheetEvent.eventcode == eventcode).first()result = 'Fail'if type(timesheetevent) is not TimeSheetEvent:newtimesheetevent = TimeSheetEvent(eventcode=eventcode,nickname=nickname,eventcategory=eventcategory)result = insertdata(newtimesheetevent)# Modify by DS Liu 2021/1/23else:timesheetevent.eventcategory = eventcategoryresult = insertdata(timesheetevent)return result

這個函數(shù)和之前相比,多了eventcategory的參數(shù);并且,當(dāng)eventcode存在的時候,我們不是直接報錯,而是給已有的事件加上eventcategory值。

在timesheet_app.py中的CreateTimeSheetEvent中也加入對應(yīng)的代碼:

# timesheet_app.pyclass CreateTimeSheetEvent(BaseHandler):def get(self):timesheeteventpath = gettemplatepath('createtimesheetevent.html')timesheetevents = session.query(TimeSheetEvent)timesheeteventcategory = session.query(TimeSheetEventCategory)self.render(timesheeteventpath,timesheetevents=timesheetevents,timesheeteventcategorys=timesheeteventcategory)def post(self):eventcode = self.get_argument('eventcode')eventnickname = self.get_argument('eventnickname')eventcategory = self.get_argument('eventcategory')result = createtimesheetevent(eventcode,eventnickname,eventcategory)resultpath = gettemplatepath('result.html')if result == 'Fail':self.render(resultpath,result=result)else:self.redirect('/createtimesheetevent')

在get中,我們會獲取所有的timesheeteventcategory并傳入前端,以便用戶選擇;在post中,我們也會從表單中獲取eventcategory的值傳入util函數(shù)中。?

同樣,在createtimesheetevent.html中添加一個下拉框,以便選擇當(dāng)前所有的事件類別。

?

<!--createtimesheetevent.html--><!-...--><form class="form-horizontal form-material" action="/createtimesheetevent" method="post" ><div class="form-group"><label class="col-md-12">事件名 *</label><div class="col-md-12"><input type="text" class="form-control form-control-line" required=true name="eventcode" id="eventcode"></div><label class="col-md-12">別名 *</label><div class="col-md-12"><input type="text" class="form-control form-control-line" required=true name="eventnickname" id="eventnickname"></div><label class="col-md-12">類別 *</label><div class="col-md-12"><select class="form-control form-control-line" name="eventcategory" id="eventcategory">{% for category in timesheeteventcategorys %}<option value="{{ category.eventcategoryname }}">{{ category.eventcategoryname }}</option>{% end %}</select></div></div><div class="form-group"><div class="col-sm-12"><button type="submit" class="btn btn-success">創(chuàng)建/修改類別</button></div></div></form> <!-...-->

這樣,我們就完成了事件類別的相關(guān)工作,為請假系統(tǒng)打好了一個小基礎(chǔ)。

十二 請假系統(tǒng)的數(shù)據(jù)庫部分

我們的請假系統(tǒng)的成品如下圖所示:

在表單中,可以選擇請假的類別,在設(shè)定好開始時間和結(jié)束時間后,系統(tǒng)會自動算出一共請了多少天假,且最小單位是半天;在輸入完請假原因后,點(diǎn)擊創(chuàng)建即可創(chuàng)建請假申請。

現(xiàn)在,讓我們先把所需的表建起來。目前我們只需要一張新表來管理假單,名為Vacation表。

在database目錄下建立tblvacation.py文件,輸入以下內(nèi)容:

# database/tblvacation.pyfrom database.tablebase import Base from sqlalchemy import Column,String,Integer,Date,Booleanclass Vacation(Base):__tablename__ = 'vacation'id = Column(Integer,autoincrement=True,primary_key=True)# 請假人username = Column(String,nullable=False)# 假期類別vacationcategory = Column(String,nullable=False)# 起始日期startdate = Column(Date,nullable=False)# 起始日期是否為上午startdateMorning = Column(Boolean,nullable=False)# 終止日期enddate = Column(Date,nullable=False)# 終止日期是否為上午enddateMorning = Column(Boolean,nullable=False)# 請假理由reason = Column(String,nullable=False)# 假期總時間timesum = Column(String,nullable=False)# 審批人approveuser = Column(String,nullable=False)# 審批日期approvedate = Column(Date,nullable=False)# 狀態(tài)state = Column(String,nullable=False)# 提交日期applydate = Column(Date,nullable=False)def __repr__(self):return '<vacation(username=%s,vacationcategory=%s)>' % (self.username,self.vacationcategory)

然后再次輸入熟悉的alembic升版命令:

alembic revison -m "add vacation table"

?在新生成的py文件中,改寫其upgrade函數(shù):

def upgrade():op.create_table('vacation',sa.Column('id', sa.Integer, primary_key=True, autoincrement=True),sa.Column('username', sa.String, nullable=False),sa.Column('vacationcategory', sa.String, nullable=False),sa.Column('startdate', sa.Date,nullable=False),sa.Column('startdateMorning', sa.Boolean,nullable=False),sa.Column('enddate', sa.Date,nullable=False),sa.Column('enddateMorning', sa.Boolean,nullable=False),sa.Column('reason', sa.String, nullable=False)sa.Column('timesum', sa.String,nullable=False)sa.Column('approveuser',sa.String,nullable=False)sa.Column('approvedate', sa.Date, nullable=False)sa.Column('state', sa.String, nullable=False)sa.Column('applydate', sa.Date,nullable=False))

然后執(zhí)行upgrade命令,將vacation表建立完畢。此時,我們就完成了請假系統(tǒng)的數(shù)據(jù)庫部分。

在這期博客中,我們實(shí)現(xiàn)了創(chuàng)建事件類別的功能,并且為已有的考勤事件添加了事件類別;此外,我們還展示了請假系統(tǒng)的界面,以及完成了vacation表的建立。在下一篇博客中,我將繼續(xù)介紹請假系統(tǒng)的后端實(shí)現(xiàn),希望大家繼續(xù)關(guān)注~

總結(jié)

以上是生活随笔為你收集整理的Tornado笔记——用Tornado搭建假单统计考勤系统(九)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。