#routes/dashboard.py
import config
from bottle import Bottle, redirect
from controllers.login import checkLogged
import bottle
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024
app = Bottle()
@app.route('/')
def index():
if checkLogged.call():
from controllers.dashboard import index
return index.call()
else:
redirect('/')
@app.route('/logout')
def logout():
from controllers.dashboard import logout
logout.call()
from routes import category
app.mount('/category', category.app)
from routes import post
app.mount('/post', post.app)
from routes import book
app.mount('/book', book.app)
#routes/book.py
from bottle import Bottle, redirect
from controllers.login import checkLogged
import bottle
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024
app = Bottle()
@app.route('/')
def index():
if checkLogged.call():
from controllers.dashboard.book import get
return get.call()
else:
redirect('/')
#controllers/dashboard/book/get.py
import config
from bottle import template
from copy import deepcopy
def call():
kdict = deepcopy(config.kdict)
kdict['siteLogo'] = 'ទំព័រសៀវភៅ'
kdict['route'] = 'book'
return template('dashboard/index.tpl', data=kdict)
<!--views/dashboard/index.tpl-->
% rebase('base.tpl')
<link href="/static/styles/partials/header.css" rel="stylesheet"></link>
<script src="/static/scripts/paginate.js"></script>
<section class='Head'>
<header class='region'>
<div class='site-logo'>{{ data['siteLogo'] }}</div>
<form action='/dashboard/search' method='post'>
<select name="select">
<option>ការផ្សាយ</option>
<option>ជំពូក</option>
<option>សៀវភៅ</option>
<option>អ្នកប្រើប្រាស់</option>
</select>
<input type='text' name="q" placeholder="Search" required />
<input type="submit" value='បញ្ជូន' />
</form>
<div class='logout'><a href='/dashboard/logout'>ចេញក្រៅ</a></div>
</header>
</section>
<link href="/static/styles/partials/body.css" rel="stylesheet"></link>
<section class='Body region'>
%include('dashboard/menu.tpl')
<%
if 'post' in data['route']:
include('dashboard/post.tpl')
elif 'category' in data['route']:
include('dashboard/category.tpl')
elif 'book' in data['route']:
include('dashboard/book.tpl')
end
%>
</section>
<link href="/static/styles/partials/listing.css" rel="stylesheet"></link>
<section class='Listing region'>
%if 'count' in data:
<div class='info'>សរុបទាំងអស់មានចំនួនៈ {{data['count']}}</div>
%else:
<div class='info'>សរុបទាំងអស់មានចំនួនៈ</div>
%end
<div class='items'>
%if 'items' in data:
%for item in data['items']:
<div class='item'>
<a href="/{{data['route']}}/{{item[3]}}"><img class='thumb' src="{{item[1]}}" /></a>
<div class='wrapper'>
<a href="/{{data['route']}}/{{item[3]}}">{{item[0]}}</a>
<p class='date'></p>
<script>
$('.items .item .date').html(new Date("{{item[2]}}").toLocaleDateString())
</script>
</div>
<div class='icon'>
<a href='/dashboard/{{data["route"]}}/edit/{{item[3]}}'><img src='/static/images/edit.png' /></a>
<a href='/dashboard/{{data["route"]}}/delete/{{item[3]}}'><img src='/static/images/delete.png' /></a>
</div>
</div>
%end
%end
</div>
<script>
var route = "{{data['route']}}"
</script>
<div class='load-more'><img onclick='paginate(route)' src="/static/images/load-more.png" /></div>
</section>
<!--views/dashboard/book.tpl-->
<link rel='stylesheet' href='/static/styles/post.css' />
<script src="/static/scripts/ckeditor/ckeditor.js"></script>
<script src="/static/scripts/video.js"></script>
<style>
.Main .content form .wrapper{
margin-top:5px;
display: grid;
grid-template-columns: 20% 20% 20% auto 15%;
}
</style>
<section class='Main'>
<div class='content'>
<form action='/dashboard/post' method='post' >
%if 'edit' in data:
<input type='text' name='title' value='{{data["item"][0]}}' placeholder='ចំណងជើង' required />
<textarea name="content" id="editor" >{{data["item"][4]}}</textarea>
<div class='wrapper'>
<input type='text' name='book_title' required placeholder="ឈ្មោះសៀវភៅ" />
<input type='text' name='chapter' required placeholder="ជំពូក" />
<input type='text' name='thumb' value='{{data["item"][1]}}' required placeholder="តំណរភ្ជាប់រូបតំណាង" />
<input type='datetime-local' value='{{data["item"][2]}}' name='datetime' required />
<input type='hidden' name='editid' value='{{data["item"][3]}}' />
<input type='submit' value='ចុះផ្សាយ' />
</div>
<input name='entries' value='{{!data["item"][6]}}' type='hidden' />
%else:
<input type='text' name='title' placeholder='ចំណងជើង' required />
<textarea name="content" id="editor" ></textarea>
<div class='wrapper'>
<input type='text' name='book_title' required placeholder="ឈ្មោះសៀវភៅ" />
<input type='text' name='chapter' required placeholder="ជំពូក" />
<input type='text' name='thumb' required placeholder="តំណរភ្ជាប់រូបតំណាង" />
<input type='datetime-local' value='' name='datetime' required />
<input type='submit' value='ចុះផ្សាយ' />
</div>
<input name='entries' value='' type='hidden' />
%end
</form>
<div class='form'>
<select name='type'>
<option>YouTube</option>
<option>YouTubePlaylist</option>
<option>Facebook</option>
<option>OK</option>
<option>Dailymotion</option>
<option>Vimeo</option>
</select>
<input name='id' type='text' placeholder="អត្តសញ្ញាណវីដេអូ" required />
<select name='ending'>
<option>ចប់ហើយ</option>
<option>មិនទាន់ចប់</option>
</select>
<input onclick='genJson()' type="button" value="បញ្ចូលវីដេអូ" />
</div>
<table class='viddata'></table>
%if 'edit' in data:
<script>
var entries = JSON.parse('{{!data["item"][6]}}')
</script>
%end
<script>
if(entries.length > 0){
let html = ``
for(let v in entries){
episode += 1
html += `<tr>`
html += `<td title="Delete" onClick="deleteRow(event)" class="episode">${episode}</td>`
html += `<td class="td${episode}">${entries[v].type}</td>`
html += `<td class="td${episode}">${entries[v].id}</td>`
html += `<td class="td${episode}">${entries[v].ending}</td>`
html += `</tr>`
}
if($('.viddata').html() === ''){
$('.viddata').append('<tr>')
$('.viddata').append('<th>ភាគ/លុប</th>')
$('.viddata').append('<th>ប្រភេទ</th>')
$('.viddata').append('<th>អត្តសញ្ញាណ</th>')
$('.viddata').append('<th>ចប់ឬនៅ?</th>')
$('.viddata').append('</tr>')
}
$('.viddata').append(`${html}`)
}
</script>
<script src="/static/scripts/ckeditor/config.js"></script>
</div>
</section>
GitHub: https://github.com/Sokhavuth/REST-API
Vercel: https://rest-api-zeta.vercel.app