mirror of
https://github.com/Kenshin/simpread.git
synced 2026-02-01 15:41:29 +00:00
441 lines
17 KiB
JavaScript
441 lines
17 KiB
JavaScript
console.log( "===== simpread option enhancesite load =====" )
|
|
|
|
import TextField from 'textfield';
|
|
import Button from 'button';
|
|
import Dropdown from 'dropdown';
|
|
|
|
import {storage} from 'storage';
|
|
import * as run from 'runtime';
|
|
|
|
let notify, secret, cur_user = {}, ori_user = {}, site_info = {}, user_sites = {};
|
|
|
|
const category = [
|
|
{name: "科技媒体", value: "科技媒体"},
|
|
{name: "传统媒体", value: "传统媒体"},
|
|
{name: "新闻", value: "新闻"},
|
|
{name: "技术", value: "技术"},
|
|
{name: "博客", value: "博客"},
|
|
{name: "论坛", value: "论坛"},
|
|
{name: "其它", value: "其它"},
|
|
];
|
|
|
|
function loadingState( state, str ) {
|
|
if ( state == "init" ) {
|
|
notify = new Notify().Render({ content: "数据处理中,请稍等...", state: "loading" });
|
|
} else if ( state == "success" ) {
|
|
notify && notify.complete();
|
|
notify = undefined;
|
|
new Notify().Render( str + "成功。" );
|
|
} else {
|
|
notify && notify.complete();
|
|
notify = undefined;
|
|
new Notify().Render( 2, str );
|
|
}
|
|
}
|
|
|
|
// hack code
|
|
window.addEventListener( "siteinfochanged", event => {
|
|
site_info = event.data.info;
|
|
siteinfoRender();
|
|
});
|
|
|
|
/**
|
|
* Get serivce url
|
|
*
|
|
* @param {string} method name
|
|
*/
|
|
function getService( method ) {
|
|
return ( location.hostname != "simpread.ksria.cn" ? "http://localhost:3000" : "http://simpread.ksria.cn" ) + method;
|
|
}
|
|
|
|
/**
|
|
* Service Fail
|
|
*
|
|
* @param {object} xhr
|
|
* @param {string} textStatus
|
|
* @param {object} error
|
|
*/
|
|
function fail( xhr, textStatus, error ) {
|
|
console.error( xhr, status, error )
|
|
loadingState( "fail" );
|
|
}
|
|
|
|
/**
|
|
* Get sites {name,value} items
|
|
*
|
|
* @param {object} sites object
|
|
*/
|
|
function getSites( sites ) {
|
|
let items = [];
|
|
Object.keys( sites ).forEach( idx => {
|
|
const desc = sites[idx].global == true ? "" : "(未审核)"
|
|
items.push({ name: sites[idx].title + desc, value: idx });
|
|
})
|
|
return items;
|
|
}
|
|
|
|
/**
|
|
* Editor Plugin Empty Render
|
|
*/
|
|
function editorEmptyRender() {
|
|
$( ".preview" ).html( `<div class="empty"><span class="icon"></span><span>当前未选择任何适配站点</span></div>` );
|
|
}
|
|
|
|
/**
|
|
* Site info Empty Render
|
|
*/
|
|
function siteinfoEmptyRender() {
|
|
$( ".siteinfo" ).addClass( 'hide' );
|
|
}
|
|
|
|
/**
|
|
* Site info Render
|
|
*/
|
|
function siteinfoRender() {
|
|
if ( site_info == undefined || $.isEmptyObject( site_info ) ) {
|
|
$( ".siteinfo" ).addClass( 'hide' ).empty();
|
|
} else {
|
|
$( ".siteinfo" ).removeClass( 'hide' ).empty();
|
|
ReactDOM.render( <SiteInfo />, $( ".siteinfo" )[0] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sites Render
|
|
*/
|
|
function sitesRender() {
|
|
console.log( "current user all sites ", user_sites )
|
|
$( ".property .sites" ).empty();
|
|
if ( $.isEmptyObject( user_sites ) ) {
|
|
$( ".property .sites" ).parent().hide();
|
|
} else {
|
|
$( ".property .sites" ).parent().removeAttr("style");
|
|
ReactDOM.render( <Sites sites={ getSites( user_sites ) } />, $( ".property .sites" )[0] );
|
|
}
|
|
}
|
|
|
|
class Sites extends React.Component {
|
|
|
|
onChange( value, name ) {
|
|
if ( !$.isEmptyObject( user_sites[value] )) {
|
|
const temp = user_sites[value];
|
|
site_info = JSON.parse(JSON.stringify(temp));
|
|
|
|
delete site_info.site;
|
|
siteinfoRender();
|
|
|
|
// hack code
|
|
const evt = document.createEvent("Event");
|
|
evt.data = {
|
|
site: temp.site,
|
|
info: site_info,
|
|
}
|
|
evt.initEvent( "sitechanged", true, false );
|
|
window.dispatchEvent( evt );
|
|
} else new Notify().Render( 2, "获取站点信息时发生了错误,请重新绑定获取。" );
|
|
}
|
|
|
|
render() {
|
|
const items = this.props.sites;
|
|
return (
|
|
items.length > 0 ? <div>
|
|
<Dropdown name={ `共计 ${items.length} 条数据,下拉查看详细信息` } items={ items } width="100%" onChange={ (v,n)=>this.onChange(v,n) } />
|
|
</div> : <div></div>
|
|
)
|
|
}
|
|
}
|
|
|
|
class SiteInfo extends React.Component {
|
|
|
|
onChange( id, event ) {
|
|
site_info[id] = event.target.value
|
|
}
|
|
|
|
onDropdownChange( value ) {
|
|
site_info.category = value;
|
|
}
|
|
|
|
render() {
|
|
return(
|
|
<div>
|
|
<div className="row box-large">
|
|
<TextField value={ site_info.id }
|
|
multi={ false } floatingtext="ID" disable={true}
|
|
/>
|
|
<span className="space"></span>
|
|
<TextField value={ site_info.title }
|
|
multi={ false } floatingtext="当前站点名称" disable={false}
|
|
onChange={ event=>this.onChange( "title", event )}
|
|
/>
|
|
</div>
|
|
<div className="row box-large">
|
|
<TextField value={ site_info.create }
|
|
multi={ false } floatingtext="建立时间" disable={true}
|
|
onChange={ event=>this.onChange( "create", event )}
|
|
/>
|
|
<span className="space"></span>
|
|
<TextField value={ site_info.update == "" ? "没有任何更新时间" : site_info.update }
|
|
multi={ false } floatingtext="更新时间" disable={true}
|
|
onChange={ event=>this.onChange( "update", event )}
|
|
/>
|
|
</div>
|
|
<div className="row box-large">
|
|
<TextField value={ site_info.color }
|
|
multi={ false } floatingtext="前景色" disable={false}
|
|
onChange={ event=>this.onChange( "color", event )}
|
|
/>
|
|
<span className="space"></span>
|
|
<TextField value={ site_info.bgColor }
|
|
multi={ false } floatingtext="背景色" disable={false}
|
|
onChange={ event=>this.onChange( "bgColor", event )}
|
|
/>
|
|
</div>
|
|
<div className="row box-large">
|
|
<TextField value={ site_info.global == true || site_info.global == "true" ? "当前站点已经审核通过" : "当前站点未经审核" }
|
|
multi={ false } floatingtext="是否已经审核" disable={true}
|
|
/>
|
|
<span className="space"></span>
|
|
<Dropdown name={ site_info.category } items={ category } width="100%" onChange={(v)=>this.onDropdownChange(v)} />
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
}
|
|
|
|
export default class Import extends React.Component {
|
|
|
|
state = {
|
|
login: false,
|
|
}
|
|
|
|
onSecretChange( event ) {
|
|
secret = event.target.value;
|
|
}
|
|
|
|
login() {
|
|
loadingState( "init" );
|
|
$.ajax({
|
|
url : getService( "/users/service/get/" + this.props.uid ),
|
|
type : "POST",
|
|
data : {secret}
|
|
}).done( ( result, textStatus, jqXHR ) => {
|
|
if ( result.code == 200 ) {
|
|
loadingState( "success", "登录" );
|
|
cur_user = result.data;
|
|
ori_user = $.extend( true, {}, cur_user );
|
|
console.log( "current user is ", cur_user )
|
|
this.getSites( this.props.uid, "all" );
|
|
this.setState({ login: true });
|
|
} else if ( result.code == 401 ) {
|
|
loadingState( "faile", "管理员登陆失败,请验证管理员密匙!" );
|
|
} else loadingState( "faile", "获取后台服务失败,请稍后再试!" );
|
|
}).fail( fail );
|
|
}
|
|
|
|
getSites( uid, id ) {
|
|
loadingState( "init" );
|
|
$.ajax({
|
|
url : getService( "/sites/service/get/" + id ),
|
|
data : { uid },
|
|
type : "POST",
|
|
}).done( ( result, textStatus, jqXHR ) => {
|
|
loadingState( "success", "获取当前用户全部站点" );
|
|
if ( result.code == 200 ) {
|
|
result.data.forEach( item => {
|
|
user_sites[item.id] = item;
|
|
});
|
|
sitesRender();
|
|
} else if ( result.code == 404 ) {
|
|
loadingState( "faile", "当前用户没有任何站点,可以先新建 或 上传一个站点。" );
|
|
} else loadingState( "faile", "获取当前用户的站点获取失败,请稍后再试!" );
|
|
}).fail( fail );
|
|
}
|
|
|
|
insert( method, site ) {
|
|
loadingState( "init" );
|
|
if ( site.id.substr(0,8) != cur_user.uid.substr(0,8) ) {
|
|
new Notify().Render( 2, "注意:当前站并不是(管理员)的站。" );
|
|
delete site.uid;
|
|
}
|
|
$.ajax({
|
|
url : getService( "/sites/service/" + method ),
|
|
type : "POST",
|
|
data : site,
|
|
}).done( ( result, textStatus, jqXHR ) => {
|
|
loadingState( "success", "已提交" );
|
|
if ( result.code == 201 ) {
|
|
|
|
storage.remote.info.id = result.data.id;
|
|
storage.remote.info.create = result.data.create;
|
|
storage.remote.info.update = result.data.update;
|
|
delete storage.remote.info.global;
|
|
delete storage.remote.info.release;
|
|
siteinfoRender();
|
|
|
|
user_sites[result.data.id] = result.data;
|
|
sitesRender();
|
|
|
|
this.props.onUpdate && this.props.onUpdate( "update" );
|
|
} else loadingState( "faile", "提交失败,请稍后再试!" );
|
|
}).fail( fail );
|
|
}
|
|
|
|
delete( id ) {
|
|
loadingState( "init" );
|
|
$.ajax({
|
|
url : getService( "/sites/service/delete/" + id ),
|
|
type : "POST",
|
|
data : { uid: cur_user.uid },
|
|
}).done( ( result, textStatus, jqXHR ) => {
|
|
if ( result.code == 204 ) {
|
|
loadingState( "success", "已删除" );
|
|
delete user_sites[site_info.id];
|
|
sitesRender();
|
|
editorEmptyRender();
|
|
siteinfoEmptyRender();
|
|
//this.props.onUpdate && this.props.onUpdate( "safe" );
|
|
new Notify().Render({ mode: "snackbar", content: "是否也删除本地站?", action: "确认", cancel: "取消", callback: type => {
|
|
type != "cancel" && this.props.onUpdate && this.props.onUpdate( "delete" );
|
|
}});
|
|
} else loadingState( "faile", "删除失败,请稍后再试!" );
|
|
}).fail( fail );
|
|
}
|
|
|
|
update() {
|
|
const insert = () => {
|
|
const temp = JSON.parse(JSON.stringify(storage.remote)),
|
|
update = temp.info,
|
|
method = update.id.startsWith( "new::" ) ? "add" : "update";
|
|
delete temp.info;
|
|
update.uid = cur_user.uid;
|
|
update.id = update.id.replace( /^new::/, "" );
|
|
update.site = temp;
|
|
delete update.site.target;
|
|
this.insert( method, update );
|
|
}
|
|
if ( $.isEmptyObject( cur_user ) ) {
|
|
new Notify().Render({ mode: "snackbar", content: "需要先登录到服务器后才能提交!", action: "登录", cancel: "取消", callback: type => {
|
|
type == "action" && this.login();
|
|
return;
|
|
}});
|
|
return;
|
|
}
|
|
if ( !storage.remote ) {
|
|
new Notify().Render( "当前没有选择站点,请通过 新建 或选择一个本地站点。" );
|
|
return;
|
|
}
|
|
if ( storage.remote.name == "tempread::" ) {
|
|
new Notify().Render( 2, "新建的站需要保存刷新后才能提交!" );
|
|
return;
|
|
}
|
|
if ( !storage.remote.info ) {
|
|
new Notify().Render( "上传站点时需要录入一些必要信息。" );
|
|
site_info = { domain: run.ID( "site" ), title: "", category: "其它", create: "<无需填写,自动生成>", update: "", global: false, release: false, color: "#fff", bgColor: "#00bcd4" };
|
|
site_info.id = "new::" + storage.user.uid.substr( 0, 8 ) + "-" + site_info.domain;
|
|
storage.remote.info = site_info;
|
|
siteinfoRender();
|
|
} else if ( site_info.title == "" ) {
|
|
new Notify().Render( 2, "请最好填入当作站点的名称。" )
|
|
} else {
|
|
if ( !storage.remote.info.id.startsWith( "new::" ) && storage.remote.info.id.substr(0,8) != cur_user.uid.substr(0,8) ) {
|
|
new Notify().Render({ mode: "snackbar", content: "当前站点并不是由你建立,确定修改?", action: "确定", cancel: "取消", callback: type => {
|
|
if ( type == "cancel" ) return;
|
|
site_info.id = "new::" + storage.user.uid.substr( 0, 8 ) + "-" + site_info.domain;
|
|
insert();
|
|
}});
|
|
} else insert();
|
|
}
|
|
console.log( "current site is ", storage.remote.info )
|
|
}
|
|
|
|
remove() {
|
|
if ( !storage.remote || $.isEmptyObject( site_info )) {
|
|
new Notify().Render( "当前没有选择站点,请通过 新建 或选择一个本地站点。" );
|
|
return;
|
|
}
|
|
if ( site_info.release == true && cur_user.rule != 0 ) {
|
|
new Notify().Render( "当前站点已审核通过,无法删除,请联络管理员。" );
|
|
return;
|
|
}
|
|
new Notify().Render({ mode: "snackbar", content: "确定(从服务器上)删除(包括以审核的表)?", action: "确认", cancel: "取消", callback: type => {
|
|
if ( type == "cancel" ) return;
|
|
this.delete( site_info.id );
|
|
}});
|
|
}
|
|
|
|
permit() {
|
|
if ( !storage.remote || $.isEmptyObject( site_info )) {
|
|
new Notify().Render( "当前没有选择站点,请通过 新建 或选择一个本地站点。" );
|
|
return;
|
|
}
|
|
if ( site_info.global == true || site_info.global == "true" ) {
|
|
new Notify().Render( "当前站点已经审核通过,请勿重复提交" );
|
|
return;
|
|
}
|
|
new Notify().Render( "snackbar", "是否确认审核通过?", "确认", () => {
|
|
loadingState( "init" );
|
|
$.ajax({
|
|
url : getService( "/sites/service/permit/" + site_info.id ),
|
|
type : "GET",
|
|
}).done( ( result, textStatus, jqXHR ) => {
|
|
if ( result.code == 201 ) {
|
|
loadingState( "success", "当前站点已审核" );
|
|
console.log( result.data )
|
|
|
|
user_sites[result.data.id] = result.data;
|
|
sitesRender();
|
|
|
|
site_info = result.data;
|
|
storage.remote.info = site_info;
|
|
siteinfoRender();
|
|
} else loadingState( "faile", "删除失败,请稍后再试!" );
|
|
}).fail( fail );
|
|
});
|
|
}
|
|
|
|
logout() {
|
|
location.reload();
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<div>
|
|
<div style={{display: location.search == '?rule=administrator' ? 'block' : 'none'}}>
|
|
<TextField
|
|
multi={ false } placeholder="请输入管理员密匙"
|
|
onChange={ event=>this.onSecretChange( event )}
|
|
/>
|
|
</div>
|
|
{ this.state.login ?
|
|
<Button type="raised" text="退出登录"
|
|
style={{ "margin": "0" }} width="100%"
|
|
color="#fff" backgroundColor="#1976d2"
|
|
waves="md-waves-effect md-waves-button"
|
|
onClick={ ()=>this.logout() } /> :
|
|
<Button type="raised" text="登录到服务器"
|
|
style={{ "margin": "0" }} width="100%"
|
|
color="#fff" backgroundColor="#FF5252"
|
|
waves="md-waves-effect md-waves-button"
|
|
onClick={ ()=>this.login() } /> }
|
|
<Button type="raised" text="提交到服务器"
|
|
style={{ "margin": "25px 0 0 0" }} width="100%"
|
|
color="#fff" backgroundColor="#4CAF50"
|
|
waves="md-waves-effect md-waves-button"
|
|
onClick={ ()=>this.update() } />
|
|
{ this.state.login && cur_user.rule == 0 &&
|
|
<Button type="raised" text="审核当前站点"
|
|
style={{ "margin": "25px 0 0 0" }} width="100%"
|
|
color="#fff" backgroundColor="#3F51B5"
|
|
waves="md-waves-effect md-waves-button"
|
|
onClick={ ()=>this.permit() } />}
|
|
{ this.state.login &&
|
|
<Button type="raised" text="删除当前站点"
|
|
style={{ "margin": "25px 0 0 0" }} width="100%"
|
|
color="#fff" backgroundColor="#1976d2"
|
|
waves="md-waves-effect md-waves-button"
|
|
onClick={ ()=>this.remove() } />}
|
|
</div>
|
|
)
|
|
}
|
|
}
|