xiunobbs-4.0.4 V2融合 正式版
nenge 22天前

EMM 发现很多插件各种动不动覆盖~

所以融合搁置吧! 基于群|卝||主的V2修改版

如果有任何BUG请及时反馈,

本机环境PHP7.0.0 ~ PHP8.4.1,

install.sql  低于mysql8的版本

install8.sqll 高于等于mysql8

git clone https://cnb.cool/nenge/xiunobbs-4.0.4.git
git pull
//往后此为最新版 欢迎提交修改

下载地址 https://cnb.cool/nenge/xiunobbs-4.0.4/-/releases

 

环境

  • 尽管PHP7.0.0 - PHP8.4.1均可运行,但是推荐PHP7.2+
  • MySQL情况未知,我的版本的8.0.25,但是群里很多是5.6 5.7老版本,如有报错可以反馈.

cnb图床?

首先在cnb.cool创建仓库,浏览器F12,应用>Cookies 复制'CNBSESSION','csrfkey'

插件限定类

例如插件 xn_abc,对应类文件地址为 plugin/xn_abc/class/xn_abc.php 此方法可以替代原来的全局增加model文件问题,该类文件仍旧可以使用 // hook 让其他插件注入
使用方法
一般来说PHP根本不在乎你塞了多少函数,对性能影响微乎其微,所以不要有焦虑.国外的那些标准反而不推荐all in one(所有文件在一起xiunophp.min.php)

 
//plugin/xn_abc/class/xn_abc.php 
class xn_abc{
	public function __construct(){
		echo 'OK';
	}
	public static function app()
	{
		if (!isset(self::$_app)):
			self::$_app = new self;
		endif;
		return self::$_app;
	}
	public static function user()
	{
		return MyDB::t('user')->selectFirst(['uid'=>1]);
	}
}
//插件的任意操作位置,相对来说按需加载
xn_abc::app(); // output OK
xn_abc::user();//输出array(用户数据)

新的查询方式 MyDB::t('表名')

使用此方法的插件将不再向下兼容,操作有一定可扩展性

 
$db->table['user'] = new class extends \lib\table{
	//替代此user表的查询方式
}('bbs_user','uid','xiuno4');
var_export(MyDB::t('user')->selectAll());

内置servicerWoker

  • 缓存含有CDN,特定CDN网站的远程资源
  • 缓存本地含有vendor目录的资源,因此修改文件可以采用重命名新名字,或者增加后缀方式
     
    import * as CKEDITOR from '../vendor/ckeditor5/ckeditor5.js?v20250422';
    import * as CKEDITOR from '../vendor/ckeditor5/ckeditor5-v20250422.js';
    

默认编辑器

具体查找 view/htm/post.htm
可通过$conf['editor_js'] 进行设置,只能两个值,'ckeditor','tinymce' 其他值被认为不启用.个人认为CKeditor相对tinymce更好!

 
<?=in_array($conf['editor_js'] ??'ckeditor',['ckeditor','tinymce'])?'import(new URL("'.$conf['view_url'].'js/module/editor-'.($conf['editor_js'] ??'ckeditor').'.js",location)).then(Module=>{new Module.default(jform[0]);$(".attachlist_parent>a").prop("hidden",true);$(".attachlist_parent>fieldset").prop("hidden",true);});':''?>

ckeditor可以去(https://ckeditor.com/ckeditor-5/builder/)定制功能!参考main.js中toolbar,plugins替换`editor-ckeditor.js`中对应参数 的即可!

  • 编辑器接口
     
    	const {default:MyEditor} = await import(new URL("view/js/module/editor-ckeditor.js",location));//import在非ESM中是要绝对地址,所以套个new URL即可!
    	const editor = new MyEditor(jform[0]);//对一个表单对象初始化 jfrom = $('#form)
    	editor.save();//保存到jform>[name="message"]中并返回HTML
    	editor.insert(html);//插入HTML
    	jform.triggerHandler('save');//保存HTML到 jform>[name="message"]中
    	jform.triggerHandler('insert',HTML);//插入HTML(没试过)
    	jform[0].toEvent('insert',HTML);//插入HTML
    	jform[0].dispatchEvent(new CustomEvent('insert',HTML));//插入HTML 100%可用标准事件
    	jform[0].dispatchEvent(new CustomEvent('save',''));//保存HTML到 jform>[name="message"]中
    	jform[0].editor //editor
    	//可选参数
    	editor.pid = 1;//设置当前编辑的帖子PID值,会影响获取附件列表.如果设置你当前编辑的帖子,会在附件列表看到贴内附件
    

上传新接口

attach/upload 只接受image/zip/rar/7z等文件

 
const input = document.createElement('input');
input.type = 'file';
input.accept = 'image/*';
input.multiple = false;
input.addEventListener('change', async function () {
	const data = new FormData;
	data.set('file',this.files[0]);//文件blob FILE
	$.ajax({
		url: '?attach.htm',
		data,
		processData: false, //不能省略
        contentType:false,//不能省略
		dataType: 'json',
		type: 'POST',
		beforeSend(xhr) {
			xhr.setRequestHeader('ajax-fetch', '1');
			xhr.setRequestHeader('content-action', 'attach/upload');
		}
	});
});
input.click();
input.remove();

attach/list 查询接口,可选参数pid

 
//查看列表
const data = new FormData; //可选
data.set('pid','编辑帖子ID');
$.ajax({
	url: '?attach.htm',
	data,
	dataType: 'json',
	processData: false, //不能省略
	contentType:false,//不能省略
	type: 'POST',
	beforeSend(xhr) {
		xhr.setRequestHeader('ajax-fetch', '1');
		xhr.setRequestHeader('content-action', 'attach/list');
	},
	success(result) {
		//{'_1'=>$attach,'33'=>$attach} 带_就是临时附件
	}
});

attach/delete 删除接口, 必须参数aid

 
//查看列表
const data = new FormData; //可选
data.set('aid','附件aid');
$.ajax({
	url: '?attach.htm',
	data,
	dataType: 'json',
	processData: false, //不能省略
	contentType:false,//不能省略
	type: 'POST',
	beforeSend(xhr) {
		xhr.setRequestHeader('ajax-fetch', '1');
		xhr.setRequestHeader('content-action', 'attach/delete');
	},
	success(result) {
		//{code:0,message} 
	}
});
最后于 8天前 被nenge编辑 ,原因:
最新回复 (26)
全部楼主
  • oliolo 版主
    22天前 2
    0
    php的版本升级,功能类插件怕会出问题。
  • geruixi
    22天前 3
    0
    上传问题有修复吗,原版上传20M以上的文件会失败,改ng/php都不行
  • juse
    22天前 4
    1
    不管怎么说,技术贴必须要支持~!!!!
  • nenge 楼主
    21天前 5
    1
    geruixi 上传问题有修复吗,原版上传20M以上的文件会失败,改ng/php都不行
    这个没改其他,
    主要修改原来的简单的路由判断为更强大的判断
    数据库操作改善(预处理)

    稍后增加一个上传接口把,方便使用tinymce等插件上传
  • Tillreetree 版主
    21天前 6
    0
    nenge 这个没改其他, 主要修改原来的简单的路由判断为更强大的判断 数据库操作改善(预处理) 稍后增加一个上传接口把,方便使用tinymce等插件上传
    最好钦定一个编辑器,不然还得是类似五代十国的感觉
  • didiaog
    21天前 7
    0
    php7+可以安装使用吗
  • 流口水的鱼
    21天前 8
    0
    这个必须顶
  • nenge 楼主
    21天前 9
    0

    TinyMce编辑器统一方案,如果你有喜欢的编辑器不妨推荐一下,目前准备增加CKEditor免费版

     

    插件hook点 不能出现任何PHP语句,要纯JS

    // hook tinymce_class.htm // hook tinymce_options.htm // hook tinymce_init.htm // hook tinymce_setup.htm // hook tinymce_end_setup.htm // hook tinymce_attach_modal.htm


    ckeditor

    最后于 13天前 被nenge编辑 ,原因:
  • nenge 楼主
    21天前 10
    0
    didiaog php7+可以安装使用吗
    7.x用建议用原版即可,
  • 木头人
    20天前 11
    0
    沙发我没有,板凳我没有,板也没有,只好站在后面排队支持! 
  • xx123456
    20天前 12
    0
    感谢楼主ing!!!
  • geruixi
    18天前 13
    0
    线上模式无法用,管理员发帖都发不了,提示没权限,实际上有权限的、线上模式语言包都读取不了。
  • nenge 楼主
    18天前 14
    0
    geruixi 线上模式无法用,管理员发帖都发不了,提示没权限,实际上有权限的、线上模式语言包都读取不了。
    清空缓存看看,我猜大概率是用户组信息没加载,导致权限异常。说一下你的服务器环境。
  • nenge 楼主
    18天前 15
    0
    geruixi 线上模式无法用,管理员发帖都发不了,提示没权限,实际上有权限的、线上模式语言包都读取不了。
    看一下logo里的db error有哪些错误
  • geruixi
    18天前 16
    0
    nenge 清空缓存看看,我猜大概率是用户组信息没加载,导致权限异常。说一下你的服务器环境。
    PHP8.2
  • nenge 楼主
    17天前 17
    0
    geruixi PHP8.2
    关闭DEBUG会使用 xiunophp.min.php 这个聚合文件,可能是导致异常原因,稍后更新删掉,避免加载错误
  • geruixi
    17天前 18
    1
    安装后,登陆提示密码错误。注册时提示加密后长度有问题
  • nenge 楼主
    17天前 19
    0
    geruixi 安装后,登陆提示密码错误。注册时提示加密后长度有问题
    下载最新版覆盖重试,之前覆盖不彻底(new_cache发生错误),导致存在安装时,管理员帐号没有正确写入
  • geruixi
    17天前 20
    0
    1.安装是没有插入默认版块,导致后台新建不了版块
    2.安装时新建帐号还是有问题,密码混乱字段是明文密码,导致管理帐号无法登陆,提示密码错误
    3.无法上传文件。
    4.发帖页加载编辑器有点慢。
    5.插件后台识别插件封面的路径有问题,安装插件后设置按钮没显示。

  • nenge 楼主
    17天前 21
    0
    geruixi 1.安装是没有插入默认版块,导致后台新建不了版块 2.安装时新建帐号还是有问题,密码混乱字段是明文密码,导致管理帐号无法登陆,提示密码错误 3.无法上传文件。 4.发帖页加载编辑器有点慢。 5 ...
    你可以把自己子域名指向本地(127.0.0.1)这样本地就能https,缓存就会生效,编辑器加载速度瞬间打开。
    文件不能上传可能是权限问题。
    后台插件路径问题稍后修复。
  • nenge 楼主
    16天前 22
    0

    具体出来请看 /xiunophp/class/plugin.php

     

    输出一个变量,或函数值

    <!--{{ $a }}--> 等价于<?=$a?>

    <!--{{ \date() }}--> 要带反斜杠\ 不然会被认为执行 <?=MyApp::app->date()?>

    <!--{{ plugin::site('abc/icon.png') }}->  等价于 网站目录/plugin/abc/icon.png

    ------

    <!--{echo $aa}-->  等价于 <?=$a??''?> 因此不确定值可以用echo

    <!--{each $a $b $c}-->  等价于 <?php foreach($a as $b=>$c): ?>

    <!--{/each}--> 等价于 <?php endforeach; ?> 两者必须组合使用

     

    <!--{if $a}--> 等价于 <?php if($a): ?>

    <!--{elseif $a}--> 等价于 <?php elseif($a): ?>

    <!--{/if}--> 等价于 <?php endif; ?> if条件结束必须用它闭合

    上面的标签均可以省略 <!-- -->

     

    <!---{template(APP_PATH.'view/htm/xxx.htm)}--> 等价于原来的 include 模板 <!-- -->不能省略

     

    特定变量

    MyApp::conf('xxx') 读取conf中的变量

    MyApp::data('xxx') 读取data中的变量

    MyApp::value('xxx') 读取路由分析内容的变量 例如url为当前地址,0等于/forum-1 中的 1,module等于forum

    MyApp::url('xxx') 是根据当前脚本生成URL 首页是index?xxx.html 后台则是 admin/index.php?xxx.html

    如果后台中想返回首页则用 MyApp::topurl('xxx')

    MyApp::js('xxx.js') 读取js文件WEB地址

    MyApp::css('xxx.css') 读取css文件WEB地址

    MyApp::scss('scss文件绝对地址') 生成scss文件WEB地址,可以使用第二个参数作为文件保存位置,否则被保存至view/css/文件夹中!

    MyApp::scss('scss文件绝对地址') 生成的是<link ....> 可以直接模板中使用

    MyApp::site('xxx') 返回当前网站WEB目录

    MyApp::path('xxx') 返回网站根目录物理地址

    MyApp::view_site('') 如果后设置 view_site是网址,那么他就会使用该地址替代 MyApp::site('view/')

    MyApp::upload_site('')同理,就是让别人以为你网站是储存分离了

    \lib\html::getText($html) 可以获取HTML文本中纯文本

    \lib\html::parse() 方法则是格式化html剔除可能存在的危险脚本,
     
    MyDB::t('user')->xxx 是替代原来的db_xxx等操作, 具体看VScode的代码提示
    使用预处理查询,可以避免SQL注入,它有两个驱动 mysqli(推荐)
    PDO尽管也是预处理但是它底层并不是,因此使用SQL分析的时候它会暴露查询信息
     
    model\tpl::xxx 是一些表单组件 不过设计的时候是用在5.3的
     
    新的JS可以通用处理一些AJAX请求,无需在页面中增加额外JS代码
    例如 onget="true" onpost="true" 放在需要发送AJAX请求的HTML元素属性中即可
    至于复杂的请求可以先注册
    X.ajaxs.set('xxx',func) 那么onget='xxx' 即可,需要动态添加可以在模板输出之前使用 $GLOBALS['importjs]['xx'] = '你的脚本地址';
    最后于 16天前 被nenge编辑 ,原因:
  • caitianzhihot
    11天前 23
    0
    不错的帖子!
  • daxiaowang
    11天前 24
    0
    楼主,我只是来混个熟的!老板,侬亿雷凑闹嫩了!
  • daxiaowang
    11天前 25
    0
    顶顶顶顶顶顶顶!!!
  • z823891611
    9天前 26
    0
    我要拿出这帖子奉献给世人赏阅,我要把这个帖子一直往上顶,往上顶!顶到所有人都看到为止! 
  • jhkj
    8天前 27
    0
    我要拿出这帖子奉献给世人赏阅,我要把这个帖子一直往上顶,往上顶!顶到所有人都看到为止! 
返回
nenge
一级用户组
9
主题数
24
帖子数
扫码访问