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="请上传资源文件&nbsp; &nbsp; &nbsp; &nbsp;" 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="请上传图片&nbsp; &nbsp; &nbsp; &nbsp;" 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">&#xe615;</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">&#xe615;</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">&#xe615;</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',