mirror of
https://gitee.com/niucloud-team/niucloud-admin.git
synced 2025-12-14 19:52:48 +00:00
del
This commit is contained in:
parent
6924c3b7f9
commit
7ced735c3c
@ -1,36 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace addon\hello_world;
|
||||
|
||||
/**
|
||||
* 插件安装之后单独的插件方法
|
||||
* Class HelloWorld
|
||||
* @package addon\hello_world
|
||||
*/
|
||||
class Manage
|
||||
{
|
||||
/**
|
||||
* 插件安装执行
|
||||
*/
|
||||
public function install()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件卸载执行
|
||||
*/
|
||||
public function uninstall()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件升级执行
|
||||
*/
|
||||
public function upgrade()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
<template>
|
||||
<el-container class="w-screen h-screen">
|
||||
<el-header>
|
||||
<layout-header />
|
||||
</el-header>
|
||||
<el-main>
|
||||
<router-view></router-view>
|
||||
</el-main>
|
||||
<el-footer>
|
||||
<div class="w-full h-full bg-[#f7f7f7] flex items-center justify-center">
|
||||
Footer
|
||||
</div>
|
||||
</el-footer>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import layoutHeader from '@/layout/default/components/header/index.vue'
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@ -1,40 +0,0 @@
|
||||
<template>
|
||||
<!-- 内容 -->
|
||||
<div class="content-wrap" v-show="diyStore.editTab == 'content'">
|
||||
<div class="edit-attr-item-wrap">
|
||||
<h3 class="mb-[10px]">文本设置</h3>
|
||||
<el-form label-width="80px" class="px-[10px]">
|
||||
<el-form-item :label="t('blankHeight')">
|
||||
<el-slider v-model="diyStore.editComponent.height" show-input size="small" class="ml-[10px] horz-blank-slider"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 样式 -->
|
||||
<div class="style-wrap" v-show="diyStore.editTab == 'style'">
|
||||
<!-- 组件样式 -->
|
||||
<slot name="style"></slot>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {t} from '@/lang'
|
||||
import useDiyStore from '@/stores/modules/diy'
|
||||
|
||||
const diyStore = useDiyStore()
|
||||
diyStore.editComponent.ignore = []; // 忽略公共属性
|
||||
|
||||
defineExpose({})
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.horz-blank-slider {
|
||||
.el-slider__input {
|
||||
width: 100px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
@ -1,12 +0,0 @@
|
||||
<template>
|
||||
<div class="main-container">
|
||||
<el-card class="box-card !border-none" shadow="never">
|
||||
测试页面
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@ -1,12 +0,0 @@
|
||||
<template>
|
||||
<div class="main-container">
|
||||
<el-card class="box-card !border-none" shadow="never">
|
||||
站点测试页面
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
@ -1,28 +0,0 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | Niucloud-admin 企业快速开发的多应用管理平台
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网址:https://www.niucloud.com
|
||||
// +----------------------------------------------------------------------
|
||||
// | niucloud团队 版权所有 开源版本可自由商用
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Niucloud Team
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
namespace addon\hello_world\app\adminapi\controller;
|
||||
|
||||
|
||||
use core\base\BaseAdminController;
|
||||
|
||||
class Index extends BaseAdminController
|
||||
{
|
||||
/**
|
||||
* 接口数据
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return success("HELLO_WORLD_RETURN");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,19 +0,0 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | Niucloud-admin 企业快速开发的多应用管理平台
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网址:https://www.niucloud.com
|
||||
// +----------------------------------------------------------------------
|
||||
// | niucloud团队 版权所有 开源版本可自由商用
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Niucloud Team
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
use think\facade\Route;
|
||||
|
||||
/**
|
||||
* 路由(注意最好group路由名称与插件名称一致,防止路由冲突)
|
||||
*/
|
||||
Route::group("hello_world", function () {
|
||||
Route::get('index', 'addon\hello_world\app\adminapi\controller\Index@index');
|
||||
});
|
||||
@ -1 +0,0 @@
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'BASIC' => [
|
||||
'title' => get_lang('dict_diy.component_type_basic'),
|
||||
'list' => [
|
||||
'HelloText' => [
|
||||
'title' => 'hello文本',
|
||||
'icon' => 'iconfont-iconhuiyuanzhongxin',
|
||||
'path' => 'edit-hello-text',
|
||||
'support_page' => [],
|
||||
'uses' => 0,
|
||||
'sort' => 10007,
|
||||
'value' => [
|
||||
'height' => 20
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'HELLO_WORLD_LINK' => [
|
||||
'key' => 'hello_world',
|
||||
'addon_title' => get_lang('dict_diy.hello_world_title'),
|
||||
'title' => get_lang('dict_diy.hello_world_link'),
|
||||
'child_list' => [
|
||||
[
|
||||
'name' => 'HELLO_WORLD_INDEX',
|
||||
'title' => get_lang('dict_diy.hello_world_index'),
|
||||
'url' => '/hello_world/pages/index',
|
||||
'is_share' => 1,
|
||||
'action' => ''
|
||||
],
|
||||
[
|
||||
'name' => 'HELLO_WORLD_INFO',
|
||||
'title' => get_lang('dict_diy.hello_world_info'),
|
||||
'url' => '/hello_world/pages/info',
|
||||
'is_share' => 1,
|
||||
'action' => ''
|
||||
],
|
||||
]
|
||||
],
|
||||
];
|
||||
@ -1,90 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'DIY_INDEX' => [
|
||||
'hello_world_index' => [ // 页面标识
|
||||
"title" => "hello world 首页", // 页面名称
|
||||
'cover' => '', // 页面封面图
|
||||
'preview' => '', // 页面预览图
|
||||
'desc' => '', // 页面描述
|
||||
'mode' => 'diy', // 页面模式:diy:自定义,fixed:固定
|
||||
// 页面数据源
|
||||
"data" => [
|
||||
"global" => [
|
||||
"title" => "hello world首页页面",
|
||||
"pageBgColor" => "#F8F8F8",
|
||||
'bgUrl' => '',
|
||||
'imgWidth' => '',
|
||||
'imgHeight' => '',
|
||||
"bottomTabBarSwitch" => true,
|
||||
"template" => [
|
||||
'textColor' => "#303133",
|
||||
"pageBgColor" => "",
|
||||
"componentBgColor" => "",
|
||||
"topRounded" => 0,
|
||||
"bottomRounded" => 0,
|
||||
"elementBgColor" => "",
|
||||
"topElementRounded" => 0,
|
||||
"bottomElementRounded" => 0,
|
||||
"margin" => [
|
||||
"top" => 0,
|
||||
"bottom" => 0,
|
||||
"both" => 0
|
||||
]
|
||||
],
|
||||
'topStatusBar' => [
|
||||
'bgColor' => "#ffffff",
|
||||
'isTransparent' => false,
|
||||
'isShow' => true,
|
||||
'style' => 'style-1',
|
||||
'textColor' => "#333333",
|
||||
'textAlign' => 'center',
|
||||
],
|
||||
'popWindow' => [
|
||||
'imgUrl' => "",
|
||||
'imgWidth' => '',
|
||||
'imgHeight' => '',
|
||||
'count' => -1,
|
||||
'show' => 0,
|
||||
'link' => [
|
||||
'name' => ""
|
||||
],
|
||||
]
|
||||
],
|
||||
"value" => [
|
||||
[
|
||||
"path" => "edit-image-ads",
|
||||
"id" => "4640ld4k1pu0",
|
||||
"componentName" => "ImageAds",
|
||||
"componentTitle" => "图片广告",
|
||||
"uses" => 0,
|
||||
"list" => [
|
||||
[
|
||||
"link" => [
|
||||
"name" => ""
|
||||
],
|
||||
"imageUrl" => "static/resource/images/diy/banner.png",
|
||||
"imgWidth" => 750,
|
||||
"imgHeight" => 320,
|
||||
"id" => "2xuytp7622w0"
|
||||
]
|
||||
],
|
||||
"ignore" => [],
|
||||
"pageBgColor" => "",
|
||||
"componentBgColor" => "",
|
||||
"topRounded" => 0,
|
||||
"bottomRounded" => 0,
|
||||
"elementBgColor" => "",
|
||||
"topElementRounded" => 0,
|
||||
"bottomElementRounded" => 0,
|
||||
"margin" => [
|
||||
"top" => 0,
|
||||
"bottom" => 0,
|
||||
"both" => 0
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'DIY_HELLO_WORLD_INDEX' => [
|
||||
'title' => get_lang('dict_diy.page_hello_world_index'),
|
||||
'page' => '/hello_world/pages/index',
|
||||
'action' => ''
|
||||
],
|
||||
'DIY_HELLO_WORLD_INFO' => [
|
||||
'title' => get_lang('dict_diy.page_hello_world_info'),
|
||||
'page' => '/hello_world/pages/info',
|
||||
'action' => ''
|
||||
],
|
||||
];
|
||||
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
|
||||
use app\dict\member\MemberAccountTypeDict;
|
||||
|
||||
return [
|
||||
MemberAccountTypeDict::POINT => [
|
||||
//调整
|
||||
'hello_world_test' => [
|
||||
//名称
|
||||
'name' => "hello_world账户变化",
|
||||
//是否增加
|
||||
'inc' => 1,
|
||||
//是否减少
|
||||
'dec' => 1,
|
||||
],
|
||||
|
||||
],
|
||||
];
|
||||
@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
[
|
||||
'menu_name' => '插件菜单',
|
||||
'menu_key' => 'niucloud_hello',
|
||||
'menu_type' => 1,
|
||||
'icon' => 'iconfont-iconyingyongshichang',
|
||||
'api_url' => '',
|
||||
'router_path' => 'hello_world',
|
||||
'view_path' => 'hello_world/index',
|
||||
'methods' => '',
|
||||
'sort' => 90,
|
||||
'status' => 1,
|
||||
'is_show' => 1,
|
||||
],
|
||||
];
|
||||
@ -1,36 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
[
|
||||
'menu_name' => '插件站点菜单',
|
||||
'menu_key' => 'niucloud_site_hello',
|
||||
'menu_type' => 1,
|
||||
'icon' => 'iconfont-iconyingyongshichang',
|
||||
'api_url' => '',
|
||||
'router_path' => 'hello_world',
|
||||
'view_path' => 'hello_world/site',
|
||||
'methods' => '',
|
||||
'sort' => 90,
|
||||
'status' => 1,
|
||||
'is_show' => 1,
|
||||
],
|
||||
/* [
|
||||
'menu_name' => '会员列表',
|
||||
'menu_key' => 'member_list',
|
||||
'parent_key' => 'member',
|
||||
'menu_type' => 1,
|
||||
'icon' => 'iconfont-iconhuiyuanliebiao',
|
||||
'api_url' => 'member/member',
|
||||
'router_path' => 'hello_world_member_list',
|
||||
'view_path' => 'hello_world/member',
|
||||
'methods' => 'get',
|
||||
'sort' => 100,
|
||||
'status' => 1,
|
||||
'is_show' => 1,
|
||||
'children' => [
|
||||
|
||||
]
|
||||
],
|
||||
"delete" => "member" //针对修改系统菜单处理方式,可以删除系统菜单,设置对应key值,也可删除不需要的菜单处理
|
||||
*/
|
||||
];
|
||||
@ -1,19 +0,0 @@
|
||||
<?php
|
||||
return [
|
||||
//充值成功通知,站点端发送
|
||||
'recharge_success' => [
|
||||
'addon' => 'hello_world',
|
||||
'key' => 'recharge_success',
|
||||
'receiver_type' => 1,
|
||||
'name' => '充值成功通知',
|
||||
'title' => '会员充值成功后发送',
|
||||
'async' => true,
|
||||
'variable' => [
|
||||
'price' => '充值金额',
|
||||
'balance' => '充值后账户',
|
||||
'time' => '充值时间',
|
||||
'trade_no' => '交易单号'
|
||||
],
|
||||
]
|
||||
|
||||
];
|
||||
@ -1,7 +0,0 @@
|
||||
<?php
|
||||
return [
|
||||
'recharge_success' => [
|
||||
'content' => '您充值金额¥{price}, 充值后金额¥{balance}',
|
||||
]
|
||||
|
||||
];
|
||||
@ -1,14 +0,0 @@
|
||||
<?php
|
||||
return [
|
||||
'recharge_success' => [
|
||||
'tid' => '755',
|
||||
'content' => [
|
||||
['交易单号', '{trade_no}', 'keyword1'],
|
||||
['充值金额', '{price}', 'keyword2'],
|
||||
['账户余额', '{balance}', 'keyword3'],
|
||||
['充值时间', '{time}', 'keyword4'],
|
||||
],
|
||||
'kid_list' => [1, 3, 4, 2],
|
||||
'scene_desc' => ''
|
||||
]
|
||||
];
|
||||
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
return [
|
||||
'recharge_success' => [
|
||||
'temp_key' => '52552',
|
||||
'keyword_name_list' => [ '充值时间', '充值金额' ],
|
||||
'content' => [
|
||||
[ '充值时间', '{time}', 'time1' ],
|
||||
[ '充值金额', '{price}', 'amount3' ],
|
||||
]
|
||||
]
|
||||
];
|
||||
@ -1,15 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
[
|
||||
'key' => 'addon_schedule',
|
||||
'name' => '插件计划任务',
|
||||
'desc' => '',
|
||||
'time' => [
|
||||
'type' => 'min',
|
||||
'min' => 1
|
||||
],
|
||||
'class' => 'addon\hello_world\app\job\AddonSchedule',
|
||||
'function' => ''
|
||||
],
|
||||
];
|
||||
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
//文件执行序列号
|
||||
'bind' => [
|
||||
],
|
||||
|
||||
'listen' => [
|
||||
|
||||
//应用管理
|
||||
'AppManage' => ['addon\hello_world\app\listener\AppManageListener'],
|
||||
],
|
||||
|
||||
'subscribe' => [
|
||||
],
|
||||
];
|
||||
@ -1,27 +0,0 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | Niucloud-admin 企业快速开发的多应用管理平台
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网址:https://www.niucloud.com
|
||||
// +----------------------------------------------------------------------
|
||||
// | niucloud团队 版权所有 开源版本可自由商用
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Niucloud Team
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
namespace addon\hello_world\app\job;
|
||||
|
||||
use core\base\BaseJob;
|
||||
use think\facade\Log;
|
||||
|
||||
/**
|
||||
* 插件计划任务
|
||||
*/
|
||||
class AddonSchedule extends BaseJob
|
||||
{
|
||||
public function doJob()
|
||||
{
|
||||
Log::write('插件计划任务,执行时间:'.date('Y-m-d h:i:s'));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | Niucloud-admin 企业快速开发的多应用管理平台
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网址:https://www.niucloud.com
|
||||
// +----------------------------------------------------------------------
|
||||
// | niucloud团队 版权所有 开源版本可自由商用
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Niucloud Team
|
||||
// +----------------------------------------------------------------------
|
||||
/**
|
||||
* 插件api接口语言
|
||||
*/
|
||||
return [
|
||||
//系统常用
|
||||
'HELLO_WORLD_RETURN' => 'hello world演示数据',
|
||||
];
|
||||
@ -1,27 +0,0 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | Niucloud-admin 企业快速开发的多应用管理平台
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网址:https://www.niucloud.com
|
||||
// +----------------------------------------------------------------------
|
||||
// | niucloud团队 版权所有 开源版本可自由商用
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Niucloud Team
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* 插件枚举语言
|
||||
*/
|
||||
return [
|
||||
'dict_diy' => [
|
||||
'page_hello_world_index' => 'hello 首页',
|
||||
'page_hello_world_info' => 'hello 信息',
|
||||
'hello_world_title' => 'hello world',
|
||||
'hello_world_link' => 'hello world链接',
|
||||
'hello_world_index' => 'hello world index 插件',
|
||||
'hello_world_info' => 'hello world info 插件'
|
||||
],
|
||||
'dict_site_layout' => [
|
||||
'hellow_world' => '你好'
|
||||
]
|
||||
];
|
||||
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | Niucloud-admin 企业快速开发的多应用管理平台
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网址:https://www.niucloud.com
|
||||
// +----------------------------------------------------------------------
|
||||
// | niucloud团队 版权所有 开源版本可自由商用
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Niucloud Team
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* 插件验证多语言
|
||||
*/
|
||||
return [
|
||||
'file_sort' => 100,
|
||||
|
||||
];
|
||||
@ -1,47 +0,0 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | Niucloud-admin 企业快速开发的多应用管理平台
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网址:https://www.niucloud.com
|
||||
// +----------------------------------------------------------------------
|
||||
// | niucloud团队 版权所有 开源版本可自由商用
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: Niucloud Team
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
|
||||
namespace addon\hello_world\app\listener;
|
||||
|
||||
/**
|
||||
* 应用管理
|
||||
* Class AppManage
|
||||
* @package app\listener\hello_world
|
||||
*/
|
||||
class AppManageListener
|
||||
{
|
||||
/**
|
||||
* 应用管理
|
||||
* @return array
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
return [
|
||||
"category" => [
|
||||
//插件如果要单独分类展示,需要专门定义
|
||||
[
|
||||
"key" => "hello_world_category",
|
||||
"name" => "第三方应用",
|
||||
],
|
||||
],
|
||||
[
|
||||
"addon" => "hello_world",
|
||||
"title" => "hello world",
|
||||
"category" => "hello_world_category", //设置插件对应展示分类,默认basic
|
||||
"desc" => "hello world 应用展示",
|
||||
"icon" => addon_resource("hello_world", "icon.png"), //图标
|
||||
"cover" => "", //封面
|
||||
"url" => "/hello_world"
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
{
|
||||
"title": "hello world",
|
||||
"desc": "Niucloud hello world演示插件",
|
||||
"key": "hello_world",
|
||||
"version": "1.0.1",
|
||||
"author": "niucloud",
|
||||
"type": "addon",
|
||||
"support_app": ""
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
{
|
||||
"dependencies": {
|
||||
}
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
{
|
||||
"require": {
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"weixin-js-sdk": "^1.6.0"
|
||||
}
|
||||
}
|
||||
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
return [
|
||||
'pages' => <<<EOT
|
||||
// PAGE_BEGIN
|
||||
{
|
||||
"path": "{{addon_name}}/pages/index",
|
||||
"style": {
|
||||
// #ifdef H5
|
||||
"navigationStyle": "custom",
|
||||
// #endif
|
||||
"navigationBarTitleText": "%{{addon_name}}.pages.index%"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "{{addon_name}}/pages/info",
|
||||
"style": {
|
||||
// #ifdef H5
|
||||
"navigationStyle": "custom",
|
||||
// #endif
|
||||
"navigationBarTitleText": "%{{addon_name}}.pages.info%"
|
||||
}
|
||||
}
|
||||
// PAGE_END
|
||||
EOT
|
||||
];
|
||||
@ -1,4 +0,0 @@
|
||||
{
|
||||
"dependencies": {
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 128 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 673 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,6 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `{{prefix}}hello_world` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='演示插件表';
|
||||
INSERT INTO `{{prefix}}hello_world`(`name`) VALUES ('名称');
|
||||
@ -1 +0,0 @@
|
||||
DROP TABLE IF EXISTS `{{prefix}}hello_world`;
|
||||
@ -1,34 +0,0 @@
|
||||
<template>
|
||||
<view :style="warpCss">
|
||||
hello-world:演示插件文本——自定义组件
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue';
|
||||
import useDiyStore from '@/app/stores/diy';
|
||||
|
||||
const props = defineProps(['component', 'index']);
|
||||
|
||||
const diyStore = useDiyStore();
|
||||
|
||||
const diyComponent = computed(() => {
|
||||
if (diyStore.mode == 'decorate') {
|
||||
return diyStore.value[props.index];
|
||||
} else {
|
||||
return props.component;
|
||||
}
|
||||
})
|
||||
|
||||
const warpCss = computed(() => {
|
||||
var style = '';
|
||||
style += 'background-color:' + diyComponent.value.componentBgColor + ';';
|
||||
style += 'border-top-left-radius:' + diyComponent.value.topRounded * 2 + 'rpx;';
|
||||
style += 'border-top-right-radius:' + diyComponent.value.topRounded * 2 + 'rpx;';
|
||||
style += 'border-bottom-left-radius:' + diyComponent.value.bottomRounded * 2 + 'rpx;';
|
||||
style += 'border-bottom-right-radius:' + diyComponent.value.bottomRounded * 2 + 'rpx;';
|
||||
return style;
|
||||
})
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
@ -1,14 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
hello-index,固定模板示例,我也可以装修
|
||||
<!-- 自定义模板渲染 -->
|
||||
<diy-group :data="props.data" :pullDownRefreshCount="props.pullDownRefreshCount"></diy-group>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, watch } from 'vue';
|
||||
const props = defineProps(['data', 'pullDownRefreshCount']);
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
@ -1,4 +0,0 @@
|
||||
{
|
||||
"pages.index": "hello_world index",
|
||||
"pages.info": "hello_world info"
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
{
|
||||
"pages.index": "hello_world首页",
|
||||
"pages.info": "hello_world详情"
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
{
|
||||
"list": "文章列表",
|
||||
"noData": "~ 暂无数据 ~",
|
||||
"all": "全部",
|
||||
"end": "-- 到底了 --",
|
||||
"searchPlaceholder": "请输入搜索关键词"
|
||||
}
|
||||
@ -1,166 +0,0 @@
|
||||
<template>
|
||||
<view class="bg-gray-100 min-h-[100vh]">
|
||||
<view class="fixed top-0 inset-x-0 z-10">
|
||||
<view
|
||||
class='p-[10px] bg-white border-solid border-t-0 border-l-0 border-r-0 border-b-[1px] border-gray-200'>
|
||||
<u-search :placeholder="t('searchPlaceholder')" actionText :actionStyle="{'width':0,'margin':0}"
|
||||
v-model="articleTitle" @clickIcon="searchFn"></u-search>
|
||||
</view>
|
||||
<scroll-view :scroll-x="true" :enable-flex="true"
|
||||
class="nav-list bg-white align-center px-[10px] box-border">
|
||||
<view class="flex scroll-view-wrap">
|
||||
<view
|
||||
:class="['nav-item text-[14px] mx-[5px] h-[30px] leading-[30px] my-[5px] border-t-0 border-l-0 border-r-0',{'border-solid border-b-[2px] active': currCategoryId==item.category_id}]"
|
||||
@click="loadCategory(item.category_id)" v-for="(item,index) in categoryList"
|
||||
:key="item.category_id">
|
||||
{{item.name}}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
|
||||
<mescroll-body ref="mescrollRef" @init="mescrollInit" top="220rpx" @down="downCallback" @up="getArticleListFn">
|
||||
<view v-for="(item,index) in articleList" :key="item.id"
|
||||
:class="['bg-white flex align-center p-[10px]',{'border-solid border-t-0 border-l-0 border-r-0 border-b-[1px] border-gray-200': articleList.length-1 !== index}] "
|
||||
@click="toLink(item.id)">
|
||||
<u--image width="260rpx" height="200rpx" :src="img(item.image)" v-if="item.image" model="aspectFill">
|
||||
<template #error>
|
||||
<u-icon name="photo" color="#999" size="50"></u-icon>
|
||||
</template>
|
||||
</u--image>
|
||||
<view class="flex-1 flex flex-col justify-between ml-[10px]">
|
||||
<view class="text-[16px] leading-[1.3] multi-hidden mt-[2px]">{{item.title}}</view>
|
||||
<view class="text-[14px] using-hidden mb-[auto] mt-[10px] text-gray-500">{{item.summary}}</view>
|
||||
<view class="text-[12px] text-gray-400 flex justify-between mb-[5px]">
|
||||
<text class="">{{item.create_time}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<mescroll-empty v-if="!articleList.length && loading"></mescroll-empty>
|
||||
</mescroll-body>
|
||||
<tabbar />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, onMounted } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { t } from '@/locale'
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import { getArticleList, getArticleCategory } from '@/cms/api/article';
|
||||
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
|
||||
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
|
||||
import { onPageScroll, onReachBottom } from '@dcloudio/uni-app';
|
||||
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom);
|
||||
import { useShare } from '@/hooks/useShare'
|
||||
|
||||
const { setShare, onShareAppMessage, onShareTimeline } = useShare()
|
||||
setShare()
|
||||
onShareAppMessage()
|
||||
onShareTimeline()
|
||||
|
||||
let categoryList = ref<Array<Object>>([]);
|
||||
let articleList = ref<Array<any>>([]);
|
||||
let currCategoryId = ref<number | string>('');
|
||||
let articleTitle = ref<string>('');
|
||||
let mescrollRef = ref(null);
|
||||
let loading = ref<boolean>(false);
|
||||
|
||||
interface acceptingDataStructure {
|
||||
data : acceptingDataItemStructure,
|
||||
msg : string,
|
||||
code : number
|
||||
}
|
||||
interface acceptingDataItemStructure {
|
||||
data : object,
|
||||
[propName : string] : number | string | object
|
||||
}
|
||||
onLoad(async () => {
|
||||
await getArticleCategory().then((res : acceptingDataStructure) => {
|
||||
const initData = { name: t("all"), category_id: '' };
|
||||
categoryList.value.push(initData);
|
||||
categoryList.value = categoryList.value.concat(res.data.data);
|
||||
});
|
||||
})
|
||||
|
||||
interface mescrollStructure {
|
||||
num : number,
|
||||
size : number,
|
||||
endSuccess : Function,
|
||||
[propName : string] : any
|
||||
}
|
||||
const getArticleListFn = (mescroll : mescrollStructure) => {
|
||||
loading.value = false;
|
||||
let data : object = {
|
||||
category_id: currCategoryId.value,
|
||||
title: articleTitle.value,
|
||||
page: mescroll.num,
|
||||
limit: mescroll.size
|
||||
};
|
||||
|
||||
getArticleList(data).then((res : acceptingDataStructure) => {
|
||||
let newArr = (res.data.data as Array<Object>);
|
||||
//设置列表数据
|
||||
if (mescroll.num == 1) {
|
||||
articleList.value = []; //如果是第一页需手动制空列表
|
||||
}
|
||||
articleList.value = articleList.value.concat(newArr);
|
||||
mescroll.endSuccess(newArr.length);
|
||||
loading.value = true;
|
||||
}).catch(() => {
|
||||
loading.value = true;
|
||||
mescroll.endErr(); // 请求失败, 结束加载
|
||||
})
|
||||
}
|
||||
|
||||
const loadCategory = (id : string) => {
|
||||
currCategoryId.value = id;
|
||||
getMescroll().resetUpScroll();
|
||||
}
|
||||
|
||||
const searchFn = () => {
|
||||
getMescroll().resetUpScroll();
|
||||
}
|
||||
|
||||
const toLink = (id : string) => {
|
||||
redirect({ url: '/cms/pages/detail', param: { id } })
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
setTimeout(() => {
|
||||
getMescroll().optUp.textNoMore = t("end");
|
||||
}, 500)
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.nav-item.active {
|
||||
color: $u-primary;
|
||||
}
|
||||
|
||||
.scroll-view-wrap {
|
||||
word-break: keep-all;
|
||||
}
|
||||
|
||||
/* 单行超出隐藏 */
|
||||
.using-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 1;
|
||||
-webkit-box-orient: vertical;
|
||||
white-space: break-spaces;
|
||||
}
|
||||
|
||||
/* 多行超出隐藏 */
|
||||
.multi-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
</style>
|
||||
@ -1,166 +0,0 @@
|
||||
<template>
|
||||
<view class="bg-gray-100 min-h-[100vh]">
|
||||
<view class="fixed top-0 inset-x-0 z-10">
|
||||
<view
|
||||
class='p-[10px] bg-white border-solid border-t-0 border-l-0 border-r-0 border-b-[1px] border-gray-200'>
|
||||
<u-search :placeholder="t('searchPlaceholder')" actionText :actionStyle="{'width':0,'margin':0}"
|
||||
v-model="articleTitle" @clickIcon="searchFn"></u-search>
|
||||
</view>
|
||||
<scroll-view :scroll-x="true" :enable-flex="true"
|
||||
class="nav-list bg-white align-center px-[10px] box-border">
|
||||
<view class="flex scroll-view-wrap">
|
||||
<view
|
||||
:class="['nav-item text-[14px] mx-[5px] h-[30px] leading-[30px] my-[5px] border-t-0 border-l-0 border-r-0',{'border-solid border-b-[2px] active': currCategoryId==item.category_id}]"
|
||||
@click="loadCategory(item.category_id)" v-for="(item,index) in categoryList"
|
||||
:key="item.category_id">
|
||||
{{item.name}}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
|
||||
<mescroll-body ref="mescrollRef" @init="mescrollInit" top="220rpx" @down="downCallback" @up="getArticleListFn">
|
||||
<view v-for="(item,index) in articleList" :key="item.id"
|
||||
:class="['bg-white flex align-center p-[10px]',{'border-solid border-t-0 border-l-0 border-r-0 border-b-[1px] border-gray-200': articleList.length-1 !== index}] "
|
||||
@click="toLink(item.id)">
|
||||
<u--image width="260rpx" height="200rpx" :src="img(item.image)" v-if="item.image" model="aspectFill">
|
||||
<template #error>
|
||||
<u-icon name="photo" color="#999" size="50"></u-icon>
|
||||
</template>
|
||||
</u--image>
|
||||
<view class="flex-1 flex flex-col justify-between ml-[10px]">
|
||||
<view class="text-[16px] leading-[1.3] multi-hidden mt-[2px]">{{item.title}}</view>
|
||||
<view class="text-[14px] using-hidden mb-[auto] mt-[10px] text-gray-500">{{item.summary}}</view>
|
||||
<view class="text-[12px] text-gray-400 flex justify-between mb-[5px]">
|
||||
<text class="">{{item.create_time}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<mescroll-empty v-if="!articleList.length && loading"></mescroll-empty>
|
||||
</mescroll-body>
|
||||
<tabbar />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, onMounted } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { t } from '@/locale'
|
||||
import { redirect, img } from '@/utils/common';
|
||||
import { getArticleList, getArticleCategory } from '@/cms/api/article';
|
||||
import MescrollBody from '@/components/mescroll/mescroll-body/mescroll-body.vue';
|
||||
import MescrollEmpty from '@/components/mescroll/mescroll-empty/mescroll-empty.vue';
|
||||
import useMescroll from '@/components/mescroll/hooks/useMescroll.js';
|
||||
import { onPageScroll, onReachBottom } from '@dcloudio/uni-app';
|
||||
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom);
|
||||
import { useShare } from '@/hooks/useShare'
|
||||
|
||||
const { setShare, onShareAppMessage, onShareTimeline } = useShare()
|
||||
setShare()
|
||||
onShareAppMessage()
|
||||
onShareTimeline()
|
||||
|
||||
let categoryList = ref<Array<Object>>([]);
|
||||
let articleList = ref<Array<any>>([]);
|
||||
let currCategoryId = ref<number | string>('');
|
||||
let articleTitle = ref<string>('');
|
||||
let mescrollRef = ref(null);
|
||||
let loading = ref<boolean>(false);
|
||||
|
||||
interface acceptingDataStructure {
|
||||
data : acceptingDataItemStructure,
|
||||
msg : string,
|
||||
code : number
|
||||
}
|
||||
interface acceptingDataItemStructure {
|
||||
data : object,
|
||||
[propName : string] : number | string | object
|
||||
}
|
||||
onLoad(async () => {
|
||||
await getArticleCategory().then((res : acceptingDataStructure) => {
|
||||
const initData = { name: t("all"), category_id: '' };
|
||||
categoryList.value.push(initData);
|
||||
categoryList.value = categoryList.value.concat(res.data.data);
|
||||
});
|
||||
})
|
||||
|
||||
interface mescrollStructure {
|
||||
num : number,
|
||||
size : number,
|
||||
endSuccess : Function,
|
||||
[propName : string] : any
|
||||
}
|
||||
const getArticleListFn = (mescroll : mescrollStructure) => {
|
||||
loading.value = false;
|
||||
let data : object = {
|
||||
category_id: currCategoryId.value,
|
||||
title: articleTitle.value,
|
||||
page: mescroll.num,
|
||||
limit: mescroll.size
|
||||
};
|
||||
|
||||
getArticleList(data).then((res : acceptingDataStructure) => {
|
||||
let newArr = (res.data.data as Array<Object>);
|
||||
//设置列表数据
|
||||
if (mescroll.num == 1) {
|
||||
articleList.value = []; //如果是第一页需手动制空列表
|
||||
}
|
||||
articleList.value = articleList.value.concat(newArr);
|
||||
mescroll.endSuccess(newArr.length);
|
||||
loading.value = true;
|
||||
}).catch(() => {
|
||||
loading.value = true;
|
||||
mescroll.endErr(); // 请求失败, 结束加载
|
||||
})
|
||||
}
|
||||
|
||||
const loadCategory = (id : string) => {
|
||||
currCategoryId.value = id;
|
||||
getMescroll().resetUpScroll();
|
||||
}
|
||||
|
||||
const searchFn = () => {
|
||||
getMescroll().resetUpScroll();
|
||||
}
|
||||
|
||||
const toLink = (id : string) => {
|
||||
redirect({ url: '/cms/pages/detail', param: { id } })
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
setTimeout(() => {
|
||||
getMescroll().optUp.textNoMore = t("end");
|
||||
}, 500)
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.nav-item.active {
|
||||
color: $u-primary;
|
||||
}
|
||||
|
||||
.scroll-view-wrap {
|
||||
word-break: keep-all;
|
||||
}
|
||||
|
||||
/* 单行超出隐藏 */
|
||||
.using-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 1;
|
||||
-webkit-box-orient: vertical;
|
||||
white-space: break-spaces;
|
||||
}
|
||||
|
||||
/* 多行超出隐藏 */
|
||||
.multi-hidden {
|
||||
word-break: break-all;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
</style>
|
||||
Loading…
x
Reference in New Issue
Block a user