diff --git a/app/data/controller/ArticleContent.php b/app/data/controller/ArticleContent.php new file mode 100644 index 000000000..9f616b558 --- /dev/null +++ b/app/data/controller/ArticleContent.php @@ -0,0 +1,140 @@ +<?php + +namespace app\data\controller; + +use think\admin\Controller; + +/** + * 文章内容管理 + * Class ArticleContent + * @package app\data\controller + */ +class ArticleContent extends Controller +{ + /** + * 绑定数据表 + * @var string + */ + private $table = 'DataArticleContent'; + + /** + * 平台标签配置 + * @var array + */ + protected $types = ['video' => '视频', 'article' => '文章', 'audio' => '音频']; + + /** + * 文章内容管理 + * @auth true + * @menu true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function index() + { + $this->title = '文章内容管理'; + $query = $this->_query($this->table); + $query->like('title,tags')->dateBetween('create_at'); + $query->where(['deleted' => 0])->order('sort desc,id desc')->page(); + } + + /** + * 文章内容管理 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function select() + { + $query = $this->_query($this->table)->equal('status')->like('title'); + $query->where(['deleted' => '0'])->dateBetween('create_at')->order('sort desc,id desc')->page(); + } + + /** + * 列表数据处理 + * @param array $data + */ + protected function _page_filter(&$data) + { + foreach ($data as &$vo) { + $vo['tags'] = explode(',', trim($vo['tags'], ',')); + } + } + + /** + * 添加文章内容 + * @auth true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function add() + { + $this->title = '添加文章内容'; + $this->_form($this->table, 'form'); + } + + /** + * 编辑文章内容 + * @auth true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function edit() + { + $this->title = '编辑文章内容'; + $this->_form($this->table, 'form'); + } + + /** + * 表单数据处理 + * @param array $data + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + protected function _form_filter(&$data) + { + if ($this->request->isGet()) { + [$map, $sort] = [['deleted' => 0, 'status' => 1], 'sort desc,id desc']; + $this->tags = $this->app->db->name('DataArticleTags')->where($map)->order($sort)->select()->toArray(); + $data['tags'] = isset($data['tags']) && $data['tags'] ? explode(',', trim($data['tags'], ',')) : []; + } else { + $data['tags'] = ',' . join(',', isset($data['tags']) && is_array($data['tags']) ? $data['tags'] : []) . ','; + } + } + + /** + * 表单结果处理 + * @param boolean $state + */ + protected function _form_result($state) + { + if ($state) { + $this->success('文章内容保存成功!', 'javascript:history.back()'); + } + } + + /** + * 修改文章状态 + * @auth true + * @throws \think\db\exception\DbException + */ + public function state() + { + $this->_save($this->table); + } + + /** + * 删除文章内容 + * @auth true + * @throws \think\db\exception\DbException + */ + public function remove() + { + $this->_delete($this->table); + } + +} \ No newline at end of file diff --git a/app/data/controller/ArticleTags.php b/app/data/controller/ArticleTags.php new file mode 100644 index 000000000..0bdca5481 --- /dev/null +++ b/app/data/controller/ArticleTags.php @@ -0,0 +1,80 @@ +<?php + +namespace app\data\controller; + +use think\admin\Controller; + +/** + * 文章标签管理 + * Class ArticleTags + * @package app\data\controller + */ +class ArticleTags extends Controller +{ + /** + * 绑定数据表 + * @var string + */ + private $table = 'DataArticleTags'; + + /** + * 文章标签管理 + * @auth true + * @menu true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function index() + { + $this->title = '文章标签管理'; + $query = $this->_query($this->table); + $query->like('title')->equal('status')->dateBetween('create_at'); + $query->where(['deleted' => 0])->order('sort desc,id desc')->page(); + } + + /** + * 添加文章标签 + * @auth true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function add() + { + $this->_form($this->table, 'form'); + } + + /** + * 编辑文章标签 + * @auth true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function edit() + { + $this->_form($this->table, 'form'); + } + + /** + * 修改文章标签状态 + * @auth true + * @throws \think\db\exception\DbException + */ + public function state() + { + $this->_save($this->table); + } + + /** + * 删除文章标签 + * @auth true + * @throws \think\db\exception\DbException + */ + public function remove() + { + $this->_delete($this->table); + } + +} \ No newline at end of file diff --git a/app/data/controller/api/Article.php b/app/data/controller/api/Article.php new file mode 100644 index 000000000..f8ed4e8d6 --- /dev/null +++ b/app/data/controller/api/Article.php @@ -0,0 +1,86 @@ +<?php + +namespace app\data\controller\api; + +use think\admin\Controller; + +class Article extends Controller +{ + /** + * 获取文章标签列表 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function getTags() + { + $table = 'DataArticleTags'; + $query = $this->_query($table)->like('title'); + $query->where(['deleted' => 0, 'status' => 1])->withoutField('sort,status,deleted'); + $this->success('获取文章标签列表', $query->order('sort desc,id desc')->page(false, false)); + } + + /** + * 获取文章内容列表 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function getContent() + { + if (($id = intval(input('id', 0))) > 0) { + $this->app->db->name('DataArticleContent')->where(['id' => $id])->update([ + 'number_reads' => $this->app->db->raw('`number_reads`+1'), + ]); + if (input('mid') > 0) { + $history = ['mid' => input('mid'), 'cid' => $id]; + $this->app->db->name('DataArticleHistory')->where($history)->delete(); + $this->app->db->name('DataArticleHistory')->insert($history); + } + } + $query = $this->_query('DataArticleContent')->equal('type,id')->like('title,tags,type'); + $query->where(['deleted' => 0, 'status' => 1])->withoutField('sort,status,deleted'); + $result = $query->order('sort desc,id desc')->page(false, false); + foreach ($result['list'] as &$vo) $vo['tags'] = trim($vo['tags'], ','); + $this->success('获取文章内容列表', $result); + } + + /** + * 获取文章评论 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function getComment() + { + $data = $this->_vali(['cid.require' => '文章ID不能为空!']); + $query = $this->_query('DataArticleComment')->where($data); + $result = $query->order('id desc')->page(false, false, false, 5); + if (count($result['list']) > 0) { + $ids = array_unique(array_column($result['list'], 'mid')); + $mems = $this->app->db->name('DataMember')->whereIn('id', $ids)->column('id,nickname,username,headimg', 'id'); + foreach ($result['list'] as &$vo) $vo['member'] = $mems[$vo['mid']] ?? []; + } + $this->success('获取文章评论成功!', $result); + } + + /** + * 获取已点赞的会员 + */ + public function getLike() + { + $data = $this->_vali(['cid.require' => '文章ID不能为空!']); + $query = $this->app->db->name('DataArticleLike')->where($data); + $this->success('获取已点赞的会员', ['list' => $query->order('mid asc')->column('mid')]); + } + + /** + * 获取已收藏的会员 + */ + public function getCollection() + { + $data = $this->_vali(['cid.require' => '文章ID不能为空!']); + $query = $this->app->db->name('DataArticleCollection')->where($data); + $this->success('获取已收藏的会员', ['list' => $query->order('mid asc')->column('mid')]); + } +} \ No newline at end of file diff --git a/app/data/controller/api/Member.php b/app/data/controller/api/Member.php new file mode 100644 index 000000000..82a1f363a --- /dev/null +++ b/app/data/controller/api/Member.php @@ -0,0 +1,60 @@ +<?php + +namespace app\data\controller\api; + +use think\admin\Controller; +use app\data\service\MemberService; +use think\exception\HttpResponseException; + +/** + * 会员管理基类 + * Class Member + * @package app\store\controller\api + */ +abstract class Member extends Controller +{ + /** + * 当前会员ID + * @var integer + */ + protected $mid; + + /** + * 当前会员数据 + * @var array + */ + protected $member; + + /** + * 控制器初始化 + * @return $this + */ + protected function initialize() + { + [$this->mid, $this->token] = [input('mid', ''), input('token', '')]; + if (empty($this->mid)) $this->error('请求会员MID无效!'); + if (empty($this->token)) $this->error('接口授权TOKEN无效!'); + $this->member = $this->getMember(); + return $this; + } + + /** + * 获取会员数据 + * @return array + */ + protected function getMember() + { + try { + $this->member = MemberService::instance()->get($this->mid); + if ($this->member['token'] !== $this->token) { + $this->error('无效的授权,请重新登录授权!'); + } + return $this->member; + } catch (HttpResponseException $exception) { + throw $exception; + } catch (\Exception $exception) { + $this->error($exception->getMessage()); + } + } + +} diff --git a/app/data/controller/api/member/Article.php b/app/data/controller/api/member/Article.php new file mode 100644 index 000000000..8e67bf7f8 --- /dev/null +++ b/app/data/controller/api/member/Article.php @@ -0,0 +1,168 @@ +<?php + +namespace app\data\controller\api\member; + +use app\data\controller\api\Member; +use app\data\service\ArticleService; + +/** + * 文章评论内容 + * Class Article + * @package app\data\controller\api\member + */ +class Article extends Member +{ + /** + * 会员评论内容 + * @throws \think\db\exception\DbException + */ + public function addComment() + { + $data = $this->_vali([ + 'mid.value' => $this->mid, + 'cid.require' => '文章ID不能为空!', + 'content.require' => '评论内容不能为空!', + ]); + if ($this->app->db->name('DataArticleComment')->insert($data) !== false) { + ArticleService::instance()->syncTotal($data['cid']); + $this->success('添加评论成功!'); + } else { + $this->error('添加评论失败!'); + } + } + + /** + * 删除内容评论 + * @throws \think\db\exception\DbException + */ + public function delComment() + { + $data = $this->_vali([ + 'mid.value' => $this->mid, + 'id.require' => '评论ID不能为空', + 'cid.require' => '文章ID不能为空!', + ]); + if ($this->app->db->name('DataArticleComment')->where($data)->delete() !== false) { + $this->success('评论删除成功!'); + } else { + $this->error('认证删除失败!'); + } + } + + /** + * 获取我的评论 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function getComment() + { + $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); + $this->success('获取评论列表成功', [ + 'list' => $this->app->db->name('DataArticleComment')->where($data)->order('id desc')->select()->toArray(), + ]); + } + + /** + * 添加内容收藏 + * @throws \think\db\exception\DbException + */ + public function addCollection() + { + $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); + if ($this->app->db->name('DataArticleCollection')->where($data)->count() > 0) { + $this->success('您已收藏!'); + } + if ($this->app->db->name('DataArticleCollection')->insert($data) !== false) { + ArticleService::instance()->syncTotal($data['cid']); + $this->success('收藏成功!'); + } else { + $this->error('收藏失败!'); + } + } + + /** + * 取消收藏课程 + * @throws \think\db\exception\DbException + */ + public function delCollection() + { + $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '课程ID不能为空!']); + if ($this->app->db->name('DataArticleCollection')->where($data)->delete() !== false) { + ArticleService::instance()->syncTotal($data['cid']); + $this->success('取消收藏成功!'); + } else { + $this->error('取消收藏失败!'); + } + } + + /** + * 获取我收藏的资讯 + * @throws \think\db\exception\DbException + */ + public function getMyCollection() + { + $query = $this->_query('DataArticleCollection')->where(['mid' => $this->mid]); + $result = $query->order('id desc')->page(true, false, false, 15); + if (count($result['list']) > 0) { + $ids = array_unique(array_column($result['list'], 'cid')); + $fields = 'id,title,logo,source,number_likes,number_reads,number_comment,number_collection,status,deleted,create_at'; + $Articles = $this->app->db->name('DataArticleContent')->whereIn('id', $ids)->column($fields, 'id'); + foreach ($result['list'] as &$vo) $vo['record'] = $Articles[$vo['cid']] ?? []; + } + $this->success('获取收藏记录成功!', $result); + } + + /** + * 添加内容点赞 + * @throws \think\db\exception\DbException + */ + public function addLike() + { + $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); + if ($this->app->db->name('DataArticleLike')->where($data)->count() > 0) { + $this->success('您已点赞!'); + } + if ($this->app->db->name('DataArticleLike')->insert($data) !== false) { + ArticleService::instance()->syncTotal($data['cid']); + $this->success('点赞成功!'); + } else { + $this->error('点赞失败!'); + } + } + + /** + * 取消内容点赞 + * @throws \think\db\exception\DbException + */ + public function delLike() + { + $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); + if ($this->app->db->name('DataArticleLike')->where($data)->delete() !== false) { + ArticleService::instance()->syncTotal($data['cid']); + $this->success('取消点赞成功!'); + } else { + $this->error('取消点赞失败!'); + } + } + + /** + * 获取浏览历史 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function getHistory() + { + $query = $this->_query('DataArticleHistory')->where(['mid' => $this->mid]); + $result = $query->order('id desc')->page(true, false, false, 15); + if (count($result['list']) > 0) { + $ids = array_unique(array_column($result['list'], 'cid')); + $fields = 'id,title,logo,source,number_likes,number_reads,number_comment,number_collection,status,deleted,create_at'; + $articles = $this->app->db->name('DataArticleContent')->whereIn('id', $ids)->column($fields, 'id'); + foreach ($result['list'] as &$vo) $vo['record'] = $articles[$vo['cid']] ?? []; + } + $this->success('获取浏览历史成功!', $result); + } + +} \ No newline at end of file diff --git a/app/data/controller/api/member/Center.php b/app/data/controller/api/member/Center.php new file mode 100644 index 000000000..b6b34b039 --- /dev/null +++ b/app/data/controller/api/member/Center.php @@ -0,0 +1,91 @@ +<?php + +namespace app\data\controller\api\member; + +use app\data\controller\api\Member; +use app\data\service\MemberService; + +/** + * 会员资料管理 + * Class Center + * @package app\data\controller\api\member + */ +class Center extends Member +{ + + /** + * 更新会员资料 + * @throws \think\db\exception\DbException + */ + public function set() + { + $data = $this->_vali([ + 'headimg.default' => '', + 'username.default' => '', + 'base_age.default' => '', + 'base_sex.default' => '', + 'base_height.default' => '', + 'base_weight.default' => '', + 'base_birthday.default' => '', + ]); + foreach ($data as $key => $vo) if ($vo === '') unset($data[$key]); + if (empty($data)) $this->error('没有需要修改的数据!'); + if ($this->app->db->name('DataMember')->where(['id' => $this->mid])->update($data) !== false) { + // 绑定资源完成检查的任务 + $this->success('更新会员资料成功!', $this->getMember()); + } else { + $this->error('更新会员资料失败!'); + } + } + + /** + * 获取会员资料 + */ + public function get() + { + $this->success('获取会员资料', $this->getMember()); + } + + /** + * 获取会员数据统计 + */ + public function total() + { + $this->success('获取会员数据统计!', MemberService::instance()->total($this->mid)); + } + + /** + * 绑定会员邀请人 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function bindFrom() + { + $data = $this->_vali(['from.require' => '邀请人不能为空']); + if ($data['from'] == $this->mid) { + $this->error('邀请人不能是自己哦', MemberService::instance()->total($this->mid)); + } + $from = $this->app->db->name('DataMember')->where(['id' => $data['from']])->find(); + if (empty($from)) $this->error('邀请人状态异常', MemberService::instance()->total($this->mid)); + if ($this->member['from'] > 0) $this->error('您已经绑定了邀请人', MemberService::instance()->total($this->mid)); + if ($this->app->db->name('DataMember')->where(['id' => $this->mid])->update($data) !== false) { + $this->success('绑定邀请人成功!', MemberService::instance()->total($this->mid)); + } else { + $this->error('绑定邀请人失败!', MemberService::instance()->total($this->mid)); + } + } + + /** + * 获取我邀请的朋友 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function getFrom() + { + $query = $this->_query('DataMember'); + $query->where(['from' => $this->mid])->field('id,from,user,nickname,headimg,create_at'); + $this->success('获取我邀请的朋友', $query->order('id desc')->page(true, false, false, 15)); + } +} \ No newline at end of file diff --git a/app/data/data.sql b/app/data/data.sql new file mode 100644 index 000000000..8a1253747 --- /dev/null +++ b/app/data/data.sql @@ -0,0 +1,196 @@ +/* + Navicat MySQL Data Transfer + + Source Server : server.cuci.cc + Source Server Type : MySQL + Source Server Version : 50562 + Source Host : localhost:3306 + Source Schema : admin_v6 + + Target Server Type : MySQL + Target Server Version : 50562 + File Encoding : 65001 + + Date: 13/07/2020 14:50:12 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for data_article_collection +-- ---------------------------- +DROP TABLE IF EXISTS `data_article_collection`; +CREATE TABLE `data_article_collection` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `cid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章编号', + `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员MID', + `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '评论内容', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_article_comment_cid`(`cid`) USING BTREE, + INDEX `idx_data_article_comment_mid`(`mid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-文章-收藏' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_article_comment +-- ---------------------------- +DROP TABLE IF EXISTS `data_article_comment`; +CREATE TABLE `data_article_comment` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `cid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章编号', + `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员MID', + `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '评论内容', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_article_comment_cid`(`cid`) USING BTREE, + INDEX `idx_data_article_comment_mid`(`mid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-文章-评论' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_article_content +-- ---------------------------- +DROP TABLE IF EXISTS `data_article_content`; +CREATE TABLE `data_article_content` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '文章标题', + `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '文章类型(video,article,audio)', + `logo` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '攻略图片', + `tags` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '文章标签', + `source` varchar(900) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '媒体资源', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注说明', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '文章内容', + `number_likes` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章点赞数', + `number_reads` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章阅读数', + `number_comment` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章评论数', + `number_collection` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章收藏数', + `sort` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '排序权重', + `status` tinyint(1) UNSIGNED NULL DEFAULT 1 COMMENT '权限状态(1使用,0禁用)', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '删除状态(0未删,1已删)', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_article_content_type`(`type`) USING BTREE, + INDEX `idx_data_article_content_status`(`status`) USING BTREE, + INDEX `idx_data_article_content_deleted`(`deleted`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-文章-内容' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_article_history +-- ---------------------------- +DROP TABLE IF EXISTS `data_article_history`; +CREATE TABLE `data_article_history` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `cid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章编号', + `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员MID', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_article_history_cid`(`cid`) USING BTREE, + INDEX `idx_data_article_history_mid`(`mid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-文章-历史' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_article_like +-- ---------------------------- +DROP TABLE IF EXISTS `data_article_like`; +CREATE TABLE `data_article_like` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `cid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章编号', + `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员MID', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_article_comment_cid`(`cid`) USING BTREE, + INDEX `idx_data_article_comment_mid`(`mid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-文章-点赞' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_article_tags +-- ---------------------------- +DROP TABLE IF EXISTS `data_article_tags`; +CREATE TABLE `data_article_tags` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '标签名称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '标签说明', + `sort` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '排序权重', + `status` tinyint(1) UNSIGNED NULL DEFAULT 1 COMMENT '权限状态(1使用,0禁用)', + `deleted` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '删除状态', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_article_tags_status`(`status`) USING BTREE, + INDEX `idx_data_article_tags_deleted`(`deleted`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-文章-标签' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_member +-- ---------------------------- +DROP TABLE IF EXISTS `data_member`; +CREATE TABLE `data_member` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `from` bigint(20) NULL DEFAULT 0 COMMENT '邀请者MID', + `token` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '授权TOKEN', + `openid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '小程序OPENID', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员手机', + `headimg` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员头像', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员姓名', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员昵称', + `password` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录密码', + `region_province` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '所在省份', + `region_city` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '所在城市', + `region_area` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '所在区域', + `base_age` bigint(20) NULL DEFAULT 0 COMMENT '会员年龄', + `base_sex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员性别', + `base_height` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员身高', + `base_weight` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员体重', + `base_birthday` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '会员生日', + `coin_total` bigint(20) NULL DEFAULT 0 COMMENT '金币数量', + `coin_used` bigint(20) NULL DEFAULT 0 COMMENT '金币已用', + `status` tinyint(1) UNSIGNED NULL DEFAULT 1 COMMENT '会员状态(1正常,0已拉黑)', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '删除状态', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_member_token`(`token`) USING BTREE, + INDEX `idx_data_member_status`(`status`) USING BTREE, + INDEX `idx_data_member_openid`(`openid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-会员' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_member_coin +-- ---------------------------- +DROP TABLE IF EXISTS `data_member_coin`; +CREATE TABLE `data_member_coin` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员ID', + `code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '记录编号', + `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '记录类型', + `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '记录名称', + `number` bigint(20) NULL DEFAULT 0 COMMENT '奖励数量', + `date` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '记录日期', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_member_coin_mid`(`mid`) USING BTREE, + INDEX `idx_data_member_coin_type`(`type`) USING BTREE, + INDEX `idx_data_member_coin_name`(`name`) USING BTREE, + INDEX `idx_data_member_coin_date`(`date`) USING BTREE, + INDEX `idx_data_member_coin_code`(`code`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据-会员-金币-获得' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for data_member_coin_used +-- ---------------------------- +DROP TABLE IF EXISTS `data_member_coin_used`; +CREATE TABLE `data_member_coin_used` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员ID', + `from` bigint(20) NULL DEFAULT 0 COMMENT '来自MID', + `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '记录类型', + `target` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '目标ID', + `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '记录名称', + `number` bigint(20) NULL DEFAULT 0 COMMENT '奖励数量', + `date` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '记录日期', + `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_data_member_coin_used_mid`(`mid`) USING BTREE, + INDEX `idx_data_member_coin_used_type`(`type`) USING BTREE, + INDEX `idx_data_member_coin_used_name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据-会员-金币-消费' ROW_FORMAT = Compact; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/app/data/service/ArticleService.php b/app/data/service/ArticleService.php new file mode 100644 index 000000000..0a73d5bde --- /dev/null +++ b/app/data/service/ArticleService.php @@ -0,0 +1,28 @@ +<?php + +namespace app\data\service; + +use think\admin\Service; + +/** + * 文章数据处理服务 + * Class ArticleService + * @package app\data\service + */ +class ArticleService extends Service +{ + /** + * 同步文章数据统计 + * @param integer $cid 文章ID + * @throws \think\db\exception\DbException + */ + public function syncTotal($cid) + { + $this->app->db->name('DataArticleContent')->where(['id' => $cid])->update([ + 'number_likes' => $this->app->db->name('DataArticleLike')->where(['cid' => $cid])->count(), + 'number_comment' => $this->app->db->name('DataArticleComment')->where(['cid' => $cid])->count(), + 'number_collection' => $this->app->db->name('DataArticleCollection')->where(['cid' => $cid])->count(), + ]); + } + +} \ No newline at end of file diff --git a/app/data/service/MemberService.php b/app/data/service/MemberService.php new file mode 100644 index 000000000..63c74222e --- /dev/null +++ b/app/data/service/MemberService.php @@ -0,0 +1,70 @@ +<?php + +namespace app\data\service; + +use think\admin\extend\CodeExtend; +use think\admin\Service; + +/** + * 会员数据服务 + * Class MemberService + * @package app\store\service + */ +class MemberService extends Service +{ + /** + * 绑定数据表 + * @var string + */ + protected $table = 'DataMember'; + + /** + * 获取商品会员资料 + * @param string $openid + * @param array $data + * @return array + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function get($openid, $data = []) + { + $map = ['id|openid' => $openid]; + $query = $this->app->db->name($this->table)->where(['deleted' => 0]); + $member = $query->withoutField('status,deleted')->where($map)->find(); + if (empty($member)) throw new \think\Exception('会员查询失败'); + return array_merge($member, $data); + } + + /** + * 刷新会员授权token + * @param string $openid + * @param array $data + * @return array + * @throws \think\Exception + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function token($openid, $data = []) + { + $this->app->db->name($this->table)->where(['id|openid' => $openid])->update([ + 'token' => CodeExtend::random(20, 3, 't'), + ]); + return $this->get($openid, $data); + } + + /** + * 获取会员数据统计 + * @param integer $mid + * @return array + */ + public function total($mid) + { + return [ + 'myinvited' => $this->app->db->name('DataMember')->where(['from' => $mid])->count(), + ]; + } + +} \ No newline at end of file diff --git a/app/data/view/article_content/form.html b/app/data/view/article_content/form.html new file mode 100644 index 000000000..1aae92ddf --- /dev/null +++ b/app/data/view/article_content/form.html @@ -0,0 +1,102 @@ +{extend name="../../admin/view/main"} + +{block name='content'} +<form class="layui-form layui-card" action="{:request()->url()}" data-auto="true" method="post" autocomplete="off"> + + <div class="layui-card-body padding-40"> + + <div class="layui-form-item relative block"> + <span class="color-green font-w7 label-required-prev">文章类型</span> + <div class="tags-container layui-textarea"> + {empty name='vo.type'}{assign name='vo.type' value='video'}{/empty} + {foreach $types as $key=>$type}{if isset($vo.type) and $key eq $vo.type} + <label class="think-radio notselect"><input checked type="radio" name="type" value="{$key}" lay-ignore> {$type}</label> + {else} + <label class="think-radio notselect"><input type="radio" name="type" value="{$key}" lay-ignore> {$type}</label> + {/if}{/foreach} + </div> + </div> + + <div class="layui-form-item relative block"> + <span class="color-green font-w7 label-required-prev">文章标签</span> + <div class="tags-container layui-textarea"> + {foreach $tags as $tag}{if isset($vo.tags) && is_array($vo.tags) && in_array($tag.title, $vo.tags)} + <label class="think-checkbox notselect"><input checked type="checkbox" name="tags[]" value="{$tag.title}" lay-ignore> {$tag.title}</label> + {else} + <label class="think-checkbox notselect"><input type="checkbox" name="tags[]" value="{$tag.title}" lay-ignore> {$tag.title}</label> + {/if}{/foreach} + </div> + </div> + + <div class="layui-form-item relative block"> + <span class="color-green font-w7 label-required-prev">资源文件</span> + <label class="relative block label-required-null"> + <input required name="source" value='{$vo.source|default=""}' placeholder="请上传资源文件 " class="layui-input"> + <a data-file data-type="png,jpg,gif,mp4,mp3" data-field="source" class="input-right-icon layui-icon layui-icon-upload"></a> + </label> + </div> + + <div class="layui-form-item relative block"> + <span class="color-green font-w7 label-required-prev">文章图片</span> + <label class="relative block label-required-null"> + <input required name="logo" value='{$vo.logo|default=""}' placeholder="请上传图片 " class="layui-input"> + <a data-file data-type="png,jpg,gif" data-field="logo" class="input-right-icon layui-icon layui-icon-upload"></a> + </label> + </div> + + <label class="layui-form-item relative block"> + <span class="color-green font-w7">文章标题</span> + <input required name="title" value='{$vo.title|default=""}' placeholder="请输入文章标题" class="layui-input"> + </label> + + <label class="layui-form-item relative block"> + <span class="color-green font-w7">文章描述</span> + <textarea required class="layui-textarea" placeholder="请输入文章描述" name="remark">{$vo.remark|default=''}</textarea> + </label> + + <div class="layui-form-item relative block"> + <span class="color-green font-w7 label-required-prev">文章内容</span> + <label class="relative block"> + <textarea class="layui-textarea" placeholder="请输入文章内容" name="content">{$vo.content|default=''}</textarea> + </label> + </div> + + <div class="hr-line-dashed"></div> + {notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty} + + <div class="layui-form-item text-center"> + <button class="layui-btn" type='submit'>保存数据</button> + <button class="layui-btn layui-btn-danger" type='button' data-confirm="确定要取消编辑吗?" data-close>取消编辑</button> + </div> + + </div> + +</form> + +<script> + (function () { + $('[name="type"]').on('change', function () { + var $input = $('[name="source"]'), type = $('[name="type"]:checked').val() || 'video'; + if (type === 'video') $input.attr('data-type', 'mp4').parents('div.layui-form-item').addClass('block').removeClass('layui-hide'); + else if (type === 'audio') console.log($input.attr('data-type', 'mp3').parents('div.layui-form-item').addClass('block').removeClass('layui-hide')); + else $input.attr('data-type', 'jpg,png,jpeg').parents('div.layui-form-item').addClass('layui-hide').removeClass('block'); + }).trigger('change'); + require(['ckeditor'], function () { + window.createEditor('[name=content]', {height: 300}); + }) + })(); +</script> + +<style> + .tags-container { + padding: 2px 10px 10px 10px; + min-height: 55px; + } + + .tags-container label { + border: 1px dashed #e2e2e2; + padding: 5px 8px 5px 5px; + background: white; + } +</style> +{/block} \ No newline at end of file diff --git a/app/data/view/article_content/index.html b/app/data/view/article_content/index.html new file mode 100644 index 000000000..f2a003424 --- /dev/null +++ b/app/data/view/article_content/index.html @@ -0,0 +1,71 @@ +{extend name="../../admin/view/main"} + +{block name="button"} +<!--{if auth("add")}--> +<button data-open='{:url("add")}' data-title="添加文章内容" class='layui-btn layui-btn-sm layui-btn-primary'>添加文章</button> +<!--{/if}--> +<!--{if auth("remove")}--> +<button data-action='{:url("remove")}' data-rule="id#{key}" data-confirm="确定要删除这些文章吗?" class='layui-btn layui-btn-sm layui-btn-primary'>删除文章</button> +<!--{/if}--> +{/block} + +{block name='content'} +<div class="think-box-shadow table-block"> + {include file='article_content/index_search'} + <table class="layui-table margin-top-10" lay-skin="line"> + {notempty name='list'} + <thead> + <tr> + <th class='list-table-check-td think-checkbox'> + <label><input data-auto-none data-check-target='.list-check-box' type='checkbox'/></label> + </th> + <th class='list-table-sort-td'> + <button type="button" data-reload class="layui-btn layui-btn-xs">刷 新</button> + </th> + <th class="text-left nowrap">文章信息</th> + <th class="text-left nowrap">搜索标签</th> + <th class="text-left nowrap">文章状态</th> + <th class="text-left nowrap">创建时间</th> + <th class="text-left nowrap"></th> + </tr> + </thead> + {/notempty} + <tbody> + {foreach $list as $key=>$vo} + <tr data-dbclick> + <td class='list-table-check-td think-checkbox'> + <label><input class="list-check-box" value='{$vo.id}' type='checkbox'/></label> + </td> + <td class='list-table-sort-td'> + <label><input data-action-blur="{:request()->url()}" data-value="id#{$vo.id};action#sort;sort#{value}" data-loading="false" value="{$vo.sort}" class="list-sort-input"></label> + </td> + <td class="text-left nowrap">{$vo.title|default=''}</td> + <td class="text-left nowrap">{notempty name='vo.tags'}{foreach $vo.tags as $tag}<span data-tips-text="热搜标签" class="margin-right-5 layui-badge layui-bg-cyan">{$tag}</span>{/foreach}{/notempty}<br></td> + <td class="text-left nowrap">{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">使用中</span>{/if}</td> + <td class="text-left nowrap">{$vo.create_at|format_datetime}</td> + <td class='text-left nowrap'> + + {if auth("edit")} + <a data-dbclick class="layui-btn layui-btn-sm layui-btn-xs" data-title="编辑文章文章" data-open="{:url('edit')}?id={$vo.id}">编 辑</a> + {/if} + + {if auth("state") and $vo.status eq 1} + <a class="layui-btn layui-btn-sm layui-btn-xs layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#0">禁 用</a> + {/if} + + {if auth("state") and $vo.status eq 0} + <a class="layui-btn layui-btn-sm layui-btn-xs layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#1">启 用</a> + {/if} + + {if auth("remove")} + <a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要删除该文章吗?" data-action="{:url('remove')}" data-value="id#{$vo.id}">删 除</a> + {/if} + + </td> + </tr> + {/foreach} + </tbody> + </table> + {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty} +</div> +{/block} \ No newline at end of file diff --git a/app/data/view/article_content/index_search.html b/app/data/view/article_content/index_search.html new file mode 100644 index 000000000..53d210327 --- /dev/null +++ b/app/data/view/article_content/index_search.html @@ -0,0 +1,41 @@ +<fieldset> + <legend>条件搜索</legend> + <form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off"> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">文章标题</label> + <label class="layui-input-inline"> + <input name="title" value="{:input('title','')}" placeholder="请输入文章标题" class="layui-input"> + </label> + </div> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">搜索标签</label> + <label class="layui-input-inline"> + <input name="tags" value="{:input('tags','')}" placeholder="请输入搜索标签" class="layui-input"> + </label> + </div> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">使用状态</label> + <div class="layui-input-inline"> + <select class="layui-select" name="status"> + {foreach [''=>'-- 全部 --','0'=>'显示禁止的文章','1'=>'显示正常的文章'] as $k=>$v} + {if $k.'' eq input('status')} + <option selected value="{$k}">{$v}</option> + {else} + <option value="{$k}">{$v}</option> + {/if}{/foreach} + </select> + </div> + </div> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">创建时间</label> + <label class="layui-input-inline"> + <input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择创建时间" class="layui-input"> + </label> + </div> + <div class="layui-form-item layui-inline"> + <button class="layui-btn layui-btn-primary"><i class="layui-icon"></i> 搜 索</button> + </div> + </form> +</fieldset> + +<script>window.form.render()</script> \ No newline at end of file diff --git a/app/data/view/article_content/select.html b/app/data/view/article_content/select.html new file mode 100644 index 000000000..97ae22a99 --- /dev/null +++ b/app/data/view/article_content/select.html @@ -0,0 +1,48 @@ +{extend name="../../admin/view/full"} + +{block name='content'} +<div class="padding-25" data-select-container> + {include file='attack_content/select_search'} + <table class="layui-table margin-top-10" lay-skin="line"> + {notempty name='list'} + <thead> + <tr> + <th class="text-left nowrap">文章信息</th> + <th class="text-left nowrap">文章状态</th> + <th class="text-left nowrap">创建时间</th> + <th class="text-left nowrap"></th> + </tr> + </thead> + {/notempty} + <tbody> + {foreach $list as $key=>$vo} + <tr data-dbclick> + <td class="text-left nowrap">{$vo.title|default=''}</td> + <td class="text-left nowrap">{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">使用中</span>{/if}</td> + <td class="text-left nowrap">{$vo.create_at|format_datetime}</td> + <td class='text-left nowrap'> + + <a class="layui-btn layui-btn-sm layui-btn-normal" data-article="{$vo.id}">选择文章</a> + + </td> + </tr> + {/foreach} + </tbody> + </table> + {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty} +</div> +{/block} + +{block name='script'} +<script> + $(function () { + + layui.form.render(); + $('[data-article]').on('click', function () { + top.setAttackId(this.getAttribute('data-article') || ''); + parent.layer.close(parent.layer.getFrameIndex(window.name)); + }); + $.form.reInit($('[data-select-container]')); + }); +</script> +{/block} diff --git a/app/data/view/article_content/select_search.html b/app/data/view/article_content/select_search.html new file mode 100644 index 000000000..a86c8b10a --- /dev/null +++ b/app/data/view/article_content/select_search.html @@ -0,0 +1,33 @@ +<fieldset> + <legend>条件搜索</legend> + <form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off"> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">文章标题</label> + <label class="layui-input-inline"> + <input name="title" value="{:input('title','')}" placeholder="请输入文章标题" class="layui-input"> + </label> + </div> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">使用状态</label> + <div class="layui-input-inline"> + <select class="layui-select" name="status"> + {foreach [''=>'-- 全部 --','0'=>'显示禁止的文章','1'=>'显示正常的文章'] as $k=>$v} + {if $k.'' eq input('status')} + <option selected value="{$k}">{$v}</option> + {else} + <option value="{$k}">{$v}</option> + {/if}{/foreach} + </select> + </div> + </div> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">创建时间</label> + <label class="layui-input-inline"> + <input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择创建时间" class="layui-input"> + </label> + </div> + <div class="layui-form-item layui-inline"> + <button class="layui-btn layui-btn-primary"><i class="layui-icon"></i> 搜 索</button> + </div> + </form> +</fieldset> \ No newline at end of file diff --git a/app/data/view/article_tags/form.html b/app/data/view/article_tags/form.html new file mode 100644 index 000000000..09362b795 --- /dev/null +++ b/app/data/view/article_tags/form.html @@ -0,0 +1,27 @@ +<form class="layui-form layui-card" action="{:request()->url()}" data-auto="true" method="post" autocomplete="off"> + + <div class="layui-card-body padding-left-40"> + + <label class="layui-form-item relative block"> + <span class="color-green font-w7">标签名称</span> + <input class="layui-input" required placeholder="请输入标签名称" name="title" value="{$vo.title|default=''}"/> + </label> + + <div class="layui-form-item relative block"> + <span class="color-green font-w7">标签描述</span> + <label class="relative block"> + <textarea class="layui-textarea" placeholder="请输入文档描述" name="desc">{$vo.desc|default=''}</textarea> + </label> + </div> + + </div> + + <div class="hr-line-dashed"></div> + {notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty} + + <div class="layui-form-item text-center"> + <button class="layui-btn" type='submit'>保存数据</button> + <button class="layui-btn layui-btn-danger" type='button' data-confirm="确定要取消编辑吗?" data-close>取消编辑</button> + </div> + +</form> \ No newline at end of file diff --git a/app/data/view/article_tags/index.html b/app/data/view/article_tags/index.html new file mode 100644 index 000000000..5e1c1cd7a --- /dev/null +++ b/app/data/view/article_tags/index.html @@ -0,0 +1,72 @@ +{extend name="../../admin/view/main"} + +{block name="button"} + +{if auth("add")} +<button data-modal='{:url("add")}' data-title="添加标签" class='layui-btn layui-btn-sm layui-btn-primary'>添加标签</button> +{/if} + +{if auth("remove")} +<button data-action='{:url("remove")}' data-rule="id#{key}" data-confirm="确定要删除这些标签吗?" class='layui-btn layui-btn-sm layui-btn-primary'>删除标签</button> +{/if} + +{/block} + +{block name='content'} +<div class="think-box-shadow"> + {include file='article_tags/index_search'} + <table class="layui-table margin-top-10" lay-skin="line"> + {notempty name='list'} + <thead> + <tr> + <th class='list-table-check-td think-checkbox'> + <label><input data-auto-none data-check-target='.list-check-box' type='checkbox'/></label> + </th> + <th class='list-table-sort-td'> + <button type="button" data-reload class="layui-btn layui-btn-xs">刷 新</button> + </th> + <th class="text-left nowrap">标签名称</th> + <th class="text-left nowrap">标签状态</th> + <th class="text-left nowrap">创建时间</th> + <th class="text-left nowrap"></th> + </tr> + </thead> + {/notempty} + <tbody> + {foreach $list as $key=>$vo} + <tr data-dbclick> + <td class='list-table-check-td think-checkbox'> + <label><input class="list-check-box" value='{$vo.id}' type='checkbox'/></label> + </td> + <td class='list-table-sort-td'> + <label><input data-action-blur="{:request()->url()}" data-value="id#{$vo.id};action#sort;sort#{value}" data-loading="false" value="{$vo.sort}" class="list-sort-input"></label> + </td> + <td class="text-left nowrap">{$vo.title|default=''}</td> + <td>{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">使用中</span>{/if}</td> + <td class="text-left nowrap">{$vo.create_at|format_datetime}</td> + <td class='text-left nowrap'> + + {if auth("edit")} + <a data-dbclick class="layui-btn layui-btn-sm layui-btn-xs" data-title="编辑标签" data-modal="{:url('edit')}?id={$vo.id}">编 辑</a> + {/if} + + {if auth("state") and $vo.status eq 1} + <a class="layui-btn layui-btn-sm layui-btn-xs layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#0">禁 用</a> + {/if} + + {if auth("state") and $vo.status eq 0} + <a class="layui-btn layui-btn-sm layui-btn-xs layui-btn-warm" data-action="{:url('state')}" data-value="id#{$vo.id};status#1">启 用</a> + {/if} + + {if auth("remove")} + <a class="layui-btn layui-btn-xs layui-btn-danger" data-confirm="确定要删除该标签吗?" data-action="{:url('remove')}" data-value="id#{$vo.id}">删 除</a> + {/if} + + </td> + </tr> + {/foreach} + </tbody> + </table> + {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty} +</div> +{/block} \ No newline at end of file diff --git a/app/data/view/article_tags/index_search.html b/app/data/view/article_tags/index_search.html new file mode 100644 index 000000000..91f1e192c --- /dev/null +++ b/app/data/view/article_tags/index_search.html @@ -0,0 +1,35 @@ +<fieldset> + <legend>条件搜索</legend> + <form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off"> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">标签名称</label> + <label class="layui-input-inline"> + <input name="title" value="{:input('title','')}" placeholder="请输入标签名称" class="layui-input"> + </label> + </div> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">使用状态</label> + <div class="layui-input-inline"> + <select class="layui-select" name="status"> + {foreach [''=>'-- 全部 --','0'=>'已禁用的记录','1'=>'使用中的记录'] as $k=>$v} + {if $k.'' eq input('status')} + <option selected value="{$k}">{$v}</option> + {else} + <option value="{$k}">{$v}</option> + {/if}{/foreach} + </select> + </div> + </div> + <div class="layui-form-item layui-inline"> + <label class="layui-form-label">创建时间</label> + <label class="layui-input-inline"> + <input data-date-range name="create_at" value="{:input('create_at','')}" placeholder="请选择创建时间" class="layui-input"> + </label> + </div> + <div class="layui-form-item layui-inline"> + <button class="layui-btn layui-btn-primary"><i class="layui-icon"></i> 搜 索</button> + </div> + </form> +</fieldset> + +<script>window.form.render()</script> \ No newline at end of file diff --git a/vendor/services.php b/vendor/services.php index 95e9536c6..9748224ce 100644 --- a/vendor/services.php +++ b/vendor/services.php @@ -1,5 +1,5 @@ <?php -// This file is automatically generated at:2020-07-09 14:33:02 +// This file is automatically generated at:2020-07-13 09:44:52 declare (strict_types = 1); return array ( 0 => 'think\\app\\Service',