rabin 6 anni fa
parent
commit
be1a14f7dd
52 ha cambiato i file con 4815 aggiunte e 0 eliminazioni
  1. 4 0
      area/index.php
  2. 8 0
      boot.php
  3. 78 0
      code/database/config.php
  4. 190 0
      code/database/info.php
  5. 8 0
      code/index.php
  6. 52 0
      code/lib/Core.php
  7. 112 0
      code/lib/Manage.php
  8. 1 0
      common.php
  9. 58 0
      config/base.php
  10. 119 0
      config/env/localhost/default.php
  11. 6 0
      config/route.php
  12. 126 0
      course/database/cate.php
  13. 436 0
      course/database/info.php
  14. 417 0
      course/database/order.php
  15. 8 0
      course/index.php
  16. 223 0
      course/lib/Article.php
  17. 99 0
      course/lib/Manage.php
  18. 323 0
      data/compile/saike/manage/layadmin/console.cmp.php
  19. 62 0
      data/compile/saike/manage/layadmin/home.cmp.php
  20. 27 0
      data/compile/saike/manage/layadmin/inc/head.cmp.php
  21. 34 0
      data/compile/saike/manage/layadmin/inc/menu.cmp.php
  22. 86 0
      data/compile/saike/manage/layadmin/inc/nav.cmp.php
  23. 49 0
      data/compile/saike/manage/layadmin/inc/script.cmp.php
  24. 79 0
      data/compile/saike/manage/layadmin/login.cmp.php
  25. 146 0
      data/compile/saike/manage/layadmin/project/database/list.cmp.php
  26. 110 0
      data/compile/saike/manage/layadmin/project/database/update.cmp.php
  27. 1 0
      data/readme
  28. 4 0
      invite/index.php
  29. 140 0
      main/database/config.php
  30. 8 0
      main/index.php
  31. 286 0
      main/src/Content.php
  32. 55 0
      manage/config/base.php
  33. 7 0
      manage/daemon/loop.php
  34. 7 0
      manage/daemon/main.php
  35. 4 0
      manage/index.php
  36. 3 0
      package.json
  37. 4 0
      passport/index.php
  38. 4 0
      pay/index.php
  39. 268 0
      push/database/data.php
  40. 302 0
      push/database/info.php
  41. 8 0
      push/index.php
  42. 144 0
      push/lib/Data.php
  43. 52 0
      push/lib/Manage.php
  44. 4 0
      score/index.php
  45. 64 0
      seller/database/area.php
  46. 189 0
      seller/database/info.php
  47. 8 0
      seller/index.php
  48. 64 0
      teacher/database/area.php
  49. 129 0
      teacher/database/course.php
  50. 187 0
      teacher/database/info.php
  51. 8 0
      teacher/index.php
  52. 4 0
      upload/index.php

+ 4 - 0
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');

+ 8 - 0
boot.php

@@ -0,0 +1,8 @@
+<?php 
+define('DEVER_PROJECT', 'saike');
+define('DEVER_PROJECT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+if (defined('DEVER_PACKAGE')) {
+	include('dever_package/'.DEVER_PACKAGE.'/index.php');
+} else {
+	include('dever/boot.php');
+}

+ 78 - 0
code/database/config.php

@@ -0,0 +1,78 @@
+<?php
+
+return array
+(
+	# 表名
+	'name' => 'config',
+	# 显示给用户看的名称
+	'lang' => '新增认证码',
+	'order' => 1,
+	'menu' => false,
+	'end' => array
+	(
+		'update' => 'code/lib/manage.create',
+		'insert' => 'code/lib/manage.create',
+	),
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '系统ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'value'		=> Dever::input('where_id'),
+		),
+
+		'product'     => array
+        (
+            'type'      => 'varchar-200',
+            'name'      => '选择课程',
+            'default'   => '',
+            'desc'      => '选择课程',
+            'search'	=> 'linkage',
+			'update'	=> 'linkage',//多级联动 用于搜索
+			'option'	=> Dever::url('lib/manage.search_cate_course', 'course'),
+        ),
+		
+		'product_id'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '选择课程',
+            'default'   => '',
+            'desc'      => '选择课程',
+            'match'     => 'option',
+            //'update'    => 'select',
+            //'update_search' => 'journal/lib/manage.search_journal',
+        ),
+		
+		'num'		=> array
+		(
+			'type' 		=> 'varchar-32',
+			'name' 		=> '认证码数量',
+			'default' 	=> '',
+			'desc' 		=> '认证码数量',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'value'		=> '',
+		),
+
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+		),
+	),
+
+	'manage' => array
+	(
+		# 后台管理不要列表页
+		'list' => 'update',
+	),
+);

+ 190 - 0
code/database/info.php

@@ -0,0 +1,190 @@
+<?php
+
+# 定义几个常用的选项
+$type = array
+(
+	1 => '未领取',
+	2 => '已领取',
+	3 => '已使用',
+	4 => '已作废',
+);
+
+$status = array
+(
+	1 => '不可用',
+	2 => '可用',
+);
+
+$product = function()
+{
+	return Dever::db('course/info')->state();
+};
+
+$cate = function()
+{
+    $array = array();
+    $info = Dever::db('course/cate')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+return array
+(
+	# 表名
+	'name' => 'info',
+	# 显示给用户看的名称
+	'lang' => '认证码列表',
+	'menu' => 'course',
+	'order' => 1,
+	'auto' => 10000000,
+	# 数据结构
+	'struct' => array
+	(
+	
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			'order'		=> 'desc',
+			//'list'		=> true,
+		),
+
+		'product'     => array
+        (
+            'name'      => '课程',
+            'default'   => '',
+            'desc'      => '课程',
+            'search'	=> 'linkage',
+            'search_col' => 'cate_id,product_id',
+			'option'	=> Dever::url('lib/manage.search_cate_course', 'course'),
+        ),
+
+		'cate_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '课程分类',
+            'default'   => '1',
+            'desc'      => '课程分类',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            'option'    => $cate,
+            //'search'    => 'select',
+            'list'      => true,
+        ),
+
+		'product_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '课程',
+			'default' 	=> '',
+			'desc' 		=> '课程',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'select',
+			'option'	=> $product,
+			//'search'	=> 'select',
+			'list'		=> '{product_id} > 0 ? Dever::load("course/info-one#name", {product_id}) : "通用"',
+		),
+
+		'code'		=> array
+		(
+			'type' 		=> 'varchar-32',
+			'name' 		=> '认证码',
+			'default' 	=> '',
+			'desc' 		=> '认证码',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> 'Dever::load("code/lib/manage.showCode", "{id}")',
+			//'list'		=> true,
+		),
+
+		'type'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '使用状态',
+			'default' 	=> '1',
+			'desc' 		=> '使用状态',
+			'match' 	=> 'is_numeric',
+			'option' 	=> $type,
+			'search'	=> 'select',
+			'update'	=> 'select',
+			'list'		=> true,
+			'mul'		=> array(1 => '恢复使用', 4 => '已作废'),
+		),
+
+		'teacher_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '使用者信息',
+			'default' 	=> '0',
+			'desc' 		=> '使用者信息',
+			'match' 	=> 'is_numeric',
+			'list'		=> 'Dever::load("code/lib/manage.showUserInfo", "{teacher_id}", "{ldate}", "{type}")',
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+
+		'ldate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '领取时间',
+			'match' 	=> 'option',
+			'default' 	=> '',
+			'desc' 		=> '',
+			//'search'	=> 'date',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '生成时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+			'search'	=> 'date',
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	'manage' => array
+	(
+		'excel'	=> true,
+		'delete' => false,
+		'edit' => false,
+		'insert' => false,
+		'mul' => '{type} == 1 || {type} == 4',
+
+		# 自定义快捷新增和编辑
+        'button' => array
+        (
+            '新增兑换码' => array('fast', 1, 'config&where_id=1'),
+        ),
+
+        'list_button' => array
+		(
+			'oper' => array('作废', 'code/lib/manage.drop?id={id}&course_id={product_id}&code={code}', '{type} == 1'),
+
+			'oper2' => array('恢复使用', 'code/lib/manage.recovery?id={id}&course_id={product_id}&code={code}', '{type} == 4'),
+		),
+	),
+
+	'request' => array
+    (
+
+    )
+);

+ 8 - 0
code/index.php

@@ -0,0 +1,8 @@
+<?php
+
+define('DEVER_APP_NAME', 'code');
+define('DEVER_APP_LANG', '认证码管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', 99);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-credit-card layui-icon-note');
+include(DEVER_APP_PATH . '../boot.php');

+ 52 - 0
code/lib/Core.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace Code\Lib;
+
+use Dever;
+
+class Core
+{
+	public function createCode($product, $cate_id, $product_id, $type = 1, $num = 1)
+	{
+        if ($product_id > 0) {
+            Dever::setInput('set_product_id', $product_id);
+        }
+        
+		//$data['product'] = $product;
+		$data['cate_id'] = $cate_id;
+		$data['product_id'] = $product_id;
+		
+		$data['type'] = $type;
+
+        $db = Dever::db('code/info');
+        if ($product_id > 0) {
+            $code = $db->insert($data, $num);
+            $code = $this->view($code, true);
+            return $code;
+        } else {
+            for ($i = 0; $i < $num; $i++) {
+                $data['i'] = $i;
+                $id = $db->insert($data);
+                if ($id) {
+                    $code = $this->view($id, false);
+                    $db->update(array('code' => $code, 'where_id' => $id));
+                }
+            }
+
+            return $code;
+        }
+	}
+
+    public function view($id, $state)
+    {
+        if ($state) {
+            $code = Dever::uid($id * 10000000);
+            $code = 'M' . $code;
+        } else {
+            $code = Dever::rand(4);
+            $code = 'T' . $code . $id;
+        }
+        
+        return $code;
+    }
+}

+ 112 - 0
code/lib/Manage.php

@@ -0,0 +1,112 @@
+<?php
+
+namespace Code\Lib;
+
+use Dever;
+
+class Manage
+{
+	public function showCode($id)
+	{
+		$info = Dever::db('code/info')->one($id);
+
+		if ($info['code']) {
+			return $info['code'];
+		}
+		
+		/*
+		if ($info['create_uid'] > 0) {
+			return Dever::load('code/lib/core')->view($info['id'], true);
+			return '用户创建';
+		}
+		*/
+
+		if ($info['product_id'] > 0) {
+			return Dever::load('code/lib/core')->view($info['id'], true);
+		}
+
+		return 'T' . $id;
+	}
+
+	/**
+	 * 显示用户信息
+	 *
+	 * @return mixed
+	 */
+	public function showUserInfo($teacher_id, $ldate = false, $type = 1)
+	{
+		$table = array();
+		if ($type == 3 && $teacher_id && $teacher_id > 0) {
+			$user = Dever::load('teacher/info-one', $uid);
+			if ($user) {
+				$table['讲师名称'] = $user['name'] . '('.$uid.')';
+				$table['手机号'] = $user['mobile'];
+				$table['使用时间'] = date('Y-m-d H:i:s', $ldate);
+			}
+		}
+
+		return Dever::table($table);
+	}
+
+    /**
+	 * 创建兑换码
+	 *
+	 * @return mixed
+	 */
+	public function create($id, $name, $param)
+	{
+		$code = Dever::param('num', $param);
+		$product = Dever::param('product', $param);
+
+		$cate_id = $product_id = 0;
+		if ($product && isset($product[0])) {
+			$cate_id = $product[0];
+			if (isset($product[1])) {
+				$product_id = $product[1];
+			}
+			
+			$product = implode(',', $product);
+		}
+
+		if ($cate_id <= 0){
+			Dever::alert('生成失败,请选择分类');
+		}
+
+		$total = 0;
+		$core = Dever::load('code/lib/core');
+		if ($code > 0 && $code > $total) {
+			$num = $code - $total;
+
+			$core->createCode($product, $cate_id, $product_id, 1, $num);
+		}
+	}
+
+	/**
+	 * 作废
+	 *
+	 * @return mixed
+	 */
+	public function drop_api($id, $journal_id, $code)
+	{
+		if (!$code && $journal_id > 0) {
+			Dever::setInput('set_product_id', $journal_id);
+		}
+		
+		$update['where_id'] = $id;
+		$update['type'] = 4;
+		Dever::db('code/info')->update($update);
+		return 'ok';
+	}
+
+	public function recovery_api($id, $journal_id, $code)
+	{
+		if (!$code && $journal_id > 0) {
+			Dever::setInput('set_product_id', $journal_id);
+		}
+
+		$update['where_id'] = $id;
+		$update['type'] = 1;
+		Dever::db('code/info')->update($update);
+		return 'ok';
+	}
+}

+ 1 - 0
common.php

@@ -0,0 +1 @@
+<?php

+ 58 - 0
config/base.php

@@ -0,0 +1,58 @@
+<?php
+$config['base'] = array
+(
+	'name' => '赛课',
+	'version' => '1.0.0 Beta',
+
+    'account' => 'mobile',
+
+    'audit' => array
+    (
+        1 => '未审核',
+        2 => '已审核',
+        3 => '审核未通过',
+    ),
+
+    'passport_list_button' => array
+    (
+        'list1' => array('订单', '"order&project=act&search_option_uid={id}&oper_parent=user&oper_project=passport"'),
+        'list2' => array('兑换码', '"info&project=code&search_option_create_uid={id}&oper_parent=user&oper_project=passport"'),
+        'list3' => array('积分', '"user&project=score&search_option_uid={id}&oper_parent=user&oper_project=passport"'),
+    ),
+);
+
+
+# 前台通用配置
+$config['template'] = array
+(
+    # 静态页面目录
+    'assets' => array('pc', 'mobile'),
+
+    # 模板编译器目录
+    'template' => 'pc',
+
+    # 模板html文件的所在目录,默认为html
+    'path' => '',
+
+    'replace' => array
+    (
+        'css' => 'css/',
+        'js' => 'js/',
+        'images' => 'images/',
+        'script' => 'script/',
+        'static' => './static/',
+    ),
+
+    # 编译器与模板对应关系目录,定义之后,代表可以完全不改动前端的代码,可以为空,为空则一一对应,参考manage
+    'relation' => array
+    (
+        # 首页启动屏幕
+        'home' => 'index',
+        'list_text' => 'list1',
+        'page' => 'intro',
+        'view' => 'article',
+        'magazine' => 'magzine',
+    ),
+    
+);
+return $config;

+ 119 - 0
config/env/localhost/default.php

@@ -0,0 +1,119 @@
+<?php
+
+# 验证dc是否存在,一般在share目录下
+$dc = array();
+$dc_file = '/share/dc/config.php';
+if (is_file($dc_file)) {
+    $dc = include($dc_file);
+}
+
+if (isset($dc['data'])) {
+    $config['base']['data'] = $dc['data'];
+}
+
+$create = -1;
+if (isset($dc['mysql']['create'])) {
+    $create = -1;
+}
+$ip = isset($dc['host']) ? $dc['host'] : '192.168.33.10';
+
+$local = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $ip;
+
+# 数据库配置
+$config['database'] = array
+(
+    'create' => $create,
+	# 默认数据库配置
+	'default' => array
+	(
+		'type' => 'pdo',
+		'host' => array
+		(
+			'read' => isset($dc['mysql']) ? $dc['mysql']['host'] : 'web-mysql:3306',
+			'update' => isset($dc['mysql']) ? $dc['mysql']['host'] : 'web-mysql:3306',
+            'create' => isset($dc['mysql']) ? $dc['mysql']['host_create'] : 'web-mysql:3306',
+		),
+		'database' => 'saike',
+		'username' => isset($dc['mysql']) ? $dc['mysql']['username'] : 'root',
+		'password' => isset($dc['mysql']) ? $dc['mysql']['password'] : '123456',
+		'charset' => 'utf8mb4',
+	),
+);
+
+# 缓存配置
+$config['cache'] = array
+(
+    # 启用mysql数据库缓存,这个缓存是根据表名自动生成,dever::load形式和service的all、one形式均自动支持,无需手动添加
+    'mysql' => 0,
+    # 启用页面缓存 会根据当前的url来生成缓存,相当于页面静态化。
+    'html' => 0,
+    # 启用数据级别缓存 这个缓存是程序员自定义的:Dever::cache('name', 'value', 3600);
+    'data' => 0,
+    # 启用load加载器缓存,一般不加载
+    'load' => 0,
+    # 启用load加载器的远程加载缓存
+    'curl' => 0,
+    # 启用路由缓存
+    'route' => 0,
+
+    # 缓存精细控制,根据uri来控制,0则无需缓存
+    'routeKey' => array
+    (
+        
+    ),
+
+    # 哪些路由中的参数不参与生成缓存的key
+    'routeNoParam' => array
+    (
+        'uid' => array
+        (
+            
+        ),
+    ),
+    
+    # 缓存清理的参数名,请通过shell=clearcache执行
+    'shell' => 'clearcache',
+
+    # 是否启用key失效时间记录,启用之后,将会记录每个key的失效时间
+    'expire' => true,
+
+    # 缓存类型
+    'type' => 'redis',//memcache、redis
+
+    # 缓存保存方式,支持多个数据源、多台缓存服务器
+    'store' => array
+    (
+        array
+        (
+            'host' => 'server-redis',
+            'port' => '6379',
+            'weight' => 100,
+            'password' => 'dm_redis_123',
+        ),
+    ),
+);
+
+$config['debug'] = array
+(
+	'log' => false
+);
+
+/*
+if (DEVER_APP_NAME == 'source') {
+    $config['debug']['log'] = array('type' => 'file'); 
+}
+*/
+
+
+$host = 'http://'.$local . '/';
+
+$upload = $host . 'saike/';
+$uploadcdn = $host . 'saike/data/';
+
+$config['host'] = array
+(
+    'upload'=> $upload . 'upload/?save',
+    'uploadRes'     => isset($dc['res']) && $dc['res'] ? $dc['res'] : $uploadcdn . 'upload/',
+);
+
+return $config;

+ 6 - 0
config/route.php

@@ -0,0 +1,6 @@
+<?php
+return array
+(
+	'home' => 'home',
+	'c=v(.*?)_(.*?)' => 'view.get?type=$1&id=$2',
+);

+ 126 - 0
course/database/cate.php

@@ -0,0 +1,126 @@
+<?php
+
+return array
+(
+	# 表名
+	'name' => 'cate',
+	# 显示给用户看的名称
+	'lang' => '课程分类',
+	# 后台菜单排序
+	'order' => 9,
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			'list'		=> true,
+			'order'		=> 'desc',
+		),
+		
+		'name'		=> array
+		(
+			'type' 		=> 'varchar-32',
+			'name' 		=> '分类名称',
+			'default' 	=> '',
+			'desc' 		=> '请输入名称',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'search'	=> 'fulltext',
+			'list'		=> true,
+		),
+		
+		'reorder'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '排序(数值越大越靠前)',
+			'default' 	=> '1',
+			'desc' 		=> '请输入排序',
+			'match' 	=> 'option',
+			'update'	=> 'text',
+			'search'	=> 'order',
+			'list'		=> true,
+			'order'		=> 'desc',
+			'edit'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	# 默认值
+	'default' => array
+	(
+		'col' => 'name,reorder,cdate',
+		'value' => array
+		(
+			'"默认分类",10,' . time(),
+		),
+	),
+
+	'manage' => array
+	(
+		'insert' => false,
+		'edit' => false,
+
+		# 自定义快捷新增和编辑
+		'button' => array
+		(
+			'新增' => array('fast'),
+		),
+		# 快捷更新
+		'list_button' => array
+		(
+			'edit' => array('编辑'),
+		),
+	),
+
+	'request' => array
+	(
+		'state' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'state' => 1,
+			),
+			'type' => 'all',
+			'order' => array('reorder' => 'desc','id' => 'desc'),
+			'col' => '*',
+		),
+		'getAll' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'state' => 1,
+				'id_no' => array('yes-id', '!='),
+			),
+			'type' => 'all',
+			'order' => array('reorder' => 'desc','id' => 'desc'),
+			'col' => '*',
+		),
+	),
+);

+ 436 - 0
course/database/info.php

@@ -0,0 +1,436 @@
+<?php
+
+$audit = Dever::config('base')->audit;
+
+$status = array
+(
+	1 => '下架',
+	2 => '上线发布',
+);
+
+# 每页的数据量
+$page = 15;
+
+$cate = function()
+{
+	$array = array();
+	$info = Dever::db('course/cate')->state();
+	if($info)
+	{
+		$array += $info;
+	}
+	return $array;
+};
+
+$share = array
+(
+	1 => '显示',
+	2 => '不显示',
+);
+
+$template = array
+(
+	1 => '图文',
+	2 => '视频',
+);
+
+# 常用的col
+$col = 'id,cate_id,name,pic_cover,banner,num_add_view+num_view as num_view,content,template,`desc`';
+
+return array
+(
+	# 表名
+	'name' => 'info',
+	# 显示给用户看的名称
+	'lang' => '课程管理',
+	'order' => 100,
+
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'list'		=> true,
+		),
+		
+		'name'		=> array
+		(
+			'type' 		=> 'varchar-80',
+			'name' 		=> '标题-课程标题,同时也用于分享标题',
+			'default' 	=> '',
+			'desc' 		=> '标题',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+			'search'	=> 'fulltext',
+			//增加预览
+			'preview'	=> true,
+		),
+
+		'desc'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '摘要-课程摘要,同时也用于分享内容',
+			'default' 	=> '',
+			'desc' 		=> '摘要',
+			'match' 	=> 'is_string',
+			'update'	=> 'textarea',
+		),
+		
+		'cate_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '所属分类',
+			'default' 	=> '1',
+			'desc' 		=> '所属分类',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'select',
+			'option'	=> $cate,
+			'search'	=> 'select',
+			'list'		=> 'Dever::load("course/cate-one#name", {cate_id})',
+		),
+
+  		'pic'		=> array
+		(
+			'type' 		=> 'varchar-150',
+			'name' 		=> '1:1封面图-图片尺寸380*380px或等比尺寸,上传大小不能超过2M,支持JPG、PNG、GIF格式,建议上传JPG格式,同时用于分享图片',
+			'default' 	=> '',
+			'desc' 		=> '封面图',
+			'match' 	=> 'is_string',
+			'update'	=> 'image',
+			'key' 		=> '1',
+			'place'		=> '150',
+		),
+
+		'banner'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '课程banner图-显示在课程详情,可以传入多张',
+			'default' 	=> '',
+			'desc' 		=> '封面图',
+			'match' 	=> 'is_string',
+			'update'	=> 'images',
+			'key' 		=> '1',
+		),
+
+		'price'      => array
+        (
+            'type'      => 'varchar-50',
+            'name'      => '课程价格-每小时的课程价格,单位元,直接填写数字即可',
+            'default'   => '',
+            'desc'      => '课程价格',
+            'match'     => 'is_string',
+            'update'    => 'text',
+        ),
+
+		'num_add_view'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '浏览量基数',
+			'default' 	=> '0',
+			'desc' 		=> '浏览量基数',
+			'match' 	=> 'option',
+			//'update'	=> 'text',
+		),
+
+		'num_view'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '浏览量',
+			'default' 	=> '0',
+			'desc' 		=> '请填写浏览量',
+			'match' 	=> 'option',
+			'search'	=> 'order',
+			'list'		=> '{num_view}+{num_add_view}',
+		),
+
+		'pdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '发布时间',
+			'match' 	=> array('is_numeric', time()),
+			'default'	=> '',
+			'desc' 		=> '',
+			'update'	=> 'date',
+			'callback'	=> 'maketime',
+			'insert'	=> true,
+			//'list'		=> 'date("Y-m-d H:i:s", {pdate})',
+			'auth'		=> '"{pdate}" > 0',
+		),
+
+		'reorder'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '排序(数值越大越靠前)',
+			'default' 	=> '1',
+			'desc' 		=> '请输入排序',
+			'match' 	=> 'option',
+			'update'	=> 'text',
+			'search'	=> 'order',
+			'list'		=> true,
+			'order'		=> 'desc',
+			'edit'		=> true,
+		),
+
+		'udate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '更新时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+		),
+
+		'question'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '课程解决问题',
+			'default' 	=> '',
+			'desc' 		=> '课程解决问题',
+			'match' 	=> 'is_string',
+			'update'	=> 'editor',
+			'key'		=> '1',
+		),
+
+		'wonderful'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '往期精彩',
+			'default' 	=> '',
+			'desc' 		=> '往期精彩',
+			'match' 	=> 'is_string',
+			'update'	=> 'editor',
+			'key'		=> '1',
+		),
+
+		'content'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '课程内容',
+			'default' 	=> '',
+			'desc' 		=> '请输入内容',
+			'match' 	=> 'is_string',
+			'update'	=> 'editor',
+			'key'		=> '1',
+			//'media'		=> '5',//下面的音视频已经做到了
+			//直接上传到云端
+			//'upload'	=> 'qiniu',
+			//上传大数据
+			//'large' 	=> true,
+			//自定义编辑器右侧按钮
+			/*
+			'editor'	=> array
+			(
+				'name' => '选择插入模块',
+				'button' => array
+				(
+					array
+					(
+						# 名称
+						'name' => '图片',
+						# 资源库id
+						'key' => 1,
+						# 类型
+						'type' => 'image',
+					),
+					array
+					(
+						'name' => '音频',
+						'key' => 5,
+						'type' => 'media',
+					),
+					array
+					(
+						'name' => '视频',
+						'key' => 'video/lib/core.vod',
+					),
+					array
+					(
+						'name' => '直播',
+						'key' => 'video/lib/core.live',
+					),
+
+					array
+					(
+						'name' => '小程序',
+						'key' => 'content/lib/applet.update',
+						'type' => 'update',
+					),
+				),
+			),
+			*/
+		),
+
+		'status'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '发布状态',
+			'default' 	=> '2',
+			'desc' 		=> '发布状态',
+			'match' 	=> 'is_numeric',
+			//'update'	=> 'select',
+			'option'	=> $status,
+			'search'	=> 'select',
+			'list'		=> true,
+			'edit'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+
+		'admin_founder'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '创建人',
+			'default' 	=> '1',
+			'desc' 		=> '创建人',
+			'match' 	=> 'is_numeric',
+		),
+
+		'admin_editor'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '操作人',
+			'default' 	=> '1',
+			'desc' 		=> '操作人',
+			'match' 	=> 'is_numeric',
+		),
+
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+		),
+	),
+
+	# 索引
+	'index' => array
+	(
+		'version' => 1,
+		
+		1 => array
+		(
+			'i1' => 'cate_id,reorder',
+		)
+	),
+	
+	# 管理功能
+	'manage' => array
+	(
+		//'insert' => false,
+		# 列表
+		'list_button' => array
+		(
+			//'edit' => array('预览', str_replace('https://api.', 'http://www.', Dever::url('main/preview.get?type=1'))),
+		),
+	),
+
+	# request 请求接口定义
+	'request' => array
+	(
+		'search' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'ids' => array('yes-id', 'in'),
+				'cate_id' => 'yes',
+				'name' => array('yes', 'like'),
+				'id' => 'yes',
+				'state' => 1,
+			),
+			'type' => 'all',
+			'order' => array('reorder' => 'desc', 'pdate' => 'desc'),
+			'limit' => '0,1000',
+			'col' => 'name as name, id, id as value, "" as selected, "" as disabled|id',
+		),
+
+		'getAll' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'cate_id' => 'yes',
+				'cate_ids' => array('yes-cate_id', 'in'),
+				'id' => 'yes',
+				'status' => 2,
+				'state' => 1,
+			),
+			'type' => 'all',
+			'order' => array('reorder' => 'desc','pdate' => 'desc'),
+			'page' => array($page, 'list'),
+			'col' => $col,
+		),
+
+		'getList' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'cate_id' => 'yes',
+				'status' => 2,
+				'state' => 1,
+			),
+			'type' => 'all',
+			'order' => array('reorder' => 'desc','pdate' => 'desc'),
+			'limit' => '0,10',
+			'col' => $col,
+		),
+
+		'getRelation' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'cate_id' => 'yes',
+				'cate_ids' => array('yes-cate_id', 'in'),
+				'noid' => array('yes-id', '!='),
+				'status' => 2,
+				'state' => 1,
+			),
+			'type' => 'all',
+			'order' => array('reorder' => 'desc','pdate' => 'desc'),
+			'limit' => '0,4',
+			'col' => $col,
+		),
+
+		'getOne' => array
+		(
+			# 匹配的正则或函数 选填项
+			'where' => array
+			(
+				'id' => 'yes',
+			),
+			'type' => 'one',
+			'col' => $col,
+		),
+		
+		# 更新浏览量
+		'addView' => array
+		(
+			'type' => 'update',
+			'where' => array
+			(
+				'id' => 'yes',
+			),
+			'set' => array
+			(
+				'num_view' => array('1', '+='),
+			),
+		),
+	),
+);

+ 417 - 0
course/database/order.php

@@ -0,0 +1,417 @@
+<?php
+
+# 系统
+$system = array
+(
+    1 => '小程序',
+    2 => 'H5',
+    3 => 'ios',
+    4 => '安卓',
+);
+
+$status = array
+(
+    1 => '待支付',
+    2 => '已支付',
+    3 => '支付失败',
+    4 => '待接单',
+    5 => '待服务',
+    6 => '用户取消',
+    7 => '老师取消',
+    8 => '服务完成',
+    9 => '已评价',
+
+    10 => '已退款',
+);
+
+$product = function()
+{
+    return Dever::db('course/info')->state();
+};
+
+$seller = function()
+{
+    $array = array
+    (
+        -1 => '无',
+    );
+    $info = Dever::db('seller/info')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+$teacher = function()
+{
+    $array = array
+    (
+        -1 => '无',
+    );
+    $info = Dever::db('teacher/info')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+$cate = function()
+{
+    $array = array();
+    $info = Dever::db('course/cate')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+return array
+(
+    # 表名
+    'name' => 'order',
+    # 显示给用户看的名称
+    'lang' => '订单管理',
+    'order' => 1,
+
+    'end' => array
+    (
+        //'update' => 'course/lib/pay.order',
+    ),
+
+    # 数据结构
+    'struct' => array
+    (
+    
+        'id'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => 'ID',
+            'default'   => '',
+            'desc'      => '',
+            'match'     => 'is_numeric',
+            'search'    => 'order',
+            //'list'      => true,
+        ),
+
+        'order_id'      => array
+        (
+            'type'      => 'varchar-100',
+            'name'      => '订单id',
+            'default'   => '',
+            'desc'      => '付款订单id',
+            'match'     => 'is_string',
+            'update'    => 'text',
+            'search'    => 'fulltext',
+            'list'        => true,
+            //'list'        => '"{order_id}" ? "{order_id}" : "{code}"',
+        ), 
+
+        'cate_course'     => array
+        (
+            'name'      => '课程',
+            'default'   => '',
+            'desc'      => '课程',
+            'search'    => 'linkage',
+            'search_col' => 'cate_id,product_id',
+            'option'    => Dever::url('lib/manage.search_cate_course', 'course'),
+        ),
+
+        'cate_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '课程分类',
+            'default'   => '1',
+            'desc'      => '课程分类',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            'option'    => $cate,
+            //'search'    => 'select',
+            'list'      => true,
+        ),
+
+        'name'      => array
+        (
+            'type'      => 'varchar-80',
+            'name'      => '订单名称',
+            'default'   => '',
+            'desc'      => '订单名称',
+            'match'     => 'is_string',
+            'update'    => 'text',
+            'search'    => 'fulltext',
+            'list_name' => '订单信息',
+            'list'      => 'Dever::load("course/lib/manage.showOrderUser", "{id}")',
+        ),
+
+        'uid'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '用户名',
+            'default'   => '',
+            'desc'      => '用户id',
+            'match'     => 'is_numeric',
+            'search'    => array
+            (
+                'api' => 'passport/user-all',
+                'col' => 'username',
+                'result' => 'id',
+            ),
+            'update'    => 'text',
+        ),
+
+        'product_id'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => '课程',
+            'default'   => '',
+            'desc'      => '课程',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            'option'    => $product,
+            //'search'    => 'select',
+            //'list'        => true,
+        ),
+
+        'buy_num'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => '购买数量',
+            'default'   => '',
+            'desc'      => '购买数量',
+            'match'     => 'is_numeric',
+            //'search'    => 'select',
+            //'list'        => true,
+        ),
+
+        'system'      => array
+        (
+            'type'      => 'int-11',
+            'name'      => '系统',
+            'default'   => '1',
+            'desc'      => '系统',
+            'match'     => 'is_numeric',
+            'option'    => $system,
+            'search'    => 'select',
+            'update'    => 'radio',
+            'list'        => true,
+        ),
+
+        'teacher_id'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '讲师',
+            'default'   => '-1',
+            'desc'      => '讲师',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            'option'    => $teacher,
+            'search'    => 'select',
+            //'list'      => true,
+        ),
+
+        'seller_id'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '销售人',
+            'default'   => '-1',
+            'desc'      => '销售人',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            'option'    => $seller,
+            'search'    => 'select',
+            //'list'      => true,
+        ),
+
+        'cash'      => array
+        (
+            'type'      => 'varchar-50',
+            'name'      => '支付金额',
+            'default'   => '',
+            'desc'      => '支付金额',
+            'match'     => 'option',
+            'update'    => 'text',
+            //'list'        => true,
+        ),
+
+        'status'        => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '订单状态',
+            'default'   => '1',
+            'desc'      => '请选择订单状态',
+            'match'     => 'is_numeric',
+            'option'    => $status,
+            'search'    => 'select',
+            'update'    => 'radio',
+            'list'      => 'Dever::load("course/lib/manage.showOrderStatus", "{id}")',
+            'control'   => 'status',
+        ),
+
+        'tk_pic'     => array
+        (
+            'type'      => 'varchar-150',
+            'name'      => '退款截图',
+            'default'   => '',
+            'desc'      => '退款截图',
+            'match'     => 'is_string',
+            'update'    => 'image',
+            'key'       => 1
+        ),
+
+        'tk_time'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '退款时间',
+            'default'   => '',
+            'desc'      => '退款时间',
+            'match'     => 'option',
+            //'list'        => true,
+            //'update'    => 'date',
+            'callback'  => 'maketime',
+            'show'      => 'status=5',
+        ),
+
+        'tk_admin'      => array
+        (
+            'type'      => 'int-11',
+            'name'      => '退款审核人',
+            'default'   => '1',
+            'desc'      => '退款审核人',
+            'match'     => 'option',
+            //'list'        => true,
+            'show'      => 'status=5',
+        ),
+
+        'tk_desc'       => array
+        (
+            'type'      => 'varchar-300',
+            'name'      => '退款备注',
+            'default'   => '',
+            'desc'      => '退款备注',
+            'match'     => 'option',
+            'update'    => 'textarea',
+            //'show'        => 'status=5',
+        ),
+
+        'state'     => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '状态',
+            'default'   => '1',
+            'desc'      => '请选择状态',
+            'match'     => 'is_numeric',
+        ),
+        
+        'cdate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '下单时间',
+            'match'     => array('is_numeric', time()),
+            'desc'      => '',
+            # 只有insert时才生效
+            'insert'    => true,
+            'search'    => 'date',
+            'list'        => 'date("Y-m-d H:i:s", {cdate})',
+            //'list'      => 'Dever::load("service/lib/manage.showOrderTime", "{id}")',
+        ),
+    ),
+
+    'manage' => array
+    (
+        'delete' => false,
+        'edit' => false,
+        'insert' => false,
+
+        'button' => array
+        (
+            //'导出订单' => array('location', 'journal/lib/manage.out'),
+        ),
+
+        'list_button' => array(
+            'edit' => array('退款', 'status,tk_time,tk_pic,tk_desc,tk_admin', '{status} == 2 && ({type} == 1 || {type} == 3)'),
+            //'delete' => array('删除', '', '{status} == 1'),
+        ),
+    ),
+
+    'request' => array
+    (
+        'getAll' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'type' => 'yes',
+                'status' => array('1', '!='),
+                'uid' => 'yes',
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('cdate' => 'desc'),
+            'page' => array(10, 'list'),
+            'col' => '*',
+        ),
+
+        'getYes' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'product_id' => 'yes',
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('cdate' => 'desc'),
+            'col' => '*',
+        ),
+
+        # 获取提交订单超过12个小时
+        'getDataByTime' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'cdate' => array('yes', '>='),
+                'notice' => 'yes',
+                'note' => 'yes',
+                'type' => array('yes', 'in'),
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('cdate' => 'desc'),
+            'col' => '*',
+        ),
+
+        # 获取1,2
+        'getBuy' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'status' => 'yes',
+                'type' => array('yes', 'in'),
+                'product_id' => 'yes',
+                'order_id' => 'yes',
+                'uid' => 'yes',
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('id' => 'desc'),
+            'col' => '*',
+        ),
+
+        'getNew' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('cdate' => 'desc'),
+            'limit' => '0,100',
+            'col' => '*',
+        ),
+    ),
+);

+ 8 - 0
course/index.php

@@ -0,0 +1,8 @@
+<?php
+
+define('DEVER_APP_NAME', 'course');
+define('DEVER_APP_LANG', '课程管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', 200);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-tower layui-icon-template-1');
+include(DEVER_APP_PATH . '../boot.php');

+ 223 - 0
course/lib/Article.php

@@ -0,0 +1,223 @@
+<?php
+
+namespace Content\Lib;
+
+use Dever;
+
+class Article
+{
+    # 根据文章id 获取文章信息
+    public function get($data, $uid = false)
+    {
+        if (!is_array($data)) {
+            $data = Dever::db('content/article')->getOne($data);
+        }
+        
+        if (!$data) {
+            Dever::alert('错误的文章信息');
+        }
+    
+        $data = $this->getContent($data, $uid);
+
+        return $data;
+    }
+
+    public function getContent($data, $uid = false)
+    {
+        //embed
+        $data['content_array'] = array();
+
+        $data['content'] = Dever::filter($data['content']);
+
+        $content = $data['content'];
+        $replace = array();
+
+        # embed已废弃
+        if (strstr($data['content'], 'embed')) {
+            # 音频
+            preg_match_all('/<embed src="(.*?)"(.*?)\/>/i', $content, $matches);
+            if (isset($matches[1])) {
+                foreach ($matches[1] as $k => $v) {
+                    $content = str_replace($matches[0][$k], '{replace}'.count($replace).'{replace}', $content);
+
+                    if (strstr($v, '.mp4') || strstr($v, '.mov') || strstr($v, '.m3u8')) {
+                        $replace[] = array('type' => 6, 'content' => $v);
+                    } else {
+                        $replace[] = array('type' => 5, 'content' => $v);
+                    }
+                }
+            }
+        }
+
+        if (strstr($data['content'], 'data-applet')) {
+            # 小程序
+            preg_match_all('/<img(.*?)data-applet="(.*?)" \/>/', $content, $matches);
+
+            if (isset($matches[2])) {
+                foreach ($matches[2] as $k => $v) {
+                    $content = str_replace($matches[0][$k], '{replace}'.count($replace).'{replace}', $content);
+                    $temp = explode('||', $v);
+                    $pic = $temp[0];
+                    $appid = $temp[1];
+                    $path = $temp[2];
+
+                    if ($appid) {
+                        $appinfo = Dever::db('content/applet')->one(array('appid' => $appid));
+                    } else {
+                        $appinfo['name'] = '';
+                        $appinfo['link'] = '';
+                    }
+                    
+                    if (isset($temp[3]) && $temp[3]) {
+                        $appinfo['link'] = $temp[3];
+                    }
+
+                    $replace[] = array('type' => 7, 'pic_cover' => $pic, 'appid' => $appid, 'path' => $path, 'name' => $appinfo['name'], 'link' => $appinfo['link']);
+                }
+            }
+        }
+
+        if (strstr($data['content'], 'gif')) {
+            # gif
+            preg_match_all('/<img(.*?)src="(.*?)\.gif" (.*?)\/>/', $content, $matches);
+
+            if (isset($matches[2])) {
+                foreach ($matches[2] as $k => $v) {
+                    $content = str_replace($matches[0][$k], '{replace}'.count($replace).'{replace}', $content);
+                    $pic = $v;
+
+                    $replace[] = array('type' => 8, 'pic' => $pic . '.gif');
+                }
+            }
+        }
+
+        if (strstr($data['content'], 'data-file')) {
+            # 音频
+            preg_match_all('/<img src="(.*?)" style="(.*?)" data-file="(.*?)" \/>/', $content, $matches);
+
+            if (!isset($matches[1][0])) {
+                preg_match_all('/<img style="(.*?)" src="(.*?)" data-file="(.*?)" \/>/', $content, $matches);
+                $temp = array();
+                if (isset($matches[2][0])) {
+                    $temp = $matches;
+                    $matches[1] = $temp[2];
+                    unset($temp);
+                }
+            }
+
+            if (isset($matches[1])) {
+                foreach ($matches[1] as $k => $v) {
+                    if (isset($matches[3][$k])) {
+                        $content = str_replace($matches[0][$k], '{replace}'.count($replace).'{replace}', $content);
+
+                        $file = $matches[3][$k];
+                        $temp = explode('||', $file);
+                        $file = $temp[0];
+                        if (isset($temp[1])) {
+                            $name = $temp[1];
+                        } else {
+                            $name = '';
+                        }
+                        
+                        $cover = $v;
+
+                        if (strstr($v, '.mp4') || strstr($v, '.mov') || strstr($v, '.m3u8')) {
+                            $replace[] = array('type' => 6, 'content' => $file, 'cover' => $cover, 'name' => $name);
+                        } else {
+                            $replace[] = array('type' => 5, 'content' => $file, 'cover' => $cover, 'name' => $name);
+                        }
+                    }
+                }
+            }
+        }
+
+        if (strstr($data['content'], 'data-id')) {
+            # 视频+直播
+            preg_match_all('/<img(.*?)data-id="(.*?)" data-key="(.*?)" \/>/', $content, $matches);
+            
+            
+            if (!isset($matches[2][0])) {
+                preg_match_all('/<img(.*?)data-key="(.*?)" data-id="(.*?)" \/>/', $content, $matches);
+                $temp = array();
+                if (isset($matches[2][0]) && isset($matches[3][0])) {
+                    $temp = $matches;
+                    $matches[2] = $temp[3];
+                    $matches[3] = $temp[2];
+                    unset($temp);
+                }
+            }
+            
+            if (isset($matches[2][0]) && isset($matches[3][0])) {
+                foreach ($matches[2] as $k => $v) {
+                    $content = str_replace($matches[0][$k], '{replace}'.count($replace).'{replace}', $content);
+                    if ($matches[3][$k] == 'video/lib/core.vod') {
+                        $method = 'video/lib/vod';
+                        $type = 2;
+                    } else {
+                        $type = 3;
+                        $method = 'video/lib/live';
+                    }
+
+                    $info = Dever::load($method)->get($v);
+                    if (isset($info['content'])) {
+                        unset($info['content']);
+                    }
+
+                    if ($type == 3) {
+                        # 查看是否有预约
+                        if ($uid > 0) {
+                            $info['user_act']['note'] = Dever::load('act/lib/note')->get($uid, $v, $type);
+                        } else {
+                            $info['user_act']['note'] = 2;
+                        }
+                    }
+                    $replace[] = array('id' => $v, 'type' => $type, 'content' => $info);
+                }
+            }
+        }
+
+        //$data['content'] = preg_replace('/<div class="dever-drop">([\s\S]*?)<\/div>/i', '', $data['content']);
+
+        $content = explode('{replace}', $content);
+        $data['content_array'] = array();
+        //print_r($content);die;
+        foreach ($content as $k => $v) {
+            $v = trim($v);
+            if (is_numeric($v) && $v >= 0 && isset($replace[$v])) {
+                $data['content_array'][] = $replace[$v];
+            } elseif ($v) {
+                $data['content_array'][] = array
+                (
+                    'type' => 1,
+                    'content' => $v,
+                );
+            }
+        }
+
+        if (!$data['content_array']) {
+            $data['content_array'][] = array
+            (
+                'type' => 1,
+                'content' => $data['content'],
+            );
+        }
+
+        unset($data['content']);
+
+        return $data;
+    }
+
+    # 获取相关推荐
+    public function getRelation($info)
+    {
+        $where['noid'] = $info['id'];
+        $where['cate_id'] = $info['cate_id'];
+        return Dever::db('content/article')->getRelation($where);
+    }
+
+    # 增加浏览量
+    public function addView($id)
+    {
+        Dever::db('content/article')->addView($id);
+    }
+}

+ 99 - 0
course/lib/Manage.php

@@ -0,0 +1,99 @@
+<?php
+
+namespace Content\Lib;
+
+use Dever;
+
+class Manage
+{
+    public function search_cate_course_api()
+    {
+        $level_num = Dever::input('level_num');
+        $level_id = Dever::input('level_id');
+        
+        $auth = Dever::tops();
+        $where = array();
+        if ($level_num == 1) {
+            $default = array
+            (
+                'value' => -1,
+                'name' => '选择分类',
+            );
+            if ($auth) {
+                $where['ids'] = $auth;
+            }
+
+            $data = Dever::db('course/cate')->getIds($where);
+        } elseif ($level_num == 2 && $level_id > 0) {
+            $default = array
+            (
+                'value' => -1,
+                'name' => '选择课程',
+            );
+            if ($level_id > 0) {
+                $where['cate_id'] = $level_id;
+            } elseif ($auth) {
+                $where['cate_id'] = $auth;
+            }
+            
+            $data = Dever::db('course/info')->getIds($where);
+        } else {
+            return array();
+        }
+
+        
+        array_unshift($data, $default);
+        $result['level_total'] = 2;
+        $result['list'] = $data;
+        return $result;
+    }
+
+    public function showOrderUser($id)
+    {
+        $info = Dever::db('course/order')->one($id);
+
+        $table = array();
+
+        $user = Dever::db('passport/user')->one($info['uid']);
+
+        $table['用户名'] = $user['username'] . '('.$info['uid'].')';
+        $table['手机号'] = $user['mobile'];
+        $table['课程'] = $info['name'];
+        $table['购买数量'] = $info['buy_num'];
+        $table['支付金额'] = $info['cash'];
+        
+        if ($info['teacher_id']) {
+            $user = Dever::db('teacher/info')->one($info['teacher_id']);
+            $table['讲师'] = $user['name'];
+        }
+
+        if ($info['seller_id']) {
+            $user = Dever::db('seller/info')->one($info['seller_id']);
+            $table['销售人'] = $user['name'];
+        }
+
+        return Dever::table($table);
+    }
+
+    public function showOrderStatus($id)
+    {
+        $info = Dever::db('course/order')->one($id);
+        if ($info) {
+            if ($info['status'] == 1) {
+                return '待支付';
+            } elseif ($info['status'] == 2) {
+                return '已支付';
+            } elseif ($info['status'] == 3) {
+                return '支付失败';
+            } elseif ($info['status'] == 10) {
+                $table['状态'] = '已退款';
+                $manage = Dever::db('manage/admin')->one($info['tk_admin']);
+                $table['备注'] = $info['tk_desc'];
+                $table['截图'] = '<a><img src="'.$info['tk_pic'].'" style="width:150px" /></a>';
+                //$table['退款时间'] = date('Y-m-d H:i:s', $info['tk_time']);
+                $table['操作人'] = $manage['username'];
+                return Dever::table($table);
+            }
+        }
+    }
+}

+ 323 - 0
data/compile/saike/manage/layadmin/console.cmp.php

@@ -0,0 +1,323 @@
+<?php $data['manage/auth.notice']=Dever::load('manage/auth.notice') ?>
+<!DOCTYPE html>
+<!--power by dever--><html>
+<head>
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/head.cmp.php' ?>
+</head>
+<body>
+  
+  <div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+    <blockquote class="layui-elem-quote layui-quote-nm" id="content">欢迎光临本系统,控制台功能迭代优化中</blockquote>
+    </div>
+    <div class="layui-row layui-col-space15" style="display:none;">
+      <div class="layui-col-md8">
+        <div class="layui-row layui-col-space15">
+          <div class="layui-col-md6">
+            <div class="layui-card">
+              <div class="layui-card-header">快捷方式</div>
+              <div class="layui-card-body">
+                
+                <div class="layui-carousel layadmin-carousel layadmin-shortcut">
+                  <div carousel-item>
+                    <ul class="layui-row layui-col-space10">
+                      <li class="layui-col-xs3">
+                        <a lay-href="home/homepage1.html">
+                          <i class="layui-icon layui-icon-console"></i>
+                          <cite>主页一</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="home/homepage2.html">
+                          <i class="layui-icon layui-icon-chart"></i>
+                          <cite>主页二</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="component/layer/list.html">
+                          <i class="layui-icon layui-icon-template-1"></i>
+                          <cite>弹层</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a layadmin-event="im">
+                          <i class="layui-icon layui-icon-chat"></i>
+                          <cite>聊天</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="component/progress/index.html">
+                          <i class="layui-icon layui-icon-find-fill"></i>
+                          <cite>进度条</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="app/workorder/list.html">
+                          <i class="layui-icon layui-icon-survey"></i>
+                          <cite>工单</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="user/user/list.html">
+                          <i class="layui-icon layui-icon-user"></i>
+                          <cite>用户</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/system/website.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>设置</cite>
+                        </a>
+                      </li>
+                    </ul>
+                    <ul class="layui-row layui-col-space10">
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs3">
+                        <a lay-href="set/user/info.html">
+                          <i class="layui-icon layui-icon-set"></i>
+                          <cite>我的资料</cite>
+                        </a>
+                      </li>
+                    </ul>
+                    
+                  </div>
+                </div>
+                
+              </div>
+            </div>
+          </div>
+          <div class="layui-col-md6">
+            <div class="layui-card">
+              <div class="layui-card-header">待办事项</div>
+              <div class="layui-card-body">
+
+                <div class="layui-carousel layadmin-carousel layadmin-backlog">
+                  <div carousel-item>
+                    <ul class="layui-row layui-col-space10">
+                      <li class="layui-col-xs6">
+                        <a lay-href="app/content/comment.html" class="layadmin-backlog-body">
+                          <h3>待审评论</h3>
+                          <p><cite>66</cite></p>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs6">
+                        <a lay-href="app/forum/list.html" class="layadmin-backlog-body">
+                          <h3>待审帖子</h3>
+                          <p><cite>12</cite></p>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs6">
+                        <a lay-href="template/goodslist.html" class="layadmin-backlog-body">
+                          <h3>待审商品</h3>
+                          <p><cite>99</cite></p>
+                        </a>
+                      </li>
+                      <li class="layui-col-xs6">
+                        <a href="javascript:;" onclick="layer.tips('不跳转', this, {tips: 3});" class="layadmin-backlog-body">
+                          <h3>待发货</h3>
+                          <p><cite>20</cite></p>
+                        </a>
+                      </li>
+                    </ul>
+                    <ul class="layui-row layui-col-space10">
+                      <li class="layui-col-xs6">
+                        <a href="javascript:;" class="layadmin-backlog-body">
+                          <h3>待审友情链接</h3>
+                          <p><cite style="color: #FF5722;">5</cite></p>
+                        </a>
+                      </li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="layui-col-md12">
+            <div class="layui-card">
+              <div class="layui-card-header">数据概览</div>
+              <div class="layui-card-body">
+                
+                <div class="layui-carousel layadmin-carousel layadmin-dataview" data-anim="fade" lay-filter="LAY-index-dataview">
+                  <div carousel-item id="LAY-index-dataview">
+                    <div><i class="layui-icon layui-icon-loading1 layadmin-loading"></i></div>
+                    <div></div>
+                    <div></div>
+                  </div>
+                </div>
+                
+              </div>
+            </div>
+            <div class="layui-card">
+              <div class="layui-tab layui-tab-brief layadmin-latestData">
+                <ul class="layui-tab-title">
+                  <li class="layui-this">今日热搜</li>
+                  <li>今日热帖</li>
+                </ul>
+                <div class="layui-tab-content">
+                  <div class="layui-tab-item layui-show">
+                    <table id="LAY-index-topSearch"></table>
+                  </div>
+                  <div class="layui-tab-item">
+                    <table id="LAY-index-topCard"></table>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      
+      <div class="layui-col-md4">
+
+        <div class="layui-card dever-notice" style="<?php if(!(Dever::load('manage/auth.notice'))): ?>display:none;<?php endif; ?>">
+          <div class="layui-card-header">系统公告</div>
+          <div class="layui-card-body">
+            <div class="layui-carousel layadmin-carousel layadmin-news" data-autoplay="true" data-anim="fade" lay-filter="news">
+              <div carousel-item id="dever-notice">
+                <?php if(isset($data['manage/auth.notice']) && is_array($data['manage/auth.notice'])): ?><?php $t=count($data['manage/auth.notice'])-1 ?><?php $i=0 ?><?php foreach($data['manage/auth.notice'] as $k => $v): ?><div><a href="<?php  echo Dever::url("notice?where_id=".$v['id']."&where_config=".$v['config']) ?>" target="_blank" class="layui-bg-red" title="<?php echo isset($v['name']) ? $v['name'] : "" ?>" style="background-color: #FF5722!important;"><?php echo isset($v['name']) ? $v['name'] : "" ?></a></div><?php $i=$i+1 ?><?php endforeach; ?><?php else: ?><?php echo $data['manage/auth.notice'] ?><?php endif; ?>
+                 
+                
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="layui-card">
+          <div class="layui-card-header">版本信息</div>
+          <div class="layui-card-body layui-text">
+            <table class="layui-table">
+              <colgroup>
+                <col width="100">
+                <col>
+              </colgroup>
+              <tbody>
+                <tr>
+                  <td>当前版本</td>
+                  <td>
+                    <script type="text/html" template>
+                      v{{ layui.admin.v }}
+                    </script>
+                  </td>
+                </tr>
+                <tr>
+                  <td>基于框架</td>
+                  <td>
+                    <script type="text/html" template>
+                      layui-v{{ layui.v }}
+                    </script>
+                 </td>
+                </tr>
+                <tr>
+                  <td>主要特色</td>
+                  <td>零门槛 / 响应式 / 清爽 / 极简</td>
+                </tr>
+                <tr>
+                  <td>获取渠道</td>
+                  <td style="padding-bottom: 0;">
+                    <div class="layui-btn-container">
+                      <a href="http://www.layui.com/admin/" target="_blank" class="layui-btn layui-btn-danger">获取授权</a>
+                      <a href="http://fly.layui.com/download/layuiAdmin/" target="_blank" class="layui-btn">立即下载</a>
+                    </div>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+        
+        <div class="layui-card">
+          <div class="layui-card-header">效果报告</div>
+          <div class="layui-card-body layadmin-takerates">
+            <div class="layui-progress" lay-showpercent="yes">
+              <h3>转化率(日同比 28% <span class="layui-edge layui-edge-top" lay-tips="增长" lay-offset="-15"></span>)</h3>
+              <div class="layui-progress-bar" lay-percent="65%"></div>
+            </div>
+            <div class="layui-progress" lay-showpercent="yes">
+              <h3>签到率(日同比 11% <span class="layui-edge layui-edge-bottom" lay-tips="下降" lay-offset="-15"></span>)</h3>
+              <div class="layui-progress-bar" lay-percent="32%"></div>
+            </div>
+          </div>
+        </div>
+        
+        <div class="layui-card">
+          <div class="layui-card-header">实时监控</div>
+          <div class="layui-card-body layadmin-takerates">
+            <div class="layui-progress" lay-showpercent="yes">
+              <h3>CPU使用率</h3>
+              <div class="layui-progress-bar" lay-percent="58%"></div>
+            </div>
+            <div class="layui-progress" lay-showpercent="yes">
+              <h3>内存占用率</h3>
+              <div class="layui-progress-bar layui-bg-red" lay-percent="90%"></div>
+            </div>
+          </div>
+        </div>
+
+        <div class="layui-card">
+          <div class="layui-card-header">
+            作者心语
+            <i class="layui-icon layui-icon-tips" lay-tips="要支持的噢" lay-offset="5"></i>
+          </div>
+          <div class="layui-card-body layui-text layadmin-text">
+            <p>一直以来,layui 秉承无偿开源的初心,虔诚致力于服务各层次前后端 Web 开发者,在商业横飞的当今时代,这一信念从未动摇。即便身单力薄,仍然重拾决心,埋头造轮,以尽可能地填补产品本身的缺口。</p>
+            <p>在过去的一段的时间,我一直在寻求持久之道,已维持你眼前所见的一切。而 layuiAdmin 是我们尝试解决的手段之一。我相信真正有爱于 layui 生态的你,定然不会错过这一拥抱吧。</p>
+            <p>子曰:君子不用防,小人防不住。请务必通过官网正规渠道,获得 <a href="http://www.layui.com/admin/" target="_blank">layuiAdmin</a>!</p>
+            <p>—— 贤心(<a href="http://www.layui.com/" target="_blank">layui.com</a>)</p>
+          </div>
+        </div>
+      </div>
+      
+    </div>
+  </div>
+
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/script.cmp.php' ?>
+  <script>
+    layui.config({
+        base: '<?php echo Dever::config("host")->script ?>lib/layui/admin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'console']);
+</script>
+</body>
+</html>

+ 62 - 0
data/compile/saike/manage/layadmin/home.cmp.php

@@ -0,0 +1,62 @@
+<?php $data['manage/database.cookie']=Dever::load('manage/database.cookie') ?>
+<?php $data['manage/menu.link']=Dever::load('manage/menu.link') ?>
+<!DOCTYPE html>
+<!--power by dever--><html>
+<head>
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/head.cmp.php' ?>
+</head>
+<body class="theme-<?php  echo Dever::load("manage/auth.config#template") ?>" test="公告">
+
+  <div id="LAY_app" class="<?php echo $data['manage/database.cookie']['wrapper'] ?>">
+    <div class="layui-layout layui-layout-admin">
+
+      <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/nav.cmp.php' ?>
+
+      <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/menu.cmp.php' ?>
+
+      
+      <div class="layadmin-pagetabs" id="LAY_app_tabs">
+        <div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
+        <div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
+        <div class="layui-icon layadmin-tabs-control layui-icon-down">
+          <ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
+            <li class="layui-nav-item" lay-unselect>
+              <a href="javascript:;"></a>
+              <dl class="layui-nav-child layui-anim-fadein">
+                <dd layadmin-event="closeThisTabs"><a href="javascript:;">关闭当前标签页</a></dd>
+                <dd layadmin-event="closeOtherTabs"><a href="javascript:;">关闭其它标签页</a></dd>
+                <dd layadmin-event="closeAllTabs"><a href="javascript:;">关闭全部标签页</a></dd>
+              </dl>
+            </li>
+          </ul>
+        </div>
+        <div class="layui-tab" lay-unauto lay-allowclose="true" lay-filter="layadmin-layout-tabs">
+          <ul class="layui-tab-title" id="LAY_app_tabsheader">
+            <li lay-id="<?php echo $data['manage/menu.link']['console'] ?>" lay-attr="<?php echo $data['manage/menu.link']['console'] ?>" class="layui-this"><i class="layui-icon layui-icon-home"></i></li>
+          </ul>
+        </div>
+      </div>
+      
+      
+      
+      <div class="layui-body" id="LAY_app_body">
+        <div class="layadmin-tabsbody-item layui-show">
+          <iframe src="<?php echo $data['manage/menu.link']['console'] ?>" frameborder="0" class="layadmin-iframe"></iframe>
+        </div>
+      </div>
+      
+      
+      <div class="layadmin-body-shade" layadmin-event="shade"></div>
+    </div>
+  </div>
+
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/script.cmp.php' ?>
+  <script>
+    layui.config({
+        base: '<?php echo Dever::config("host")->script ?>lib/layui/admin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use('index');
+</script>
+</body>
+</html>

+ 27 - 0
data/compile/saike/manage/layadmin/inc/head.cmp.php

@@ -0,0 +1,27 @@
+<?php $data['manage/auth.config']=Dever::load('manage/auth.config') ?>
+<meta charset="utf-8">
+<title><?php echo $data['manage/auth.config']['title'] ?></title>
+<meta name="keywords" content="<?php echo $data['manage/auth.config']['title'] ?>">
+<meta name="description" content="<?php echo $data['manage/auth.config']['title'] ?>">
+<meta name="apple-mobile-web-app-title" content="<?php echo $data['manage/auth.config']['title'] ?>" />
+<meta name="author" content="rabin">
+<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/layui/css/layui.css" />
+<link rel="stylesheet" href="<?php echo Dever::config("host")->script ?>lib/layui/admin/style/admin.css?v3" media="all">
+
+
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/color/colpick.css">
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/kindeditor/themes/default/default.css?v1" />
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/valid/validationEngine.jquery.css">
+
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/fancybox/jquery.fancybox.css">
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/highlight/highlight.min.css">
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/datetime/jquery.datetimepicker.css">
+
+<link rel="stylesheet" type="text/css" href="<?php echo Dever::config("host")->script ?>lib/ui/ui.min.css">
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/jquery/jquery.min.js"></script>
+<script id="script"><?php  echo Dever::script() ?>config.template="<?php  echo $data["manage/auth.config"]["template"] ?>";config.lib="<?php  echo Dever::config("host")->public ?>"</script>
+<style type="text/css" id="style"><?php  echo Dever::load("manage/auth.loading") ? ".content,.content-page{margin-left: 0px;min-height:auto}" : "" ?></style>

+ 34 - 0
data/compile/saike/manage/layadmin/inc/menu.cmp.php

@@ -0,0 +1,34 @@
+<?php $data['manage/auth.config']=Dever::load('manage/auth.config') ?>
+<?php $data['manage/menu.link']=Dever::load('manage/menu.link') ?>
+<?php $data['manage/menu.all']=Dever::load('manage/menu.all') ?>
+
+      <div class="layui-side layui-side-menu">
+        <div class="layui-side-scroll">
+          <div class="layui-logo" id="console-url" lay-href="<?php echo $data['manage/menu.link']['console'] ?>">
+            <span id="dever-name"><?php echo $data['manage/auth.config']['title'] ?></span>
+          </div>
+          
+          <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" lay-filter="layadmin-system-side-menu">
+            <?php if(isset($data['manage/menu.all']) && is_array($data['manage/menu.all'])): ?><?php $t=count($data['manage/menu.all'])-1 ?><?php $i=0 ?><?php foreach($data['manage/menu.all'] as $k => $v): ?><li data-name="home" class="layui-nav-item<?php if(Dever::input("menu") == $v['key'] || (!Dever::input("menu_id") && $k == "console")):?> layui-nav-itemed<?php endif; ?>">
+              <a href="javascript:;" lay-tips="<?php echo isset($v['name']) ? $v['name'] : "" ?>" lay-direction="2" data-target=".<?php echo isset($v['key']) ? $v['key'] : "" ?>-menu" class="<?php if(Dever::input("menu") == $v['key'] || !Dever::input("menu")):?>layui-nav-itemed<?php endif; ?>">
+                <i class="<?php  echo $v['icon'] ? "layui-icon " . $v['icon'] : "layui-icon layui-icon-home" ?>"></i>
+                <cite><?php echo isset($v['name']) ? $v['name'] : "" ?></cite>
+              </a>
+              <dl class="layui-nav-child" id="<?php echo isset($v['key']) ? $v['key'] : "" ?>-menu">
+                <?php if(isset($v['child']) && $v['child'] && is_array($v['child'])):foreach($v['child'] as $k1 => $v1):if($v1): ?><dd data-name="console" class="<?php if(Dever::input("menu_id") == $v1['id']):?>layui-this<?php elseif(!Dever::input("menu_id") && $k1 == "console.index"): ?>layui-this<?php endif; ?>">
+                  <a lay-href="<?php echo isset($v1['link']) ? $v1['link'] : "" ?>"><?php echo isset($v1['name']) ? $v1['name'] : "" ?></a>
+                </dd><?php endif;endforeach;endif; ?>
+                
+                
+              </dl>
+            </li><?php $i=$i+1 ?><?php endforeach; ?><?php else: ?><?php echo $data['manage/menu.all'] ?><?php endif; ?>
+            
+            
+            
+            
+            
+            
+            
+          </ul>
+        </div>
+      </div>

+ 86 - 0
data/compile/saike/manage/layadmin/inc/nav.cmp.php

@@ -0,0 +1,86 @@
+<?php $data['manage/database.res']=Dever::load('manage/database.res') ?>
+<?php $data['manage/auth.config']=Dever::load('manage/auth.config') ?>
+<?php $data['manage/auth.info']=Dever::load('manage/auth.info') ?>
+<?php $data['manage/menu.link']=Dever::load('manage/menu.link') ?>
+<div id="load_style" style="display:none;"><?php echo $data['manage/database.res']['css'] ?></div>
+<div id="dever-name" style="display:none;"><?php echo $data['manage/auth.config']['title'] ?></div>
+<div class="layui-header" id="nav" style="<?php  echo Dever::load("manage/auth.loading") ? "display:none;" : "" ?>">
+
+<ul class="layui-nav layui-layout-left">
+  <li class="layui-nav-item layadmin-flexible" lay-unselect>
+    <a href="javascript:;" layadmin-event="flexible" title="侧边伸缩">
+      <i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
+    </a>
+  </li>
+  <li class="layui-nav-item" lay-unselect>
+    <a href="javascript:;" layadmin-event="back" title="上一页">
+      <i class="layui-icon layui-icon-return"></i>
+    </a>
+  </li>
+  <li class="layui-nav-item layui-hide-xs" lay-unselect style="display:none;">
+    <a href="http://www.layui.com/admin/" target="_blank" title="前台">
+      <i class="layui-icon layui-icon-website"></i>
+    </a>
+  </li>
+  <li class="layui-nav-item" lay-unselect>
+    <a href="javascript:;" layadmin-event="refresh" title="刷新">
+      <i class="layui-icon layui-icon-refresh-3"></i>
+    </a>
+  </li>
+  <li class="layui-nav-item layui-hide-xs" lay-unselect style="display:none;">
+    <input type="text" placeholder="搜索..." autocomplete="off" class="layui-input layui-input-search" layadmin-event="serach" lay-action="template/search.html?keywords="> 
+  </li>
+</ul>
+<ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
+
+  <li class="layui-nav-item auth-top" lay-unselect>
+    <a href="javascript:;">
+      <cite><span></span></cite>
+    </a>
+    <ul class="layui-nav-child">
+      <li><a lay-href="set/user/info.html">基本资料</a></li>
+    </ul>
+  </li>
+
+  <li class="layui-nav-item" lay-unselect style="display:none;">
+    <a lay-href="app/message/index.html" layadmin-event="message" lay-text="消息中心">
+      <i class="layui-icon layui-icon-notice"></i>  
+      
+      
+      <span class="layui-badge-dot"></span>
+    </a>
+  </li>
+  <li class="layui-nav-item layui-hide-xs" lay-unselect>
+    <a href="javascript:;" layadmin-event="theme">
+      <i class="layui-icon layui-icon-theme"></i>
+    </a>
+  </li>
+  <li class="layui-nav-item layui-hide-xs" lay-unselect style="display:none;">
+    <a href="javascript:;" layadmin-event="note">
+      <i class="layui-icon layui-icon-note"></i>
+    </a>
+  </li>
+  <li class="layui-nav-item layui-hide-xs" lay-unselect>
+    <a href="javascript:;" layadmin-event="fullscreen">
+      <i class="layui-icon layui-icon-screen-full"></i>
+    </a>
+  </li>
+  <li class="layui-nav-item" lay-unselect>
+    <a href="javascript:;">
+      <cite id="manage-name"><?php echo $data['manage/auth.info']['username'] ?></cite>
+    </a>
+    <dl class="layui-nav-child">
+      <dd><a id="edit_password" onclick="pass($(this));" style="cursor: pointer;">修改密码</a></dd>
+      <hr>
+      <dd style="text-align: center;"><a id="logout-url" href="<?php echo $data['manage/menu.link']['logout'] ?>">退出</a></dd>
+    </dl>
+  </li>
+  
+  <li class="layui-nav-item layui-hide-xs" lay-unselect style="display:none;">
+    <a href="javascript:;" layadmin-event="about"><i class="layui-icon layui-icon-more-vertical"></i></a>
+  </li>
+  <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-unselect>
+    <a href="javascript:;" layadmin-event="more"><i class="layui-icon layui-icon-more-vertical"></i></a>
+  </li>
+</ul>
+</div>

+ 49 - 0
data/compile/saike/manage/layadmin/inc/script.cmp.php

@@ -0,0 +1,49 @@
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/pic/webp.js"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/jquery/store.js"></script>
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/bootstrap/js/bootstrap.min.js"></script>
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/pjax/pjax.js"></script>
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/pjax/nprogress.js"></script>
+
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/color/colpick.js"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/datetime/jquery.datetimepicker.min.js"></script>
+
+
+
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/fancybox/jquery.fancybox.js"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/echarts/echarts.common.min.js?v1"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/highlight/highlight.min.js"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/valid/jquery.validationEngine.min.js?v3"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/kindeditor/kindeditor-all-min.js?v9"></script>
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/kindeditor/lang/zh-CN.js?v7"></script>
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/ui/ui.min.js"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/qiniu/upload/plupload.full.min.js"></script>
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/qiniu/qiniu.upload.js"></script>
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/tool/md5.js"></script>
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/layui/upload.js?v6"></script>
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/layui/layui.js"></script>
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/clipboard/clipboard.js"></script>
+
+
+<script type="text/javascript" src="<?php echo Dever::config("host")->script ?>lib/manage/main.js?v30"></script>

+ 79 - 0
data/compile/saike/manage/layadmin/login.cmp.php

@@ -0,0 +1,79 @@
+<?php $data['manage/auth.set']=Dever::load('manage/auth.set') ?>
+<!DOCTYPE html>
+<!--power by dever--><html>
+<head>
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/head.cmp.php' ?>
+  <link rel="stylesheet" href="<?php echo Dever::config("host")->script ?>lib/layui/admin/style/login.css" media="all">
+</head>
+<body>
+
+  <div class="layadmin-user-login layadmin-user-display-show" id="LAY-user-login">
+    <form action="<?php  echo Dever::url("auth.login") ?>" method="post" target="f1" class="form-horizontal m-t-20" id="login">
+    <input type="hidden" name="function" id="function" value="msg">
+    <input type="hidden" name="refer" id="refer" value="<?php echo $data['manage/auth.set']['refer'] ?>">
+    <iframe id="f1" name="f1" style="display:none;"></iframe>
+    <div class="layadmin-user-login-main">
+      <div class="layadmin-user-login-box layadmin-user-login-header">
+        <h2 id="name"><?php  echo Dever::load("manage/auth.config#title") ?></h2>
+      </div>
+      <div class="layadmin-user-login-box layadmin-user-login-body layui-form">
+        <div class="layui-form-item">
+          <label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-user-login-username"></label>
+          <input type="text" name="username" id="username" lay-verify="required" placeholder="账号" class="layui-input">
+        </div>
+        <div class="layui-form-item">
+          <label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-user-login-password"></label>
+          <input name="password" id="password" type="password" lay-verify="required" placeholder="密码" class="layui-input">
+        </div>
+        <div class="layui-form-item">
+          <button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-user-login-submit">登 入</button>
+        </div>
+      </div>
+    </div>
+    
+    <div class="layui-trans layadmin-user-login-footer">
+      <p id="footer" style="<?php if(!(Dever::config("base")->copyright)): ?>display:none;<?php endif; ?>"><?php  echo Dever::config("base")->copyright ?></p>
+    </div>
+    
+    <div class="ladmin-user-login-theme" style="display:none;">
+      <script type="text/html" template>
+        <ul>
+          <li data-theme=""><img src="{{ layui.setter.base }}style/res/bg-none.jpg"></li>
+          <li data-theme="#03152A" style="background-color: #03152A;"></li>
+          <li data-theme="#2E241B" style="background-color: #2E241B;"></li>
+          <li data-theme="#50314F" style="background-color: #50314F;"></li>
+          <li data-theme="#344058" style="background-color: #344058;"></li>
+          <li data-theme="#20222A" style="background-color: #20222A;"></li>
+        </ul>
+      </script>
+    </div>
+    </form> 
+  </div>
+
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/script.cmp.php' ?>
+  <script>
+  $(function()
+  {
+    $("#login").bind("keydown",function(e){
+      var theEvent = e || window.event;    
+      var code = theEvent.keyCode || theEvent.which || theEvent.charCode;    
+      if (code == 13) {    
+              $("#login").submit();
+          }
+     });
+  });
+
+  </script>
+  <script>
+  layui.config({
+    base: '<?php echo Dever::config("host")->script ?>lib/layui/admin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+  }).use(['index', 'user'], function(){
+    var $ = layui.$
+    ,setter = layui.setter
+    ,admin = layui.admin
+  });
+  </script>
+</body>
+</html>

+ 146 - 0
data/compile/saike/manage/layadmin/project/database/list.cmp.php

@@ -0,0 +1,146 @@
+<?php $data['manage/database.page_list']=Dever::load('manage/database.page_list') ?>
+<?php $data['manage/database.info']=Dever::load('manage/database.info') ?>
+<?php $data['manage/database.listStyle']=Dever::load('manage/database.listStyle') ?>
+<?php $data['manage/database.page_list_table']=Dever::load('manage/database.page_list_table') ?>
+<?php $data['manage/database.list_search']=Dever::load('manage/database.list_search') ?>
+<?php $data['manage/database.list_thead']=Dever::load('manage/database.list_thead') ?>
+<?php $data['manage/database.list_tbody']=Dever::load('manage/database.list_tbody') ?>
+<?php $data['manage/database.list_button']=Dever::load('manage/database.list_button') ?>
+<?php $data['manage/database.list_mul']=Dever::load('manage/database.list_mul') ?>
+<?php $data['manage/auth.config']=Dever::load('manage/auth.config') ?>
+<?php $data['manage/top.get']=Dever::load('manage/top.get') ?>
+<!DOCTYPE html>
+<!--power by dever--><html>
+<head>
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/head.cmp.php' ?>
+  <link rel="stylesheet" href="<?php echo Dever::config("host")->script ?>lib/layui/admin/modules/plugin/formselects/formselects.css" media="all" />
+</head>
+<body class="theme-<?php  echo Dever::load("/auth.config#template") ?>">
+<style id="addstyle"><?php echo $data['manage/database.listStyle'] ?></style>
+<style>
+.layui-table-cell .layui-select,.layui-table-cell .layui-input
+{
+    height: 25px;
+}
+.layui-table-cell {
+    height: auto;
+}
+
+.table th,.table td {
+  min-width: 70px;
+}
+#table_2,#table_1 {
+  overflow: auto;
+}
+.layui-btn-xs
+{
+  margin-top:1px;
+}
+.dever-emoji img {
+  width:16px;
+}
+.layui-tab-title {
+  height: 100%;
+  white-space: inherit;
+}
+</style>
+<span id="dever-name" style="display:none;"><?php echo $data['manage/auth.config']['title'] ?></span>
+<div class="topbar">
+    <div class="banner dever-layout" style="display:none;">
+        <a target="_blank"><img src="#"></a>
+        <span>项目名称</span>
+    </div>
+</div>
+
+<div id="content_1" style="<?php echo $data['manage/database.page_list']['s1'] ?>"><?php echo $data['manage/database.page_list']['content'] ?></div>
+<div id="content_2" style="<?php echo $data['manage/database.page_list']['s2'] ?>">
+  <div class="layui-fluid">
+    <div class="layui-card">
+      <input type="hidden" name="url1" id="url" value="<?php echo $data['manage/database.info']['mul'] ?>"/>
+
+      <form id="form1" name="form1" method="get" target="f1" action="<?php echo $data['manage/database.info']['list'] ?>">
+      <input type="hidden" name="l" id="l" value="<?php echo $data['manage/database.info']['l'] ?>"/>
+      <input type="hidden" name="project" id="project" value="<?php echo $data['manage/database.info']['project'] ?>"/>
+      <input type="hidden" name="table" id="tables" value="<?php echo $data['manage/database.info']['table'] ?>"/>
+      <input type="hidden" name="menu" id="menu" value="<?php echo $data['manage/database.info']['menu'] ?>"/>
+      <?php if(isset($data['manage/top.get']) && is_array($data['manage/top.get'])): ?><?php $t=count($data['manage/top.get'])-1 ?><?php $i=0 ?><?php foreach($data['manage/top.get'] as $k => $v): ?><input type="hidden" name="menu_id" id="menu_id" value="<?php echo $data['manage/database.info']['menu_id'] ?>" style="display:none"/><?php $i=$i+1 ?><?php endforeach; ?><?php else: ?><?php echo $data['manage/top.get'] ?><?php endif; ?>
+      <input type="hidden" name="search_option_state" id="search_option_state" value="<?php echo $data['manage/database.info']['state'] ?>"/>
+
+      <input type="hidden" name="function" id="function" value="msg"/>
+      <input type="hidden" name="method" id="method" value="search"/>
+      <div id="search_param"><?php echo $data['manage/database.info']['search_param'] ?></div> 
+      <iframe id="f1" name="f1" style="display:none;"></iframe>
+      <div class="layui-card-header" style="display:none;"><span id="list-name"><?php echo isset($v['name']) ? $v['name'] : "" ?></span> > <span id="list-project"><?php echo $data['manage/database.info']['project_name'] ?></span></div>
+        <div class="layui-card-body" id="search_content" style="<?php if(!(Dever::load('manage/database.list_search'))): ?>display:none;<?php endif; ?>">
+
+          <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+            <div class="layui-form-item">
+              <div id="search"><?php echo $data['manage/database.list_search'] ?></div>
+            </div>
+          </div>
+        </div>
+      <div class="layui-card-body">
+        <div style="padding-bottom: 10px;">
+          <a class="layui-btn layuiadmin-btn-list" data-type="add" id="list-parent" style="<?php echo $data['manage/database.info']['parent_state'] ?>" href="<?php echo $data['manage/database.info']['parent'] ?>">返回上一页</a>
+
+          <a class="layui-btn layuiadmin-btn-list" data-type="add" id="list-add" href="<?php echo $data['manage/database.info']['add'] ?>" style="<?php echo $data['manage/database.info']['add_state'] ?>">新增</a>
+
+          <span id="list-button"><?php echo $data['manage/database.list_button'] ?></span>
+        </div>
+        <div id="table_1" style="<?php echo $data['manage/database.page_list_table']['s1'] ?>"><?php echo $data['manage/database.page_list_table']['content'] ?></div>
+        <div id="table_2" style="<?php echo $data['manage/database.page_list_table']['s2'] ?>"> 
+          <table class="table layui-table layui-table-body" id="table">
+          <thead id="list-thead">
+              <tr><?php if(isset($data['manage/database.list_thead']) && is_array($data['manage/database.list_thead'])): ?><?php $t=count($data['manage/database.list_thead'])-1 ?><?php $i=0 ?><?php foreach($data['manage/database.list_thead'] as $k => $v): ?><?php echo $v ?><?php $i=$i+1 ?><?php endforeach; ?><?php else: ?><?php echo $data['manage/database.list_thead'] ?><?php endif; ?></tr>
+          </thead>
+          <tbody id="list-tbody"><?php if(isset($data['manage/database.list_tbody']) && is_array($data['manage/database.list_tbody'])): ?><?php $t=count($data['manage/database.list_tbody'])-1 ?><?php $i=0 ?><?php foreach($data['manage/database.list_tbody'] as $k => $v): ?><?php echo $v ?><?php $i=$i+1 ?><?php endforeach; ?><?php else: ?><?php echo $data['manage/database.list_tbody'] ?><?php endif; ?></tbody>
+      </table>
+
+      <div id="mul"><?php echo $data['manage/database.list_mul'] ?></div>
+      <div id="page"><?php  echo Dever::page("current") ?></div>
+      <div class="dever_desc" id="desc" style="<?php if(!(Dever::load('manage/database.info#listDesc'))): ?>display:none;<?php endif; ?>"><?php echo $data['manage/database.info']['listDesc'] ?></div>
+        </div>
+      </div>
+       </div>
+        </div>
+      </form>
+      <form id="form2" name="form2" method="get" style="display: none;"></form>
+      <div id="struct" style="display:none;"></div>
+    </div>
+  </div>
+</div>
+
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/script.cmp.php' ?>
+  <script ids="list-thead">
+    config.table = {};
+    config.table.cols = [];
+  </script>
+  <script ids="list-tbody">
+    config.table.data = [];
+  </script>
+  <script>
+  layui.config({
+    base: '<?php echo Dever::config("host")->script ?>lib/layui/admin/' //静态资源所在路径
+  }).extend({
+    formSelects: 'plugin/formselects/formselects',
+    index: 'lib/index' //主入口模块
+  }).use(['index', 'contlist', 'table', 'form', 'formSelects'], function(){
+    var table = layui.table;
+    var form = layui.form; 
+    var formSelects = layui.formSelects;
+
+    /*
+    table.render({
+      elem: '#table'
+      ,page: false
+      ,limit:20
+      ,cols: config.table.cols
+      ,data: config.table.data
+    });
+    */
+
+    init();
+  });
+  </script>
+</body>
+</html>

+ 110 - 0
data/compile/saike/manage/layadmin/project/database/update.cmp.php

@@ -0,0 +1,110 @@
+<?php $data['manage/database.page_update']=Dever::load('manage/database.page_update') ?>
+<?php $data['manage/database.info']=Dever::load('manage/database.info') ?>
+<?php $data['manage/database.update']=Dever::load('manage/database.update') ?>
+<?php $data['/database.info']=Dever::load('/database.info') ?>
+<?php $data['manage/database.valid']=Dever::load('manage/database.valid') ?>
+<?php $data['manage/database.save']=Dever::load('manage/database.save') ?>
+<?php $data['manage/database.update_button']=Dever::load('manage/database.update_button') ?>
+<?php $data['/database.layui_card']=Dever::load('/database.layui_card') ?>
+<?php $data['/database.card']=Dever::load('/database.card') ?>
+<!DOCTYPE html>
+<!--power by dever--><html>
+<head>
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/head.cmp.php' ?>
+<link rel="stylesheet" href="<?php echo Dever::config("host")->script ?>lib/layui/admin/modules/plugin/formselects/formselects.css" media="all" />
+  <style>
+    .layui-input,.xm-select-parent
+    {
+      width: 50%;
+    }
+
+    textarea{
+      padding-top: 5px;
+    }
+
+    .dever-color {
+      width: 100%;
+    }
+
+    .dever_form_add_child {
+      padding:15px;
+    }
+    .dever_form_delete {
+      float: right;
+      margin-right: 10px;
+      color: red;
+    }
+    .dever_score_child {
+      margin: 15px;
+    }
+    .layui-tab-title {
+      height: 100%;
+      white-space: inherit;
+    }
+    </style>
+</head>
+<body class="theme-<?php  echo Dever::load("/auth.config#template") ?>">
+<div class="topbar">
+    <div class="banner dever-layout" style="display:none;">
+        <a target="_blank"><img src="#"></a>
+        <span>项目名称</span>
+    </div>
+</div>
+<div id="content_1" style="<?php echo $data['manage/database.page_update']['s1'] ?>"><?php echo $data['manage/database.page_update']['content'] ?></div>
+<div id="content_2" style="<?php echo $data['manage/database.page_update']['s2'] ?>">
+  <div class="layui-fluid">
+    <div style="display:none;"><span id="list-name"><?php echo $data['manage/database.info']['update_header'] ?></span> > <span id="list-project"><?php echo $data['manage/database.info']['project_name'] ?></span></div>
+    <form method="post" target="f1" class="form1" role="form" autocomplete="off" action="<?php echo $data['manage/database.info']['action'] ?>">
+    <input type="hidden" name="function" id="function" value="msg"/>
+    <input type="hidden" name="url" id="url" value="<?php echo $data['manage/database.info']['list'] ?>" />
+    <input type="hidden" name="project" id="project" value="<?php echo $data['manage/database.info']['project'] ?>" />
+    <input type="hidden" name="table" id="table" value="<?php echo $data['manage/database.info']['table'] ?>" />
+    <input type="hidden" name="update_where_id" id="update_where_id" value="<?php echo $data['manage/database.info']['id'] ?>"/>
+    <input type="hidden" name="copy_num" id="copy_num" value="0"/>
+    <iframe id="f1" name="f1" style="display:none;"></iframe>
+
+    <div class="layui-row layui-col-space15">
+      <div class="<?php echo $data['/database.card'] ?>">
+        <div class="layui-card" style="<?php if(!(Dever::load('/database.layui_card'))): ?>display:none;<?php endif; ?>">
+          <div class="layui-card-header" style="display:none;">响应式组合</div>
+          <div class="layui-card-body" id="content"><?php if(isset($data['manage/database.update']) && is_array($data['manage/database.update'])): ?><?php $t=count($data['manage/database.update'])-1 ?><?php $i=0 ?><?php foreach($data['manage/database.update'] as $k => $v): ?><?php echo $v ?><?php $i=$i+1 ?><?php endforeach; ?><?php else: ?><?php echo $data['manage/database.update'] ?><?php endif; ?></div>
+          <div class="layui-card-body">
+            <div class="layui-form-item">
+                <div id="update_button" submit="<?php  echo Dever::submit() ?>"><?php echo $data['manage/database.update_button'] ?></div>
+              </div>
+            </div>
+        </div>
+      </div>
+    </div>
+    <div id="valid"><?php echo $data['manage/database.valid'] ?></div>
+    <div id="struct" style="display:none;" save="<?php echo $data['manage/database.save'] ?>"><?php echo $data['/database.info']['struct'] ?></div>
+    </form>
+  </div>
+</div>
+
+  
+  <?php require Dever::config("base")->data . 'compile/saike/manage/layadmin/inc/script.cmp.php' ?>
+  <script id="update_script">
+  layui.config({
+    base: '<?php echo Dever::config("host")->script ?>lib/layui/admin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index', //主入口模块
+    formSelects: 'plugin/formselects/formselects'
+  }).use(['index', 'contlist', 'table', 'form', 'formSelects'], function(){
+    var table = layui.table;
+    var form = layui.form; 
+    var formSelects = layui.formSelects;
+
+    /*
+    $('select').each(function() {
+        if ($(this).attr('xm-value')) {
+          formSelects.value($(this).attr('xm-select'), $(this).attr('xm-value'));
+        }
+    });
+    */
+
+    init();
+  });
+  </script>
+</body>
+</html>

+ 1 - 0
data/readme

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

+ 4 - 0
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');

+ 140 - 0
main/database/config.php

@@ -0,0 +1,140 @@
+<?php
+
+$ios_pay = array
+(
+	1 => '关闭小程序支付',
+	2 => '开启公众号支付',
+	3 => '开启小程序支付',
+);
+
+$video = array
+(
+	1 => '显示',
+	2 => '不显示',
+);
+
+return array
+(
+	# 表名
+	'name' => 'config',
+	# 显示给用户看的名称
+	'lang' => '基本配置',
+	'order' => 1,
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '系统ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+		),
+		
+		'hr1'		=> array
+		(
+			'name' 		=> '通用设置',
+			'class'		=> '',//本项必须填写
+			'attr'		=> '',
+		),
+		
+		
+		'name'		=> array
+		(
+			'type' 		=> 'varchar-32',
+			'name' 		=> '系统名称',
+			'default' 	=> '',
+			'desc' 		=> '请输入系统名称',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+		),
+		
+		'info'		=> array
+		(
+			'type' 		=> 'text-255',
+			'name' 		=> '系统介绍',
+			'default' 	=> '',
+			'desc' 		=> '请输入系统介绍',
+			'match' 	=> 'option',
+			'update'	=> 'textarea',
+		),
+
+		'logo'		=> array
+		(
+			'type' 		=> 'varchar-150',
+			'name' 		=> 'logo图片',
+			'default' 	=> '',
+			'desc' 		=> 'logo图片',
+			'match' 	=> 'option',
+			'update'	=> 'image',
+			'key' 		=> '1',
+			'place'		=> '150',
+		),
+
+		'hr2'		=> array
+		(
+			'name' 		=> '课程相关',
+			'class'		=> '',//本项必须填写
+			'attr'		=> '',
+		),
+
+		'server'		=> array
+		(
+			'type' 		=> 'text-800',
+			'name' 		=> '上门服务介绍',
+			'default' 	=> '',
+			'desc' 		=> '上门服务介绍',
+			'match' 	=> 'option',
+			'update'	=> 'editor',
+			'key'		=> '1',
+		),
+
+		'bonus'		=> array
+		(
+			'type' 		=> 'text-800',
+			'name' 		=> '绩效规则介绍',
+			'default' 	=> '',
+			'desc' 		=> '绩效规则介绍',
+			'match' 	=> 'option',
+			'update'	=> 'editor',
+			'key'		=> '1',
+		),
+
+		'deposit'		=> array
+		(
+			'type' 		=> 'text-800',
+			'name' 		=> '押金说明',
+			'default' 	=> '',
+			'desc' 		=> '押金说明',
+			'match' 	=> 'option',
+			'update'	=> 'editor',
+			'key'		=> '1',
+		),
+
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+		),
+	),
+
+	'default' => array
+	(
+		'col' => 'name,info,cdate',
+		'value' => array
+		(
+			'"赛课系统","赛课系统",' . time(),
+		),
+	),
+
+	'manage' => array
+	(
+		# 后台管理不要列表页
+		'list' => 'update',
+	),
+);

+ 8 - 0
main/index.php

@@ -0,0 +1,8 @@
+<?php
+
+define('DEVER_APP_NAME', 'main');
+define('DEVER_APP_LANG', '基础设置');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', 98);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-tower layui-icon-component');
+include(DEVER_APP_PATH . '../boot.php');

+ 286 - 0
main/src/Content.php

@@ -0,0 +1,286 @@
+<?php
+
+namespace Main\Src;
+
+use Dever;
+use Main\Lib\Core;
+
+class Content extends Core
+{
+    public function user()
+    {
+        $user = Dever::load('passport/user')->data();
+        if ($user) {
+            $url = Dever::url('passport/login.quit');
+            $html = '<li>'.$user['email'].'</li><li><a href="'.$url.'">退出</a></li>';
+        } else {
+            $html = '<li><a href="javascript:;" onclick="login()">登录</a></li>
+                    <li><a href="javascript:;" onclick="reg()">注册</a></li>';
+        }
+
+        $config = $this->config();
+        $link = $config['email_link'];
+        $html .= '<li><a href="'.$link.'" target="_blank">企业邮箱登录</a></li>';
+
+        return $html;
+    }
+
+    # 基本配置
+    public function config()
+    {
+        return Dever::db('main/config')->one();
+    }
+
+    # 单页信息
+    public function page($key = false)
+    {
+        $key = Dever::input('key', $key);
+        $data = Dever::db('content/page')->one(array('key' => $key));
+
+        $data['link'] = Dever::url('page?key=' . $data['key'], 'main');
+        return $data;
+    }
+
+    # pdf信息
+    public function pdf()
+    {
+        $user = Dever::load('passport/user')->data();
+        if (!$user) {
+            Dever::alert('未登录');
+        }
+        $id = Dever::input('id');
+        $data = Dever::db('content/magazine')->one($id);
+        $data['view'] = 'var file = "'.$data['file'].'"';
+        return $data;
+    }
+
+    # 文章信息
+    public function view($id = false)
+    {
+        $data = array();
+        $id = Dever::input('id', $id);
+        if ($id > 0) {
+            $data = Dever::db('content/article')->one($id);
+
+            $cate = Dever::db('content/cate')->one($data['cate_id']);
+            $data['cate_name'] = $cate['name'];
+            $data['cate_link'] = Dever::url('list?cate=' . $data['cate_id'], 'main');
+
+            $author = Dever::db('content/author')->one($data['author_id']);
+            $data['author_name'] = '编辑:' . $author['name'];
+
+            $data['date'] = date('Y-m-d', $data['cdate']);
+
+            $data['share'] = 'var wbtitle = "'.$data['name'].'";var wbpic = "'.$data['pic_cover'].'";var wbappkey = "1867678939"';
+        }
+        
+        return $data;
+    }
+
+    # 栏目信息
+    public function cate($cate = false)
+    {
+        $data = array();
+        $id = Dever::input('cate', $cate);
+        if ($id > 0) {
+            $data = Dever::db('content/cate')->one($id);
+            $data['cate_link_1'] = Dever::url('list?cate=' . $data['id'], 'main');
+            $data['cate_link_2'] = Dever::url('list_text?cate=' . $data['id'], 'main');
+        }
+        
+        return $data;
+    }
+
+    # 菜单
+    public function menu()
+    {
+        $config = $this->config();
+        # 小程序去掉视频栏目
+        $cate = array();
+        //$cate['id_no'] = 2;
+        $data = Dever::db('content/cate')->getAll($cate);
+
+        if ($data) {
+            foreach ($data as $k => $v) {
+                $data[$k]['link'] = Dever::url('list?cate=' . $v['id'], 'main');
+            }
+        }
+
+        $data[-2] = array
+        (
+            'id' => -2,
+            'name' => '电子杂志',
+            'link' => Dever::url('magazine?cate=-2', 'main'),
+            'class' => '',
+        );
+
+        $data[-3] = array
+        (
+            'id' => -3,
+            'name' => '报刊订阅',
+            'link' => $config['buy_link'],
+            'class' => '',
+        );
+
+        $index = array
+        (
+            'id' => -1,
+            'name' => '首页',
+            'link' => Dever::url('home', 'main'),
+            'class' => '',
+        );
+
+        $cate = Dever::input('cate', -1);
+
+        if ($cate == -1) {
+            $index['class'] = 'active';
+        } elseif ($cate == -2) {
+            $data[-2]['class'] = 'active';
+        } else {
+            foreach ($data as $k => $v) {
+                $data[$k]['class'] = '';
+                if ($cate == $v['id']) {
+                    $data[$k]['class'] = 'active';
+                }
+            }
+        }
+        array_unshift($data, $index);
+
+
+
+        return $data;
+    }
+
+    # 焦点图
+    public function focus()
+    {
+        $cate = Dever::input('cate', -1);
+        $key = 'focus_' . $cate;
+        $name = '焦点图';
+        if ($cate > 0) {
+            $cate = Dever::db('content/cate')->one($cate);
+            if ($cate) {
+                $name = $cate['name'] . $name;
+            }
+        } else {
+            $name = '首页' . $name;
+        }
+        $data = Dever::load('push/lib/data')->get($key, $name, 6);
+        return $data;
+    }
+
+    # 获取推荐列表
+    public function getPush($data)
+    {
+        return Dever::load('push/lib/data')->get($data['key'], $data['name'], $data['num']);
+    }
+
+    # 获取广告位数据
+    public function getAd($name)
+    {
+        $info = Dever::load('push/lib/data')->getOne('ad', '广告位', 20, $name);
+        if ($info && $info['pic']) {
+            return '<a href="'.$info['link'].'" target="_blank"><img src="'.$info['pic'].'" alt="'.$info['name'].'"></a>';
+        } else {
+            return '';
+        }
+    }
+
+    # 获取首页文章列表
+    public function getList($data)
+    {
+        $where['cate_id'] = $data['cate_id'];
+        $where['limit'] = $data['num'];
+        $data = Dever::db('content/article')->getList($where);
+        if ($data) {
+            foreach ($data as $k => $v) {
+                if (isset($v['pic_index']) && $v['pic_index']) {
+                    $data[$k]['pic'] = $v['pic_index'];
+                } else {
+                    $data[$k]['pic'] = $v['pic_cover'];
+                }
+                
+                $data[$k]['link'] = $this->link($v);
+            }
+        }
+
+        return $data;
+    }
+
+    # 获取文章列表
+    public function getAll()
+    {
+        $where['cate_id'] = Dever::input('cate');
+        $data = Dever::db('content/article')->getAll($where);
+        if ($data) {
+            foreach ($data as $k => $v) {
+                $data[$k]['pic'] = $v['pic_cover'];
+                $data[$k]['link'] = $this->link($v);
+            }
+        }
+
+        return $data;
+    }
+
+    # 获取杂志列表
+    public function getMagazine()
+    {
+        $where['cate_id'] = Dever::input('cate_id', 1);
+        $data = Dever::db('content/magazine')->getAll($where);
+        $user = Dever::load('passport/user')->data();
+        if ($data) {
+            foreach ($data as $k => $v) {
+                $data[$k]['pic'] = $v['pic_cover'];
+                if ($user) {
+                    $data[$k]['link'] = Dever::url('pdf?id=' . $v['id']);
+                } else {
+                    $data[$k]['link'] = 'javascript:login()';
+                }
+            }
+        }
+
+        return $data;
+    }
+
+    # 获取杂志分类列表
+    public function getMagazineCate()
+    {
+        $data = Dever::db('content/magazine_cate')->getAll();
+        if ($data) {
+            foreach ($data as $k => $v) {
+                $data[$k]['pic'] = $v['pic_cover'];
+                $data[$k]['link'] = Dever::url('magazine_list?cate=-2&cate_id=' . $v['id']);
+            }
+        }
+
+        return $data;
+    }
+
+    # 获取文章列表
+    public function getRelation()
+    {
+        $id = Dever::input('id');
+        $info = Dever::db('content/article')->one($id);
+        $where['noid'] = $id;
+        $where['cate_id'] = $info['cate_id'];
+        $data = Dever::db('content/article')->getRelation($where);
+        if ($data) {
+            foreach ($data as $k => $v) {
+                $data[$k]['pic'] = $v['pic_cover'];
+                $data[$k]['link'] = $this->link($v);
+            }
+        }
+
+        return $data;
+    }
+
+    public function link($data)
+    {
+        if ($data['template'] == 2) {
+            $link = Dever::url('video?cate='.$data['cate_id'].'&id=' . $data['id'], 'main');
+        } else {
+            $link = Dever::url('view?cate='.$data['cate_id'].'&id=' . $data['id'], 'main');
+        }
+        return $link;
+    }
+}

+ 55 - 0
manage/config/base.php

@@ -0,0 +1,55 @@
+<?php
+
+$url = function()
+{
+	$url = Dever::input('loading') ? 'loading=1' : '';
+	$url .= Dever::input('ms') ? '&ms=' . Dever::input('ms') : '';
+
+	return $url;
+};
+
+# 一些基本配置
+$config['base'] = array
+(
+	'url' => $url(),
+
+	# 针对管理系统的配置,开启这个则每次刷新都读取admin的最新数据,测试功能
+	'getAdmin' => true,
+
+	# 开启批量更新
+	'mul_type' => 1,
+
+	# 地图配置
+	'map' => array
+	(
+		'url' => 'https://webapi.amap.com/maps?v=1.4.8&key=b51a0d5f8f977726eeaa070a30bcf3cd',
+	),
+);
+
+# 模板配置
+$config['template'] = array
+(
+	# 使用的模板 注意:定义这个之后,将会强制将本项目模板变成这个
+	'assets' => 'layadmin',
+	'template' => 'layadmin',
+
+	'replace' => array
+	(
+		'css' => '../css/',
+		'lib' => '../lib/',
+		'img' => '../img/',
+		'images' => '../images/',
+		'js' => '../js/',
+		'script' => '../script/',
+
+		# 以下的替换主要用于合并操作(host里的merge项)
+		'font' => '../fonts/',
+	),
+
+	'path' => 'html',
+	'layout' => '',
+
+	'relation' => array(),
+);
+
+return $config;

+ 7 - 0
manage/daemon/loop.php

@@ -0,0 +1,7 @@
+<?php
+
+define('DEVER_DAEMON', true);
+
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../index.php');
+
+Dever::load('manage/project.loop');

+ 7 - 0
manage/daemon/main.php

@@ -0,0 +1,7 @@
+<?php
+
+define('DEVER_DAEMON', true);
+
+include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../index.php');
+
+Dever::load('manage/project.cron');

+ 4 - 0
manage/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');

+ 3 - 0
package.json

@@ -0,0 +1,3 @@
+{
+	"rely": "manage,passport,email,pay,score,area,upload,invite"
+}

+ 4 - 0
passport/index.php

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

+ 4 - 0
pay/index.php

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

+ 268 - 0
push/database/data.php

@@ -0,0 +1,268 @@
+<?php
+
+# 定义几个常用的选项
+$option = array
+(
+    1 => '显示',
+    2 => '不显示',
+);
+
+$type = Dever::config('base')->type;
+$type[10] = '链接';
+
+
+$list = function()
+{
+    return Dever::db('push/info')->state();
+};
+$info = Dever::input('search_option_info_id');
+$type_default = 1;
+if ($info) {
+    $info = Dever::load('push/info-one', $info);
+
+    if (!$info) {
+        echo 'error';die;
+    }
+    $function = explode(',', $info['function']);
+    
+    foreach ($type as $k => $v) {
+        if (!in_array($k, $function)) {
+            unset($type[$k]);
+        } else {
+            $type_default = $k;
+        }
+    }
+    $info['name'] .= '下的推送数据管理';
+    $info['col'] = explode(',', $info['col']);
+    /*
+    $preview = $info['preview'];
+    $preview_height = $info['preview_height'] ? $info['preview_height'] : 500;
+    */
+
+    $name_state = in_array(1, $info['col']);
+    $link_state = in_array(2, $info['col']);
+    $pic_state = in_array(3, $info['col']);
+    $content_state = in_array(4, $info['col']);
+    $share_pic_state = in_array(5, $info['col']);
+
+    /*
+    if ($info['data_type']) {
+        $type = explode("\r\n", $info['data_type']);
+    }
+    */
+} else {
+    $info = array();
+    $info['name'] = '推送数据管理';
+    $info['col_pic'] = '100X100';
+    $info['col_share_pic'] = '100X100';
+    $info['col_content'] = '30';
+    $info['type'] = 1;
+    $name_state = true;
+    $link_state = false;
+    $pic_state = false;
+    $share_pic_state = false;
+    $content_state = false;
+    $preview = '';
+    $preview_height = 0;
+}
+
+
+return array
+(
+    # 表名
+    'name' => 'data',
+    # 显示给用户看的名称
+    'lang' => $info['name'],
+    'order' => 20,
+    //'menu' => false,
+
+    //'desc' => '预览地址:<br /><iframe id="preview" height="'.$preview_height.'" width="100%"  frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="yes" src="'.$preview.'" ></iframe>',
+
+    # 数据结构
+    'struct' => array
+    (
+        'id'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => 'ID',
+            'default'   => '',
+            'desc'      => '',
+            'match'     => 'is_numeric',
+            //'search'  => 'order',
+            'order'     => 'desc',
+            //'list'        => true,
+        ),
+
+        'info_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '选择推送位',
+            'default'   => Dever::input('search_option_info_id', '1'),
+            'desc'      => '推送位',
+            'match'     => 'is_numeric',
+            'search'    => 'select',
+            'update'    => 'hidden',
+            'option'    => $list,
+            'list'      => true,
+            'value'     => Dever::input('search_option_info_id', '1'),
+        ),
+
+        'type'      => array
+        (
+            'type'      => 'int-11',
+            'name'      => '类型',
+            'default'   => ''.$type_default.'',
+            'desc'      => '请选择类型',
+            'match'     => 'is_numeric',
+            'update'    => 'radio',
+            'search'    => 'select',
+            'option'    => $type,
+            'control'   => 'type',
+        ),
+
+        'article_id'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '关联文章-如不选择,则点击进入文章列表',
+            'default'   => '',
+            'desc'      => '关联文章',
+            'match'     => 'option',
+            'update'    => 'select',
+            'show'      => 'type=1',
+            'update_search' => 'content/lib/manage.search_article',
+        ),
+
+        'olink'      => array
+        (
+            'type'      => 'varchar-400',
+            'name'      => '链接',
+            'default'   => '',
+            'desc'      => '请输入链接',
+            'match'     => 'option',
+            'update'    => 'text',
+            'show'      => 'type=10',
+            //'search'    => 'fulltext',
+            //'list'        => true,
+        ),
+        
+        'name'      => array
+        (
+            'type'      => 'varchar-60',
+            'name'      => '标题-手动干扰项,如想修改当前推送位的标题请在此修改',
+            'default'   => '',
+            'desc'      => '请输入标题',
+            'match'     => $name_state ? 'option' : 'option',
+            'update'    => $name_state ? 'text' : 'hidden',
+            'search'    => $name_state ? 'fulltext' : '',
+            'list'      => $name_state ? 'Dever::load("push/lib/manage.name", {id})' : false,
+            'edit'      => $name_state ? true : false,
+        ),
+
+        'link'      => array
+        (
+            'type'      => 'varchar-200',
+            'name'      => '链接-手动干扰项,如想修改当前推送位的链接请在此修改',
+            'default'   => '',
+            'desc'      => '请输入链接',
+            'match'     => $link_state ? 'option' : 'option',
+            //'update'    => $link_state ? 'text' : 'hidden',
+            //'search'    => $link_state ? 'fulltext' : '',
+            //'list'        => $link_state ? true : false,
+            //'edit'      => $link_state ? true : false,
+        ),
+
+        'pic'       => array
+        (
+            'type'      => 'varchar-200',
+            'name'      => '图片或图标-手动干扰项,请上传' . $info['col_pic'] . '大小的图片',
+            'default'   => '',
+            'desc'      => '请选择图片',
+            'match'     => $pic_state ? 'option' : 'option',
+            'update'    => $pic_state ? 'image' : 'hidden',
+            'search'    => $pic_state ? 'fulltext' : '',
+            //'list'        => $pic_state ? true : false,
+            'key'       => 1
+        ),
+
+        'content'       => array
+        (
+            'type'      => 'text-255',
+            'name'      => '描述-手动干扰项,字数请不要超过' . $info['col_content'] . '个汉字,前台展示时会自动过滤',
+            'default'   => '',
+            'desc'      => '请输入描述',
+            'match'     => $content_state ? 'option' : 'option',
+            //'update'    => $content_state ? 'editor' : 'hidden',
+        ),
+        
+        'reorder'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '排序(数值越大越靠前)',
+            'default'   => '1',
+            'desc'      => '请输入排序',
+            'match'     => 'option',
+            'update'    => 'text',
+            'search'    => 'order',
+            'list_name' => '排序',
+            'list'      => true,
+            'order'     => 'desc',
+            'edit'      => true,
+        ),
+
+        'state'     => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '状态',
+            'default'   => '1',
+            'desc'      => '请选择状态',
+            'match'     => 'is_numeric',
+        ),
+        
+        'cdate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '录入时间',
+            'match'     => array('is_numeric', time()),
+            'desc'      => '',
+            # 只有insert时才生效
+            'insert'    => true,
+            'list'      => 'date("Y-m-d H:i:s", {cdate})',
+        ),
+    ),
+
+    # request 请求接口定义
+    'request' => array
+    (
+        # 获取列表页
+        'getAll' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'info_id' => 'yes',
+                'type_no' => array('yes-type', '!='),
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('reorder' => 'desc', 'id' => 'desc'),
+            'limit' => '0,10',
+            'col' => 'name,pic,olink as link,type,article_id,cdate',
+        ),
+
+        # 获取列表页 带有分页的
+        'getAllPage' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'info_id' => 'yes',
+                'type_no' => array('yes-type', '!='),
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('reorder' => 'desc', 'id' => 'desc'),
+            'page' => array(10, 'list'),
+            'col' => 'name,pic,olink as link,type,article_id,cdate',
+        ),
+    ),
+);

+ 302 - 0
push/database/info.php

@@ -0,0 +1,302 @@
+<?php
+
+$type = array
+(
+    1 => '手动输入',
+);
+
+$function = Dever::config('base')->type;
+$function[10] = '链接';
+
+$col = array
+(
+    1 => '标题',
+    //2 => '链接',
+    3 => '图片',
+    //4 => '描述',
+);
+
+return array
+(
+    # 表名
+    'name' => 'info',
+    # 显示给用户看的名称
+    'lang' => '推送位管理',
+    'order' => 10,
+    'check' => 'key',
+    # 数据结构
+    'struct' => array
+    (
+        'id'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => '推送位ID',
+            'default'   => '',
+            'desc'      => '',
+            'match'     => 'is_numeric',
+            //'search'  => 'order',
+            'order'     => 'desc',
+            //'list'        => true,
+        ),
+        
+        'name'      => array
+        (
+            'type'      => 'varchar-60',
+            'name'      => '推送位标题',
+            'default'   => '',
+            'desc'      => '请输入推送位标题',
+            'match'     => 'is_string',
+            'update'    => 'text',
+            'search'    => 'fulltext',
+            'list'      => true,
+            'edit'      => true,
+        ),
+
+        'key'       => array
+        (
+            'type'      => 'varchar-60',
+            'name'      => '推送位标识',
+            'default'   => '',
+            'desc'      => '推送位标识',
+            'match'     => 'is_string',
+            'update'    => Dever::input('where_id') ? 'hidden' : 'text',
+            'search'    => 'fulltext',
+            'list'      => true,
+            //'auth'      => '!{key}'
+        ),
+
+        'num'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '数据显示条数-为空或小于0则取默认值20,只对前台有效,当有分页时,则为每页显示的条数',
+            'default'   => '20',
+            'desc'      => '数据显示条数',
+            'match'     => 'is_numeric',
+            'update'    => 'text',
+            'list'      => true,
+            'edit'      => true,
+        ),
+
+        'type'      => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '推送位类型',
+            'default'   => '1',
+            'desc'      => '请选择推送位类型',
+            'match'     => 'is_numeric',
+            'option'    => $type,
+            'update'    => 'radio',
+            'search'    => 'select',
+            //'list'        => true,
+            'control'       => 'type',
+        ),
+
+        /*
+        'data_type'     => array
+        (
+            'type'      => 'varchar-50',
+            'name'      => '数据类型定义-多个用换行隔开,必须有一个值,主要用于该推送位有多种不同类型的值',
+            'default'   => '默认类型',
+            'desc'      => '请选择推送位类型',
+            'match'     => 'is_string',
+            //'update'  => 'textarea',
+            //'show'        => array('type_1'),
+        ),
+
+        'code'      => array
+        (
+            'type'      => 'varchar-500',
+            'name'      => '自定义内容',
+            'default'   => '',
+            'desc'      => '请输入自定义内容',
+            'match'     => 'is_string',
+            'update'    => 'textarea',
+            'show'      => 'type=4,5,6',
+        ),
+
+        'sql_method'        => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '选择sql执行之后的方法',
+            'default'   => '1',
+            'desc'      => '选择sql执行之后的方法',
+            'match'     => 'is_numeric',
+            'update'    => 'radio',
+            'option'    => $sqlMethod,
+            'show'      => 'type=5',
+        ),
+
+        'define'        => array
+        (
+            'type'      => 'varchar-100',
+            'name'      => '选择预定义方法',
+            'default'   => '',
+            'desc'      => '请选择预定义方法',
+            'match'     => 'is_string',
+            'update'    => 'select',
+            'option'    => $define,
+            'show'      => 'type=3'
+        ),
+        */
+
+        'function'       => array
+        (
+            'type'      => 'varchar-30',
+            'name'      => '启用的功能',
+            'default'   => '1,10',
+            'desc'      => '启用的功能',
+            'match'     => 'is_string',
+            'option'    => $function,
+            'update'    => 'checkbox',
+            'show'      => 'type=1',
+        ),
+
+        'col'       => array
+        (
+            'type'      => 'varchar-30',
+            'name'      => '启用的字段',
+            'default'   => '1',
+            'desc'      => '请选择启用的字段',
+            'match'     => 'is_string',
+            'option'    => $col,
+            'update'    => 'checkbox',
+            'show'      => 'type=1',
+            'control'   => 'col',
+        ),
+
+        'col_pic'       => array
+        (
+            'type'      => 'varchar-20',
+            'name'      => '图片尺寸提醒-请直接输入提醒的文字即可,如100X100',
+            'default'   => '100X100',
+            'desc'      => '图片尺寸提醒',
+            'match'     => 'is_string',
+            'update'    => 'text',
+            'show'      => 'col=3',
+        ),
+
+        'col_content'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '内容长度限制-必须是数字',
+            'default'   => '30',
+            'desc'      => '内容长度限制',
+            'match'     => 'is_numeric',
+            'update'    => 'text',
+            'show'      => 'col=4',
+        ),
+
+        /*
+        'relate_id'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '请输入推送位id',
+            'default'   => '',
+            'desc'      => '请输入推送位id',
+            'match'     => 'is_numeric',
+            'update'    => 'text',
+            'show'      => 'type=2',
+        ),
+
+        'preview'       => array
+        (
+            'type'      => 'varchar-200',
+            'name'      => '推送位预览地址',
+            'default'   => '',
+            'desc'      => '推送位预览地址',
+            'match'     => 'option',
+            'update'    => 'text',
+        ),
+
+        'preview_height'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => '推送位预览的高度',
+            'default'   => '500',
+            'desc'      => '推送位预览的高度',
+            'match'     => 'option',
+            'update'    => 'text',
+        ),
+        */
+        
+        'reorder'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '排序(数值越大越靠前)',
+            'default'   => '1',
+            'desc'      => '请输入排序',
+            'match'     => 'option',
+            'update'    => 'text',
+            'search'    => 'order',
+            'list_name' => '排序',
+            'list'      => true,
+            'order'     => 'desc',
+            //'edit'        => true,
+        ),
+
+        'state'     => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '状态',
+            'default'   => '1',
+            'desc'      => '请选择状态',
+            'match'     => 'is_numeric',
+        ),
+        
+        'cdate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '录入时间',
+            'match'     => array('is_numeric', time()),
+            'desc'      => '',
+            # 只有insert时才生效
+            'insert'    => true,
+            'list'      => 'date("Y-m-d H:i:s", {cdate})',
+        ),
+    ),
+
+    # 权限精细控制 加入到该项目的详细权限中,注意与top的不同
+    /*
+    'auth' => array
+    (
+        # 数据来源
+        'data' => 'all',
+        # 所属项目
+        'project' => 'module',
+        # 项目名称
+        'project_name' => '推送位管理',
+    ),
+    */
+
+    'manage' => array
+    (
+        'delete' => false,
+        //'edit' => false,
+        //'insert' => $curPage ? true : false,
+        'list_button' => array
+        (
+            'add' => array('新增数据', '"data&search_option_info_id={id}&oper_parent=info"', '{type} == 1'),
+
+            'list' => array('数据列表', '"data&search_option_info_id={id}&oper_parent=info"'),
+        ),
+    ),
+
+    # request 请求接口定义
+    'request' => array
+    (
+        # 获取列表页
+        'getAll' => array
+        (
+            # 匹配的正则或函数 选填项
+            'option' => array
+            (
+                'type' => 'yes',
+                //'page_id' => 'yes',
+                'state' => 1,
+            ),
+            'type' => 'all',
+            'order' => array('reorder' => 'desc'),
+            'col' => '*',
+        ),
+    ),
+);

+ 8 - 0
push/index.php

@@ -0,0 +1,8 @@
+<?php
+
+define('DEVER_APP_NAME', 'push');
+define('DEVER_APP_LANG', '推送管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', 199);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-tower layui-icon-template-1');
+include(DEVER_APP_PATH . '../boot.php');

+ 144 - 0
push/lib/Data.php

@@ -0,0 +1,144 @@
+<?php
+
+namespace Push\Lib;
+
+use Dever;
+
+class Data
+{
+    public function get($key, $name, $total = 10, $page = false, $limit = false)
+    {
+        $info = $this->getInfo($key, $name, $total);
+
+        $data = array();
+        if ($info) {
+            if (!$info['num']) {
+                $info['num'] = 20;
+            }
+            if ($limit > 0) {
+                $info['num'] = $limit;
+            }
+
+            $where = array();
+            $where['info_id'] = $info['id'];
+
+            if ($page) {
+                $where['page'] = array($info['num'], 'list');
+                $data = Dever::db('push/data')->getAllPage($where);
+            } else {
+                $where['limit'] = '0,' . $info['num'];
+                $data = Dever::db('push/data')->getAll($where);
+            }
+
+            if ($data) {
+                foreach ($data as $k => $v) {
+                    $data[$k] = $this->getData($v);
+                }
+            }
+        }
+
+        return $data;
+    }
+
+    public function getOne($key, $name, $total = 10, $data_name)
+    {
+        $info = $this->getInfo($key, $name, $total);
+        $data = array();
+        if ($info) {
+            $where = array();
+            $where['info_id'] = $info['id'];
+            $where['name'] = $data_name;
+            $data = Dever::db('push/data')->one($where);
+            if ($data) {
+                $data = $this->getData($data);
+            } else {
+                $where['type'] = 10;
+                Dever::db('push/data')->insert($where);
+            }
+        }
+
+        return $data;
+    }
+
+    private function getInfo($key, $name, $total)
+    {
+        $info = Dever::db('push/info')->one(array('key' => $key));
+
+        if (!$info) {
+            $insert['key'] = $key;
+            $insert['name'] = $name;
+            $insert['num'] = $total;
+            $insert['col'] = '1,3';
+            $info['id'] = Dever::db('push/info')->insert($insert);
+            $info['num'] = $insert['num'];
+        }
+
+        return $info;
+    }
+
+    private function getData($info)
+    {
+        $info['id'] = 0;
+        if ($info['type'] < 10 || $info['type'] == 13) {
+            $table = Dever::config('base')->type_table[$info['type']];
+            $method = 'one';
+            if ($info['type'] == 1) {
+                $id = $info['article_id'];
+            }
+
+            unset($info['article_id']);
+            if ($id > 0) {
+                $info['id'] = $id;
+                $data = Dever::db($table)->$method($id);
+                if (isset($data) && $data) {
+                    if (isset($data['name']) && $data['name'] && !$info['name']) {
+                        $info['name'] = $data['name'];
+                    }
+
+                    if (isset($data['pic_cover']) && $data['pic_cover'] && !$info['pic']) {
+                        $info['pic'] = $data['pic_cover'];
+                    }
+
+                    if (isset($data['pdate']) && $data['pdate']) {
+                        $info['cdate'] = $data['pdate'];
+                    }
+
+                    if (isset($data['cate_id']) && $data['cate_id']) {
+                        $cate = Dever::db('content/cate')->one($data['cate_id']);
+                        $info['cate_name'] = $cate['name'];
+                    }
+
+                    if (isset($data['author_id']) && $data['author_id']) {
+                        $author = Dever::db('content/author')->one($data['author_id']);
+                        $info['author_name'] = $author['name'];
+                    }
+
+                    $info['link'] = Dever::load('main/content')->link($data);
+
+                    if (isset($data['template']) && $data['template'] == 2) {
+                        $info['name'] = '<i class="ico-video"></i>' . $info['name'];
+                    }
+                }
+            }
+        } else {
+            unset($info['article_id']);
+            if (isset($info['olink']) && $info['olink']) {
+                $info['link'] = $info['olink'];
+            }
+        }
+
+        if ($info['link']) {
+            if (!strstr($info['link'], 'http')) {
+                $info['link'] = 'http://' . $info['link'];
+            }
+        }
+
+        $info['cdate'] = date('Y-m-d', $info['cdate']);
+
+        if (isset($info['name']) && $info['name']) {
+            $info['name'] = Dever::cut($info['name'], 20, '...');
+        }
+
+        return $info;
+    }
+}

+ 52 - 0
push/lib/Manage.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace Push\Lib;
+
+use Dever;
+
+class Manage
+{
+    //{source_id} > 0 ? ("{name}" ? "{name}" : Dever::load("sad/supply-one#name", {source_id})) : "{name}"
+    public function name($id)
+    {
+        $info = Dever::db('push/data')->one($id);
+
+        if ($info['name']) {
+            return $info['name'];
+        }
+
+        if ($info['type'] < 10) {
+            $table = Dever::config('base')->type_table[$info['type']];
+            $audit = array
+            (
+                //'audit' => 2,
+                //'status' => 2,
+                'state' => 1,
+            );
+            if ($info['type'] == 1) {
+                $audit['id'] = $info['article_id'];
+                $data = Dever::db($table)->one($audit);
+            } elseif ($info['type'] == 2) {
+                $audit['id'] = $info['vod_id'];
+                $data = Dever::db($table)->one($audit);
+            } elseif ($info['type'] == 3) {
+                $audit['id'] = $info['live_id'];
+                $data = Dever::db($table)->one($audit);
+            } elseif ($info['type'] == 4) {
+                $audit['id'] = $info['journal_id'];
+                $data = Dever::db($table)->one($audit);
+            } elseif ($info['type'] == 6) {
+                $audit['id'] = $info['feature_id'];
+                $data = Dever::db($table)->one($audit);
+            } elseif ($info['type'] == 7) {
+                $data = Dever::db($table)->one(array('state' => 1, 'id' => $info['applet_id']));
+            }
+
+            if (isset($data) && $data && isset($data['name'])) {
+                return $data['name'];
+            }
+        }
+
+        return $info['name'];
+    }
+}

+ 4 - 0
score/index.php

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

+ 64 - 0
seller/database/area.php

@@ -0,0 +1,64 @@
+<?php
+return array
+(
+	# 表名
+	'name' => 'area',
+	# 显示给用户看的名称
+	'lang' => '销售地域关联表',
+	'menu' => false,
+
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			//'list'		=> true,
+		),
+		
+		'seller_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '销售ID',
+			'default' 	=> '',
+			'desc' 		=> '销售ID',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'area_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '地域ID',
+			'default' 	=> '',
+			'desc' 		=> '地域ID',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', DEVER_TIME),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	'manage' => array
+	(
+		'delete' => false,
+		'edit' => false,
+		'insert' => false,
+	),
+);

+ 189 - 0
seller/database/info.php

@@ -0,0 +1,189 @@
+<?php
+
+$sex = array
+(
+	1 => '男',
+	2 => '女',
+	3 => '未知',
+);
+
+return array
+(
+	# 表名
+	'name' => 'seller',
+	# 显示给用户看的名称
+	'lang' => '销售人列表',
+	'order' => 100,
+
+	# 同步更新另外一个或多个表的数据
+	'sync' => array
+	(
+		'seller/area' => array
+		(
+			# 更新另外一个表的字段 => 本表的字段
+			'where' => array('seller_id', 'id'),
+			# 要更新的数据
+			'update' => array('area_id' => 'area'),
+			# 同步更新的类型,delete为先删再插入,update为直接更新
+			'type' => 'delete',
+		),
+	),
+
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'list'		=> true,
+		),
+		
+		'name'		=> array
+		(
+			'type' 		=> 'varchar-80',
+			'name' 		=> '销售人名称',
+			'default' 	=> '',
+			'desc' 		=> '销售人名称',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+			'search'	=> 'fulltext',
+			//增加预览
+			'preview'	=> true,
+		),
+
+		'mobile'		=> array
+		(
+			'type' 		=> 'varchar-15',
+			'name' 		=> '销售人手机号',
+			'default' 	=> '',
+			'desc' 		=> '销售人手机号',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+			'search'	=> 'fulltext',
+		),
+
+		'desc'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '销售人介绍-销售人介绍',
+			'default' 	=> '',
+			'desc' 		=> '销售人介绍',
+			'match' 	=> 'is_string',
+			'update'	=> 'textarea',
+		),
+
+  		'avatar'		=> array
+		(
+			'type' 		=> 'varchar-150',
+			'name' 		=> '销售人头像-图片尺寸200*200px或等比尺寸,上传大小不能超过2M,支持JPG、PNG、GIF格式,建议上传JPG格式',
+			'default' 	=> '',
+			'desc' 		=> '销售人头像',
+			'match' 	=> 'is_string',
+			'update'	=> 'image',
+			'key' 		=> '1',
+			'place'		=> '150',
+		),
+
+		'sex'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '性别',
+			'default' 	=> '3',
+			'desc' 		=> '性别',
+			'match' 	=> 'is_numeric',
+			'option' 	=> $sex,
+			'update'	=> 'radio',
+			//'list'		=> true,
+		),
+
+		'area'		=> array
+		(
+			'type' 		=> 'varchar-100',
+			'name' 		=> '地区',
+			'default' 	=> '',
+			'desc' 		=> '地区',
+			'match' 	=> 'is_string',
+			'search'	=> 'linkage',
+			'update'	=> 'linkage',//多级联动 option参数:请求地址(参数为level_num当前联动级数,level_id当前选择的id)
+			'option'	=> Dever::url('api.get', 'area'),
+			'list'		=> 'Dever::load("area/api.string", "{area}")',
+		),
+
+		'address'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '详细地址',
+			'default' 	=> '',
+			'desc' 		=> '详细地址',
+			'match' 	=> 'option',
+			'update'	=> 'text',
+			//'search'	=> 'fulltext',
+			// 'list'		=> true,	
+		),
+
+		'map'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '坐标位置',
+			'default' 	=> '',
+			'desc' 		=> '坐标位置',
+			'match' 	=> 'option',
+			//'update'	=> 'map',
+			//'search'	=> 'fulltext',
+			// 'list'		=> true,	
+		),
+
+		'reorder'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '排序(数值越大越靠前)',
+			'default' 	=> '1',
+			'desc' 		=> '请输入排序',
+			'match' 	=> 'option',
+			'update'	=> 'text',
+			'search'	=> 'order',
+			'list'		=> true,
+			'order'		=> 'desc',
+			'edit'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+
+
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+		),
+	),
+
+	
+	# 管理功能
+	'manage' => array
+	(
+		
+	),
+
+	# request 请求接口定义
+	'request' => array
+	(
+		
+	),
+);

+ 8 - 0
seller/index.php

@@ -0,0 +1,8 @@
+<?php
+
+define('DEVER_APP_NAME', 'seller');
+define('DEVER_APP_LANG', '销售管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', 198);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-tower layui-icon-website');
+include(DEVER_APP_PATH . '../boot.php');

+ 64 - 0
teacher/database/area.php

@@ -0,0 +1,64 @@
+<?php
+return array
+(
+	# 表名
+	'name' => 'area',
+	# 显示给用户看的名称
+	'lang' => '讲师地域关联表',
+	'menu' => false,
+
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'search'	=> 'order',
+			//'list'		=> true,
+		),
+		
+		'teacher_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '讲师ID',
+			'default' 	=> '',
+			'desc' 		=> '讲师ID',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+
+		'area_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '地域ID',
+			'default' 	=> '',
+			'desc' 		=> '地域ID',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'text',
+			'list'		=> true,
+		),
+		
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', DEVER_TIME),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+			'list'		=> 'date("Y-m-d H:i:s", {cdate})',
+		),
+	),
+
+	'manage' => array
+	(
+		'delete' => false,
+		'edit' => false,
+		'insert' => false,
+	),
+);

+ 129 - 0
teacher/database/course.php

@@ -0,0 +1,129 @@
+<?php
+
+$course = function()
+{
+    return Dever::db('course/info')->state();
+};
+
+$teacher = function()
+{
+    return Dever::db('teacher/info')->state();
+};
+
+$code = function()
+{
+    return Dever::db('code/info')->state();
+};
+
+$status = array
+(
+	1 => '认证中',
+	2 => '已认证',
+	3 => '认证失败',
+);
+
+return array
+(
+	# 表名
+	'name' => 'course',
+	# 显示给用户看的名称
+	'lang' => '讲师认证课程',
+	'order' => 90,
+
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'list'		=> true,
+		),
+		
+		'teacher_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '讲师名称',
+			'default' 	=> '',
+			'desc' 		=> '讲师名称',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'select',
+			'option'	=> $teacher,
+			'list'		=> true,
+			'search'	=> 'select',
+		),
+
+		'course_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '课程名称',
+			'default' 	=> '',
+			'desc' 		=> '课程名称',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'select',
+			'option'	=> $course,
+			'list'		=> true,
+			'search'	=> 'select',
+		),
+
+		'code_id'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '认证码',
+			'default' 	=> '',
+			'desc' 		=> '认证码',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'select',
+			'option'	=> $code,
+			'list'		=> true,
+		),
+
+		'status'		=> array
+		(
+			'type' 		=> 'tinyint-11',
+			'name' 		=> '认证状态',
+			'default' 	=> '',
+			'desc' 		=> '认证状态',
+			'match' 	=> 'is_numeric',
+			'update'	=> 'radio',
+			'option'	=> $status,
+			'search'	=> 'select',
+			'list'		=> true,
+			'edit'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+		),
+	),
+	
+	# 管理功能
+	'manage' => array
+	(
+		
+	),
+
+	# request 请求接口定义
+	'request' => array
+	(
+		
+	),
+);

+ 187 - 0
teacher/database/info.php

@@ -0,0 +1,187 @@
+<?php
+
+$sex = array
+(
+	1 => '男',
+	2 => '女',
+	3 => '未知',
+);
+
+return array
+(
+	# 表名
+	'name' => 'teacher',
+	# 显示给用户看的名称
+	'lang' => '讲师列表',
+	'order' => 100,
+
+	# 同步更新另外一个或多个表的数据
+	'sync' => array
+	(
+		'teacher/area' => array
+		(
+			# 更新另外一个表的字段 => 本表的字段
+			'where' => array('teacher_id', 'id'),
+			# 要更新的数据
+			'update' => array('area_id' => 'area'),
+			# 同步更新的类型,delete为先删再插入,update为直接更新
+			'type' => 'delete',
+		),
+	),
+
+	# 数据结构
+	'struct' => array
+	(
+		'id' 		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> 'ID',
+			'default' 	=> '',
+			'desc' 		=> '',
+			'match' 	=> 'is_numeric',
+			'list'		=> true,
+		),
+		
+		'name'		=> array
+		(
+			'type' 		=> 'varchar-80',
+			'name' 		=> '讲师名称',
+			'default' 	=> '',
+			'desc' 		=> '讲师名称',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+			'search'	=> 'fulltext',
+			//增加预览
+			'preview'	=> true,
+		),
+
+		'mobile'		=> array
+		(
+			'type' 		=> 'varchar-15',
+			'name' 		=> '讲师手机号',
+			'default' 	=> '',
+			'desc' 		=> '讲师手机号',
+			'match' 	=> 'is_string',
+			'update'	=> 'text',
+			'list'		=> true,
+			'search'	=> 'fulltext',
+		),
+
+		'desc'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '讲师介绍-讲师介绍',
+			'default' 	=> '',
+			'desc' 		=> '讲师介绍',
+			'match' 	=> 'is_string',
+			'update'	=> 'textarea',
+		),
+
+  		'avatar'		=> array
+		(
+			'type' 		=> 'varchar-150',
+			'name' 		=> '讲师头像-图片尺寸200*200px或等比尺寸,上传大小不能超过2M,支持JPG、PNG、GIF格式,建议上传JPG格式',
+			'default' 	=> '',
+			'desc' 		=> '讲师头像',
+			'match' 	=> 'is_string',
+			'update'	=> 'image',
+			'key' 		=> '1',
+			'place'		=> '150',
+		),
+
+		'sex'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '性别',
+			'default' 	=> '3',
+			'desc' 		=> '性别',
+			'match' 	=> 'is_numeric',
+			'option' 	=> $sex,
+			'update'	=> 'radio',
+			//'list'		=> true,
+		),
+
+		'area'		=> array
+		(
+			'type' 		=> 'varchar-100',
+			'name' 		=> '地区',
+			'default' 	=> '',
+			'desc' 		=> '地区',
+			'match' 	=> 'is_string',
+			'search'	=> 'linkage',
+			'update'	=> 'linkage',//多级联动 option参数:请求地址(参数为level_num当前联动级数,level_id当前选择的id)
+			'option'	=> Dever::url('api.get', 'area'),
+			'list'		=> 'Dever::load("area/api.string", "{area}")',
+		),
+
+		'address'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '详细地址',
+			'default' 	=> '',
+			'desc' 		=> '详细地址',
+			'match' 	=> 'option',
+			'update'	=> 'text',
+			//'search'	=> 'fulltext',
+			// 'list'		=> true,	
+		),
+
+		'map'		=> array
+		(
+			'type' 		=> 'varchar-500',
+			'name' 		=> '坐标位置',
+			'default' 	=> '',
+			'desc' 		=> '坐标位置',
+			'match' 	=> 'option',
+			//'update'	=> 'map',
+			//'search'	=> 'fulltext',
+			// 'list'		=> true,	
+		),
+
+		'reorder'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '排序(数值越大越靠前)',
+			'default' 	=> '1',
+			'desc' 		=> '请输入排序',
+			'match' 	=> 'option',
+			'update'	=> 'text',
+			'search'	=> 'order',
+			'list'		=> true,
+			'order'		=> 'desc',
+			'edit'		=> true,
+		),
+
+		'state'		=> array
+		(
+			'type' 		=> 'tinyint-1',
+			'name' 		=> '状态',
+			'default' 	=> '1',
+			'desc' 		=> '请选择状态',
+			'match' 	=> 'is_numeric',
+		),
+
+		'cdate'		=> array
+		(
+			'type' 		=> 'int-11',
+			'name' 		=> '录入时间',
+			'match' 	=> array('is_numeric', time()),
+			'desc' 		=> '',
+			# 只有insert时才生效
+			'insert'	=> true,
+		),
+	),
+	
+	# 管理功能
+	'manage' => array
+	(
+		
+	),
+
+	# request 请求接口定义
+	'request' => array
+	(
+		
+	),
+);

+ 8 - 0
teacher/index.php

@@ -0,0 +1,8 @@
+<?php
+
+define('DEVER_APP_NAME', 'teacher');
+define('DEVER_APP_LANG', '讲师管理');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+define('DEVER_MANAGE_ORDER', 199);
+define('DEVER_MANAGE_ICON', 'glyphicon glyphicon-tower layui-icon-read');
+include(DEVER_APP_PATH . '../boot.php');

+ 4 - 0
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');