* rm ai funcs from open edition.

This commit is contained in:
dingyongliang
2024-02-19 14:35:41 +08:00
parent 43943b4f26
commit 45e50c155e
9 changed files with 26 additions and 975 deletions
+12 -12
View File
@@ -15950,18 +15950,18 @@ CREATE TABLE IF NOT EXISTS `zt_miniprogram` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `zt_miniprogram` (`id`, `name`, `category`, `desc`, `model`, `icon`, `createdBy`, `createdDate`, `editedBy`, `editedDate`, `published`, `publishedDate`, `deleted`, `prompt`, `builtIn`) VALUES
(1, '职业发展导航', 'personal', '职业发展导航是一个旨在帮助用户规划和实现职业目标的AI小程序,为用户提供个性化的建议。', 'openai-gpt35', 'technologist-6', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '请帮我生成一份职业发展导航,我的教育背景为 <教育背景> ,职位信息为 <职位信息> ,工作经验描述如下: <工作经验> ,掌握的技能为 <掌握的技能> ,为了实现 <职业目标> ,我想做一个 <规划时长> 的计划,我有更多感兴趣的领域为 <更多感兴趣的领域> ,有更多补充内容 <补充信息> ,来追求相关机会和进一步发展,控制在30字以内。', '1'),
(2, '工作汇报', 'work', '旨在帮助您轻松撰写和管理您的工作汇报。无论是每周、每月还是季度性的报告,我们提供了一个简单而高效的平台,让您能够清晰、有条理地记录和展示您的工作成果。', 'openai-gpt35', 'technologist-2', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '我的基本信息如下: <身份描述> ,请根据我的工作情况生成一份工作汇报,需要包含 <汇报内容维度> ,汇报对象描述为 <汇报对象> ,另外还需要补充 <补充信息> 。下面是我的工作内容基本描述: <工作内容描述> ,控制在30字以内。', '1'),
(3, '市场分析报告', 'work', '市场分析报告小程序是一个旨在帮助用户根据互联网信息快速生成市场分析报告的AI小程序。', 'openai-gpt35', 'chart-6', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '请帮我生成一份市场分析报告,我目标市场是 <目标市场> ,市场概况为 <市场概况> ,该领域的细分市场有 <细分市场> ,同时我希望能针对 <竞品名称> 展开竞品分析,竞品分析的维度是 <竞品分析维度> ,来帮助我快速的了解市场。', '1'),
(4, '健身计划', 'life', '健身计划小程序旨在帮助您制定和管理个性化的健身计划,让您更轻松、高效地实现健康和体能目标。', 'openai-gpt35', 'cactus-5', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '我的基本信息如下: <性别> 、 <基本信息> ,我想做一份健身计划,达成 <目标设定> 的效果,对于目标我有如下更多补充:: <目标补充> 。我的初步想法是进行 <计划类型> 方面的类型,训练频次为 <训练频率> ,同时给身体足够的休息和恢复时间,要求如下 <休息与恢复> ,请根据我的上述情况生成一份健身计划,控制在30字以内。', '1'),
(5, '广告创意大师', 'creative', '广告创意大师是一个根据产品卖点,快速为用户提供广告文案的AI小程序。', 'openai-gpt35', 'palette-3', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '假设我是一名 <角色> ,请结合产品卖点和目标用户,帮我为 <产品名称> 生成 <文案数量> 条计划投放在 <投放渠道> 的广告文案,且保证每条文案的字数不超过30字;产品的核心卖点是 <核心卖点> ,目标用户是 <目标用户> 。', '1'),
(6, '文章撰写助手', 'creative', '旨在为自媒体创作者提供一个强大而便捷的平台,助力您撰写优质的文章并实现更广泛的影响力。', 'openai-gpt35', 'writinghand-3', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '生成一篇标题为 <文章主题> 的文章,文章内容概要为 <内容概要> ,计划发布到 <发布平台> ,需要注意控制 <规范要求> 。', '1'),
(7, '视频脚本创意工坊', 'creative', '视频脚本创意工房是一个帮助新手视频博主快速梳理视频创作思路,生成拍摄脚本的AI小程序。', 'openai-gpt35', 'notebook-3', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '假设我是一个新手视频博主,现请以 <主题> 为题,创作一个时长不超过 <视频时长> 分钟, <视频风格> 风格的视频脚本。', '1'),
(8, '旅行规划师', 'life', '旅行规划师可以为您量身定制独一无二的旅程体验,让旅行变得简单而完美。', 'openai-gpt35', 'airplane-6', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '请帮我生成一份 <旅行天数> 天 <旅行人数> 人的 <目标城市> 旅行规划,期望的交通方式是 <交通方式> ,住宿类型可接受 <住宿类型> ,期望推荐包含 <景点活动> 的行程活动,预算控制在 <预算成本> 之内,更多信息依据 <补充信息> 进行完善。', '1'),
(9, '新人介绍', 'personal', '新人介绍小程序是一个旨在帮助用户在入职当天,快速编写自我介绍的AI小程序。', 'openai-gpt35', 'pencil-7', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '请帮我生成一份新人介绍,我的年龄是 <年龄>  ,籍贯是 <籍贯信息> ,毕业于 <毕业院校> ,工作经验为 <工作经验> ,日常爱好是 <爱好> ,请将字数控制在300字以内,来帮助我完成新人入职的自我介绍,', '1'),
(10, '营销策划创意', 'creative', '营销策划创意旨在帮助用户生成针对目标受众的策划创意,从而吸引更多用户关注。', 'openai-gpt35', 'pushpin-4', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '请为 <产品名称> 产品 ,基于 <产品定位> <目标受众> 和期望的 <营销渠道> 等要素形成创意策划策略,更多信息依据 <补充信息> 进行完善,以吸引更多目标客户的关注、提高产品品牌知名度,降低每次点击成本并转化为实际购买行为。', '1'),
(11, '简历优化助手', 'personal', '简历撰写是一个求职简历撰写的小助手,旨在帮助用户优化个人简历、展现职业亮点。', 'openai-gpt35', 'writinghand-5', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '请帮我优化一份简历使其更具吸引力和专业性,简历需要包括个人信息、教育背景、工作经历、技能专长、项目经验和其他相关信息。我的简历具体内容为: <简历内容> ,期望应聘的目标职位及要求为 <目标职位> ,希望简历能够突出以下工作经历和成就: <工作经验> ,以凸显适用于目标职位的相关经验和能力。请确保满足 <简历格式> 的设计风格 ,更多信息依据 <补充信息> 进行完善。', '1'),
(12, '家装设计', 'life', '家装设计是一个旨在帮助用户轻松设计梦想家居,提供更多设计思路和灵感。', 'openai-gpt35', 'palette-7', 'system', '37-01-01 00:00:00', 'system', '37-01-01 00:00:00', '1', '37-01-01 00:00:00', '0', '我的家在 <居住城市> ,是 <房屋面积> 的 <房屋户型> 户型,想要装修成 <风格偏好> 的风格,预算成本需要控制在 <预算成本> 之内,更多信息依据 <补充信息> 进行完善,请帮我生成具体的设计建议。', '1');
(1, '职业发展导航', 'personal', '职业发展导航是一个旨在帮助用户规划和实现职业目标的AI小程序,为用户提供个性化的建议。', 'openai-gpt35', 'technologist-6', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '请帮我生成一份职业发展导航,我的教育背景为 <教育背景> ,职位信息为 <职位信息> ,工作经验描述如下: <工作经验> ,掌握的技能为 <掌握的技能> ,为了实现 <职业目标> ,我想做一个 <规划时长> 的计划,我有更多感兴趣的领域为 <更多感兴趣的领域> ,有更多补充内容 <补充信息> ,来追求相关机会和进一步发展,控制在30字以内。', '1'),
(2, '工作汇报', 'work', '旨在帮助您轻松撰写和管理您的工作汇报。无论是每周、每月还是季度性的报告,我们提供了一个简单而高效的平台,让您能够清晰、有条理地记录和展示您的工作成果。', 'openai-gpt35', 'technologist-2', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '我的基本信息如下: <身份描述> ,请根据我的工作情况生成一份工作汇报,需要包含 <汇报内容维度> ,汇报对象描述为 <汇报对象> ,另外还需要补充 <补充信息> 。下面是我的工作内容基本描述: <工作内容描述> ,控制在30字以内。', '1'),
(3, '市场分析报告', 'work', '市场分析报告小程序是一个旨在帮助用户根据互联网信息快速生成市场分析报告的AI小程序。', 'openai-gpt35', 'chart-6', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '请帮我生成一份市场分析报告,我目标市场是 <目标市场> ,市场概况为 <市场概况> ,该领域的细分市场有 <细分市场> ,同时我希望能针对 <竞品名称> 展开竞品分析,竞品分析的维度是 <竞品分析维度> ,来帮助我快速的了解市场。', '1'),
(4, '健身计划', 'life', '健身计划小程序旨在帮助您制定和管理个性化的健身计划,让您更轻松、高效地实现健康和体能目标。', 'openai-gpt35', 'cactus-5', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '我的基本信息如下: <性别> 、 <基本信息> ,我想做一份健身计划,达成 <目标设定> 的效果,对于目标我有如下更多补充:: <目标补充> 。我的初步想法是进行 <计划类型> 方面的类型,训练频次为 <训练频率> ,同时给身体足够的休息和恢复时间,要求如下 <休息与恢复> ,请根据我的上述情况生成一份健身计划,控制在30字以内。', '1'),
(5, '广告创意大师', 'creative', '广告创意大师是一个根据产品卖点,快速为用户提供广告文案的AI小程序。', 'openai-gpt35', 'palette-3', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '假设我是一名 <角色> ,请结合产品卖点和目标用户,帮我为 <产品名称> 生成 <文案数量> 条计划投放在 <投放渠道> 的广告文案,且保证每条文案的字数不超过30字;产品的核心卖点是 <核心卖点> ,目标用户是 <目标用户> 。', '1'),
(6, '文章撰写助手', 'creative', '旨在为自媒体创作者提供一个强大而便捷的平台,助力您撰写优质的文章并实现更广泛的影响力。', 'openai-gpt35', 'writinghand-3', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '生成一篇标题为 <文章主题> 的文章,文章内容概要为 <内容概要> ,计划发布到 <发布平台> ,需要注意控制 <规范要求> 。', '1'),
(7, '视频脚本创意工坊', 'creative', '视频脚本创意工房是一个帮助新手视频博主快速梳理视频创作思路,生成拍摄脚本的AI小程序。', 'openai-gpt35', 'notebook-3', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '假设我是一个新手视频博主,现请以 <主题> 为题,创作一个时长不超过 <视频时长> 分钟, <视频风格> 风格的视频脚本。', '1'),
(8, '旅行规划师', 'life', '旅行规划师可以为您量身定制独一无二的旅程体验,让旅行变得简单而完美。', 'openai-gpt35', 'airplane-6', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '请帮我生成一份 <旅行天数> 天 <旅行人数> 人的 <目标城市> 旅行规划,期望的交通方式是 <交通方式> ,住宿类型可接受 <住宿类型> ,期望推荐包含 <景点活动> 的行程活动,预算控制在 <预算成本> 之内,更多信息依据 <补充信息> 进行完善。', '1'),
(9, '新人介绍', 'personal', '新人介绍小程序是一个旨在帮助用户在入职当天,快速编写自我介绍的AI小程序。', 'openai-gpt35', 'pencil-7', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '请帮我生成一份新人介绍,我的年龄是 <年龄> ,籍贯是 <籍贯信息> ,毕业于 <毕业院校> ,工作经验为 <工作经验> ,日常爱好是 <爱好> ,请将字数控制在300字以内,来帮助我完成新人入职的自我介绍,', '1'),
(10, '营销策划创意', 'creative', '营销策划创意旨在帮助用户生成针对目标受众的策划创意,从而吸引更多用户关注。', 'openai-gpt35', 'pushpin-4', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '请为 <产品名称> 产品 ,基于 <产品定位> <目标受众> 和期望的 <营销渠道> 等要素形成创意策划策略,更多信息依据 <补充信息> 进行完善,以吸引更多目标客户的关注、提高产品品牌知名度,降低每次点击成本并转化为实际购买行为。', '1'),
(11, '简历优化助手', 'personal', '简历撰写是一个求职简历撰写的小助手,旨在帮助用户优化个人简历、展现职业亮点。', 'openai-gpt35', 'writinghand-5', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '请帮我优化一份简历使其更具吸引力和专业性,简历需要包括个人信息、教育背景、工作经历、技能专长、项目经验和其他相关信息。我的简历具体内容为: <简历内容> ,期望应聘的目标职位及要求为 <目标职位> ,希望简历能够突出以下工作经历和成就: <工作经验> ,以凸显适用于目标职位的相关经验和能力。请确保满足 <简历格式> 的设计风格 ,更多信息依据 <补充信息> 进行完善。', '1'),
(12, '家装设计', 'life', '家装设计是一个旨在帮助用户轻松设计梦想家居,提供更多设计思路和灵感。', 'openai-gpt35', 'palette-7', 'system', NOW(), 'system', NOW(), '1', NOW(), '0', '我的家在 <居住城市> ,是 <房屋面积> 的 <房屋户型> 户型,想要装修成 <风格偏好> 的风格,预算成本需要控制在 <预算成本> 之内,更多信息依据 <补充信息> 进行完善,请帮我生成具体的设计建议。', '1');
-- DROP TABLE IF EXISTS `zt_aimessage`;
CREATE TABLE IF NOT EXISTS `zt_aimessage` (
-187
View File
@@ -192,22 +192,6 @@ class ai extends control
$this->display();
}
/**
* Change mini program `deleted` value.
*
* @param string $appID
* @param string $deleted
* @access public
* @return void
*/
public function deleteMiniProgram($appID, $deleted)
{
$result = $this->ai->deleteMiniProgram($appID, $deleted);
if($result === true) return $this->send(array('result' => 'success', 'locate' => $this->createLink('ai', 'miniPrograms')));
if(is_string($result)) return $this->sendError($result);
$this->sendError(dao::getError());
}
/**
* Publish a mini program.
*
@@ -236,177 +220,6 @@ class ai extends control
$this->sendError(dao::getError());
}
/**
* Test mini program.
*
* @param string $appID
* @access public
* @return void
*/
public function testMiniProgram($appID)
{
if(!empty($_POST))
{
$toPublish = $_POST['toPublish'];
unset($_POST['toPublish']);
$this->ai->editMiniProgram($appID);
if($toPublish === '1') $this->ai->publishMiniProgram($appID, '1');
return print(js::closeModal('parent', 'this'));
}
$miniProgram = $this->ai->getMiniProgramByID($appID);
if(empty($miniProgram)) return $this->sendError($this->lang->ai->noMiniProgram);
if($miniProgram->builtIn) return $this->sendError('Testing built-in program is not supported.');
$this->view->currentFields = $this->ai->getMiniProgramFields($appID);
$this->view->currentPrompt = $miniProgram->prompt;
$this->view->appID = $appID;
$this->display();
}
/**
* Create a mini program.
*
* @access public
* @return void
*/
public function createMiniProgram()
{
if(!empty($_POST))
{
$toNext = $_POST['toNext'];
unset($_POST['toNext']);
$requiredFields = array('category' => $this->lang->ai->miniPrograms->category, 'model' => $this->lang->prompt->model, 'name' => $this->lang->prompt->name, 'desc' => $this->lang->ai->miniPrograms->desc);
$errors = $this->ai->verifyRequiredFields($requiredFields);
if($errors !== false) return $this->sendError($errors);
$isDuplicated = $this->ai->checkDuplicatedAppName($_POST['name']);
if($isDuplicated) return $this->sendError(array('name' => $this->lang->ai->miniPrograms->field->duplicatedNameTip));
$appID = $this->ai->createMiniProgram();
if($appID === false) return $this->sendError(array('message' => $this->lang->fail));
if($toNext === '1') return $this->sendSuccess(array('message' => $this->lang->saveSuccess, 'locate' => $this->createLink('ai', 'configuredMiniProgram', "appID=$appID")));
return $this->sendSuccess(array('message' => $this->lang->saveSuccess, 'locate' => $this->createLink('ai', 'editMiniProgram', "appID=$appID")));
}
$this->view->iconName = 'writinghand';
$this->view->iconTheme = 7;
$this->view->categoryList = $this->ai->getCustomCategories();
$this->view->title = $this->lang->ai->miniPrograms->common;
$this->display();
}
/**
* Create a mini program.
*
* @param string $appID
* @access public
* @return void
*/
public function editMiniProgram($appID)
{
if(!empty($_POST))
{
$toNext = $_POST['toNext'];
unset($_POST['toNext']);
$requiredFields = array('category' => $this->lang->ai->miniPrograms->category, 'model' => $this->lang->prompt->model, 'name' => $this->lang->prompt->name, 'desc' => $this->lang->ai->miniPrograms->desc);
$errors = $this->ai->verifyRequiredFields($requiredFields);
if($errors !== false) return $this->sendError($errors);
$isDuplicated = $this->ai->checkDuplicatedAppName($_POST['name'], $appID);
if($isDuplicated) return $this->sendError(array('name' => $this->lang->ai->miniPrograms->field->duplicatedNameTip));
$result = $this->ai->editMiniProgram($appID);
if($result === false) return $this->sendError(array('message' => $this->lang->fail));
if($toNext === '1') return $this->sendSuccess(array('message' => $this->lang->saveSuccess, 'locate' => $this->createLink('ai', 'configuredMiniProgram', "appID=$appID")));
return $this->sendSuccess(array('message' => $this->lang->saveSuccess, 'locate' => $this->createLink('ai', 'editMiniProgram', "appID=$appID")));
}
$miniProgram = $this->ai->getMiniProgramByID($appID);
if(empty($miniProgram)) return $this->sendError($this->lang->ai->noMiniProgram);
$this->view->name = $miniProgram->name;
$this->view->desc = $miniProgram->desc;
$this->view->model = $miniProgram->model;
$this->view->category = $miniProgram->category;
list($this->view->iconName, $this->view->iconTheme) = explode('-', $miniProgram->icon);
$this->view->categoryList = $this->ai->getCustomCategories();
$this->view->title = $this->lang->ai->miniPrograms->common;
$this->display('ai', 'createMiniProgram');
}
/**
* Mini program view.
*
* @param string $id
* @access public
* @return void
*/
public function miniProgramView($id)
{
$miniProgram = $this->ai->getMiniProgramByID($id);
if(empty($miniProgram)) return $this->sendError($this->lang->ai->noMiniProgram);
$this->view->miniProgram = $miniProgram;
$this->view->categoryList = array_merge($this->lang->ai->miniPrograms->categoryList, $this->ai->getCustomCategories());
$this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('miniprogram', $id);
$this->view->actions = $this->loadModel('action')->getList('miniProgram', $id);
$this->view->fields = $this->ai->getMiniProgramFields($id);
$this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->view->title = "{$this->lang->ai->miniPrograms->common}#{$miniProgram->id} $miniProgram->name";
$this->display();
}
/**
* Configured a mini program.
*
* @param string $appID
* @access public
* @return void
*/
public function configuredMiniProgram($appID)
{
if(!common::hasPriv('ai', 'editMiniProgram') && !common::hasPriv('ai', 'createMiniProgram')) return $this->locate($this->createLink('my', 'index'));
if(!empty($_POST))
{
$toPublish = $_POST['toPublish'];
unset($_POST['toPublish']);
$this->ai->saveMiniProgramFields($appID);
if($toPublish === '1') $this->ai->publishMiniProgram($appID, '1');
return $this->sendSuccess(array());
}
$program = $this->ai->getMiniProgramByID($appID);
if(empty($program)) return $this->sendError($this->lang->ai->noMiniProgram);
$this->view->currentFields = $this->ai->getMiniProgramFields($appID);
$this->view->currentPrompt = $program->prompt;
$this->view->title = $this->lang->ai->miniPrograms->common;
$this->view->appID = $appID;
$this->display();
}
/**
* Export a mini program as zip file.
*
* @param string $appID
* @access public
* @return void
*/
public function exportMiniProgram($appID)
{
$program = $this->ai->getMiniProgramByID($appID);
if($program->builtIn === '1') exit;
$php = $this->ai->createZtAppPhp($appID);
$zip = $this->ai->createZtAppZip($php);
header('Content-Type: application/zip');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . basename($zip) . '"');
header('Content-Length: ' . filesize($zip));
readfile($zip);
unlink($zip);
exit;
}
/**
* Import mini program from zip file.
*
-110
View File
@@ -520,27 +520,6 @@ class aiModel extends model
->fetchAll();
}
/**
* Change mini program `deleted` value.
*
* @param string $appID
* @param string $deleted
* @access public
* @return bool
*/
public function deleteMiniProgram($appID, $deleted = '1')
{
$program = $this->getMiniProgramByID($appID);
if($program->builtIn === '1') return 'Deletion of built-in program is not supported.';
$this->dao->update(TABLE_MINIPROGRAM)
->set('deleted')->eq($deleted)
->where('id')->eq($appID)
->exec();
$this->loadModel('action')->create('miniProgram', $appID, 'deleted');
return !dao::isError();
}
/**
* @param string $appID
* @access public
@@ -734,95 +713,6 @@ class aiModel extends model
return $appID;
}
/**
* Edit a mini program.
*
* @param string $appID
* @access public
* @return bool
*/
public function editMiniProgram($appID)
{
$data = fixer::input('post')->get();
$data->editedBy = $this->app->user->account;
$data->editedDate = helper::now();
$data->published = '0';
if(!empty($data->iconName) && !empty($data->iconTheme))
{
$data->icon = $data->iconName . '-' . $data->iconTheme;
unset($data->iconName);
unset($data->iconTheme);
}
$old = $this->getMiniProgramByID($appID);
if($old->builtIn === '1') return false;
$this->dao->update(TABLE_MINIPROGRAM)
->data($data)
->where('id')->eq($appID)
->exec();
if(dao::isError()) return false;
$data->id = $appID;
$changes = common::createChanges($old, $data);
$actionID = $this->loadModel('action')->create('miniProgram', $appID, 'edited');
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
return true;
}
/**
* Create a mini program php data file.
*
* @param string $appID
* @return string
*/
public function createZtAppPhp($appID)
{
$miniProgram = $this->getMiniProgramByID($appID);
$fields = $this->getMiniProgramFields($appID);
unset($miniProgram->id);
unset($miniProgram->category);
unset($miniProgram->createdBy);
unset($miniProgram->createdDate);
unset($miniProgram->editedBy);
unset($miniProgram->editedDate);
unset($miniProgram->publishedDate);
$miniProgram->published = '0';
$miniProgram->fields = array();
foreach($fields as $field)
{
unset($field->id);
unset($field->appID);
$miniProgram->fields[] = $field;
}
$appJson = json_encode($miniProgram);
$content = <<<APP
<?php
\$ztApp = '$appJson';
APP;
$file = $this->app->getAppRoot() . "tmp/{$miniProgram->name}.ztapp.php";
file_put_contents($file, $content);
return $file;
}
/**
* Create mini program zip.
*
* @param string $file
* @return string
*/
public function createZtAppZip($file)
{
$this->app->loadClass('pclzip', true);
$zipPath = substr($file, 0, -3) . 'zip';
$zip = new pclzip($zipPath);
$zip->create($file, PCLZIP_OPT_REMOVE_ALL_PATH);
return $zipPath;
}
public function extractZtAppZip($file)
{
$this->app->loadClass('pclzip', true);
@@ -1,211 +0,0 @@
<?php include '../../common/view/header.html.php'; ?>
<?php
js::set('pleaseInput', $lang->ai->miniPrograms->placeholder->input);
js::set('deleteTip', $lang->ai->miniPrograms->deleteFieldTip);
js::set('emptyWarning', $lang->ai->miniPrograms->field->emptyNameWarning);
js::set('duplicatedWarning', $lang->ai->miniPrograms->field->duplicatedNameWarning);
js::set('emptyOptionWarning', $lang->ai->miniPrograms->field->emptyOptionWarning);
js::set('appID', $appID);
js::set('publishConfirm', $lang->ai->miniPrograms->publishConfirm);
js::set('emptyPrompterTip', $lang->ai->miniPrograms->emptyPrompterTip);
js::set('currentFields', $currentFields);
js::set('currentPrompt', $currentPrompt);
js::set('promptPlaceholder', $lang->ai->miniPrograms->placeholder->prompt);
js::set('fieldName', $lang->ai->miniPrograms->field->name);
?>
<?php js::import($jsRoot . 'textcomplete/jquery.textcomplete.min.js'); ?>
<template id="option-template">
<div class="input-group">
<span class="input-group-addon"><?= $lang->ai->miniPrograms->field->option; ?>1</span>
<input name="option[]" type="text" class="form-control" placeholder="<?= $lang->ai->miniPrograms->placeholder->input; ?>" />
<span class="input-group-btn">
<button type="button" class="btn btn-default btn-icon" onclick="addFieldOption(event)"><i class="icon icon-plus"></i></button>
<button type="button" class="btn btn-default btn-icon" onclick="removeFieldOption(event)"><i class="icon icon-minus"></i></button>
</span>
</div>
</template>
<template id="field-template">
<form>
<table class="table table-form">
<tbody>
<tr>
<th><?= $lang->ai->miniPrograms->field->name; ?></th>
<td class="required"><input type="text" name="field-name" maxlength="16" class="form-control" /></td>
</tr>
<tr>
<th><?= $lang->ai->miniPrograms->field->type; ?></th>
<td>
<select name="field-type" class="form-control" onchange="changeFieldType(event)">
<option value="text"><?= $lang->ai->miniPrograms->field->typeList['text']; ?></option>
<option value="textarea"><?= $lang->ai->miniPrograms->field->typeList['textarea']; ?></option>
<option value="radio"><?= $lang->ai->miniPrograms->field->typeList['radio']; ?></option>
<option value="checkbox"><?= $lang->ai->miniPrograms->field->typeList['checkbox']; ?></option>
</select>
</td>
</tr>
<tr>
<th><?= $lang->ai->miniPrograms->field->placeholder; ?></th>
<td><input name="placeholder" type="text" class="form-control" placeholder="<?= $lang->ai->miniPrograms->placeholder->default; ?>" /></td>
</tr>
<tr class="field-options hidden">
<th></th>
<td></td>
</tr>
<tr>
<th><?= $lang->ai->miniPrograms->field->required; ?></th>
<td>
<div class="radio" style="display: flex; align-items: center; gap: 4px;">
<label>
<input type="radio" name="field-required" value="1" checked><?= $lang->ai->miniPrograms->field->requiredOptions[1]; ?>
</label>
<label>
<input type="radio" name="field-required" value="0"><?= $lang->ai->miniPrograms->field->requiredOptions[0]; ?>
</label>
</div>
</td>
</tr>
</tbody>
</table>
</form>
</template>
<div class="modal fade" id="add-field-modal">
<div class="modal-dialog" style="width: 600px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px;">
<strong style="font-size: 20px;"><?= $lang->ai->miniPrograms->field->add; ?></strong>
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body" style="display: flex; gap: 42px; padding-right: 36px;"></div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none;">
<button type="button" class="btn btn-wide btn-primary" onclick="saveNewField()"><?= $lang->save; ?></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="edit-field-modal">
<div class="modal-dialog" style="width: 600px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px;">
<strong style="font-size: 20px;"><?= $lang->ai->miniPrograms->field->edit; ?></strong>
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body" style="display: flex; gap: 42px; padding-right: 36px;"></div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none;">
<button type="button" class="btn btn-wide btn-primary" onclick="saveEditedField()"><?= $lang->save; ?></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="back-to-list-modal">
<div class="modal-dialog" style="width: 480px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px; display: flex; align-items: center; gap: 16px; margin: 0;">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.0159" cy="12.0163" r="12" transform="rotate(0.0777774 12.0159 12.0163)" fill="#FFA34D" />
<path d="M12.4516 14.621C12.8867 14.6215 13.3224 14.1498 13.3231 13.6775L13.6588 7.42006C13.6595 6.94777 13.661 6.00319 12.3559 6.0016C11.1595 6.00013 11.0495 6.8265 11.0486 7.41686L11.3655 13.6751C11.5823 14.1476 12.0166 14.6204 12.4516 14.621ZM12.4499 15.8017C11.7973 15.8009 11.1439 16.3905 11.1426 17.217C11.1416 17.9254 11.6843 18.6345 12.4456 18.6354C13.2069 18.6363 13.7516 18.0467 13.7528 17.2202C13.7541 16.3936 13.1024 15.8025 12.4499 15.8017Z" fill="white" />
</svg>
<span style="font-size: 16px;"><?= $lang->ai->miniPrograms->backToListPageTip; ?></span>
</div>
<div class="modal-footer" style="display: flex; padding-top: 0; justify-content: center; border-top: none; gap: 10px;">
<button class="btn btn-wide btn-primary" onclick="backWithSave()"><?= $lang->save; ?></button>
<button class="btn btn-wide" data-dismiss="modal"><?= $lang->cancel; ?></button>
<button class="btn btn-wide btn-link" style="color: var(--color-primary);" onclick="backWithoutSave()"><?= $lang->ai->prompts->roleTemplateSaveList['discard']; ?></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="publish-confirm-modal">
<div class="modal-dialog" style="width: 480px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px; display: flex; align-items: center; gap: 16px; margin: 0;">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.0159" cy="12.0163" r="12" transform="rotate(0.0777774 12.0159 12.0163)" fill="#FFA34D" />
<path d="M12.4516 14.621C12.8867 14.6215 13.3224 14.1498 13.3231 13.6775L13.6588 7.42006C13.6595 6.94777 13.661 6.00319 12.3559 6.0016C11.1595 6.00013 11.0495 6.8265 11.0486 7.41686L11.3655 13.6751C11.5823 14.1476 12.0166 14.6204 12.4516 14.621ZM12.4499 15.8017C11.7973 15.8009 11.1439 16.3905 11.1426 17.217C11.1416 17.9254 11.6843 18.6345 12.4456 18.6354C13.2069 18.6363 13.7516 18.0467 13.7528 17.2202C13.7541 16.3936 13.1024 15.8025 12.4499 15.8017Z" fill="white" />
</svg>
<strong style="font-size: 16px;"><?= $lang->ai->miniPrograms->publishConfirm[0]; ?></strong>
</div>
<div class="modal-body" style="padding-left: 70px;"><?= $lang->ai->miniPrograms->publishConfirm[1]; ?></div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none; gap: 10px;">
<a class="btn btn-wide btn-primary"><?= $lang->confirm; ?></a>
<a class="btn btn-wide" data-dismiss="modal"><?= $lang->cancel; ?></a>
</div>
</div>
</div>
</div>
<div id="mainContent" class="main-content">
<div style="flex-basis: 30%; margin-right: 16px;">
<header>
<strong><?= $lang->ai->miniPrograms->field->configuration; ?></strong>
</header>
<main class="field-configuration-main">
<div>
<a onclick="toAddField()" style="border: 1px dashed #D8DBDE; border-radius: 2px; display: flex; align-items: center; flex-direction: column; padding: 12px; gap: 4px;">
<div style="color: #2E7FFF; display: flex; align-items: center; gap: 4px;"><i class="icon icon-plus"></i><span><?= $lang->ai->miniPrograms->field->add; ?></span></div>
<div style="color: #9EA3B0; font-size: 12divx;"><?= $lang->ai->miniPrograms->field->addTip; ?></div>
</a>
</div>
<table class="table table-form">
<tbody class="field-configuration" id="sortable-list"></tbody>
</table>
</main>
</div>
<div style="flex-basis: 40%; border-right: 1px solid #E6EAF1;">
<header>
<strong><?= $lang->ai->miniPrograms->field->debug; ?></strong>
</header>
<main>
<div class="content-debug-area" style="min-height: 50%;">
<div class="area-title">
<strong><?= $lang->ai->miniPrograms->field->contentDebugging; ?></strong>
<i title="<?= $lang->help; ?>" class="icon icon-help text-warning"></i>
<span class="text-muted"><?= $lang->ai->miniPrograms->field->contentDebuggingTip; ?></span>
</div>
<table class="table table-form">
<tbody class="field-content"></tbody>
</table>
</div>
<div class="prompt-design-area" style="height: 50%; position: relative; padding-top: 0;">
<div class="area-title">
<strong><?= $lang->ai->miniPrograms->field->prompterDesign; ?></strong>
<i title="<?= $lang->help; ?>" class="icon icon-help text-warning"></i>
<span class="text-muted"><?= $lang->ai->miniPrograms->field->prompterDesignTip; ?></span>
</div>
<div class="form-control" id="autocomplete-textarea" contenteditable="true" style="overflow-wrap: break-word; overflow-y: auto; position: absolute; top: 32px; left: 24px; right: 24px; bottom: 24px; height: auto; width: auto;"></div>
</div>
</main>
</div>
<div style="flex-basis: 30%;">
<header>
<strong><?= $lang->ai->miniPrograms->field->preview; ?></strong>
</header>
<main>
<div class="prompt-preview-area" style="height: 50%; position: relative;">
<div class="area-title" style="display: flex; justify-content: space-between;">
<strong><?= $lang->ai->miniPrograms->field->prompterPreview; ?></strong>
<button class="btn btn-link" style="color: #2E7FFF; position: absolute; right: 16px;" id="generate-result">
<i class="icon-publish text-primary"></i>
<?= $lang->ai->miniPrograms->field->generateResult; ?>
</button>
</div>
<div class="preview-container"></div>
</div>
<div class="prompt-result-area" style="height: 50%; position: relative; padding-top: 0;">
<div class="area-title">
<strong><?= $lang->ai->miniPrograms->field->resultPreview; ?></strong>
</div>
<div class="preview-container"></div>
</div>
</main>
</div>
</div>
<footer style="display: flex; justify-content: center; align-items: center; height: 56px; background: #fff; border-top: 1px solid #eff1f7; position: fixed; bottom: 0; left: 20px; right: 20px; gap: 24px;">
<a onclick="backToList()" class="btn btn-wide"><?= $lang->ai->miniPrograms->backToListPage; ?></a>
<a href="<?= $this->createLink('ai', 'editMiniProgram', "appID=$appID"); ?>" class="btn btn-wide"><?= $lang->ai->miniPrograms->lastStep; ?></a>
<a class="btn btn-wide btn-secondary" onclick="saveMiniProgram('0')"><?= $lang->save; ?></a>
<a class="btn btn-wide btn-primary" onclick="saveMiniProgram('1')"><?= $lang->ai->prompts->action->publish; ?></a>
</footer>
<?php include '../../common/view/footer.html.php'; ?>
-121
View File
@@ -1,121 +0,0 @@
<?php include '../../common/view/header.html.php'; ?>
<?php js::set('iconCheck', $config->ai->miniPrograms->iconCheck); ?>
<div id="mainContent" class="main-content" style="position: fixed; top: 66px; right: 16px; bottom: 16px; left: 16px;">
<div style="width: 660px; margin: 0 auto;">
<div style="display: flex; align-items: center; justify-content: flex-start; margin-bottom: 20px;">
<strong style="font-size: 16px;"><?= $lang->ai->miniPrograms->configuration; ?></strong>
<i title="<?= $lang->help; ?>" class="icon icon-help text-warning" style="padding-left: 8px; padding-right: 2px;"></i>
<span class="text-muted"><?= $lang->ai->miniPrograms->downloadTip; ?></span>
<a class="text-primary" href="https://www.zentao.net/page/download.html" target="_blank">&gt;&gt;<?= $lang->ai->miniPrograms->download; ?></a>
</div>
<form class="main-form form-ajax" method="post">
<table class="table table-form">
<tr>
<th><?= $lang->ai->miniPrograms->category; ?></th>
<td>
<?= html::select('category', array_merge($lang->ai->miniPrograms->categoryList, $categoryList), $category, "class='form-control chosen' required"); ?>
</td>
<td></td>
</tr>
<tr>
<th><?= $lang->prompt->model; ?></th>
<td>
<?= html::select('model', $lang->ai->miniPrograms->modelList, $model, "class='form-control chosen' required"); ?>
</td>
<td></td>
</tr>
<tr>
<th><?= $lang->prompt->name; ?></th>
<td colspan="2">
<?= html::input('name', $name, "class='form-control' maxlength='16' required placeholder='" . $lang->ai->miniPrograms->placeholder->name . "'"); ?>
</td>
</tr>
<tr>
<th><?= $lang->ai->miniPrograms->desc; ?></th>
<td colspan="2">
<?= html::textarea('desc', $desc, "rows='1' class='form-control' required placeholder='" . $lang->ai->miniPrograms->placeholder->desc . "'"); ?>
</td>
</tr>
<tr class="hidden">
<th></th>
<td colspan="2">
<input type="text" name="toNext" />
</td>
</tr>
<tr>
<th><?= $lang->ai->miniPrograms->icon; ?></th>
<td>
<button id="ai-edit-icon" style="width: 46px; height: 46px; border-radius: 50%; border: 1px solid <?= $config->ai->miniPrograms->themeList[$iconTheme][1]; ?>; background-color: <?= $config->ai->miniPrograms->themeList[$iconTheme][0]; ?>;" type="button" class="btn btn-icon" data-toggle="modal" data-target="#edit-icon-modal">
<?= $config->ai->miniPrograms->iconList[$iconName]; ?>
<div id="edit-icon">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.78327 6.01523C5.78327 5.80353 5.95489 5.6319 6.1666 5.6319H11.3142C11.5259 5.6319 11.6976 5.46028 11.6976 5.24857C11.6976 5.03686 11.5259 4.86523 11.3142 4.86523H6.1666C5.53147 4.86523 5.0166 5.38011 5.0166 6.01523V13.6819C5.0166 14.317 5.53147 14.8319 6.1666 14.8319H13.8333C14.4684 14.8319 14.9833 14.317 14.9833 13.6819V8.53428C14.9833 8.32257 14.8116 8.15095 14.5999 8.15095C14.3882 8.15095 14.2166 8.32257 14.2166 8.53428V13.6819C14.2166 13.8936 14.045 14.0652 13.8333 14.0652H6.1666C5.95489 14.0652 5.78327 13.8936 5.78327 13.6819V6.01523Z" fill="#2E7FFF" />
<path d="M14.9 5.55565C15.0515 5.40777 15.0545 5.16508 14.9066 5.01357C14.7587 4.86207 14.516 4.85912 14.3645 5.007L8.93315 10.3082C8.78165 10.456 8.7787 10.6987 8.92658 10.8502C9.07445 11.0018 9.31714 11.0047 9.46865 10.8568L14.9 5.55565Z" fill="#2E7FFF" />
</svg>
</div>
</button>
</td>
<td class="hidden">
<?= html::input('iconName', $iconName, "class='form-control'") ?>
<?= html::input('iconTheme', $iconTheme, "class='form-control'") ?>
</td>
</tr>
<div style="position: fixed; left: 0; right: 0; bottom: 32px; display: flex; justify-content: center; gap: 24px;">
<?= html::a($this->createLink('ai', 'miniPrograms'), $lang->goback, '', "class='btn btn-back btn-wide'"); ?>
<button class="btn btn-wide btn-secondary" type="submit" id="save-miniprogram"><?= $lang->save; ?></button>
<button class="btn btn-wide btn-primary" type="submit" id="next-step"><?= $lang->ai->nextStep; ?></button>
</div>
</table>
</form>
</div>
</div>
<div class="modal fade" id="edit-icon-modal">
<div class="modal-dialog" style="width: 600px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none;">
<div style="display: inline-flex; gap: 8px; align-items: center;">
<strong style="font-size: 20px;"><?= $lang->ai->miniPrograms->iconModification; ?></strong>
<span class="text-muted">Emoji icons by Twemoji with CC-BY4.0</span>
</div>
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body" style="display: flex; gap: 42px;">
<div class="icon-preview-container">
<button id="preview-icon" class="btn btn-icon" style="width: 46px; height: 46px; border-radius: 50%; display: flex; justify-content: center; align-items: center; border: 1px solid <?= $config->ai->miniPrograms->themeList[$iconTheme][1]; ?>; background-color: <?= $config->ai->miniPrograms->themeList[$iconTheme][0]; ?>">
<?= $config->ai->miniPrograms->iconList[$iconName]; ?>
</button>
</div>
<div class="icon-setting-container">
<div>
<header style="margin-bottom: 12px;"><?= $lang->ai->miniPrograms->customBackground; ?></header>
<div id="theme-buttons" style="display: flex; gap: 20px; width: 400px;">
<?php
foreach($config->ai->miniPrograms->themeList as $theme)
{
if($config->ai->miniPrograms->themeList[$iconTheme][0] === $theme[0])
{
echo "<button type='button' class='btn btn-icon theme-checked' style='width: 32px; height: 32px; border-radius: 50%; background-color: $theme[0]; border: 1px solid $theme[1];'>{$config->ai->miniPrograms->iconCheck}</button>";
}
else
{
echo "<button type='button' class='btn btn-icon' style='width: 32px; height: 32px; border-radius: 50%; background-color: $theme[0]; border: 1px solid $theme[1];'></button>";
}
}
?>
</div>
</div>
<div style="margin-top: 32px;">
<header style="margin-bottom: 12px;"><?= $lang->ai->miniPrograms->customIcon; ?></header>
<div id="icon-buttons" style="display: grid; column-gap: 20px; row-gap: 16px; grid-template-columns: repeat(8, 1fr); justify-items: center; align-items: center;">
<?php foreach($config->ai->miniPrograms->iconList as $name => $icon) echo $icon; ?>
</div>
</div>
</div>
</div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none;">
<button type="button" class="btn btn-wide btn-primary" id="save-icon-button" data-dismiss="modal"><?= $lang->save; ?></button>
</div>
</div>
</div>
</div>
<?php include '../../common/view/footer.html.php'; ?>
+8 -6
View File
@@ -1,6 +1,7 @@
<?php include '../../common/view/header.html.php'; ?>
<?php
include '../../common/view/header.html.php';
$finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories);
$isNotOpen = $config->edition != 'open';
?>
<div id="mainMenu" class="clearfix">
<div id="sidebarHeader">
@@ -28,7 +29,7 @@ $finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories);
<?= $lang->ai->import; ?>
</a>
<?php endif; ?>
<?php if(common::hasPriv('ai', 'createMiniProgram')): ?>
<?php if($isNotOpen && common::hasPriv('ai', 'createMiniProgram')): ?>
<?= html::a($this->createLink('ai', 'createMiniProgram'), "<i class='icon icon-plus'></i> " . $lang->ai->miniPrograms->create, '', "class='btn btn-primary'"); ?>
<?php endif; ?>
</div>
@@ -175,7 +176,8 @@ $finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories);
<?php foreach($miniPrograms as $miniProgram) : ?>
<tr>
<td class="c-id"><?= $miniProgram->id; ?></td>
<td class="c-name"><a href="<?= $this->createLink('ai', 'miniProgramView', "id={$miniProgram->id}"); ?>"><?= $miniProgram->name; ?></a></td>
<?php $link = $isNotOpen && common::hasPriv('ai', 'miniProgramView') ? $this->createLink('ai', 'miniProgramView', "id={$miniProgram->id}") : '#' ?>
<td class="c-name"><a href="<?= $link; ?>"><?= $miniProgram->name; ?></a></td>
<td class="c-status"><?= $miniProgram->publishedLabel; ?></td>
<td class="c-category"><?= $miniProgram->categoryLabel; ?></td>
<td class="c-createdby"><?= $miniProgram->createdByLabel; ?></td>
@@ -187,14 +189,14 @@ $finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories);
$isBuiltIn = $miniProgram->builtIn === '1';
?>
<?php
if(common::hasPriv('ai', 'editMiniProgram'))
if($isNotOpen && common::hasPriv('ai', 'editMiniProgram'))
{
echo $isPublished || $isBuiltIn
? "<button class='btn' disabled title='{$lang->ai->prompts->action->edit}'><i class='icon icon-edit text-primary'></i></button>"
: "<a class='btn' title='{$lang->ai->prompts->action->edit}' href='{$this->createLink('ai', 'editMiniProgram', "appID=$miniProgram->id")}'><i class='icon icon-edit text-primary'></i></a>";
}
?>
<?php if(common::hasPriv('ai', 'testMiniProgram')): ?>
<?php if($isNotOpen && common::hasPriv('ai', 'testMiniProgram')): ?>
<button
class="btn iframe"
data-toggle="modal"
@@ -216,7 +218,7 @@ $finalList = array_merge($categoryList, $lang->ai->miniPrograms->allCategories);
<i class="icon icon-ban-circle text-primary"></i>
</button>
<?php endif; ?>
<?php if(common::hasPriv('ai', 'exportMiniProgram')): ?>
<?php if($isNotOpen && common::hasPriv('ai', 'exportMiniProgram')): ?>
<button class="btn" onclick="exportMiniProgram(event)" title="<?= $lang->ai->export; ?>"<?= $isPublished && !$isBuiltIn ? '' : ' disabled'; ?>>
<i class="icon icon-export text-primary"></i>
</button>
-216
View File
@@ -1,216 +0,0 @@
<?php include '../../common/view/header.html.php'; ?>
<?php
js::set('miniProgramID', $miniProgram->id);
js::set('miniProgramName', $miniProgram->name);
$isNotBuiltIn = $miniProgram->builtIn === '0';
?>
<div class="modal fade" id="disable-miniprogram">
<div class="modal-dialog" style="width: 480px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px; display: flex; align-items: center;">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.0159" cy="12.0163" r="12" transform="rotate(0.0777774 12.0159 12.0163)" fill="#FFA34D" />
<path d="M12.4516 14.621C12.8867 14.6215 13.3224 14.1498 13.3231 13.6775L13.6588 7.42006C13.6595 6.94777 13.661 6.00319 12.3559 6.0016C11.1595 6.00013 11.0495 6.8265 11.0486 7.41686L11.3655 13.6751C11.5823 14.1476 12.0166 14.6204 12.4516 14.621ZM12.4499 15.8017C11.7973 15.8009 11.1439 16.3905 11.1426 17.217C11.1416 17.9254 11.6843 18.6345 12.4456 18.6354C13.2069 18.6363 13.7516 18.0467 13.7528 17.2202C13.7541 16.3936 13.1024 15.8025 12.4499 15.8017Z" fill="white" />
</svg>
<span style="padding-left: 16px;"><?= $lang->ai->miniPrograms->disableTip; ?></span>
</div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none; padding-top: 0;">
<button type="button" class="btn btn-primary" onclick="unpublishMiniProgram()" data-dismiss="modal"><?= $lang->confirm; ?></button>
<button type="button" class="btn" data-dismiss="modal"><?= $lang->cancel; ?></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="delete-miniprogram">
<div class="modal-dialog" style="width: 480px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px; display: flex; align-items: center;">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.0159" cy="12.0163" r="12" transform="rotate(0.0777774 12.0159 12.0163)" fill="#FFA34D" />
<path d="M12.4516 14.621C12.8867 14.6215 13.3224 14.1498 13.3231 13.6775L13.6588 7.42006C13.6595 6.94777 13.661 6.00319 12.3559 6.0016C11.1595 6.00013 11.0495 6.8265 11.0486 7.41686L11.3655 13.6751C11.5823 14.1476 12.0166 14.6204 12.4516 14.621ZM12.4499 15.8017C11.7973 15.8009 11.1439 16.3905 11.1426 17.217C11.1416 17.9254 11.6843 18.6345 12.4456 18.6354C13.2069 18.6363 13.7516 18.0467 13.7528 17.2202C13.7541 16.3936 13.1024 15.8025 12.4499 15.8017Z" fill="white" />
</svg>
<span style="padding-left: 16px;"><?= $lang->ai->miniPrograms->deleteTip; ?></span>
</div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none; padding-top: 0;">
<button type="button" class="btn btn-primary" onclick="deleteMiniProgram('1')" data-dismiss="modal"><?= $lang->confirm; ?></button>
<button type="button" class="btn" data-dismiss="modal"><?= $lang->cancel; ?></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="publish-miniprogram">
<div class="modal-dialog" style="width: 480px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px; display: flex; align-items: center;">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.0159" cy="12.0163" r="12" transform="rotate(0.0777774 12.0159 12.0163)" fill="#FFA34D" />
<path d="M12.4516 14.621C12.8867 14.6215 13.3224 14.1498 13.3231 13.6775L13.6588 7.42006C13.6595 6.94777 13.661 6.00319 12.3559 6.0016C11.1595 6.00013 11.0495 6.8265 11.0486 7.41686L11.3655 13.6751C11.5823 14.1476 12.0166 14.6204 12.4516 14.621ZM12.4499 15.8017C11.7973 15.8009 11.1439 16.3905 11.1426 17.217C11.1416 17.9254 11.6843 18.6345 12.4456 18.6354C13.2069 18.6363 13.7516 18.0467 13.7528 17.2202C13.7541 16.3936 13.1024 15.8025 12.4499 15.8017Z" fill="white" />
</svg>
<span style="padding-left: 16px;"><?= $lang->ai->miniPrograms->publishTip; ?></span>
</div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none; padding-top: 0;">
<button type="button" class="btn btn-primary" onclick="publishMiniProgram()" data-dismiss="modal"><?= $lang->confirm; ?></button>
<button type="button" class="btn" data-dismiss="modal"><?= $lang->cancel; ?></button>
</div>
</div>
</div>
</div>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?= html::a(helper::createLink('ai', 'miniPrograms'), '<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', "class='btn btn-secondary'"); ?>
<div class="divider"></div>
<div class="page-title">
<span class="label label-id"><?= $miniProgram->id; ?></span>
<span class="text" title='<?= $miniProgram->name; ?>'><?= $miniProgram->name; ?></span>
<?php if ($miniProgram->deleted) echo "<span class='label label-danger'>{$lang->ai->prompts->deleted}</span>"; ?>
</div>
</div>
<div class="btn-toolbar pull-right">
<?php if($isNotBuiltIn && common::hasPriv('ai', 'exportMiniProgram') && $miniProgram->published === '1'): ?>
<button class="btn btn-primary" onclick="exportMiniProgram(event)" title="<?= $lang->ai->export; ?>">
<i class="icon icon-export"></i>
<?= $lang->ai->export; ?>
</button>
<?php endif; ?>
<?php if(common::hasPriv('ai', 'createMiniProgram')): ?>
<?= html::a($this->createLink('ai', 'createMiniProgram'), "<i class='icon icon-plus'></i> " . $lang->ai->miniPrograms->create, '', "class='btn btn-primary'"); ?>
<?php endif; ?>
</div>
</div>
<div id="mainContent" class="main-row">
<div class="main-col col-8">
<div class="cell prompt-details">
<div class="detail">
<div class="detail-title"><?= $lang->ai->miniPrograms->fieldConfiguration; ?></div>
<table class="main-table table has-sort-head table-fixed">
<thead>
<tr>
<th><?= $lang->ai->miniPrograms->field->name; ?></th>
<th><?= $lang->ai->miniPrograms->field->type; ?></th>
<th><?= $lang->ai->miniPrograms->optionName; ?></th>
<th><?= $lang->ai->miniPrograms->field->placeholder; ?></th>
<th><?= $lang->ai->miniPrograms->field->required; ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($fields as $field) : ?>
<tr>
<td><?= $field->name; ?></td>
<td><?= $lang->ai->miniPrograms->field->typeList[$field->type]; ?></td>
<td><?= $field->options ?: '-'; ?></td>
<td><?= $field->placeholder ?: '-'; ?></td>
<td><?= $lang->ai->miniPrograms->field->requiredOptions[$field->required]; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<div class="cell prompt-details">
<div class="detail">
<div class="detail-title"><?= $lang->ai->miniPrograms->promptTemplate; ?></div>
<?php
$formatedPrompt = str_replace('&lt;', '<', $miniProgram->prompt);
$formatedPrompt = str_replace('&gt;', '>', $formatedPrompt);
$formatedPrompt = preg_replace('/<([^>]+)>/', '<strong><$1></strong>', $formatedPrompt);
?>
<div class="detail-content article-content" style="overflow-x: hidden!important;"><?= $formatedPrompt ?></div>
</div>
</div>
<div class="cell"><?php include '../../common/view/action.html.php'; ?></div>
<div class='main-actions'>
<div class="btn-toolbar">
<?= html::a($this->createLink('ai', 'miniPrograms'), '<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', "class='btn'"); ?>
<?php if($miniProgram->deleted !== '1'): ?>
<?= "<div class='divider'></div>"; ?>
<?php if($miniProgram->published === '1'): ?>
<?php if(common::hasPriv('ai', 'unpublishMiniProgram')): ?>
<button class="btn" onclick="openDisableDialog(event)">
<i class="icon-ban-circle icon-sm"></i> <?= $lang->ai->prompts->action->unpublish; ?>
</button>
<?php endif; ?>
<?php else: ?>
<?php if($isNotBuiltIn && common::hasPriv('ai', 'editMiniProgram')): ?>
<a class='btn' title='<?= $lang->ai->prompts->action->edit; ?>' href='<?= $this->createLink('ai', 'editMiniProgram', "appID=$miniProgram->id"); ?>'>
<i class='icon-edit icon-sm'></i> <?= $lang->ai->prompts->action->edit; ?>
</a>
<?php endif; ?>
<?php if($isNotBuiltIn && common::hasPriv('ai', 'testMiniProgram')): ?>
<button
class="btn iframe"
data-toggle="modal"
data-width="800"
data-height="600"
title="<?= $lang->ai->prompts->action->test; ?>"
data-iframe="<?= $this->createLink('ai', 'testMiniProgram', "appID={$miniProgram->id}&onlybody=yes"); ?>"
>
<i class="icon-menu-backend icon-sm"></i> <?= $lang->ai->prompts->action->test; ?>
</button>
<?php endif; ?>
<?php if(common::hasPriv('ai', 'publishMiniProgram')): ?>
<button class="btn" onclick="openPublishDialog(event)" title="<?= $lang->ai->prompts->action->publish; ?>">
<i class="icon-publish icon-sm"></i> <?= $lang->ai->prompts->action->publish; ?>
</button>
<?php endif; ?>
<?php if($isNotBuiltIn && common::hasPriv('ai', 'deleteMiniProgram')): ?>
<button class="btn" onclick="openDeleteDialog(event)" title="<?= $lang->ai->prompts->action->delete; ?>">
<i class="icon-trash icon-sm"></i> <?= $lang->ai->prompts->action->delete; ?>
</button>
<?php endif; ?>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
</div>
<div class="side-col col-4">
<div class="cell">
<div class='tabs'>
<ul class='nav nav-tabs'>
<li class='active'><a href='#promptBasicInfo' data-toggle='tab'><?= $lang->ai->prompts->basicInfo; ?></a></li>
</ul>
</div>
<div class='tab-content'>
<div class='tab-pane active' id='promptBasicInfo'>
<table class="table table-data">
<tbody>
<tr>
<th class="w-90px"><?= $lang->ai->miniPrograms->category; ?></th>
<td><?= $categoryList[$miniProgram->category]; ?></td>
</tr>
<tr>
<th class="w-90px"><?= $lang->prompt->name; ?></th>
<td><?= $miniProgram->name; ?></td>
</tr>
<tr>
<th class="w-90px"><?= $lang->ai->miniPrograms->desc; ?></th>
<td><?= $miniProgram->desc; ?></td>
</tr>
<tr>
<th class="w-90px"><?= $lang->prompt->model; ?></th>
<td><?= $lang->ai->miniPrograms->modelList[$miniProgram->model]; ?></td>
</tr>
<tr>
<th class="w-90px"><?= $lang->prompt->status; ?></th>
<td><?= $lang->ai->miniPrograms->publishedOptions[$miniProgram->published]; ?></td>
</tr>
<tr>
<th class="w-90px"><?= $lang->ai->miniPrograms->icon; ?></th>
<td>
<?php list($iconName, $iconTheme) = explode('-', $miniProgram->icon); ?>
<button class="btn btn-icon" style="width: 46px; height: 46px; display: flex; justify-content: center; align-items: center; border: 1px solid <?= $config->ai->miniPrograms->themeList[$iconTheme][1]; ?>; background-color: <?= $config->ai->miniPrograms->themeList[$iconTheme][0]; ?>">
<?= $config->ai->miniPrograms->iconList[$iconName]; ?>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="mainActions" class='main-actions'>
<?php common::printPreAndNext($preAndNext, helper::createLink('ai', 'miniProgramView', 'id=%d')); ?>
</div>
</div>
<?php include '../../common/view/footer.html.php'; ?>
-106
View File
@@ -1,106 +0,0 @@
<?php include '../../common/view/header.html.php'; ?>
<?php
js::set('currentField', $currentFields);
js::set('currentPrompt', $currentPrompt);
js::set('appID', $appID);
?>
<?php js::import($jsRoot . 'textcomplete/jquery.textcomplete.min.js'); ?>
<form action="<?= $this->createLink('ai', 'testMiniProgram', "appID=$appID"); ?>" method="post" style="width: 100%; height: 100%; display: flex; flex-direction: column; padding: 24px 32px 32px 32px; background: #fff; overflow: hidden;">
<strong style="font-size: 16px; padding-bottom: 16px;"><?= $lang->ai->prompts->action->test; ?></strong>
<div id="test-miniprogram">
<div style="flex-basis: 55%; border-right: 1px solid #E6EAF1; height: 100%;">
<div class="content-debug-area" style="height: 50%; display: flex; flex-direction: column;">
<div class="area-title">
<strong style="font-size: 14px;"><?php echo $lang->ai->miniPrograms->field->contentDebugging; ?></strong>
</div>
<div style="flex-grow: 1; overflow-y: auto; width: 100%; padding-right: 10px;">
<table class="table table-form">
<tbody class="field-content">
<?php foreach($currentFields as $key => $field): ?>
<tr data-id="<?= "field-$key"; ?>">
<th title="<?= $field->name; ?>">
<span class="field-name"><?= $field->name; ?></span>
</th>
<?php
$fieldOptions = array();
if (!empty($field->options))
{
$fieldOptions = explode(',', $field->options);
$fieldOptions = array_combine($fieldOptions, $fieldOptions);
}; ?>
<td data-type="<?= $field->type; ?>" <?= empty($field->required) ? '' : 'class="required"'; ?>>
<?php if($field->type === 'text') : ?>
<input type="text" class="form-control field-type" placeholder="<?= $field->placeholder; ?>">
<?php elseif($field->type === 'textarea') : ?>
<textarea class="form-control field-type" placeholder="<?= $field->placeholder; ?>"></textarea>
<?php elseif($field->type === 'radio') : ?>
<?= html::select('', $fieldOptions, '', 'class="form-control picker-select field-type"'); ?>
<?php else: ?>
<?= html::select('', $fieldOptions, '', 'class="form-control picker-select field-type" multiple'); ?>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<div class="prompt-design-area" style="height: 50%; position: relative; padding-top: 0;">
<div class="area-title">
<strong style="font-size: 14px;"><?php echo $lang->ai->miniPrograms->field->prompterDesign; ?></strong>
</div>
<div
class="form-control"
id="autocomplete-textarea"
contenteditable="true"></div>
</div>
</div>
<div style="flex-basis: 45%; height: 100%;">
<div class="prompt-preview-area" style="height: 50%; position: relative;">
<div class="area-title" style="display: flex; justify-content: space-between;">
<strong style="font-size: 14px;"><?php echo $lang->ai->miniPrograms->field->prompterPreview; ?></strong>
<button id="generate-result" class="btn btn-link" type="button" style="color: #2E7FFF; position: absolute; right: 16px; top: 10px;">
<i class="icon-publish text-primary"></i>
<?php echo $lang->ai->miniPrograms->field->generateResult; ?>
</button>
</div>
<div class="preview-container"></div>
</div>
<div class="prompt-result-area" style="height: 50%; position: relative; padding-top: 0;">
<div class="area-title">
<strong style="font-size: 14px;"><?php echo $lang->ai->miniPrograms->field->resultPreview; ?></strong>
</div>
<div class="preview-container" style="top: 32px;"></div>
</div>
</div>
</div>
<input type="text" class="hidden" name="prompt">
<input type="text" class="hidden" name="toPublish">
<div class="button-container" style="display: flex; justify-content: center; gap: 24px; padding-top: 16px;">
<button type="submit" class="btn btn-wide btn-secondary" onclick="saveMiniProgram()"><?= $lang->save; ?></button>
<?php if(common::hasPriv('ai', 'publishMiniProgram')): ?>
<button type="button" class="btn btn-wide btn-primary" onclick="openPublishDialog()"><?= $lang->ai->prompts->action->publish; ?></button>
<?php endif; ?>
</div>
<div class="modal fade" id="publish-miniprogram">
<div class="modal-dialog" style="width: 480px;">
<div class="modal-content">
<div class="modal-header" style="border-bottom: none; padding-left: 12px; display: flex; align-items: center;">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12.0159" cy="12.0163" r="12" transform="rotate(0.0777774 12.0159 12.0163)" fill="#FFA34D" />
<path d="M12.4516 14.621C12.8867 14.6215 13.3224 14.1498 13.3231 13.6775L13.6588 7.42006C13.6595 6.94777 13.661 6.00319 12.3559 6.0016C11.1595 6.00013 11.0495 6.8265 11.0486 7.41686L11.3655 13.6751C11.5823 14.1476 12.0166 14.6204 12.4516 14.621ZM12.4499 15.8017C11.7973 15.8009 11.1439 16.3905 11.1426 17.217C11.1416 17.9254 11.6843 18.6345 12.4456 18.6354C13.2069 18.6363 13.7516 18.0467 13.7528 17.2202C13.7541 16.3936 13.1024 15.8025 12.4499 15.8017Z" fill="white" />
</svg>
<span style="padding-left: 16px;"><?= $lang->ai->miniPrograms->publishTip; ?></span>
</div>
<div class="modal-footer" style="display: flex; justify-content: center; border-top: none; padding-top: 0;">
<button type="submit" class="btn btn-primary" onclick="publishMiniProgram()" data-dismiss="modal"><?= $lang->confirm; ?></button>
<button type="button" class="btn" data-dismiss="modal"><?= $lang->cancel; ?></button>
</div>
</div>
</div>
</div>
</form>
<?php include '../../common/view/footer.html.php'; ?>
+6 -6
View File
@@ -3851,9 +3851,9 @@ $config->group->package->manageMiniProgram = new stdclass();
$config->group->package->manageMiniProgram->order = 2150;
$config->group->package->manageMiniProgram->subset = 'ai';
$config->group->package->manageMiniProgram->privs = array();
$config->group->package->manageMiniProgram->privs['ai-createMiniProgram'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-editMiniProgram', 'ai-testMiniProgram'));
$config->group->package->manageMiniProgram->privs['ai-editMiniProgram'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 30, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-createMiniProgram', 'ai-publishMiniProgram'));
$config->group->package->manageMiniProgram->privs['ai-testMiniProgram'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 40, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView', 'aiapp-miniProgramChat'), 'recommend' => array('ai-createMiniProgram', 'ai-editMiniProgram', 'ai-publishMiniProgram'));
$config->group->package->manageMiniProgram->privs['ai-createMiniProgram'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-editMiniProgram', 'ai-testMiniProgram'));
$config->group->package->manageMiniProgram->privs['ai-editMiniProgram'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 30, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-createMiniProgram', 'ai-publishMiniProgram'));
$config->group->package->manageMiniProgram->privs['ai-testMiniProgram'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 40, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView', 'aiapp-miniProgramChat'), 'recommend' => array('ai-createMiniProgram', 'ai-editMiniProgram', 'ai-publishMiniProgram'));
$config->group->package->manageMiniProgram->privs['ai-editMiniProgramCategory'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 50, 'depend' => array('admin-index', 'ai-miniPrograms'), 'recommend' => array());
$config->group->package->browseMiniProgram = new stdclass();
@@ -3861,7 +3861,7 @@ $config->group->package->browseMiniProgram->order = 2160;
$config->group->package->browseMiniProgram->subset = 'ai';
$config->group->package->browseMiniProgram->privs = array();
$config->group->package->browseMiniProgram->privs['ai-miniPrograms'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('admin-index'), 'recommend' => array());
$config->group->package->browseMiniProgram->privs['ai-miniProgramView'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('admin-index', 'ai-miniPrograms'), 'recommend' => array());
$config->group->package->browseMiniProgram->privs['ai-miniProgramView'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('admin-index', 'ai-miniPrograms'), 'recommend' => array());
$config->group->package->miniProgramSquare = new stdclass();
$config->group->package->miniProgramSquare->order = 2170;
@@ -3883,13 +3883,13 @@ $config->group->package->deleteMiniProgram = new stdclass();
$config->group->package->deleteMiniProgram->order = 2190;
$config->group->package->deleteMiniProgram->subset = 'ai';
$config->group->package->deleteMiniProgram->privs = array();
$config->group->package->deleteMiniProgram->privs['ai-deleteMiniProgram'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-createMiniProgram', 'ai-publishMiniProgram', 'ai-testMiniProgram', 'ai-editMiniProgram'));
$config->group->package->deleteMiniProgram->privs['ai-deleteMiniProgram'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-createMiniProgram', 'ai-publishMiniProgram', 'ai-testMiniProgram', 'ai-editMiniProgram'));
$config->group->package->impAndExpMiniProgram = new stdclass();
$config->group->package->impAndExpMiniProgram->order = 2191;
$config->group->package->impAndExpMiniProgram->subset = 'ai';
$config->group->package->impAndExpMiniProgram->privs = array();
$config->group->package->impAndExpMiniProgram->privs['ai-exportMiniProgram'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-importMiniProgram'));
$config->group->package->impAndExpMiniProgram->privs['ai-exportMiniProgram'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('admin-index', 'ai-miniPrograms', 'ai-miniProgramView'), 'recommend' => array('ai-importMiniProgram'));
$config->group->package->impAndExpMiniProgram->privs['ai-importMiniProgram'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('admin-index', 'ai-miniPrograms'), 'recommend' => array('ai-exportMiniProgram'));
$config->group->package->resource = new stdclass();