勾股cms4.0发布,新增一键crud功能,新增图集模块,新增部门模块、新增职位模块,其他模块代码重构等
This commit is contained in:
parent
68e662996e
commit
5ed76a4697
@ -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();
|
||||
|
@ -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'));
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
149
app/admin/controller/ArticleCate.php
Normal file
149
app/admin/controller/ArticleCate.php
Normal 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);
|
||||
}
|
||||
}
|
250
app/admin/controller/Crud.php
Normal file
250
app/admin/controller/Crud.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
103
app/admin/controller/Department.php
Normal file
103
app/admin/controller/Department.php
Normal 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, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
171
app/admin/controller/Gallery.php
Normal file
171
app/admin/controller/Gallery.php
Normal 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);
|
||||
}
|
||||
}
|
150
app/admin/controller/GalleryCate.php
Normal file
150
app/admin/controller/GalleryCate.php
Normal 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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
143
app/admin/controller/GoodsCate.php
Normal file
143
app/admin/controller/GoodsCate.php
Normal 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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
97
app/admin/controller/Position.php
Normal file
97
app/admin/controller/Position.php
Normal 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, "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
201
app/admin/model/Gallery.php
Normal 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();
|
||||
}
|
||||
}
|
||||
|
101
app/admin/model/GalleryCate.php
Normal file
101
app/admin/model/GalleryCate.php
Normal 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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
29
app/admin/validate/ArticleCateValidate.php
Normal file
29
app/admin/validate/ArticleCateValidate.php
Normal 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' => '同样的分类名称已经存在',
|
||||
];
|
||||
}
|
@ -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'],
|
||||
];
|
||||
}
|
26
app/admin/validate/ArticleValidate.php
Normal file
26
app/admin/validate/ArticleValidate.php
Normal 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' => '文章内容不能为空',
|
||||
];
|
||||
}
|
@ -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'],
|
||||
];
|
||||
}
|
||||
}
|
29
app/admin/validate/GalleryCateValidate.php
Normal file
29
app/admin/validate/GalleryCateValidate.php
Normal 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' => '同样的分类名称已经存在',
|
||||
];
|
||||
}
|
24
app/admin/validate/GalleryValidate.php
Normal file
24
app/admin/validate/GalleryValidate.php
Normal 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' => '缩略图不能为空',
|
||||
];
|
||||
}
|
@ -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'],
|
||||
];
|
||||
}
|
20
app/admin/validate/GoodsCateValidate.php
Normal file
20
app/admin/validate/GoodsCateValidate.php
Normal 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' => '分类名称不能为空',
|
||||
];
|
||||
}
|
@ -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'],
|
||||
];
|
||||
}
|
32
app/admin/validate/GoodsValidate.php
Normal file
32
app/admin/validate/GoodsValidate.php
Normal 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' => '商品库存不能为空',
|
||||
];
|
||||
}
|
@ -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'],
|
||||
];
|
||||
}
|
26
app/admin/validate/PagesValidate.php
Normal file
26
app/admin/validate/PagesValidate.php
Normal 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文件名称已经存在',
|
||||
];
|
||||
}
|
32
app/admin/validate/PositionCheck.php
Normal file
32
app/admin/validate/PositionCheck.php
Normal 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'],
|
||||
];
|
||||
}
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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"}
|
||||
|
@ -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);
|
||||
|
173
app/admin/view/article/datalist.html
Normal file
173
app/admin/view/article/datalist.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
52
app/admin/view/article/read.html
Normal file
52
app/admin/view/article/read.html
Normal 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}
|
||||
<!-- /主体 -->
|
@ -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;
|
||||
});
|
||||
}
|
@ -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);
|
||||
});
|
||||
}
|
70
app/admin/view/article_cate/edit.html
Normal file
70
app/admin/view/article_cate/edit.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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}
|
||||
|
56
app/admin/view/crud/index.html
Normal file
56
app/admin/view/crud/index.html
Normal 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}
|
||||
<!-- /脚本 -->
|
285
app/admin/view/crud/table.html
Normal file
285
app/admin/view/crud/table.html
Normal 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}
|
95
app/admin/view/department/add.html
Normal file
95
app/admin/view/department/add.html
Normal 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}
|
||||
<!-- /脚本 -->
|
80
app/admin/view/department/index.html
Normal file
80
app/admin/view/department/index.html
Normal 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}
|
||||
<!-- /脚本 -->
|
405
app/admin/view/gallery/add.html
Normal file
405
app/admin/view/gallery/add.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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);
|
||||
});
|
||||
}
|
454
app/admin/view/gallery/edit.html
Normal file
454
app/admin/view/gallery/edit.html
Normal 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}
|
||||
<!-- /脚本 -->
|
138
app/admin/view/gallery/read.html
Normal file
138
app/admin/view/gallery/read.html
Normal 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}
|
||||
<!-- /脚本 -->
|
71
app/admin/view/gallery_cate/add.html
Normal file
71
app/admin/view/gallery_cate/add.html
Normal 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}
|
||||
<!-- /脚本 -->
|
104
app/admin/view/gallery_cate/datalist.html
Normal file
104
app/admin/view/gallery_cate/datalist.html
Normal 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}
|
||||
<!-- /脚本 -->
|
71
app/admin/view/gallery_cate/edit.html
Normal file
71
app/admin/view/gallery_cate/edit.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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}
|
||||
|
192
app/admin/view/goods/datalist.html
Normal file
192
app/admin/view/goods/datalist.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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}
|
||||
|
122
app/admin/view/goods/read.html
Normal file
122
app/admin/view/goods/read.html
Normal 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}
|
||||
<!-- /主体 -->
|
@ -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;
|
||||
});
|
||||
}
|
@ -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);
|
||||
});
|
||||
}
|
72
app/admin/view/goods_cate/edit.html
Normal file
72
app/admin/view/goods_cate/edit.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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">
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
@ -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}
|
||||
|
151
app/admin/view/pages/datalist.html
Normal file
151
app/admin/view/pages/datalist.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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}
|
||||
|
@ -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}
|
||||
<!-- /脚本 -->
|
39
app/admin/view/pages/read.html
Normal file
39
app/admin/view/pages/read.html
Normal 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}
|
||||
<!-- /主体 -->
|
101
app/admin/view/position/add.html
Normal file
101
app/admin/view/position/add.html
Normal 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}
|
||||
<!-- /脚本 -->
|
109
app/admin/view/position/index.html
Normal file
109
app/admin/view/position/index.html
Normal 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}
|
||||
<!-- /脚本 -->
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
131
app/common.php
131
app/common.php
@ -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
81
app/crud/command/Crud.php
Normal 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");
|
||||
}
|
||||
}
|
52
app/crud/command/CrudAdd.php
Normal file
52
app/crud/command/CrudAdd.php
Normal 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");
|
||||
}
|
||||
}
|
51
app/crud/command/CrudController.php
Normal file
51
app/crud/command/CrudController.php
Normal 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");
|
||||
}
|
||||
}
|
51
app/crud/command/CrudEdit.php
Normal file
51
app/crud/command/CrudEdit.php
Normal 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");
|
||||
}
|
||||
}
|
51
app/crud/command/CrudList.php
Normal file
51
app/crud/command/CrudList.php
Normal 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");
|
||||
}
|
||||
}
|
51
app/crud/command/CrudModel.php
Normal file
51
app/crud/command/CrudModel.php
Normal 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");
|
||||
}
|
||||
}
|
51
app/crud/command/CrudRead.php
Normal file
51
app/crud/command/CrudRead.php
Normal 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");
|
||||
}
|
||||
}
|
51
app/crud/command/CrudValidate.php
Normal file
51
app/crud/command/CrudValidate.php
Normal 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");
|
||||
}
|
||||
}
|
21
app/crud/make/AutoMake.php
Normal file
21
app/crud/make/AutoMake.php
Normal 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);
|
||||
}
|
||||
}
|
10
app/crud/make/ToAutoMake.php
Normal file
10
app/crud/make/ToAutoMake.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace app\crud\make;
|
||||
|
||||
interface ToAutoMake
|
||||
{
|
||||
public function check($flag, $path);
|
||||
|
||||
public function make($flag, $path, $other);
|
||||
}
|
243
app/crud/make/make/AddMake.php
Normal file
243
app/crud/make/make/AddMake.php
Normal 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];
|
||||
}
|
||||
}
|
107
app/crud/make/make/ControllerMake.php
Normal file
107
app/crud/make/make/ControllerMake.php
Normal 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);
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
248
app/crud/make/make/EditMake.php
Normal file
248
app/crud/make/make/EditMake.php
Normal 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];
|
||||
}
|
||||
}
|
80
app/crud/make/make/ListMake.php
Normal file
80
app/crud/make/make/ListMake.php
Normal 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);
|
||||
}
|
||||
}
|
61
app/crud/make/make/ModelMake.php
Normal file
61
app/crud/make/make/ModelMake.php
Normal 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);
|
||||
}
|
||||
}
|
182
app/crud/make/make/ReadMake.php
Normal file
182
app/crud/make/make/ReadMake.php
Normal 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];
|
||||
}
|
||||
}
|
60
app/crud/make/make/ValidateMake.php
Normal file
60
app/crud/make/make/ValidateMake.php
Normal 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
Loading…
x
Reference in New Issue
Block a user