TV 채널 웹사이트: 관리자 게시물 페이지
베르셀: https://khmerweb-tv-channel.vercel.app/login
대시보드에서 게시물 페이지는 텍스트가 있거나 없는 비디오 게시를 준비할 수 있는 곳입니다. 따라서 텍스트 콘텐츠를 작성하고 텍스트에 그림을 삽입하려면 리치 텍스트 편집기가 필요합니다.
서식있는 텍스트 편집기 중 CKEditor 5를 무료로 사용할 수 있습니다. 아주 좋은 텍스트 편집기입니다. https://ckeditor.com/ckeditor-5/online-builder/ 에서 빌드하고 다운로드할 수 있습니다.
다른 입력 가젯이 있는 양식에 CKEditor를 포함하면 CKEDitor 콘텐츠가 다른 콘텐츠와 함께 서버로 자동 전송됩니다. 그리고 이러한 내용을 쉽게 복사하여 데이터베이스에 삽입할 수 있습니다.
그러나 비디오 콘텐츠 또는 비디오 재생 목록을 생성하고 서버로 보낼 범주 목록을 생성하려면 일부 JavaScipt 코드를 작성해야 합니다.
<!--views/backend/index.tpl-->
<link rel="stylesheet" href="/static/styles/backend/index.css" />
<section class="Index">
<header>
<div class="inner region">
<div class="page-title">{{ data["pageTitle"] }}</div>
<form action="/admin/search" method="post">
<select name="searchtype">
<option>Post</option>
<option>Category</option>
<option>User</option>
</select>
<input type="text" name="q" required />
<input type="submit" value="Search" />
</form>
<div class="logout">
{{ data["username"]}} | <a href="/">Home</a> | <a href="/login/logout">Logout</a>
</div>
</div>
</header>
<div class="main region">
<div class="sidebar">
<div class="inner">
<a href="/admin/post"><img src="/static/images/movie.png" /></a>
<a href="/admin/post">Post</a>
<a href="/admin/category"><img src="/static/images/category.png" /></a>
<a href="/admin/category">Category</a>
<a href="/admin/upload"><img src="/static/images/upload.png" /></a>
<a href="/admin/upload">Upload</a>
<a href="/admin/user"><img src="/static/images/users.png" /></a>
<a href="/admin/user">User</a>
<a href="/admin/setting"><img src="/static/images/setting.png" /></a>
<a href="/admin/setting">Settings</a>
</div>
</div>
<div class="content">
<%
if("/post" in data["route"]):
include("backend/post.tpl")
end
%>
</div>
</div>
<div class="footer region">
<div class="info">Total number of items:</div>
<ul></ul>
<div class="pagination">
<img onclick="paginate(`{{ data['route'] }}`)" src="/static/images/load.png" />
</div>
<div class="credit">
<a href="https://khmerweb.vercel.app/">© Khmer Web 2022</a>
</div>
</div>
</section>
<!--views/backend/post.tpl-->
<link rel="stylesheet" href="/static/styles/backend/post.css" />
<script src="/static/scripts/ckeditor/ckeditor.js"></script>
<script src="/static/scripts/video.js"></script>
<script src="/static/scripts/addCategory.js"></script>
<section class="Post">
<form action="/admin/post" method="post" name="form" onSubmit="submitForm(event)">
<input type="text" name="tilte" required placeholder="Post title" />
<textarea name="content" id="editor"></textarea>
<input type="text" name="categories" required placeholder="Categories" />
<div class="wrapper">
<select id="category" onChange="getCategory()">
<option>Slect a category</option>
<option>News</option>
<option>Entertainment</option>
<option>Movie</option>
</select>
<input type="text" name="thumb" required placeholder="Thumbnail" />
<input type="datetime-local" name="datetime" required />
<input type="submit" value="Publish" />
</div>
<input name='videos' value='' type='hidden' />
</form>
<div class="video-wrapper" >
<select name="type">
<option>YouTube</option>
<option>YouTubePL</option>
<option>Facebook</option>
<option>OK</option>
</select>
<input type="text" name="videoid" required placeholder="Video id" />
<select name="status">
<option>End</option>
<option>Continue</option>
<option>~ End</option>
</select>
<input onclick="genJson()" type="submit" value="Insert video" />
</div>
<div class='viddata'>
<div></div>
</div>
</section>
<script src="/static/scripts/ckeditor/config.js"></script>
/* public/styles/backend/post.css */
.Post form .ck-editor__editable{
min-height: 300px;
color: black;
}
.Post input, .Post select{
font: var(--body-font);
padding: 2px 5px;
}
.Post input{
width: 100%;
}
.Post form .wrapper,
.Post .video-wrapper,
.Post .viddata div{
display: grid;
grid-template-columns: 20% 40% auto 15%;
}
.Post .viddata div{
width: 100%;
}
.Post .viddata div p:hover{
cursor: pointer;
color: red;
}
.Post .viddata b,
.Post .viddata input,
.Post .viddata p{
font: var(--body-font);
padding: 3px 5px;
background: rgb(208, 216, 228);
border: 1px solid grey;
text-align: center;
color: black;
}
.Post .viddata input{
background: white;
}
// static/scripts/video.js
let episode = 0
const genJson = () => {
let json = $('input[name="videos"]').val()
if((json !== '')&&(json !== '[]')){
json = JSON.parse(json)
episode = json.length
}else{
episode = 0
}
const type = $('select[name="type"').val()
const id = $('input[name="videoid"').val()
const status = $('select[name="status"').val()
let video = {
type: type,
id: id,
status: status,
}
let success = false
for(let v in video){
if(video[v] === ''){
alert('You need to fill the required field '+v)
success = false
break
}else{
success = true
}
}
if(success){
let json = $('input[name="videos"]').val()
video = {
type: type,
id: id,
status: status,
}
if((json === '')){
json = JSON.stringify([video])
$('input[name="videos"]').val(json)
}else{
json = JSON.parse(json)
json.push(video)
json = JSON.stringify(json)
$('input[name="videos"').val(json)
}
let html =``
for(let v in video){
html += `<input value="${video[v]}" required />`
}
html += `<p title="Delete" onClick="deleteRow(event)" class="episode">${++episode}</p>`
html = `<div>${html}</div>`
if($('.viddata div').html() === ''){
$('.viddata div').append('<b>Type</b>')
$('.viddata div').append('<b>Video id</b>')
$('.viddata div').append('<b>Status</b>')
$('.viddata div').append('<b>Part/Delete</b>')
}
$('.viddata div:eq(0)' ).after(html)
}
}
function submitForm(e){
e.preventDefault()
const is_video = $('input[name="videos"').val()
if((is_video !== '') && (is_video !== '[]')){
episode = JSON.parse(is_video).length
let videos = []
let part = {}
let key = {0:'type', 1:'id', 2:'status'}
for(let v=1; v<=episode; v++){
for(let j=0; j<3; j++){
part[key[j]] = $(`.viddata div:eq(${v}) input:eq(${j})`).val()
}
videos.push({...part})
}
const json = JSON.stringify(videos)
$('input[name="videos"').val(json)
}
document.forms["form"].submit()
}
function deleteRow(e) {
e.target.parentElement.remove()
let index = parseInt(e.target.innerHTML)
index = index - 1
let json = $('input[name="videos"]').val()
json = JSON.parse(json)
json.splice(index, 1)
episode = json.length
json = JSON.stringify(json)
$('input[name="videos"').val(json)
for(let v=episode; v>-1; v--){
$('.episode').eq(v).html(episode-v)
}
}
// static/scripts/addCategory.js
function getCategory(){
const category = $('#category option:selected').text()
$('select').prop('selectedIndex',0)
let categories = $('[name=categories]').val()
if(categories === ''){
categories += category
}else{
categories += (`, ${category}`)
}
$('[name=categories]').val(categories)
}
Reference
이 문제에 관하여(TV 채널 웹사이트: 관리자 게시물 페이지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sokhavuth/tv-channel-website-admin-post-page-546g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)