明说PHPCMS(一)

PHPCMS简介

功能(用来做什么?)

CMS是什么?

CMS: “Content Management System"的缩写,意为"内容管理系统”。
PHPCMS是众多CMS(内容管理系统)中的一款,该系统采用 PHP5+MYSQL 做为技术基础进行开发。采用 OOP(面向对象)方式进行多层架构设计, 模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,二次开发,提供大中型网站的内容管理系统解决方案。

简单的说,如果你需要自己开发一套网站,你的网站主要是做内容展示,不论是文字还是图片,或者是视频等,比较便捷的方法就是使用一套成熟的CMS来解决(本质就是一个软件或者应用),快捷高效,居家必备之良品。而PHPCMS就满足这个需求,简单的操作,不用撸代码也实现大部分要求。即使是程序员也可以偷个懒,节省体力和为数不多的头发。

适用人群

文艺青年,拥有一个自己的空间;
学生党,兴趣爱好使之然;
有需求的程序员,工作内容…
公司Boss,做官网,做门户,做需求…

安装

安装准备

1.下载:打开官方网站
地址: http://www.phpcms.cn/, 进入软件下载频道 http://soft.phpcms.cn/ 在程序下载中找到 PHPCMS 软件下载。如果没有找到,可以在官网论坛里找相关更新的帖子等。正式版:http://www.phpcms.cn/html/2010/phpcms_1229/51.html

安装环境

2.安装环境
PHPCMS 具备跨平台特性,可以运行于 Linux/FreeBSD/Unix 及微软Windows 2000/2003 等各种操作系统环境下。
简单一点的操作,下载一个集成环境包,在本地搭建服务器,例如wamp,phpstudy等,一键安装,快捷方便,其中环境版本默认即可。

安装步骤

3.phpcms安装步骤

  • 以phpstudy集成环境为例,将下载的安装包解压在服务器www根目录下,将install_package 目录下面的文件复制到www根目录下;
  • 在浏览器中访问本目录:如localhost/install_package ,进入如下安装页面Alt
  • 中间的步骤默认选择,省略到这一步,注意数据库账号密码的匹配以及字符集的匹配在这里插入图片描述
  • 通过这一步就安装完成了,之后登陆后台,进行操作。在这里插入图片描述

特点

  • 站群系统
    所谓站群,是指建立在统一标准、统一技术构架基础之上,分级管理,分级维护,信息可以实现基于特定权限共享呈送的网站集合。并不是把很多个网站集中在一起就可以称得上是站了,一定是要:统一,分级管理,信息共享,单点登录才可以。站群实现了技术标准统一,能够互联互通,实行集群化管理,相对一致的网站运行和服务规范。
  • 多发布点
    PHPCMS V9 内置发布点功能,可以将同一或者多个站点分别发布到不同服务器上, 各发布点绑定不同域名, 实现多域名访问和服务器集群部署,加强了网站的负载能力。
  • 模块化开发方便扩展
    系统引入模块式开发理念,内置功能模块可自由地安装与卸载, V9 特别设计的二次开发扩展方式,在不改变核心程序本身代码的同时,也可订制或自行开发新功能,扩展新的功能。
  • 数据表分离
    V9 数据模型功能,允许用户把不同的数据表,分离到不同的数据库服务器上。以实现负载的分离,更加符合大访问量网站的需求。为用户提供更好的用户体验。

简单的说,系统功能齐全,模板方便加载和更改,可以全方位支持常规需求。整个系统而言,界面清新,操作简单,可自定义模块,是一款成熟的CMS。

模块分析

目录结构

PHPCMS V9 的各个目录层次清晰、功能分明,其主要目录结构如下表所示:
根目录
| – api API 目录
        | – caches 缓存文件目录
        | – configs 系统配置文件目录
| – caches_* 系统缓存目录
| – phpcms PHPCMS 框架主目录
        | – languages 框架语言包目录
        | – libs 框架主类库、主函数库目录
        | – model 框架数据库模型目录
        | – modules 框架模块目录
| – templates 框架系统模板目录
| – phpsso_server phpsso 主目录
| – statics 系统附件包
        | – css 系统 css 包
        | – images 系统图片包
        | – js 系统 js 包
| – uploadfile 网站附件目录
| – admin.php 后台管理入口
| – index.php 程序主入口
| – crossdomain.xml FLASH 跨域传输文件
| – robots.txt 搜索引擎蜘蛛限制配置文件
| – favicon.ico 系统 icon 图标

目录分析:主要用到的模块在/phpcms/model之中,可以根据需要在后台增加模块或者手动复制文件夹,根据需求新增模块。

常用模块

admin(后台模块)

后台可视化操作,对整个站点进行管理,包括站点管理、基本设置、安全配置等,有模块、内容、用户、界面、扩展、sso等栏目,可方便操作。

在这里插入图片描述代码目录:/phpcms/model/admin

content(内容模块)

内容模块即文章功能,是系统的主要内容模型之一, V9 系统在之前 PHPCMS SP 系列系统功能的基础上做了更进一步优化及功能上的创新,简化了一些文章发布时的操作流程。在后台内容列表中可以对内容进行单个或批量操作和管理。
在这里插入图片描述代码目录:/phpcms/model/centent

member(会员模块)

随着网站的发展会员功能以及是网站中必不可分的一部分。会员功能的存在对于一个网站提高网站本身对用户的粘合度。随着会员功能的逐渐发展,对于会员功能的发展也更为不仅仅只支持会员注册,会员登录,会员修改密码,会员找回密码等基本功能。现在已经发展成为一个能够支持多系统整合,支持多种会员模型存在的一个复杂且实用的模块。
在这里插入图片描述代码目录:/phpcms/model/member

原理分析

MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

PHPCMS中同样也应用的这种业务逻辑,在一个模块中
模块访问方法[示例]:

www.yourdomain.com/index.php?m=content&c=index&a=show&id=1

参数名称描述位置
m模型/模块名称phpcms/modules 中模块目录名称
c控制器名称phpcms/modules/模块/*.php 文件名称
a事件名称phpcms/modules/模块/*.php 中方法名称

其中
m = content 为模型/模块名称位于 PHPCMS/modules/content
c = index 为控制器名称位于 PHPCMS/modules/content/index.php
a = show 为事件名称位于 PHPCMS/modules/content/index.php 中 show()方法
id = 1 为其他参数与正常 get 传递参数形式相同

实例分析

简单的一个内容Demo,部分代码分析

control代码

public function index() {
	    
		$memberinfo = $this->memberinfo;
		$grouplist = getcache('grouplist');
		$priv_db = pc_base::load_model('category_priv_model'); //加载栏目权限表数据模型
		//数据传入
		if(isset($_POST['dosubmit'])) {
			//数据处理
			
			//领导人简介字段入库前调整
			$pre_leader_desc = array();
			foreach ($_POST['info']['company_leader_desc'] as $k => $v) {
				if(trim($v)){
					$pre_leader_desc[] = $v;					
				}
			}
			
			$catid = intval($_POST['info']['catid']);

		   //加载模型
			$this->content_db = pc_base::load_model('content_model');
			$this->content_db->set_model($modelid);
			$table_name = $this->content_db->table_name;
			$fields_sys = $this->content_db->get_fields();
			$this->content_db->table_name = $table_name.'_data';
			
			$fields_attr = $this->content_db->get_fields();
			$fields = array_merge($fields_sys,$fields_attr);
			$fields = array_keys($fields);
			$info = array();
			foreach($_POST['info'] as $_k=>$_v) {
				if($_k == 'content') {
					$info[$_k] = remove_xss(strip_tags($_v, '<p><a><br><img><ul><li><div>'));
				} elseif(in_array($_k, $fields)) {
					$info[$_k] = new_html_special_chars(trim_script($_v));
				}
			}
		
			//数据入库
			$info['username'] = $memberinfo['username'];
			if(isset($info['title'])) $info['title'] = safe_replace($info['title']);
			$this->content_db->siteid = $siteid;
			$id = $this->content_db->add_content($info);
			
			//缓存结果
			$model_cache = getcache('model','commons');
			$infos = array();
			foreach ($model_cache as $modelid=>$model) {
				if($model['siteid']==$siteid) {
					$datas = array();
					$this->content_db->set_model($modelid);
					$datas = $this->content_db->select(array('username'=>$memberinfo['username'],'sysadd'=>0),'id,catid,title,url,username,sysadd,inputtime,status',100,'id DESC');
					if($datas) $infos = array_merge($infos,$datas);
				}
			}
			setcache('member_'.$memberinfo['userid'].'_'.$siteid, $infos,'content');
			//缓存结果 END
			//跳转首页
			showmessage(L('contributors_success'), APP_PATH.'index.php?m=member&siteid=1');
			
		}

model代码

	/**
	 * 添加内容
	 * 
	 * @param $datas
	 * @param $isimport 是否为外部接口导入
	 */
	public function add_content($data,$isimport = 0) {
		
		
		if($isimport) $data = new_addslashes($data);
		
		$this->search_db = pc_base::load_model('search_model');
		$modelid = $this->modelid;
		require_once CACHE_MODEL_PATH.'content_input.class.php';
        require_once CACHE_MODEL_PATH.'content_update.class.php';
		$content_input = new content_input($this->modelid);
		$inputinfo = $content_input->get($data,$isimport);
		
		$systeminfo = $inputinfo['system'];
		$modelinfo = $inputinfo['model'];
		
		if($data['inputtime'] && !is_numeric($data['inputtime'])) {
			$systeminfo['inputtime'] = strtotime($data['inputtime']);
		} elseif(!$data['inputtime']) {
			$systeminfo['inputtime'] = SYS_TIME;
		} else {
			$systeminfo['inputtime'] = $data['inputtime'];
		}

		//读取模型字段配置中,关于日期配置格式,来组合日期数据
		$this->fields = getcache('model_field_'.$modelid,'model');
		$setting = string2array($this->fields['inputtime']['setting']);
		extract($setting);
		if($fieldtype=='date') {
			$systeminfo['inputtime'] = date('Y-m-d');
		}elseif($fieldtype=='datetime'){
 			$systeminfo['inputtime'] = date('Y-m-d H:i:s');
		}

		if($data['updatetime'] && !is_numeric($data['updatetime'])) {
			$systeminfo['updatetime'] = strtotime($data['updatetime']);
		} elseif(!$data['updatetime']) {
			$systeminfo['updatetime'] = SYS_TIME;
		} else {
			$systeminfo['updatetime'] = $data['updatetime'];
		}
		$inputinfo['system']['username'] = $systeminfo['username'] = $data['username'] ? $data['username'] : param::get_cookie('admin_username');
		$systeminfo['sysadd'] = defined('IN_ADMIN') ? 1 : 0;
		
		//主表
		$tablename = $this->table_name = $this->db_tablepre.$this->model_tablename;
		$id = $modelinfo['id'] = $this->insert($systeminfo,true);
		$this->update($systeminfo,array('id'=>$id));
		$this->table_name = $tablename;
		$this->update(array('url'=>$urls[0]),array('id'=>$id));
		
		//合并后,调用update
		$merge_data = array_merge($systeminfo,$modelinfo);
		$merge_data['posids'] = $data['posids'];
		$content_update->update($merge_data);		
		}
		//更新附件状态
		if(pc_base::load_config('system','attachment_stat')) {
			$this->attachment_db = pc_base::load_model('attachment_model');
			$this->attachment_db->api_update('','c-'.$systeminfo['catid'].'-'.$id,2);
		}
		//生成静态
		if(!$isimport && $data['status']==99) {
			//在添加和修改内容处定义了 INDEX_HTML
			if(defined('INDEX_HTML')) $html->index();
			if(defined('RELATION_HTML')) $html->create_relation_html($catid);
		}
		return $id;
	}

view代码

{template 'content', 'header'}
{template 'content','nav'}
<link href="{CUSTOM_STATIC_PATH}css/webuploader.css" rel="stylesheet">
<script type="text/javascript">

var charset = '{CHARSET}';
var uploadurl = '{php echo pc_base::load_config('system ','upload_url ')}';

</script>

<!-- 完善信息开始 -->
  <div class="con-wrap">
	  	<form name="form-msg" class="form-msg" id="qymsg-form" action="" method="post">
      		<input type="hidden" name="info[catid]" value=9>
				<div class="tit">信息</div>
				<div class="form-group">
					<label for="title">全称</label>
					<input type="text" class="input-lg form-control" id="title" name="info[title]"  value="{$memberinfo[username]}">
				</div>
     		 <input name="forward" type="hidden" value="{HTTP_REFERER}">
     		 <input name="id" type="hidden" value="{$id}">
			<button type="submit"  name="dosubmit" class="form-btn">&nbsp;&nbsp;</button>
		</form>
  </div>

<!-- 完善信息结束 -->
<script src="{STATIC_PATH}369_statics/js/bootstrapValidator.min.js"></script>
<script src="{CUSTOM_STATIC_PATH}js/webuploader.min.js"></script>

{template 'content', 'footer'}

其中相关的语法及知识,可查阅相关资料。

参考资料:
PHPCMS V9白皮书.pdf
PHPCMS V9产品开发权威指南.pdf
PHPCMS V9用户手册.chm
百度百科

声明:仅供复盘积累,其中知识多参考官方文档,若有个人理解错误之处,忘大佬们海涵,欢迎拍砖。交流微信Flylivepmm。

修改内容列表: 1. 支持PHP8 2. 支持HTTPS环境 3. 支持MySQL8+ 4. 修改PHPCMS目录为CMS 5. 验证码修改 6. 支持H5上传,移除Flash上传 7. 修改后台缩略图裁切图片,移除Flash裁切改为H5裁切 8. 后台附件上传修改为H5上传,会员头像上传修改为H5上传 9. 修改后台界面,修改后台登录界面、后台锁屏界面、后台内容界面 10. 修改前台界面 11. 修复已知BUG 12. 修复已知安全漏洞 13. 增加安装时自定义后台管理登录地址 14. 去掉PHPSSO模块、去掉Video及视频库相关、去掉Upgrade在线升级 15. 去除了已被废弃的视频模块和视频模型 16. 修复安装时DNS解析错误提示 17. 手机电脑同时生成Html 18. 安装文件不检查index.html 19. 安装完删除安装目录 20. 安装删除友情链接、广告数据 21. 整合UEditor编辑器 22. UEditor整合上传水印 23. UEditor上传储存数据 24. 附件选择框UI 25. 优化附件选择器界面 26. 添加讯飞关键词获取API、百度关键词获取API,原官方关键词接口已失效 27. 后台添加复制,可复制条新的到任何栏目或站点 28. 添加头像字段 29. 修改头像,重新写入库 30. 添加组图模式,图片模式、文本模式 31. 百度编辑器上传视频播放器由embed改成video标签 32. 添加本地关键词获取API,原官方关键词接口已失效 33. 添加站点自定义字段、栏目自定义字段、单网页自定义字段 34. 添加键导入微信文章 35. 添加Word导入编辑器 36. 增加编辑器可下载微信图片本地化功能 37. 编辑器远程下载图片时加入对尺寸的压缩处理 38. 后台登录密码传输改为加密模式 39. 添加生成静态页进度条 40. 编辑器添加本地图片自动上传 41. 升级为CK4.16.1编辑器 42. 无用文件清理 43. 修改生成缩略图函数thumb 44. 修改获取用户头像函数get_memberavatar 45. 修改原来上传类处理文件,删除原上传类处理文件,新增Upload上传类处理文件 46. 修改原来图片处理类文件 47. 修改IP库类处理文件 48. 新增二维码处理类文件 49. 新增Input类处理文件 50. 新增判断是否是移动端终端is_mobile函数 51. 新增二维码qrcode函数 52. 新增秒转化时间sec2time函数 53. 新增友好时间显示函数dr_fdate 54. 新增时间显示函数dr_date 55. 新增递归创建文件夹create_folder函数 56. 新增调用远程数据dr_catcher_data函数 57. 新增获取远程附件扩展名get_file_ext函数 58. 新增栏目面包屑导航dr_catpos函数 59. 新增手机栏目面包屑导航dr_mobile_catpos函数 60. 新增手机分页函数mobilepages 61. 新增重新日志记录函数log_message 62. 新增目录扫描dr_dir_map函数 63. 新增文件扫描dr_file_map函数 64. 新增数据返回统格式dr_return_data函数 65. 新增格式化输出文件大小format_file_size函数 66. 新增附件信息get_attachment函数 67. 新增统返回json格式并退出程序dr_json函数 68. 新增将数组转换为字符串dr_array2string函数 69. 新增将字符串转换为数组dr_string2array函数 70. 新增根据文件扩展名获取文件预览信息dr_file_preview_html函数 71. 新增IP转为实际地址ip2address函数 72. 新增当前IP实际地址ip_address_info函数 73. 新增清除HTML标记clearhtml函数 74. 新增提取关键字dr_get_keywords函数 75. 新增提取描述信息dr_get_description函数 76. 新增获取内容中的缩略图get_content_img函数 77. 新增HTML实体字符转换code2html函数 78. 新增判断存在于数组中dr_in_array函数 79. 新增字符长度dr_strlen函数 80. 新增将路径进行安全转换变量模式dr_safe_replace_path函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值