rabin 1 month ago
parent
commit
b6797812a2
66 changed files with 2150 additions and 0 deletions
  1. 9 0
      boot.php
  2. 18 0
      config/env/localhost.php
  3. 30 0
      config/manage.php
  4. 91 0
      config/setting.php
  5. 4 0
      package/api/index.php
  6. 4 0
      package/area/index.php
  7. 4 0
      package/email/index.php
  8. 4 0
      package/excel/index.php
  9. 4 0
      package/image/index.php
  10. 4 0
      package/invite/index.php
  11. 4 0
      package/manage/api/index.php
  12. 38 0
      package/manage/config.js
  13. BIN
      package/manage/favicon.ico
  14. 1 0
      package/manage/index.html
  15. 4 0
      package/msg/index.php
  16. 4 0
      package/pinyin/index.php
  17. 4 0
      package/poster/index.php
  18. 1 0
      package/readme
  19. 4 0
      package/upload/index.php
  20. 3 0
      server.php
  21. 36 0
      src/content/api/Tool.php
  22. 5 0
      src/content/index.php
  23. 22 0
      src/content/lib/Cate.php
  24. 36 0
      src/content/lib/Gift.php
  25. 46 0
      src/content/manage/Api/Data.php
  26. 47 0
      src/content/manage/Lib/Cate.php
  27. 105 0
      src/content/manage/Lib/Gift.php
  28. 78 0
      src/content/manage/Lib/Info.php
  29. 46 0
      src/content/manage/cate.php
  30. 53 0
      src/content/manage/core.php
  31. 72 0
      src/content/manage/gift.php
  32. 42 0
      src/content/manage/gift_code.php
  33. 28 0
      src/content/manage/gift_content.php
  34. 14 0
      src/content/manage/gift_create_code.php
  35. 62 0
      src/content/manage/info.php
  36. 47 0
      src/content/table/cate.php
  37. 64 0
      src/content/table/gift.php
  38. 65 0
      src/content/table/gift_code.php
  39. 30 0
      src/content/table/gift_content.php
  40. 92 0
      src/content/table/info.php
  41. 5 0
      src/system/index.php
  42. 24 0
      src/system/manage/core.php
  43. 42 0
      src/system/manage/help.php
  44. 45 0
      src/system/manage/page.php
  45. 10 0
      src/system/table/config.php
  46. 29 0
      src/system/table/help.php
  47. 27 0
      src/system/table/page.php
  48. 5 0
      src/user/index.php
  49. 29 0
      src/user/lib/Read.php
  50. 6 0
      src/user/manage/Lib/Api.php
  51. 18 0
      src/user/manage/Lib/Gift.php
  52. 59 0
      src/user/manage/Lib/User.php
  53. 57 0
      src/user/manage/core.php
  54. 24 0
      src/user/manage/device.php
  55. 22 0
      src/user/manage/feedback.php
  56. 40 0
      src/user/manage/gift.php
  57. 22 0
      src/user/manage/read.php
  58. 132 0
      src/user/manage/user.php
  59. 50 0
      src/user/table/cate.php
  60. 50 0
      src/user/table/content.php
  61. 23 0
      src/user/table/device.php
  62. 35 0
      src/user/table/feedback.php
  63. 53 0
      src/user/table/gift.php
  64. 67 0
      src/user/table/info.php
  65. 23 0
      src/user/table/read.php
  66. 28 0
      src/user/table/read_log.php

+ 9 - 0
boot.php

@@ -0,0 +1,9 @@
+<?php
+define('DEVER_ENTRY', 'index.php');
+define('DEVER_PROJECT', 'reader');
+define('DEVER_PROJECT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+if (defined('DEVER_PACKAGE')) {
+	include('dever2/package/'.DEVER_PACKAGE.'/index.php');
+} else {
+	include('dever2/boot.php');
+}

+ 18 - 0
config/env/localhost.php

@@ -0,0 +1,18 @@
+<?php
+return [
+    'db' => [
+        'type' => 'Pdo',
+        'host' => 'web-mysql',
+        'port' => '3306',
+        'name' => DEVER_PROJECT,
+        'user' => 'root',
+        'pwd' => '123456',
+    ],
+
+    'redis' => [
+        'host' => 'server-redis', 
+        'port' => '6379', 
+        'password' => 'dm_redis_123', 
+        'expire' => 2147483647
+    ],
+];

+ 30 - 0
config/manage.php

@@ -0,0 +1,30 @@
+<?php
+# 后台配置
+return [
+
+    # 设置控制台数据
+    //'console' => 'Porder/Manage/Source/Stat.getConsole',
+
+    # 父级菜单
+    'menu' => [
+        # 平台管理
+        'user' => [
+            'name' => '用户',
+            'icon' => 'product-hunt-line',
+            'sort' => '90',
+            'module' => 'platform',
+        ],
+        'content' => [
+            'name' => '内容',
+            'icon' => 'contacts-book-upload-line',
+            'sort' => '99',
+            'module' => 'platform',
+        ],
+        'setting' => [
+            'name' => '配置',
+            'icon' => 'settings-line',
+            'sort' => '200',
+            'module' => 'platform',
+        ],
+    ]
+];

+ 91 - 0
config/setting.php

@@ -0,0 +1,91 @@
+<?php
+return [
+    # 项目通信token
+    'token' => DEVER_PROJECT,
+    # 语言包 暂时无用
+    'lang' => 'zh-cn',
+    'lang_pack' => ['zh-cn' => '简体中文', 'en' => '英文'],
+
+    # 哪个项目支持接口标准输出再定义
+    'output_app' => ['Pinterface'],
+    # 接口标准输出再定义
+    'output' => [
+        # 这里可以将框架自带的接口标准输出标识改成其他,如code、status、data改名
+        //'code' => 'codeId',# 直接改成codeId
+        //'data' => ['test', 'e'], # 将原来data数组里的e提取出来,赋值给test
+        # 扩展输出
+        'u' => 'Pinterface/Lib/Core.getUpdate',
+        'v' => 'Pinterface/Lib/Core.getVersion',
+    ],
+
+    # 路由解析设置
+    'route' => [
+        'api/notify/(.*?)' => 'notify.common?s=$1',
+    ],
+
+    # 日志设置
+    'log' => ['type' => 'file', 'host' => 'host', 'port' => 'port'],
+
+    # 调试的shell名
+    'shell' => 'debug',
+
+    # 定义session
+    //'session' => ['host' => '', 'port' => '', 'path' => '', 'cookie' => ''],
+
+    # 定义数据库
+    'database' => [
+        # 是否自动建表 默认为true
+        'create' => true,
+        # sql优化,暂时无用
+        'opt' => true,
+        //'default' => [$env['db'], $env['db1'], 'type' => 'Pdo'],//读写分离
+        # 平台默认数据库
+        'default' => $env['db'],
+        # 用户数据库
+        'user' => $env['user'],
+        'log' => $env['log'],
+
+        # 分区设置 
+        'partition' => [
+            # 当前数据库是否支持自动建库,不支持改成false,则database不会自动建库,而是类似table按照表拆分
+            'create' => true,
+            # 类型:database 按照库拆分(分库) table 按照表拆分(分表) field 按照字段拆分(分区) where 按照条件拆分(分条件) Dever::session('database', 1)可以设置值
+            'database' => 'date("Y")',
+            'table' => 'date("Ym")',
+            # 字段类型分几种:range范围、list列表、hash哈希、key分区
+            'field' => [
+                'type' => 'range',
+                'field' => 'cdate', 
+                'value' => 'date("Y-m-d 23:60:60")'//date("Y-m-d 23:60:60", strtotime("-1 day"))'
+            ],
+            /*
+            'field' => [
+                'type' => 'list',
+                'field' => 'type', 
+                'value' => ['1', '2', '3'],//3个值3个分区,然后也可以用Dever::call("manage/admin.test")来返回数组
+            ],
+            'field' => [
+                'type' => 'hash',
+                'field' => 'id', 
+                'value' => '5'//5个分区
+            ],
+            'field' => [
+                'type' => 'key',
+                'field' => 'id', 
+                'value' => '5'
+            ],*/
+            # where类型,一般在表中设置['id' => 1],
+            //'where' => 'Dever::call("manage/admin.test")'
+        ],
+    ],
+
+    # 定义模板
+    'template' => [
+        'name' => 'pc',//模板配置,如果有手机版,直接配置:'pc,mobile'
+        'replace' => [
+            '../' => '{$host}',
+        ],
+    ],
+    # 定义redis
+    'redis' => $env['redis'],
+];

+ 4 - 0
package/api/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'api');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/area/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'area');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/email/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'email');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/excel/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'excel');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/image/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'image');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/invite/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'invite');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/manage/api/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'manage');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../../boot.php');

+ 38 - 0
package/manage/config.js

@@ -0,0 +1,38 @@
+/**
+ * @description 通用配置
+ */
+let url = ''
+if (location.port == '15000') {
+  //url = 'http://127.0.0.1/dever2/package/manage'
+  url = 'http://127.0.0.1/api2/package/manage/api'
+} else {
+  url = location.origin + location.pathname + 'api'
+}
+deverConfig = {
+  // 一些基本配置,定义后台title
+  setting: {
+    title: '绘本阅读器',
+    tokenTableName: 'dever-yuandaibao-reader',
+    //loginParam: { system: 'group', number: 'default' },
+  },
+  // 网络配置
+  network: {
+    requestTimeout: 1000000,
+    baseURL: url, // 配置服务器地址,
+  },
+  // 默认布局
+  theme: {
+    // 布局种类:横向布局horizontal、纵向布局vertical、分栏布局column、综合布局comprehensive、常规布局common、浮动布局float
+    layout: 'column',
+    // 主题名称:默认blue-black、blue-white、green-black、green-white、渐变ocean、red-white、red-black
+    themeName: 'blue-black',
+    // 菜单背景 none、vab-background
+    background: 'none',
+    // 菜单宽度,仅支持px,建议大小:266px、277px、288px,其余尺寸会影响美观
+    menuWidth: '266px',
+    // 分栏风格(仅针对分栏布局column时生效):横向风格horizontal、纵向风格vertical、卡片风格card、箭头风格arrow
+    columnStyle: 'card',
+    // 显示标签页时标签页样式:卡片风格card、灵动风格smart、圆滑风格smooth
+    tabsBarStyle: 'smooth',
+  },
+}

BIN
package/manage/favicon.ico


+ 1 - 0
package/manage/index.html

@@ -0,0 +1 @@
+<!doctype html><html lang="zh-cmn-Hans"><head><meta charset="utf-8"/><meta content="IE=edge" http-equiv="X-UA-Compatible"/><meta content="webkit" name="renderer"/><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"/><link href="favicon.ico" rel="icon"/><title>Dever Manage</title><meta content="Dever,PHP,PHP框架,轻量,微服务,组件化,接口,低代码,后台,自定义后台,开发,快速开发,AI,人工智能,文档,轻应用,应用,时空之翼,神秘城" name="keywords"/><meta content="rabin@shemic.com" name="author"/><link href="static/css/loading.css?v=1753790913" rel="stylesheet"/><script src="config.js?v=1753790913" defer="defer"></script><script defer="defer" src="static/js/element-plus.js?v=1753790913"></script><script defer="defer" src="static/js/app.js?v=1753790913"></script><script defer="defer" src="static/js/89.js?v=1753790913"></script><link href="static/css/element-plus.css?v=1753790913" rel="stylesheet"><link href="static/css/app.css?v=1753790913" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="first-loading-wrp"><div class="loading-wrp"><span class="dot dot-spin"><i></i> <i></i> <i></i> <i></i></span></div><h1>Dever Manage</h1></div></div></body></html>

+ 4 - 0
package/msg/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'msg');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/pinyin/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'pinyin');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 4 - 0
package/poster/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'poster');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 1 - 0
package/readme

@@ -0,0 +1 @@
+dever create

+ 4 - 0
package/upload/index.php

@@ -0,0 +1,4 @@
+<?php
+define('DEVER_PACKAGE',  'upload');
+define('DEVER_APP_SETUP', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../boot.php');

+ 3 - 0
server.php

@@ -0,0 +1,3 @@
+<?php
+define('DEVER_SERVER', '80');
+include('boot.php');

+ 36 - 0
src/content/api/Tool.php

@@ -0,0 +1,36 @@
+<?php namespace Content\Api;
+use Dever;
+class Tool
+{
+    # 先知控制器回调
+    public function call()
+    {
+        $data = file_get_contents("php://input");
+        file_put_contents(Dever::data() . 'test', $data);
+        $data = Dever::json_decode($data);
+        if ($data['status'] == 3) {
+            $update['status'] = 3;
+        } else {
+            $update['status'] = 2;
+        }
+        $info = Dever::db('content/info')->find($data['source_id']);
+        if ($info) {
+            $update['content'] = Dever::json_encode($data['content']);
+            # 把图片地址做替换 不用了,没有图片了
+            $update['content'] = str_replace('/data/dm/container/web/', '/www/', $update['content']);
+            $update['content'] = Dever::load('view', 'upload')->http($update['content']);
+            Dever::db('content/info')->update($data['source_id'], $update);
+        }
+    }
+
+    public function test()
+    {
+        $data = Dever::db('content/info')->select(['status' => 3], ['num' => 5]);
+        if ($data) {
+            foreach ($data as &$v) {
+                $v['content'] = Dever::json_decode($v['content']);
+            }
+        }
+        return $data;
+    }
+}

+ 5 - 0
src/content/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'Content');
+define('DEVER_APP_LANG', '内容');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../../boot.php');

+ 22 - 0
src/content/lib/Cate.php

@@ -0,0 +1,22 @@
+<?php namespace Content\Lib;
+use Dever;
+class Cate
+{
+    # 获取名称
+    public function getName($cate = '')
+    {
+        $result = '';
+        if ($cate) {
+            if (is_string($cate)) {
+                $cate = explode(',', $cate);
+            }
+            $info = Dever::db('content/cate')->find($cate[0]);
+            $result = $info['name'];
+            if (isset($cate[1])) {
+                $info = Dever::db('content/cate')->find($cate[1]);
+                $result .= '.' . $info['name'];
+            }
+        }
+        return $result;
+    }
+}

+ 36 - 0
src/content/lib/Gift.php

@@ -0,0 +1,36 @@
+<?php namespace Content\Lib;
+use Dever;
+class Gift
+{
+    public function createCode($utype, $uid, $id, $num = 1, $total = 1, $code = '')
+    {
+        if (!$num) {
+            $num = 1;
+        }
+        $info = Dever::db('content/gift')->find($id);
+        $up['gift_id'] = $id;
+        $up['total'] = $total;
+        $up['utype'] = $utype;
+        $up['uid'] = $uid;
+        $result = [];
+        for ($i = 1; $i <= $num; $i++) {
+            $up['code'] = $this->create($info['code_type'], $info['code_prefix'], $info['code_length']);
+            Dever::db('content/gift_code')->insert($up);
+            $result[] = $up['code'];
+        }
+        $total = Dever::db('content/gift_code')->count(['gift_id' => $id]);
+        Dever::db('content/gift')->update($id, ['total' => $total]);
+        return implode('、', $result);
+    }
+
+    # 创建券码
+    private function create($type, $prefix, $length)
+    {
+        $code = $prefix . \Dever\Helper\Str::rand($length, $type-1);
+        $check = Dever::db('content/gift_code')->find(['code' => $code]);
+        if (!$check) {
+            return $code;
+        }
+        return $this->create($type, $prefix, $length);
+    }
+}

+ 46 - 0
src/content/manage/Api/Data.php

@@ -0,0 +1,46 @@
+<?php namespace Content\Manage\Api;
+use Dever;
+class Data
+{
+    # 获取分类信息
+    public function getCateList()
+    {
+        return Dever::load(\Manage\Lib\Util::class)->cascader(2, function($level, $parent) {
+            if ($level == 1) {
+                $data = Dever::db('content/cate')->select(['parent_id' => 0, 'status' => 1]);
+                if ($data) {
+                    foreach ($data as &$v) {
+                        $child = Dever::db('content/cate')->find(['parent_id' => $v['id'], 'status' => 1]);
+                        if (!$child) {
+                            $v['leaf'] = true;
+                        }
+                    }
+                }
+            } elseif ($level == 2) {
+                $data = Dever::db('content/cate')->select(['parent_id' => $level, 'status' => 1]);
+            }
+            return $data;
+        });
+    }
+
+    # 获取礼包的具体项目
+    public function getGiftIds($value)
+    {
+        $key = 'ids';
+        if (is_array($value) && $value) {
+            $result = [];
+            $result[$key]['value'] = [];
+            if ($value[0] == 1) {
+                //$where = ['status' => 1];
+                $where = [];
+                if (isset($value[2]) && $value[2]) {
+                    $where['cate_child_id'] = $value[2];
+                } elseif (isset($value[1]) && $value[1]) {
+                    $where['cate_parent_id'] = $value[1];
+                }
+                $result[$key]['option'] = Dever::db('content/info')->select($where);
+            }
+            return $result;
+        }
+    }
+}

+ 47 - 0
src/content/manage/Lib/Cate.php

@@ -0,0 +1,47 @@
+<?php namespace Content\Manage\Lib;
+use Dever;
+class Cate
+{
+    # 更新信息
+    public function update($db, $data)
+    {
+
+    }
+
+    # 获取带有子分类的分类列表
+    public function getList()
+    {
+        $result = [];
+        $where = ['status' => 1];
+        $cate = Dever::db('content/cate')->select($where);
+        if ($cate) {
+            $i = 0;
+            foreach ($cate as $k => $v) {
+                $where = ['parent_id' => $v['id'], 'status' => 1];
+                $parent = Dever::db('content/cate')->select($where);
+                if ($parent) {
+                    $v['children'] = $parent;
+                }
+                $result[$i] = $v;
+                $i++;
+            }
+        }
+        return $result;
+    }
+
+    # 获取分类信息
+    public function getInfo($cate = '')
+    {
+        $result = '';
+        if ($cate) {
+            $cate = explode(',', $cate);
+            $info = Dever::db('content/cate')->find($cate[0]);
+            $result = $info['name'];
+            if (isset($cate[1]) && $cate[1]) {
+                $info = Dever::db('content/cate')->find($cate[1]);
+                $result .= '.' . $info['name'];
+            }
+        }
+        return $result;
+    }
+}

+ 105 - 0
src/content/manage/Lib/Gift.php

@@ -0,0 +1,105 @@
+<?php namespace Content\Manage\Lib;
+use Dever;
+class Gift
+{
+    # 获取礼包内容
+    public function getContent($data)
+    {
+        if (is_numeric($data)) {
+            $data = Dever::db('content/gift_content')->select(['gift_id' => $data]);
+        }
+        
+        $result = [];
+        if ($data) {
+            foreach ($data as $v) {
+                $v['name'] = '';
+                $v['type'] = explode(',', $v['type']);
+                $type = array_shift($v['type']);
+                if ($type == 1) {
+                    $content = '分类下所有内容';
+                    $name = Dever::load(\Content\Lib\Cate::class)->getName($v['type']);
+                    if ($name) {
+                        $v['name'] = '['.$name.']';
+                    } else {
+                        $v['name'] = '[全部内容]';
+                    }
+                    if ($v['ids']) {
+                        $info = Dever::db('content/info')->columns(['id' => ['in', $v['ids']]], 'name');
+                        $content = implode('、', $info);
+                    }
+                    $unit = '个';
+                }
+                $data['name'] = $v['name'];
+                $data['content'] = [
+                    'type' => 'tip',
+                    'content' => $content,
+                ];
+                $result[] = $data;
+            }
+        } else {
+            $data['name'] = '所有内容';
+            $data['content'] = [
+                'type' => 'tip',
+                'content' => '全部内容',
+            ];
+            $result[] = $data;
+        }
+        return $result;
+    }
+
+    # 获取创建人
+    public function getCodeUser($utype, $uid)
+    {
+        if ($utype && $uid) {
+            if ($utype == 1) {
+                $user = Dever::db('user/info')->find($uid);
+            } elseif ($utype == 2) {
+                $user = Dever::db('manage/user')->find($uid);
+            } elseif ($utype == 3) {
+                # 获取源代宝系统的接口,走万接
+                return '源代宝 | 默认渠道';
+            } else {
+               return '系统';
+            }
+            return $user['name'] . ' | '.$user['id'];
+        } else {
+            return '-';
+        }
+    }
+
+    # 检查券码
+    public function check($db, $data)
+    {
+        if ($data['id'] > 0) {
+            $info = $db->find($data['id']);
+            if ($data['total'] < $info['used']) {
+                Dever::error('总兑换次数不能小于已兑换次数');
+            }
+        } else {
+            $data['utype'] = 2;
+            $data['uid'] = Dever::getData('muser')['id'];
+            Dever::db('content/gift')->update($data['gift_id'], ['total' => ['+', 1]]);
+        }
+        return $data;
+    }
+
+    # 创建券码
+    public function create($db, $data)
+    {
+        if (empty($data['total'])) {
+            $data['total'] = 1;
+        }
+        Dever::load(\Content\Lib\Gift::class)->createCode(2, Dever::getData('muser')['id'], $data['gift_id'], $data['num'], $data['total']);
+        return 'end';
+    }
+
+    # 获取礼包所需要的分类数据
+    public function getType()
+    {
+        $cate = Dever::load(Cate::class)->getList();
+        $data = [
+            ['id' => 1, 'name' => '内容分类', 'children' => $cate],
+        ];
+        return $data;
+    }
+}

+ 78 - 0
src/content/manage/Lib/Info.php

@@ -0,0 +1,78 @@
+<?php namespace Content\Manage\Lib;
+use Dever;
+class Info
+{
+    # 单条更新
+    public function update($db, $data)
+    {
+        if ($data['cate']) {
+            $cate = explode(',', $data['cate']);
+            $data['cate_parent_id'] = $data['cate_child_id'] = $data['cate_id'] = 0;
+            if (isset($cate[0])) {
+                $data['cate_parent_id'] = $cate[0];
+                $data['cate_id'] = $cate[0];
+            }
+            if (isset($cate[1])) {
+                $data['cate_child_id'] = $cate[1];
+                $data['cate_id'] = $cate[1];
+            }
+        }
+
+        /*
+        if ($data['file']) {
+            $file = explode(',', $data['file']);
+            $audio = explode(',', $data['audio']);
+            foreach ($file as $k => $v) {
+                $path = parse_url($v, PHP_URL_PATH);
+                $filename = pathinfo($path, PATHINFO_FILENAME);
+                $info = Dever::db('file', 'upload')->find(['name' => $filename]);
+                $up = ['name' => $info['source_name']];
+                $check = Dever::db('file', 'content')->find($up);
+                $up['size'] = Dever::number($info['size'] / 1024 / 1024);
+                $up['file'] = $v;
+                $up['status'] = 1;
+                $source = Dever::load('view', 'upload')->local($v, true);
+                $source_audio = '';
+                if (isset($audio[$k])) {
+                    $up['audio'] = $audio[$k];
+                    $source_audio = $up['audio'];
+                }
+                if ($check) {
+                    Dever::db('file', 'content')->update($check['id'], $up);
+                    $id = $check['id'];
+                } else {
+                    $id = Dever::db('file', 'content')->insert($up);
+                }
+
+                # 提取文件
+                $this->diviner($id, $source, $source_audio);
+            }
+        }*/
+
+        return $data;
+    }
+
+    # 提交文件
+    public function diviner($id, $source, $source_audio)
+    {
+        # 提交提取文本
+        $param['method'] = 'extract';
+        $param['appid'] = 'tpIOaPTAloEn_mejOhAi';//WLxoBSnFk7dUUurNWHRe //tpIOaPTAloEn_mejOhAi
+        $param['timestamp'] = 123;
+        $param['nonce'] = 123;
+        $param['signature'] = '123';
+        $param['uid'] = 1;
+        $param['source_id'] = $id;
+        $param['source'] = $source;
+        $param['audio'] = $source_audio;
+        if (strstr(Dever::host(), '127.0.0.1')) {
+            $url = 'http://127.0.0.1:8088/main/loader';
+            $url = 'http://host.docker.internal:8088/main/loader';
+        } else {
+            $url = str_replace('com/', 'com:8088/main/loader', Dever::host());
+        }
+        # 用appsecret做加密
+        $appsecret = '91007c190655fdf6c4057c064ea6c691';
+        $data = Dever::curl($url, $param, 'get')->result();
+    }
+}

+ 46 - 0
src/content/manage/cate.php

@@ -0,0 +1,46 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'name' => ['truncate' => true, 'align' => 'left'],
+            'short_name' => ['truncate' => true, 'align' => 'left'],
+            'show',
+            'sort',
+            'status',
+            'cdate',
+        ],
+        'tree' => ['parent_id', '0', 'id'],
+        'button' => [
+            '新增主分类' => ['fastadd', ['parent_id' => '0']],
+        ],
+        'data_button' => [
+            '编辑' => ['fastedit', ['field' => 'name,short_name,show,pic']],
+            '新增子分类' => ['fastadd', ['parent_id' => 'id'], '', 'parent_id=0'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'parent_id',
+            'name' => [
+                'rules' => true,
+            ],
+            'short_name' => [
+                
+            ],
+            'show' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'pic' => [
+                'type' => 'upload',
+                'upload' => '1',
+                'multiple' => false,
+                'style' => 'pic',
+            ],
+        ],
+    ],
+];

+ 53 - 0
src/content/manage/core.php

@@ -0,0 +1,53 @@
+<?php
+return [
+    'menu' => [
+        'content_manage' => [
+            'parent' => 'content',
+            'name' => '内容管理',
+            'icon' => 'archive-line',
+            'sort' => '1',
+        ],
+
+        'info' => [
+            'parent'    => 'content_manage',
+            'name'      => '内容列表',
+            'icon'      => 'archive-drawer-line',
+            'sort'      => '1',
+        ],
+
+        'info_update' => [
+            'parent'    => 'content_manage',
+            'name'      => '批量上传',
+            'sort'      => '100',
+            'show'      => 3,
+        ],
+
+        'cate' => [
+            'parent'    => 'content_manage',
+            'name'      => '内容分类',
+            'icon'      => 'align-center',
+            'sort'      => '2',
+        ],
+
+        'gift' => [
+            'parent'    => 'content_manage',
+            'name'      => '内容礼包',
+            'icon'      => 'currency-line',
+            'sort'      => '3',
+        ],
+
+        'gift_code' => [
+            'parent'    => 'content_manage',
+            'name'      => '礼包兑换码',
+            'sort'      => '100',
+            'show'      => 3,
+        ],
+
+        'gift_content' => [
+            'parent'    => 'content_manage',
+            'name'      => '礼包内容',
+            'sort'      => '100',
+            'show'      => 3,
+        ],
+    ],
+];

+ 72 - 0
src/content/manage/gift.php

@@ -0,0 +1,72 @@
+<?php
+return [
+    'list' => [
+        'desc' => '礼包是多个内容的集合,可以打包一个分类的内容,也可以打包多个分类的内容',
+        'field'      => [
+            'name',
+            'date_day',
+            'content' => [
+                'name' => '礼包内容',
+                'show' => 'Dever::call("Content/Manage/Lib/Gift.getContent", {id})',
+            ],
+            'wallet' => [
+                'name' => '数量',
+                'tip' => '发行总数/总兑换',
+                'show' => '{total}/{received}',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+            '兑换码' => ['route', [
+                'path' => 'content/gift_code',
+                'param' => [
+                    'set' => ['gift_code' => 'id', 'menu' => 'content/gift', 'parent' => 'content/gift'],
+                ],
+            ]],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'tab' => [
+            '基本信息' => 'name,date_day,desc,content/gift_content',
+            '兑换码设置' => 'code_type,code_prefix,code_length',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'date_day' => [
+                'rules' => true,
+            ],
+            'desc' => [
+                'desc' => '这里需要简单描述一下礼包内容',
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'code_type' => [
+                'type' => 'select',
+            ],
+            'code_prefix' => [
+                'tip' => '输入生成的兑换码前缀',
+            ],
+            'code_length' => [
+                'tip' => '输入生成的兑换码长度,不包括前缀',
+            ],
+
+            'content/gift_content' => [
+                'name' => '内容列表',
+                'where'  => ['gift_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 42 - 0
src/content/manage/gift_code.php

@@ -0,0 +1,42 @@
+<?php
+return [
+    'list' => [
+        'where' => ['gift_id'],
+        'field'      => [
+            'gift_id',
+            'utype',
+            'uid' => [
+                'show' => 'Dever::call("Content/Manage/Lib/Gift.getCodeUser", ["{utype}", "{uid}"])',
+            ],
+            'code',
+            'total',
+            'used',
+            'status' => '',
+        ],
+        'button' => [
+            '新增' => ['fastadd'],
+            '批量生成' => ['fastadd', ['path' => 'content/gift_create_code', 'field' => []],
+        ],
+        'data_button' => [
+            '编辑' => ['fastedit'],
+        ],
+        'search'    => [
+            'code',
+            'status',
+        ],
+    ],
+
+    'update' => [
+        'start' => 'Content/Manage/Lib/Gift.check',
+        'field'    => [
+            'gift_id',
+            'code' => [
+                'desc' => '用户输入正确的兑换码即可绑定相应的礼包',
+            ],
+            'total' => [
+                'desc' => '当前兑换码最多可兑换次数,如输入10,则该兑换码可以兑换10次礼包,输入0则无限制次数<br />适合发放节假日权益',
+            ],
+        ],
+        'check' => 'code',
+    ],
+];

+ 28 - 0
src/content/manage/gift_content.php

@@ -0,0 +1,28 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'type' => [
+                'type' => 'cascader',
+                'check' => true,
+                'option'    => 'Dever::call("Content/Manage/Lib/Gift.getType")',
+                'remote' => 'Content/Manage/Api/Data.getGiftIds',
+                'width' => '100%',
+                'clearable' => true,
+            ],
+            'ids' => [
+                'name'      => '关联项目',
+                'type' => 'select2',
+                # select2需要有默认值
+                'option' => [],
+                'multiple' => true,
+                'tip' => '不选择关联项目,则当前类型下的所有项目有效',
+                'placeholder' => '不选择关联项目,则当前类型下的所有项目有效',
+                'width' => '100%',
+                'tags' => true,
+                'max_tags' => 3,
+                'clearable' => true,
+            ],
+        ],
+    ],
+];

+ 14 - 0
src/content/manage/gift_create_code.php

@@ -0,0 +1,14 @@
+<?php
+return [
+    'source' => 'content/gift_code',
+    'update' => [
+        'start' => 'Content/Manage/Lib/Gift.create',
+        'field'    => [
+            'gift_id',
+            'num' => [
+                'name'      => '数量',
+                'tip' => '输入本次生成的数量',
+            ],
+        ],
+    ],
+];

+ 62 - 0
src/content/manage/info.php

@@ -0,0 +1,62 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'name',
+            //'file',
+            'size' => array
+            (
+                'show' => '{size}MB',
+            ),
+            'status' => '',
+        ],
+        'button' => [
+            '新增' => ['fastadd'],
+        ],
+        'data_button' => [
+            '编辑' => ['fastedit'],
+        ],
+        'data_button_list' => [
+            '预览原文件' => ['link', '{file}'],
+            '删除' => ['delete'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+
+    'update' => [
+        'start' => 'Content/Manage/Lib/Info.update',
+        'control' => [
+            'audio_file' => 'audio_type=2',
+        ],
+        'field'    => [
+            'cate' => [
+                'rules' => true,
+                'type' => 'cascader',
+                'option'    => 'Dever::call("Content/Manage/Lib/Cate.getList")',
+            ],
+
+            'file' => [
+                'name' => '源文件',
+                'desc' => '请上传文件,系统将自动解析里面的文本和图片保存为可阅读内容',
+                'type' => 'upload',
+                'upload' => '5',
+                'multiple' => false,
+                'style' => 'list',
+            ],
+            'audio_type' => [
+                'type' => 'radio',
+            ],
+            'audio_file' => [
+                'name' => '音频文件',
+                'desc' => '可以为空,不上传音频文件则根据源文件中的文本内容自动生成',
+                'type' => 'upload',
+                'upload' => '2',
+                'multiple' => false,
+                'style' => 'list',
+            ],
+        ],
+    ],
+];

+ 47 - 0
src/content/table/cate.php

@@ -0,0 +1,47 @@
+<?php
+return [
+    'name' => '分类表',
+    'order' => 'sort asc, id asc',
+    'struct' => [
+        'parent_id' => [
+            'name'      => '父级分类',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'name' => [
+            'name'      => '名称',
+            'type'      => 'varchar(80)',
+        ],
+        'short_name' => [
+            'name'      => '简称',
+            'type'      => 'varchar(15)',
+        ],
+        'pic' => [
+            'name'      => '封面图',
+            'type'      => 'varchar(150)',
+        ],
+        'show' => [
+            'name'      => '展示形式',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '四列形式',
+                2 => '两列形式',
+            ],
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '上架',
+                2 => '下架',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 64 - 0
src/content/table/gift.php

@@ -0,0 +1,64 @@
+<?php
+return [
+    'name' => '礼包',
+    'order' => 'sort asc',
+    'struct' => [
+        'name' => [
+            'name'      => '礼包名称',
+            'type'      => 'varchar(32)',
+        ],
+        'desc' => [
+            'name'      => '礼包介绍',
+            'type'      => 'varchar(500)',
+        ],
+        'total' => [
+            'name'      => '总数量',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'received' => [
+            'name'      => '兑换数量',
+            'type'      => 'int(11)',
+        ],
+        'code_type' => [
+            'name'      => '类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '全数字',
+                2 => '全小写字符',
+                3 => '全大写字符',
+                4 => '大小写字符',
+                5 => '数字+大小写字符',
+            ],
+        ],
+        'code_prefix'       => [
+            'name'      => '前缀',
+            'type'      => 'varchar(50)',
+        ],
+        'code_length' => [
+            'name'      => '长度',
+            'type'      => 'int(11)',
+            'default'   => '15',
+        ],
+        'date_day' => [
+            'name'      => '有效天数',
+            'type'      => 'int(11)',
+            'default'   => '365',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 65 - 0
src/content/table/gift_code.php

@@ -0,0 +1,65 @@
+<?php
+return [
+    'name' => '礼包兑换码表',
+    'struct' => [
+        'gift_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '礼包',
+            'value'     => 'content/gift',
+        ],
+        'code'       => [
+            'name'      => '兑换码',
+            'type'      => 'varchar(50)',
+        ],
+        'utype' => [
+            'name'      => '创建人类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                -1 => '系统',
+                1 => '用户',
+                2 => '后台',
+                3 => '源代宝',
+            ],
+        ],
+
+        'uid'       => [
+            'type'      => 'int(11)',
+            'name'      => '创建人',
+            'default'   => 1,
+        ],
+
+        'channel_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '渠道',
+            'default'   => 1,
+            'value'     => 'content/gift_code_content',
+        ],
+
+        'total' => [
+            'name'      => '总兑换次数',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'used' => [
+            'name'      => '已兑换次数',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+    ],
+
+    'index' => [
+        'gift_id' => 'gift_id',
+        'code' => 'code',
+        'channel_id' => 'channel_id',
+    ],
+];

+ 30 - 0
src/content/table/gift_content.php

@@ -0,0 +1,30 @@
+<?php
+return [
+    'name' => '礼包内容',
+    'order' => 'sort asc,id asc',
+    'struct' => [
+        'gift_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '礼包',
+        ],
+
+        'type' => [
+            'name'      => '类型',
+            'type'      => 'varchar(100)',
+        ],
+        
+        'ids' => [
+            'name'      => '关联项目',
+            'type'      => 'text',
+        ],
+
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ],
+    ],
+    'index' => [
+        'search' => 'gift_id,type',
+    ],
+];

+ 92 - 0
src/content/table/info.php

@@ -0,0 +1,92 @@
+<?php
+return [
+    'name' => '内容表',
+    'order' => 'sort asc, id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '名称',
+            'type'      => 'varchar(100)',
+        ],
+
+        'info' => [
+            'name'      => '简介',
+            'type'      => 'varchar(800)',
+        ],
+
+        'cate' => [
+            'name'      => '分类',
+            'type'      => 'varchar(50)',
+        ],
+
+        'cate_parent_id' => [
+            'name'      => '父级分类',
+            'type'      => 'int(11)',
+        ],
+
+        'cate_child_id' => [
+            'name'      => '子分类',
+            'type'      => 'int(11)',
+        ],
+
+        'cate_id' => [
+            'name'      => '直属分类',
+            'type'      => 'int(11)',
+        ],
+
+        'pic' => [
+            'name'      => '封面图',
+            'type'      => 'varchar(150)',
+        ],
+
+        'content_file'        => [
+            'type'      => 'varchar(150)',
+            'name'      => '内容文件',
+        ],
+
+        'content_size'        => [
+            'type'      => 'varchar(11)',
+            'name'      => '内容大小',
+        ],
+
+        'audio_type'        => [
+            'type'      => 'tinyint(1)',
+            'name'      => '音频类型',
+            'default'   => '1',
+            'value'         => [
+                1 => '手动上传',
+                2 => '自动生成',
+            ],
+        ],
+
+        'audio_file'        => [
+            'type'      => 'varchar(150)',
+            'name'      => '音频文件',
+        ],
+
+        'content'        => [
+            'type'      => 'longtext',
+            'name'      => '内容',
+        ],
+
+        'status'        => [
+            'type'      => 'tinyint(1)',
+            'name'      => '状态',
+            'default'   => '1',
+            'value'         => [
+                1 => '处理中',
+                2 => '处理失败',
+                3 => '已成功处理',
+            ],
+        ],
+
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+
+    'index' => [
+        'search' => 'cate_id',
+    ],
+];

+ 5 - 0
src/system/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'System');
+define('DEVER_APP_LANG', '系统配置');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../../boot.php');

+ 24 - 0
src/system/manage/core.php

@@ -0,0 +1,24 @@
+<?php
+return [
+    'menu' => [
+        'base_manage' => [
+            'parent' => 'setting',
+            'name' => '基础配置',
+            'icon' => 'briefcase-5-line',
+            'sort' => '1',
+        ],
+
+        'page' => [
+            'parent'    => 'base_manage',
+            'name'      => '单页管理',
+            'icon'      => 'archive-line',
+            'sort'      => '2',
+        ],
+
+        'help' => [
+            'parent'    => 'base_manage',
+            'name'      => '帮助中心',
+            'sort'      => '3',
+        ],
+    ],
+];

+ 42 - 0
src/system/manage/help.php

@@ -0,0 +1,42 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'id',
+            'name',
+            'sort' => [
+                'type' => 'input',
+                'tip' => '双击修改,正序排序',
+            ],
+            'status' => [
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ],
+            'cdate',
+        ],
+        'button' => [
+            '新增' => 'fastadd',
+        ],
+        'data_button' => [
+            '编辑' => 'fastedit',
+        ],
+        'search' => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'name',
+            'content' => [
+                'type' => 'editor',
+                'editorMenu' => [
+                    'uploadImage' => 1,
+                    'uploadVideo' => 3,
+                ],
+            ],
+        ],
+    ],
+];

+ 45 - 0
src/system/manage/page.php

@@ -0,0 +1,45 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'id',
+            'name',
+            //'key',
+            'status' => [
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ],
+            'cdate',
+        ],
+        'button' => [
+            '新增' => 'fastadd',
+        ],
+        'data_button' => [
+            '编辑' => 'fastedit',
+        ],
+        'search' => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'name',
+            /*
+            'key' => [
+                'tip' => '为空则自动生成',
+            ],*/
+            'content' => [
+                'type' => 'editor',
+                'editorMenu' => [
+                    'uploadImage' => 1,
+                    'uploadVideo' => 3,
+                ],
+            ],
+        ],
+        //'check' => 'key',
+        //'start' => 'channel/manage.updatePage',
+    ],
+];

+ 10 - 0
src/system/table/config.php

@@ -0,0 +1,10 @@
+<?php
+return [
+    'name' => '系统配置表',
+    'struct' => [
+        'name' => [
+            'name'      => '系统名称',
+            'type'      => 'varchar(50)',
+        ],
+    ],
+];

+ 29 - 0
src/system/table/help.php

@@ -0,0 +1,29 @@
+<?php
+return [
+    'name' => '帮助表',
+    'order' => 'sort asc, id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '标题',
+            'type'      => 'varchar(50)',
+        ],
+        'content' => [
+            'name'      => '内容',
+            'type'      => 'text',
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '正常',
+                2 => '封禁',
+            ],
+        ],
+    ],
+];

+ 27 - 0
src/system/table/page.php

@@ -0,0 +1,27 @@
+<?php
+return [
+    'name' => '单页内容表',
+    'struct' => [
+        'name' => [
+            'name'      => '单页名称',
+            'type'      => 'varchar(50)',
+        ],
+        'key' => [
+            'name'      => '单页标识',
+            'type'      => 'varchar(50)',
+        ],
+        'content' => [
+            'name'      => '单页内容',
+            'type'      => 'text',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '正常',
+                2 => '封禁',
+            ],
+        ],
+    ],
+];

+ 5 - 0
src/user/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'User');
+define('DEVER_APP_LANG', '用户');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../../boot.php');

+ 29 - 0
src/user/lib/Read.php

@@ -0,0 +1,29 @@
+<?php namespace User\Lib;
+use Dever;
+class Read
+{
+    # 更新阅读信息
+    public function up($uid, $content_id)
+    {
+        $log['uid'] = $uid;
+        $log['content_id'] = $content_id;
+        $log['day'] = date('Ymd');
+        $info = Dever::db('user/read_log')->find($log);
+        if (!$info) {
+            $log['num'] = 1;
+            $id = Dever::db('user/read_log')->insert($log);
+        } else {
+            $log['num'] = $info['num'] + 1;
+            Dever::db('user/read_log')->update($info['id'], $log);
+        }
+        unset($log['day']);
+        $info = Dever::db('user/read')->find($log);
+        if (!$info) {
+            $log['num'] = 1;
+            $id = Dever::db('user/read')->insert($log);
+        } else {
+            $log['num'] = $info['num'] + 1;
+            Dever::db('user/read')->update($info['id'], $log);
+        }
+    }
+}

+ 6 - 0
src/user/manage/Lib/Api.php

@@ -0,0 +1,6 @@
+<?php namespace Channel\Manage\Lib;
+use Dever;
+class Api
+{
+    
+}

+ 18 - 0
src/user/manage/Lib/Gift.php

@@ -0,0 +1,18 @@
+<?php namespace User\Manage\Lib;
+use Dever;
+class Gift
+{
+    # 获取兑换码
+    public function getCode($id)
+    {
+        $data = Dever::db('content/gift_code')->find($id);
+        return '<span>' . $data['code'] . '</span>';
+    }
+
+    # 获取内容
+    public function getContent($type, $ids)
+    {
+        $data[] = ['type' => $type, 'ids' => $ids];
+        return Dever::load(\Content\Manage\Lib\Gift::class)->getContent($data);
+    }
+}

+ 59 - 0
src/user/manage/Lib/User.php

@@ -0,0 +1,59 @@
+<?php namespace User\Manage\Lib;
+use Dever;
+class User
+{
+    # 获取用户信息
+    public function getInfo($uid)
+    {
+        $user = Dever::db('user/info')->find($uid);
+        return $user['name'] . ' | '.$user['id'];
+    }
+
+    # 获取用户信息
+    public function getTypeInfo($type, $type_id)
+    {
+        if ($type == 1) {
+            $table = 'content/cate';
+        } elseif ($type == 2) {
+            $table = 'content/column';
+        } elseif ($type == 3) {
+            $table = 'content/book';
+        }
+        return Dever::db($table)->column($type_id, 'name');
+    }
+
+    # 获取用户信息
+    public function getMobile($mobile)
+    {
+        return $mobile ?: '-';
+    }
+
+    # 统一做用户搜索信息
+    public function getListSearch()
+    {
+        return [
+            'name' => '用户搜索',
+            'type' => 'select_text',
+            'option' => [
+                ['id' => 1, 'name' => '用户ID', 'value' => 'uid'],
+                ['id' => 2, 'name' => '用户名', 'value' => 'User/Manage/Lib/User.getUidByName'],
+                ['id' => 3, 'name' => '用户手机号', 'value' => 'User/Manage/Lib/User.getUidByMobile'],
+            ],
+        ];
+    }
+
+    # 根据用户名称获取用户
+    public function getUidByName($value)
+    {
+        # 返回sql
+        $user = Dever::db('user/info')->sql(['name' => $value], ['col' => 'id']);
+        return ['uid', 'in', $user];
+    }
+
+    # 根据用户手机号获取用户
+    public function getUidByMobile($value)
+    {
+        $user = Dever::db('user/info')->sql(['mobile' => $value], ['col' => 'id']);
+        return ['uid', 'in', $user];
+    }
+}

+ 57 - 0
src/user/manage/core.php

@@ -0,0 +1,57 @@
+<?php
+return [
+    'menu' => [
+        'user_manage' => [
+            'parent' => 'user',
+            'name' => '用户管理',
+            'icon' => 'folder-user-line',
+            'sort' => '1',
+        ],
+
+        'user' => [
+            'parent'    => 'user_manage',
+            'name'      => '用户列表',
+            'icon'      => 'user-3-line',
+            'sort'      => '1',
+        ],
+
+        'user_act_manage' => [
+            'parent' => 'user',
+            'name' => '互动管理',
+            'sort' => '2',
+        ],
+
+        'feedback' => [
+            'parent'    => 'user_act_manage',
+            'name'      => '用户反馈',
+            'sort'      => '1',
+        ],
+
+        'user_log' => [
+            'parent' => 'user',
+            'name' => '数据记录',
+            'sort' => '3',
+        ],
+
+        'gift' => [
+            'parent'    => 'user_log',
+            'name'      => '兑换记录',
+            'icon'      => 'user-2-line',
+            'sort'      => '1',
+        ],
+
+        'device' => [
+            'parent'    => 'user_log',
+            'name'      => '设备记录',
+            'icon'      => 'keyboard-box-line',
+            'sort'      => '2',
+        ],
+
+        'read' => [
+            'parent'    => 'user_log',
+            'name'      => '阅读记录',
+            'icon'      => 'logout-circle-r-line',
+            'sort'      => '3',
+        ],
+    ],
+];

+ 24 - 0
src/user/manage/device.php

@@ -0,0 +1,24 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'uid' => [
+                'name' => '用户信息',
+                'show' => 'Dever::call("user/manage/user.getInfo", {uid})',
+            ],
+            'device_id',
+            'device_name',
+            'cdate',
+        ],
+        'button' => [
+            
+        ],
+        'data_button' => [
+           '删除' => ['delete'],
+        ],
+        'search'    => [
+            'search' => Dever::call('User/Manage/Lib/User.getListSearch'),
+            'device_id',
+        ],
+    ],
+];

+ 22 - 0
src/user/manage/feedback.php

@@ -0,0 +1,22 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'name',
+            'mobile',
+            'content',
+            'status',
+            'cdate',
+        ],
+        'button' => [
+            
+        ],
+        'data_button' => [
+           
+        ],
+        'search'    => [
+            'name',
+            'mobile',
+        ],
+    ],
+];

+ 40 - 0
src/user/manage/gift.php

@@ -0,0 +1,40 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'uid' => [
+                'name' => '用户信息',
+                'show' => 'Dever::call("User/Manage/Lib/User.getInfo", {uid})',
+            ],
+            'source_type',
+            'gift_id' => [
+            ],
+            'gift_code' => [
+                'name' => '兑换码',
+                'show' => 'Dever::call("User/Manage/Lib/Gift.getCode", ["{gift_code_id}"])',
+            ],
+            'content' => [
+                'name' => '兑换内容',
+                'show' => 'Dever::call("User/Manage/Lib/Gift.getContent", ["{type}", "{ids}"])',
+            ],
+            'status' => '',
+            'edate' => [
+                'show' => 'date("Y-m-d H:i:s", {edate})',
+            ],
+            'cdate' => [
+                'name' => '兑换时间',
+            ],
+        ],
+        'button' => [
+            
+        ],
+        'data_button' => [
+            
+        ],
+        'search'    => [
+            'search' => Dever::call('User/Manage/Lib/User.getListSearch'),
+            'gift_id',
+            'status',
+        ],
+    ],
+];

+ 22 - 0
src/user/manage/read.php

@@ -0,0 +1,22 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'uid' => [
+                'name' => '用户信息',
+                'show' => 'Dever::call("User/Manage/Lib/User.getInfo", {uid})',
+            ],
+            'content_id',
+            'num',
+        ],
+        'button' => [
+            
+        ],
+        'data_button' => [
+           
+        ],
+        'search'    => [
+            'search' => Dever::call('User/Manage/Lib/User.getListSearch'),
+        ],
+    ],
+];

+ 132 - 0
src/user/manage/user.php

@@ -0,0 +1,132 @@
+<?php
+return [
+    'source' => 'user/info',
+    'list' => [
+        'field'      => [
+            'id' => [
+                'name' => '用户ID',
+            ],
+            'name',
+            'mobile' => [
+                'show' => 'Dever::call("User/Manage/Lib/User.getMobile", {mobile})',
+            ],
+            'sex',
+            'birthday' => [
+                'show' => '{birthday} ? date("Y-m-d", {birthday}) : "-"',
+            ],
+            'status' => [
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ],
+            'cdate',
+        ],
+        'button' => [
+            '新增' => ['fastadd'],
+        ],
+        'data_button' => [
+            '编辑' => 'fastedit',
+        ],
+        'search'    => [
+            'id' => [
+                'name' => '用户ID',
+            ],
+            'name' => 'like',
+            'mobile',
+            'status',
+            'cdate' => [
+                'name' => '创建时间',
+                'type' => 'date',
+                'date_type' => 'datetimerange',
+                'value_format' => 'YYYY-MM-DD HH:mm:ss',
+                'start_placeholder' => '开始日期',
+                'end_placeholder' => '结束日期',
+                'range_separator' => '至',
+            ],
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'mobile' => [
+                # 仅限编辑,值为add/edit,不填则所有有效
+                //'only'      => 'edit',
+                'name'      => '手机号',
+                'type'      => 'text',
+                'disable'   => false,//是否禁用
+                'placeholder' => '',//提示语
+                # 校验规则,如rules => true,是必填, 无rules或者rules=false,就是选填
+                # 参考:https://github.com/yiminghe/async-validator
+                'rules'     => [
+                    # 规则1
+                    [
+                        # 必填
+                        'required' => true,
+                        # 输入后触发
+                        'trigger' => 'blur',
+                        # 提示信息
+                        'message' => '请输入手机号',
+                    ],
+                    # 规则2
+                    [
+                        # 最小字符
+                        //'min' => 3,
+                        # 最大字符
+                        //'max' => 5,
+                        # 长度
+                        'len' => 11,
+                        # 正则
+                        'pattern' => Dever::rule('mobile', ''),
+                        'trigger' => 'blur',
+                        # 提示信息
+                        'message' => '手机号错误',
+                        # 验证类型 date,array,number,boolean,integer,float,url,email,enum,string
+                        'type' => 'string',
+                    ],
+                ],
+            ],
+            'password' => [
+                'tip' => '修改时为空则不修改密码',
+                'type' => 'password',
+                # 更新时的值,始终是空的,有值才更新
+                'update' => '',
+                # 对更新的值进行处理
+                'handle' => 'manage/util.createPwd',
+                # 空值不允许入库
+                'empty'  => false,
+                'rules'     => [
+                    [
+                        # 仅限新增时必填,值为add/edit,不填则所有有效
+                        'only' => 'add',
+                        'required' => true,
+                        'trigger' => 'blur',
+                        'message' => '请输入密码',
+                    ],
+                    [
+                        'min' => 6,
+                        'max' => 18,
+                        'trigger' => 'blur',
+                        'message' => '密码长度不能超过18或者少于6个字符',
+                    ],
+                ],
+            ],
+            'avatar' => [
+                'type' => 'upload',
+                'upload' => '1',
+                'multiple' => true,
+                'style' => 'pic',
+            ],
+            'sex' => [
+                'type' => 'radio',
+            ],
+            'birthday' => [
+                'type' => 'date',
+                'date_type' => '',
+            ],
+        ],
+        'check' => 'mobile',
+    ],
+];

+ 50 - 0
src/user/table/cate.php

@@ -0,0 +1,50 @@
+<?php
+return [
+    'name' => '用户内容分类表',
+    'struct' => [
+        'uid'        => [
+            'type'      => 'int(11)',
+            'name'      => '用户ID',
+        ],
+
+        'cate_id'        => [
+            'type'      => 'int(11)',
+            'name'      => '内容分类',
+            'value'     => 'content/cate',
+        ],
+
+        'source_type'        => [
+            'type'      => 'tinyint(1)',
+            'name'      => '来源类型',
+            'default'   => '1',
+            'value'         => [
+                1 => '礼包兑换',
+                2 => '系统赠送',
+                3 => '后台录入',
+            ],
+        ],
+
+        'source_id'        => [
+            'type'      => 'int(11)',
+            'name'      => '来源id',
+        ],
+
+        'edate'         => [
+            'type'      => 'bigint(20)',
+            'name'      => '过期时间',
+        ],
+
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '正常',
+                2 => '失效',
+            ],
+        ],
+    ],
+    'index' => [
+        'search' => 'uid,cate_id',
+    ],
+];

+ 50 - 0
src/user/table/content.php

@@ -0,0 +1,50 @@
+<?php
+return [
+    'name' => '用户内容表',
+    'struct' => [
+        'uid'        => [
+            'type'      => 'int(11)',
+            'name'      => '用户ID',
+        ],
+
+        'content_id'        => [
+            'type'      => 'int(11)',
+            'name'      => '内容',
+            'value'     => 'content/info',
+        ],
+
+        'source_type'        => [
+            'type'      => 'tinyint(1)',
+            'name'      => '来源类型',
+            'default'   => '1',
+            'value'         => [
+                1 => '礼包兑换',
+                2 => '系统赠送',
+                3 => '后台录入',
+            ],
+        ],
+
+        'source_id'        => [
+            'type'      => 'int(11)',
+            'name'      => '来源id',
+        ],
+
+        'edate'         => [
+            'type'      => 'bigint(20)',
+            'name'      => '过期时间',
+        ],
+
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '正常',
+                2 => '失效',
+            ],
+        ],
+    ],
+    'index' => [
+        'search' => 'uid,content_id',
+    ],
+];

+ 23 - 0
src/user/table/device.php

@@ -0,0 +1,23 @@
+<?php
+return [
+    'name' => '用户设备表',
+    'struct' => [
+        'uid'        => [
+            'type'      => 'int(11)',
+            'name'      => '用户ID',
+        ],
+
+        'device_id'        => [
+            'type'      => 'varchar(100)',
+            'name'      => '设备ID',
+        ],
+
+        'device_name'        => [
+            'type'      => 'varchar(100)',
+            'name'      => '设备名称',
+        ],
+    ],
+    'index' => [
+        'search' => 'uid,device_id',
+    ],
+];

+ 35 - 0
src/user/table/feedback.php

@@ -0,0 +1,35 @@
+<?php
+return [
+    'name' => '用户反馈表',
+    'struct' => [
+        'uid'        => [
+            'type'      => 'int(11)',
+            'name'      => '用户ID',
+        ],
+
+        'name' => [
+            'name'      => '用户名称',
+            'type'      => 'varchar(32)',
+        ],
+        'mobile' => [
+            'name'      => '手机号',
+            'type'      => 'bigint(11)',
+        ],
+
+        'content' => [
+            'name'      => '反馈内容',
+            'type'      => 'varchar(2000)',
+        ],
+
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '未解决',
+                2 => '已解决',
+                3 => '延期解决',
+            ],
+        ],
+    ],
+];

+ 53 - 0
src/user/table/gift.php

@@ -0,0 +1,53 @@
+<?php
+return [
+    'name' => '用户礼包表',
+    'struct' => [
+        'uid'       => [
+            'type'      => 'int(11)',
+            'name'      => '用户ID',
+        ],
+        'source_type'        => [
+            'type'      => 'tinyint(1)',
+            'name'      => '来源类型',
+            'default'   => '1',
+            'value'         => [
+                1 => '前台兑换',
+                2 => '后台录入',
+            ],
+        ],
+        'gift_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '礼包',
+            'value'     => 'content/gift',
+        ],
+        'gift_code_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '兑换码',
+        ],
+        'type' => [
+            'name'      => '类型',
+            'type'      => 'varchar(100)',
+        ],
+        'ids' => [
+            'name'      => '关联项目',
+            'type'      => 'text',
+        ],
+        'edate' => [
+            'name'      => '过期时间',
+            'type'      => 'int(11)',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '有效',
+                2 => '失效',
+            ],
+        ],
+    ],
+
+    'index' => [
+        'search' => 'uid,gift_id,status',
+    ],
+];

+ 67 - 0
src/user/table/info.php

@@ -0,0 +1,67 @@
+<?php
+return [
+    'name' => '用户表',
+    'struct' => [
+        'name' => [
+            'name'      => '用户名称',
+            'type'      => 'varchar(32)',
+        ],
+        'type' => [
+            'name'      => '用户类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 2,
+            'value'     => [
+                1 => '正式用户',
+                2 => '临时用户',
+            ],
+        ],
+        'mobile' => [
+            'name'      => '手机号',
+            'type'      => 'bigint(11)',
+        ],
+        'password' => [
+            'name'      => '密码',
+            'type'      => 'varchar(64)',
+        ],
+        'salt' => [
+            'name'      => '密码salt',
+            'type'      => 'varchar(32)',
+        ],
+        'parent_uid' => [
+            'name'      => '上级',
+            'type'      => 'int(11)',
+            'default'   => -1,
+        ],
+        'avatar' => [
+            'name'      => '头像',
+            'type'      => 'varchar(150)',
+        ],
+        'birthday' => [
+            'name'      => '生日',
+            'type'      => 'int(11)',
+        ],
+        'sex' => [
+            'name'      => '性别',
+            'type'      => 'tinyint(1)',
+            'default'   => 3,
+            'value'     => [
+                1 => '男',
+                2 => '女',
+                3 => '未知',
+            ],
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '正常',
+                2 => '封禁',
+            ],
+        ],
+    ],
+    'index' => [
+        'mobile' => 'mobile.unique',
+        'search' => 'parent_uid',
+    ],
+];

+ 23 - 0
src/user/table/read.php

@@ -0,0 +1,23 @@
+<?php
+return [
+    'name' => '用户阅读表',
+    'struct' => [
+        'uid'        => [
+            'type'      => 'int(11)',
+            'name'      => '用户ID',
+        ],
+
+        'content_id'        => [
+            'type'      => 'int(11)',
+            'name'      => '内容id',
+        ],
+
+        'num'         => [
+            'type'      => 'int(11)',
+            'name'      => '阅读次数',
+        ],
+    ],
+    'index' => [
+        'search' => 'uid,content_id',
+    ],
+];

+ 28 - 0
src/user/table/read_log.php

@@ -0,0 +1,28 @@
+<?php
+return [
+    'name' => '用户阅读记录表',
+    'struct' => [
+        'uid'        => [
+            'type'      => 'int(11)',
+            'name'      => '用户ID',
+        ],
+
+        'content_id'        => [
+            'type'      => 'int(11)',
+            'name'      => '内容id',
+        ],
+
+        'day'         => [
+            'type'      => 'int(11)',
+            'name'      => '阅读日期',
+        ],
+
+        'num'         => [
+            'type'      => 'int(11)',
+            'name'      => '阅读次数',
+        ],
+    ],
+    'index' => [
+        'search' => 'uid,content,day',
+    ],
+];