commit 15dfc6576b87fe6ac3266aad80399ba573f4a12e Author: Gitea Date: Mon Jan 24 10:43:35 2022 +0800 init diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..81dfed3 --- /dev/null +++ b/.htaccess @@ -0,0 +1,10 @@ + + Options +FollowSymlinks + RewriteEngine On + + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + + RewriteRule ^(.*)$ index.php?p=$1 [QSA,PT,L] + + \ No newline at end of file diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..bb45180 --- /dev/null +++ b/admin.php @@ -0,0 +1,23 @@ + 0, + 'data' => 'The version of your server PHP is too low, and the program requires PHP version not less than 5.3.' + )); + exit(); +} + +// 引用内核启动文件 +require dirname(__FILE__) . '/core/start.php'; diff --git a/apps/admin/controller/IndexController.php b/apps/admin/controller/IndexController.php new file mode 100644 index 0000000..3e73006 --- /dev/null +++ b/apps/admin/controller/IndexController.php @@ -0,0 +1,363 @@ +model = new IndexModel(); + } + + // 登录页面 + public function index() + { + if (session('sid')) { + location(url('admin/Index/home')); + } + $this->assign('admin_check_code', $this->config('admin_check_code')); + $this->display('index.html'); + } + + // 主页面 + public function home() + { + // 手动修改数据名称 + if (get('action') == 'moddb') { + if ($this->modDB()) { + alert_back('修改成功!'); + } else { + alert_back('修改失败!'); + } + } + + // 删除修改后老数据库(上一步无法直接修改删除) + if (issetSession('deldb')) { + @unlink(ROOT_PATH . session('deldb')); + unset($_SESSION['deldb']); + } + + $dbsecurity = true; + // 如果是sqlite数据库,并且路径为默认的,则标记为不安全 + if (get_db_type() == 'sqlite') { + if (strpos($this->config('database.dbname'), 'pbootcms') !== false) { + if (get_user_ip() != '127.0.0.1' && $this->modDB()) { // 非本地测试时尝试自动修改数据库名称 + $dbsecurity = true; + } else { + $dbsecurity = false; + } + } + } elseif (file_exists(ROOT_PATH . '/data/pbootcms.db')) { + rename(ROOT_PATH . '/data/pbootcms.db', ROOT_PATH . '/data/' . get_uniqid() . '.db'); + } + + $this->assign('dbsecurity', $dbsecurity); + + if (! session('pwsecurity')) { + location(url('/admin/Index/ucenter')); + } + + $this->assign('server', get_server_info()); + $this->assign('branch', $this->config('upgrade_branch') == '3.X.dev' ? '3.X.dev' : '3.X'); + $this->assign('revise', $this->config('revise_version') ?: '0'); + $this->assign('snuser', $this->config('sn_user') ?: '0'); + $this->assign('site', get_http_url()); + + $this->assign('user_info', $this->model->getUserInfo(session('ucode'))); + + $this->assign('sum_msg', model('admin.content.Message')->getCount()); + + // 内容模型菜单 + $model = model('admin.content.Model'); + $models = $model->getModelMenu(); + foreach ($models as $key => $value) { + $models[$key]->count = $model->getModelCount($value->mcode)->count; + } + + $this->assign('model_msg', $models); + $this->display('system/home.html'); + } + + // 异步登录验证 + public function login() + { + if (! $_POST) { + return; + } + + // 在安装了gd库时才执行验证码验证 + if (extension_loaded("gd") && $this->config('admin_check_code') && strtolower(post('checkcode', 'var')) != session('checkcode')) { + json(0, '验证码错误!'); + } + + // 就收数据 + $username = post('username'); + $password = post('password'); + + if (! preg_match('/^[\x{4e00}-\x{9fa5}\w\-\.@]+$/u', $username)) { + json(0, '用户名含有不允许的特殊字符!'); + } + + if (! $username) { + json(0, '用户名不能为空!'); + } + + if (! $password) { + json(0, '密码不能为空!'); + } + + if (! ! $time = $this->checkLoginBlack()) { + $this->log('登录锁定!'); + json(0, '您登录失败次数太多已被锁定,请' . $time . '秒后再试!'); + } + + // 执行用户登录 + $where = array( + 'username' => $username, + 'password' => encrypt_string($password) + ); + + // 判断数据库写入权限 + if ((get_db_type() == 'sqlite') && ! is_writable(ROOT_PATH . $this->config('database.dbname'))) { + json(0, '数据库目录写入权限不足!'); + } + + if (! ! $login = $this->model->login($where)) { + + session_regenerate_id(true); + session('sid', encrypt_string(session_id() . $login->id)); // 会话标识 + session('M', M); + + session('id', $login->id); // 用户id + session('ucode', $login->ucode); // 用户编码 + session('username', $login->username); // 用户名 + session('realname', $login->realname); // 真实名字 + + if ($where['password'] != '14e1b600b1fd579f47433b88e8d85291') { + session('pwsecurity', true); + } + + session('acodes', $login->acodes); // 用户管理区域 + if ($login->acodes) { // 当前显示区域 + session('acode', $login->acodes[0]); + } else { + session('acode', ''); + } + + session('rcodes', $login->rcodes); // 用户角色代码表 + session('levels', $login->levels); // 用户权限URL列表 + session('menu_tree', $login->menus); // 菜单树 + session('area_map', $login->area_map); // 区域代码名称映射表 + session('area_tree', $login->area_tree); // 用户区域树 + + $this->log('登录成功!'); + json(1, url('admin/Index/home')); + } else { + $this->setLoginBlack(); + $this->log('登录失败!'); + session('checkcode', mt_rand(10000, 99999)); // 登录失败,随机打乱原有验证码 + json(0, '用户名或密码错误!'); + } + } + + // 退出登录 + public function loginOut() + { + session_unset(); + location(url('/admin/Index/index')); + } + + // 用户中心,修改密码 + public function ucenter() + { + if ($_POST) { + $username = post('username'); // 用户名 + $realname = post('realname'); // 真实姓名 + $cpassword = post('cpassword'); // 现在密码 + $password = post('password'); // 新密码 + $rpassword = post('rpassword'); // 确认密码 + + if (! $username) { + alert_back('用户名不能为空!'); + } + if (! $cpassword) { + alert_back('当前密码不能为空!'); + } + + if (! preg_match('/^[\x{4e00}-\x{9fa5}\w\-\.@]+$/u', $username)) { + alert_back('用户名含有不允许的特殊字符!'); + } + + $data = array( + 'username' => $username, + 'realname' => $realname, + 'update_user' => $username + ); + + // 如果有修改密码,则添加数据 + if ($password) { + if ($password != $rpassword) { + alert_back('确认密码不正确!'); + } + $data['password'] = encrypt_string($password); + if ($data['password'] != '14e1b600b1fd579f47433b88e8d85291') { + session('pwsecurity', true); + } else { + session('pwsecurity', false); + } + } + + // 检查现有密码 + if ($this->model->checkUserPwd(encrypt_string($cpassword))) { + if ($this->model->modUserInfo($data)) { + session('username', post('username')); + session('realname', post('realname')); + $this->log('用户资料成功!'); + success('用户资料修改成功!', - 1); + } + } else { + $this->log('用户资料修改时当前密码错误!'); + alert_location('当前密码错误!', - 1); + } + } + $this->display('system/ucenter.html'); + } + + // 切换显示的数据区域 + public function area() + { + if ($_POST) { + $acode = post('acode'); + if (in_array($acode, session('acodes'))) { + session('acode', $acode); + cookie('lg', $acode); // 同步切换前台语言 + } + location(url('admin/Index/home')); + } + } + + // 清理缓存 + public function clearCache() + { + if (get('delall')) { + $rs = path_delete(RUN_PATH); + } else { + $rs = (path_delete(RUN_PATH . '/cache') && path_delete(RUN_PATH . '/complile') && path_delete(RUN_PATH . '/config') && path_delete(RUN_PATH . '/upgrade') && path_delete(RUN_PATH . '/image')); + } + if ($rs) { + if (extension_loaded('Zend OPcache')) { + opcache_reset(); // 在启用了OPcache加速器时同时清理 + } + $this->log('清理缓存成功!'); + alert_back('清理缓存成功!'); + } else { + $this->log('清理缓存失败!'); + alert_back('清理缓存失败!'); + } + } + + // 清理会话 + public function clearSession() + { + $rs = path_delete(RUN_PATH . '/session'); + + if ($rs) { + $this->log('清理会话成功!'); + alert_back('清理会话成功!'); + } else { + $this->log('清理会话失败!'); + alert_back('清理会话失败!'); + } + } + + // 文件上传方法 + public function upload() + { + $upload = upload('upload'); + if (is_array($upload)) { + json(1, $upload); + } else { + json(0, $upload); + } + } + + // 检查是否在黑名单 + private function checkLoginBlack() + { + // 读取黑名单 + $ip_black = RUN_PATH . '/data/' . md5('login_black') . '.php'; + if (file_exists($ip_black)) { + $data = require $ip_black; + $user_ip = get_user_ip(); + $lock_time = $this->config('lock_time') ?: 900; + $lock_count = $this->config('lock_count') ?: 5; + if (isset($data[$user_ip]) && $data[$user_ip]['count'] >= $lock_count && time() - $data[$user_ip]['time'] < $lock_time) { + return $lock_time - (time() - $data[$user_ip]['time']); // 返回剩余秒数 + } + } + return false; + } + + // 添加登录黑名单 + private function setLoginBlack() + { + // 读取黑名单 + $ip_black = RUN_PATH . '/data/' . md5('login_black') . '.php'; + if (file_exists($ip_black)) { + $data = require $ip_black; + } else { + $data = array(); + } + + // 添加IP + $user_ip = get_user_ip(); + $lock_time = $this->config('lock_time') ?: 900; + $lock_count = $this->config('lock_count') ?: 5; + if (isset($data[$user_ip]) && $data[$user_ip]['count'] < $lock_count && time() - $data[$user_ip]['time'] < $lock_time) { + $data[$user_ip] = array( + 'time' => time(), + 'count' => $data[get_user_ip()]['count'] + 1 + ); + } else { + $data[$user_ip] = array( + 'time' => time(), + 'count' => 1 + ); + } + + // 写入黑名单 + check_file($ip_black, true); + return file_put_contents($ip_black, "config('database.dbname'); + $dname = '/data/' . get_uniqid() . '.db'; + $sconfig = file_get_contents($file); + $dconfig = str_replace($sname, $dname, $sconfig); + if (file_put_contents($file, $dconfig)) { + if (! copy(ROOT_PATH . $sname, ROOT_PATH . $dname)) { + file_put_contents($file, $sconfig); // 回滚配置 + } else { + session('deldb', $sname); + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/CompanyController.php b/apps/admin/controller/content/CompanyController.php new file mode 100644 index 0000000..857f83f --- /dev/null +++ b/apps/admin/controller/content/CompanyController.php @@ -0,0 +1,70 @@ +model = new CompanyModel(); + } + + // 显示公司设置 + public function index() + { + // 获取公司配置 + $this->assign('companys', $this->model->getList()); + $this->display('content/company.html'); + } + + // 修改公司设置 + public function mod() + { + if (! $_POST) { + return; + } + $data = array( + 'name' => post('name'), + 'address' => post('address'), + 'postcode' => post('postcode'), + 'contact' => post('contact'), + 'mobile' => post('mobile'), + 'phone' => post('phone'), + 'fax' => post('fax'), + 'email' => post('email'), + 'qq' => post('qq'), + 'weixin' => post('weixin'), + 'blicense' => post('blicense'), + 'other' => post('other') + ); + + if ($this->model->checkCompany()) { + if ($this->model->modCompany($data)) { + $this->log('修改公司信息成功!'); + success('修改成功!', - 1); + } else { + location(- 1); + } + } else { + $data['acode'] = session('acode'); + if ($this->model->addCompany($data)) { + $this->log('修改公司信息成功!'); + success('修改成功!', - 1); + } else { + location(- 1); + } + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/ContentController.php b/apps/admin/controller/content/ContentController.php new file mode 100644 index 0000000..d7815f6 --- /dev/null +++ b/apps/admin/controller/content/ContentController.php @@ -0,0 +1,551 @@ +model = new ContentModel(); + } + + // 文章列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getContent($id)) { + $this->assign('more', true); + $this->assign('content', $result); + } else { + $this->assign('list', true); + if (! $mcode = get('mcode', 'var')) { + error('传递的模型编码参数有误,请核对后重试!'); + } + + if (isset($_GET['keyword'])) { + if (! ! $scode = get('scode', 'var')) { + $result = $this->model->findContent($mcode, $scode, get('keyword', 'vars')); + } else { + $result = $this->model->findContentAll($mcode, get('keyword', 'vars')); + } + } else { + $result = $this->model->getList($mcode); + } + $this->assign('contents', $result); + + // 文章分类下拉列表 + $sort_model = model('admin.content.ContentSort'); + $sort_select = $sort_model->getListSelect($mcode); + $this->assign('search_select', $this->makeSortSelect($sort_select, get('scode'))); + $this->assign('sort_select', $this->makeSortSelect($sort_select, session('addscode'))); + $this->assign('subsort_select', $this->makeSortSelect($sort_select)); + + // 模型名称 + $this->assign('model_name', model('admin.content.Model')->getName($mcode)); + + // 扩展字段 + $this->assign('extfield', model('admin.content.ExtField')->getModelField($mcode)); + + $this->assign('baidu_zz_token', $this->config('baidu_zz_token')); + $this->assign('baidu_ks_token', $this->config('baidu_ks_token')); + + // 前端地址连接符判断 + $url_break_char = $this->config('url_break_char') ?: '_'; + $this->assign('url_break_char', $url_break_char); + + // 获取会员分组 + $this->assign('groups', model('admin.member.MemberGroup')->getSelect()); + } + + $this->display('content/content.html'); + } + + // 文章增加 + public function add() + { + if ($_POST) { + + // 获取数据 + $scode = post('scode'); + $subscode = post('subscode'); + $title = post('title'); + $titlecolor = post('titlecolor'); + $subtitle = post('subtitle'); + $filename = trim(post('filename'), '/'); + $author = post('author'); + $source = post('source'); + $outlink = post('outlink'); + $date = post('date'); + $ico = post('ico'); + $pics = post('pics'); + + // 获取多图标题 + $picstitle = post('picstitle'); + if ($picstitle) { + $picstitle = implode(',', $picstitle); + } + + $content = post('content'); + $tags = str_replace(',', ',', post('tags')); + $enclosure = post('enclosure'); + $keywords = post('keywords'); + $description = post('description'); + $status = post('status', 'int'); + $istop = post('istop', 'int', '', '', 0); + $isrecommend = post('isrecommend', 'int', '', '', 0); + $isheadline = post('isheadline', 'int', '', '', 0); + + $gid = post('gid', 'int') ?: 0; + $gtype = post('gtype', 'int') ?: 4; + $gnote = post('gnote'); + + if (! $scode) { + alert_back('内容分类不能为空!'); + } + + if (! $title) { + alert_back('文章标题不能为空!'); + } + + if ($filename && ! preg_match('/^[a-zA-Z0-9\-]+$/', $filename)) { + alert_back('内容URL名称只允许字母、数字、横线组成!'); + } + + // 自动提起前一百个字符为描述 + if (! $description && isset($_POST['content'])) { + $description = escape_string(clear_html_blank(substr_both(strip_tags($_POST['content']), 0, 150))); + } + + // 缩放缩略图 + if ($ico) { + resize_img(ROOT_PATH . $ico, '', $this->config('ico.max_width'), $this->config('ico.max_height')); + } + + // 检查自定义URL名称 + if ($filename) { + while ($this->model->checkFilename($filename)) { + $filename = $filename . '-' . mt_rand(1, 20); + } + } + + // 记住新增栏目 + session('addscode', $scode); + + // 构建数据 + $data = array( + 'acode' => session('acode'), + 'scode' => $scode, + 'subscode' => $subscode, + 'title' => $title, + 'titlecolor' => $titlecolor, + 'subtitle' => $subtitle, + 'filename' => $filename, + 'author' => $author, + 'source' => $source, + 'outlink' => $outlink, + 'date' => $date, + 'ico' => $ico, + 'pics' => $pics, + 'picstitle' => $picstitle, + 'content' => $content, + 'tags' => $tags, + 'enclosure' => $enclosure, + 'keywords' => $keywords, + 'description' => clear_html_blank($description), + 'sorting' => 255, + 'status' => $status, + 'istop' => $istop, + 'isrecommend' => $isrecommend, + 'isheadline' => $isheadline, + 'gid' => $gid, + 'gtype' => $gtype, + 'gnote' => $gnote, + 'visits' => 0, + 'likes' => 0, + 'oppose' => 0, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if (! ! $id = $this->model->addContent($data)) { + // 扩展内容添加 + foreach ($_POST as $key => $value) { + if (preg_match('/^ext_[\w\-]+$/', $key)) { + if (! isset($data2['contentid'])) { + $data2['contentid'] = $id; + } + $temp = post($key); + if (is_array($temp)) { + $data2[$key] = implode(',', $temp); + } else { + $data2[$key] = str_replace("\r\n", '
', $temp); + } + } + } + if (isset($data2)) { + if (! $this->model->addContentExt($data2)) { + $this->model->delContent($id); + $this->log('新增文章失败!'); + error('新增失败!', - 1); + } + } + + $this->log('新增文章成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Content/index/mcode/' . get('mcode'))); + } + } else { + $this->log('新增文章失败!'); + error('新增失败!', - 1); + } + } + } + + // 生成分类选择 + private function makeSortSelect($tree, $selectid = null) + { + $list_html = ''; + foreach ($tree as $value) { + // 默认选择项 + if ($selectid == $value->scode) { + $select = "selected='selected'"; + } else { + $select = ''; + } + $list_html .= ""; + } + // 子菜单处理 + if ($value->son) { + $this->blank .= '  '; + $list_html .= $this->makeSortSelect($value->son, $selectid); + } + } + // 循环完后回归位置 + $this->blank = substr($this->blank, 0, - 6); + return $list_html; + } + + // 内容栏目删除 + public function del() + { + // 执行批量删除 + if ($_POST) { + if (! ! $list = post('list')) { + if ($this->model->delSortList($list)) { + $this->log('批量删除栏目成功!'); + success('批量删除成功!', - 1); + } else { + $this->log('批量删除栏目失败!'); + error('批量删除失败!', - 1); + } + } else { + alert_back('请选择要删除的栏目!'); + } + } + + if (! $scode = get('scode', 'var')) { + error('传递的参数值错误!', - 1); + } + if ($this->model->delSort($scode)) { + $this->log('删除数据内容栏目' . $scode . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除数据内容栏目' . $scode . '失败!'); + error('删除失败!', - 1); + } + } + + // 内容栏目修改 + public function mod() + { + if (! ! $submit = post('submit')) { + switch ($submit) { + case 'sorting': // 修改列表排序 + $listall = post('listall'); + if ($listall) { + $sorting = post('sorting'); + foreach ($listall as $key => $value) { + if ($sorting[$key] === '' || ! is_numeric($sorting[$key])) + $sorting[$key] = 255; + $this->model->modSortSorting($value, "sorting=" . $sorting[$key]); + } + $this->log('批量修改栏目排序成功!'); + success('修改成功!', - 1); + } else { + alert_back('排序失败,无任何内容!'); + } + break; + } + } + + if (! $scode = get('scode', 'var')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modSort($scode, "$field='$value',update_user='" . session('username') . "'")) { + $this->log('修改数据内容栏目' . $scode . '状态' . $value . '成功!'); + location(- 1); + } else { + $this->log('修改数据内容栏目' . $scode . '状态' . $value . '失败!'); + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $pcode = post('pcode', 'var'); + $name = post('name'); + $mcode = post('mcode'); + $type = post('type'); + $listtpl = basename(post('listtpl')); + $contenttpl = basename(post('contenttpl')); + $status = post('status'); + $subname = post('subname'); + $filename = trim(post('filename'), '/'); + $outlink = post('outlink'); + $ico = post('ico'); + $pic = post('pic'); + $title = post('title'); + $keywords = post('keywords'); + $description = post('description'); + $modsub = post('modsub', 'int'); + + $gid = post('gid', 'int') ?: 0; + $gtype = post('gtype', 'int') ?: 4; + $gnote = post('gnote'); + + $def1 = post('def1'); + $def2 = post('def2'); + $def3 = post('def3'); + + if (! $pcode) { // 父编码默认为0 + $pcode = 0; + } + + if (! $name) { + alert_back('栏目名不能为空!'); + } + + if (! $mcode) { + alert_back('栏目模型必须选择!'); + } + + if (! $type) { + alert_back('栏目类型不能为空!'); + } + + if ($filename && ! preg_match('/^[a-zA-Z0-9\-\/]+$/', $filename)) { + alert_back('URL名称只允许字母、数字、横线、斜线组成!'); + } + + if ($filename && $this->model->checkUrlname($filename)) { + alert_back('URL名称与模型URL名称冲突,请换一个名称!'); + } + + // 缩放缩略图 + if ($ico) { + resize_img(ROOT_PATH . $ico, '', $this->config('ico.max_width'), $this->config('ico.max_height')); + } + + if ($filename) { + while ($this->model->checkFilename($filename, "scode<>'$scode'")) { + $filename = $filename . '-' . mt_rand(1, 20); + } + } + + // 构建数据 + $data = array( + 'pcode' => $pcode, + 'name' => $name, + 'mcode' => $mcode, + 'listtpl' => $listtpl, + 'contenttpl' => $contenttpl, + 'status' => $status, + 'gid' => $gid, + 'gtype' => $gtype, + 'gnote' => $gnote, + 'subname' => $subname, + 'def1' => $def1, + 'def2' => $def2, + 'def3' => $def3, + 'filename' => $filename, + 'outlink' => $outlink, + 'ico' => $ico, + 'pic' => $pic, + 'title' => $title, + 'keywords' => $keywords, + 'description' => $description, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modSort($scode, $data, $modsub)) { + // 如果修改为单页并且跳转,则删除单页内容,否则判断是否存在内容,不存在则添加 + if ($type == 1 && $outlink) { + $this->model->delContent($scode); + } elseif ($type == 1 && ! $this->model->findContent($scode)) { + $this->addSingle($scode, $name); + } + + $this->log('修改数据内容栏目' . $scode . '成功!'); + success('修改成功!', url('/admin/ContentSort/index')); + } else { + location(- 1); + } + } else { // 调取修改内容 + $this->assign('mod', true); + + $sort = $this->model->getSort($scode); + if (! $sort) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('sort', $sort); + + // 父编码下拉选择 + $sort_tree = $this->model->getSelect(); + $sort_select = $this->makeSortSelect($sort_tree, $sort->pcode); + $this->assign('sort_select', $sort_select); + + // 模板文件 + $htmldir = $this->config('tpl_html_dir') ? '/' . $this->config('tpl_html_dir') : ''; + $this->assign('tpls', file_list(ROOT_PATH . current($this->config('tpl_dir')) . '/' . $this->model->getTheme() . $htmldir)); + + // 内容模型 + $models = model('admin.content.Model'); + $this->assign('models', $models->getSelect()); + + // 获取会员分组 + $this->assign('groups', model('admin.member.MemberGroup')->getSelect()); + + $this->display('content/contentsort.html'); + } + } + + // 添加栏目时执行单页内容增加 + public function addSingle($scode, $title) + { + // 构建数据 + $data = array( + 'acode' => session('acode'), + 'scode' => $scode, + 'subscode' => '', + 'title' => $title, + 'titlecolor' => '#333333', + 'subtitle' => '', + 'filename' => '', + 'author' => session('realname'), + 'source' => '本站', + 'outlink' => '', + 'date' => date('Y-m-d H:i:s'), + 'ico' => '', + 'pics' => '', + 'content' => '', + 'tags' => '', + 'enclosure' => '', + 'keywords' => '', + 'description' => '', + 'sorting' => 255, + 'status' => 1, + 'istop' => 0, + 'isrecommend' => 0, + 'isheadline' => 0, + 'gid' => 0, + 'gtype' => 4, + 'gnote' => '', + 'visits' => 0, + 'likes' => 0, + 'oppose' => 0, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addSingle($data)) { + return true; + } else { + return false; + } + } +} diff --git a/apps/admin/controller/content/ExtFieldController.php b/apps/admin/controller/content/ExtFieldController.php new file mode 100644 index 0000000..a8f5840 --- /dev/null +++ b/apps/admin/controller/content/ExtFieldController.php @@ -0,0 +1,231 @@ +model = new ExtFieldModel(); + } + + // 扩展字段列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getExtField($id)) { + $this->assign('more', true); + $this->assign('extfield', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findExtField($field, $keyword); + } else { + $result = $this->model->getList(); + } + + // 内容模型 + $models = model('admin.content.Model'); + $this->assign('models', $models->getSelect()); + + $this->assign('extfields', $result); + } + $this->display('content/extfield.html'); + } + + // 扩展字段增加 + public function add() + { + if ($_POST) { + // 获取数据 + $mcode = post('mcode'); + $name = post('name', 'var'); + $type = post('type', 'int'); + if (! ! $value = post('value')) { + $value = str_replace("\r\n", ",", $value); // 替换回车 + $value = str_replace(",", ",", $value); // 替换中文逗号分割符 + } + $description = post('description'); + $sorting = post('sorting', 'int'); + + if (! $mcode) { + alert_back('内容模型不能为空!'); + } + + if (! $name) { + alert_back('字段名称不能为空!'); + } else { + $name = "ext_" . $name; + } + + if (! $type) { + alert_back('字段类型不能为空!'); + } + + if (! $description) { + alert_back('字段描述不能为空!'); + } + + // 构建数据 + $data = array( + 'mcode' => $mcode, + 'name' => $name, + 'type' => $type, + 'value' => $value, + 'description' => $description, + 'sorting' => $sorting + ); + + // 字段类型及长度 + switch ($type) { + case '2': // 多行 + $mysql = 'varchar(1000)'; + $sqlite = 'TEXT(1000)'; + break; + case '7': // 时间日期 + $mysql = 'datetime'; + $sqlite = 'TEXT'; + break; + case '8': // 编辑器 + $mysql = 'TEXT'; + $sqlite = 'TEXT(10000)'; + break; + default: + $mysql = 'varchar(200)'; + $sqlite = 'TEXT(200)'; + } + + // 字段不存在时创建 + if (! $this->model->isExistField($name)) { + if (get_db_type() == 'sqlite') { + $result = $this->model->amd("ALTER TABLE ay_content_ext ADD COLUMN $name $sqlite NULL"); + } else { + $result = $this->model->amd("ALTER TABLE ay_content_ext ADD $name $mysql NULL COMMENT '$description'"); + } + } elseif ($this->model->checkExtField($name)) { // 字段存在且已使用则 报错 + alert_back('字段已经存在,不能重复添加!'); + } + + // 执行扩展字段记录添加 + if ($this->model->addExtField($data)) { + $this->log('新增扩展字段成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/ExtField/index')); + } + } else { + $this->log('新增扩展字段失败!'); + error('新增失败!', - 1); + } + } + } + + // 扩展字段删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + $name = $this->model->getExtFieldName($id); + if ($this->model->delExtField($id)) { + // mysql数据库执行字段删除,sqlite暂时不支持 + if (! ! $name) { + if (get_db_type() == 'mysql') { + $result = $this->model->amd("ALTER TABLE ay_content_ext DROP COLUMN $name"); + } + } + $this->log('删除扩展字段' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除扩展字段' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 扩展字段修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modExtField($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $mcode = post('mcode'); + $type = post('type'); + if (! ! $value = post('value')) { + $value = str_replace("\r\n", ",", $value); // 替换回车 + $value = str_replace(",", ",", $value); // 替换中文逗号分割符 + } + $description = post('description'); + $sorting = post('sorting', 'int'); + + if (! $mcode) { + alert_back('内容模型不能为空!'); + } + + if (! $description) { + alert_back('字段描述不能为空!'); + } + + // 构建数据 + $data = array( + 'mcode' => $mcode, + 'type' => $type, + 'value' => $value, + 'description' => $description, + 'sorting' => $sorting + ); + + // 执行修改 + if ($this->model->modExtField($id, $data)) { + $this->log('修改扩展字段' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/ExtField/index')); + } + } else { + location(- 1); + } + } else { + + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getExtField($id)) { + error('编辑的内容已经不存在!', - 1); + } + + // 内容模型 + $models = model('admin.content.Model'); + $this->assign('models', $models->getSelect()); + + $this->assign('extfield', $result); + $this->display('content/extfield.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/FormController.php b/apps/admin/controller/content/FormController.php new file mode 100644 index 0000000..4cf12e7 --- /dev/null +++ b/apps/admin/controller/content/FormController.php @@ -0,0 +1,354 @@ +model = new FormModel(); + } + + // 自定义表单列表 + public function index() + { + if ((! ! $fcode = get('fcode', 'var')) && $form = $this->model->getFormByCode($fcode)) { + $this->assign('form', $form); + if (get('action') == 'showdata') { + $this->assign('showdata', true); + $this->assign('fields', $this->model->getFormFieldByCode($fcode)); // 获取字段 + $table = $this->model->getFormTableByCode($fcode); + if (get('export')) { + $this->assign('formdata', $this->model->getFormData($table, false)); + header('Content-Type:application/vnd.ms-excel'); + header('Cache-Control: max-age=0'); + header("Content-Disposition:filename=" . $form->form_name . "-" . date("YmdHis") . ".xls"); + $this->display('content/exform.html'); + } else { + $this->assign('formdata', $this->model->getFormData($table, true)); + } + } + if (get('action') == 'showfield') { + $this->assign('showfield', true); + $this->assign('fields', $this->model->getFormFieldByCode($fcode)); + } + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findForm($field, $keyword); + } else { + $result = $this->model->getList(); + } + + $this->assign('forms', $result); + } + $this->display('content/form.html'); + } + + // 自定义表单增加 + public function add() + { + if ($_POST) { + if (get('action') == 'addform') { + $fcode = get_auto_code($this->model->getLastCode()); + $form_name = post('form_name'); + $table_name = 'ay_diy_' . post('table_name', 'var'); + + if (! $form_name) { + alert_back('表单名称不能为空!'); + } + + if (! $table_name) { + alert_back('表单数据表不能为空!'); + } + + $data = array( + 'fcode' => $fcode, + 'form_name' => $form_name, + 'table_name' => $table_name, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + if (get_db_type() == 'sqlite') { + $result = $this->model->amd("CREATE TABLE `$table_name` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,`create_time` TEXT NOT NULL)"); + } else { + $result = $this->model->amd("CREATE TABLE `$table_name` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`create_time` datetime NOT NULL,PRIMARY KEY (`id`))ENGINE=MyISAM DEFAULT CHARSET=utf8"); + } + + if ($this->model->addForm($data)) { + $this->log('新增自定义表单成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Form/index')); + } + } else { + $this->log('新增自定义表单失败!'); + error('新增失败!', - 1); + } + } else { + // 获取数据 + $fcode = post('fcode', 'var'); + $name = post('name', 'var'); + $length = post('length', 'int') ?: 20; + $required = post('required', 'int') ?: 0; + $description = post('description'); + $sorting = post('sorting', 'int') ?: 255; + + if (! $fcode) { + alert_back('表单编码不能为空!'); + } + + if (! $name) { + alert_back('字段名称不能为空!'); + } + + if (! $description) { + alert_back('字段描述不能为空!'); + } + + // 构建数据 + $data = array( + 'fcode' => $fcode, + 'name' => $name, + 'length' => $length, + 'required' => $required, + 'description' => $description, + 'sorting' => $sorting, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 获取表名称 + $table = $this->model->getFormTableByCode($fcode); + + // 字段类型及长度 + $mysql = "varchar($length)"; + $sqlite = "TEXT($length)"; + + // 字段不存在时创建 + if (! $this->model->isExistField($table, $name)) { + if (get_db_type() == 'sqlite') { + $result = $this->model->amd("ALTER TABLE $table ADD COLUMN $name $sqlite NULL"); + } else { + $result = $this->model->amd("ALTER TABLE $table ADD $name $mysql NULL COMMENT '$description'"); + } + } elseif ($this->model->checkFormField($fcode, $name)) { + alert_back('字段已经存在,不能重复添加!'); + } + + // 执行自定义表单记录添加 + if ($this->model->addFormField($data)) { + $this->log('新增表单字段成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Form/index/fcode/' . $fcode . '/action/showfield')); + } + } else { + $this->log('新增表单字段失败!'); + error('新增失败!', - 1); + } + } + } + } + + // 自定义表单删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 删除表单 + if (get('action') == 'delform') { + if ($id == 1) { + alert_back('留言表单不允许删除'); + } + $table = $this->model->getFormTable($id); + $fcode = $this->model->getFormCode($id); + if ($this->model->delForm($id)) { + $this->model->delFormFieldByCode($fcode); // 删除字段记录 + $this->model->amd("DROP TABLE IF EXISTS $table"); // 删除表 + $this->log('删除自定义表单' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除自定义表单' . $id . '失败!'); + error('删除失败!', - 1); + } + } elseif (get('action') == 'deldata') { + // 获取表单 + if (! $fcode = get('fcode', 'var')) { + error('传递的参数值fcode错误!', - 1); + } + $table = $this->model->getFormTableByCode($fcode); + if ($this->model->delFormData($table, $id)) { + $this->log('删除表单数据' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除表单数据' . $id . '失败!'); + error('删除失败!', - 1); + } + } else { + + // 获取表单 + if (! $fcode = get('fcode', 'var')) { + error('传递的参数值fcode错误!', - 1); + } + + // 获取操作表 + $table = $this->model->getFormTableByCode($fcode); + $name = $this->model->getFormFieldName($id); + + if ($this->model->delFormField($id)) { + // mysql数据库执行字段删除,sqlite暂时不支持 + if (! ! $name) { + if (get_db_type() == 'mysql') { + $result = $this->model->amd("ALTER TABLE $table DROP COLUMN $name"); + } + } + $this->log('删除自定义表单' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除自定义表单' . $id . '失败!'); + error('删除失败!', - 1); + } + } + } + + // 自定义表单修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modFormField($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + if (get('action') == 'addmenu') { + if ($this->model->addFormMenu($id)) { + $this->log('添加自定义表单' . $id . '到菜单成功!'); + if (! ! $backurl = get('backurl')) { + success('添加成功!', base64_decode($backurl)); + } else { + success('添加成功!', url('/admin/Form/index')); + } + } else { + location(- 1); + } + } + + // 修改操作 + if ($_POST) { + + // 修改表单 + if (get('action') == 'modform') { + $form_name = post('form_name'); + + if (! $form_name) { + alert_back('表单名称不能为空!'); + } + $data = array( + 'form_name' => $form_name, + 'update_user' => session('username') + ); + + // 执行修改 + if ($this->model->modForm($id, $data)) { + $this->log('修改自定义表单' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Form/index')); + } + } else { + location(- 1); + } + } else { + + // 获取数据 + $description = post('description'); + $required = post('required', 'int') ?: 0; + $sorting = post('sorting', 'int') ?: 255; + + if (! $description) { + alert_back('字段描述不能为空!'); + } + + // 构建数据 + $data = array( + 'description' => $description, + 'required' => $required, + 'sorting' => $sorting, + 'update_user' => session('username') + ); + + // 执行修改 + if ($this->model->modFormField($id, $data)) { + $this->log('修改表单字段' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Form/index')); + } + } else { + location(- 1); + } + } + } else { + + // 调取修改内容 + $this->assign('mod', true); + + if (get('action') == 'modform') { + if (! $result = $this->model->getForm($id)) { + error('编辑的内容已经不存在!', - 1); + } + + $this->assign('form', $result); + } else { + if (! $result = $this->model->getFormField($id)) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('field', $result); + } + $this->display('content/form.html'); + } + } + + // 清空 + public function clear() + { + // 获取表单 + if (! $fcode = get('fcode', 'var')) { + error('传递的参数值fcode错误!', - 1); + } + $table = $this->model->getFormTableByCode($fcode); + + if ($this->model->clearFormData($table)) { + alert_location('清空成功!', - 1); + } else { + alert_location('清空失败!', - 1); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/LabelController.php b/apps/admin/controller/content/LabelController.php new file mode 100644 index 0000000..1fd4ca6 --- /dev/null +++ b/apps/admin/controller/content/LabelController.php @@ -0,0 +1,168 @@ +model = new LabelModel(); + } + + // 自定义标签列表 + public function index() + { + // 修改参数配置 + if ($_POST) { + foreach ($_POST as $key => $value) { + if (preg_match('/^[\w\-]+$/', $key)) { // 带有违规字符时不带入查询 + $data = post($key); + $data = str_replace("\r\n", "
", $data); // 多行文本时替换回车 + $this->model->modValue($key, $data); + } + } + success('修改成功!', url('admin/Label/index')); + } + $this->assign('list', true); + $this->assign('labels', $this->model->getList()); + $this->display('content/label.html'); + } + + // 自定义标签字段增加 + public function add() + { + if ($_POST) { + // 获取数据 + $name = post('name', 'var'); + $description = post('description'); + $type = post('type'); + + if (! $name) { + alert_back('标签名称不能为空!'); + } + + if (! $description) { + alert_back('标题描述不能为空!'); + } + + if (! $type) { + alert_back('标签类型不能为空!'); + } + + // 检查标签名称 + if ($this->model->checkLabel("name='$name'")) { + alert_back('该自定义标签称已经存在,不能再使用!'); + } + + // 构建数据 + $data = array( + 'name' => $name, + 'description' => $description, + 'value' => '', // 添加时设置为空 + 'type' => $type, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addLabel($data)) { + $this->log('修改自定义标签' . $name . '成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('admin/Label/index' . get_tab('t2'), false)); + } + } else { + $this->log('新增自定义标签' . $name . '失败!'); + error('新增失败!', url('admin/Label/index' . get_tab('t2'), false)); + } + } + } + + // 自定义标签字段删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + if ($this->model->delLabel($id)) { + $this->log('删除自定义标签' . $id . '成功!'); + success('删除成功!', url('admin/Label/index' . get_tab('t2'), false)); + } else { + $this->log('删除自定义标签' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 自定义标签字段修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 修改操作 + if ($_POST) { + // 获取数据 + $name = post('name', 'var'); + $description = post('description'); + $type = post('type'); + + if (! $name) { + alert_back('标签名称不能为空!'); + } + + if (! $description) { + alert_back('标签描述不能为空!'); + } + + if (! $type) { + alert_back('标签类型不能为空!'); + } + + // 检查标签名称 + if ($this->model->checkLabel("name='$name' AND id<>$id")) { + alert_back('该自定义标签名称已经存在,不能再使用!'); + } + + // 构建数据 + $data = array( + 'name' => $name, + 'description' => $description, + 'type' => $type, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modLabel($id, $data)) { + $this->log('修改自定义标签字段' . $id . '成功!'); + success('修改成功!', url('admin/Label/index' . get_tab('t2'), false)); + } else { + location(- 1); + } + } else { + $this->assign('mod', true); + + // 调取修改内容 + $result = $this->model->getLabel($id); + if (! $result) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('label', $result); + + $this->display('content/label.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/LinkController.php b/apps/admin/controller/content/LinkController.php new file mode 100644 index 0000000..7e6d766 --- /dev/null +++ b/apps/admin/controller/content/LinkController.php @@ -0,0 +1,213 @@ +model = new LinkModel(); + } + + // 友情链接列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getLink($id)) { + $this->assign('more', true); + $this->assign('link', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findLink($field, $keyword); + } else { + $result = $this->model->getList(); + } + $this->assign('gids', $this->model->getGid()); + $this->assign('links', $result); + } + $this->display('content/link.html'); + } + + // 友情链接增加 + public function add() + { + if ($_POST) { + // 获取数据 + $gid = post('gid', 'int'); + $name = post('name'); + $link = post('link'); + $logo = post('logo'); + $sorting = post('sorting'); + + if (! $gid) { + $gid = $this->model->getMaxGid() + 1; + } + + if (! $name) { + alert_back('名称不能为空!'); + } + + if (! $link) { + alert_back('链接不能为空!'); + } + + if (! $sorting) { + $sorting = 255; + } + + // logo图缩放 + if ($logo) { + resize_img(ROOT_PATH . $logo, '', $this->config('ico.max_width'), $this->config('ico.max_height')); + } + + // 构建数据 + $data = array( + 'acode' => session('acode'), + 'gid' => $gid, + 'name' => $name, + 'link' => $link, + 'logo' => $logo, + 'sorting' => $sorting, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addLink($data)) { + $this->log('新增友情链接成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Link/index')); + } + } else { + $this->log('新增友情链接失败!'); + error('新增失败!', - 1); + } + } + } + + // 友情链接删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delLink($id)) { + $this->log('删除友情链接' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除友情链接' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 友情链接修改 + public function mod() + { + if (! ! $submit = post('submit')) { + switch ($submit) { + case 'sorting': // 修改列表排序 + $listall = post('listall'); + if ($listall) { + $sorting = post('sorting'); + foreach ($listall as $key => $value) { + if ($sorting[$key] === '' || ! is_numeric($sorting[$key])) + $sorting[$key] = 255; + $this->model->modLink($value, "sorting=" . $sorting[$key]); + } + $this->log('批量修改链接排序成功!'); + success('修改成功!', - 1); + } else { + alert_back('排序失败,无任何内容!'); + } + break; + } + } + + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modLink($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $gid = post('gid', 'int'); + $name = post('name'); + $link = post('link'); + $logo = post('logo'); + $sorting = post('sorting'); + + if (! $gid) { + $gid = $this->model->getMaxGid() + 1; + } + + if (! $name) { + alert_back('名称不能为空!'); + } + + if (! $link) { + alert_back('链接不能为空!'); + } + + // logo图缩放 + if ($logo) { + resize_img(ROOT_PATH . $logo, '', $this->config('ico.max_width'), $this->config('ico.max_height')); + } + + // 构建数据 + $data = array( + 'gid' => $gid, + 'name' => $name, + 'link' => $link, + 'logo' => $logo, + 'sorting' => $sorting, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modLink($id, $data)) { + $this->log('修改友情链接' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Link/index')); + } + } else { + location(- 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getLink($id)) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('gids', $this->model->getGid()); + $this->assign('link', $result); + $this->display('content/link.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/MessageController.php b/apps/admin/controller/content/MessageController.php new file mode 100644 index 0000000..e6206b8 --- /dev/null +++ b/apps/admin/controller/content/MessageController.php @@ -0,0 +1,119 @@ +model = new MessageModel(); + } + + // 列表 + public function index() + { + $this->assign('list', true); + $this->assign('fields', $this->model->getFormFieldByCode(1)); // 获取字段 + + if (get('export')) { + $this->assign('messages', $this->model->getList(false)); + header("Content-Type:application/vnd.ms-excel"); + header('Cache-Control: max-age=0'); + header("Content-Disposition:filename=留言记录-" . date("YmdHis") . ".xls"); + $this->display('content/exmessage.html'); + } else { + $this->assign('messages', $this->model->getList(true)); + $this->display('content/message.html'); + } + } + + // 删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delMessage($id)) { + $this->log('删除留言' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除留言' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modMessage($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + // 获取数据 + $recontent = post('recontent'); + $status = post('status'); + + // 构建数据 + $data = array( + 'recontent' => $recontent, + 'status' => $status, + 'update_user' => session('username') + ); + + // 执行修改 + if ($this->model->modMessage($id, $data)) { + $this->log('修改留言' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Message/index')); + } + } else { + location(- 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getMessage($id)) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('message', $result); + + $this->display('content/message.html'); + } + } + + // 清空 + public function clear() + { + if ($this->model->clearMessage()) { + alert_location('清空成功!', url('/admin/Message/index')); + } else { + alert_location('清空失败!', url('/admin/Message/index')); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/ModelController.php b/apps/admin/controller/content/ModelController.php new file mode 100644 index 0000000..2a0b141 --- /dev/null +++ b/apps/admin/controller/content/ModelController.php @@ -0,0 +1,207 @@ +model = new ModelModel(); + } + + // 内容模型列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getModel($id)) { + $this->assign('more', true); + $this->assign('model', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findModel($field, $keyword); + } else { + $result = $this->model->getList(); + } + $this->assign('models', $result); + } + $this->display('content/model.html'); + } + + // 内容模型增加 + public function add() + { + if ($_POST) { + // 获取数据 + $mcode = get_auto_code($this->model->getLastCode()); + $name = post('name'); + $type = post('type'); + $urlname = post('urlname'); + $listtpl = basename(post('listtpl')); + $contenttpl = basename(post('contenttpl')); + $status = post('status'); + + if (! $name) { + alert_back('模型名称不能为空!'); + } + + if ($type == 1) { + if (! $urlname) + $urlname = 'about'; + } else { + if (! $urlname) + $urlname = 'list'; + } + + if ($urlname && ! preg_match('/^[a-zA-Z0-9\-]+$/', $urlname)) { + alert_back('模型URL名称只允许字母、数字、横线组成!'); + } + + if ($this->model->checkUrlname($urlname, $type)) { + alert_back('模型URL名称与其他模型冲突,请换一个名称!'); + } + + if ($this->model->checkSortFilename($urlname)) { + alert_back('模型URL名称与栏目URL名称冲突,请换一个名称!'); + } + + // 构建数据 + $data = array( + 'mcode' => $mcode, + 'name' => $name, + 'type' => $type, + 'urlname' => $urlname, + 'listtpl' => $listtpl, + 'contenttpl' => $contenttpl, + 'status' => $status, + 'issystem' => 0, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addModel($data)) { + $this->log('新增内容模型成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Model/index')); + } + } else { + $this->log('新增内容模型失败!'); + error('新增失败!', - 1); + } + } + } + + // 内容模型删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delModel($id)) { + $this->log('删除内容模型' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除内容模型' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 内容模型修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modModel($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $name = post('name'); + $type = post('type'); + $urlname = post('urlname'); + $listtpl = basename(post('listtpl')); + $contenttpl = basename(post('contenttpl')); + $status = post('status'); + + if (! $name) { + alert_back('模型名称不能为空!'); + } + + if ($type == 1) { + if (! $urlname) + $urlname = 'about'; + } else { + if (! $urlname) + $urlname = 'list'; + } + + if ($urlname && ! preg_match('/^[a-zA-Z0-9\-]+$/', $urlname)) { + alert_back('模型URL名称只允许字母、数字、横线组成!'); + } + + if ($this->model->checkUrlname($urlname, $type, "id<>$id")) { + alert_back('模型URL名称与其他模型冲突,请换一个名称!'); + } + + if ($this->model->checkSortFilename($urlname)) { + alert_back('模型URL名称与栏目URL名称冲突,请换一个名称!'); + } + + // 构建数据 + $data = array( + 'name' => $name, + 'type' => $type, + 'urlname' => $urlname, + 'listtpl' => $listtpl, + 'contenttpl' => $contenttpl, + 'status' => $status, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modModel($id, $data)) { + $this->log('修改内容模型' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Model/index')); + } + } else { + location(- 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getModel($id)) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('model', $result); + $this->display('content/model.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/SingleController.php b/apps/admin/controller/content/SingleController.php new file mode 100644 index 0000000..75ee829 --- /dev/null +++ b/apps/admin/controller/content/SingleController.php @@ -0,0 +1,266 @@ +model = new SingleModel(); + } + + // 单页内容列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getSingle($id)) { + $this->assign('more', true); + $this->assign('content', $result); + } else { + $this->assign('list', true); + if (! $mcode = get('mcode', 'var')) { + error('传递的模型编码参数有误,请核对后重试!'); + } + + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findSingle($mcode, $field, $keyword); + } else { + $result = $this->model->getList($mcode); + } + $this->assign('baidu_zz_token', $this->config('baidu_zz_token')); + $this->assign('baidu_ks_token', $this->config('baidu_ks_token')); + + // 模型名称 + $this->assign('model_name', model('admin.content.Model')->getName($mcode)); + + // 前端地址连接符判断 + $url_break_char = $this->config('url_break_char') ?: '_'; + $this->assign('url_break_char', $url_break_char); + + $this->assign('contents', $result); + } + $this->display('content/single.html'); + } + + // 单页内容删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delSingle($id)) { + $this->log('删除单页内容' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除单页内容' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 单页内容修改 + public function mod() + { + // 前端地址连接符判断 + if (get('baiduzz') || get('baiduxzh')) { + $url_break_char = $this->config('url_break_char') ?: '_'; + $url_rule_sort_suffix = $this->config('url_rule_sort_suffix') ? true : false; + } + + // 站长普通推送 + if (! ! $id = get('baiduzz')) { + $domain = get_http_url(); + if (! $token = $this->config('baidu_zz_token')) { + alert_back('请先到系统配置中填写百度普通收录推送token值!'); + } + + $api = "http://data.zz.baidu.com/urls?site=$domain&token=$token"; + $data = $this->model->getSingle($id); + $data->urlname = $data->urlname ?: 'about'; + if ($data->outlink) { + alert_back('链接类型不允许推送!'); + } + if ($data->filename) { + $urls[] = $domain . homeurl('/home/Index/' . $data->filename, $url_rule_sort_suffix); + } else { + $urls[] = $domain . homeurl('/home/Index/' . $data->urlname . $url_break_char . $data->scode, $url_rule_sort_suffix); + } + $result = post_baidu($api, $urls); + if (isset($result->error)) { + $this->log('百度普通收录推送失败:' . $urls[0]); + alert_back('推送发生错误:' . $result->message); + } elseif (isset($result->success)) { + $this->log('百度普通收录推送成功:' . $urls[0]); + alert_back('成功推送' . $result->success . '条,今天剩余可推送' . $result->remain . '条数!'); + } else { + alert_back('发生未知错误!'); + } + } + + // 站长快速推送 + if (! ! $id = get('baiduks')) { + $domain = get_http_url(); + if (! $token = $this->config('baidu_ks_token')) { + alert_back('请先到系统配置中填写百度快速收录推送token值!'); + } + + $api = "http://data.zz.baidu.com/urls?site=$domain&token=$token&type=daily"; + $data = $this->model->getSingle($id); + $data->urlname = $data->urlname ?: 'about'; + if ($data->outlink) { + alert_back('链接类型不允许推送!'); + } + if ($data->filename) { + $urls[] = $domain . homeurl('/home/Index/' . $data->filename, $url_rule_sort_suffix); + } else { + $urls[] = $domain . homeurl('/home/Index/' . $data->urlname . $url_break_char . $data->scode, $url_rule_sort_suffix); + } + $result = post_baidu($api, $urls); + if (isset($result->error)) { + $this->log('百度快速收录推送失败:' . $urls[0]); + alert_back('推送发生错误:' . $result->message); + } elseif (isset($result->success_daily)) { + $this->log('百度快速收录推送成功:' . $urls[0]); + alert_back('成功推送' . $result->success_daily . '条,今天剩余可推送' . $result->remain_daily . '条数!'); + } else { + alert_back('发生未知错误!'); + } + } + + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modSingle($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $title = post('title'); + $author = post('author'); + $source = post('source'); + $ico = post('ico'); + $pics = post('pics'); + $content = post('content'); + $tags = str_replace(',', ',', post('tags')); + $titlecolor = post('titlecolor'); + $subtitle = post('subtitle'); + $outlink = post('outlink'); + $date = post('date'); + $enclosure = post('enclosure'); + $keywords = post('keywords'); + $description = post('description'); + $status = post('status', 'int'); + + // 获取多图标题 + $picstitle = post('picstitle'); + if ($picstitle) { + $picstitle = implode(',', $picstitle); + } + + if (! $title) { + alert_back('单页内容标题不能为空!'); + } + + // 自动提起前一百个字符为描述 + if (! $description && isset($_POST['content'])) { + $description = escape_string(clear_html_blank(substr_both(strip_tags($_POST['content']), 0, 150))); + } + + // 缩放缩略图 + if ($ico) { + resize_img(ROOT_PATH . $ico, '', $this->config('ico.max_width'), $this->config('ico.max_height')); + } + + // 构建数据 + $data = array( + 'title' => $title, + 'content' => $content, + 'tags' => $tags, + 'author' => $author, + 'source' => $source, + 'ico' => $ico, + 'pics' => $pics, + 'picstitle' => $picstitle, + 'titlecolor' => $titlecolor, + 'subtitle' => $subtitle, + 'outlink' => $outlink, + 'date' => $date, + 'enclosure' => $enclosure, + 'keywords' => $keywords, + 'description' => clear_html_blank($description), + 'status' => $status, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modSingle($id, $data)) { + + // 扩展内容修改 + foreach ($_POST as $key => $value) { + if (preg_match('/^ext_[\w\-]+$/', $key)) { + $temp = post($key); + if (is_array($temp)) { + $data2[$key] = implode(',', $temp); + } else { + $data2[$key] = str_replace("\r\n", '
', $temp); + } + } + } + if (isset($data2)) { + if ($this->model->findContentExt($id)) { + $this->model->modContentExt($id, $data2); + } else { + $data2['contentid'] = $id; + $this->model->addContentExt($data2); + } + } + + $this->log('修改单页内容' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Single/index/mcode/1')); + } + } else { + location(- 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getSingle($id)) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('content', $result); + + // 扩展字段 + if (! $mcode = get('mcode', 'var')) { + error('传递的模型编码参数有误,请核对后重试!'); + } + $this->assign('extfield', model('admin.content.ExtField')->getModelField($mcode)); + + $this->display('content/single.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/SiteController.php b/apps/admin/controller/content/SiteController.php new file mode 100644 index 0000000..9b7d0c7 --- /dev/null +++ b/apps/admin/controller/content/SiteController.php @@ -0,0 +1,82 @@ +model = new SiteModel(); + } + + // 显示站点信息 + public function index() + { + // 获取主题列表 + $themes = dir_list(ROOT_PATH . current($this->config('tpl_dir'))); + $this->assign('themes', $themes); + + // 获取系统配置 + $this->assign('sites', $this->model->getList()); + + // 显示 + $this->display('content/site.html'); + } + + // 修改站点信息 + public function mod() + { + if (! $_POST) { + return; + } + + $data = array( + 'title' => post('title'), + 'subtitle' => post('subtitle'), + 'domain' => post('domain'), + 'logo' => post('logo'), + 'keywords' => post('keywords'), + 'description' => post('description'), + 'icp' => post('icp'), + 'theme' => basename(post('theme')) ?: 'default', + 'statistical' => post('statistical'), + 'copyright' => post('copyright') + ); + + path_delete(RUN_PATH . '/config'); // 清理缓存的配置文件 + if ($this->model->checkSite()) { + if ($this->model->modSite($data)) { + $this->log('修改站点信息成功!'); + success('修改成功!', - 1); + } else { + location(- 1); + } + } else { + $data['acode'] = session('acode'); + if ($this->model->addSite($data)) { + $this->log('修改站点信息成功!'); + success('修改成功!', - 1); + } else { + location(- 1); + } + } + } + + // 服务器基础信息 + public function server() + { + $this->assign('server', get_server_info()); + $this->display('system/server.html'); + } +} + diff --git a/apps/admin/controller/content/SlideController.php b/apps/admin/controller/content/SlideController.php new file mode 100644 index 0000000..c92eb0d --- /dev/null +++ b/apps/admin/controller/content/SlideController.php @@ -0,0 +1,195 @@ +model = new SlideModel(); + } + + // 轮播图列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getSlide($id)) { + $this->assign('more', true); + $this->assign('slide', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findSlide($field, $keyword); + } else { + $result = $this->model->getList(); + } + $this->assign('gids', $this->model->getGid()); + $this->assign('slides', $result); + } + $this->display('content/slide.html'); + } + + // 轮播图增加 + public function add() + { + if ($_POST) { + // 获取数据 + $gid = post('gid', 'int'); + $pic = post('pic'); + $link = post('link'); + $title = post('title'); + $subtitle = post('subtitle'); + $sorting = post('sorting', 'int'); + + if (! $gid) { + $gid = $this->model->getMaxGid() + 1; + } + + if (! $pic) { + alert_back('图片不能为空!'); + } + + // 构建数据 + $data = array( + 'acode' => session('acode'), + 'gid' => $gid, + 'pic' => $pic, + 'link' => $link, + 'title' => $title, + 'subtitle' => $subtitle, + 'sorting' => $sorting, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addSlide($data)) { + $this->log('新增轮播图成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Slide/index')); + } + } else { + $this->log('新增轮播图失败!'); + error('新增失败!', - 1); + } + } + } + + // 轮播图删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delSlide($id)) { + $this->log('删除轮播图' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除轮播图' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 轮播图修改 + public function mod() + { + if (! ! $submit = post('submit')) { + switch ($submit) { + case 'sorting': // 修改列表排序 + $listall = post('listall'); + if ($listall) { + $sorting = post('sorting'); + foreach ($listall as $key => $value) { + if ($sorting[$key] === '' || ! is_numeric($sorting[$key])) + $sorting[$key] = 255; + $this->model->modSlide($value, "sorting=" . $sorting[$key]); + } + $this->log('批量修改轮播图排序成功!'); + success('修改成功!', - 1); + } else { + alert_back('排序失败,无任何内容!'); + } + break; + } + } + + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modSlide($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $gid = post('gid', 'int'); + $pic = post('pic'); + $link = post('link'); + $title = post('title'); + $subtitle = post('subtitle'); + $sorting = post('sorting', 'int'); + + if (! $gid) { + $gid = $this->model->getMaxGid() + 1; + } + + if (! $pic) { + alert_back('图片不能为空!'); + } + + // 构建数据 + $data = array( + 'gid' => $gid, + 'pic' => $pic, + 'link' => $link, + 'title' => $title, + 'subtitle' => $subtitle, + 'sorting' => $sorting, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modSlide($id, $data)) { + $this->log('修改轮播图' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Slide/index')); + } + } else { + location(- 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getSlide($id)) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('gids', $this->model->getGid()); + $this->assign('slide', $result); + $this->display('content/slide.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/content/TagsController.php b/apps/admin/controller/content/TagsController.php new file mode 100644 index 0000000..90c968b --- /dev/null +++ b/apps/admin/controller/content/TagsController.php @@ -0,0 +1,157 @@ +model = new TagsModel(); + } + + // 文章内链列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getTags($id)) { + $this->assign('more', true); + $this->assign('tags', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findTags($field, $keyword); + } else { + $result = $this->model->getList(); + } + $this->assign('tags', $result); + } + $this->display('content/tags.html'); + } + + // 文章内链增加 + public function add() + { + if ($_POST) { + // 获取数据 + $name = post('name'); + $link = post('link'); + + if (! $name) { + alert_back('名称不能为空!'); + } + + if (! $link) { + alert_back('链接不能为空!'); + } + + // 构建数据 + $data = array( + 'acode' => session('acode'), + 'name' => $name, + 'link' => $link, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addTags($data)) { + $this->log('新增文章内链成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Tags/index')); + } + } else { + $this->log('新增文章内链失败!'); + error('新增失败!', - 1); + } + } + } + + // 文章内链删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delTags($id)) { + $this->log('删除文章内链' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除文章内链' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 文章内链修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modTags($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $name = post('name'); + $link = post('link'); + + if (! $name) { + alert_back('名称不能为空!'); + } + + if (! $link) { + alert_back('链接不能为空!'); + } + + // 构建数据 + $data = array( + 'name' => $name, + 'link' => $link, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modTags($id, $data)) { + $this->log('修改文章内链' . $id . '成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Tags/index')); + } + } else { + location(- 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getTags($id)) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('tags', $result); + $this->display('content/tags.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/member/MemberCommentController.php b/apps/admin/controller/member/MemberCommentController.php new file mode 100644 index 0000000..b9fc3b6 --- /dev/null +++ b/apps/admin/controller/member/MemberCommentController.php @@ -0,0 +1,118 @@ +model = new MemberCommentModel(); + } + + // 文章评论列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getComment($id)) { + $this->assign('more', true); + $this->assign('comment', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findComment($field, $keyword); + } else { + $result = $this->model->getList(); + } + $this->assign('comments', $result); + } + $this->display('member/comment.html'); + } + + // 文章评论删除 + public function del() + { + // 执行批量删除 + if ($_POST) { + if (! ! $list = post('list')) { + if ($this->model->delCommentList($list)) { + $this->log('批量删除评论成功!'); + success('删除成功!', - 1); + } else { + $this->log('批量删除评论失败!'); + error('删除失败!', - 1); + } + } else { + alert_back('请选择要删除的评论!'); + } + } + + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delComment($id)) { + $this->log('删除文章评论' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除文章评论' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 字段修改 + public function mod() + { + if (! ! $submit = post('submit')) { + switch ($submit) { + case 'verify1': + $list = post('list'); + if (! $list) { + alert_back('请选择要操作的评论!'); + } + if ($this->model->modCommentList($list, "status=1")) { + $this->log('评论批量审核成功!'); + success('审核成功!', - 1); + } else { + alert_back('审核失败!'); + } + break; + case 'verify0': + $list = post('list'); + if (! $list) { + alert_back('请选择要操作的评论!'); + } + if ($this->model->modCommentList($list, "status=0")) { + $this->log('评论批量禁用成功!'); + success('禁用成功!', - 1); + } else { + alert_back('禁用失败!'); + } + break; + } + } + + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modComment($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/member/MemberController.php b/apps/admin/controller/member/MemberController.php new file mode 100644 index 0000000..30d756f --- /dev/null +++ b/apps/admin/controller/member/MemberController.php @@ -0,0 +1,292 @@ +model = new MemberModel(); + } + + // 会员列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getMember($id)) { + $this->assign('more', true); + $this->assign('fields', $this->model->getFields()); + $this->assign('member', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findMember($field, $keyword); + } else { + $result = $this->model->getList(); + } + + // 会员等级 + $this->assign('groups', model('admin.member.MemberGroup')->getSelect()); + $this->assign('members', $result); + } + $this->display('member/member.html'); + } + + // 会员增加 + public function add() + { + if ($_POST) { + // 获取数据 + $ucode = get_auto_code($this->model->getLastCode(), 1); + $username = post('username'); + $useremail = post('useremail'); + $usermobile = post('usermobile'); + $nickname = post('nickname'); + $password = post('password'); + $headpic = post('headpic'); + $status = post('status') ?: 1; + $gid = post('gid'); + $score = post('score'); + $register_time = get_datetime(); + + if (! $username) { + alert_back('用户账号不能为空!'); + } + + if (! preg_match('/^[\w\@\.]+$/', $username)) { + alert_back('用户账号含有不允许的特殊字符!'); + } + + if ($useremail && ! preg_match('/^[\w]+@[\w\.]+\.[a-zA-Z]+$/', $useremail)) { + alert_back('邮箱账号格式不正确!'); + } + + if ($usermobile && ! preg_match('/^1[0-9]{10}$/', $usermobile)) { + alert_back('手机号码格式不正确!'); + } + + if ($username && $this->model->checkMember("username='$username' OR useremail='$username' OR usermobile='$username'")) { + alert_back('用户名已经存在!'); + } + + if ($useremail && $this->model->checkMember("username='$useremail' OR useremail='$useremail' OR usermobile='$useremail'")) { + alert_back('邮箱账号已经存在!'); + } + + if ($usermobile && $this->model->checkMember("username='$usermobile' OR useremail='$usermobile' OR usermobile='$usermobile'")) { + alert_back('手机号码已经存在!'); + } + + if (! $password) { + alert_back('密码不能为空!'); + } else { + $password = md5(md5($password)); + } + + // 构建数据 + $data = array( + 'ucode' => $ucode, + 'username' => $username, + 'useremail' => $useremail, + 'usermobile' => $usermobile, + 'nickname' => $nickname, + 'password' => $password, + 'headpic' => $headpic, + 'status' => $status, + 'gid' => $gid, + 'wxid' => '', + 'qqid' => '', + 'wbid' => '', + 'activation' => 1, + 'score' => $score, + 'register_time' => $register_time, + 'login_count' => 0, + 'last_login_ip' => 0, + 'last_login_time' => 0 + ); + + // 执行添加 + if ($this->model->addMember($data)) { + $this->log('新增会员成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Member/index')); + } + } else { + $this->log('新增会员失败!'); + error('新增失败!', - 1); + } + } + } + + // 会员删除 + public function del() + { + // 执行批量删除 + if ($_POST) { + if (! ! $list = post('list')) { + if ($this->model->delMemberList($list)) { + $this->log('批量删除会员成功!'); + success('删除成功!', - 1); + } else { + $this->log('批量删除会员失败!'); + error('删除失败!', - 1); + } + } else { + alert_back('请选择要删除的会员!'); + } + } + + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->delMember($id)) { + $this->log('删除会员' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除会员' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 会员修改 + public function mod() + { + if (! ! $submit = post('submit')) { + switch ($submit) { + case 'verify1': + $list = post('list'); + if (! $list) { + alert_back('请选择要操作的会员!'); + } + if ($this->model->modMemberList($list, "status=1")) { + $this->log('会员批量启用成功!'); + success('启用成功!', - 1); + } else { + alert_back('启用失败!'); + } + break; + case 'verify0': + $list = post('list'); + if (! $list) { + alert_back('请选择要操作的会员!'); + } + if ($this->model->modMemberList($list, "status=0")) { + $this->log('会员批量禁用成功!'); + success('禁用成功!', - 1); + } else { + alert_back('禁用失败!'); + } + break; + } + } + + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modMember($id, "$field='$value'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $username = post('username'); + $useremail = post('useremail'); + $usermobile = post('usermobile'); + $nickname = post('nickname'); + $password = post('password'); + $headpic = post('headpic'); + $status = post('status') ?: 1; + $gid = post('gid'); + $score = post('score'); + + if (! $username) { + alert_back('用户账号不能为空!'); + } + + if (! preg_match('/^[\w\@\.]+$/', $username)) { + alert_back('用户账号含有不允许的特殊字符!'); + } + + if ($useremail && ! preg_match('/^[\w]+@[\w\.]+\.[a-zA-Z]+$/', $useremail)) { + alert_back('邮箱账号格式不正确!'); + } + + if ($usermobile && ! preg_match('/^1[0-9]{10}$/', $usermobile)) { + alert_back('手机号码格式不正确!'); + } + + if ($username && $this->model->checkMember("(username='$username' OR useremail='$username' OR usermobile='$username') AND id<>$id")) { + alert_back('用户名已经存在!'); + } + + if ($useremail && $this->model->checkMember("(username='$useremail' OR useremail='$useremail' OR usermobile='$useremail') AND id<>$id")) { + alert_back('邮箱账号已经存在!'); + } + + if ($usermobile && $this->model->checkMember("(username='$usermobile' OR useremail='$usermobile' OR usermobile='$usermobile') AND id<>$id")) { + alert_back('手机号码已经存在!'); + } + + // 构建数据 + $data = array( + 'username' => $username, + 'useremail' => $useremail, + 'usermobile' => $usermobile, + 'nickname' => $nickname, + 'headpic' => $headpic, + 'status' => $status, + 'gid' => $gid, + 'score' => $score + ); + + if ($password) { + $data['password'] = md5(md5($password)); + } + + // 执行添加 + if ($this->model->modMember($id, $data)) { + $this->log('修改会员成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Member/index')); + } + } else { + $this->log('修改会员失败!'); + error('修改失败!', - 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getMember($id)) { + error('编辑的内容已经不存在!', - 1); + } + // 会员等级 + $this->assign('groups', model('admin.member.MemberGroup')->getSelect()); + $this->assign('member', $result); + $this->display('member/member.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/member/MemberFieldController.php b/apps/admin/controller/member/MemberFieldController.php new file mode 100644 index 0000000..ce498e2 --- /dev/null +++ b/apps/admin/controller/member/MemberFieldController.php @@ -0,0 +1,193 @@ +model = new MemberFieldModel(); + } + + // 会员字段列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getField($id)) { + $this->assign('more', true); + $this->assign('field', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findField($field, $keyword); + } else { + $result = $this->model->getList(); + } + $this->assign('fields', $result); + } + $this->display('member/field.html'); + } + + // 会员字段增加 + public function add() + { + if ($_POST) { + + // 获取数据 + $name = post('name', 'var'); + $length = post('length', 'int') ?: 20; + $required = post('required', 'int') ?: 0; + $description = post('description'); + $sorting = post('sorting', 'int') ?: 255; + $status = post('status') ?: 1; + + if (! $name) { + alert_back('字段名称不能为空!'); + } + + if (! preg_match('/^[a-zA-Z][\w]+$/', $name)) { + alert_back('字段名称必须以字母开头!'); + } + + if (! $description) { + alert_back('字段描述不能为空!'); + } + + // 构建数据 + $data = array( + 'name' => $name, + 'length' => $length, + 'required' => $required, + 'description' => $description, + 'sorting' => $sorting, + 'status' => $status, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 字段类型及长度 + $mysql = "varchar($length)"; + $sqlite = "TEXT($length)"; + + // 字段不存在时创建 + if (! $this->model->isExistField($name)) { + if (get_db_type() == 'sqlite') { + $result = $this->model->amd("ALTER TABLE ay_member ADD COLUMN $name $sqlite NULL"); + } else { + $result = $this->model->amd("ALTER TABLE ay_member ADD $name $mysql NULL COMMENT '$description'"); + } + } elseif ($this->model->checkField($name)) { // 字段存在且已使用则报错 + alert_back('字段已经存在,不能重复添加!'); + } + + // 执行会员字段添加 + if ($this->model->addField($data)) { + $this->log('新增会员字段成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/MemberField/index')); + } + } else { + $this->log('新增会员字段失败!'); + error('新增失败!', - 1); + } + } + } + + // 会员字段删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + $name = $this->model->getFieldName($id); + if ($this->model->delField($id)) { + // mysql数据库执行字段删除,sqlite暂时不支持 + if (! ! $name) { + if (get_db_type() == 'mysql') { + $result = $this->model->amd("ALTER TABLE ay_member DROP COLUMN $name"); + } + } + $this->log('删除会员字段' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除会员字段' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 会员字段修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modField($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $required = post('required', 'int') ?: 0; + $description = post('description'); + $sorting = post('sorting', 'int') ?: 255; + $status = post('status') ?: 1; + + if (! $description) { + alert_back('字段描述不能为空!'); + } + + // 构建数据 + $data = array( + 'required' => $required, + 'description' => $description, + 'sorting' => $sorting, + 'status' => $status, + 'update_user' => session('username') + ); + + // 执行会员字段修改 + if ($this->model->modField($id, $data)) { + $this->log('修改会员字段成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/MemberField/index')); + } + } else { + $this->log('修改会员字段失败!'); + error('修改失败!', - 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getField($id)) { + error('编辑的内容已经不存在!', - 1); + } + + $this->assign('field', $result); + $this->display('member/field.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/member/MemberGroupController.php b/apps/admin/controller/member/MemberGroupController.php new file mode 100644 index 0000000..bb21de9 --- /dev/null +++ b/apps/admin/controller/member/MemberGroupController.php @@ -0,0 +1,187 @@ +model = new MemberGroupModel(); + } + + // 会员等级列表 + public function index() + { + if ((! ! $id = get('id', 'int')) && $result = $this->model->getGroup($id)) { + $this->assign('more', true); + $this->assign('group', $result); + } else { + $this->assign('list', true); + if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { + $result = $this->model->findGroup($field, $keyword); + } else { + $result = $this->model->getList(); + } + $this->assign('groups', $result); + } + $this->display('member/group.html'); + } + + // 会员等级增加 + public function add() + { + if ($_POST) { + + // 获取数据 + $gcode = post('gcode', 'int') ?: get_auto_code($this->model->getLastGid(), 1); + $gname = post('gname'); + $description = post('description'); + $status = post('status') ?: 1; + $lscore = post('lscore', 'int') ?: 0; + $uscore = post('uscore', 'int') ?: 9999999999; + + if (! $gcode) { + alert_back('等级编号不能为空!'); + } + + if (! $gname) { + alert_back('等级名称不能为空!'); + } + + if ($this->model->findGroupCode($gcode)) { + alert_back('等级编码不能重复!'); + } + + // 构建数据 + $data = array( + 'gcode' => $gcode, + 'gname' => $gname, + 'description' => $description, + 'status' => $status, + 'lscore' => $lscore, + 'uscore' => $uscore, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行会员等级添加 + if ($this->model->addGroup($data)) { + $this->log('新增会员等级成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/MemberGroup/index')); + } + } else { + $this->log('新增会员等级失败!'); + error('新增失败!', - 1); + } + } + } + + // 会员等级删除 + public function del() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + if ($this->model->findGroupUser($id)) { + error('会员等级下存在用户,无法直接删除!', - 1); + } + + if ($this->model->delGroup($id)) { + $this->log('删除会员等级' . $id . '成功!'); + success('删除成功!', - 1); + } else { + $this->log('删除会员等级' . $id . '失败!'); + error('删除失败!', - 1); + } + } + + // 会员等级修改 + public function mod() + { + if (! $id = get('id', 'int')) { + error('传递的参数值错误!', - 1); + } + + // 单独修改状态 + if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { + if ($this->model->modGroup($id, "$field='$value',update_user='" . session('username') . "'")) { + location(- 1); + } else { + alert_back('修改失败!'); + } + } + + // 修改操作 + if ($_POST) { + + // 获取数据 + $gcode = post('gcode', 'int') ?: get_auto_code($this->model->getLastGid(), 1); + $gname = post('gname'); + $description = post('description'); + $status = post('status') ?: 1; + $lscore = post('lscore', 'int') ?: 0; + $uscore = post('uscore', 'int') ?: 9999999999; + + if (! $gcode) { + alert_back('等级编号不能为空!'); + } + + if (! $gname) { + alert_back('等级名称不能为空!'); + } + + if ($this->model->findGroupCode($gcode, $id)) { + alert_back('等级编码不能重复!'); + } + + // 构建数据 + $data = array( + 'gcode' => $gcode, + 'gname' => $gname, + 'description' => $description, + 'status' => $status, + 'lscore' => $lscore, + 'uscore' => $uscore, + 'update_user' => session('username') + ); + + // 执行会员等级修改 + if ($this->model->modGroup($id, $data)) { + $this->log('修改会员等级成功!'); + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/MemberGroup/index')); + } + } else { + $this->log('修改会员等级失败!'); + error('修改失败!', - 1); + } + } else { + // 调取修改内容 + $this->assign('mod', true); + if (! $result = $this->model->getGroup($id)) { + error('编辑的内容已经不存在!', - 1); + } + + $this->assign('group', $result); + $this->display('member/group.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/system/AreaController.php b/apps/admin/controller/system/AreaController.php new file mode 100644 index 0000000..89d2f80 --- /dev/null +++ b/apps/admin/controller/system/AreaController.php @@ -0,0 +1,303 @@ +model = new AreaModel(); + } + + // 区域列表 + public function index() + { + $this->assign('list', true); + $area_tree = $this->model->getList(); + $areas = $this->makeAreaList($area_tree); + $this->assign('areas', $areas); + + // 区域下拉表 + $area_tree = $this->model->getSelect(); + $area_select = $this->makeAreaSelect($area_tree); + $this->assign('area_select', $area_select); + + $this->display('system/area.html'); + } + + // 生成无限级区域列表 + private function makeAreaList($tree) + { + // 循环生成 + foreach ($tree as $value) { + $this->count ++; + $this->outData[$this->count] = new \stdClass(); + $this->outData[$this->count]->id = $value->id; + $this->outData[$this->count]->blank = $this->blank; + $this->outData[$this->count]->name = $value->name; + $this->outData[$this->count]->domain = $value->domain; + $this->outData[$this->count]->acode = $value->acode; + $this->outData[$this->count]->pcode = $value->pcode; + $this->outData[$this->count]->is_default = $value->is_default; + $this->outData[$this->count]->create_user = $value->create_user; + $this->outData[$this->count]->update_user = $value->update_user; + $this->outData[$this->count]->create_time = $value->create_time; + $this->outData[$this->count]->update_time = $value->update_time; + + if ($value->son) { + $this->outData[$this->count]->son = true; + } else { + $this->outData[$this->count]->son = false; + } + + // 子菜单处理 + if ($value->son) { + $this->blank .= '  '; + $this->makeAreaList($value->son); + } + } + + // 循环完后回归缩进位置 + $this->blank = substr($this->blank, 6); + return $this->outData; + } + + // 区域增加 + public function add() + { + if ($_POST) { + // 获取数据 + $acode = post('acode', 'var'); + $pcode = post('pcode', 'var'); + $name = post('name'); + $domain = post('domain'); + $is_default = post('is_default'); + + if (! $acode) { + alert_back('编码不能为空!'); + } + + if (! $pcode) { // 父编码默认为0 + $pcode = 0; + } + + if (! $name) { + alert_back('区域名称不能为空!'); + } + + if ($domain) { + $reg = '{^(https://|http://)?([\w\-.]+)([\/]+)?$}'; + if (preg_match($reg, $domain)) { + $domain = preg_replace($reg, '$2', $domain); + } else { + alert_back('要绑定的域名输入有错!'); + } + + // 检查绑定 + if ($this->model->checkArea("domain='$domain'")) { + alert_back('该域名已经绑定其他区域,不能再使用!'); + } + } + + // 检查编码 + if ($this->model->checkArea("acode='$acode'")) { + alert_back('该区域编号已经存在,不能再使用!'); + } + + // 构建数据 + $data = array( + 'acode' => $acode, + 'pcode' => $pcode, + 'name' => $name, + 'domain' => $domain, + 'is_default' => $is_default, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addArea($data)) { + if (session('ucode') == '10001') { + $acodes = session('acodes'); + $acodes[] = $acode; + session('acodes', $acodes); // 更新管理员管理区域 + $model = model('Index'); + $areas = $model->getAreas(); + session('area_map', get_mapping($areas, 'name', 'acode')); // 更新区域代码名称映射表 + session('area_tree', $model->getUserAreaTree($areas, 0, 'acode', 'pcode', 'son', $acodes)); // 更新当前用户的区域树 + } + $this->log('新增数据区域' . $acode . '成功!'); + path_delete(RUN_PATH . '/config'); // 清理缓存的配置文件 + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('/admin/Area/index')); + } + } else { + $this->log('新增数据区域' . $acode . '失败!'); + error('新增失败!', - 1); + } + } + } + + // 生成区域选择 + private function makeAreaSelect($tree, $selectid = null) + { + $list_html = ''; + foreach ($tree as $value) { + // 默认选择项 + if ($selectid == $value->acode) { + $select = "selected='selected'"; + } else { + $select = ''; + } + if (get('acode') != $value->acode) { // 不显示本身,避免出现自身为自己的父节点 + $list_html .= ""; + } + // 子菜单处理 + if ($value->son) { + $this->blank .= '  '; + $list_html .= $this->makeAreaSelect($value->son, $selectid); + } + } + // 循环完后回归位置 + $this->blank = substr($this->blank, 0, - 6); + return $list_html; + } + + // 区域删除 + public function del() + { + if (! $acode = get('acode', 'var')) { + error('传递的参数值错误!', - 1); + } + + if ($acode == 'cn') { + error('系统内置区域不允许删除!', - 1); + } + + if ($this->model->delArea($acode)) { + path_delete(RUN_PATH . '/config'); // 清理缓存的配置文件 + $this->log('删除数据区域' . $acode . '成功!'); + session_unset(); + success('删除成功,请重新登录', url('/admin/Index/index')); + } else { + $this->log('删除数据区域' . $acode . '失败!'); + error('删除失败,请核对是否为默认区域!', - 1); + } + } + + // 区域修改 + public function mod() + { + if (! $acode = get('acode', 'var')) { + error('传递的参数值错误!', - 1); + } + + // 修改操作 + if ($_POST) { + // 获取数据 + $acode_new = post('acode', 'var'); + $pcode = post('pcode', 'var'); + $name = post('name'); + $domain = post('domain'); + $is_default = post('is_default'); + + if (! $acode_new) { + alert_back('编码不能为空!'); + } + + if (! $pcode) { // 父编码默认为0 + $pcode = 0; + } + + if (! $name) { + alert_back('区域名称不能为空!'); + } + + if ($domain) { + $reg = '{^(https://|http://)?([\w\-.]+)([\/]+)?$}'; + if (preg_match($reg, $domain)) { + $domain = preg_replace($reg, '$2', $domain); + } else { + alert_back('要绑定的域名输入有错!'); + } + + // 检查绑定 + if ($this->model->checkArea("domain='$domain' AND acode<>'$acode'")) { + alert_back('该域名已经绑定其他区域,不能再使用!'); + } + } + + // 检查编码 + if ($this->model->checkArea("acode='$acode_new' AND acode<>'$acode'")) { + alert_back('该区域编号已经存在,不能再使用!'); + } + + // 构建数据 + $data = array( + 'acode' => $acode_new, + 'pcode' => $pcode, + 'name' => $name, + 'domain' => $domain, + 'is_default' => $is_default, + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->modArea($acode, $data)) { + if (session('ucode') == '10001') { + $acodes = session('acodes'); + $acodes[] = $acode_new; + session('acodes', $acodes); // 更新管理员管理区域 + $model = model('Index'); + $areas = $model->getAreas(); + session('area_map', get_mapping($areas, 'name', 'acode')); // 更新区域代码名称映射表 + session('area_tree', $model->getUserAreaTree($areas, 0, 'acode', 'pcode', 'son', $acodes)); // 更新当前用户的区域树 + } + $this->log('修改数据区域' . $acode . '成功!'); + path_delete(RUN_PATH . '/config'); // 清理缓存的配置文件 + if (! ! $backurl = get('backurl')) { + success('修改成功!', base64_decode($backurl)); + } else { + success('修改成功!', url('/admin/Area/index')); + } + } else { + location(- 1); + } + } else { // 调取修改内容 + $this->assign('mod', true); + + $area = $this->model->getArea($acode); + if (! $area) { + error('编辑的内容已经不存在!', - 1); + } + $this->assign('area', $area); + + // 父编码下拉选择 + $area_tree = $this->model->getSelect(); + $area_select = $this->makeAreaSelect($area_tree, $area->pcode); + $this->assign('area_select', $area_select); + + $this->display('system/area.html'); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/system/ConfigController.php b/apps/admin/controller/system/ConfigController.php new file mode 100644 index 0000000..cc9a06f --- /dev/null +++ b/apps/admin/controller/system/ConfigController.php @@ -0,0 +1,226 @@ +model = new ConfigModel(); + } + + // 应用配置列表 + public function index() + { + if (! ! $action = get('action')) { + switch ($action) { + case 'sendemail': + $rs = sendmail($this->config(), get('to'), '【PbootCMS】测试邮件', '欢迎您使用PbootCMS网站开发管理系统!'); + if ($rs === true) { + alert_back('测试邮件发送成功!'); + } else { + error('发送失败:' . $rs); + } + break; + } + } + + // 修改参数配置 + if ($_POST) { + unset($_POST['upload']); // 去除上传组件 + foreach ($_POST as $key => $value) { + if (! preg_match('/^[\w\-]+$/', $key)) { + continue; + } + $config = array( + 'debug', + 'sn', + 'sn_user', + 'pagenum', + 'tpl_html_cache', + 'tpl_html_cache_time', + 'session_in_sitepath' + ); + if (in_array($key, $config)) { + if ($key == 'tpl_html_cache_time' && ! $value) { + $value = 900; + } else { + $value = post($key); + } + $this->modConfig($key, $value); + } else { + $this->modDbConfig($key); + } + } + + $this->log('修改参数配置成功!'); + path_delete(RUN_PATH . '/config'); // 清理缓存的配置文件 + + switch (post('submit')) { + case 'email': + success('修改成功!', url('/admin/Config/index' . get_tab('t2'), false)); + break; + case 'baidu': + success('修改成功!', url('/admin/Config/index' . get_tab('t3'), false)); + break; + case 'api': + success('修改成功!', url('/admin/Config/index' . get_tab('t4'), false)); + break; + case 'watermark': + success('修改成功!', url('/admin/Config/index' . get_tab('t5'), false)); + break; + case 'security': + success('修改成功!', url('/admin/Config/index' . get_tab('t6'), false)); + break; + case 'urlrule': + success('修改成功!', url('/admin/Config/index' . get_tab('t7'), false)); + break; + case 'pagetitle': + success('修改成功!', url('/admin/Config/index' . get_tab('t8'), false)); + break; + case 'member': + success('修改成功!', url('/admin/Config/index' . get_tab('t9'), false)); + break; + case 'upgrade': + success('修改成功!', url('/admin/Upgrade/index' . get_tab('t2'), false)); + break; + default: + success('修改成功!', url('/admin/Config/index', false)); + } + } + $configs = $this->model->getList(); + $configs['debug']['value'] = $this->config('debug'); + $configs['sn']['value'] = $this->config('sn'); + $configs['sn_user']['value'] = $this->config('sn_user'); + $configs['session_in_sitepath']['value'] = $this->config('session_in_sitepath'); + $configs['pagenum']['value'] = $this->config('pagenum'); + $configs['url_type']['value'] = $this->config('url_type'); + $configs['tpl_html_cache']['value'] = $this->config('tpl_html_cache'); + $configs['tpl_html_cache_time']['value'] = $this->config('tpl_html_cache_time'); + $this->assign('configs', $configs); + + $this->assign('groups', model('admin.member.MemberGroup')->getSelect()); + + $this->display('system/config.html'); + } + + // 修改配置文件 + private function modConfig($key, $value) + { + $value = str_replace(' ', '', $value); // 去除空格 + $value = str_replace(',', ',', $value); // 转换可能输入的中文逗号 + if (! preg_match('/^[\w\s\,\-]+$/', $value)) { + return; + } + + $config = file_get_contents(CONF_PATH . '/config.php'); + if (preg_match("'$key'", $config)) { + if (preg_match('/^[0-9]+$/', $value)) { + $config = preg_replace('/(\'' . $key . '\'([\s]+)?=>([\s]+)?)[\w\'\"\s,]+,/', '${1}' . $value . ',', $config); + } else { + $config = preg_replace('/(\'' . $key . '\'([\s]+)?=>([\s]+)?)[\w\'\"\s,]+,/', '${1}\'' . $value . '\',', $config); + } + } else { + $config = preg_replace('/(return array\()/', "$1\r\n\r\n\t'$key' => '$value',", $config); // 自动新增配置 + } + return file_put_contents(CONF_PATH . '/config.php', $config); + } + + // 修改数据库配置 + private function modDbConfig($key) + { + $value = post($key); + + // 如果开启伪静态时自动拷贝文件 + if ($key == 'url_rule_type' && $value == 2) { + $soft = get_server_soft(); + if ($soft == 'iis') { + if (! file_exists(ROOT_PATH . '/web.config')) { + copy(ROOT_PATH . '/rewrite/web.config', ROOT_PATH . '/web.config'); + } + } elseif ($soft == 'apache') { + if (! file_exists(ROOT_PATH . '/web.config')) { + copy(ROOT_PATH . '/rewrite/.htaccess', ROOT_PATH . '/.htaccess'); + } + } + } + + // 模板目录修改 + if (($key == 'tpl_html_dir') && $value) { + + // 不允许特殊字符 + if (! preg_match('/^\w+$/', $value)) { + return; + } + + $value = basename($value); + $htmldir = $this->config('tpl_html_dir'); + $tpl_path = ROOT_PATH . current($this->config('tpl_dir')) . '/' . model('admin.content.ContentSort')->getTheme(); + + if (! $htmldir || ! file_exists($tpl_path . '/' . $htmldir)) { + if (! check_dir($tpl_path . '/' . $value, true)) { + return; + } // 原来没有目录时只创建目录,创建失败时直接不修改 + } else { + if ($value != $htmldir) { + if (file_exists($tpl_path . '/' . $value)) { + if (dir_copy($tpl_path . '/' . $htmldir, $tpl_path . '/' . $value)) { + path_delete($tpl_path . '/' . $htmldir, true); // 删除原来的 + } else { + return; // 修改失败 + } + } else { + if (! rename($tpl_path . '/' . $htmldir, $tpl_path . '/' . $value)) { + return; // 修改失败 + } + } + } + } + } + + if ($key == 'home_upload_ext') { + // 不允许特殊扩展 + if (preg_match('/(php|jsp|asp|exe|sh|cmd|vb|vbs|phtml)/i', $value)) { + return; + } + } + + // 数据分割处理 + $hander = array( + 'content_keyword_replace', + 'ip_deny', + 'ip_allow' + ); + if (in_array($key, $hander) && $value) { + $value = str_replace("\r\n", ",", $value); // 替换回车 + $value = str_replace(",", ",", $value); // 替换中文逗号分割符 + } + + if ($this->model->checkConfig("name='$key'")) { + $this->model->modValue($key, $value); + } elseif ($key != 'submit' && $key != 'formcheck') { + // 自动新增配置项 + $data = array( + 'name' => $key, + 'value' => $value, + 'type' => 2, + 'sorting' => 255, + 'description' => '' + ); + return $this->model->addConfig($data); + } + } +} \ No newline at end of file diff --git a/apps/admin/controller/system/DatabaseController.php b/apps/admin/controller/system/DatabaseController.php new file mode 100644 index 0000000..2a94293 --- /dev/null +++ b/apps/admin/controller/system/DatabaseController.php @@ -0,0 +1,248 @@ +model = new DatabaseModel(); + $this->dbauth = $this->config('database'); + } + + // 数据库管理 + public function index() + { + switch ($this->dbauth['type']) { + case 'mysqli': + case 'pdo_mysql': + $this->assign('db', 'mysql'); + $this->assign('tables', $this->model->getList()); + break; + case 'sqlite': + case 'pdo_sqlite': + $this->assign('db', 'sqlite'); + break; + default: + error('当前配置的数据库类型不支持在线管理!'); + } + $this->display('system/database.html'); + } + + // 数据库修改 + public function mod() + { + if (! $_POST) { + alert_back('非法访问!', - 1); + } + + $submit = post('submit', 'letter', true); + + switch ($submit) { + case 'yh': + $tables = self::getTableList(); + if (! $tables) + alert_back('请选择数据表!'); + if ($this->model->optimize(implode(',', $tables))) { + // $this->log('优化数据库表成功!'); + success('优化成功!', - 1); + } else { + // $this->log('优化数据库表失败!'); + error('优化失败!', - 1); + } + break; + case 'xf': + $tables = self::getTableList(); + if (! $tables) + alert_back('请选择数据表!'); + if ($this->model->repair(implode(',', $tables))) { + // $this->log('修复数据库表成功!'); + success('修复成功!', - 1); + } else { + // $this->log('修复数据库表失败!'); + error('修复失败!', - 1); + } + break; + case 'bf': + $tables = self::getTableList(); + if (! $tables) + alert_back('请选择数据表!'); + if ($this->backupTable($tables)) { + $this->log('备份数据库表成功!'); + success('备份表成功!', - 1); + } else { + $this->log('备份数据库表失败!'); + error('备份失败!', - 1); + } + break; + case 'bfdb': + if ($this->backupDB()) { + $this->log('备份数据库成功!'); + success('备份数据库成功!', - 1); + } else { + $this->log('备份数据库失败!'); + error('备份失败!', - 1); + } + break; + case 'bfsqlite': + if (copy(DOC_PATH . $this->dbauth['dbname'], DOC_PATH . STATIC_DIR . '/backup/sql/' . get_uniqid() . '_' . date('YmdHis') . '.db')) { + $this->log('备份数据库成功!'); + success('备份数据库成功!', - 1); + } else { + $this->log('备份数据库失败!'); + error('备份失败!', - 1); + } + break; + } + } + + // 备份数据表 + public function backupTable($tables) + { + $backdir = date('YmdHis'); + foreach ($tables as $table) { + $sql = ''; + $sql .= $this->header(); // 备份文件头部说明 + $sql .= $this->tableSql($table); // 表结构信息 + $fields = $this->model->getFields($table); // 表字段 + $field_num = $this->model->getFieldNum($table); // 字段数量 + $all_data = $this->model->getAll($table); // 读取全部数据 + $sql .= $this->dataSql($table, $fields, $field_num, $all_data); // 生成语句 + $filename = $backdir . "/" . get_uniqid() . "_" . $backdir . "_" . $table . '.sql'; // 写入文件 + $result = $this->writeFile($filename, $sql); + } + return $result; + } + + // 备份整个数据库 + public function backupDB() + { + $sql = ''; + $sql .= $this->header(); // 备份文件头部说明 + $sql .= $this->dbSql(); // 数据库创建语句 + + $tables = $this->model->getTables(); // 获取所有表 + foreach ($tables as $table) { // 表结构及数据 + $sql .= $this->tableSql($table); // 表结构信息 + $fields = $this->model->getFields($table); // 表字段 + $field_num = $this->model->getFieldNum($table); // 字段数量 + $all_data = $this->model->getAll($table); // 读取全部数据 + if ($all_data) { + $sql .= $this->dataSql($table, $fields, $field_num, $all_data); // 生成数据语句 + } + $sql .= '-- --------------------------------------------------------' . PHP_EOL . PHP_EOL; + } + // 写入文件 + $filename = get_uniqid() . '_' . date('YmdHis') . '_' . $this->dbauth['dbname'] . '.sql'; + return $this->writeFile($filename, $sql); + } + + // 插入数据库备份基础信息 + private function header() + { + $sql = '-- Online Database Management SQL Dump' . PHP_EOL; + $sql .= '-- 数据库名: ' . $this->dbauth['dbname'] . PHP_EOL; + $sql .= '-- 生成日期: ' . date('Y-m-d H:i:s') . PHP_EOL; + $sql .= '-- PHP 版本: ' . phpversion() . PHP_EOL . PHP_EOL; + + $sql .= 'SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";' . PHP_EOL; + $sql .= 'SET time_zone = "+08:00";' . PHP_EOL; + $sql .= 'SET NAMES utf8;' . PHP_EOL . PHP_EOL; + + $sql .= '-- --------------------------------------------------------' . PHP_EOL . PHP_EOL; + return $sql; + } + + // 数据库创建语句 + private function dbSql() + { + $sql = ''; + $sql .= "--" . PHP_EOL; + $sql .= "-- 数据库名 `" . $this->dbauth['dbname'] . '`' . PHP_EOL; + $sql .= "--" . PHP_EOL . PHP_EOL; + + // 如果数据库不存在则创建 + $sql .= "CREATE DATABASE IF NOT EXISTS `" . $this->dbauth['dbname'] . '` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;' . PHP_EOL; + // 选择数据库 + $sql .= "USE `" . $this->dbauth['dbname'] . "`;" . PHP_EOL . PHP_EOL; + $sql .= '-- --------------------------------------------------------' . PHP_EOL . PHP_EOL; + return $sql; + } + + // 表结构语句 + private function tableSql($table) + { + $sql = ''; + $sql .= "--" . PHP_EOL; + $sql .= "-- 表的结构 `" . $table . '`' . PHP_EOL; + $sql .= "--" . PHP_EOL . PHP_EOL; + + $sql .= $this->model->tableStru($table); // 表创建语句 + return $sql; + } + + // 数据语句 + private function dataSql($table, $fields, $fieldNnum, $data) + { + if (! $data) + return; + $sql = ''; + $sql .= "--" . PHP_EOL; + $sql .= "-- 转存表中的数据 `" . $table . "`" . PHP_EOL; + $sql .= "--" . PHP_EOL; + $sql .= PHP_EOL; + + // 循环每个字段下面的内容 + + $sql .= "INSERT INTO `" . $table . "` (" . implode(',', $fields) . ") VALUES" . PHP_EOL; + $brackets = "("; + foreach ($data as $value) { + $sql .= $brackets; + $comma = ""; + for ($i = 0; $i < $fieldNnum; $i ++) { + $sql .= ($comma . "'" . decode_string($value[$i]) . "'"); + $comma = ","; + } + $sql .= ")"; + $brackets = "," . PHP_EOL . "("; + } + $sql .= ';' . PHP_EOL . PHP_EOL; + return $sql; + } + + // 写入文件 + private function writeFile($filename, $content) + { + $sqlfile = DOC_PATH . STATIC_DIR . '/backup/sql/' . $filename; + check_file($sqlfile, true); + if (file_put_contents($sqlfile, $content)) { + return true; + } + } + + // 获取并检查表名称 + private function getTableList() + { + $list = post('list'); + foreach ($list as $key => $value) { + if (! preg_match('/^[\w]+$/', $value)) { + unset($list[$key]); + } + } + return $list; + } +} \ No newline at end of file diff --git a/apps/admin/controller/system/MenuController.php b/apps/admin/controller/system/MenuController.php new file mode 100644 index 0000000..1fa448f --- /dev/null +++ b/apps/admin/controller/system/MenuController.php @@ -0,0 +1,275 @@ +model = new MenuModel(); + } + + // 菜单列表 + public function index() + { + $this->assign('list', true); + $menus = $this->model->getList(); + $this->assign('menus', $this->makeMenuList($menus)); + + // 菜单下拉列表 + $menus = $this->model->getSelect(); + $this->assign('menu_select', $this->makeMenuSelect($menus)); + + // 获取菜单按钮 + $this->assign('actions', get_type('T101')); + + $this->display('system/menu.html'); + } + + // 生成无限级菜单管理列表 + private function makeMenuList($tree) + { + // 循环生成 + foreach ($tree as $value) { + $this->count ++; + $this->outData[$this->count] = new \stdClass(); + $this->outData[$this->count]->id = $value->id; + $this->outData[$this->count]->blank = $this->blank; + $this->outData[$this->count]->name = $value->name; + $this->outData[$this->count]->mcode = $value->mcode; + $this->outData[$this->count]->pcode = $value->pcode; + $this->outData[$this->count]->sorting = $value->sorting; + $this->outData[$this->count]->url = $value->url; + $this->outData[$this->count]->status = $value->status; + $this->outData[$this->count]->shortcut = $value->shortcut; + $this->outData[$this->count]->ico = $value->ico; + $this->outData[$this->count]->create_user = $value->create_user; + $this->outData[$this->count]->update_user = $value->update_user; + $this->outData[$this->count]->create_time = $value->create_time; + $this->outData[$this->count]->update_time = $value->update_time; + + if ($value->son) { + $this->outData[$this->count]->son = true; + } else { + $this->outData[$this->count]->son = false; + } + // 子菜单处理 + if ($value->son) { + $this->blank .= '  '; + $this->makeMenuList($value->son); + } + } + // 循环完后回归缩进位置 + $this->blank = substr($this->blank, 0, - 6); + return $this->outData; + } + + // 菜单增加 + public function add() + { + if ($_POST) { + // 获取数据 + $mcode = get_auto_code($this->model->getLastCode()); // 自动编码 + $pcode = post('pcode', 'var'); + $name = post('name'); + $url = post('url'); + $sorting = post('sorting', 'int'); + $status = post('status', 'int'); + $shortcut = post('shortcut', 'int'); + $ico = post('ico'); + $actions = post('actions', 'array', false, '菜单按钮', array()); + + if (! $mcode) { + alert_back('编码不能为空!'); + } + if (! $pcode) { + $pcode = 0; // 父编码默认为0 + } + if (! $name) { + alert_back('菜单名称不能为空!'); + } + + if ($this->model->checkMenu("mcode='$mcode'")) { + alert_back('该菜单编号已经存在,不能再使用!'); + } + + // 菜单地址自动填充 + if (! $url) { + $url = '/' . M . '/' . $mcode . '/index'; + } + + // 构建数据 + $data = array( + 'mcode' => $mcode, + 'pcode' => $pcode, + 'name' => $name, + 'url' => $url, + 'sorting' => $sorting, + 'status' => $status, + 'shortcut' => $shortcut, + 'ico' => $ico, + 'create_user' => session('username'), + 'update_user' => session('username') + ); + + // 执行添加 + if ($this->model->addMenu($data, $actions)) { + $this->log('新增菜单' . $mcode . '成功!'); + if (! ! $backurl = get('backurl')) { + success('新增成功!', base64_decode($backurl)); + } else { + success('新增成功!', url('admin/Menu/index')); + } + } else { + $this->log('新增菜单' . $mcode . '失败!'); + error('新增失败!', - 1); + } + } + } + + // 生成菜单下拉列表 + private function makeMenuSelect($tree, $selectid = null) + { + // 初始化 + $menu_html = ''; + // 循环生成 + foreach ($tree as $value) { + // 默认选择项 + if ($selectid == $value->mcode) { + $select = "selected='selected'"; + } else { + $select = ''; + } + if (get('mcode') != $value->mcode) { // 不显示本身,避免出现自身为自己的父节点 + $menu_html .= "