Commit 9c3e81ba authored by luoboss's avatar luoboss
Browse files

更加简洁大气的前台UI。

优化局部模板添加圆角设置。
优化上传组件的样式。
添加自定义跳转提示页和404页声明。
添加页眉导航和页脚自定义的设置。
完善常见问题页面
重新调整登录界面,保持简洁才是我们一贯的风格。
优化了权限认证,模板添加$label->checkAuth() 方法用于某些内容展示判断。
添加授权认证功能。
parent 9819f987
Showing with 193 additions and 39 deletions
+193 -39
......@@ -42,7 +42,7 @@ class Category extends \Core\Controller\Controller{
]);
$this->assign('ticket', $ticketList);
}
$this->assign('title', '提交工单');
$this->assign('category', $category);
$this->layout('Category_index', 'Category_layout');
}
......@@ -54,7 +54,7 @@ class Category extends \Core\Controller\Controller{
$number = $this->isG('number', '请提交您要生成的工单');
$result = \Model\TicketForm::getFormWithNumber($number);
if(empty($result)){
$this->_404();
$this->_404(true);
}
$field = [];
......
......@@ -14,6 +14,15 @@ namespace App\Form\GET;
class Fqa extends \Core\Controller\Controller{
public function __call($name, $arguments) {
if($name == 'list'){
$this->_list();
}else{
$this->_404(true);
}
}
/**
* FQA列表输出
*/
......@@ -23,7 +32,7 @@ class Fqa extends \Core\Controller\Controller{
$list = \Model\Content::listContent([
'table' => 'fqa',
'field' => 'fqa_id, fqa_url, fqa_title',
'condition' => 'fqa_ticket_model_id = :model_id',
'condition' => 'fqa_ticket_model_id = :model_id AND fqa_status = 1',
'order' => 'fqa_listsort ASC, fqa_id DESC',
'param' => [
'model_id' => $ticket['ticket_model_id']
......@@ -38,6 +47,42 @@ class Fqa extends \Core\Controller\Controller{
}
public function _list(){
$condtion = 'f.fqa_status = 1';
$param = [];
if(!empty($_GET['keyword'])){
$condtion .= ' AND (f.fqa_title LIKE :fqa_title OR f.fqa_content LIKE :fqa_content)';
$param['fqa_title'] = $param['fqa_content'] = '%'.$this->g('keyword').'%';
}
//登录可看所有FQA
if(empty($this->session()->get('member')['member_id'])){
$condtion .= ' AND tm.ticket_model_login = 0 ';
}
$result = \Model\Content::listContent([
'table' => 'fqa AS f',
'field' => 'fqa_id, fqa_url, fqa_title, fqa_ticket_model_id, tm.ticket_model_name, tm.ticket_model_cid',
'join' => "{$this->prefix}ticket_model AS tm ON tm.ticket_model_id = f.fqa_ticket_model_id",
'condition' => $condtion,
'order' => 'fqa_listsort ASC, fqa_id DESC',
'param' => $param
]);
if(!empty($result)){
foreach ($result as $value){
$list[$value['ticket_model_cid']][$value['fqa_ticket_model_id']]['ticket_model_name'] = $value['ticket_model_name'];
$list[$value['ticket_model_cid']][$value['fqa_ticket_model_id']]['list'][] = $value;
}
}
$this->assign('title', '常见问题');
$this->assign('list', $list);
$this->assign('category', \Model\Category::getAllCategoryCidPrimaryKey());
$this->layout('Fqa_list');
}
/**
* 查看工单详情
*/
......@@ -45,7 +90,7 @@ class Fqa extends \Core\Controller\Controller{
$id = $this->isG('id', '请提交您要查看的问题');
$content = \Model\Content::findContent('fqa', $id, 'fqa_id');
if(empty($content)){
$this->_404();
$this->_404(true);
}
$this->assign($content);
......
......@@ -17,7 +17,7 @@ class Index extends \Core\Controller\Controller {
public function index() {
$openindex = \Model\Content::findContent('option', 'openindex', 'option_name');
if ($openindex['value'] == '0') {
$this->_404();
$this->_404(true);
}
$this->layout();
}
......
......@@ -54,7 +54,7 @@ class Member extends \Core\Controller\Controller {
$this->assign('close', $statisticsResult['close'][0]['total']);
$this->assign('category', \Model\Category::getAllCategoryCidPrimaryKey());
$this->assign('title', '我的工单');
$this->layout();
}
......@@ -122,6 +122,7 @@ class Member extends \Core\Controller\Controller {
* 查看和更新个人信息
*/
public function update(){
$this->assign('title', '更新个人信息');
$this->assign('member', \Model\Content::findContent('member', $this->session()->get('member')['member_id'], 'member_id'));
$this->layout();
}
......
......@@ -21,7 +21,7 @@ class View extends \Core\Controller\Controller{
public function ticket(){
$content = \Model\Ticket::view();
if($content == false){
$this->_404();
$this->_404(true);
}
\Model\Ticket::loginCheck($content['ticket']);
......
......@@ -16,6 +16,15 @@ class Setting extends \Core\Controller\Controller {
public function action(){
//调试获取$_SERVER信息
if($_GET['dev']){
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
echo '<br/>';
exit;
}
$option = [];
foreach(\Model\Content::listContent(['table' => 'option']) as $key => $value){
if(is_array(json_decode($value['value'], true)) || $value['option_name'] == 'crossdomain' ){
......@@ -24,6 +33,12 @@ class Setting extends \Core\Controller\Controller {
$option[$value['option_name']] = $value;
}
}
$license = PES_CORE.'/Core/LICENSE.pes';
if(is_file($license)){
$this->assign('license', 1);
}
$this->assign($option);
$this->assign('title', '系统设置');
$this->layout();
......@@ -96,8 +111,32 @@ class Setting extends \Core\Controller\Controller {
echo '</pre>';
echo '<br/>';
exit;
}
public function authorize(){
$license = PES_CORE.'/Core/LICENSE.pes';
$authorize = \Model\Content::findContent('option', 'authorize', 'option_name');
$result = (new \Expand\cURL())->init('https://www.pescms.com/?g=Api&m=Authorize&a=check', ['key' => $authorize['value']], [
CURLOPT_HTTPHEADER => [
'X-Requested-With: XMLHttpRequest',
'Accept: application/json',
]
]);
$authorizeJson = json_decode($result, true);
if($authorizeJson['status'] == 200 ){
if(strcmp(trim($_SERVER['HTTP_HOST']), trim($authorizeJson['data']['authorize_domain'])) !== 0){
is_file($license) ? unlink($license) : '';
$this->error('授权域名不一致');
}
$fopen = fopen($license, 'w+');
fwrite($fopen, json_encode($authorizeJson['data']));
fclose($fopen);
$this->success('授权验证成功');
}else{
is_file($license) ? unlink($license) : '';
$this->error('获取授权失败');
}
}
}
\ No newline at end of file
......@@ -115,6 +115,9 @@ class Ticket extends \Core\Controller\Controller {
*/
public function handle() {
$content = \Model\Ticket::view();
if($content === false){
$this->error('工单不存在');
}
$userID = $this->session()->get('ticket')['user_id'];
......
......@@ -19,20 +19,60 @@ class Setting extends \Core\Controller\Controller {
*/
public function action() {
$operate = [
//字符串形式的更新设置
'str' => [
'domain',
'siteLogo',
'siteTitle',
'pescmsIntroduce',
'openindex',
'open_register',
'notice_way',
'siteContact',
'authorize'
],
//基于数组的json更新设置
'array' => [
'mail',
'weixin_api',
'weixinWork_api',
'sms',
'login_verify',
'cs_notice_type'
]
];
foreach ($operate as $type => $item){
foreach ($item as $value){
$this->db('option')->where('option_name = :option_name')->update([
'noset' => [
'option_name' => $value
],
'value' => $type == 'array' ? json_encode($this->p($value, false)) : $this->p($value, false)
]);
}
}
$this->specialOperate();
$this->success('保存设置成功!', $this->url('Ticket-Setting-action'));
}
/**
* 特殊格式更新设置
*/
private function specialOperate(){
foreach (['upload_img', 'upload_file'] as $value) {
$data[$value] = json_encode(explode(',', str_replace(["\r\n", "\r", " "], '', $_POST[$value])));
$data[$value] = json_encode(explode(',', str_replace(["\r\n", "\r", "\n", " "], '', $_POST[$value])));
}
$data['domain'] = $this->isP('domain', '请提交网站域名');
$data['openindex'] = $this->p('openindex');
$data['notice_way'] = $this->p('notice_way');
$data['open_register'] = $this->p('open_register');
$data['crossdomain'] = !empty($_POST['crossdomain']) ? json_encode(explode("\n", str_replace("\r", "", $this->p('crossdomain')))) : '';
// $data['crossdomain'] = !empty($_POST['crossdomain']) ? json_encode(explode("\n", str_replace("\r", "", $this->p('crossdomain')))) : '';
if(count($_POST['customstatus']) != '4' && count($_POST['customcolor']) != '4'){
$this->error('请提交工单状态');
}
$customstatus = [];
foreach($_POST['customstatus'] as $key => $value){
$customstatus[$key]['color'] = $_POST['customcolor'][$key];
......@@ -40,12 +80,6 @@ class Setting extends \Core\Controller\Controller {
}
$data['customstatus'] = json_encode($customstatus);
$data['mail'] = json_encode($this->p('mail'));
$data['weixin_api'] = json_encode($this->p('weixin_api'));
$data['weixinWork_api'] = json_encode($this->p('weixinWork_api'));
$data['login_verify'] = json_encode($this->p('login_verify'));
$data['cs_notice_type'] = json_encode($this->p('cs_notice_type'));
$data['sms'] = json_encode($this->p('sms'));
foreach($data as $key => $value){
$this->db('option')->where('option_name = :option_name')->update([
......@@ -53,8 +87,6 @@ class Setting extends \Core\Controller\Controller {
'noset' => ['option_name' => $key]
]);
}
$this->success('保存设置成功!', $this->url('Ticket-Setting-action'));
}
/**
......
......@@ -191,7 +191,12 @@ class Error {
* @return type 返回模板
*/
private static function promptPage() {
return PES_CORE . 'Core/Theme/error.php';
if(is_file(THEME_PATH.'/error.php')){
return THEME_PATH.'/error.php';
}else{
return PES_CORE . 'Core/Theme/error.php';
}
}
/**
......
......@@ -155,7 +155,7 @@ class App {
}
/**
* 获取提示页
* 加载失败 获取提示页
* @return type 返回模板
*/
private function promptPage($title, $errorMsg, $errorFile) {
......@@ -166,9 +166,16 @@ class App {
$errorFile = 'That’s all we know.';
}
if (file_exists(THEME . '/' . GROUP . '/404.php')) {
require THEME . '/' . GROUP . '/404.php';
} else {
$label = new \Expand\Label();
if (!empty(\Core\Func\CoreFunc::$param)) {
extract(\Core\Func\CoreFunc::$param, EXTR_OVERWRITE);
}
//非调试模式加载404页面。
if (is_file(THEME_PATH. '/404.php') && DEBUG == false ) {
require THEME_PATH. '/404.php';
} elseif(is_file(THEME_PATH.'/error.php')){
require THEME_PATH.'/error.php';
}else{
require PES_CORE . 'Core/Theme/error.php';
}
exit;
......
......@@ -208,9 +208,15 @@ class Controller {
/**
* 404专用提示
*/
protected function _404(){
protected function _404($layout = false, $title = '页面被怪兽吃掉了'){
header("HTTP/1.1 404 Page not found");
$this->layout('404');
$this->assign('title', $title);
if($layout == true){
$this->layout('404');
}else{
$this->display('404');
}
exit;
}
......@@ -293,7 +299,9 @@ class Controller {
/* 加载标签库 */
$label = new \Expand\Label();
if (!empty(\Core\Func\CoreFunc::$param)) {
extract(\Core\Func\CoreFunc::$param, EXTR_OVERWRITE);
}
require self::promptPage();
exit;
}
......@@ -311,7 +319,12 @@ class Controller {
* @return type 返回模板
*/
private static function promptPage() {
return PES_CORE . 'Core/Theme/jump.php';
if(is_file(THEME_PATH.'/jump.php')){
return THEME_PATH . '/jump.php';
}else{
return PES_CORE . 'Core/Theme/jump.php';
}
}
/**
......
<select class="input-leng3" name="<?= $field['field_name'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?>>
<select class="input-leng3 am-radius" name="<?= $field['field_name'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?>>
<option value="">请选择分类</option>
<?php foreach($category as $key => $value): ?>
<option value="<?= $value['category_id'] ?>" <?= $field['value'] == $value['category_id'] ? 'selected="selected"' :'' ?> ><?= $value['space'].$value['guide'].$value['category_name'] ?></option>
......
<input class="form-text-input am-text-left datetimepicker" name="<?= $field['field_name'] ?>" placeholder="<?= $field['field_display_name'] ?>" type="text" value="<?= empty($field['value']) ? date('Y-m-d H:i') : date('Y-m-d H:i:s', $field['value']) ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> readonly />
\ No newline at end of file
<input class="form-text-input am-text-left datetimepicker am-radius" name="<?= $field['field_name'] ?>" placeholder="<?= $field['field_display_name'] ?>" type="text" value="<?= empty($field['value']) ? date('Y-m-d H:i') : date('Y-m-d H:i:s', $field['value']) ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> readonly />
\ No newline at end of file
<i class="<?= $field['value'] ?> <?= $field['field_name'] ?>"></i> <a href="http://amazeui.org/css/icon" class="am-inline-block" target="_blank">获取图标</a> <input class="am-inline-block form-text-input input-leng3 am-inline-block icon-input" name="<?= $field['field_name'] ?>" placeholder="<?= $field['field_display_name'] ?>" type="text" value="<?= $field['value'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> style="width: 80%" />
\ No newline at end of file
<i class="<?= $field['value'] ?> <?= $field['field_name'] ?>"></i> <a href="http://amazeui.org/css/icon" class="am-inline-block" target="_blank">获取图标</a> <input class="am-inline-block form-text-input input-leng3 am-inline-block icon-input am-radius" name="<?= $field['field_name'] ?>" placeholder="<?= $field['field_display_name'] ?>" type="text" value="<?= $field['value'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> style="width: 80%" />
\ No newline at end of file
......@@ -3,7 +3,7 @@ $itemValue = explode(',', $field['value']);
$itemDefault = explode(',', $field['field_default']);
?>
<select class="input-leng3" name="<?= $field['field_name'] ?>[]" <?= $field['field_required'] == '1' ? 'required' : '' ?> multiple="multiple" >
<select class="input-leng3 am-radius" name="<?= $field['field_name'] ?>[]" <?= $field['field_required'] == '1' ? 'required' : '' ?> multiple="multiple" >
<?php foreach (json_decode(htmlspecialchars_decode($field['field_option']), true) as $key => $item) : ?>
<option value="<?= $item ?>"
<?= in_array($item, $itemValue) ? 'selected="selected"' : empty($field['value']) && in_array($item, $itemDefault) ? 'selected="selected"' : '' ?>
......
<select class="input-leng3" name="<?= $field['field_name'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> >
<select class="input-leng3 am-radius" name="<?= $field['field_name'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> >
<?php foreach (json_decode(htmlspecialchars_decode($field['field_option']), true) as $key => $value) : ?>
<option value="<?= $value ?>" <?= $field['value'] == $value ? 'selected="selected"' : empty($field['value']) && $field['field_default'] == $value ? 'selected="selected"' : '' ?>><?= $key ?></option>
<?php endforeach; ?>
......
<input class="form-text-input input-leng3" name="<?= $field['field_name'] ?>" placeholder="<?= !empty($field['field_explain']) ? $field['field_explain'] : $field['field_display_name'] ?>" type="text" value="<?= $field['value'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> />
\ No newline at end of file
<input class="form-text-input input-leng3 am-radius" name="<?= $field['field_name'] ?>" placeholder="<?= !empty($field['field_explain']) ? $field['field_explain'] : $field['field_display_name'] ?>" type="text" value="<?= $field['value'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?> />
\ No newline at end of file
<textarea rows="5" name="<?= $field['field_name'] ?>" class="form-textarea" <?= $field['field_required'] == '1' ? 'required' : '' ?> placeholder="<?= !empty($field['field_explain']) ? $field['field_explain'] : $field['field_display_name'] ?>" ><?= $field['value'] ?></textarea>
\ No newline at end of file
<textarea rows="5" name="<?= $field['field_name'] ?>" class="form-textarea am-radius" <?= $field['field_required'] == '1' ? 'required' : '' ?> placeholder="<?= !empty($field['field_explain']) ? $field['field_explain'] : $field['field_display_name'] ?>" ><?= $field['value'] ?></textarea>
\ No newline at end of file
<select class="input-leng3" name="<?= $field['field_name'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?>>
<select class="input-leng3 am-radius" name="<?= $field['field_name'] ?>" <?= $field['field_required'] == '1' ? 'required' : '' ?>>
<option value="">请选择工单</option>
<?php foreach($ticketModel as $key => $value): ?>
<option value="<?= $value['ticket_model_id'] ?>" <?= $field['value'] == $value['ticket_model_id'] ? 'selected="selected"' :'' ?> ><?= "{$value['category_name']} - {$value['ticket_model_name']}" ?></option>
......
......@@ -240,4 +240,13 @@ class Label {
return $this->xss->xss_clean($str);
}
/**
* 验证权限 | 模板使用,控制某些内容展示
* @param $auth
* @return bool|\Model\type
*/
public function checkAuth($auth){
return \Model\Auth::check($auth);
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment