勾股cms4.0发布,新增一键crud功能,新增图集模块,新增部门模块、新增职位模块,其他模块代码重构等

This commit is contained in:
hdm 2022-08-25 17:13:28 +08:00
parent 68e662996e
commit 5ed76a4697
118 changed files with 8643 additions and 2199 deletions

View File

@ -162,6 +162,52 @@ function get_admin_group_info($id)
return $rules;
}
//读取部门列表
function get_department()
{
$department = Db::name('Department')->where(['status' => 1])->select()->toArray();
return $department;
}
//获取某部门的子部门id.$is_self时候包含自己
function get_department_son($did = 0, $is_self = 1)
{
$department = get_department();
$department_list = get_data_node($department, $did);
$department_array = array_column($department_list, 'id');
if ($is_self == 1) {
//包括自己在内
$department_array[] = $did;
}
return $department_array;
}
//读取员工所在部门的负责人
function get_department_leader($uid=0,$pid=0)
{
$did = get_admin($uid)['did'];
if($pid==0){
$leader = Db::name('Department')->where(['id' => $did])->value('leader_id');
}
else{
$pdid = Db::name('Department')->where(['id' => $did])->value('pid');
if($pdid == 0){
$leader = 0;
}
else{
$leader = Db::name('Department')->where(['id' => $pdid])->value('leader_id');
}
}
return $leader;
}
//读取职位
function get_position()
{
$position = Db::name('Position')->where(['status' => 1])->select()->toArray();
return $position;
}
//读取导航列表,用于后台
function get_nav($nav_id)
{
@ -183,6 +229,13 @@ function get_article_cate()
return $cate;
}
//读取图集分类列表
function get_gallery_cate()
{
$cate = Db::name('GalleryCate')->order('create_time asc')->select()->toArray();
return $cate;
}
//读取商品分类列表
function get_goods_cate()
{
@ -247,7 +300,7 @@ function add_log($type, $param_id = '', $param = [])
$data['param_id'] = $param_id;
$data['param'] = json_encode($param);
$data['module'] = strtolower(app('http')->getName());
$data['controller'] = strtolower(app('request')->controller());
$data['controller'] = uncamelize(app('request')->controller());
$data['function'] = strtolower(app('request')->action());
$parameter = $data['module'] . '/' . $data['controller'] . '/' . $data['function'];
$rule_menu = Db::name('AdminRule')->where(array('src' => $parameter))->find();

View File

@ -137,10 +137,14 @@ class Admin extends BaseController
}
else{
$id = empty(get_params('id')) ? 0 : get_params('id');
$department = set_recursion(get_department());
$position = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select();
if ($id > 0) {
$admin = get_admin(get_params('id'));
View::assign('admin', $admin);
}
View::assign('department', $department);
View::assign('position', $position);
View::assign('id', $id);
return view();
}
@ -217,7 +221,10 @@ class Admin extends BaseController
$rules = array_unique($rules);
$role_rule = create_tree_list(0, $rule, $rules);
$department = get_department();
$position = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select();
View::assign('department', $department);
View::assign('position', $position);
View::assign('role_rule', $role_rule);
View::assign('admin', get_admin($id));
add_log('view', get_params('id'));

View File

@ -231,13 +231,20 @@ class Api extends BaseController
public function email_test()
{
$sender = get_params('email');
//检查是否邮箱格式
if (!is_email($sender)) {
return to_assign(1, '测试邮箱码格式有误');
}
$email_config = \think\facade\Db::name('config')
->where('name', 'email')
->find();
//检查是否邮箱格式
$validate = \think\facade\Validate::rule([
'email' => 'email'
]);
$data = [
'email' => $sender
];
if (!$validate->check($data)) {
return to_assign(1, $validate->getError());
}
$email_config = \think\facade\Db::name('config')->where('name', 'email')->find();
$config = unserialize($email_config['content']);
$content = $config['template'];
//所有项目必须填写
@ -286,8 +293,8 @@ class Api extends BaseController
$list = Db::name('Article')
->field('a.id,a.title,a.read,a.status,a.create_time,c.title as cate_title')
->alias('a')
->join('article_cate c', 'a.article_cate_id = c.id')
->where(['a.status' => 1])
->join('article_cate c', 'a.cate_id = c.id')
->where(['a.delete_time' => 0])
->order('a.id desc')
->limit(10)
->select()->toArray();

View File

@ -10,144 +10,54 @@ declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\Article as ArticleList;
use app\admin\model\ArticleCate;
use app\admin\model\Keywords;
use app\admin\validate\ArticleCateCheck;
use app\admin\validate\ArticleCheck;
use app\admin\model\Article as ArticleModel;
use app\admin\validate\ArticleValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Article extends BaseController
{
public function cate()
/**
* 构造函数
*/
public function __construct()
{
$this->model = new ArticleModel();
$this->uid = get_login_admin('id');
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$cate = Db::name('ArticleCate')->order('create_time asc')->select();
return to_assign(0, '', $cate);
$param = get_params();
$where = [];
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.title|a.keywords|a.desc|a.content|c.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['cate_id'])) {
$where[] = ['a.cate_id', '=', $param['cate_id']];
}
$where[] = ['a.delete_time', '=', 0];
$ArticleModel = new ArticleModel();
$list = $ArticleModel->getArticleList($where, $param);
return table_assign(0, '', $list);
}
else{
return view();
}
}
//获取子分类id.$is_self=1包含自己
public function get_cate_son($id = 0, $is_self = 1)
{
$cates = Db::name('ArticleCate')->order('create_time asc')->select()->toArray();
$cates_list = get_data_node($cates, $id);
$cates_array = array_column($cates_list, 'id');
if ($is_self == 1) {
//包括自己在内
$cates_array[] = $id;
}
return $cates_array;
}
//文章分类添加
public function cate_add()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(ArticleCateCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
$department_array = $this->get_cate_son($param['id']);
if (in_array($param['pid'], $department_array)) {
return to_assign(1, '上级分类不能是该分类本身或其子分类');
} else {
$res = ArticleCate::strict(false)->field(true)->update($param);
if ($res) {
add_log('edit', $param['id'], $param);
}
return to_assign();
}
} else {
try {
validate(ArticleCateCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
$insertId = ArticleCate::strict(false)->field(true)->insertGetId($param);
if ($insertId) {
add_log('add', $insertId, $param);
}
return to_assign();
}
}
else{
$id = isset($param['id']) ? $param['id'] : 0;
$pid = isset($param['pid']) ? $param['pid'] : 0;
if ($id > 0) {
$cate = Db::name('ArticleCate')->where(['id' => $id])->find();
$pid = $cate['pid'];
View::assign('cate', $cate);
}
View::assign('id', $id);
View::assign('pid', $pid);
return view();
}
}
//删除文章分类
public function cate_delete()
{
$id = get_params("id");
$cate_count = Db::name('ArticleCate')->where(["pid" => $id])->count();
if ($cate_count > 0) {
return to_assign(1, "该分类下还有子分类,无法删除");
}
$content_count = Db::name('Article')->where(["article_cate_id" => $id])->count();
if ($content_count > 0) {
return to_assign(1, "该分类下还有文章,无法删除");
}
if (Db::name('ArticleCate')->delete($id) !== false) {
add_log('delete', $id);
return to_assign(0, "删除分类成功");
} else {
return to_assign(1, "删除失败");
}
}
public function index()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.title|a.keywords|a.desc|a.content|w.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['article_cate_id'])) {
$where[] = ['a.article_cate_id', '=', $param['article_cate_id']];
}
$where[] = ['a.status', '>=', 0];
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$content = ArticleList::where($where)
->field('a.*,w.id as cate_id,a.id as id,w.title as cate_title,a.title as title')
->alias('a')
->join('article_cate w', 'a.article_cate_id = w.id')
->order('a.create_time desc')
->paginate($rows, false, ['query' => $param]);
return table_assign(0, '', $content);
}
else{
return view();
}
}
//文章添加&&编辑
/**
* 添加
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (request()->isAjax()) {
$param = get_params();
if (isset($param['table-align'])) {
unset($param['table-align']);
}
@ -160,100 +70,121 @@ class Article extends BaseController
unset($param['docContent-html-code']);
unset($param['docContent-markdown-doc']);
}
$DbRes=false;
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(ArticleCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
Db::startTrans();
try {
ArticleList::strict(false)->field(true)->update($param);
$aid = $param['id'];
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
Db::name('ArticleKeywords')->where(['aid'=>$aid])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = (new ArticleList())->insertKeyword($keywordArray,$aid);
}
add_log('edit', $aid, $param);
Db::commit();
$DbRes=true;
}
catch (\Exception $e) {
//回滚事务
$DbRes = false;
Db::rollback();
return to_assign(1,'捕获到异常'.$e->getMessage());
}
} else {
try {
validate(ArticleCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
Db::startTrans();
try {
if(empty($param['desc'])){
$param['desc'] = getDescriptionFromContent($param['content'], 100);
}
$aid = ArticleList::strict(false)->field(true)->insertGetId($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = (new ArticleList())->insertKeyword($keywordArray,$aid);
}
add_log('add', $aid, $param);
Db::commit();
$DbRes=true;
}
catch (\Exception $e) {
//回滚事务
$DbRes = false;
Db::rollback();
return to_assign(1,'捕获到异常'.$e->getMessage());
}
$param['admin_id'] = $this->uid;
// 检验完整性
try {
validate(ArticleValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
if($DbRes){
return to_assign();
}
else{
return to_assign(1,'操作失败');
}
}
else{
$id = isset($param['id']) ? $param['id'] : 0;
View::assign('id', $id);
$ArticleModel = new ArticleModel();
$ArticleModel->addArticle($param);
}else{
View::assign('editor', get_system_config('other','editor'));
if ($id > 0) {
$article = (new ArticleList())->detail($id);
if(empty($article['md_content'])){
View::assign('editor',1);
}
View::assign('article', $article);
return view('edit');
}
return view();
}
}
//删除文章
public function delete()
/**
* 编辑
*/
public function edit()
{
$id = get_params("id");
$data['status'] = '-1';
$data['id'] = $id;
$data['update_time'] = time();
if (Db::name('Article')->update($data) !== false) {
add_log('delete', $id);
return to_assign(0, "删除成功");
} else {
return to_assign(1, "删除失败");
}
$param = get_params();
$ArticleModel = new ArticleModel();
if (request()->isAjax()) {
if (isset($param['table-align'])) {
unset($param['table-align']);
}
if (isset($param['content'])) {
$param['md_content'] = '';
}
if (isset($param['docContent-html-code'])) {
$param['content'] = $param['docContent-html-code'];
$param['md_content'] = $param['docContent-markdown-doc'];
unset($param['docContent-html-code']);
unset($param['docContent-markdown-doc']);
}
// 检验完整性
try {
validate(ArticleValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$ArticleModel->editArticle($param);
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $ArticleModel->getArticleById($id);
View::assign('editor', get_system_config('other','editor'));
if (!empty($detail)) {
if(!empty($article['md_content'])){
View::assign('editor',1);
}
$keyword_array = Db::name('ArticleKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keyword_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keyword_array, 'title'));
$detail['keyword_array'] = $keyword_array;
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
}
/**
* 查看信息
*/
public function read()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$ArticleModel = new ArticleModel();
$detail = $ArticleModel->getArticleById($id);
if (!empty($detail)) {
$keyword_array = Db::name('ArticleKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keyword_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keyword_array, 'title'));
$detail['keyword_array'] = $keyword_array;
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$ArticleModel = new ArticleModel();
$ArticleModel->delArticleById($id,$type);
}
}

View File

@ -0,0 +1,149 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\ArticleCate as ArticleCateModel;
use app\admin\validate\ArticleCateValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class ArticleCate extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
$this->model = new ArticleCateModel();
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
return to_assign(0, '', $list);
}
else{
return view();
}
}
//获取子分类id.$is_self=1包含自己
public function get_cate_son($id = 0, $is_self = 1)
{
$cates = $this->model->where('delete_time',0)->order('sort asc')->select()->toArray();
$cates_list = get_data_node($cates, $id);
$cates_array = array_column($cates_list, 'id');
if ($is_self == 1) {
//包括自己在内
$cates_array[] = $id;
}
return $cates_array;
}
/**
* 添加
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
// 检验完整性
try {
validate(ArticleCateValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->addArticleCate($param);
}else{
$pid = isset($param['pid']) ? $param['pid'] : 0;
View::assign('pid', $pid);
return view();
}
}
/**
* 编辑
*/
public function edit()
{
$param = get_params();
if (request()->isAjax()) {
// 检验完整性
try {
validate(ArticleCateValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$cate_array = $this->get_cate_son($param['id']);
if (in_array($param['pid'], $cate_array)) {
return to_assign(1, '上级分类不能是该分类本身或其子分类');
}
$this->model->editArticleCate($param);
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getArticleCateById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
}
/**
* 查看信息
*/
public function read()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getArticleCateById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$count_cate = Db::name('ArticleCate')->where(["pid"=>$id,"delete_time"=>0])->count();
if ($count_cate > 0) {
return to_assign(1, "该分类下还有子分类,无法删除");
}
$count_article = Db::name('Article')->where(["cate_id" => $id,"delete_time"=>0])->count();
if ($count_article > 0) {
return to_assign(1, "该分类下还有文章,无法删除");
}
$this->model->delArticleCateById($id,$type);
}
}

View File

@ -0,0 +1,250 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use think\facade\Console;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Crud extends BaseController
{
public function index()
{
$prefix = config('database.connections.mysql.prefix');
//查询所有表信息
$table_info = Db::query('SHOW TABLE STATUS');
foreach ($table_info as $k=>&$val) {
$val['a'] = strpos($val['Comment'],'::crud');
if(strpos($val['Comment'],'::crud') == false){
unset($table_info[$k]);
continue;
}
$val['title'] = str_replace($prefix,'',$val['Name']);
$val['crud'] = $this->check($val['title']);
$val['Comment'] = str_replace('::crud','',$val['Comment']);
}
View::assign('prefix',$prefix);
View::assign('table_info',$table_info);
return view();
}
public function check($table,$type='c',$path='admin')
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
if($type == 'c'){
$table = ucfirst(camelize($table));
$filePath = 'app'. DS . $path . DS . 'controller' . DS . $table . '.php';
$realPath = base_path() . $path . DS . 'controller' . DS . $table . '.php';
}
if($type == 'm'){
$table = ucfirst(camelize($table));
$filePath = 'app'. DS . $path . DS . 'model' . DS . $table . '.php';
$realPath = base_path() . $path . DS . 'model' . DS . $table . '.php';
}
if($type == 'v'){
$table = ucfirst(camelize($table)) . 'Validate';
$filePath = 'app'. DS . $path . DS . 'validate' . DS . $table . '.php';
$realPath = base_path() . $path . DS . 'validate' . DS . $table . '.php';
}
if($type == 'l'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'datalist.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'datalist.html';
}
if($type == 'a'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'add.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'add.html';
}
if($type == 'e'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'edit.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'edit.html';
}
if($type == 'r'){
$filePath = 'app'. DS . $path . DS . 'view' . DS . $table . DS . 'read.html';
$realPath = base_path() . $path . DS . 'view' . DS . $table . DS . 'read.html';
}
if (file_exists($realPath)) {
return $filePath;
}
else{
return 0;
}
}
//crud
public function table()
{
$param = get_params();
$prefix = config('database.connections.mysql.prefix');
//查询指定表信息
$table_info = Db::query('SHOW TABLE STATUS LIKE ' . "'" . $param['name'] . "'");
$detail = $table_info[0];
$detail['title'] = str_replace($prefix,'',$detail['Name']);
$detail['Comment'] = str_replace('::crud','',$detail['Comment']);
$table_columns = Db::query("SHOW FULL COLUMNS FROM " . $param['name']);
//var_dump($table_info);exit;
//var_dump($table_columns);exit;
$detail['c'] = $this->check($detail['title'], $type='c');
$detail['m'] = $this->check($detail['title'], $type='m');
$detail['v'] = $this->check($detail['title'], $type='v');
$detail['l'] = $this->check($detail['title'], $type='l');
$detail['a'] = $this->check($detail['title'], $type='a');
$detail['e'] = $this->check($detail['title'], $type='e');
$detail['r'] = $this->check($detail['title'], $type='r');
View::assign('detail', $detail);
View::assign('columns', $table_columns);
return view();
}
//一键crud
public function crud()
{
$uid = get_login_admin('id');
if($uid!=1){
return to_assign(1,'只有系统超级管理员才有权限使用一键crud功能');
}
$param = get_params();
set_cache('crud_v_'.$param['field'], $param['crud_v']);
set_cache('crud_a_'.$param['field'], $param['crud_a']);
set_cache('crud_e_'.$param['field'], $param['crud_e']);
set_cache('crud_r_'.$param['field'], $param['crud_r']);
set_cache('crud_l_'.$param['field'], $param['crud_l']);
$t = '-t'.$param['field'];
$c = '-c'.$param['field'];
$m = '-m'.$param['name'];
try {
$output = Console::call('crud', [$t,$c,$m]);
//return $output->fetch();
} catch(\Exception $e) {
clear_cache('crud_v_'.$param['field']);
clear_cache('crud_a_'.$param['field']);
clear_cache('crud_e_'.$param['field']);
clear_cache('crud_r_'.$param['field']);
clear_cache('crud_l_'.$param['field']);
return to_assign(1, $e->getMessage());
}
}
//一键生成菜单
public function menu($field='',$name='')
{
$uid = get_login_admin('id');
if($uid!=1){
return to_assign(1,'只有系统超级管理员才有权限使用一键生成菜单功能!');
}
if(empty($field) || empty($name)){
return to_assign(1,'参数错误!');
}
$rule = [
[
'title' => $name.'管理',
'name' => $name,
'src' => '',
'module' => '',
'crud' => $field,
'menu' => '1',
'icon' => 'bi-folder',
'son' => [
[
'title' => $name.'列表',
'name' => $name.'列表',
'src' => 'admin/'.$field.'/datalist',
'module' => '',
'crud' => $field,
'menu' => '1',
'icon' => '',
'son' => [
[
'title' => '新建',
'name' => $name,
'src' => 'admin/'.$field.'/add',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
],
[
'title' => '编辑',
'name' => $name,
'src' => 'admin/'.$field.'/edit',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
],
[
'title' => '查看',
'name' => $name,
'src' => 'admin/'.$field.'/read',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
],
[
'title' => '删除',
'name' => $name,
'src' => 'admin/'.$field.'/del',
'module' => '',
'crud' => $field,
'menu' => '2',
'icon' => '',
'son' => []
]
]
]
]
]
];
//如果安装过该模块,删除原来的菜单信息
Db::name('AdminRule')->where('crud',$field)->delete();
$sort = Db::name('AdminRule')->where('pid',0)->max('sort');
$this->add_rule($rule,0,$sort+1);
//更新超级管理员的权限节点
$rules = Db::name('AdminRule')->column('id');
$admin_rules = implode(',',$rules);
$res = Db::name('AdminGroup')->strict(false)->where('id',1)->update(['rules'=>$admin_rules,'update_time'=>time()]);
if($res!==false){
// 删除后台节点缓存
clear_cache('adminRules');
return to_assign();
}
else{
return to_assign(1,'操作失败');
}
}
//递归插入菜单数据
protected function add_rule($data, $pid=0,$sort=0)
{
foreach($data as $k => $v)
{
$rule=[
'title' => $v['title'],
'name' => $v['name'],
'src' => $v['src'],
'module' => $v['module'],
'menu' => $v['menu'],
'icon' => $v['icon'],
'crud' => $v['crud'],
'pid' => $pid,
'sort' => $sort,
'create_time' => time()
];
$new_id = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($rule);
if(!empty($v['son'] && $new_id)){
$this->add_rule($v['son'],$new_id);
}
}
}
}

View File

@ -0,0 +1,103 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-3.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\validate\DepartmentCheck;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Department extends BaseController
{
public function index()
{
if (request()->isAjax()) {
$list = Db::name('Department')
->field('d.*,a.nickname as leader')
->alias('d')
->join('Admin a', 'a.id = d.leader_id', 'LEFT')
->order('d.id asc')
->select();
return to_assign(0, '', $list);
} else {
return view();
}
}
//添加部门
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if ($param['id'] > 0) {
try {
validate(DepartmentCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
$department_array = get_department_son($param['id']);
if (in_array($param['pid'], $department_array)) {
return to_assign(1, '上级部门不能是该部门本身或其下属部门');
} else {
Db::name('Department')->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
return to_assign();
}
} else {
try {
validate(DepartmentCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$did = Db::name('Department')->strict(false)->field(true)->insertGetId($param);
add_log('add', $did, $param);
return to_assign();
}
} else {
$id = isset($param['id']) ? $param['id'] : 0;
$pid = isset($param['pid']) ? $param['pid'] : 0;
$department = set_recursion(get_department());
if ($id > 0) {
$detail = Db::name('Department')->where(['id' => $id])->find();
$users = Db::name('Admin')->where(['did' => $id, 'status' => 1])->select();
View::assign('users', $users);
View::assign('detail', $detail);
}
View::assign('department', $department);
View::assign('pid', $pid);
View::assign('id', $id);
return view();
}
}
//删除
public function delete()
{
$id = get_params("id");
$count = Db::name('Department')->where([['pid', '=', $id], ['status', '>=', 0]])->count();
if ($count > 0) {
return to_assign(1, "该部门下还有子部门,无法删除");
}
$users = Db::name('Admin')->where([['did', '=', $id], ['status', '>=', 0]])->count();
if ($users > 0) {
return to_assign(1, "该部门下还有员工,无法删除");
}
if (Db::name('Department')->delete($id) !== false) {
add_log('delete', $id);
return to_assign(0, "删除部门成功");
} else {
return to_assign(1, "删除失败");
}
}
}

View File

@ -0,0 +1,171 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\Gallery as GalleryModel;
use app\admin\validate\GalleryValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Gallery extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
$this->model = new GalleryModel();
$this->uid = get_login_admin('id');
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$param = get_params();
$where = [];
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.title|a.keywords|a.desc|c.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['cate_id'])) {
$where[] = ['a.cate_id', '=', $param['cate_id']];
}
$where[] = ['a.delete_time', '=', 0];
$list = $this->model->getGalleryList($where, $param);
return table_assign(0, '', $list);
}
else{
return view();
}
}
/**
* 添加
*/
public function add()
{
if (request()->isAjax()) {
$param = get_params();
// 检验完整性
try {
validate(GalleryValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['admin_id'] = $tis->uid;
$this->model->addGallery($param);
}else{
return view();
}
}
/**
* 编辑
*/
public function edit()
{
$param = get_params();
if (request()->isAjax()) {
// 检验完整性
try {
validate(GalleryValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->editGallery($param);
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGalleryById($id);
if (!empty($detail)) {
//关键字
$keywrod_array = Db::name('GalleryKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keywrod_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keywrod_array, 'title'));
$detail['keyword_array'] = $keywrod_array;
//图集
$gallery_array = Db::name('GalleryFile')
->order('create_time asc')
->where(array('aid' => $id))
->select()->toArray();
$detail['gallery_array'] = $gallery_array;
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
}
/**
* 查看信息
*/
public function read()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGalleryById($id);
if (!empty($detail)) {
//关键字
$keywrod_array = Db::name('GalleryKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keywrod_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keywrod_array, 'title'));
$detail['keyword_array'] = $keywrod_array;
//图集
$gallery_array = Db::name('GalleryFile')
->order('create_time asc')
->where(array('aid' => $id))
->select()->toArray();
$detail['gallery_array'] = $gallery_array;
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$this->model->delGalleryById($id,$type);
}
}

View File

@ -0,0 +1,150 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\GalleryCate as GalleryCateModel;
use app\admin\validate\GalleryCateValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class GalleryCate extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
$this->model = new GalleryCateModel();
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
return to_assign(0, '', $list);
}
else{
return view();
}
}
//获取子分类id.$is_self=1包含自己
public function get_cate_son($id = 0, $is_self = 1)
{
$cates = $this->model->where('delete_time',0)->order('sort asc')->select()->toArray();
$cates_list = get_data_node($cates, $id);
$cates_array = array_column($cates_list, 'id');
if ($is_self == 1) {
//包括自己在内
$cates_array[] = $id;
}
return $cates_array;
}
/**
* 添加
*/
public function add()
{
if (request()->isAjax()) {
$param = get_params();
// 检验完整性
try {
validate(GalleryCateValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->addGalleryCate($param);
}else{
$pid = isset($param['pid']) ? $param['pid'] : 0;
View::assign('pid', $pid);
return view();
}
}
/**
* 编辑
*/
public function edit()
{
$param = get_params();
if (request()->isAjax()) {
// 检验完整性
try {
validate(GalleryCateValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$cate_array = $this->get_cate_son($param['id']);
if (in_array($param['pid'], $cate_array)) {
return to_assign(1, '上级分类不能是该分类本身或其子分类');
}
$this->model->editGalleryCate($param);
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGalleryCateById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
}
/**
* 查看信息
*/
public function read()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGalleryCateById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$count_cate = Db::name('GalleryCate')->where(["pid"=>$id,"delete_time"=>0])->count();
if ($count_cate > 0) {
return to_assign(1, "该分类下还有子分类,无法删除");
}
$count_gallery = Db::name('Gallery')->where(["cate_id" => $id,"delete_time"=>0])->count();
if ($count_gallery > 0) {
return to_assign(1, "该分类下还有图集,无法删除");
}
$this->model->delGalleryCateById($id,$type);
}
}

View File

@ -10,250 +10,214 @@ declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\Goods as GoodsList;
use app\admin\model\GoodsCate;
use app\admin\model\Keywords;
use app\admin\validate\GoodsCateCheck;
use app\admin\validate\GoodsCheck;
use app\admin\model\Goods as GoodsModel;
use app\admin\validate\GoodsValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Goods extends BaseController
{
public function cate()
/**
* 构造函数
*/
public function __construct()
{
$this->model = new GoodsModel();
$this->uid = get_login_admin('id');
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$cate = Db::name('GoodsCate')->order('create_time asc')->select();
return to_assign(0, '', $cate);
}
else{
return view();
}
}
//获取子分类id.$is_self=1包含自己
public function get_cate_son($id = 0, $is_self = 1)
{
$cates = Db::name('GoodsCate')->order('create_time asc')->select()->toArray();
$cates_list = get_data_node($cates, $id);
$cates_array = array_column($cates_list, 'id');
if ($is_self == 1) {
//包括自己在内
$cates_array[] = $id;
}
return $cates_array;
}
//商品分类添加
public function cate_add()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(GoodsCateCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
$department_array = $this->get_cate_son($param['id']);
if (in_array($param['pid'], $department_array)) {
return to_assign(1, '上级分类不能是该分类本身或其子分类');
} else {
$res = GoodsCate::strict(false)->field(true)->update($param);
if ($res) {
add_log('edit', $param['id'], $param);
}
return to_assign();
}
} else {
try {
validate(GoodsCateCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
$insertId = GoodsCate::strict(false)->field(true)->insertGetId($param);
if ($insertId) {
add_log('add', $insertId, $param);
}
return to_assign();
}
}
else{
$id = isset($param['id']) ? $param['id'] : 0;
$pid = isset($param['pid']) ? $param['pid'] : 0;
if ($id > 0) {
$cate = Db::name('GoodsCate')->where(['id' => $id])->find();
$pid = $cate['pid'];
View::assign('cate', $cate);
}
View::assign('id', $id);
View::assign('pid', $pid);
return view();
}
}
//删除商品分类
public function cate_delete()
{
$id = get_params("id");
$cate_count = Db::name('GoodsCate')->where(["pid" => $id])->count();
if ($cate_count > 0) {
return to_assign(1, "该分类下还有子分类,无法删除");
}
$content_count = Db::name('Goods')->where(["cate_id" => $id])->count();
if ($content_count > 0) {
return to_assign(1, "该分类下还有商品,无法删除");
}
if (Db::name('GoodsCate')->delete($id) !== false) {
add_log('delete', $id);
return to_assign(0, "删除分类成功");
} else {
return to_assign(1, "删除失败");
}
}
public function index()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.title|a.keywords|a.desc|a.content|w.title', 'like', '%' . $param['keywords'] . '%'];
$param = get_params();
$where = [];
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.title|a.keywords|a.desc|a.content|c.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['cate_id'])) {
$where[] = ['a.cate_id', '=', $param['cate_id']];
}
$where[] = ['a.status', '>=', 0];
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$content = GoodsList::where($where)
->field('a.*,a.id as id,w.title as cate_title,a.title as title')
->alias('a')
->join('GoodsCate w', 'a.cate_id = w.id')
->order('a.create_time desc')
->paginate($rows, false, ['query' => $param]);
return table_assign(0, '', $content);
$where[] = ['a.delete_time', '=', 0];
$param['order'] = 'a.sort asc';
$list = $this->model->getGoodsList($where, $param);
return table_assign(0, '', $list);
}
else{
return view();
}
}
}
//商品添加&&编辑
/**
* 添加
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (isset($param['table-align'])) {
unset($param['table-align']);
}
if (isset($param['content'])) {
$param['md_content'] = '';
}
if (isset($param['docContent-html-code'])) {
$param['content'] = $param['docContent-html-code'];
$param['md_content'] = $param['docContent-markdown-doc'];
unset($param['docContent-html-code']);
unset($param['docContent-markdown-doc']);
}
$DbRes=false;
if (request()->isAjax()) {
$param = get_params();
// 检验完整性
try {
validate(GoodsValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
if (isset($param['tag_values']) && $param['tag_values']) {
$param['tag_values'] = implode(',',$param['tag_values']);
}
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(GoodsCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
Db::startTrans();
try {
GoodsList::strict(false)->field(true)->update($param);
$aid = $param['id'];
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
Db::name('GoodsKeywords')->where(['aid'=>$aid])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = (new GoodsList())->insertKeyword($keywordArray,$aid);
}
add_log('edit', $aid, $param);
Db::commit();
$DbRes=true;
}
catch (\Exception $e) {
//回滚事务
$DbRes = false;
Db::rollback();
return to_assign(1,'捕获到异常'.$e->getMessage());
}
} else {
try {
validate(GoodsCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
if(empty($param['desc'])){
$param['desc'] = getDescriptionFromContent($param['content'], 100);
}
Db::startTrans();
try {
$aid = GoodsList::strict(false)->field(true)->insertGetId($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = (new GoodsList())->insertKeyword($keywordArray,$aid);
}
add_log('edit', $aid, $param);
Db::commit();
$DbRes=true;
}
catch (\Exception $e) {
//回滚事务
$DbRes = false;
Db::rollback();
return to_assign(1,'捕获到异常'.$e->getMessage());
}
}
if($DbRes){
return to_assign();
}
else{
return to_assign(1,'操作失败');
}
}
else{
$id = isset($param['id']) ? $param['id'] : 0;
View::assign('id', $id);
View::assign('editor', get_system_config('other','editor'));
if ($id > 0) {
$goods = (new GoodsList())->detail($id);
View::assign('goods', $goods);
return view('edit');
if(empty($param['desc'])){
$param['desc'] = getDescriptionFromContent($param['content'], 100);
}
$param['admin_id'] = $this->uid;
$this->model->addGoods($param);
}else{
return view();
}
}
//删除商品
public function delete()
/**
* 编辑
*/
public function edit()
{
$id = get_params("id");
$data['status'] = '-1';
$data['id'] = $id;
$data['update_time'] = time();
if (Db::name('Goods')->update($data) !== false) {
add_log('delete', $id);
return to_assign(0, "删除成功");
} else {
return to_assign(1, "删除失败");
}
$param = get_params();
if (request()->isAjax()) {
// 检验完整性
try {
validate(GoodsValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
if (isset($param['tag_values']) && $param['tag_values']) {
$param['tag_values'] = implode(',',$param['tag_values']);
}
$this->model->editGoods($param);
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGoodsById($id);
if (!empty($detail)) {
//轮播图
if(!empty($detail['banner'])) {
$detail['banner_array'] = explode(',',$detail['banner']);
}
//关键字
$keywrod_array = Db::name('GoodsKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keywrod_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keywrod_array, 'title'));
//标签设置
$detail['tag1'] = $detail['tag2'] = $detail['tag3'] = $detail['tag4'] = $detail['tag5'] = $detail['tag6'] =0;
if(!empty($detail['tag_values'])) {
$tag_values_array = explode(',', $detail['tag_values']);
if(in_array('1', $tag_values_array)){
$detail['tag1'] = 1;
}
if(in_array('2', $tag_values_array)){
$detail['tag2'] = 1;
}
if(in_array('3', $tag_values_array)){
$detail['tag3'] = 1;
}
if(in_array('4', $tag_values_array)){
$detail['tag4'] = 1;
}
if(in_array('5', $tag_values_array)){
$detail['tag5'] = 1;
}
if(in_array('6', $tag_values_array)){
$detail['tag6'] = 1;
}
}
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
}
/**
* 查看信息
*/
public function read()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGoodsById($id);
if (!empty($detail)) {
//分类名
$detail['cate_name'] = Db::name('GoodsCate')->where('id',$detail['cate_id'])->value('title');
//轮播图
if(!empty($detail['banner'])) {
$detail['banner_array'] = explode(',',$detail['banner']);
}
//关键字
$keywrod_array = Db::name('GoodsKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keywrod_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keywrod_array, 'title'));
//标签设置
$detail['tag1'] = $detail['tag2'] = $detail['tag3'] = $detail['tag4'] = $detail['tag5'] = $detail['tag6'] =0;
if(!empty($detail['tag_values'])) {
$tag_values_array = explode(',', $detail['tag_values']);
if(in_array('1', $tag_values_array)){
$detail['tag1'] = 1;
}
if(in_array('2', $tag_values_array)){
$detail['tag2'] = 1;
}
if(in_array('3', $tag_values_array)){
$detail['tag3'] = 1;
}
if(in_array('4', $tag_values_array)){
$detail['tag4'] = 1;
}
if(in_array('5', $tag_values_array)){
$detail['tag5'] = 1;
}
if(in_array('6', $tag_values_array)){
$detail['tag6'] = 1;
}
}
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$this->model->delGoodsById($id,$type);
}
}

View File

@ -0,0 +1,143 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\GoodsCate as GoodsCateModel;
use app\admin\validate\GoodsCateValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class GoodsCate extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
$this->model = new GoodsCateModel();
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
return to_assign(0, '', $list);
}
else{
return view();
}
}
//获取子分类id.$is_self=1包含自己
public function get_cate_son($id = 0, $is_self = 1)
{
$cates = $this->model->where('delete_time',0)->order('sort asc')->select()->toArray();
$cates_list = get_data_node($cates, $id);
$cates_array = array_column($cates_list, 'id');
if ($is_self == 1) {
//包括自己在内
$cates_array[] = $id;
}
return $cates_array;
}
/**
* 添加
*/
public function add()
{
if (request()->isAjax()) {
$param = get_params();
// 检验完整性
try {
validate(GoodsCateValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->addGoodsCate($param);
}else{
$pid = isset($param['pid']) ? $param['pid'] : 0;
View::assign('pid', $pid);
return view();
}
}
/**
* 编辑
*/
public function edit()
{
$param = get_params();
if (request()->isAjax()) {
// 检验完整性
try {
validate(GoodsCateValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$cate_array = $this->get_cate_son($param['id']);
if (in_array($param['pid'], $cate_array)) {
return to_assign(1, '上级分类不能是该分类本身或其子分类');
}
$this->model->editGoodsCate($param);
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGoodsCateById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
}
/**
* 查看信息
*/
public function read()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getGoodsCateById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$this->model->delGoodsCateById($id,$type);
}
}

View File

@ -10,162 +10,160 @@ declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\Pages as PagesList;
use app\admin\model\Keywords;
use app\admin\validate\PagesCheck;
use app\admin\model\Pages as PagesModel;
use app\admin\validate\PagesValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Pages extends BaseController
{
public function index()
/**
* 构造函数
*/
public function __construct()
{
$this->model = new PagesModel();
$this->uid = get_login_admin('id');
}
/**
* 数据列表
*/
public function datalist()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['id|title|keywords|desc|content', 'like', '%' . $param['keywords'] . '%'];
$param = get_params();
$where = [];
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.title|a.desc|a.content', 'like', '%' . $param['keywords'] . '%'];
}
$where[] = ['status', '>=', 0];
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$content = PagesList::where($where)
->field('id,title,status,name,read,template,create_time')
->order('create_time desc')
->paginate($rows, false, ['query' => $param]);
return table_assign(0, '', $content);
$where[] = ['a.delete_time', '=', 0];
$list = $this->model->getPagesList($where, $param);
return table_assign(0, '', $list);
}
else{
return view();
}
}
}
//添加&&编辑
/**
* 添加
*/
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (isset($param['table-align'])) {
unset($param['table-align']);
}
if (isset($param['content'])) {
$param['md_content'] = '';
}
if (isset($param['docContent-html-code'])) {
$param['content'] = $param['docContent-html-code'];
$param['md_content'] = $param['docContent-markdown-doc'];
unset($param['docContent-html-code']);
unset($param['docContent-markdown-doc']);
}
$DbRes=false;
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(PagesCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
Db::startTrans();
try {
$res = PagesList::strict(false)->field(true)->update($param);
$aid = $param['id'];
if ($res) {
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
Db::name('PagesKeywords')->where(['aid'=>$aid])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = (new PagesList())->insertKeyword($keywordArray,$aid);
}
else{
$res_keyword == true;
}
if($res_keyword!== false){
add_log('edit', $param['id'], $param);
Db::commit();
$DbRes=true;
}
} else {
Db::rollback();
}
}
catch (\Exception $e) { ##这里参数不能删除($e错误信息)
Db::rollback();
}
} else {
try {
validate(PagesCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
Db::startTrans();
try {
if(empty($param['desc'])){
$param['desc'] = getDescriptionFromContent($param['content'], 100);
}
$aid = PagesList::strict(false)->field(true)->insertGetId($param);
if ($aid) {
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
Db::name('PagesKeywords')->where(['aid'=>$aid])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = (new PagesList())->insertKeyword($keywordArray,$aid);
}
else{
$res_keyword == true;
}
if($res_keyword!== false){
add_log('add', $aid, $param);
Db::commit();
$DbRes=true;
}
} else {
Db::rollback();
}
}
catch (\Exception $e) { ##这里参数不能删除($e错误信息)
Db::rollback();
}
if (request()->isAjax()) {
$param = get_params();
// 检验完整性
try {
validate(PagesValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
if($DbRes){
return to_assign();
}
else{
return to_assign(1,'操作失败');
}
}
else{
$id = isset($param['id']) ? $param['id'] : 0;
View::assign('id', $id);
View::assign('editor', get_system_config('other','editor'));
$this->model->addPages($param);
}else{
$templates = get_file_list(CMS_ROOT . '/app/home/view/pages/');
View::assign('templates', $templates);
if ($id > 0) {
$detail = (new PagesList())->detail($id);
if(empty($detail['md_content'])){
View::assign('editor',1);
}
View::assign('detail', $detail);
return view('edit');
}
return view();
}
}
//删除
public function delete()
/**
* 编辑
*/
public function edit()
{
$id = get_params("id");
$data['status'] = '-1';
$data['id'] = $id;
$data['update_time'] = time();
if (Db::name('Pages')->update($data) !== false) {
add_log('delete', $id);
return to_assign(0, "删除成功");
} else {
return to_assign(1, "删除失败");
}
$param = get_params();
if (request()->isAjax()) {
// 检验完整性
try {
validate(PagesValidate::class)->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->editPages($param);
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getPagesById($id);
if (!empty($detail)) {
//轮播图
if(!empty($detail['banner'])) {
$detail['banner_array'] = explode(',',$detail['banner']);
}
//关键字
$keyword_array = Db::name('PagesKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keyword_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keyword_array, 'title'));
$detail['keyword_array'] = $keyword_array;
$templates = get_file_list(CMS_ROOT . '/app/home/view/pages/');
View::assign('templates', $templates);
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
}
/**
* 查看信息
*/
public function read()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$detail = $this->model->getPagesById($id);
if (!empty($detail)) {
//轮播图
if(!empty($detail['banner'])) {
$detail['banner_array'] = explode(',',$detail['banner']);
}
//关键字
$keyword_array = Db::name('PagesKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keyword_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keyword_array, 'title'));
$detail['keyword_array'] = $keyword_array;
View::assign('detail', $detail);
return view();
}
else{
throw new \think\exception\HttpException(404, '找不到页面');
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$this->model->delPagesById($id,$type);
}
}

View File

@ -0,0 +1,97 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-3.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\validate\PositionCheck;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Position extends BaseController
{
public function index()
{
if (request()->isAjax()) {
$list = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select()->toArray();
$res['data'] = $list;
return table_assign(0, '', $res);
} else {
return view();
}
}
//添加&编辑
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(PositionCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$res = Db::name('Position')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
if($res!==false){
add_log('edit', $param['id'], $param);
return to_assign();
}
else{
return to_assign(1, '提交失败');
}
} else {
try {
validate(PositionCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$pid = Db::name('Position')->strict(false)->field(true)->insertGetId($param);
if($pid>0){
add_log('add', $pid, $param);
return to_assign();
}
else{
return to_assign(1, '提交失败');
}
}
}
else{
$id = isset($param['id']) ? $param['id'] : 0;
if ($id > 0) {
$detail = Db::name('Position')->where(['id' => $id])->find();
View::assign('detail', $detail);
}
View::assign('id', $id);
return view();
}
}
//删除
public function delete()
{
$id = get_params("id");
if ($id == 1) {
return to_assign(0, "超级岗位,不能删除");
}
$data['status'] = '-1';
$data['id'] = $id;
$data['update_time'] = time();
if (Db::name('Position')->update($data) !== false) {
add_log('delete', $id);
return to_assign(0, "删除岗位成功");
} else {
return to_assign(1, "删除失败");
}
}
}

View File

@ -11,6 +11,7 @@ namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\model\User as UserList;
use dateset\Dateset;
use think\facade\Db;
use think\facade\View;
@ -161,13 +162,14 @@ class User extends BaseController
$where[] = ['nickname|title', 'like', '%' . $param['keywords'] . '%'];
}
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$content = DB::name('UserLog')
$content = Db::name('UserLog')
->field("id,uid,nickname,title,content,ip,param,create_time")
->order('create_time desc')
->where($where)
->paginate($rows, false, ['query' => $param]);
$content->toArray();
$date_set = new Dateset();
foreach ($content as $k => $v) {
$data = $v;
$param_array = json_decode($v['param'], true);
@ -179,7 +181,7 @@ class User extends BaseController
$name = '' . $param_array['title'];
}
$data['content'] = $v['content'] . $name;
$data['times'] = time_trans($v['create_time']);
$data['times'] = $date_set->time_trans($v['create_time']);
$content->offsetSet($k, $data);
}
return table_assign(0, '', $content);

View File

@ -7,7 +7,7 @@
declare (strict_types = 1);
namespace app\admin\model;
use dateset\Dateset;
use think\Model;
class AdminLog extends Model
@ -31,8 +31,9 @@ class AdminLog extends Model
->order('create_time desc')
->where($where)
->paginate($rows, false, ['query' => $param]);
$content->toArray();
$content->toArray();
$date_set = new Dateset();
foreach ($content as $k => $v) {
$data = $v;
$param_array = json_decode($v['param'], true);
@ -44,7 +45,7 @@ class AdminLog extends Model
$name = '' . $param_array['title'];
}
$data['content'] = $v['content'] . $name;
$data['times'] = time_trans($v['create_time']);
$data['times'] = $date_set->time_trans($v['create_time']);
$content->offsetSet($k, $data);
}
return $content;

View File

@ -4,34 +4,15 @@
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\model;
use think\model;
use app\admin\model\Keywords;
use think\Model;
use think\facade\Db;
class Article extends Model
{
// 获取文章详情
public function detail($id)
{
$detail = \think\facade\Db::name('Article')->where(['id' => $id])->find();
if (!empty($detail)) {
$keyword_array = \think\facade\Db::name('ArticleKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keyword_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keyword_array, 'title'));
$detail['keyword_array'] = $keyword_array;
}
return $detail;
}
public static $Type = ['普通','精华','热门','推荐'];
//插入关键字
public function insertKeyword($keywordArray = [], $aid = 0)
{
@ -47,7 +28,113 @@ class Article extends Model
'create_time' => $time,
];
}
$res = \think\facade\Db::name('ArticleKeywords')->strict(false)->field(true)->insertAll($insert);
return $res;
$res = Db::name('ArticleKeywords')->strict(false)->field(true)->insertAll($insert);
}
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function getArticleList($where, $param)
{
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$order = empty($param['order']) ? 'a.id desc' : $param['order'];
$list = $this->where($where)
->field('a.*,c.id as cate_id,c.title as cate_title,u.nickname as admin_name')
->alias('a')
->join('ArticleCate c', 'a.cate_id = c.id')
->join('Admin u', 'a.admin_id = u.id')
->order($order)
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$type = (int)$item->type;
$item->type_str = self::$Type[$type];
});
return $list;
}
/**
* 添加数据
* @param $param
*/
public function addArticle($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = $this->strict(false)->field(true)->insertGetId($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$insertId);
}
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['aid'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function editArticle($param)
{
try {
$param['update_time'] = time();
$this->where('id', $param['id'])->strict(false)->field(true)->update($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
\think\facade\Db::name('ArticleKeywords')->where(['aid'=>$param['id']])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$param['id']);
}
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign();
}
/**
* 根据id获取信息
* @param $id
*/
public function getArticleById($id)
{
$info = $this->where('id', $id)->find();
return $info;
}
/**
* 删除信息
* @param $id
* @return array
*/
public function delArticleById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
$this->where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
$this->where('id', $id)->delete();
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}

View File

@ -4,12 +4,97 @@
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\model;
use think\Model;
use think\model;
class ArticleCate extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function getArticleCateList($where, $param)
{
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
try {
$list = $this->where($where)->order($order)->paginate($rows, false, ['query' => $param]);
return table_assign(0, '', $list);
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function addArticleCate($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = $this->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['aid'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function editArticleCate($param)
{
try {
$param['update_time'] = time();
$this->where('id', $param['id'])->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign();
}
/**
* 根据id获取信息
* @param $id
*/
public function getArticleCateById($id)
{
$info = $this->where('id', $id)->find();
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
*/
public function delArticleCateById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$this->where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
$this->where('id', $id)->delete();
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}

201
app/admin/model/Gallery.php Normal file
View File

@ -0,0 +1,201 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\model;
use think\model;
use app\admin\model\Keywords;
use think\facade\Db;
class Gallery extends Model
{
public static $Type = ['普通','精华','热门','推荐'];
//插入关键字
public function insertKeyword($keywordArray = [], $aid = 0)
{
$insert = [];
$time = time();
foreach ($keywordArray as $key => $value) {
if (!$value) {
continue;
}
$keywords_id = (new Keywords())->increase($value);
$insert[] = ['aid' => $aid,
'keywords_id' => $keywords_id,
'create_time' => $time,
];
}
$res = Db::name('GalleryKeywords')->strict(false)->field(true)->insertAll($insert);
}
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function getGalleryList($where, $param)
{
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$order = empty($param['order']) ? 'a.id desc' : $param['order'];
$list = $this->where($where)
->field('a.*,c.title as cate_title,u.nickname as admin_name')
->alias('a')
->join('ArticleCate c', 'a.cate_id = c.id')
->join('Admin u', 'a.admin_id = u.id')
->order($order)
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$type = (int)$item->type;
$item->type_str = self::$Type[$type];
$item->count = Db::name('GalleryFile')->where(array('aid'=>$item->id))->count();
});
return $list;
}
/**
* 添加数据
* @param $param
*/
public function addGallery($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = $this->strict(false)->field(true)->insertGetId($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$insertId);
}
//图集数据
$filepathData = isset($param['img_filepath']) ? $param['img_filepath'] : '';
$titleData = isset($param['img_title']) ? $param['img_title'] : '';
$idData = isset($param['img_id']) ? $param['img_id'] : 0;
$nameData = isset($param['img_name']) ? $param['img_name'] : '';
$descData = isset($param['img_desc']) ? $param['img_desc'] : '';
$linkData = isset($param['img_link']) ? $param['img_link'] : '';
$sortData = isset($param['img_sort']) ? $param['img_sort'] : 0;
$fileData = isset($param['img_file']) ? $param['img_file'] : 0;
//插入图集数据
$insertData = [];
foreach ($filepathData as $key => $value) {
if (!$value) {
continue;
}
$file = [];
$file['aid'] = $insertId;
$file['title'] = $titleData[$key];
$file['desc'] = $descData[$key];
$file['link'] = $linkData[$key];
$file['sort'] = $sortData[$key];
$file['file_id'] = $fileData[$key];
$file['filepath'] = $filepathData[$key];
$file['name'] = $nameData[$key];
$file['create_time'] = time();
$insertData[] = $file;
}
Db::name('GalleryFile')->strict(false)->field(true)->insertAll($insertData);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['aid'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function editGallery($param)
{
try {
$param['update_time'] = time();
$this->where('id', $param['id'])->strict(false)->field(true)->update($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
Db::name('GalleryKeywords')->where(['aid'=>$param['id']])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$param['id']);
}
//图集数据
$filepathData = isset($param['img_filepath']) ? $param['img_filepath'] : '';
$titleData = isset($param['img_title']) ? $param['img_title'] : '';
$idData = isset($param['img_id']) ? $param['img_id'] : 0;
$nameData = isset($param['img_name']) ? $param['img_name'] : '';
$descData = isset($param['img_desc']) ? $param['img_desc'] : '';
$linkData = isset($param['img_link']) ? $param['img_link'] : 0;
$sortData = isset($param['img_sort']) ? $param['img_sort'] : 0;
$fileData = isset($param['img_file']) ? $param['img_file'] : 0;
//插入图集数据
if ($filepathData) {
Db::name('GalleryFile')->where(['aid'=>$param['id']])->delete();
$insertData = [];
foreach ($filepathData as $key => $value) {
if (!$value) {
continue;
}
$file = [];
$file['aid'] = $param['id'];
$file['title'] = $titleData[$key];
$file['desc'] = $descData[$key];
$file['link'] = $linkData[$key];
$file['sort'] = $sortData[$key];
$file['file_id'] = $fileData[$key];
$file['filepath'] = $filepathData[$key];
$file['name'] = $nameData[$key];
$file['create_time'] = time();
$insertData[] = $file;
}
$res = Db::name('GalleryFile')->strict(false)->field(true)->insertAll($insertData);
}
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign();
}
/**
* 根据id获取信息
* @param $id
*/
public function getGalleryById($id)
{
$info = $this->where('id', $id)->find();
return $info;
}
/**
* 删除信息
* @param $id
* @return array
*/
public function delGalleryById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
$this->where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
$this->where('id', $id)->delete();
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}

View File

@ -0,0 +1,101 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\model;
use think\model;
class GalleryCate extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function getGalleryCateList($where, $param)
{
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
try {
$list = $this->where($where)->order($order)->paginate($rows, false, ['query' => $param]);
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function addGalleryCate($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = $this->strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['aid'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function editGalleryCate($param)
{
try {
$param['update_time'] = time();
$this->where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign();
}
/**
* 根据id获取信息
* @param $id
*/
public function getGalleryCateById($id)
{
$info = $this->where('id', $id)->find();
return $info;
}
/**
* 删除信息
* @param $id
* @return array
*/
public function delGalleryCateById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
$this->where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
$this->where('id', $id)->delete();
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}

View File

@ -4,64 +4,13 @@
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\model;
use app\admin\model\Keywords;
use think\Model;
use think\model;
class Goods extends Model
{
// 获取商品详情
public function detail($id)
{
$detail = \think\facade\Db::name('Goods')->where(['id'=>$id])->find();
if(!empty($detail)) {
//轮播图
if(!empty($detail['banner'])) {
$detail['banner_array'] = explode(',',$detail['banner']);
}
//关键字
$keywrod_array = \think\facade\Db::name('GoodsKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keywrod_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keywrod_array, 'title'));
//标签设置
$detail['tag1'] = $detail['tag2'] = $detail['tag3'] = $detail['tag4'] = $detail['tag5'] = $detail['tag6'] =0;
if(!empty($detail['tag_values'])) {
$tag_values_array = explode(',', $detail['tag_values']);
if(in_array('1', $tag_values_array)){
$detail['tag1'] = 1;
}
if(in_array('2', $tag_values_array)){
$detail['tag2'] = 1;
}
if(in_array('3', $tag_values_array)){
$detail['tag3'] = 1;
}
if(in_array('4', $tag_values_array)){
$detail['tag4'] = 1;
}
if(in_array('5', $tag_values_array)){
$detail['tag5'] = 1;
}
if(in_array('6', $tag_values_array)){
$detail['tag6'] = 1;
}
}
}
return $detail;
}
//插入关键字
public static $Type = ['普通','精华','热门','推荐'];
//插入关键字
public function insertKeyword($keywordArray = [], $aid = 0)
{
$insert = [];
@ -79,4 +28,111 @@ class Goods extends Model
$res = \think\facade\Db::name('GoodsKeywords')->strict(false)->field(true)->insertAll($insert);
return $res;
}
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function getGoodsList($where, $param)
{
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$order = empty($param['order']) ? 'a.id desc' : $param['order'];
$list = $this->where($where)
->field('a.*,c.title as cate_title,u.nickname as admin_name')
->alias('a')
->join('GoodsCate c', 'a.cate_id = c.id')
->join('Admin u', 'a.admin_id = u.id')
->order($order)
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$type = (int)$item->type;
$item->type_str = self::$Type[$type];
});
return $list;
}
/**
* 添加数据
* @param $param
*/
public function addGoods($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = $this->strict(false)->field(true)->insertGetId($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$insertId);
}
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['aid'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function editGoods($param)
{
try {
$param['update_time'] = time();
$this->where('id', $param['id'])->strict(false)->field(true)->update($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
\think\facade\Db::name('GoodsKeywords')->where(['aid'=>$param['id']])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$param['id']);
}
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign();
}
/**
* 根据id获取信息
* @param $id
*/
public function getGoodsById($id)
{
$info = $this->where('id', $id)->find();
return $info;
}
/**
* 删除信息
* @param $id
* @return array
*/
public function delGoodsById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
$this->where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
$this->where('id', $id)->delete();
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}

View File

@ -4,12 +4,98 @@
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\model;
use think\Model;
use think\model;
class GoodsCate extends Model
{
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function getGoodsCateList($where, $param)
{
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
try {
$list = $this->where($where)->order($order)->paginate($rows, false, ['query' => $param]);
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function addGoodsCate($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = $this->strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['aid'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function editGoodsCate($param)
{
try {
$param['update_time'] = time();
$this->where('id', $param['id'])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign();
}
/**
* 根据id获取信息
* @param $id
*/
public function getGoodsCateById($id)
{
$info = $this->where('id', $id)->find();
return $info;
}
/**
* 删除信息
* @param $id
* @return array
*/
public function delGoodsCateById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
$this->where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
$this->where('id', $id)->delete();
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}

View File

@ -4,41 +4,11 @@
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\model;
use app\admin\model\Keywords;
use think\Model;
use think\model;
class Pages extends Model
{
// 获取详情
public function detail($id)
{
$detail = \think\facade\Db::name('Pages')->where(['id'=>$id])->find();
if(empty($detail)) {
return false;
}
//轮播图
if(!empty($detail['banner'])) {
$detail['banner_array'] = explode(',',$detail['banner']);
}
//关键字
$keyword_array = \think\facade\Db::name('PagesKeywords')
->field('i.aid,i.keywords_id,k.title')
->alias('i')
->join('keywords k', 'k.id = i.keywords_id', 'LEFT')
->order('i.create_time asc')
->where(array('i.aid' => $id, 'k.status' => 1))
->select()->toArray();
$detail['keyword_ids'] = implode(",", array_column($keyword_array, 'keywords_id'));
$detail['keyword_names'] = implode(',', array_column($keyword_array, 'title'));
$detail['keyword_array'] = $keyword_array;
return $detail;
}
//插入关键字
//插入关键字
public function insertKeyword($keywordArray = [], $aid = 0)
{
$insert = [];
@ -56,4 +26,106 @@ class Pages extends Model
$res = \think\facade\Db::name('PagesKeywords')->strict(false)->field(true)->insertAll($insert);
return $res;
}
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function getPagesList($where, $param)
{
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$order = empty($param['order']) ? 'id desc' : $param['order'];
$list = $this->where($where)
->field('a.*,u.nickname as admin_name')
->alias('a')
->join('Admin u', 'a.admin_id = u.id')
->order($order)
->paginate($rows, false, ['query' => $param]);
return $list;
}
/**
* 添加数据
* @param $param
*/
public function addPages($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = $this->strict(false)->field(true)->insertGetId($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$insertId);
}
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['aid'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function editPages($param)
{
try {
$param['update_time'] = time();
$this->where('id', $param['id'])->strict(false)->field(true)->update($param);
//关联关键字
if (isset($param['keyword_names']) && $param['keyword_names']) {
\think\facade\Db::name('PagesKeywords')->where(['aid'=>$param['id']])->delete();
$keywordArray = explode(',', $param['keyword_names']);
$res_keyword = $this->insertKeyword($keywordArray,$param['id']);
}
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign();
}
/**
* 根据id获取信息
* @param $id
*/
public function getPagesById($id)
{
$info = $this->where('id', $id)->find();
return $info;
}
/**
* 删除信息
* @param $id
* @return array
*/
public function delPagesById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
$this->where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
$this->where('id', $id)->delete();
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
use think\facade\Db;
class ArticleCateValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$count = Db::name('ArticleCate')->where([['title','=',$data['title']],['id','<>',$data['id']],['delete_time','=',0]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'title' => 'require|checkOne',
];
protected $message = [
'title.require' => '分类名称不能为空',
'title.checkOne' => '同样的分类名称已经存在',
];
}

View File

@ -1,35 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class ArticleCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:article',
'content' => 'require',
'id' => 'require',
'article_cate_id' => 'require',
'status' => 'require',
];
protected $message = [
'title.require' => '标题不能为空',
'title.unique' => '同样的文章标题已经存在',
'content.require' => '文章内容不能为空',
'article_cate_id.require' => '所属分类为必选',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
];
protected $scene = [
'add' => ['title', 'article_cate_id', 'content', 'status'],
'edit' => ['title', 'article_cate_id', 'content', 'id', 'status'],
];
}

View File

@ -0,0 +1,26 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class ArticleValidate extends Validate
{
protected $rule = [
'cate_id' => 'require',
'title' => 'require',
'thumb' => 'require',
'content' => 'require',
];
protected $message = [
'cate_id.require' => '所属分类不能为空',
'title.require' => '文章标题不能为空',
'thumb.require' => '缩略图不能为空',
'content.require' => '文章内容不能为空',
];
}

View File

@ -1,7 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
@ -9,16 +9,16 @@ namespace app\admin\validate;
use think\Validate;
class ArticleCateCheck extends Validate
class DepartmentCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:article_cate',
'title' => 'require|unique:department',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'title.unique' => '同样的名称已经存在',
'title.require' => '部门名称不能为空',
'title.unique' => '同样的部门名称已经存在',
'id.require' => '缺少更新条件',
];
@ -26,4 +26,4 @@ class ArticleCateCheck extends Validate
'add' => ['title'],
'edit' => ['id', 'title'],
];
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
use think\facade\Db;
class GalleryCateValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$count = Db::name('GalleryCate')->where([['title','=',$data['title']],['id','<>',$data['id']],['delete_time','=',0]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'title' => 'require|checkOne',
];
protected $message = [
'title.require' => '分类名称不能为空',
'title.checkOne' => '同样的分类名称已经存在',
];
}

View File

@ -0,0 +1,24 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class GalleryValidate extends Validate
{
protected $rule = [
'cate_id' => 'require',
'title' => 'require',
'thumb' => 'require',
];
protected $message = [
'cate_id.require' => '所属分类不能为空',
'title.require' => '图集名称不能为空',
'thumb.require' => '缩略图不能为空',
];
}

View File

@ -1,29 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class GoodsCateCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:goods_cate',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'title.unique' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['id', 'title'],
];
}

View File

@ -0,0 +1,20 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class GoodsCateValidate extends Validate
{
protected $rule = [
'title' => 'require',
];
protected $message = [
'title.require' => '分类名称不能为空',
];
}

View File

@ -1,35 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class GoodsCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:goods',
'content' => 'require',
'id' => 'require',
'cate_id' => 'require',
'status' => 'require',
];
protected $message = [
'title.require' => '商品标题不能为空',
'title.unique' => '同样的商品标题已经存在',
'cate_id.require' => '所属商品分类为必选',
'content.require' => '商品内容不能为空',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
];
protected $scene = [
'add' => ['title', 'cate_id', 'content', 'status'],
'edit' => ['title', 'cate_id', 'content', 'id', 'status'],
];
}

View File

@ -0,0 +1,32 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class GoodsValidate extends Validate
{
protected $rule = [
'cate_id' => 'require',
'title' => 'require',
'thumb' => 'require',
'content' => 'require',
'base_price' => 'require',
'price' => 'require',
'stocks' => 'require',
];
protected $message = [
'cate_id.require' => '所属分类不能为空',
'title.require' => '商品名称不能为空',
'thumb.require' => '缩略图不能为空',
'content.require' => '商品描述不能为空',
'base_price.require' => '市场价格不能为空',
'price.require' => '实际价格不能为空',
'stocks.require' => '商品库存不能为空',
];
}

View File

@ -1,37 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class PagesCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:pages',
'content' => 'require',
'name' => 'lower|min:3|unique:pages',
'id' => 'require',
'status' => 'require',
];
protected $message = [
'title.require' => '标题不能为空',
'title.unique' => '同样的页面标题已经存在',
'content.require' => '页面内容不能为空',
'name.lower' => 'URL文件名称只能是小写字符',
'name.min' => 'URL文件名称至少需要3个小写字符',
'name.unique' => '同样的URL文件名称已经存在',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
];
protected $scene = [
'add' => ['title', 'content', 'name', 'status'],
'edit' => ['title', 'content', 'id', 'name', 'status'],
];
}

View File

@ -0,0 +1,26 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/Apache-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class PagesValidate extends Validate
{
protected $rule = [
'title' => 'require',
'content' => 'require',
'name' => 'lower|min:3|unique:pages',
];
protected $message = [
'title.require' => '页面名称不能为空',
'content.require' => '页面内容不能为空',
'name.lower' => 'URL文件名称只能是小写字符',
'name.min' => 'URL文件名称至少需要3个小写字符',
'name.unique' => '同样的URL文件名称已经存在',
];
}

View File

@ -0,0 +1,32 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
namespace app\admin\validate;
use think\Validate;
class PositionCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:position',
'work_price' => 'require|number',
'id' => 'require'
];
protected $message = [
'title.require' => '岗位名称不能为空',
'title.unique' => '同样的岗位名称已经存在',
'work_price.require' => '岗位工时单价不能为空',
'work_price.number' => '岗位工时单价只能是整数',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title', 'work_price', 'group_id'],
'edit' => ['title', 'work_price', 'group_id', 'id'],
];
}

View File

@ -17,9 +17,9 @@
<input type="text" name="nickname" lay-verify="required" placeholder="请输入用户名" lay-reqText="请输入用户名" autocomplete="off" class="layui-input">
</td>
<td rowspan="3" class="layui-td-gray-2">头像<br /><span style="font-size: 12px;">(如若不上传<br />系统将自动生成)</span></td>
<td rowspan="3" valign="top" style="width: 100px;">
<div class="layui-upload" style="width: 100px;">
<div class="layui-upload-list" id="demo1" style="width: 100%; height:100px; overflow: hidden;">
<td rowspan="3" valign="top" style="width: 160px;">
<div class="layui-upload" style="width: 100px; margin:0 auto">
<div class="layui-upload-list" id="demo1" style="width: 100%; height:100px;">
<img src="/static/admin/images/nonepic600x600.jpg" height="100" style="max-width: 100%; width: 100%;" />
<input type="hidden" name="thumb" value="">
</div>
@ -48,10 +48,28 @@
</td>
</tr>
<tr>
<td class="layui-td-gray">所在部门<font>*</font></td>
<td>
<select name="did" lay-verify="required" lay-reqText="请选择所属部门">
<option value="">请选择所属部门</option>
{volist name="department" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">岗位职称<font>*</font></td>
<td>
<select name="position_id" lay-verify="required" lay-reqText="请选择岗位职称">
<option value="">请选择岗位职称</option>
{volist name="position" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">用户状态<font>*</font></td>
<td colspan="5">
<td>
<input type="radio" name="status" value="1" title="正常" checked>
<input type="radio" name="status" value="0" title="禁止登录">
<input type="radio" name="status" value="0" title="禁">
</td>
</tr>
<tr>
@ -87,8 +105,8 @@
</td>
<td rowspan="3" class="layui-td-gray-2">头像<br /><span style="font-size: 12px;">(如若不上传<br />系统将自动生成)</span>
</td>
<td rowspan="3" valign="top" style="width: 100px;">
<div class="layui-upload" style="width: 100px;">
<td rowspan="3" valign="top" style="width: 160px;">
<div class="layui-upload" style="width: 100px; margin:0 auto">
<div class="layui-upload-list" id="demo1" style="width: 100%; height:100px; overflow: hidden;">
<img src="{$admin.thumb}" height="100" style="max-width: 100%; width: 100%;" />
<input type="hidden" name="thumb" value="{$admin.thumb}">
@ -119,10 +137,28 @@
</td>
</tr>
<tr>
<td class="layui-td-gray">所在部门<font>*</font></td>
<td>
<select name="did" lay-verify="required" lay-reqText="请选择所属部门">
<option value="">请选择所属部门</option>
{volist name="department" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$admin.did"}selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">岗位职称<font>*</font></td>
<td>
<select name="position_id" lay-verify="required" lay-reqText="请选择岗位职称">
<option value="">请选择岗位职称</option>
{volist name="position" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$admin.position_id"}selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">用户状态<font>*</font></td>
<td colspan="5">
<td>
<input type="radio" name="status" value="1" title="正常" {eq name="$admin.status" value="1" }checked{/eq}>
<input type="radio" name="status" value="0" title="禁止登录" {eq name="$admin.status" value="0"}checked{/eq}>
<input type="radio" name="status" value="0" title="禁" {eq name="$admin.status" value="0"}checked{/eq}>
</td>
</tr>
<tr>

View File

@ -19,7 +19,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-btn layui-btn-normal layui-btn-sm add-user">+ 添加管理员</span>
<span class="layui-btn layui-btn-sm add-user">+ 添加管理员</span>
</div>
</script>
<script type="text/html" id="barDemo">

View File

@ -24,10 +24,10 @@
<td>
{$admin.nickname}
</td>
<td rowspan="3" class="layui-td-gray">头像</td>
<td rowspan="3" valign="top" style="width: 100px;">
<td rowspan="4" class="layui-td-gray">头像</td>
<td rowspan="4" valign="top" style="width: 150px;">
<div class="layui-upload">
<img src="{$admin.thumb}" width="100" height="100" />
<img src="{$admin.thumb}" width="150" height="150" style="max-width:150px;" />
</div>
</td>
</tr>
@ -42,7 +42,21 @@
</td>
</tr>
<tr>
<td class="layui-td-gray">用户角色<font>*</font>
<td class="layui-td-gray">所在部门</td>
<td>
{volist name="department" id="v"}
{eq name="$v.id" value="$admin.did"}{$v.title}{/eq}
{/volist}
</td>
<td class="layui-td-gray">岗位职称</td>
<td>
{volist name="position" id="v"}
{eq name="$v.id" value="$admin.position_id"}{$v.title}{/eq}
{/volist}
</td>
</tr>
<tr>
<td class="layui-td-gray">用户角色
</td>
<td>
{volist name=":get_admin_group()" id="v"}

View File

@ -1,18 +1,14 @@
{extend name="common/base"/}
{block name="style"}
<style type="text/css">
.editormd-code-toolbar select {
display: inline-block
}
.editormd li {
list-style: inherit;
}
.editormd-code-toolbar select {display: inline-block}
.editormd li {list-style: inherit;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<form class="layui-form p-4">
<h3 class="pb-3">新建文章</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">文章标题<font>*</font></td>
@ -22,7 +18,7 @@
<tr>
<td class="layui-td-gray">文章分类<font>*</font></td>
<td>
<select name="article_cate_id" lay-verify="required" lay-reqText="请选择分类">
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
<option value="">请选择分类</option>
{volist name=":set_recursion(get_article_cate())" id="v"}
<option value="{$v.id}">{$v.title}</option>
@ -51,7 +47,7 @@
<input type="radio" name="is_home" value="1" title="是" checked>
<input type="radio" name="is_home" value="0" title="否">
</td>
<td class="layui-td-gray">属性</td>
<td class="layui-td-gray">文章属性</td>
<td>
<select name="type">
<option value="">请选择属性</option>
@ -84,10 +80,9 @@
<td class="layui-td-gray" style="vertical-align:top;">缩略图</td>
<td>
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm"
id="uploadBtn">上传缩略图尺寸480x272</button>
<div class="layui-upload-list" id="demo1" style="width: 120px; height:66px; overflow: hidden;">
<img src="" style="max-width: 100%; height:66px;" />
<button type="button" class="layui-btn layui-btn-sm" id="upload_btn_thumb">选择上传图片</button>
<div class="layui-upload-list" id="upload_box_thumb" style="width: 120px; height:66px; overflow: hidden;">
<img src="" onerror="javascript:this.src='{__GOUGU__}/gougu/images/nonepic600x360.jpg';this.onerror=null;" width="100" style="max-width: 100%; height:66px;"/>
<input type="hidden" name="thumb" value="">
</div>
</div>
@ -95,18 +90,16 @@
</tr>
{eq name="$editor" value="1"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span
style="margin-left:30px; color: red">当前为TinyMCE富文本编辑器可在【系统管理->系统配置->其他配置】中切换为mardown编辑器</span></td>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span class="ml-4 red">当前为TinyMCE富文本编辑器可在【系统管理->系统配置->其他配置】中切换为mardown编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<textarea class="layui-textarea" id="container"></textarea>
<textarea class="layui-textarea" id="container_content"></textarea>
</td>
</tr>
{else/}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span
style="margin-left:30px; color: red">当前为mardown编辑器可在【系统管理->系统配置->其他配置】中切换为ueditor富文本编辑器</span></td>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span class="ml-4 red">当前为mardown编辑器可在【系统管理->系统配置->其他配置】中切换为ueditor富文本编辑器</span></td>
</tr>
<tr>
<td colspan="6">
@ -118,10 +111,9 @@
</tr>
{/eq}
</table>
<div class="py-3">
<div class="pt-3">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
</div>
</form>
{/block}
@ -140,7 +132,8 @@
}
function gouguInit() {
var form = layui.form, tool = layui.tool, tagspicker = layui.tagpicker, upload = layui.upload;
var form = layui.form, tool = layui.tool,tagspicker = layui.tagpicker;
var tags = new tagspicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
@ -149,49 +142,40 @@
'height': 500,
'isDiy': 1
});
//封面上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//上传缩略图
var upload_thumb = layui.upload.render({
elem: '#upload_btn_thumb',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
$('#upload_box_thumb input').attr('value', res.data.id);
$('#upload_box_thumb img').attr('src', res.data.filepath);
}
});
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
window.location.href = "/admin/article/index.html";
return false;
});
if (editorType == 1) {
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
selector: "#container_content",
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
data.field.content = tinyMCE.editors['container_content'].getContent();
if (data.field.content == '') {
layer.msg('请先完善文章内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.tabRefresh(71);
layer.confirm('保存成功,关闭当前页面?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
tool.sideClose(1000);
}
}
tool.post("/admin/article/add", data.field, callback);
@ -210,13 +194,10 @@
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.tabRefresh(71);
layer.confirm('保存成功,关闭当前页面?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
tool.sideClose(1000);
}
}
tool.post("/admin/article/add", data.field, callback);

View File

@ -0,0 +1,173 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<form class="layui-form gg-form-bar border-t border-x">
<div class="layui-input-inline">
<select name="cate_id">
<option value="">请选择文章分类</option>
{volist name=":set_recursion(get_article_cate())" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="请输入关键字" class="layui-input" autocomplete="off" />
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="searchform">提交搜索</button>
</form>
<table class="layui-hide" id="article" lay-filter="article"></table>
</div>
<script type="text/html" id="status">
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
</script>
<script type="text/html" id="is_home">
<i class="layui-icon {{# if(d.is_home == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-btn layui-btn-sm" lay-event="add" data-title="添加文章表">+ 添加文章表</span>
</div>
</script>
<script type="text/html" id="barDemo">
<div class="layui-btn-group"><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="read">查看</a><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table,tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#article',
title: '文章表列表',
toolbar: '#toolbarDemo',
url: '/admin/article/datalist',
page: true,
limit: 20,
cellMinWidth: 300,
cols: [
[
{
fixed: 'left',
field: 'id',
title: '编号',
align: 'center',
width: 80
},{
field: 'cate_title',
title: '文章分类',
align: 'center',
width: 120
},{
field: 'title',
title: '文章标题',
},{
field: 'read',
title: '阅读量',
align: 'center',
width: 90
},{
field: 'type_str',
title: '文章属性',
align: 'center',
width: 90
},{
field: 'is_home',
title: '是否首页显示',
toolbar: '#is_home',
align: 'center',
width: 100
},{
field: 'sort',
title: '排序',
align: 'center',
width: 80
},{
field: 'status',
title: '状态',
toolbar: '#status',
align: 'center',
width: 80
},{
field: 'admin_name',
title: '创建人',
align: 'center',
width: 100
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 160
},{
fixed: 'right',
field: 'right',
title: '操作',
toolbar: '#barDemo',
width: 136,
align: 'center'
}
]
]
});
//监听表头工具栏事件
table.on('toolbar(article)', function(obj){
if (obj.event === 'add') {
tool.side("/admin/article/add");
return false;
}
});
//监听表格行工具事件
table.on('tool(article)', function(obj) {
var data = obj.data;
if (obj.event === 'read') {
tool.side('/admin/article/read?id='+obj.data.id);
}
else if (obj.event === 'edit') {
tool.side('/admin/article/edit?id='+obj.data.id);
}
else if (obj.event === 'del') {
layer.confirm('确定要删除该记录吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/admin/article/del", { id: data.id }, callback);
layer.close(index);
});
}
return false;
});
//监听搜索提交
form.on('submit(searchform)', function(data) {
layui.pageTable.reload({
where: {
keywords: data.field.keywords,
cate_id: data.field.cate_id
},
page: {
curr: 1
}
});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -1,29 +1,27 @@
{extend name="common/base"/}
{block name="style"}
<style type="text/css">
.editormd-code-toolbar select {display: inline-block}
.editormd li {list-style: inherit;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<style type="text/css">
.editormd-code-toolbar select {
display: inline-block
}
.editormd li {
list-style: inherit;
}
</style>
<form class="layui-form p-3">
<form class="layui-form p-4">
<h3 class="pb-3">编辑文章表</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">文章标题<font>*</font></td>
<td colspan="7"> <input type="text" name="title" lay-verify="required" lay-reqText="请输入文章标题"
autocomplete="off" placeholder="请输入文章标题" class="layui-input" value="{$article.title}"></td>
autocomplete="off" placeholder="请输入文章标题" class="layui-input" value="{$detail.title}"></td>
</tr>
<tr>
<td class="layui-td-gray">文章分类<font>*</font></td>
<td>
<select name="article_cate_id" lay-verify="required" lay-reqText="请选择分类">
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
<option value="">请选择分类</option>
{volist name=":set_recursion(get_article_cate())" id="v"}
<option value="{$v.id}" {eq name="$article.article_cate_id" value="$v.id" }selected{/eq}>{$v.title}
<option value="{$v.id}" {eq name="$detail.cate_id" value="$v.id" }selected{/eq}>{$v.title}
</option>
{/volist}
</select>
@ -31,16 +29,16 @@
<td class="layui-td-gray">关键字<font>*</font></td>
<td>
<input type="text" id="keyword_name" name="keyword_names" autocomplete="off" lay-verify="required"
lay-reqText="请选择关键字" placeholder="请选择关键字" class="layui-input" value="{$article.keyword_names}"
lay-reqText="请选择关键字" placeholder="请选择关键字" class="layui-input" value="{$detail.keyword_names}"
readonly>
<input type="hidden" id="keyword_id" name="keywords_id" autocomplete="off"
value="{$article.keyword_ids}">
value="{$detail.keyword_ids}">
</td>
<td class="layui-td-gray">状态<font>*</font></td>
<td>
<input type="radio" name="status" value="1" title="正常" {eq name="$article.status" value="1"
<input type="radio" name="status" value="1" title="正常" {eq name="$detail.status" value="1"
}checked{/eq}>
<input type="radio" name="status" value="0" title="下架" {eq name="$article.status" value="0"
<input type="radio" name="status" value="0" title="下架" {eq name="$detail.status" value="0"
}checked{/eq}>
</td>
</tr>
@ -48,48 +46,48 @@
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input"
value="{$article.sort}">
value="{$detail.sort}">
</td>
<td class="layui-td-gray">首页显示</td>
<td>
<input type="radio" name="is_home" value="1" title="是" {eq name="$article.is_home" value="1"
<input type="radio" name="is_home" value="1" title="是" {eq name="$detail.is_home" value="1"
}checked{/eq}>
<input type="radio" name="is_home" value="0" title="否" {eq name="$article.is_home" value="0"
<input type="radio" name="is_home" value="0" title="否" {eq name="$detail.is_home" value="0"
}checked{/eq}>
</td>
<td class="layui-td-gray">属性</td>
<td>
<select name="type">
<option value="">请选择属性</option>
<option value="1" {eq name="$article.type" value="1" }selected{/eq}>精华</option>
<option value="2" {eq name="$article.type" value="2" }selected{/eq}>热门</option>
<option value="3" {eq name="$article.type" value="3" }selected{/eq}>推荐</option>
<option value="1" {eq name="$detail.type" value="1" }selected{/eq}>精华</option>
<option value="2" {eq name="$detail.type" value="2" }selected{/eq}>热门</option>
<option value="3" {eq name="$detail.type" value="3" }selected{/eq}>推荐</option>
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">是否原创</td>
<td>
<input type="radio" name="original" value="1" title="是" {eq name="$article.original" value="1"
<input type="radio" name="original" value="1" title="是" {eq name="$detail.original" value="1"
}checked{/eq}>
<input type="radio" name="original" value="0" title="否" {eq name="$article.original" value="0"
<input type="radio" name="original" value="0" title="否" {eq name="$detail.original" value="0"
}checked{/eq}>
</td>
<td class="layui-td-gray">作者/来源</td>
<td>
<input type="text" name="origin" class="layui-input" autocomplete="off" placeholder="请输入文章来源"
value="{$article.origin}">
value="{$detail.origin}">
</td>
<td class="layui-td-gray">来源链接</td>
<td>
<input type="text" name="origin_url" class="layui-input" autocomplete="off" placeholder="请输入来源链接"
value="{$article.origin_url}">
value="{$detail.origin_url}">
</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">摘要</td>
<td colspan="3">
<textarea name="desc" placeholder="请输入摘要不能超过200个字" class="layui-textarea">{$article.desc}</textarea>
<textarea name="desc" placeholder="请输入摘要不能超过200个字" class="layui-textarea">{$detail.desc}</textarea>
</td>
<td class="layui-td-gray" style="vertical-align:top;">缩略图</td>
<td>
@ -97,42 +95,39 @@
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm"
id="uploadBtn">上传缩略图尺寸480x272</button>
<div class="layui-upload-list" id="demo1" style="width: 120px; height:66px; overflow: hidden;">
<img src="{:get_file($article.thumb)}" style="max-width: 100%; height:66px;" />
<input type="hidden" name="thumb" value="{$article.thumb}">
<img src="{:get_file($detail.thumb)}" onerror="javascript:this.src='{__GOUGU__}/gougu/images/nonepic600x360.jpg';this.onerror=null;" style="max-width: 100%; height:66px;" />
<input type="hidden" name="thumb" value="{$detail.thumb}">
</div>
</div>
</td>
</tr>
{eq name="$editor" value="1"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span
style="margin-left:30px; color: red">当前为TinyMCE富文本编辑器可在【系统管理->系统配置->其他配置】中切换为mardown编辑器</span></td>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span class="ml-4 red">当前为TinyMCE富文本编辑器可在【系统管理->系统配置->其他配置】中切换为mardown编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<textarea placeholder="请输入内容" class="layui-textarea" id="container">{$article.content}</textarea>
<textarea placeholder="请输入内容" class="layui-textarea" id="container_content">{$detail.content}</textarea>
</td>
</tr>
{else/}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span
style="margin-left:30px; color: red">当前为mardown编辑器可在【系统管理->系统配置->其他配置】中切换为TinyMCE富文本编辑器</span></td>
<td colspan="6" class="layui-td-gray" style="text-align:left">文章内容<font>*</font><span class="ml-4 red">当前为mardown编辑器可在【系统管理->系统配置->其他配置】中切换为TinyMCE富文本编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<div style="margin-top:-2px; margin-right:2px">
<textarea id="mdContent" style="display:none;">{$article.md_content|raw}</textarea>
<textarea id="mdContent" style="display:none;">{$detail.md_content|raw}</textarea>
<div id="docContent"></div>
</div>
</td>
</tr>
{/eq}
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$article.id}">
<div class="pt-3">
<input type="hidden" name="id" value="{$detail.id}"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">关闭</button>
</div>
</form>
{/block}
@ -151,8 +146,9 @@
}
function gouguInit() {
var form = layui.form, tool = layui.tool, tagspicker = layui.tagpicker, upload = layui.upload;
var tags = new tagspicker({
var form = layui.form, tool = layui.tool,tagpicker = layui.tagpicker;
var tags = new tagpicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
'tag_ids': 'keyword_id',
@ -160,52 +156,43 @@
'height': 500,
'isDiy': 1
});
//封面上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//上传缩略图
var upload_thumb = layui.upload.render({
elem: '#upload_btn_thumb',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
layer.msg('上传失败');
return false;
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
$('#upload_box_thumb input').attr('value', res.data.id);
$('#upload_box_thumb img').attr('src', res.data.filepath);
}
});
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
tool.tabClose();
return false;
});
if (editorType == 1) {
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
selector: "#container_content",
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
data.field.content = tinyMCE.editors['container_content'].getContent();
if (data.field.content == '') {
layer.msg('请先完善文章内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.tabRefresh(71);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
tool.sideClose(1000);
}
}
tool.post("/admin/article/add", data.field, callback);
tool.post("/admin/article/edit", data.field, callback);
return false;
});
}
@ -221,16 +208,12 @@
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.tabRefresh(71);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
tool.sideClose(1000);
}
}
tool.post("/admin/article/add", data.field, callback);
tool.post("/admin/article/edit", data.field, callback);
return false;
});
}

View File

@ -0,0 +1,52 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="layui-form p-4">
<h3 class="pb-3">文章表详情</h3>
<table class="layui-table layui-table-form">
<tr><td class="layui-td-gray-2">所属分类</td>
<td>
{eq name="$detail.cate_id" value="1"}选项一{/eq}
{eq name="$detail.cate_id" value="2"}选项二{/eq}
</td><td class="layui-td-gray-2">文章标题</td>
<td>{$detail.title}</td><td class="layui-td-gray-2">关键字</td>
<td>{$detail.keywords}</td>
</tr><tr><td class="layui-td-gray-2">是否原创</td>
<td>
{eq name="$detail.original" value="1"}选项一{/eq}
{eq name="$detail.original" value="2"}选项二{/eq}
</td><td class="layui-td-gray-2">来源或作者</td>
<td>{$detail.origin}</td><td class="layui-td-gray-2">来源地址</td>
<td>{$detail.origin_url}</td>
</tr><tr><td class="layui-td-gray-2">阅读量</td>
<td>{$detail.read}</td><td class="layui-td-gray-2">文章属性</td>
<td>
{eq name="$detail.type" value="1"}选项一{/eq}
{eq name="$detail.type" value="2"}选项二{/eq}
</td><td class="layui-td-gray-2">是否首页显示</td>
<td>
{eq name="$detail.is_home" value="1"}选项一{/eq}
{eq name="$detail.is_home" value="2"}选项二{/eq}
</td>
</tr><tr><td class="layui-td-gray-2">排序</td>
<td>{$detail.sort}</td><td class="layui-td-gray-2">状态</td>
<td>
{eq name="$detail.status" value="1"}选项一{/eq}
{eq name="$detail.status" value="2"}选项二{/eq}
</td><td class="layui-td-gray-2">创建时间</td>
<td>{$detail.create_time}</td>
</tr><tr><td class="layui-td-gray-2">文章摘要</td>
<td colspan="5">{$detail.desc}</td>
</tr><tr><td class="layui-td-gray-2">缩略图</td>
<td colspan="5">
<img src="{$detail.thumb}" onerror="javascript:this.src='{__GOUGU__}/gougu/images/nonepic600x360.jpg';this.onerror=null;" width="100" style="width:200px; max-width:200px" />
</td>
</tr><tr><td class="layui-td-gray-2">文章内容</td>
<td colspan="5">
{$detail.content|raw}
</td>
</tr>
</table>
</div>
{/block}
<!-- /主体 -->

View File

@ -2,47 +2,42 @@
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">文章分类</h3>
<h3 class="pb-3">新建文章分类</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">父级分类<font>*</font>
</td>
<td class="layui-td-gray">父级分类<font>*</font></td>
<td>
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
<option value="0">作为顶级分类</option>
{volist name=":set_recursion(get_article_cate())" id="v"}
<option value="{$v.id}" {eq name="pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
<option value="{$v.id}" {eq name="$pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">分类名称<font>*</font>
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称"
lay-reqText="请输入分类名称" class="layui-input" {notempty name="$cate.title" }value="{$cate.title}"
{/notempty}>
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">排序</td>
<td class="layui-td-gray">分类名称<font>*</font></td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input"
{notempty name="$cate.sort" }value="{$cate.sort}" {/notempty}>
<input type="text" name="title" lay-verify="required" autocomplete="off" value="" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
</td>
<td class="layui-td-gray">关键词</td>
<td>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input"
{notempty name="$cate.keywords" }value="{$cate.keywords}" {/notempty}>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input" value="">
</td>
</tr>
<tr>
<td class="layui-td-gray">描述</td>
<td colspan="3"><textarea name="desc" placeholder="请输入描述,可空"
class="layui-textarea">{notempty name="$cate.desc" }{$cate.desc}{/notempty}</textarea></td>
<td colspan="3">
<textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea"></textarea>
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$id}" />
<input type="hidden" name="id" value="0" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
@ -66,7 +61,7 @@
}, 1000);
}
}
tool.post("/admin/article/cate_add", data.field, callback);
tool.post("/admin/article_cate/add", data.field, callback);
return false;
});
}

View File

@ -3,15 +3,12 @@
{block name="body"}
<div class="p-3">
<div class="gg-form-bar border-t border-x">
<button class="layui-btn layui-btn-normal layui-btn-sm add-menu">+ 添加分类</button>
<button class="layui-btn layui-btn-sm add-menu">+ 添加分类</button>
</div>
<div>
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
</div>
</div>
<script type="text/html" id="switchStatus">
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
</script>
{/block}
<!-- /主体 -->
@ -25,11 +22,12 @@
id:'treeTable'
,elem: '#treeTable'
,idField:'id'
,url:'/admin/article/cate'
,cellMinWidth: 100
,url:'/admin/article_cate/datalist'
,cellMinWidth: 300
,treeId:'id'//树形id字段名称
,treeUpId:'pid'//树形父id字段名称
,treeShowName:'title'//以树形式显示的字段
,page:false
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field: 'sort', title: '排序', align:'center', width:80}
@ -38,27 +36,26 @@
,{field:'keywords', title: '关键词', width:200,}
,{field:'desc', title: '描述'}
,{width:160,title: '操作', align:'center',templet: function(d){
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
var html = '<span class="layui-btn-group"><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</span><span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span><span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span></span>';
return html;
}
}
]]
,page:false
});
//表头工具栏事件
$('.add-menu').on('click', function(){
tool.side("/admin/article/cate_add");
tool.side("/admin/article_cate/add");
return;
});
//操作按钮
treeGrid.on('tool(treeTable)',function (obj) {
if (obj.event === 'add') {
tool.side('/admin/article/cate_add?pid='+obj.data.id);
tool.side("/admin/article_cate/add?pid="+obj.data.id);
return;
}
if (obj.event === 'edit') {
tool.side('/admin/article/cate_add?id='+obj.data.id);
tool.side("/admin/article_cate/edit?id="+obj.data.id);
return;
}
if(obj.event === 'del'){
@ -69,7 +66,7 @@
obj.del();
}
}
tool.delete("/admin/article/cate_delete", { id: obj.data.id }, callback);
tool.delete("/admin/article_cate/del", { id: obj.data.id}, callback);
layer.close(index);
});
}

View File

@ -0,0 +1,70 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">编辑文章分类</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">父级分类<font>*</font></td>
<td>
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
<option value="0">作为顶级分类</option>
{volist name=":set_recursion(get_article_cate())" id="v"}
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort}">
</td>
</tr>
<tr>
<td class="layui-td-gray">分类名称<font>*</font></td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" class="layui-input" value="{$detail.title}">
</td>
<td class="layui-td-gray">关键词</td>
<td>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input" value="{$detail.keywords}">
</td>
</tr>
<tr>
<td class="layui-td-gray">描述</td>
<td colspan="3">
<textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea">{$detail.desc}</textarea>
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$detail.id}" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function () {
parent.location.reload();
}, 1000);
}
}
tool.post("/admin/article_cate/edit", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -10,7 +10,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add">+ 添加配置项</button>
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加配置项</button>
</div>
</script>
{/block}

View File

@ -0,0 +1,56 @@
{extend name="common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<table class="layui-table layui-form">
<thead>
<tr>
<th colspan="7" class="red" style="text-align:left; line-height:1.8">
使用【<strong>一键CRUD生成代码</strong>】功能可以帮你完成 <strong>60%</strong> 以上的开发工作,使用前请先<strong>新建数据表</strong>
<br/>注意:数据表的注释必须带 <strong>::crud</strong> 标识才能被识别,例如:文章表::crud。<a href="/admin/crud/table" target="_blank" class="layui-btn layui-btn-normal layui-btn-xs">查看建表样例</a>
</th>
</tr>
<tr>
<th style="text-align:center;">ID编号</th>
<th style="text-align:center;">表前缀</th>
<th>数据表名</th>
<th style="text-align:center;">数据量</th>
<th style="text-align:center;">创建时间</th>
<th>数据表注释</th>
<th style="text-align:center;">操作</th>
</tr>
</thead>
<tbody>
{volist name="table_info" id="v"}
<tr>
<td style="text-align:center;">{$i}</td>
<td style="text-align:center;">{$prefix}</td>
<td>{$v.title}</td>
<td style="text-align:center;">{$v.Rows}</td>
<td style="text-align:center;">{$v.Create_time}</td>
<td>{$v.Comment}</td>
<td style="text-align:center;">
{eq name="$v.crud" value="0"}
<a href="/admin/crud/table?name={$v.Name}" class="layui-btn layui-btn-xs">一键CRUD生成代码</a>
{else/}
已生成CRUD <a href="/admin/crud/table?name={$v.Name}" class="layui-btn layui-btn-normal layui-btn-xs">详细</a>
{/eq}
</td>
</tr>
{/volist}
</tbody>
</table>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var tool = layui.tool;
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,285 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">数据表信息</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray-2">数据表名称</td>
<td>{$detail.title}</td>
<td class="layui-td-gray-2">数据表备注</td>
<td>{$detail.Comment}</td>
<td class="layui-td-gray-2">当前记录数</td>
<td>{$detail.Rows}</td>
<td class="layui-td-gray-2">创建时间</td>
<td>{$detail.Create_time}</td>
</tr>
</table>
{neq name="$detail.c" value="0"}
<h3 class="py-3">文件信息</h3>
<table class="layui-table layui-table-form">
<tr>
<td colspan="8" class="red" style="text-align:left; line-height:1.8">
温馨提示:<br/>
1、【<strong>一键CRUD生成代码</strong>】已帮你完成 <strong>60%</strong> 以上的开发工作,以下是生成的文件所在目录。
<br/>
2、可以系统刷新页面点击左边的刚刚新增的<strong>菜单</strong>访问相关功能,如需更改菜单左侧图标,请在[系统管理]->[菜单节点]找到对应的菜单编辑修改即可。
<br/>
3、代码生成以后不建议删除(除非不需要了),建议在当前的基础上修改及新增开发就可以了,开发方式与传统的开发方式无区别。
<br/>
4、CRUD生成的代码是最基础的代码开发者通过二次开发修改能使得功能更完善代码更健壮特别是逻辑上的处理以下是二次开发建议。
<br/>
5、后端功能开发参考文档 <a href="https://www.kancloud.cn/manual/thinkphp6_0/1037479" target="_blank" class="layui-btn layui-btn-normal layui-btn-xs">ThinkPHP6开发文档</a>,前端页面开发参考文档 <a href="http://admin.gougucms.com" target="_blank" class="layui-btn layui-btn-xs">勾股UI开发文档</a>
</td>
</tr>
<tr>
<td class="layui-td-gray-2">控制器</td>
<td>{$detail.c}</td>
<td class="layui-td-gray">开发建议</td>
<td class="red">功能逻辑完善、控制器的其他方法的补充完善等</td>
</tr>
<tr>
<td class="layui-td-gray-2">数据模型</td>
<td>{$detail.m=='0'?'-':$detail.m}</td>
<td class="layui-td-gray">开发建议</td>
<td class="red">数据搜索条件完善、查询字段增减调整、关联表查询等</td>
</tr>
<tr>
<td class="layui-td-gray-2">数据校验器</td>
<td>{$detail.v=='0'?'-':$detail.v}</td>
<td class="layui-td-gray">开发建议</td>
<td class="red">增强数据校验规则、修改调整校验提示等</td>
</tr>
<tr>
<td class="layui-td-gray-2">列表页面</td>
<td>{$detail.l=='0'?'-':$detail.l}</td>
<td class="layui-td-gray">开发建议</td>
<td class="red">列表显示字段增减调整、列表字段表格宽度调整、其他按钮、链接的补充完善等</td>
</tr>
<tr>
<td class="layui-td-gray-2">添加页面</td>
<td>{$detail.a=='0'?'-':$detail.a}</td>
<td class="layui-td-gray">开发建议</td>
<td class="red">需要输入的字段增减调整、单选、多选、下拉选的内容调整等</td>
</tr>
<tr>
<td class="layui-td-gray-2">编辑页面</td>
<td>{$detail.e=='0'?'-':$detail.e}</td>
<td class="layui-td-gray">开发建议</td>
<td class="red">需要编辑的字段增减调整、单选、多选、下拉选的内容调整等</td>
</tr>
<tr>
<td class="layui-td-gray-2">查看页面</td>
<td>{$detail.r=='0'?'-':$detail.r}</td>
<td class="layui-td-gray">开发建议</td>
<td class="red">显示字段增减调整、其他按钮、连接的补充完善等</td>
</tr>
</table>
<h3 class="py-3">数据表字段</h3>
<table class="layui-table layui-form">
<thead>
<th style="text-align:center;">字段列名</th>
<th style="text-align:center;">数据类型</th>
<th style="text-align:center;">字段注释</th>
</thead>
<tbody>
{volist name="columns" id="vo"}
<tr>
<td>{$vo.Field}</td>
<td>{$vo.Type}</td>
<td>{$vo.Comment}</td>
</tr>
{/volist}
</tbody>
</table>
{else/}
<h3 class="py-3">数据表字段</h3>
<table class="layui-table layui-form">
<thead>
<th style="text-align:center;">字段列名</th>
<th style="text-align:center;">字段注释</th>
<th style="text-align:center;">数据类型</th>
<th class="blue" style="text-align:center;">字段名称</th>
<th class="blue" style="text-align:center;">是否必填</th>
<th class="blue" style="text-align:center;">显示类型</th>
<th class="green" style="text-align:center;">插入展示</th>
<th class="green" style="text-align:center;">编辑展示</th>
<th class="green" style="text-align:center;">列表展示</th>
<th class="green" style="text-align:center;">查询展示</th>
</thead>
<tbody>
{volist name="columns" id="vo"}
<tr>
<td>{$vo.Field}</td>
<td>{$vo.Comment}</td>
<td>{$vo.Type}</td>
{eq name="$vo.Field" value="id"}
<td style="text-align:center;">-</td>
<td style="text-align:center;">-</td>
<td style="text-align:center;">-</td>
<td style="text-align:center;">-</td>
<td style="text-align:center;">-</td>
<td style="text-align:center;">-</td>
<td style="text-align:center;">-</td>
{else/}
<td style="text-align:center;">
<input type="hidden" name="{$vo.Field}" value="{$vo.Field}" class="crud-flie">
<input type="text" name="{$vo.Field}_title" value="" class="layui-input"></td>
<td style="text-align:center;"><input type="checkbox" name="{$vo.Field}_required" value="1" lay-skin="primary"></td>
<td>
<select name="{$vo.Field}_type">
<option value="input" selected="">文本框</option>
<option value="textarea">文本域</option>
<option value="select">下拉框</option>
<option value="radio">单选框</option>
<option value="checkbox">复选框</option>
<option value="summernote">富文本</option>
<option value="datetime">日期控件</option>
<option value="upload">上传控件</option>
</select>
</td>
<td style="text-align:center;"><input type="checkbox" name="{$vo.Field}_add" value="{$vo.Field}" lay-skin="primary"></td>
<td style="text-align:center;"><input type="checkbox" name="{$vo.Field}_edit" value="{$vo.Field}" lay-skin="primary"></td>
<td style="text-align:center;"><input type="checkbox" name="{$vo.Field}_list" value="{$vo.Field}" lay-skin="primary"></td>
<td style="text-align:center;"><input type="checkbox" name="{$vo.Field}_read" value="{$vo.Field}" lay-skin="primary"></td>
{/eq}
</tr>
{/volist}
</tbody>
</table>
<div class="py-3">
<input type="hidden" name="field" value="{$detail.title}">
<input type="hidden" name="name" value="{$detail.Comment}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">一键CRUD生成代码</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
{/neq}
</form>
{/block}
<!-- /主体 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var form = layui.form,tool=layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
var arr_crud = [],crud_a=[],crud_e=[],crud_r=[],crud_l=[],crud_v=[];
$('.crud-flie').each(function() {
arr_crud.push($(this).val());
});
let isPost = true;
for(var i=0;i<arr_crud.length;i++){
let crud = arr_crud[i];
let title = $('[name="'+crud+'_title"]').val();
let type = $('[name="'+crud+'_type"]').val();
let required = $('input[name="'+crud+'_required"]:checked').val();
let add = $('input[name="'+crud+'_add"]:checked').val();
let edit = $('input[name="'+crud+'_edit"]:checked').val();
let read = $('input[name="'+crud+'_read"]:checked').val();
let list = $('input[name="'+crud+'_list"]:checked').val();
required=required?1:0;
if(required){
if(title == ''){
layer.msg('字段【'+crud+'】名称不能为空');
isPost = false;
break;
}
crud_v.push({'field':crud,'type':type,'title':title});
}
else{
required = 0;
}
if(add){
if(title == ''){
layer.msg('字段【'+crud+'】名称不能为空');
isPost = false;
break;
}
crud_a.push({'field':crud,'type':type,'required':required,'title':title});
}
if(edit){
if(title == ''){
layer.msg('字段【'+crud+'】名称不能为空');
isPost = false;
break;
}
crud_e.push({'field':crud,'type':type,'required':required,'title':title});
}
if(read){
if(title == ''){
layer.msg('字段【'+crud+'】名称不能为空');
isPost = false;
break;
}
crud_r.push({'field':crud,'type':type,'required':required,'title':title});
}
if(list){
if(title == ''){
layer.msg('字段【'+crud+'】名称不能为空');
isPost = false;
break;
}
crud_l.push({'field':crud,'type':type,'required':required,'title':title});
}
}
//数组
console.log(crud_v);
console.log(crud_a);
console.log(crud_e);
console.log(crud_r);
console.log(crud_l);
if(crud_v.length==0 && isPost == true){
layer.msg('必填选项不能为空');
return false;
}
if(crud_a.length==0 && isPost == true){
layer.msg('插入展示不能为空');
return false;
}
if(crud_e.length==0 && isPost == true){
layer.msg('编辑展示不能为空');
return false;
}
if(crud_r.length==0 && isPost == true){
layer.msg('查看展示不能为空');
return false;
}
if(crud_l.length==0 && isPost == true){
layer.msg('列表展示不能为空');
return false;
}
let callback = function (e) {
console.log(e);
if (e == '') {
layer.msg('crud生成成功正在生成菜单...');
tool.post("/admin/crud/menu", {field:data.field.field,name:data.field.name}, function(res){
layer.msg(res.msg);
if (res.code == 0) {
setTimeout(function(){
parent.location.reload();
},2000);
}
});
}
else{
layer.msg('代码已生成,如需重新生成,请删除后再重试');
}
}
if(isPost == true){
//location.href='/admin/crud/crud?file=file&name=附件';
tool.post("/admin/crud/crud", {field:data.field.field,name:data.field.name,crud_v:crud_v,crud_a:crud_a,crud_e:crud_e,crud_r:crud_r,crud_l:crud_l}, callback);
}
return false;
});
}
</script>
{/block}

View File

@ -0,0 +1,95 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">部门架构</h3>
{eq name="$id" value="0"}
<table class="layui-table">
<tr>
<td class="layui-td-gray">部门名称<font>*</font></td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入部门名称" lay-reqText="请输入部门名称" class="layui-input">
</td>
<td class="layui-td-gray">上级部门<font>*</font></td>
<td>
<select name="pid" lay-verify="required" lay-reqText="请选择上级部门">
<option value="0">作为顶级部门</option>
{volist name="department" id="v"}
<option value="{$v.id}" {eq name="$pid" value="$v.id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray-2">部门联系电话</td>
<td colspan="3">
<input type="text" name="phone" placeholder="请输入部门联系电话,可空" autocomplete="off" class="layui-input">
</td>
</tr>
</table>
{else/}
<table class="layui-table">
<tr>
<td class="layui-td-gray">部门名称<font>*</font></td>
<td>
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入部门名称" lay-reqText="请输入部门名称" class="layui-input">
</td>
<td class="layui-td-gray">上级部门<font>*</font></td>
<td>
<select name="pid" lay-verify="required" lay-reqText="请选择上级部门">
<option value="0">作为顶级部门</option>
{volist name="department" id="v"}
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray-2">部门负责人</td>
<td>
<select name="leader_id">
<option value="0">请选择部门负责人</option>
{volist name="users" id="v"}
<option value="{$v.id}" {eq name="detail.leader_id" value="$v.id"} selected{/eq}>{$v.nickname}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray-2">部门联系电话</td>
<td>
<input type="text" name="phone" value="{$detail.phone}" placeholder="请输入部门联系电话,可空" autocomplete="off" class="layui-input">
</td>
</tr>
</table>
{/eq}
<div class="py-3">
<input type="hidden" name="id" value="{$id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var form = layui.form,tool=layui.tool;
//监听提交
form.on('submit(webform)', function(data){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function () {
parent.location.reload();
}, 1000);
}
}
tool.post("/admin/department/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,80 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<div class="gg-form-bar border-t border-x">
<button class="layui-btn layui-btn-sm add-menu">+ 添加部门</button>
</div>
<div>
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool', 'treeGrid'];
function gouguInit() {
var treeGrid = layui.treeGrid,table = layui.table, tool = layui.tool;
var pageTable = treeGrid.render({
id: 'treeTable'
, elem: '#treeTable'
, idField: 'id'
, url: "/admin/department/index"
, cellMinWidth: 80
, treeId: 'id'//树形id字段名称
, treeUpId: 'pid'//树形父id字段名称
, treeShowName: 'title'//以树形式显示的字段
, height: 'full-0'
,isOpenDefault:true
, cols: [[
{ field: 'id', width: 100, title: 'ID号', align: 'center' }
, { field: 'pid', title: '上级部门ID',width: 120, align: 'center'}
, { field: 'title', title: '部门名称'}
, { field: 'leader', title: '部门负责人',width: 120, align: 'center'}
, { field: 'phone', title: '部门电话',width: 160,}
, { width:180, title: '操作', align: 'center', templet: function (d) {
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加下级部门</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
return html;
}
}
]]
, page: false
});
//表头工具栏事件
$('body').on('click','.add-menu', function(){
tool.side("/admin/department/add");
return;
});
//操作按钮
treeGrid.on('tool(treeTable)', function (obj) {
if (obj.event === 'add') {
tool.side("/admin/department/add?pid="+obj.data.id);
return;
}
if (obj.event === 'edit') {
tool.side("/admin/department/add?id="+obj.data.id);
return;
}
if (obj.event === 'del') {
layer.confirm('确定要删除吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/admin/department/delete", { id: obj.data.id }, callback);
layer.close(index);
});
}
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,405 @@
{extend name="common/base"/}
{block name="style"}
<style>
.upload-img {
width: 120px;
height: 90px;
overflow: hidden;
position: relative;
border: 1px solid #eee;
padding: 1px;
margin: 5px;
float: left;
}
.upload-close {position: absolute; top: 1px; right: 1px; }
.layui-upload-add {
position: relative;
margin:12px 0;
padding:16px 0;
font-size:14px;
box-sizing: border-box;
border: 1px solid #eee;
background-color: #fff;
text-align: center;
cursor: pointer;
color: #999;
}
.layui-upload-add .layui-icon{font-size:52px; color:#3c9cff}
.gallery-item{background-color:#fff; padding:12px 12px 0; margin:12px 0; box-sizing: border-box;border: 1px solid #eee;}
.img-filepath{max-width: 200px;max-height: 150px;}
.list-text{font-size:12px; padding:12px 12px 0 0;color:#969696;}
.list-text span{color:#646464;}
.gougu-upload-files{background-color: #ffffff; border:1px solid #e4e7ed;color: #c0c4cc;cursor: not-allowed; padding:0 12px; box-sizing: border-box; display: inline-block; font-size: inherit; height: 38px; line-height: 35px; margin-right:8px; border-radius:2px;}
.gougu-upload-tips{color:#969696}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<div class="layui-row layui-col-space12">
<div class="layui-col-md8">
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">图集标题<font>*</font></td>
<td><input type="text" name="title" lay-verify="required" lay-reqText="请输入图集标题" placeholder="请输入图集标题" class="layui-input"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">图集简介</td>
<td>
<textarea name="desc" placeholder="请输入图集简介200字以内" class="layui-textarea"></textarea>
</td>
</tr>
</table>
<div id="imgList"></div>
<div class="layui-upload-add" style="width:100% background-color:#F5FAFF">
<i class="layui-icon"></i>
<p>添加图片</p>
</div>
</div>
<div class="layui-col-md4">
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">分类<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择商品分类">
<option value="">请选择图集分类</option>
{volist name=":set_recursion(get_gallery_cate())" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">状态<font>*</font></td>
<td>
<input type="radio" name="status" value="1" title="正常" checked>
<input type="radio" name="status" value="0" title="下架">
</td>
</tr>
<tr>
<td class="layui-td-gray">关键字<font>*</font></td>
<td>
<input type="text" id="keyword_name" name="keyword_names" lay-verify="required" lay-reqText="请选择关键字"
placeholder="请选择关键字" class="layui-input" readonly>
<input type="hidden" id="keyword_id" name="keyword_ids">
</td>
</tr>
<tr>
<td class="layui-td-gray">封面图</td>
<td style="vertical-align:top">
<div class="layui-upload" style="text-align:center;">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn">上传图集封面图(尺寸640x360)</button>
<div class="layui-upload-list" id="demo1">
<img src="" width="100" style="width:200px;max-width:200px" />
<input type="hidden" name="thumb" value="">
</div>
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">作者/来源</td>
<td>
<input type="text" name="origin" class="layui-input" autocomplete="off" placeholder="请输入来源" value="">
</td>
</tr>
<tr>
<td class="layui-td-gray">来源链接</td>
<td>
<input type="text" name="origin_url" class="layui-input" autocomplete="off" placeholder="请输入来源链接" value="">
</td>
</tr>
<tr>
<td class="layui-td-gray">属性</td>
<td>
<select name="type">
<option value="">请选择属性</option>
<option value="1">精华</option>
<option value="2">热门</option>
<option value="3">推荐</option>
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">首页显示</td>
<td>
<input type="radio" name="is_home" value="1" title="是" checked>
<input type="radio" name="is_home" value="0" title="否">
</td>
</tr>
<tr>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" value="0" lay-verify="number" placeholder="请输入排序,数字" class="layui-input">
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="0">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">关闭</button>
</div>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool', 'tagpicker'];
function gouguInit() {
var form = layui.form, tool = layui.tool,element = layui.element, tagspicker = layui.tagpicker, upload = layui.upload;
var tags = new tagspicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
'tag_ids': 'keyword_id',
'tag_tags': 'keyword_name',
'height': 500,
'isDiy': 1
});
//缩略图上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
}
});
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
tool.tabClose();
return false;
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(94);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/gallery/add", data.field, callback);
return false;
});
$('.layui-upload-add').on('click',function(){
uploadImg(0);
})
function uploadImg(id){
layer.open({
'title':'上传资源',
'type':1,
'area': ['640px', '360px'],
'content':`<div class="layui-form p-3">
<div class="layui-form-item">
<label class="layui-form-label">来源:</label>
<div class="layui-input-block">
<input type="radio" name="uploadtype" lay-filter="type" value="1" title="本地上传" checked>
<input type="radio" name="uploadtype" lay-filter="type" value="2" title="网络图片">
</div>
</div>
<div id="uploadType1">
<div class="layui-form-item">
<label class="layui-form-label">文件:</label>
<div class="layui-input-block">
<span class="gougu-upload-files">.jpg、.jpeg、.gif、.png、.bmp</span><button type="button" class="layui-btn layui-btn-normal" id="uploadSelect">选择文件</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<span class="gougu-upload-tips">只能上传 .jpg、.jpeg、.gif、.png、.bmp 文件</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block" id="gougu-upload-choosed"></div>
</div>
<div class="layui-progress upload-progress" lay-showpercent="yes" lay-filter="upload-progress" style="margin-bottom:12px; margin-left:90px; width:320px; display:none;">
<div class="layui-progress-bar layui-bg-blue" lay-percent=""><span class="layui-progress-text"></span></div>
</div>
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="uploadAjax">开始上传</button>
</div>
</div>
</div>
<div id="uploadType2" style="display:none; width:480px;">
<div class="layui-form-item">
<label class="layui-form-label">URL地址</label>
<div class="layui-input-block">
<input type="text" name="img_url" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图片名称:</label>
<div class="layui-input-block">
<input type="text" name="img_name" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<span class="layui-btn" id="saveAjax">确定保存</span>
</div>
</div>
</div>
</div>`,
success: function(layero, index){
form.render();
form.on('radio(type)', function(data){
if(data.value==1){
$('#uploadType1').show();
$('#uploadType2').hide();
}
else{
$('#uploadType1').hide();
$('#uploadType2').show();
}
});
//选文件
upload.render({
elem: '#uploadSelect'
,url: '/admin/api/upload'
,auto: false
,accept: 'file' //普通文件
,exts: 'png|jpg|gif|jpeg|bmp' //只允许上传文件格式
,bindAction: '#uploadAjax'
,choose: function(obj){
obj.preview(function(index, file, result){
$('#gougu-upload-choosed').html('已选择:'+file.name);
});
}
,before: function(obj){
$('.upload-progress').show();
element.progress('upload-progress', '0%');
}
,progress: function(n, elem, e){
element.progress('upload-progress', n + '%');
}
,done: function(res){
layer.msg(res.msg);
if(res.code==0){
appendImg(res.data,id);
layer.close(index);
}
}
});
$('#saveAjax').on('click',function(){
let url=$('[name="img_url"]').val();
let name=$('[name="img_name"]').val();
if(url == ''){
layer.msg('请输入图片URL');
return false;
}
if(name == ''){
layer.msg('请输入图片名称');
return false;
}
let res={
filepath:url,
name:name,
id:0
}
layer.close(index);
appendImg(res,id);
})
}
});
}
function appendImg(res,id){
if(id == 0){
id = Date.now();
$('#imgList').append(`<div class="layui-row gallery-item" id="item_${id}">
<div class="layui-col-md3">
<img src="${res.filepath}" class="img-filepath">
<p class="list-text">原名称:<span class="img-name">${res.name}</span></p>
</div>
<div class="layui-col-md9">
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label">标题:</label>
<div class="layui-input-block">
<input type="text" name="img_title[]" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label">摘要:</label>
<div class="layui-input-block">
<textarea name="img_desc[]" placeholder="" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-row layui-col-space12 layui-form-item layui-form-item-sm">
<div class="layui-col-lg6">
<label class="layui-form-label">链接:</label>
<div class="layui-input-block">
<input type="text" name="img_link[]" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-col-lg3">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="text" name="img_sort[]" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-col-lg3" style="text-align:right;">
<div class="layui-btn-group">
<input type="hidden" name="img_file[]" class="img-file-input" value="${res.id}">
<input type="hidden" name="img_filepath[]" class="img-filepath-input" value="${res.filepath}">
<input type="hidden" name="img_name[]" class="img-name-input" value="${res.name}">
<span class="layui-btn layui-btn-sm item-edit" title="编辑" data-id="${id}">编辑</span>
<span class="layui-btn layui-btn-sm layui-btn-danger item-del" data-id="${id}" title="删除">删除</span>
</div>
</div>
</div>
</div>
</div>`);
}
else{
$('#item_'+id).find('.img-filepath').attr('src',res.filepath);
$('#item_'+id).find('.img-name').html(res.name);
$('#item_'+id).find('.img-filepath-input').val(res.filepath);
$('#item_'+id).find('.img-name-input').val(res.name);
$('#item_'+id).find('.img-file-input').val(res.id);
}
}
$('#imgList').on('click','.item-edit',function(){
let id=$(this).data('id');
uploadImg(id);
});
$('#imgList').on('click','.item-del',function(){
let id=$(this).data('id');
$('#item_'+id).remove();
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -5,18 +5,18 @@
<form class="layui-form gg-form-bar border-t border-x">
<div class="layui-input-inline">
<select name="cate_id">
<option value="">请选择商品分类</option>
{volist name=":set_recursion(get_goods_cate())" id="v"}
<option value="">请选择图集分类</option>
{volist name=":set_recursion(get_gallery_cate())" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="ID/标题/分类/描述/内容" class="layui-input" autocomplete="off" />
<input type="text" name="keywords" placeholder="ID/标题/分类/摘要" class="layui-input" autocomplete="off" />
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
</form>
<table class="layui-hide" id="goods" lay-filter="goods"></table>
<table class="layui-hide" id="gallery" lay-filter="gallery"></table>
</div>
<script type="text/html" id="status">
@ -27,11 +27,11 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-btn layui-btn-normal layui-btn-sm tab-a" data-title="添加商品" data-href="/admin/goods/add">+ 添加商品</span>
<span class="layui-btn layui-btn-sm tab-a" data-title="添加图集" data-href="/admin/gallery/add">+ 添加图集</span>
</div>
</script>
<script type="text/html" id="barDemo">
<div class="layui-btn-group"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>
<div class="layui-btn-group"><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</a><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>
</script>
{/block}
<!-- /主体 -->
@ -43,10 +43,10 @@
function gouguInit() {
var table = layui.table,tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#goods',
title: '商品列表',
elem: '#gallery',
title: '图集列表',
toolbar: '#toolbarDemo',
url: '/admin/goods/index', //数据接口
url: '/admin/gallery/datalist', //数据接口
page: true, //开启分页
limit: 20,
cols: [
@ -56,11 +56,6 @@
title: '编号',
align: 'center',
width: 80
}, {
field: 'sort',
title: '排序',
align: 'center',
width: 80
}, {
field: 'cate_title',
title: '分类',
@ -69,15 +64,15 @@
field: 'title',
title: '标题'
},{
field: 'base_price',
title: '市场价格',
field: 'count',
title: '图片数',
align: 'center',
width: 100
width: 80
},{
field: 'price',
title: '实际价格',
field: 'sort',
title: '排序',
align: 'center',
width: 100
width: 80
}, {
field: 'status',
title: '状态',
@ -90,11 +85,21 @@
toolbar: '#is_home',
align: 'center',
width: 90
},{
field: 'admin_name',
title: '创建人',
align: 'center',
width: 90
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 150
}, {
field: 'right',
title: '操作',
toolbar: '#barDemo',
width: 100,
width: 150,
align: 'center'
}
]
@ -102,10 +107,13 @@
});
//监听行工具事件
table.on('tool(goods)', function(obj) {
table.on('tool(gallery)', function(obj) {
var data = obj.data;
if (obj.event === 'edit') {
tool.tabAdd('/admin/goods/add?id='+obj.data.id,'编辑商品'+obj.data.id);
if (obj.event === 'view') {
tool.side('/admin/gallery/read?id='+obj.data.id);
}
else if (obj.event === 'edit') {
tool.tabAdd('/admin/gallery/edit?id='+obj.data.id,'编辑图集'+obj.data.id);
}
else if (obj.event === 'del') {
layer.confirm('确定要删除吗?', {
@ -118,7 +126,7 @@
obj.del();
}
}
tool.delete("/admin/goods/delete", { id: data.id }, callback);
tool.delete("/admin/gallery/del", { id: data.id }, callback);
layer.close(index);
});
}

View File

@ -0,0 +1,454 @@
{extend name="common/base"/}
{block name="style"}
<style>
.upload-img {
width: 120px;
height: 90px;
overflow: hidden;
position: relative;
border: 1px solid #eee;
padding: 1px;
margin: 5px;
float: left;
}
.upload-close {position: absolute;top: 1px;right: 1px;}
.layui-upload-add {
position: relative;
margin:12px 0;
padding:16px 0;
font-size:14px;
box-sizing: border-box;
border: 1px solid #eee;
background-color: #fff;
text-align: center;
cursor: pointer;
color: #999;
}
.layui-upload-add .layui-icon{font-size:52px; color:#3c9cff}
.gallery-item{background-color:#fff; padding:12px 12px 0; margin:12px 0; box-sizing: border-box;border: 1px solid #eee;}
.img-filepath{max-width: 200px;max-height: 150px;}
.list-text{font-size:12px; padding:12px 12px 0 0;color:#969696;}
.list-text span{color:#646464;}
.gougu-upload-files{background-color: #ffffff; border:1px solid #e4e7ed;color: #c0c4cc;cursor: not-allowed; padding:0 12px; box-sizing: border-box; display: inline-block; font-size: inherit; height: 38px; line-height: 35px; margin-right:8px; border-radius:2px;}
.gougu-upload-tips{color:#969696}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<div class="layui-row layui-col-space12">
<div class="layui-col-md8">
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">图集标题<font>*</font></td>
<td><input type="text" name="title" value="{$detail.title}" lay-verify="required" lay-reqText="请输入图集标题" placeholder="请输入图集标题" class="layui-input"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">图集简介</td>
<td>
<textarea name="desc" placeholder="请输入图集简介200字以内" class="layui-textarea">{$detail.desc}</textarea>
</td>
</tr>
</table>
<div id="imgList">
{volist name="$detail.gallery_array" id="vo"}
<div class="layui-row gallery-item" id="item_{$vo.id}">
<div class="layui-col-md3">
<img src="{$vo.filepath}" class="img-filepath">
<p class="list-text">原名称:<span class="img-name">{$vo.name}</span></p>
</div>
<div class="layui-col-md9">
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label">标题:</label>
<div class="layui-input-block">
<input type="text" name="img_title[]" value="{$vo.title}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label">摘要:</label>
<div class="layui-input-block">
<textarea name="img_desc[]" value="{$vo.desc}" placeholder="" class="layui-textarea">{$vo.desc}</textarea>
</div>
</div>
<div class="layui-row layui-col-space12 layui-form-item layui-form-item-sm">
<div class="layui-col-lg6">
<label class="layui-form-label">链接:</label>
<div class="layui-input-block">
<input type="text" name="img_link[]" value="{$vo.link}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-col-lg3">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="text" name="img_sort[]" value="{$vo.sort}" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-col-lg3" style="text-align:right;">
<div class="layui-btn-group">
<input type="hidden" name="img_file[]" class="img-file-input" value="{$vo.file_id}">
<input type="hidden" name="img_filepath[]" class="img-filepath-input" value="{$vo.filepath}">
<input type="hidden" name="img_name[]" class="img-name-input" value="{$vo.name}">
<span class="layui-btn layui-btn-sm item-edit" title="编辑" data-id="{$vo.id}">编辑</span>
<span class="layui-btn layui-btn-sm layui-btn-danger item-del" data-id="{$vo.id}" title="删除">删除</span>
</div>
</div>
</div>
</div>
</div>
{/volist}
</div>
<div class="layui-upload-add" style="width:100%; background-color:#F5FAFF">
<i class="layui-icon"></i>
<p>添加图片</p>
</div>
</div>
<div class="layui-col-md4">
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">分类<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择商品分类">
<option value="">请选择商品分类</option>
{volist name=":set_recursion(get_gallery_cate())" id="v"}
<option value="{$v.id}" {eq name="$detail.cate_id" value="$v.id" }selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">状态<font>*</font></td>
<td>
<input type="radio" name="status" value="1" title="正常" {eq name="$detail.status" value="1" }checked{/eq}>
<input type="radio" name="status" value="0" title="下架" {eq name="$detail.status" value="0" }checked{/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray">关键字<font>*</font></td>
<td>
<input type="text" id="keyword_name" name="keyword_names" lay-verify="required" lay-reqText="请选择关键字"
placeholder="请选择关键字" class="layui-input" value="{$detail.keyword_names}" readonly>
<input type="hidden" id="keyword_id" name="keyword_ids" value="{$detail.keyword_ids}">
</td>
</tr>
<tr>
<td class="layui-td-gray">封面图</td>
<td style="vertical-align:top">
<div class="layui-upload" style="text-align:center;">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn">上传图集封面图(尺寸640x360)</button>
<div class="layui-upload-list" id="demo1">
<img src="{$detail.thumb|get_file}" style="width:200px;max-width:200px" />
<input type="hidden" name="thumb" value="{$detail.thumb}">
</div>
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">作者/来源</td>
<td>
<input type="text" name="origin" class="layui-input" autocomplete="off" placeholder="请输入来源" value="{$detail.origin}">
</td>
</tr>
<tr>
<td class="layui-td-gray">来源链接</td>
<td>
<input type="text" name="origin_url" class="layui-input" autocomplete="off" placeholder="请输入来源链接" value="{$detail.origin_url}">
</td>
</tr>
<tr>
<td class="layui-td-gray">属性</td>
<td>
<select name="type">
<option value="">请选择属性</option>
<option value="1" {eq name="$detail.type" value="1" }selected{/eq}>精华</option>
<option value="2" {eq name="$detail.type" value="2" }selected{/eq}>热门</option>
<option value="3" {eq name="$detail.type" value="3" }selected{/eq}>推荐</option>
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">首页显示</td>
<td>
<input type="radio" name="is_home" value="1" title="是" {eq name="$detail.is_home" value="1"
}checked{/eq}>
<input type="radio" name="is_home" value="0" title="否" {eq name="$detail.is_home" value="0"
}checked{/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" value="{$detail.sort}" lay-verify="number" placeholder="请输入排序,数字" class="layui-input">
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$detail.id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">关闭</button>
</div>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool', 'tagpicker'];
function gouguInit() {
var form = layui.form, tool = layui.tool,element = layui.element, tagspicker = layui.tagpicker, upload = layui.upload;
var tags = new tagspicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
'tag_ids': 'keyword_id',
'tag_tags': 'keyword_name',
'height': 500,
'isDiy': 1
});
//缩略图上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
}
});
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
tool.tabClose();
return false;
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(94);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/gallery/edit", data.field, callback);
return false;
});
$('.layui-upload-add').on('click',function(){
uploadImg(0);
})
function uploadImg(id){
layer.open({
'title':'上传资源',
'type':1,
'area': ['600px', '360px'],
'content':`<div class="layui-form p-3">
<div class="layui-form-item">
<label class="layui-form-label">来源:</label>
<div class="layui-input-block">
<input type="radio" name="uploadtype" lay-filter="type" value="1" title="本地上传" checked>
<input type="radio" name="uploadtype" lay-filter="type" value="2" title="网络图片">
</div>
</div>
<div id="uploadType1">
<div class="layui-form-item">
<label class="layui-form-label">文件:</label>
<div class="layui-input-block">
<span class="gougu-upload-files">.jpg、.jpeg、.gif、.png、.bmp</span><button type="button" class="layui-btn layui-btn-normal" id="uploadSelect">选择文件</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<span class="gougu-upload-tips">只能上传 .jpg、.jpeg、.gif、.png、.bmp 文件</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block" id="gougu-upload-choosed"></div>
</div>
<div class="layui-progress upload-progress" lay-showpercent="yes" lay-filter="upload-progress" style="margin-bottom:12px; margin-left:90px; width:320px; display:none;">
<div class="layui-progress-bar layui-bg-blue" lay-percent=""><span class="layui-progress-text"></span></div>
</div>
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="uploadAjax">开始上传</button>
</div>
</div>
</div>
<div id="uploadType2" style="display:none; width:480px;">
<div class="layui-form-item">
<label class="layui-form-label">URL地址</label>
<div class="layui-input-block">
<input type="text" name="img_url" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图片名称:</label>
<div class="layui-input-block">
<input type="text" name="img_name" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<span class="layui-btn" id="saveAjax">确定保存</span>
</div>
</div>
</div>
</div>`,
success: function(layero, index){
form.render();
form.on('radio(type)', function(data){
if(data.value==1){
$('#uploadType1').show();
$('#uploadType2').hide();
}
else{
$('#uploadType1').hide();
$('#uploadType2').show();
}
});
//选文件
upload.render({
elem: '#uploadSelect'
,url: '/admin/api/upload'
,auto: false
,accept: 'file' //普通文件
,exts: 'png|jpg|gif|jpeg|bmp' //只允许上传文件格式
,bindAction: '#uploadAjax'
,choose: function(obj){
obj.preview(function(index, file, result){
$('#gougu-upload-choosed').html('已选择:'+file.name);
});
}
,before: function(obj){
$('.upload-progress').show();
element.progress('upload-progress', '0%');
}
,progress: function(n, elem, e){
element.progress('upload-progress', n + '%');
}
,done: function(res){
layer.msg(res.msg);
if(res.code==0){
appendImg(res.data,id);
layer.close(index);
}
}
});
$('#saveAjax').on('click',function(){
let url=$('[name="img_url"]').val();
let name=$('[name="img_name"]').val();
if(url == ''){
layer.msg('请输入图片URL');
return false;
}
if(name == ''){
layer.msg('请输入图片名称');
return false;
}
let res={
filepath:url,
name:name,
id:0
}
layer.close(index);
appendImg(res,id);
})
}
});
}
function appendImg(res,id){
if(id == 0){
id = Date.now();
$('#imgList').append(`<div class="layui-row gallery-item" id="item_${id}">
<div class="layui-col-md3">
<img src="${res.filepath}" class="img-filepath">
<p class="list-text">原名称:<span class="img-name">${res.name}</span></p>
</div>
<div class="layui-col-md9">
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label">标题:</label>
<div class="layui-input-block">
<input type="text" name="img_title[]" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-item-sm">
<label class="layui-form-label">摘要:</label>
<div class="layui-input-block">
<textarea name="img_desc[]" placeholder="" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-row layui-col-space12 layui-form-item layui-form-item-sm">
<div class="layui-col-lg6">
<label class="layui-form-label">链接:</label>
<div class="layui-input-block">
<input type="text" name="img_link[]" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-col-lg3">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="text" name="img_sort[]" placeholder="" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-col-lg3" style="text-align:right;">
<div class="layui-btn-group">
<input type="hidden" name="img_file[]" class="img-file-input" value="${res.id}">
<input type="hidden" name="img_filepath[]" class="img-filepath-input" value="${res.filepath}">
<input type="hidden" name="img_name[]" class="img-name-input" value="${res.name}">
<span class="layui-btn layui-btn-sm item-edit" title="编辑" data-id="${id}">编辑</span>
<span class="layui-btn layui-btn-sm layui-btn-danger item-del" data-id="${id}" title="删除">删除</span>
</div>
</div>
</div>
</div>
</div>`);
}
else{
$('#item_'+id).find('.img-filepath').attr('src',res.filepath);
$('#item_'+id).find('.img-name').html(res.name);
$('#item_'+id).find('.img-filepath-input').val(res.filepath);
$('#item_'+id).find('.img-name-input').val(res.name);
$('#item_'+id).find('.img-file-input').val(res.id);
}
}
$('#imgList').on('click','.item-edit',function(){
let id=$(this).data('id');
uploadImg(id);
});
$('#imgList').on('click','.item-del',function(){
let id=$(this).data('id');
$('#item_'+id).remove();
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,138 @@
{extend name="common/base"/}
{block name="style"}
<style>
.upload-img {
width: 120px;
height: 90px;
overflow: hidden;
position: relative;
border: 1px solid #eee;
padding: 1px;
margin: 5px;
float: left;
}
.upload-close {
position: absolute;
top: 1px;
right: 1px;
}
.layui-upload-add {
position: relative;
margin:12px 0;
padding:16px 0;
font-size:14px;
box-sizing: border-box;
border: 1px solid #eee;
background-color: #fff;
text-align: center;
cursor: pointer;
color: #999;
}
.layui-upload-add .layui-icon{font-size:52px; color:#3c9cff}
.gallery-item{background-color:#fff; padding:12px 12px 0; margin:12px 0; box-sizing: border-box;border: 1px solid #eee;}
.img-filepath{max-width: 200px;max-height: 150px;}
.list-text{font-size:12px; padding:12px 12px 0 0;color:#969696;}
.list-text span{color:#646464;}
.gougu-upload-files{background-color: #ffffff; border:1px solid #e4e7ed;color: #c0c4cc;cursor: not-allowed; padding:0 12px; box-sizing: border-box; display: inline-block; font-size: inherit; height: 38px; line-height: 35px; margin-right:8px; border-radius:2px;}
.gougu-upload-tips{color:#969696}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">图集标题</td>
<td>{$detail.title}</td>
<td class="layui-td-gray">所属分类</td>
<td>
{volist name=":set_recursion(get_gallery_cate())" id="v"}
{eq name="$detail.cate_id" value="$v.id" }{$v.title}{/eq}
{/volist}
</td>
<td class="layui-td-gray">图集状态</td>
<td>
{eq name="$detail.status" value="1" }正常{/eq}
{eq name="$detail.status" value="0" }下架{/eq}
</td>
</tr>
<tr>
<td class="layui-td-gray">关键字</td>
<td>
{$detail.keyword_names}
</td>
<td class="layui-td-gray">属性</td>
<td>
{eq name="$detail.type" value="1" }精华{/eq}
{eq name="$detail.type" value="2" }热门{/eq}
{eq name="$detail.type" value="3" }推荐{/eq}
</td>
<td class="layui-td-gray">首页显示</td>
<td>
{eq name="$detail.is_home" value="1"}是{/eq}
{eq name="$detail.is_home" value="0"}否{/eq}
</td>
</tr>
<tr>
<td class="layui-td-gray">作者/来源</td>
<td>{$detail.origin}</td>
<td class="layui-td-gray">来源链接</td>
<td>{$detail.origin_url}</td>
<td class="layui-td-gray">排序</td>
<td>{$detail.sort}</td>
</tr>
<tr>
<td class="layui-td-gray">图集简介</td>
<td colspan="3">{$detail.desc}</td>
<td class="layui-td-gray">封面图</td>
<td>
<img src="{$detail.thumb|get_file}" style="width:200px;max-width:200px" />
</td>
</tr>
</table>
<div id="imgList">
{volist name="$detail.gallery_array" id="vo"}
<div class="layui-row gallery-item" id="item_{$vo.id}">
<div class="layui-col-md3">
<img src="{$vo.filepath}" class="img-filepath">
<p class="py-2">名称:{$vo.name}</p>
</div>
<div class="layui-col-md9">
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">标题</td>
<td colspan="3">{$vo.title}</td>
</tr>
<tr>
<td class="layui-td-gray">摘要</td>
<td colspan="3">{$vo.desc}</td>
</tr>
<tr>
<td class="layui-td-gray">链接</td>
<td>{$vo.link}</td>
<td class="layui-td-gray">排序</td>
<td>{$vo.sort}</td>
</tr>
</table>
</div>
</div>
{/volist}
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,71 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">新建图集分类</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">父级分类<font>*</font></td>
<td>
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
<option value="0">作为顶级分类</option>
{volist name=":set_recursion(get_gallery_cate())" id="v"}
<option value="{$v.id}" {eq name="$pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">分类名称<font>*</font></td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" value="" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
</td>
<td class="layui-td-gray">关键词</td>
<td>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input" value="">
</td>
</tr>
<tr>
<td class="layui-td-gray">描述</td>
<td colspan="3">
<textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea"></textarea>
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="0" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function () {
parent.location.reload();
}, 1000);
}
}
tool.post("/admin/gallery_cate/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,104 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<div class="gg-form-bar border-t border-x">
<button class="layui-btn layui-btn-sm add-menu">+ 添加图集分类</button>
</div>
<table class="layui-hide" id="gallery_cate" lay-filter="gallery_cate"></table>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool', 'treeGrid'];
function gouguInit() {
var treeGrid = layui.treeGrid,table = layui.table, tool = layui.tool;
var pageTable = treeGrid.render({
id:'gallery_cate'
,elem: '#gallery_cate'
,idField:'id'
,url:'/admin/gallery_cate/datalist'
,cellMinWidth: 300
,treeId:'id'//树形id字段名称
,treeUpId:'pid'//树形父id字段名称
,treeShowName:'title'//以树形式显示的字段
,page:false
,cols: [
[
{
fixed: 'left',
field: 'id',
title: '编号',
align: 'center',
width: 80
},{
field: 'sort',
title: '排序',
align: 'center',
width: 100
},{
field: 'title',
title: '分类名称',
width: 200
},{
field: 'pid',
title: '父级ID',
align: 'center',
width: 100
},{
field: 'keywords',
title: '关键字',
width: 200
},{
field: 'desc',
title: '分类描述'
},
{width:160,title: '操作', align:'center',templet: function(d){
var html = '<span class="layui-btn-group"><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</span><span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span><span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span></span>';
return html;
}
}
]
]
});
//监听表头工具栏事件
$('.add-menu').on('click', function(){
tool.side("/admin/gallery_cate/add");
return false;
});
//监听表格行工具事件
treeGrid.on('tool(gallery_cate)', function(obj) {
var data = obj.data;
if (obj.event === 'add') {
tool.side('/admin/gallery_cate/add?pid='+obj.data.id);
}
else if (obj.event === 'edit') {
tool.side('/admin/gallery_cate/edit?id='+obj.data.id);
}
else if (obj.event === 'del') {
layer.confirm('确定要删除该记录吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/admin/gallery_cate/del", { id: data.id }, callback);
layer.close(index);
});
}
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,71 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">编辑图集分类</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">父级分类<font>*</font></td>
<td>
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
<option value="0">作为顶级分类</option>
{volist name=":set_recursion(get_gallery_cate())" id="v"}
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort}">
</td>
</tr>
<tr>
<td class="layui-td-gray">分类名称<font>*</font></td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" class="layui-input" value="{$detail.title}">
</td>
<td class="layui-td-gray">关键词</td>
<td>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input" value="{$detail.keywords}">
</td>
</tr>
<tr>
<td class="layui-td-gray">描述</td>
<td colspan="3">
<textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea">{$detail.desc}</textarea>
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$detail.id}"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function () {
parent.location.reload();
}, 1000);
}
}
tool.post("/admin/gallery_cate/edit", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -17,37 +17,16 @@
top: 1px;
right: 1px;
}
.editormd-code-toolbar select {
display: inline-block
}
.editormd li {
list-style: inherit;
}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<form class="layui-form p-4">
<h3 class="pb-3">新建商品</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">商品标题<font>*</font></td>
<td colspan="3"><input type="text" name="title" lay-verify="required" lay-reqText="请输入商品标题"
placeholder="请输入商品标题" class="layui-input"></td>
<td class="layui-td-gray">状态<font>*</font></td>
<td>
<input type="radio" name="status" value="1" title="正常" checked>
<input type="radio" name="status" value="0" title="下架">
</td>
</tr>
<tr>
<td class="layui-td-gray">关键字<font>*</font></td>
<td colspan="3">
<input type="text" id="keyword_name" name="keyword_names" lay-verify="required" lay-reqText="请选择关键字"
placeholder="请选择关键字" class="layui-input" readonly>
<input type="hidden" id="keyword_id" name="keyword_ids">
</td>
<td colspan="5"><input type="text" name="title" lay-verify="required" lay-reqText="请输入商品标题" placeholder="请输入商品标题" class="layui-input"></td>
<td class="layui-td-gray">商品分类<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择商品分类">
@ -59,34 +38,40 @@
</td>
</tr>
<tr>
<td class="layui-td-gray">商品卖点<font>*</font></td>
<td colspan="3">
<input type="text" name="tips" lay-verify="required" lay-reqText="请输入商品卖点" placeholder="一句话描述商品卖点30字以内"
class="layui-input">
<td class="layui-td-gray">关键字<font>*</font></td>
<td colspan="5">
<input type="text" id="keyword_name" name="keyword_names" lay-verify="required" lay-reqText="请选择关键字" placeholder="请选择关键字" class="layui-input" readonly>
<input type="hidden" id="keyword_id" name="keyword_ids">
</td>
<td class="layui-td-gray" rowspan="3">缩略图<font>*</font></td>
<td rowspan="3" style="vertical-align:top">
<div class="layui-upload" style="text-align:center;">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn">上传商品封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="demo1">
<button type="button" class="layui-btn layui-btn-sm" id="upload_btn_thumb">上传商品封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="upload_box_thumb">
<img src="" width="100" style="width:200px;max-width:200px" />
<input type="hidden" name="thumb" value="" lay-verify="required" lay-reqText="请上传缩略图">
</div>
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">商品卖点<font>*</font></td>
<td colspan="5">
<input type="text" name="tips" lay-verify="required" lay-reqText="请输入商品卖点" placeholder="一句话描述商品卖点30字以内" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">商品简介</td>
<td colspan="3">
<td colspan="5">
<textarea name="desc" placeholder="请输入商品简介200字以内" class="layui-textarea"></textarea>
</td>
</tr>
<tr>
<td class="layui-td-gray">商品标签<font>*</font></td>
<td colspan="3">
<td colspan="7">
<input type="checkbox" name="tag_values[]" title="正品保证" lay-skin="primary" value="1" checked />
<input type="checkbox" name="tag_values[]" title="一年保修" lay-skin="primary" value="2" checked />
<input type="checkbox" name="tag_values[]" title="七天退换(拆封后不支持)" lay-skin="primary" value="3" />
<input type="checkbox" name="tag_values[]" title="七天退换(拆封后不支持)" lay-skin="primary" value="3" />
<input type="checkbox" name="tag_values[]" title="赠运费险" lay-skin="primary" value="4" />
<input type="checkbox" name="tag_values[]" title="闪电发货" lay-skin="primary" value="5" />
<input type="checkbox" name="tag_values[]" title="售后无忧" lay-skin="primary" value="6" />
@ -95,28 +80,24 @@
<tr>
<td class="layui-td-gray">市场价格<font>*</font></td>
<td>
<input type="text" name="base_price" lay-verify="required|number" lay-reqText="请输入市场价格"
placeholder="请输入市场价格" class="layui-input">
<input type="text" name="base_price" lay-verify="required|number" lay-reqText="请输入市场价格" placeholder="请输入市场价格" class="layui-input">
</td>
<td class="layui-td-gray">实际价格<font>*</font></td>
<td>
<input type="text" name="price" lay-verify="required|number" lay-reqText="请输入实际价格" placeholder="请输入实际价格"
class="layui-input">
<input type="text" name="price" lay-verify="required|number" lay-reqText="请输入实际价格" placeholder="请输入实际价格" class="layui-input">
</td>
<td class="layui-td-gray">商品库存<font>*</font></td>
<td>
<input type="text" name="stocks" lay-verify="required|number" lay-reqText="请输入商品库存" placeholder="请输入商品库存" class="layui-input">
</td>
<td class="layui-td-gray">是否包邮<font>*</font></td>
<td colspan="5">
<input type="radio" name="is_mail" value="1" title="是" checked lay-verify="otherReq"
lay-reqText="请选择是否包邮">
<td>
<input type="radio" name="is_mail" value="1" title="是" checked lay-verify="otherReq" lay-reqText="请选择是否包邮">
<input type="radio" name="is_mail" value="0" title="否" lay-verify="otherReq" lay-reqText="请选择是否包邮">
</td>
</tr>
<tr>
<td class="layui-td-gray">首页显示</td>
<td>
<input type="radio" name="is_home" value="1" title="是" checked>
<input type="radio" name="is_home" value="0" title="否">
</td>
<td class="layui-td-gray">属性</td>
<td class="layui-td-gray">商品属性</td>
<td>
<select name="type">
<option value="">请选择属性</option>
@ -129,10 +110,20 @@
<td>
<input type="text" name="sort" value="0" lay-verify="number" placeholder="请输入排序,数字" class="layui-input">
</td>
<td class="layui-td-gray">首页显示</td>
<td>
<input type="radio" name="is_home" value="1" title="是" checked>
<input type="radio" name="is_home" value="0" title="否">
</td>
<td class="layui-td-gray">状态<font>*</font></td>
<td>
<input type="radio" name="status" value="1" title="正常" checked>
<input type="radio" name="status" value="0" title="下架">
</td>
</tr>
<tr>
<td class="layui-td-gray">商品图集</td>
<td colspan="5">
<td colspan="7">
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn2">上传商品图</button>
<div class="layui-upload-list clearfix" id="demo2">
@ -141,35 +132,18 @@
</div>
</td>
</tr>
{eq name="$editor" value="1"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">商品介绍<font>*</font><span
style="margin-left:30px; color: red">当前为TinyMCE富文本编辑器可在【系统管理->系统配置->其他配置】中切换为mardown编辑器</span></td>
<td colspan="8" class="layui-td-gray" style="text-align:left">商品介绍<font>*</font></td>
</tr>
<tr>
<td colspan="6">
<textarea class="layui-textarea" id="container"></textarea>
<td colspan="8">
<textarea class="layui-textarea" id="container_content"></textarea>
</td>
</tr>
{else/}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">商品介绍<font>*</font><span
style="margin-left:30px; color: red">当前为mardown编辑器可在【系统管理->系统配置->其他配置】中切换为TinyMCE富文本编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<div>
<textarea id="mdContent" style="display:none;"></textarea>
<div id="docContent"></div>
</div>
</td>
</tr>
{/eq}
</table>
<div class="py-3">
<div class="pt-3">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">返回</button>
</div>
</form>
{/block}
@ -194,20 +168,60 @@
this.splice(index, 1);
}
};
const editorType = '{$editor}';
var moduleInit;
if (editorType == 1) {
moduleInit = ['tool', 'tagpicker', 'tinymce'];
}
else {
moduleInit = ['tool', 'tagpicker', 'editormd'];
}
var moduleInit = ['tool','tagpicker','tinymce'];
function gouguInit() {
var form = layui.form, tool = layui.tool, tagspicker = layui.tagpicker, upload = layui.upload;
var form = layui.form, tool = layui.tool,tagpicker = layui.tagpicker;
var tags = new tagspicker({
//上传缩略图
var upload_thumb = layui.upload.render({
elem: '#upload_btn_thumb',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#upload_box_thumb input').attr('value', res.data.id);
$('#upload_box_thumb img').attr('src', res.data.filepath);
}
});
//banner图上传
var uploadInst2 = layui.upload.render({
elem: '#uploadBtn2'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.push(res.data.id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#demo2').append('<div class="upload-img img-cover" id="uploadImg' + res.data.id + '"><div class="gg-img-cover cover-4-3"><img src="' + res.data.filepath + '"><div class="upload-close"><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delimg" data-id="' + res.data.id + '">删除</a></div></div>');
}
});
$('#demo2').on('click', '[lay-event="delimg"]', function () {
var _id = $(this).data('id');
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.remove(_id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#uploadImg' + _id).remove();
})
var tags = new tagpicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
'tag_ids': 'keyword_id',
@ -216,6 +230,12 @@
'isDiy': 1
});
//商品描述富文本编辑器
var edit = layui.tinymce.render({
selector: '#container_content',
height: 500
});
//自定义验证规则
form.verify({
otherReq: function (value, item) {
@ -242,113 +262,23 @@
}
}
});
//缩略图上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container_content'].getContent();
if (data.field.content == '') {
layer.msg('请先完善商品描述内容');
return false;
}
});
//广告图上传
var uploadInst2 = upload.render({
elem: '#uploadBtn2'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
//上传成功
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.push(res.data.id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#demo2').append('<div class="upload-img img-cover" id="uploadImg' + res.data.id + '"><div class="gg-img-cover cover-4-3"><img src="' + res.data.filepath + '"><div class="upload-close"><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delimg" data-id="' + res.data.id + '">删除</a></div></div>');
}
});
$('#demo2').on('click', '[lay-event="delimg"]', function () {
var _id = $(this).data('id');
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.remove(_id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#uploadImg' + _id).remove();
})
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
tool.tabClose();
tool.post("/admin/goods/add", data.field, callback);
return false;
});
if (editorType == 1) {
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善商品内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(77);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/goods/add", data.field, callback);
return false;
});
}
else {
var editor = layui.editormd;
var edit = editor.render('docContent', {
markdown: document.getElementById('mdContent').value
});
//监听提交
form.on('submit(webform)', function (data) {
if (data.field.mdContent == '') {
layer.msg('请先完善商品内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(77);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/goods/add", data.field, callback);
return false;
});
}
}
</script>
{/block}

View File

@ -0,0 +1,192 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<form class="layui-form gg-form-bar border-t border-x">
<div class="layui-input-inline">
<select name="cate_id">
<option value="">请选择商品分类</option>
{volist name=":set_recursion(get_goods_cate())" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="请输入关键字" class="layui-input" autocomplete="off" />
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="searchform">提交搜索</button>
</form>
<table class="layui-hide" id="goods" lay-filter="goods"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-btn layui-btn-sm" lay-event="add" data-title="添加商品">+ 添加商品</span>
</div>
</script>
<script type="text/html" id="status">
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok green{{# } else { }}layui-icon-close red{{# } }}"></i>
</script>
<script type="text/html" id="is_home">
<i class="layui-icon {{# if(d.is_home == 1){ }}layui-icon-ok green{{# } else { }}layui-icon-close red{{# } }}"></i>
</script>
<script type="text/html" id="barDemo">
<div class="layui-btn-group"><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="read">查看</a><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table,tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#goods',
title: '商品列表',
toolbar: '#toolbarDemo',
url: '/admin/goods/datalist',
page: true,
limit: 20,
cellMinWidth: 300,
cols: [
[
{
fixed: 'left',
field: 'id',
title: '编号',
align: 'center',
width: 80
},{
field: 'cate_title',
title: '所属分类',
align: 'center',
width: 100
},{
field: 'type_str',
title: '属性',
align: 'center',
width: 80
},{
field: 'title',
title: '商品名称',
},{
field: 'base_price',
title: '市场价格',
align: 'center',
width: 90
},{
field: 'price',
title: '实际价格',
align: 'center',
width: 90
},{
field: 'stocks',
title: '商品库存',
align: 'center',
width: 80
},{
field: 'sales',
title: '商品销量',
align: 'center',
width: 80
},{
field: 'read',
title: '阅读量',
align: 'center',
width: 80
},{
field: 'is_home',
title: '首页显示',
toolbar: '#is_home',
align: 'center',
width: 90
},{
field: 'sort',
title: '排序',
align: 'center',
width: 80
},{
field: 'status',
title: '上下架',
toolbar: '#status',
align: 'center',
width: 80
},{
field: 'admin_name',
title: '创建人',
align: 'center',
width: 100
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 160
},{
fixed: 'right',
field: 'right',
title: '操作',
toolbar: '#barDemo',
width: 136,
align: 'center'
}
]
]
});
//监听表头工具栏事件
table.on('toolbar(goods)', function(obj){
if (obj.event === 'add') {
tool.side("/admin/goods/add");
return false;
}
});
//监听表格行工具事件
table.on('tool(goods)', function(obj) {
var data = obj.data;
if (obj.event === 'read') {
tool.side('/admin/goods/read?id='+obj.data.id);
}
else if (obj.event === 'edit') {
tool.side('/admin/goods/edit?id='+obj.data.id);
}
else if (obj.event === 'del') {
layer.confirm('确定要删除该记录吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/admin/goods/del", { id: data.id }, callback);
layer.close(index);
});
}
return false;
});
//监听搜索提交
form.on('submit(searchform)', function(data) {
layui.pageTable.reload({
where: {
keywords: data.field.keywords
},
page: {
curr: 1
}
});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -17,184 +17,151 @@
top: 1px;
right: 1px;
}
.editormd-code-toolbar select {
display: inline-block
}
.editormd li {
list-style: inherit;
}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<h3 class="pb-3">编辑商品</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">商品标题<font>*</font></td>
<td colspan="3"><input type="text" name="title" lay-verify="required" lay-reqText="请输入商品标题"
placeholder="请输入商品标题" class="layui-input" value="{$goods.title}"></td>
<td class="layui-td-gray">状态<font>*</font></td>
<td>
<input type="radio" name="status" value="1" title="正常" {eq name="$goods.status" value="1" }checked{/eq}>
<input type="radio" name="status" value="0" title="下架" {eq name="$goods.status" value="0" }checked{/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray">关键字<font>*</font></td>
<td colspan="3">
<input type="text" id="keyword_name" name="keyword_names" lay-verify="required" lay-reqText="请选择关键字"
placeholder="请选择关键字" class="layui-input" value="{$goods.keyword_names}" readonly>
<input type="hidden" id="keyword_id" name="keyword_ids" value="{$goods.keyword_ids}">
</td>
<td colspan="5"><input type="text" name="title" lay-verify="required" lay-reqText="请输入商品标题" placeholder="请输入商品标题" class="layui-input" value="{$detail.title}"></td>
<td class="layui-td-gray">商品分类<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择商品分类">
<option value="">请选择商品分类</option>
{volist name=":set_recursion(get_goods_cate())" id="v"}
<option value="{$v.id}" {eq name="$goods.cate_id" value="$v.id" }selected{/eq}>{$v.title}</option>
<option value="{$v.id}" {eq name="$detail.cate_id" value="$v.id" }selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">商品卖点<font>*</font></td>
<td colspan="3">
<input type="text" name="tips" lay-verify="required" lay-reqText="请输入商品卖点" placeholder="一句话描述商品卖点30字以内"
value="{$goods.tips}" class="layui-input">
<td class="layui-td-gray">关键字<font>*</font></td>
<td colspan="5">
<input type="text" id="keyword_name" name="keyword_names" lay-verify="required" lay-reqText="请选择关键字"
placeholder="请选择关键字" class="layui-input" value="{$detail.keyword_names}" readonly>
<input type="hidden" id="keyword_id" name="keyword_ids" value="{$detail.keyword_ids}">
</td>
<td class="layui-td-gray" rowspan="3">缩略图<font>*</font></td>
<td rowspan="3" style="vertical-align:top">
<div class="layui-upload" style="text-align:center;">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn">上传商品封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="demo1">
<img src="{$goods.thumb|get_file}" style="width:200px;max-width:200px" />
<input type="hidden" name="thumb" value="{$goods.thumb}">
<button type="button" class="layui-btn layui-btn-sm" id="upload_btn_thumb">上传商品封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="upload_box_thumb">
<img src="{$detail.thumb|get_file}" style="width:200px;max-width:200px" />
<input type="hidden" name="thumb" value="{$detail.thumb}">
</div>
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">商品卖点<font>*</font></td>
<td colspan="5">
<input type="text" name="tips" lay-verify="required" lay-reqText="请输入商品卖点" placeholder="一句话描述商品卖点30字以内" value="{$detail.tips}" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">商品简介</td>
<td colspan="3">
<textarea name="desc" placeholder="请输入商品简介200字以内" class="layui-textarea">{$goods.desc}</textarea>
<td colspan="5">
<textarea name="desc" placeholder="请输入商品简介200字以内" class="layui-textarea">{$detail.desc}</textarea>
</td>
</tr>
<tr>
<td class="layui-td-gray">商品标签<font>*</font></td>
<td colspan="3">
<td colspan="8">
<input type="checkbox" name="tag_values[]" title="正品保证" lay-skin="primary" value="1" {eq
name="$goods.tag1" value="1" }checked{/eq} />
name="$detail.tag1" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="一年保修" lay-skin="primary" value="2" {eq
name="$goods.tag2" value="1" }checked{/eq} />
name="$detail.tag2" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="七天退换(拆封后不支持)" lay-skin="primary" value="3" {eq
name="$goods.tag3" value="1" }checked{/eq} />
name="$detail.tag3" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="赠运费险" lay-skin="primary" value="4" {eq
name="$goods.tag4" value="1" }checked{/eq} />
name="$detail.tag4" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="闪电发货" lay-skin="primary" value="5" {eq
name="$goods.tag5" value="1" }checked{/eq} />
name="$detail.tag5" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="售后无忧" lay-skin="primary" value="6" {eq
name="$goods.tag6" value="1" }checked{/eq} />
name="$detail.tag6" value="1" }checked{/eq} />
</td>
</tr>
<tr>
<td class="layui-td-gray">市场价格<font>*</font></td>
<td>
<input type="text" name="base_price" lay-verify="required|number" lay-reqText="请输入市场价格"
placeholder="请输入市场价格" class="layui-input" value="{$goods.base_price}">
placeholder="请输入市场价格" class="layui-input" value="{$detail.base_price}">
</td>
<td class="layui-td-gray">实际价格<font>*</font></td>
<td>
<input type="text" name="price" lay-verify="required|number" lay-reqText="请输入实际价格" placeholder="请输入实际价格"
class="layui-input" value="{$goods.price}">
class="layui-input" value="{$detail.price}">
</td>
<td class="layui-td-gray">商品库存<font>*</font></td>
<td>
<input type="text" name="stocks" value="{$detail.stocks}" lay-verify="required|number" lay-reqText="请输入商品库存" placeholder="请输入商品库存" class="layui-input">
</td>
<td class="layui-td-gray">是否包邮<font>*</font></td>
<td>
<input type="radio" name="is_mail" value="1" title="是" {eq name="$goods.is_mail" value="1"
<input type="radio" name="is_mail" value="1" title="是" {eq name="$detail.is_mail" value="1"
}checked{/eq}>
<input type="radio" name="is_mail" value="0" title="否" {eq name="$goods.is_mail" value="0"
<input type="radio" name="is_mail" value="0" title="否" {eq name="$detail.is_mail" value="0"
}checked{/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray">首页显示</td>
<td>
<input type="radio" name="is_home" value="1" title="是" {eq name="$goods.is_home" value="1"
}checked{/eq}>
<input type="radio" name="is_home" value="0" title="否" {eq name="$goods.is_home" value="0"
}checked{/eq}>
</td>
<td class="layui-td-gray">属性</td>
<td class="layui-td-gray">商品属性</td>
<td>
<select name="type">
<option value="">请选择属性</option>
<option value="1" {eq name="$goods.type" value="1" }selected{/eq}>精华</option>
<option value="2" {eq name="$goods.type" value="2" }selected{/eq}>热门</option>
<option value="3" {eq name="$goods.type" value="3" }selected{/eq}>推荐</option>
<option value="1" {eq name="$detail.type" value="1" }selected{/eq}>精华</option>
<option value="2" {eq name="$detail.type" value="2" }selected{/eq}>热门</option>
<option value="3" {eq name="$detail.type" value="3" }selected{/eq}>推荐</option>
</select>
</td>
<td class="layui-td-gray">首页显示</td>
<td>
<input type="radio" name="is_home" value="1" title="是" {eq name="$detail.is_home" value="1"
}checked{/eq}>
<input type="radio" name="is_home" value="0" title="否" {eq name="$detail.is_home" value="0"
}checked{/eq}>
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" lay-verify="number" class="layui-input"
value="{$goods.sort}">
<input type="text" name="sort" placeholder="请输入排序,数字" lay-verify="number" class="layui-input" value="{$detail.sort}">
</td>
<td class="layui-td-gray">状态<font>*</font></td>
<td>
<input type="radio" name="status" value="1" title="正常" {eq name="$detail.status" value="1" }checked{/eq}>
<input type="radio" name="status" value="0" title="下架" {eq name="$detail.status" value="0" }checked{/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray">商品图集</td>
<td colspan="5">
<td colspan="7">
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn2">上传轮播图</button>
<div class="layui-upload-list" id="demo2">
<input type="hidden" name="banner" value="{$goods.banner}">
{notempty name="goods.banner"}
{volist name="goods.banner_array" id="vo"}
<div class="upload-img img-cover" id="uploadImg{$vo}"><div class="gg-img-cover cover-4-3"><img src="{$vo|get_file}"><div class="upload-close"><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delimg" data-id="{$vo}">删除</a></div></div>
<input type="hidden" name="banner" value="{$detail.banner}">
{notempty name="detail.banner"}
{volist name="detail.banner_array" id="vo"}
<div class="upload-img img-cover" id="uploadImg{$vo}"><div class="gg-img-cover cover-4-3"><img src="{$vo|get_file}"><div class="upload-close"><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delimg" data-id="{$vo}">删除</a></div></div></div>
{/volist}
{/notempty}
</div>
</div>
</td>
</tr>
{empty name="$goods.md_content"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">商品介绍<font>*</font></td>
<td colspan="8" class="layui-td-gray" style="text-align:left">商品介绍<font>*</font></td>
</tr>
<tr>
<td colspan="6">
<textarea class="layui-textarea" id="container">{$goods.content}</textarea>
<td colspan="8">
<textarea class="layui-textarea" id="container_content">{$detail.content}</textarea>
</td>
</tr>
{else/}
{eq name="$editor" value="1"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">商品介绍<font>*</font><span
style="margin-left:30px; color: red">当前为TinyMCE富文本编辑器可在【系统管理->系统配置->其他配置】中切换为mardown编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<textarea placeholder="请输入内容" class="layui-textarea" id="container">{$goods.content}</textarea>
</td>
</tr>
{else/}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">商品介绍<font>*</font><span
style="margin-left:30px; color: red">当前为mardown编辑器可在【系统管理->系统配置->其他配置】中切换为TinyMCE富文本编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<div>
<textarea id="mdContent" style="display:none;">{$goods.md_content|raw}</textarea>
<div id="docContent"></div>
</div>
</td>
</tr>
{/eq}
{/empty}
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$goods.id}">
<button class="layui-btn" lay-submit="" lay-filter="webform">立即提交</button>
<div class="pt-3">
<input type="hidden" name="id" value="{$detail.id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">关闭</button>
</div>
@ -221,20 +188,60 @@
this.splice(index, 1);
}
};
const editorType = '{$editor}';
var moduleInit;
if (editorType == 1) {
moduleInit = ['tool', 'tagpicker', 'tinymce'];
}
else {
moduleInit = ['tool', 'tagpicker', 'editormd'];
}
var moduleInit = ['tool','tagpicker','tinymce'];
function gouguInit() {
var form = layui.form, tool = layui.tool, tagspicker = layui.tagpicker, upload = layui.upload;
var form = layui.form, tool = layui.tool,tagpicker = layui.tagpicker;
var tags = new tagspicker({
//上传缩略图
var upload_thumb = layui.upload.render({
elem: '#upload_btn_thumb',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#upload_box_thumb input').attr('value', res.data.id);
$('#upload_box_thumb img').attr('src', res.data.filepath);
}
});
//banner图上传
var uploadInst2 = layui.upload.render({
elem: '#uploadBtn2'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.push(res.data.id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#demo2').append('<div class="upload-img img-cover" id="uploadImg' + res.data.id + '"><div class="gg-img-cover cover-4-3"><img src="' + res.data.filepath + '"><div class="upload-close"><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delimg" data-id="' + res.data.id + '">删除</a></div></div>');
}
});
$('#demo2').on('click', '[lay-event="delimg"]', function () {
var _id = $(this).data('id');
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.remove(_id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#uploadImg' + _id).remove();
})
var tags = new tagpicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
'tag_ids': 'keyword_id',
@ -243,6 +250,12 @@
'isDiy': 1
});
//商品描述富文本编辑器
var edit = layui.tinymce.render({
selector: '#container_content',
height: 500
});
//自定义验证规则
form.verify({
otherReq: function (value, item) {
@ -269,113 +282,23 @@
}
}
});
//缩略图上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container_content'].getContent();
if (data.field.content == '') {
layer.msg('请先完善商品描述内容');
return false;
}
});
//广告图上传
var uploadInst2 = upload.render({
elem: '#uploadBtn2'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
//上传成功
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.push(res.data.id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#demo2').append('<div class="upload-img img-cover" id="uploadImg' + res.data.id + '"><div class="gg-img-cover cover-4-3"><img src="' + res.data.filepath + '"><div class="upload-close"><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="delimg" data-id="' + res.data.id + '">删除</a></div></div>');
}
});
$('#demo2').on('click', '[lay-event="delimg"]', function () {
var _id = $(this).data('id');
var idsStr = $('#demo2 input').val();
var idsArray = [];
if (idsStr != '') {
idsArray = idsStr.split(",");
}
idsArray.remove(_id);
$('#demo2 input').attr('value', idsArray.join(','));
$('#uploadImg' + _id).remove();
})
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
tool.tabClose();
tool.post("/admin/goods/edit", data.field, callback);
return false;
});
if (editorType == 1) {
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善商品内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(77);
layer.confirm('保存成功,关闭当前页面?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/goods/add", data.field, callback);
return false;
});
}
else {
var editor = layui.editormd;
var edit = editor.render('docContent', {
markdown: document.getElementById('mdContent').value
});
//监听提交
form.on('submit(webform)', function (data) {
if (data.field.mdContent == '') {
layer.msg('请先完善商品内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(77);
layer.confirm('保存成功,关闭当前页面?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/goods/add", data.field, callback);
return false;
});
}
}
</script>
{/block}

View File

@ -0,0 +1,122 @@
{extend name="common/base"/}
{block name="style"}
<style>
.upload-img {
width: 120px;
height: 90px;
overflow: hidden;
position: relative;
border: 1px solid #eee;
padding: 1px;
margin: 5px;
float: left;
}
.upload-close {
position: absolute;
top: 1px;
right: 1px;
}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="layui-form p-4">
<h3 class="pb-3">商品详情</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">商品标题</td>
<td colspan="5">{$detail.title}</td>
<td class="layui-td-gray">商品分类</td>
<td>{$detail.cate_name}</td>
</tr>
<tr>
<td class="layui-td-gray">关键字</td>
<td colspan="5">{$detail.keyword_names}</td>
<td class="layui-td-gray" rowspan="3">缩略图<font>*</font></td>
<td rowspan="3" style="vertical-align:top">
<img src="{$detail.thumb|get_file}" style="width:200px;max-width:200px" />
</td>
</tr>
<tr>
<td class="layui-td-gray">商品卖点</td>
<td colspan="5">{$detail.tips}</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">商品简介</td>
<td colspan="5">{$detail.desc}</td>
</tr>
<tr>
<td class="layui-td-gray">商品标签</td>
<td colspan="8">
<input type="checkbox" name="tag_values[]" title="正品保证" lay-skin="primary" disabled value="1" {eq
name="$detail.tag1" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="一年保修" lay-skin="primary" disabled value="2" {eq
name="$detail.tag2" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="七天退换(拆封后不支持)" lay-skin="primary" disabled value="3" {eq
name="$detail.tag3" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="赠运费险" lay-skin="primary" disabled value="4" {eq
name="$detail.tag4" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="闪电发货" lay-skin="primary" disabled value="5" {eq
name="$detail.tag5" value="1" }checked{/eq} />
<input type="checkbox" name="tag_values[]" title="售后无忧" lay-skin="primary" disabled value="6" {eq
name="$detail.tag6" value="1" }checked{/eq} />
</td>
</tr>
<tr>
<td class="layui-td-gray">市场价格</td>
<td>{$detail.base_price}</td>
<td class="layui-td-gray">实际价格</td>
<td>{$detail.price}</td>
<td class="layui-td-gray">商品库存</td>
<td>{$detail.stocks}</td>
<td class="layui-td-gray">是否包邮</td>
<td>
{eq name="$detail.is_mail" value="1"}是{/eq}
{eq name="$detail.is_mail" value="0"}否{/eq}
</td>
</tr>
<tr>
<td class="layui-td-gray">商品属性</td>
<td>
{eq name="$detail.type" value="1" }精华{/eq}
{eq name="$detail.type" value="2" }热门{/eq}
{eq name="$detail.type" value="3" }推荐{/eq}
</td>
<td class="layui-td-gray">首页显示</td>
<td>
{eq name="$detail.is_home" value="1"}是{/eq}
{eq name="$detail.is_home" value="0"}否{/eq}
</td>
<td class="layui-td-gray">排序</td>
<td>{$detail.sort}</td>
<td class="layui-td-gray">状态</td>
<td>
{eq name="$detail.status" value="1" }正常{/eq}
{eq name="$detail.status" value="0" }下架{/eq}
</td>
</tr>
<tr>
<td class="layui-td-gray">商品图集</td>
<td colspan="7">
<div class="layui-upload">
<div class="layui-upload-list">
{notempty name="detail.banner"}
{volist name="detail.banner_array" id="vo"}
<div class="upload-img img-cover" id="uploadImg{$vo}"><div class="gg-img-cover cover-4-3"><img src="{$vo|get_file}"></div></div>
{/volist}
{/notempty}
</div>
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">商品介绍</td>
<td colspan="7">
{$detail.content|raw}
</td>
</tr>
</table>
</div>
{/block}
<!-- /主体 -->

View File

@ -2,7 +2,7 @@
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">商品分类</h3>
<h3 class="pb-3">新建商品分类</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">父级分类<font>*</font>
@ -15,34 +15,28 @@
{/volist}
</select>
</td>
<td class="layui-td-gray">分类名称<font>*</font>
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称"
lay-reqText="请输入分类名称" class="layui-input" {notempty name="$cate.title" }value="{$cate.title}"
{/notempty}>
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">排序</td>
<td class="layui-td-gray">分类名称<font>*</font>
</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input"
{notempty name="$cate.sort" }value="{$cate.sort}" {/notempty}>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" value="" class="layui-input">
</td>
<td class="layui-td-gray">关键词</td>
<td>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input"
{notempty name="$cate.keywords" }value="{$cate.keywords}" {/notempty}>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input" value="">
</td>
</tr>
<tr>
<td class="layui-td-gray">描述</td>
<td colspan="3"><textarea name="desc" placeholder="请输入描述,可空"
class="layui-textarea">{notempty name="$cate.desc" }{$cate.desc}{/notempty}</textarea></td>
<td colspan="3"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea"></textarea></td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$id}" />
<div class="pt-3">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
@ -53,11 +47,14 @@
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
var moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
@ -66,7 +63,7 @@
}, 1000);
}
}
tool.post("/admin/goods/cate_add", data.field, callback);
tool.post("/admin/goods_cate/add", data.field, callback);
return false;
});
}

View File

@ -1,17 +1,20 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<div class="gg-form-bar border-t border-x">
<button class="layui-btn layui-btn-normal layui-btn-sm add-menu">+ 添加分类</button>
<button class="layui-btn layui-btn-sm add-menu">+ 添加商品分类</button>
</div>
<div>
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
</div>
</div>
<script type="text/html" id="switchStatus">
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
<script type="text/html" id="barDemo">
<div class="layui-btn-group"><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="read">查看</a><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>
</script>
{/block}
<!-- /主体 -->
@ -25,7 +28,7 @@
id:'treeTable'
,elem: '#treeTable'
,idField:'id'
,url:'/admin/goods/cate'
,url:'/admin/goods_cate/datalist'
,cellMinWidth: 100
,treeId:'id'//树形id字段名称
,treeUpId:'pid'//树形父id字段名称
@ -48,18 +51,18 @@
});
//表头工具栏事件
$('.add-menu').on('click', function(){
tool.side("/admin/goods/cate_add");
tool.side("/admin/goods_cate/add");
return;
});
//操作按钮
treeGrid.on('tool(treeTable)',function (obj) {
if (obj.event === 'add') {
tool.side('/admin/goods/cate_add?pid='+obj.data.id);
tool.side('/admin/goods_cate/add?pid='+obj.data.id);
return;
}
if (obj.event === 'edit') {
tool.side('/admin/goods/cate_add?id='+obj.data.id);
tool.side('/admin/goods_cate/edit?id='+obj.data.id);
return;
}
if(obj.event === 'del'){
@ -70,7 +73,7 @@
obj.del();
}
}
tool.delete("/admin/goods/cate_delete", { id: obj.data.id }, callback);
tool.delete("/admin/goods_cate/del", { id: obj.data.id }, callback);
layer.close(index);
});
}

View File

@ -0,0 +1,72 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">编辑商品分类</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">父级分类<font>*</font>
</td>
<td>
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
<option value="0">作为顶级分类</option>
{volist name=":set_recursion(get_goods_cate())" id="v"}
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">排序</td>
<td>
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort}">
</td>
</tr>
<tr>
<td class="layui-td-gray">分类名称<font>*</font>
</td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input" value="{$detail.title}">
</td>
<td class="layui-td-gray">关键词</td>
<td>
<input type="text" name="keywords" placeholder="请输入关键词,用“,”隔开,可空" autocomplete="off" class="layui-input" value="{$detail.keywords}">
</td>
</tr>
<tr>
<td class="layui-td-gray">描述</td>
<td colspan="3"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea">{$detail.desc}</textarea></td>
</tr>
</table>
<div class="pt-3">
<input type="hidden" name="id" value="{$detail.id}"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var moduleInit = ['tool'];
function gouguInit() {
var form = layui.form, tool = layui.tool;
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function () {
parent.location.reload();
}, 1000);
}
}
tool.post("/admin/goods_cate/edit", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -16,7 +16,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add">+ 添加关键字</button>
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加关键字</button>
</div>
</script>
{/block}

View File

@ -6,7 +6,7 @@
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm addNew" type="button">+ 添加用户等级</button>
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加用户等级</button>
</div>
</script>
{/block}

View File

@ -17,7 +17,7 @@
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add">+ 添加友情链接</button>
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加友情链接</button>
</div>
</script>
<script type="text/html" id="barDemo">

View File

@ -16,7 +16,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add">+ 添加导航组</button>
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加导航组</button>
</div>
</script>
<script type="text/html" id="barDemo">

View File

@ -3,7 +3,7 @@
{block name="body"}
<div class="p-3">
<div class="gg-form-bar border-t border-x">
<button class="layui-btn layui-btn-normal layui-btn-sm add-menu">+ 添加导航</button>
<button class="layui-btn layui-btn-sm add-menu">+ 添加导航</button>
<button class="layui-btn layui-btn-primary layui-btn-sm add-back">返回</button>
</div>
<div>

View File

@ -17,28 +17,21 @@
top: 1px;
right: 1px;
}
.editormd-code-toolbar select {
display: inline-block
}
.editormd li {
list-style: inherit;
}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<table class="layui-table layui-table-form">
<form class="layui-form p-4">
<h3 class="pb-3">新建单页面</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">页面标题<font>*</font></td>
<td colspan="3"><input type="text" name="title" lay-verify="required" lay-reqText="请输入页面标题" placeholder="请输入页面标题" class="layui-input"></td>
<td class="layui-td-gray" rowspan="3">缩略图</td>
<td rowspan="3" style="vertical-align:top">
<div class="layui-upload" style="text-align:center;">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn">上传封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="demo1">
<button type="button" class="layui-btn layui-btn-sm" id="upload_btn_thumb">上传封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="upload_box_thumb">
<img src="" style="width:200px;max-width:200px" />
<input type="hidden" name="thumb" value="">
</div>
@ -63,9 +56,10 @@
<td class="layui-td-gray">图集相册</td>
<td colspan="5">
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn2">上传图片</button>
<div class="layui-upload-list clearfix" id="demo2">
<input type="hidden" name="banner" value="">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn2">选择上传图片</button>
<div class="layui-upload-list" id="demo2">
<img src="" width="100" style="width:200px;max-width:200px" />
<input type="hidden" name="banner" value="" >
</div>
</div>
</td>
@ -90,35 +84,18 @@
<input type="radio" name="status" value="0" title="下架">
</td>
</tr>
{eq name="$editor" value="1"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">页面内容<font>*</font><span
style="margin-left:30px; color: red">当前为TinyMCE富文本编辑器可在【系统管理->其他配置】中切换为mardown编辑器</span></td>
<td colspan="6" class="layui-td-gray" style="text-align:left">页面内容<font>*</font></td>
</tr>
<tr>
<td colspan="6">
<textarea class="layui-textarea" id="container"></textarea>
<textarea class="layui-textarea" id="container_content"></textarea>
</td>
</tr>
{else/}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">页面内容<font>*</font><span
style="margin-left:30px; color: red">当前为mardown编辑器可在【系统管理->其他配置】中切换为TinyMCE富文本编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<div>
<textarea id="mdContent" style="display:none;"></textarea>
<div id="docContent"></div>
</div>
</td>
</tr>
{/eq}
</table>
<div class="py-3">
<div class="pt-3">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">关闭</button>
</div>
</form>
{/block}
@ -143,20 +120,27 @@
this.splice(index, 1);
}
};
const editorType = '{$editor}';
var moduleInit;
if (editorType == 1) {
moduleInit = ['tool', 'tagpicker', 'tinymce'];
}
else {
moduleInit = ['tool', 'tagpicker', 'editormd'];
}
var moduleInit = ['tool','tagpicker','tinymce'];
function gouguInit() {
var form = layui.form, tool = layui.tool, tagspicker = layui.tagpicker, upload = layui.upload;
var form = layui.form, tool = layui.tool,tagpicker = layui.tagpicker;
var tags = new tagspicker({
//上传缩略图
var upload_thumb = layui.upload.render({
elem: '#upload_btn_thumb',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#upload_box_thumb input').attr('value', res.data.id);
$('#upload_box_thumb img').attr('src', res.data.filepath);
}
});
var tags = new tagpicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
'tag_ids': 'keyword_id',
@ -164,24 +148,9 @@
'height': 500,
'isDiy': 1
});
//缩略图上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
}
});
//广告图上传
var uploadInst2 = upload.render({
//banner图上传
var uploadInst2 = layui.upload.render({
elem: '#uploadBtn2'
, url: '/admin/api/upload'
, done: function (res) {
@ -213,64 +182,28 @@
$('#uploadImg' + _id).remove();
})
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
tool.tabClose();
//内容描述富文本编辑器
var edit = layui.tinymce.render({
selector: '#container_content',
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container_content'].getContent();
if (data.field.content == '') {
layer.msg('请先完善内容描述内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
tool.post("/admin/pages/add", data.field, callback);
return false;
});
if (editorType == 1) {
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善页面内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(80);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/pages/add", data.field, callback);
return false;
});
}
else {
var editor = layui.editormd;
var edit = editor.render('docContent', {
markdown: document.getElementById('mdContent').value
});
//监听提交
form.on('submit(webform)', function (data) {
if (data.field.mdContent == '') {
layer.msg('请先完善页面内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(80);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/pages/add", data.field, callback);
return false;
});
}
}
</script>
{/block}

View File

@ -0,0 +1,151 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<form class="layui-form gg-form-bar border-t border-x">
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="请输入关键字" class="layui-input" autocomplete="off" />
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="searchform">提交搜索</button>
</form>
<table class="layui-hide" id="pages" lay-filter="pages"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-btn layui-btn-sm" lay-event="add" data-title="添加单页面">+ 添加单页面</span>
</div>
</script>
<script type="text/html" id="status">
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok green{{# } else { }}layui-icon-close red{{# } }}"></i>
</script>
<script type="text/html" id="barDemo">
<div class="layui-btn-group"><a class="layui-btn layui-btn-normal layui-btn-xs" href="/home/pages/detail/id/{{d.id}}.html" target="_blank">查看</a><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table,tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#pages',
title: '单页面列表',
toolbar: '#toolbarDemo',
url: '/admin/pages/datalist',
page: true,
limit: 20,
cellMinWidth: 300,
cols: [
[
{
fixed: 'left',
field: 'id',
title: '编号',
align: 'center',
width: 80
},{
field: 'title',
title: '页面名称',
},{
field: 'read',
title: '阅读量',
align: 'center',
width: 100
},{
field: 'name',
title: 'URL文件名',
align: 'center',
width: 100
},{
field: 'template',
title: '前端模板',
align: 'center',
width: 100
},{
field: 'admin_name',
title: '创建人',
align: 'center',
width: 100
},{
field: 'create_time',
title: '创建时间',
align: 'center',
width: 150
},
{
field: 'status',
title: '上下架',
toolbar: '#status',
align: 'center',
width: 80
},
{
fixed: 'right',
field: 'right',
title: '操作',
toolbar: '#barDemo',
width: 136,
align: 'center'
}
]
]
});
//监听表头工具栏事件
table.on('toolbar(pages)', function(obj){
if (obj.event === 'add') {
tool.side("/admin/pages/add");
return false;
}
});
//监听表格行工具事件
table.on('tool(pages)', function(obj) {
var data = obj.data;
if (obj.event === 'read') {
tool.side('/admin/pages/read?id='+obj.data.id);
}
else if (obj.event === 'edit') {
tool.side('/admin/pages/edit?id='+obj.data.id);
}
else if (obj.event === 'del') {
layer.confirm('确定要删除该记录吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/admin/pages/del", { id: data.id }, callback);
layer.close(index);
});
}
return false;
});
//监听搜索提交
form.on('submit(searchform)', function(data) {
layui.pageTable.reload({
where: {
keywords: data.field.keywords
},
page: {
curr: 1
}
});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -17,19 +17,12 @@
top: 1px;
right: 1px;
}
.editormd-code-toolbar select {
display: inline-block
}
.editormd li {
list-style: inherit;
}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-3">
<form class="layui-form p-4">
<h3 class="pb-3">编辑单页面</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">页面标题<font>*</font></td>
@ -37,8 +30,8 @@
<td class="layui-td-gray" rowspan="3">缩略图</td>
<td rowspan="3" style="vertical-align:top">
<div class="layui-upload" style="text-align:center;">
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn">上传封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="demo1">
<button type="button" class="layui-btn layui-btn-sm" id="upload_btn_thumb">上传封面图(尺寸750x560)</button>
<div class="layui-upload-list" id="upload_box_thumb">
<img src="{$detail.thumb|get_file}" style="width:200px;max-width:200px" />
<input type="hidden" name="thumb" value="{$detail.thumb}">
</div>
@ -95,47 +88,19 @@
<input type="radio" name="status" value="0" title="下架" {eq name="$detail.status" value="0" }checked{/eq}>
</td>
</tr>
{empty name="$detail.md_content"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">页面内容<font>*</font></td>
</tr>
<tr>
<td colspan="6">
<textarea class="layui-textarea" id="container">{$detail.content}</textarea>
<textarea placeholder="请输入内容" class="layui-textarea" id="container_content">{$detail.content}</textarea>
</td>
</tr>
{else/}
{eq name="$editor" value="1"}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">页面内容<font>*</font><span
style="margin-left:30px; color: red">当前为TinyMCE富文本编辑器可在【系统管理->其他配置】中切换为mardown编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<textarea placeholder="请输入内容" class="layui-textarea" id="container">{$detail.content}</textarea>
</td>
</tr>
{else/}
<tr>
<td colspan="6" class="layui-td-gray" style="text-align:left">页面内容<font>*</font><span
style="margin-left:30px; color: red">当前为mardown编辑器可在【系统管理->其他配置】中切换为TinyMCE富文本编辑器</span></td>
</tr>
<tr>
<td colspan="6">
<div>
<textarea id="mdContent" style="display:none;">{$detail.md_content|raw}</textarea>
<div id="docContent"></div>
</div>
</td>
</tr>
{/eq}
{/empty}
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$detail.id}">
<div class="pt-3">
<input type="hidden" name="id" value="{$detail.id}"/>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button lay-event="back" class="layui-btn layui-btn-primary">关闭</button>
</div>
</form>
{/block}
@ -160,20 +125,27 @@
this.splice(index, 1);
}
};
const editorType = '{$editor}';
var moduleInit;
if (editorType == 1) {
moduleInit = ['tool', 'tagpicker', 'tinymce'];
}
else {
moduleInit = ['tool', 'tagpicker', 'editormd'];
}
var moduleInit = ['tool','tagpicker','tinymce'];
function gouguInit() {
var form = layui.form, tool = layui.tool, tagspicker = layui.tagpicker, upload = layui.upload;
var form = layui.form, tool = layui.tool,tagpicker = layui.tagpicker;
var tags = new tagspicker({
//上传缩略图
var upload_thumb = layui.upload.render({
elem: '#upload_btn_thumb',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#upload_box_thumb input').attr('value', res.data.filepath);
$('#upload_box_thumb img').attr('src', res.data.filepath);
}
});
var tags = new tagpicker({
'url': '/admin/api/get_keyword_cate',
'target': 'keyword_name',
'tag_ids': 'keyword_id',
@ -181,24 +153,9 @@
'height': 500,
'isDiy': 1
});
//缩略图上传
var uploadInst = upload.render({
elem: '#uploadBtn'
, url: '/admin/api/upload'
, done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
}
});
//广告图上传
var uploadInst2 = upload.render({
//banner图上传
var uploadInst2 = layui.upload.render({
elem: '#uploadBtn2'
, url: '/admin/api/upload'
, done: function (res) {
@ -230,64 +187,28 @@
$('#uploadImg' + _id).remove();
})
//监听返回
$('body').on('click', '[lay-event="back"]', function () {
tool.tabClose();
//内容描述富文本编辑器
var edit = layui.tinymce.render({
selector: '#container_content',
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container_content'].getContent();
if (data.field.content == '') {
layer.msg('请先完善内容描述内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
tool.post("/admin/pages/edit", data.field, callback);
return false;
});
if (editorType == 1) {
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
height: 500
});
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善页面内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(80);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/pages/add", data.field, callback);
return false;
});
}
else {
var editor = layui.editormd;
var edit = editor.render('docContent', {
markdown: document.getElementById('mdContent').value
});
//监听提交
form.on('submit(webform)', function (data) {
if (data.field.mdContent == '') {
layer.msg('请先完善页面内容');
return false;
}
let callback = function (e) {
if (e.code == 0) {
tool.tabRefresh(80);
layer.confirm('保存成功,关闭当前页面吗?', { icon: 3, title: '提示' }, function (index) {
tool.tabClose();
});
} else {
layer.msg(e.msg);
}
}
tool.post("/admin/pages/add", data.field, callback);
return false;
});
}
}
</script>
{/block}

View File

@ -1,128 +0,0 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<form class="layui-form gg-form-bar border-t border-x">
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="ID/标题/描述" class="layui-input" autocomplete="off" />
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
</form>
<table class="layui-hide" id="pages" lay-filter="pages"></table>
</div>
<script type="text/html" id="status">
<i class="layui-icon {{# if(d.status == 1){ }}layui-icon-ok{{# } else { }}layui-icon-close{{# } }}"></i>
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-btn layui-btn-normal layui-btn-sm tab-a" data-title="添加页面" data-href="/admin/pages/add">+ 添加页面</span>
</div>
</script>
<script type="text/html" id="barDemo">
<div class="layui-btn-group"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table,tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#pages',
title: '单页面列表',
toolbar: '#toolbarDemo',
url: '/admin/pages/index', //数据接口
page: true, //开启分页
limit: 20,
cols: [
[ //表头
{
field: 'id',
title: '编号',
align: 'center',
width: 80
}, {
field: 'title',
title: '页面标题',
templet: '<div><a href="/home/pages/detail/id/{{d.id}}.html" class="layui-table-link" target="_blank">{{d.title}}</a></div>'
},{
field: 'name',
title: 'URL名称',
width: 100
},{
field: 'template',
title: '模板文件',
width: 100,
templet: function(d){
return d.template+'.html';
}
},{
field: 'create_time',
title: '发布时间',
align: 'center',
width: 160
},{
field: 'read',
align: 'center',
title: '阅读量',
width: 80
},{
field: 'status',
title: '状态',
toolbar: '#status',
align: 'center',
width: 66
},{
field: 'right',
title: '操作',
toolbar: '#barDemo',
width: 100,
align: 'center'
}
]
]
});
//监听行工具事件
table.on('tool(pages)', function(obj) {
var data = obj.data;
if (obj.event === 'edit') {
tool.tabAdd('/admin/pages/add?id='+obj.data.id,'编辑单页面'+obj.data.id);
}
else if (obj.event === 'del') {
layer.confirm('确定要删除吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/admin/pages/delete", { id: data.id }, callback);
layer.close(index);
});
}
});
//监听搜索提交
form.on('submit(webform)', function(data) {
layui.pageTable.reload({
where: {
keywords: data.field.keywords
},
page: {
curr: 1
}
});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,39 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="layui-form p-4">
<h3 class="pb-3">单页面详情</h3>
<table class="layui-table layui-table-form">
<tr><td class="layui-td-gray-2">页面名称</td>
<td>{$detail.title}</td><td class="layui-td-gray-2">图集相册</td>
<td>{$detail.banner}</td><td class="layui-td-gray-2">阅读量</td>
<td>{$detail.read}</td>
</tr><tr><td class="layui-td-gray-2">排序</td>
<td>{$detail.sort}</td><td class="layui-td-gray-2">URL文件名</td>
<td>{$detail.name}</td><td class="layui-td-gray-2">前端模板</td>
<td>
{eq name="$detail.template" value="1"}选项一{/eq}
{eq name="$detail.template" value="2"}选项二{/eq}
</td>
</tr><tr><td class="layui-td-gray-2">创建人</td>
<td>{$detail.admin_id}</td><td class="layui-td-gray-2">创建时间</td>
<td>{$detail.create_time}</td><td colspan='2'></td>
</tr><tr><td class="layui-td-gray-2">页面摘要</td>
<td colspan="5">{$detail.desc}</td>
</tr><tr><td class="layui-td-gray-2">缩略图</td>
<td colspan="5" style="vertical-align:top">
<div class="layui-upload" style="text-align:center;">
<div class="layui-upload-list">
<img src="{$detail.thumb}" width="100" style="width:200px; max-width:200px" />
</div>
</div>
</td>
</tr><tr><td class="layui-td-gray-2">内容描述</td>
<td colspan="5">
{$detail.content}
</td>
</tr>
</table>
</div>
{/block}
<!-- /主体 -->

View File

@ -0,0 +1,101 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">岗位职称</h3>
{if condition="$id eq 0"}
<table class="layui-table">
<tr>
<td class="layui-td-gray">岗位名称<font>*</font></td>
<td>
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入岗位名称" lay-reqText="请输入岗位名称" class="layui-input">
</td>
<td class="layui-td-gray-3">岗位工时单价(元)<font>*</font></td>
<td>
<input type="text" name="work_price" lay-verify="required|number" placeholder="请输入岗位工时单价" lay-reqText="请输入岗位工时单价" autocomplete="off" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">状态<font>*</font></td>
<td colspan="3">
<input type="radio" name="status" value="1" title="正常" checked>
<input type="radio" name="status" value="0" title="禁用">
</td>
</tr>
<tr>
<td class="layui-td-gray">岗位备注</td>
<td colspan="3">
<textarea name="remark" placeholder="请输入岗位备注" class="layui-textarea"></textarea>
</td>
</tr>
</table>
{else/}
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">岗位名称<font>*</font></td>
<td>
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入岗位名称" lay-reqText="请输入岗位名称" class="layui-input">
</td>
<td class="layui-td-gray-3">岗位工时单价(元)<font>*</font></td>
<td>
<input type="text" name="work_price" value="{$detail.work_price}" lay-verify="required|number" placeholder="请输入岗位工时单价" lay-reqText="请输入岗位工时单价" autocomplete="off" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray">状态<font>*</font></td>
<td colspan="3">
<input type="radio" name="status" value="1" title="正常" {eq name="$detail.status" value="1"}checked{/eq}>
<input type="radio" name="status" value="0" title="禁止" {eq name="$detail.status" value="0"}checked{/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray">岗位备注</td>
<td colspan="3">
<textarea name="remark" placeholder="请输入岗位备注" class="layui-textarea">{$detail.remark}</textarea>
</td>
</tr>
</table>
{/if}
<div class="py-3">
<input type="hidden" name="id" value="{$id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var form = layui.form,tool=layui.tool;
form.on('submit(webform)', function(data){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
setTimeout(function () {
parent.location.reload();
}, 1000);
}
}
tool.post("/admin/position/add", data.field, callback);
return false;
});
//监听提交
form.on('submit(webform)', function(data){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
parent.layui.tool.close(1000);
}
}
tool.post("/admin/position/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,109 @@
{extend name="common/base"/}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="status">
<i class="layui-icon {{# if(d.status == 1){ }}green layui-icon-ok{{# } else { }}yellow layui-icon-close{{# } }}"></i>
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加岗位</button>
</div>
</script>
<script type="text/html" id="barDemo">
<div class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool;
layui.pageTable = table.render({
elem: '#test',
title: '岗位列表',
toolbar: '#toolbarDemo',
url: "/admin/position/index", //数据接口
page: false, //开启分页
cols: [
[
{
field: 'id',
title: 'ID号',
align: 'center',
width: 80
}, {
field: 'title',
title: '岗位名称',
align: 'center',
width: 120
},{
field: 'remark',
title: '备注'
},{
field: 'work_price',
title: '岗位工时单价(元)',
align: 'center',
width: 132
}, {
field: 'status',
title: '状态',
toolbar: '#status',
align: 'center',
width: 60
}, {
field: 'right',
title: '操作',
toolbar: '#barDemo',
width: 120,
align: 'center'
}
]
]
});
//表头工具栏事件
table.on('toolbar(test)', function(obj){
if (obj.event === 'add') {
tool.side("/admin/position/add");
return;
}
});
//监听行工具事件
table.on('tool(test)', function (obj) {
var data = obj.data;
if(obj.event === 'edit'){
tool.side('/admin/position/add?id='+data.id);
return;
}
if (obj.event === 'del') {
if (data.id == 1) {
layer.msg('董事长职位不能删除');
return;
}
layer.confirm('您确定要删除该岗位', {
icon: 3,
title: '提示'
}, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/admin/position/delete", { id: obj.data.id }, callback);
layer.close(index);
});
}
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -16,7 +16,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add">+ 添加权限组</button>
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加权限组</button>
</div>
</script>
{/block}
@ -40,7 +40,7 @@
, { field: 'desc', title: '备注' }
, { field: 'status', title: '状态', toolbar: '#status', align: 'center', width: 80 }
, { width: 100,title: '操作',align: 'center',templet: function (d) {
var html = '<div class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
var html = '<div class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
return html;
}
}

View File

@ -3,7 +3,7 @@
{block name="body"}
<div class="p-3">
<div class="gg-form-bar border-t border-x">
<button class="layui-btn layui-btn-normal layui-btn-sm add-menu">+ 添加菜单/节点</button>
<button class="layui-btn layui-btn-sm add-menu">+ 添加菜单/节点</button>
</div>
<div>
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
@ -46,7 +46,7 @@
, {
width: 188, title: '操作', align: 'center'
, templet: function (d) {
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子菜单/节点</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button>';
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子菜单/节点</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button>';
return html;
}
}

View File

@ -15,7 +15,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add">+ 添加网站地图分类</button>
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加网站地图分类</button>
</div>
</script>
<script type="text/html" id="barDemo">

View File

@ -9,7 +9,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm add-menu">+ 添加网站地图</button>
<button class="layui-btn layui-btn-sm add-menu">+ 添加网站地图</button>
<button class="layui-btn layui-btn-primary layui-btn-sm add-back">返回</button>
</div>
</script>

View File

@ -16,7 +16,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add">+ 添加轮播组</button>
<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加轮播组</button>
</div>
</script>
<script type="text/html" id="barDemo">

View File

@ -10,7 +10,7 @@
</script>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm add-menu">+ 添加轮播</button>
<button class="layui-btn layui-btn-sm add-menu">+ 添加轮播</button>
<button class="layui-btn layui-btn-primary layui-btn-sm add-back">返回</button>
</div>
</script>

View File

@ -216,74 +216,6 @@ function time_format($time = NULL, $format = 'Y-m-d H:i:s')
return $time != '' ? str_replace('x', $sec, date($format, intval($usec))) : '';
}
/**
* 间隔时间段格式化
* @param int $time 时间戳
* @param string $format 格式 【d显示到天 i显示到分钟 s显示到秒】
* @return string
*/
function time_trans($time, $format = 'd')
{
$now = time();
$diff = $now - $time;
if ($diff < 60) {
return '1分钟前';
} else if ($diff < 3600) {
return floor($diff / 60) . '分钟前';
} else if ($diff < 86400) {
return floor($diff / 3600) . '小时前';
}
$yes_start_time = strtotime(date('Y-m-d 00:00:00', strtotime('-1 days'))); //昨天开始时间
$yes_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-1 days'))); //昨天结束时间
$two_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-2 days'))); //2天前结束时间
$three_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-3 days'))); //3天前结束时间
$four_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-4 days'))); //4天前结束时间
$five_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-5 days'))); //5天前结束时间
$six_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-6 days'))); //6天前结束时间
$seven_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-7 days'))); //7天前结束时间
if ($time > $yes_start_time && $time < $yes_end_time) {
return '昨天';
}
if ($time > $yes_start_time && $time < $two_end_time) {
return '1天前';
}
if ($time > $yes_start_time && $time < $three_end_time) {
return '2天前';
}
if ($time > $yes_start_time && $time < $four_end_time) {
return '3天前';
}
if ($time > $yes_start_time && $time < $five_end_time) {
return '4天前';
}
if ($time > $yes_start_time && $time < $six_end_time) {
return '5天前';
}
if ($time > $yes_start_time && $time < $seven_end_time) {
return '6天前';
}
switch ($format) {
case 'd':
$show_time = date('Y-m-d', $time);
break;
case 'i':
$show_time = date('Y-m-d H:i', $time);
break;
case 's':
$show_time = date('Y-m-d H:i:s', $time);
break;
}
return $show_time;
}
/**
* 根据附件表的id返回url地址
* @param [type] $id [description]
@ -418,26 +350,6 @@ function add_user_log($type, $param_str = '', $param_id = 0, $param = [])
\think\facade\Db::name('UserLog')->strict(false)->field(true)->insert($data);
}
/**
* 判断是否是手机浏览器
* @return bool
*/
function isMobile()
{
if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) {
return true;
} elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) {
return true;
} elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {
return true;
} elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) {
return true;
} else {
return false;
}
}
/**
* 邮件发送
* @param $to 接收人
@ -501,35 +413,24 @@ function send_email($to, $subject = '', $content = '')
}
}
/**
* 验证输入的邮件地址是否合法
* @param $user_email 邮箱
* @return bool
*/
function is_email($user_email)
/*
* 下划线转驼峰
* 思路:
* step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
* step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
*/
function camelize($uncamelized_words,$separator='_')
{
$chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
if (strpos($user_email, '@') !== false && strpos($user_email, '.') !== false) {
if (preg_match($chars, $user_email)) {
return true;
} else {
return false;
}
} else {
return false;
}
$uncamelized_words = $separator. str_replace($separator, " ", strtolower($uncamelized_words));
return ltrim(str_replace(" ", "", ucwords($uncamelized_words)), $separator );
}
/**
* 验证输入的手机号码是否合法
* @param $mobile_phone 手机号
* @return bool
*/
function is_mobile_phone($mobile_phone)
* 驼峰命名转下划线命名
* 思路:
* 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
*/
function uncamelize($camelCaps,$separator='_')
{
$chars = "/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$|17[0-9]{1}[0-9]{8}$/";
if (preg_match($chars, $mobile_phone)) {
return true;
}
return false;
}
return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
}

81
app/crud/command/Crud.php Normal file
View File

@ -0,0 +1,81 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\ControllerMake;
use app\crud\make\make\ModelMake;
use app\crud\make\make\ValidateMake;
use app\crud\make\make\ListMake;
use app\crud\make\make\ReadMake;
use app\crud\make\make\AddMake;
use app\crud\make\make\EditMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class Crud extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成controller策略
$make->executeText(new ControllerMake());
$make->executeCreate($controller, $path, $table);
// 执行生成model策略
$make->executeText(new ModelMake());
$make->executeCreate($table, $path, '');
// 执行生成validate策略
$make->executeText(new ValidateMake());
$make->executeCreate($table, $path, '');
// 执行生成list策略
$make->executeText(new ListMake());
$make->executeCreate($table, $path, $name);
// 执行生成view策略
$make->executeText(new ReadMake());
$make->executeCreate($table, $path, $name);
// 执行生成add策略
$make->executeText(new AddMake());
$make->executeCreate($table, $path, $name);
// 执行生成edit策略
$make->executeText(new EditMake());
$make->executeCreate($table, $path, $name);
$output->info($name . "crud make success");
}
}

View File

@ -0,0 +1,52 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\AddMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class CrudAdd extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成add策略
$make->executeText(new AddMake());
$make->executeCreate($table, $path, $name);
$output->info($name . "add make success");
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\ControllerMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class CrudController extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成controller策略
$make->executeText(new ControllerMake());
$make->executeCreate($controller, $path, $table);
$output->info($name . "controller make success");
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\EditMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class CrudEdit extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成edit策略
$make->executeText(new EditMake());
$make->executeCreate($table, $path, $name);
$output->info($name . "edit make success");
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\ListMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class CrudList extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成list策略
$make->executeText(new ListMake());
$make->executeCreate($table, $path, $name);
$output->info($name . "list make success");
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\ModelMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class CrudModel extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成model策略
$make->executeText(new ModelMake());
$make->executeCreate($table, $path, '');
$output->info($name . "model make success");
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\ReadMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class CrudRead extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成view策略
$make->executeText(new ReadMake());
$make->executeCreate($table, $path, $name);
$output->info($name . "read make success");
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace app\crud\command;
use app\crud\make\AutoMake;
use app\crud\make\make\ValidateMake;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
class CrudValidate extends Command
{
protected function configure()
{
$this->setName('auto crud')
->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
->addOption('name', 'm', Option::VALUE_OPTIONAL, 'the name', null)
->setDescription('auto make crud file');
}
protected function execute(Input $input, Output $output)
{
$table = $input->getOption('table');
if (!$table) {
$output->error("请输入 -t 表名");
exit;
}
$controller = $input->getOption('controller');
if (!$controller) {
$output->error("请输入 -c 控制器名");
exit;
}
$path = 'admin';
$name = $input->getOption('name');
if (!$name) {
$name = '';
}
$make = new AutoMake();
// 执行生成validate策略
$make->executeText(new ValidateMake());
$make->executeCreate($table, $path, '');
$output->info($name . "validate make success");
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace app\crud\make;
use app\crud\make\ToAutoMake;
class AutoMake
{
protected $create;
public function executeText(ToAutoMake $obj)
{
$this->create = $obj;
}
public function executeCreate($flag, $path, $other)
{
$this->create->check($flag, $path);
$this->create->make($flag, $path, $other);
}
}

View File

@ -0,0 +1,10 @@
<?php
namespace app\crud\make;
interface ToAutoMake
{
public function check($flag, $path);
public function make($flag, $path, $other);
}

View File

@ -0,0 +1,243 @@
<?php
namespace app\crud\make\make;
use app\crud\make\ToAutoMake;
use think\facade\App;
use think\facade\Db;
use think\console\Output;
class AddMake implements ToAutoMake
{
public function check($table, $path)
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
$modelName = $table;
$modelFilePath = base_path() . $path . DS . 'view' . DS . $modelName . DS . 'add.html';
if (!is_dir(base_path() . $path . DS . 'view' . DS . $modelName)) {
mkdir(base_path() . $path . DS . 'view'. DS . $modelName, 0755, true);
}
if (file_exists($modelFilePath)) {
$output = new Output();
$output->error("$modelName . DS . add.html已经存在");
exit;
}
}
public function make($table, $path, $other)
{
$addTpl = dirname(dirname(__DIR__)) . '/tpl/add.tpl';
$tplContent = file_get_contents($addTpl);
$model = $table;
$filePath = empty($path) ? '' : DS . $path;
$namespace = empty($path) ? '\\' : '\\' . $path . '\\';
$prefix = config('database.connections.mysql.prefix');
$column = Db::query('SHOW FULL COLUMNS FROM `' . $prefix . $table . '`');
$pk = '';
foreach ($column as $vo) {
if ($vo['Key'] == 'PRI') {
$pk = $vo['Field'];
break;
}
}
/*
//读取数据结构生成字段
$tritems ='';
$index =0;
foreach ($column as $key => $vo) {
$field = $vo['Field'];
$title = $vo['Comment']==''?$field:$vo['Comment'];
if($field != 'id'){
if(($index % 3) == 0){
$tritems.="<tr>
<td class='layui-td-gray-2'>{$title}</td>
<td><input type='text' name='{$field}' placeholder='请输入{$title}' class='layui-input' autocomplete='off' /></td>";
}else if(($index % 3) == 1){
$tritems.="
<td class='layui-td-gray-2'>{$title}</td>
<td><input type='text' name='{$field}' placeholder='请输入{$title}' class='layui-input' autocomplete='off' /></td>";
}else if(($index % 3) == 2){
$tritems.="
<td class='layui-td-gray-2'>{$title}</td>
<td><input type='text' name='{$field}' placeholder='请输入{$title}' class='layui-input' autocomplete='off' /></td>
</tr>
";
}
$index++;
}
}
if(($index % 3) == 1){
$tritems.="<td colspan='4'></td>
</tr>";
}
if(($index % 3) == 2){
$tritems.="<td colspan='2'></td>
</tr>";
}
*/
//读取提交的数据生成字段
$field_column = get_cache('crud_a_'.$table);
$tritems ='';
$index =0;
$summernoteIndex=0;
$inputHtml='';
$textareaHtml='';
$uploadHtml='';
$uploadScript = '';
$summernoteHtml='';
$summernoteForm='';
$summernoteScript='';
$datetimeScript='';
foreach ($field_column as $key => $vo) {
$field = $vo['field'];
$title = $vo['title'];
if($vo['type'] == 'summernote'){
$summernoteHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
$summernoteScript.= "//".$vo['title']."富文本编辑器
var edit = layui.tinymce.render({
selector: '#container_".$vo['field']."',
height: 500
});";
$summernoteForm.= "data.field.".$vo['field']." = tinyMCE.editors['container_".$vo['field']."'].getContent();
if (data.field.".$vo['field']." == '') {
layer.msg('请先完善".$vo['title']."内容');
return false;
}";
$summernoteIndex++;
}
else if($vo['type'] == 'upload'){
$uploadHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
$uploadScript.= "//上传".$vo['title']."
var upload_".$vo['field']." = layui.upload.render({
elem: '#upload_btn_".$vo['field']."',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#upload_box_".$vo['field']." input').attr('value', res.data.filepath);
$('#upload_box_".$vo['field']." img').attr('src', res.data.filepath);
}
});";
}else if($vo['type'] == 'textarea'){
$textareaHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
}
else{
if(($index % 3) == 0){
$inputHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required']);
}else if(($index % 3) == 1){
$inputHtml.=$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required']);
}else if(($index % 3) == 2){
$inputHtml.=$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>
";
}
if($vo['type'] == 'datetime'){
$datetimeScript.="//日期选择
layui.laydate.render({
elem: '#laydate_".$vo['field']."' //指定元素
});";
}
$index++;
}
}
if(($index % 3) == 1){
$inputHtml.="<td colspan='4'></td>
</tr>";
}
if(($index % 3) == 2){
$inputHtml.="<td colspan='2'></td>
</tr>";
}
$moduleInit = "var moduleInit = ['tool'];";
if($summernoteIndex>0){
$moduleInit = "var moduleInit = ['tool','tinymce'];";
}
$tritems=$inputHtml.$textareaHtml.$uploadHtml.$summernoteHtml;
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
$tplContent = str_replace('<model>', $model, $tplContent);
$tplContent = str_replace('<tritems>', $tritems, $tplContent);
$tplContent = str_replace('<name>', $other, $tplContent);
$tplContent = str_replace('<pk>', $pk, $tplContent);
$tplContent = str_replace('<moduleInit>', $moduleInit, $tplContent);
$tplContent = str_replace('<datetimeScript>', $datetimeScript, $tplContent);
$tplContent = str_replace('<uploadScript>', $uploadScript, $tplContent);
$tplContent = str_replace('<summernoteForm>', $summernoteForm, $tplContent);
$tplContent = str_replace('<summernoteScript>', $summernoteScript, $tplContent);
file_put_contents(base_path() . $path . DS . 'view' . DS . $model . DS . 'add.html', $tplContent);
}
public function make_form($field, $type, $title,$required)
{
$required_font = '';
$required_verify = '';
if($required==1){
$required_font = '<font>*</font>';
$required_verify = ' lay-verify="required" lay-reqText="请完善'.$title.'"';
}
$tem=[
'input'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td><input type="text" name="'.$field.'" '.$required_verify.' value="" autocomplete="off" placeholder="请输入'.$title.'" class="layui-input"></td>',
'datetime'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td><input type="text" name="'.$field.'" '.$required_verify.' value="" readonly id="laydate_'.$field.'" autocomplete="off" placeholder="请选择" class="layui-input"></td>',
'radio'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td>
<input type="radio" name="'.$field.'" value="0" title="选项一">
<input type="radio" name="'.$field.'" value="1" title="选项二">
</td>',
'checkbox'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td>
<input type="checkbox" name="'.$field.'" value="1" title="选项一" lay-skin="primary" />
<input type="checkbox" name="'.$field.'" value="2" title="选项二" lay-skin="primary" />
</td>',
'select'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td>
<select name="'.$field.'" '.$required_verify.'>
<option value="">请选择</option>
<option value="1">选项一</option>
<option value="2">选项二</option>
</select>
</td>',
'textarea'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td colspan="5"><textarea name="'.$field.'" '.$required_verify.' placeholder="请输入'.$title.'" class="layui-textarea"></textarea></td>',
'upload'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td colspan="5" style="vertical-align:top">
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-sm" id="upload_btn_'.$field.'">选择上传图片</button>
<div class="layui-upload-list" id="upload_box_'.$field.'">
<img src="" onerror="javascript:this.src=\'{__GOUGU__}/gougu/images/nonepic600x360.jpg\';this.onerror=null;" style="width:200px;max-width:200px" />
<input type="hidden" name="'.$field.'" value="" '.$required_verify.'>
</div>
</div>
</td>',
'summernote'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td colspan="5">
<textarea class="layui-textarea" id="container_'.$field.'"></textarea>
</td>'
];
return $tem[$type];
}
}

View File

@ -0,0 +1,107 @@
<?php
namespace app\crud\make\make;
use app\crud\make\ToAutoMake;
use think\facade\App;
use think\facade\Db;
use think\console\Output;
class ControllerMake implements ToAutoMake
{
public function check($controller, $path)
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
$controller = ucfirst(camelize($controller));
$controllerFilePath = base_path() . $path . DS . 'controller' . DS . $controller . '.php';
if (!is_dir(base_path() . $path . DS . 'controller')) {
mkdir(base_path() . $path . DS . 'controller', 0755, true);
}
if (file_exists($controllerFilePath)) {
$output = new Output();
$output->error("$controller.php已经存在");
exit;
}
}
public function make($controller, $path, $table)
{
$controllerTpl = dirname(dirname(__DIR__)) . '/tpl/controller.tpl';
$tplContent = file_get_contents($controllerTpl);
$controller = ucfirst(camelize($controller));
$model = ucfirst(camelize($table));
$filePath = empty($path) ? '' : DS . $path;
$namespace = empty($path) ? '\\' : '\\' . $path . '\\';
$prefix = config('database.connections.mysql.prefix');
$column = Db::query('SHOW FULL COLUMNS FROM `' . $prefix . $table . '`');
$pk = '';
foreach ($column as $vo) {
if ($vo['Key'] == 'PRI') {
$pk = $vo['Field'];
break;
}
}
$wheremap = '';
foreach ($column as $vo) {
if ($vo['Field'] == 'delete_time') {
$wheremap='$where[] = ["delete_time","=",0];';
break;
}
}
$add_column = get_cache('crud_a_'.$table);
$edit_column = get_cache('crud_e_'.$table);
$timeadd = '';
$timeedit = '';
foreach ($add_column as $key => $vo) {
if($vo['type'] == 'datetime'){
$timeadd.='if(isset($param["'.$vo['field'].'"])){
';
$timeadd.='$param["'.$vo['field'].'"]= $param["'.$vo['field'].'"]?strtotime($param["'.$vo['field'].'"]):0;
';
$timeadd.='}
';
}
}
foreach ($edit_column as $key => $vo) {
if($vo['type'] == 'datetime'){
$timeedit.='if(isset($param["'.$vo['field'].'"])){
';
$timeedit.='$param["'.$vo['field'].'"]= $param["'.$vo['field'].'"]?strtotime($param["'.$vo['field'].'"]):0;
';
$timeedit.='}
';
}
}
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
$tplContent = str_replace('<controller>', $controller, $tplContent);
$tplContent = str_replace('<model>', $model, $tplContent);
$tplContent = str_replace('<pk>', $pk, $tplContent);
$tplContent = str_replace('<wheremap>', $wheremap, $tplContent);
$tplContent = str_replace('<timeadd>', $timeadd, $tplContent);
$tplContent = str_replace('<timeedit>', $timeedit, $tplContent);
file_put_contents(base_path() . $filePath . DS . 'controller' . DS . $controller . '.php', $tplContent);
/*
// 检测BaseController是否存在
if (!file_exists(App::getAppPath() . $filePath . DS . 'controller' . DS . 'BaseController.php')) {
$controllerTpl = dirname(dirname(__DIR__)) . '/tpl/baseController.tpl';
$tplContent = file_get_contents($controllerTpl);
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
file_put_contents(base_path() . $filePath . DS . 'controller' . DS . 'BaseController.php', $tplContent);
}
*/
}
}

View File

@ -0,0 +1,248 @@
<?php
namespace app\crud\make\make;
use app\crud\make\ToAutoMake;
use think\facade\App;
use think\facade\Db;
use think\console\Output;
class EditMake implements ToAutoMake
{
public function check($table, $path)
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
$modelName = $table;
$modelFilePath = base_path() . $path . DS . 'view' . DS . $modelName . DS . 'edit.html';
if (!is_dir(base_path() . $path . DS . 'view' . DS . $modelName)) {
mkdir(base_path() . $path . DS . 'view'. DS . $modelName, 0755, true);
}
if (file_exists($modelFilePath)) {
$output = new Output();
$output->error("$modelName . DS . edit.html已经存在");
exit;
}
}
public function make($table, $path, $other)
{
$editTpl = dirname(dirname(__DIR__)) . '/tpl/edit.tpl';
$tplContent = file_get_contents($editTpl);
$model = $table;
$filePath = empty($path) ? '' : DS . $path;
$namespace = empty($path) ? '\\' : '\\' . $path . '\\';
$prefix = config('database.connections.mysql.prefix');
$column = Db::query('SHOW FULL COLUMNS FROM `' . $prefix . $table . '`');
$pk = '';
foreach ($column as $vo) {
if ($vo['Key'] == 'PRI') {
$pk = $vo['Field'];
break;
}
}
/*
//读取数据结构生成字段
$tritems ='';
$detail ='$detail.';
$index =0;
foreach ($column as $key => $vo) {
$field = $vo['Field'];
$title = $vo['Comment']==''?$field:$vo['Comment'];
if($field != 'id'){
if(($index % 3) == 0){
$tritems.="<tr>
<td class='layui-td-gray-2'>{$title}</td>
<td><input type='text' name='{$field}' value='{{$detail}{$field}}' placeholder='请输入{$title}' class='layui-input' autocomplete='off' /></td>";
}else if(($index % 3) == 1){
$tritems.="
<td class='layui-td-gray-2'>{$title}</td>
<td><input type='text' name='{$field}' value='{{$detail}{$field}}' placeholder='请输入{$title}' class='layui-input' autocomplete='off' /></td>";
}else if(($index % 3) == 2){
$tritems.="
<td class='layui-td-gray-2'>{$title}</td>
<td><input type='text' name='{$field}' value='{{$detail}{$field}}' placeholder='请输入{$title}' class='layui-input' autocomplete='off' /></td>
</tr>
";
}
$index++;
}
}
if(($index % 3) == 1){
$tritems.="<td colspan='4'></td>
</tr>";
}
if(($index % 3) == 2){
$tritems.="<td colspan='2'></td>
</tr>";
}
*/
//读取提交的数据生成字段
$field_column = get_cache('crud_e_'.$table);
$tritems ='';
$index =0;
$summernoteIndex=0;
$inputHtml='';
$textareaHtml='';
$uploadHtml='';
$uploadScript = '';
$summernoteHtml='';
$summernoteForm='';
$summernoteScript='';
$datetimeScript='';
foreach ($field_column as $key => $vo) {
$field = $vo['field'];
$title = $vo['title'];
if($vo['type'] == 'summernote'){
$summernoteHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
$summernoteScript.= "//".$vo['title']."富文本编辑器
var edit = layui.tinymce.render({
selector: '#container_".$vo['field']."',
height: 500
});";
$summernoteForm.= "data.field.".$vo['field']." = tinyMCE.editors['container_".$vo['field']."'].getContent();
if (data.field.".$vo['field']." == '') {
layer.msg('请先完善".$vo['title']."内容');
return false;
}";
$summernoteIndex++;
}
else if($vo['type'] == 'upload'){
$uploadHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
$uploadScript.= "//上传".$vo['title']."
var upload_".$vo['field']." = layui.upload.render({
elem: '#upload_btn_".$vo['field']."',
url: '/admin/api/upload',
done: function (res) {
//如果上传失败
if (res.code == 1) {
return layer.msg('上传失败');
}
//上传成功
$('#upload_box_".$vo['field']." input').attr('value', res.data.filepath);
$('#upload_box_".$vo['field']." img').attr('src', res.data.filepath);
}
});";
}else if($vo['type'] == 'textarea'){
$textareaHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
}else if($vo['type'] == 'textarea'){
$textareaHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
}
else{
if(($index % 3) == 0){
$inputHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required']);
}else if(($index % 3) == 1){
$inputHtml.=$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required']);
}else if(($index % 3) == 2){
$inputHtml.=$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>
";
}
if($vo['type'] == 'datetime'){
$datetimeScript.="//日期选择
layui.laydate.render({
elem: '#laydate_".$vo['field']."' //指定元素
});";
}
$index++;
}
}
if(($index % 3) == 1){
$inputHtml.="<td colspan='4'></td>
</tr>";
}
if(($index % 3) == 2){
$inputHtml.="<td colspan='2'></td>
</tr>";
}
$moduleInit = "var moduleInit = ['tool'];";
if($summernoteIndex>0){
$moduleInit = "var moduleInit = ['tool','tinymce'];";
}
$tritems=$inputHtml.$textareaHtml.$uploadHtml.$summernoteHtml;
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
$tplContent = str_replace('<model>', $model, $tplContent);
$tplContent = str_replace('<tritems>', $tritems, $tplContent);
$tplContent = str_replace('<name>', $other, $tplContent);
$tplContent = str_replace('<pk>', $pk, $tplContent);
$tplContent = str_replace('<moduleInit>', $moduleInit, $tplContent);
$tplContent = str_replace('<datetimeScript>', $datetimeScript, $tplContent);
$tplContent = str_replace('<uploadScript>', $uploadScript, $tplContent);
$tplContent = str_replace('<summernoteForm>', $summernoteForm, $tplContent);
$tplContent = str_replace('<summernoteScript>', $summernoteScript, $tplContent);
file_put_contents(base_path() . $path . DS . 'view' . DS . $model . DS . 'edit.html', $tplContent);
}
public function make_form($field, $type, $title,$required)
{
$required_font = '';
$required_verify = '';
if($required==1){
$required_font = '<font>*</font>';
$required_verify = ' lay-verify="required" lay-reqText="请完善'.$title.'"';
}
$tem=[
'input'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td><input type="text" name="'.$field.'" '.$required_verify.' value="{$detail.'.$field.'}" autocomplete="off" placeholder="请输入'.$title.'" class="layui-input"></td>',
'datetime'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td><input type="text" name="'.$field.'" '.$required_verify.' value="{$detail.'.$field.'|time_format=###,\'Y-m-d\'}" readonly readonly id="laydate_'.$field.'" autocomplete="off" placeholder="请选择" class="layui-input"></td>',
'radio'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td>
<input type="radio" name="'.$field.'" value="0" title="选项一" {eq name="$detail.'.$field.'" value="1"} checked{/eq}>
<input type="radio" name="'.$field.'" value="1" title="选项二" {eq name="$detail.'.$field.'" value="2"} checked{/eq}>
</td>',
'checkbox'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td>
<input type="checkbox" name="'.$field.'" value="1" title="选项一" lay-skin="primary" {eq name="$detail.'.$field.'" value="1"} selected{/eq}>
<input type="checkbox" name="'.$field.'" value="2" title="选项二" lay-skin="primary" {eq name="$detail.'.$field.'" value="2"} selected{/eq}>
</td>',
'select'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td>
<select name="'.$field.'" '.$required_verify.'>
<option value="">请选择</option>
<option value="1" {eq name="$detail.'.$field.'" value="1"} selected{/eq}>选项一</option>
<option value="2" {eq name="$detail.'.$field.'" value="2"} selected{/eq}>选项二</option>
</select>
</td>',
'textarea'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td colspan="5"><textarea name="'.$field.'" '.$required_verify.' placeholder="请输入'.$title.'" class="layui-textarea">{$detail.'.$field.'}</textarea></td>',
'upload'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td colspan="5" style="vertical-align:top">
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-sm" id="upload_btn_'.$field.'">选择上传图片</button>
<div class="layui-upload-list" id="upload_box_'.$field.'">
<img src="{$detail.'.$field.'}" onerror="javascript:this.src=\'{__GOUGU__}/gougu/images/nonepic600x360.jpg\';this.onerror=null;" style="width:200px;max-width:200px" />
<input type="hidden" name="'.$field.'" value="{$detail.'.$field.'}" '.$required_verify.'>
</div>
</div>
</td>',
'summernote'=>'<td class="layui-td-gray-2">'.$title.$required_font.'</td>
<td colspan="5">
<textarea class="layui-textarea" id="container_'.$field.'">{$detail.'.$field.'}</textarea>
</td>'
];
return $tem[$type];
}
}

View File

@ -0,0 +1,80 @@
<?php
namespace app\crud\make\make;
use app\crud\make\ToAutoMake;
use think\facade\App;
use think\facade\Db;
use think\console\Output;
class ListMake implements ToAutoMake
{
public function check($table, $path)
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
$modelName = $table;
$modelFilePath = base_path() . $path . DS . 'view' . DS . $modelName . DS . 'datalist.html';
if (!is_dir(base_path() . $path . DS . 'view' . DS . $modelName)) {
mkdir(base_path() . $path . DS . 'view'. DS . $modelName, 0755, true);
}
if (file_exists($modelFilePath)) {
$output = new Output();
$output->error("$modelName datalist.html已经存在");
exit;
}
}
public function make($table, $path, $other)
{
$listTpl = dirname(dirname(__DIR__)) . '/tpl/list.tpl';
$tplContent = file_get_contents($listTpl);
$model = $table;
$filePath = empty($path) ? '' : DS . $path;
$namespace = empty($path) ? '\\' : '\\' . $path . '\\';
$prefix = config('database.connections.mysql.prefix');
$column = Db::query('SHOW FULL COLUMNS FROM `' . $prefix . $table . '`');
$pk = '';
foreach ($column as $vo) {
if ($vo['Key'] == 'PRI') {
$pk = $vo['Field'];
break;
}
}
$field_column = get_cache('crud_l_'.$table);
$listitems="{
fixed: 'left',
field: 'id',
title: '编号',
align: 'center',
width: 80
},";
foreach ($field_column as $key => $vo) {
if($vo['field'] == 'title'){
$listitems.="{
field: '".$vo['field']."',
title: '".$vo['title']."',
},";
}else{
$listitems.="{
field: '".$vo['field']."',
title: '".$vo['title']."',
align: 'center',
width: 100
},";
}
}
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
$tplContent = str_replace('<model>', $model, $tplContent);
$tplContent = str_replace('<listitems>', $listitems, $tplContent);
$tplContent = str_replace('<name>', $other, $tplContent);
$tplContent = str_replace('<pk>', $pk, $tplContent);
file_put_contents(base_path() . $path . DS . 'view' . DS . $model . DS . 'datalist.html', $tplContent);
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace app\crud\make\make;
use app\crud\make\ToAutoMake;
use think\facade\App;
use think\facade\Db;
use think\console\Output;
class ModelMake implements ToAutoMake
{
public function check($table, $path)
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
$modelName = ucfirst(camelize($table));
$modelFilePath = base_path() . $path . DS . 'model' . DS . $modelName . '.php';
if (!is_dir(base_path() . $path . DS . 'model')) {
mkdir(base_path() . $path . DS . 'model', 0755, true);
}
if (file_exists($modelFilePath)) {
$output = new Output();
$output->error("$modelName.php已经存在");
exit;
}
}
public function make($table, $path, $other)
{
$controllerTpl = dirname(dirname(__DIR__)) . '/tpl/model.tpl';
$tplContent = file_get_contents($controllerTpl);
$model = ucfirst(camelize($table));
$filePath = empty($path) ? '' : DS . $path;
$namespace = empty($path) ? '\\' : '\\' . $path . '\\';
$prefix = config('database.connections.mysql.prefix');
$column = Db::query('SHOW FULL COLUMNS FROM `' . $prefix . $table . '`');
$pk = '';
foreach ($column as $vo) {
if ($vo['Key'] == 'PRI') {
$pk = $vo['Field'];
break;
}
}
$fieldlist=$pk;
$list_column = get_cache('crud_l_'.$table);
foreach ($list_column as $key => $vo) {
$fieldlist.=','.$vo['field'];
}
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
$tplContent = str_replace('<model>', $model, $tplContent);
$tplContent = str_replace('<pk>', $pk, $tplContent);
$tplContent = str_replace('<fieldlist>', $fieldlist, $tplContent);
file_put_contents(base_path() . $path . DS . 'model' . DS . $model . '.php', $tplContent);
}
}

View File

@ -0,0 +1,182 @@
<?php
namespace app\crud\make\make;
use app\crud\make\ToAutoMake;
use think\facade\App;
use think\facade\Db;
use think\console\Output;
class ReadMake implements ToAutoMake
{
public function check($table, $path)
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
$modelName = $table;
$modelFilePath = base_path() . $path . DS . 'view' . DS . $modelName . DS . 'read.html';
if (!is_dir(base_path() . $path . DS . 'view' . DS . $modelName)) {
mkdir(base_path() . $path . DS . 'view'. DS . $modelName, 0755, true);
}
if (file_exists($modelFilePath)) {
$output = new Output();
$output->error("$modelName . DS . view.html已经存在");
exit;
}
}
public function make($table, $path, $other)
{
$readTpl = dirname(dirname(__DIR__)) . '/tpl/read.tpl';
$tplContent = file_get_contents($readTpl);
$model = $table;
$filePath = empty($path) ? '' : DS . $path;
$namespace = empty($path) ? '\\' : '\\' . $path . '\\';
$prefix = config('database.connections.mysql.prefix');
$column = Db::query('SHOW FULL COLUMNS FROM `' . $prefix . $table . '`');
$pk = '';
foreach ($column as $vo) {
if ($vo['Key'] == 'PRI') {
$pk = $vo['Field'];
break;
}
}
/*
//读取数据结构生成字段
$tritems ='';
$detail ='$detail.';
$index =0;
foreach ($column as $key => $vo) {
$field = $vo['Field'];
$title = $vo['Comment']==''?$field:$vo['Comment'];
if($field != 'id'){
if(($index % 3) == 0){
$tritems.="<tr>
<td class='layui-td-gray-2'>{$title}</td>
<td>{{$detail}{$field}}</td>";
}else if(($index % 3) == 1){
$tritems.="
<td class='layui-td-gray-2'>{$title}</td>
<td>{{$detail}{$field}}</td>";
}else if(($index % 3) == 2){
$tritems.="
<td class='layui-td-gray-2'>{$title}</td>
<td>{{$detail}{$field}}</td>
</tr>
";
}
$index++;
}
}
if(($index % 3) == 1){
$tritems.="<td colspan='4'></td>
</tr>";
}
if(($index % 3) == 2){
$tritems.="<td colspan='2'></td>
</tr>";
}
*/
//读取提交的数据生成字段
$field_column = get_cache('crud_r_'.$table);
$tritems ='';
$index =0;
$inputHtml='';
$textareaHtml='';
$uploadHtml='';
$summernoteHtml='';
foreach ($field_column as $key => $vo) {
if($vo['type'] == 'summernote'){
$summernoteHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
}
else if($vo['type'] == 'upload'){
$uploadHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
}else if($vo['type'] == 'textarea'){
$textareaHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
}
else{
if(($index % 3) == 0){
$inputHtml.="<tr>".$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required']);
}else if(($index % 3) == 1){
$inputHtml.=$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required']);
}else if(($index % 3) == 2){
$inputHtml.=$this->make_form($vo['field'], $vo['type'], $vo['title'],$vo['required'])."
</tr>";
}
$index++;
}
}
if(($index % 3) == 1){
$inputHtml.="<td colspan='4'></td>
</tr>";
}
if(($index % 3) == 2){
$inputHtml.="<td colspan='2'></td>
</tr>";
}
$tritems=$inputHtml.$textareaHtml.$uploadHtml.$summernoteHtml;
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
$tplContent = str_replace('<model>', $model, $tplContent);
$tplContent = str_replace('<tritems>', $tritems, $tplContent);
$tplContent = str_replace('<name>', $other, $tplContent);
$tplContent = str_replace('<pk>', $pk, $tplContent);
file_put_contents(base_path() . $path . DS . 'view' . DS . $model . DS . 'read.html', $tplContent);
}
public function make_form($field, $type, $title,$required)
{
$tem=[
'input'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td>{$detail.'.$field.'}</td>',
'datetime'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td>{$detail.'.$field.'|time_format=###,\'Y-m-d\'}</td>',
'radio'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td>
{eq name="$detail.'.$field.'" value="0"}选项一{/eq}
{eq name="$detail.'.$field.'" value="1"}选项二{/eq}
</td>',
'checkbox'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td>
{eq name="$detail.'.$field.'" value="1"}选项一{/eq}
{eq name="$detail.'.$field.'" value="2"}选项二{/eq}
</td>',
'select'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td>
{eq name="$detail.'.$field.'" value="1"}选项一{/eq}
{eq name="$detail.'.$field.'" value="2"}选项二{/eq}
</td>',
'textarea'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td colspan="5">{$detail.'.$field.'}</td>',
'upload'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td colspan="5">
<img src="{$detail.'.$field.'}" onerror="javascript:this.src=\'{__GOUGU__}/gougu/images/nonepic600x360.jpg\';this.onerror=null;" style="width:200px; max-width:200px" />
</td>',
'summernote'=>'<td class="layui-td-gray-2">'.$title.'</td>
<td colspan="5">
{$detail.'.$field.'|raw}
</td>'
];
return $tem[$type];
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace app\crud\make\make;
use app\crud\make\ToAutoMake;
use Symfony\Component\VarExporter\VarExporter;
use think\console\Output;
use think\facade\App;
use think\facade\Db;
class ValidateMake implements ToAutoMake
{
public function check($table, $path)
{
!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
$validateName = ucfirst(camelize($table)) . 'Validate';
$validateFilePath = base_path() . $path . DS . 'validate' . DS . $validateName . '.php';
if (!is_dir(base_path() . $path . DS . 'validate')) {
mkdir(base_path() . $path . DS . 'validate', 0755, true);
}
if (file_exists($validateFilePath)) {
$output = new Output();
$output->error("$validateName.php已经存在");
exit;
}
}
public function make($table, $path, $other)
{
$validateTpl = dirname(dirname(__DIR__)) . '/tpl/validate.tpl';
$tplContent = file_get_contents($validateTpl);
$model = ucfirst(camelize($table));
$filePath = empty($path) ? '' : DS . $path;
$namespace = empty($path) ? '\\' : '\\' . $path . '\\';
//$prefix = config('database.connections.mysql.prefix');
//$column = Db::query('SHOW FULL COLUMNS FROM `' . $prefix . $table . '`');
$column = get_cache('crud_v_'.$table);
$rule = [];
$message = [];
foreach ($column as $vo) {
$rule[$vo['field']] = 'require';
$message[$vo['field'].'.require'] = $vo['title'].'不能为空';
}
$ruleArr = VarExporter::export($rule);
$messageArr = VarExporter::export($message);
$tplContent = str_replace('<namespace>', $namespace, $tplContent);
$tplContent = str_replace('<model>', $model, $tplContent);
$tplContent = str_replace('<rule>', '' . $ruleArr, $tplContent);
$tplContent = str_replace('<message>', $messageArr, $tplContent);
file_put_contents(base_path() . $filePath . DS . 'validate' . DS . $model . 'Validate.php', $tplContent);
}
}

Some files were not shown because too many files have changed in this diff Show More