1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xianrenqh-huicmf_tp6

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

HuiCMF v6.0

=========== ==

OSCS Status

项目地址:

ps: синхронизация обновлений.

Github

https://github.com/xianrenqh/huicmf_tp6

Gitee

https://gitee.com/xianrenqh/huicmf_tp6


Быстроразвивающаяся система управления на основе ThinkPHP6.0 и layui для бэкенда.

Предназначена для изучения и допускает коммерческое использование.

Требования к среде выполнения: PHP7.2+ (совместима с PHP8.0), Redis.

Требования к базе данных: MySQL5.6+, рекомендуется 5.7.

В редакторе используются editor.md, UEeditor, icEditor.

Поддерживаются плагины (используются расширения think-addons).

По умолчанию в системе используется кэш redis. Сначала необходимо установить и включить redis.

Если вы не хотите использовать redis, измените значение DRIVER = redis в файле .env в корневом каталоге на file.

Другие примечания

Преобразование IP в регион, по умолчанию используется чистая база данных (необходимо обновить базу данных позже).

Обновление базы данных:

  1. Откройте файл /vendor/itbdw/ip-database/bin/update-ip.php.
  2. Измените комментарий примерно в строке 22 на //die("Эта функция больше не доступна");
  3. В текущем каталоге (/vendor/itbdw/ip-database/bin/) выполните команду (Linux): php update-ip.php -d=../src/libs
  4. После выполнения загрузится последняя версия базы данных, которая будет размещена в: /vendor/itbdw/ip-database/src/libs.

Установка

  • Сначала: клонируйте данные с помощью git.
  • Затем: обновите данные с помощью composer.
  • Далее: скопируйте файл .example.env в корневой каталог и переименуйте его в .env (удалите .example).
  • Доступ: http://ваш домен/install.
  • Выполните программу установки.
  • Наконец, получите доступ к бэкэнду: http://вашдомен/сгенерированныйбезопасныйкод.php.
  • По умолчанию учётные данные бэкэнда: admin admin888.

Примечание:

Если после переноса сайта появляется сообщение об ошибке «No input file specified», удалите файл .user.ini в папке public.

Пароль для доступа к бэкэнду можно изменить в разделе «Система управления — Системные настройки — Настройки безопасности»: «Бэкэнд с паролем». Не забудьте, что изменять файлы в папке public напрямую нельзя.

Демонстрация бэкэнда

https://huicmf6.xiaohuihui.club/admin.php

Учётная запись: admin

Пароль: admin888

Использование

  1. Все контроллеры должны наследовать AdminController.

  2. Используется аннотация авторизации:

Аннотация авторизации

Аннотация авторизации применяется только к контроллерам бэкэнда, то есть к приложениям в каталоге admin/controller.

Аннотация контроллера

Класс аннотации: HuiCMF\annotation\ControllerAnnotation Область действия: CLASS Описание параметра: title (обязательно) — название контроллера (обязательный параметр), auth (необязательно) — управление доступом, по умолчанию true (Enum: {true, false}).

Пример:

Примечание: перед использованием аннотации необходимо импортировать: use app\admin\annotation\ControllerAnnotation;

/**
 * @ControllerAnnotation(title="Управление меню")
 * Class Node
 * Package app\admin\controller\system
 */
class MenuController extends AdminController
{

}

Аннотации метода узла

Класс аннотации: HuiCMF\annotation\NodeAnotation Область действия: METHOD Описание параметра: title (обязательно) — имя метода узла (обязательный параметр), auth (необязательно) — управление доступом, по умолчанию true (Enum: {true, false})

Пример:

Примечание: перед использованием аннотации необходимо импортировать: use app\admin\annotation\NodeAnotation;

/**
 * @NodeAnotation(title="Список меню")
 */
public function index()
{
}

3. Метод __url() используется вместо url() для обработки маршрутов.

Цель: скрыть модуль (admin) и точку входа бэкэнда.

Измените на: http://вашдомен/admin.php (можно настроить admin.php).

Проблемы с интерфейсом бэкэнда

1. Проверка подлинности интерфейса

Почему проверка подлинности выполняется во внешнем интерфейсе, а не в бэкэнде? Здесь проверка подлинности относится к проверке того, имеет ли пользователь право просматривать данные (например, кнопки добавления, удаления и редактирования), которые будут проверяться только после нажатия соответствующей ссылки. Чтобы избежать путаницы, интерфейс также может выполнять проверку подлинности.

Пример 1: используйте метод auth() для генерации атрибута класса layui-hide.

<a class="layui-btn layui-btn-sm layui-btn-normal {if !check_auth('system.admin/edit')}layui-hide{/if}" data-open="{:__url('system.admin/edit')}?id={{d.id}}"
               data-title="Редактировать управление">Редактировать</a>

Пример 2: Используйте метод auth(), чтобы определить, отображается ли HTML.

{if check_auth('system.admin/edit')}
<a class="layui-btn layui-btn-sm layui-btn-normal " data-open="{:__url('system.admin/edit')}?id={{d.id}}"
               data-title="Редактирование управления">Редактирование</a>
{/if}

2. Свойства кнопок

// Всплывающее окно: ширина: 90%, высота: 80%
<a href="javascript:;" data-open="{:__url('system.node/index')}" data-title="Тестирование редактирования открытия" data-reload="1"
   data-width="910"
   data-height="550">Редактировать</a>

// Всплывающее окно: полноэкранный режим: ширина: 100%, высота: 100%
<a href="javascript:;" data-open-full="{:__url('system.node/index')}" data-title="Добавить тест открытия">Добавить</a>

// Диалоговое окно подтверждения удаления
<a href="javascript:;" data-delete="{:__url('system.node/index')}" data-title="Вы уверены, что хотите удалить?">1231232313</a>

// Обычный диалог подтверждения
<a href="javascript:;" data-confirm="{:__url('system.node/index')}" data-title="Вы уверены, что хотите отменить сбор?">1231232313</a>

data-title: заголовок всплывающего окна

data-open: открыть всплывающее окно по умолчанию: width: 90%, height: 80%.

data-width="910": ширина всплывающего окна (применимо только к data-open).

data-height="550": высота всплывающего окна (применимо только к data-open).

data-open-full: открыть полноэкранное всплывающее окно: width: 100%, height: 100%.

data-confirm: обычный диалог подтверждения.

data-delete: диалоговое окно подтверждения удаления.

  • data-reload="1": обновить родительскую страницу (например, после сохранения или закрытия всплывающего окна при редактировании списка страниц (родительская страница) обновляется). По умолчанию не записывается или data-reload="0".
  • data-reload="2": обновить текущую страницу (например, после сохранения или закрытия всплывающего окна текущая страница обновляется). По умолчанию не записывается или data-reload="0". ``` class="layui-btn" id="test1">上传图片

**JavaScript:**

```javascript
upload.render({
  elem: '#test1'
  , url: "{:__url('upload/index',['save_path'=>'images'])}"
  , done: function (res) {
    if (res.code === 1) {
      $("#image").val(res.url);
    }
  }
})

#### 2. Использование готовых функций загрузки Layui (достаточно одной кнопки, без необходимости написания JavaScript в коде страницы)

#### Пример использования:

```html
<button type="button" class="layui-btn layui-btn-normal layUpload" id="lay_pic" data-input-id="c-pic" data-type="image">
    <i class="layui-icon"></i>Загрузить изображение
</button>
Параметр Обязательно Значение
class Нет layUpload (обязательно)
id Нет Например: lay_pic
data-input-id Нет Идентификатор текстового поля изображения, используется для заполнения URL, должен соответствовать идентификатору текстового поля
data-type Да (по умолчанию: image) Тип загрузки: изображение [формат изображения] (по умолчанию), файл [формат вложения]

Если на одной странице необходимо несколько элементов управления загрузкой:

Достаточно, чтобы пары id и data-input-id не совпадали (аналогично для возврата значения в текстовое поле).

3. Использование готового плагина WebUploader для загрузки (достаточно одной кнопки, без необходимости написания JavaScript в коде страницы)


<button type="button" class="webUpload" id="picker_pic" data-multiple="false" data-input-id="c-pic"
        data-preview-id="p-pic" data-type="image"><i class="layui-icon"></i>Загрузить изображение
</button>
Параметр Обязательно Значение
class Да webUpload (обязательно)
id Да Например: picker_pic
data-input-id Да Идентификатор текстового поля изображения, используется для заполнения URL, должен соответствовать идентификатору текстового поля
data-type Да (по умолчанию: image) Тип загрузки: изображение [формат изображения] (по умолчанию), файл [формат вложения]

Если на одной странице необходимо несколько элементов управления загрузкой:

Достаточно, чтобы пары id и data-input-id не совпадали (аналогично для возврата значения в текстовое поле).

4. Использование готовой функции выбора загрузки одного изображения

Как показано на рисунке:

.jpg

При загрузке одного изображения в многостраничном режиме будет возвращено только первое изображение.

Код вызова (пример двух загрузок):


<div class="layui-form-item">
    <label class="layui-form-label">Миниатюра</label>
    <div class="layui-input-block">
        <div class="layui-input-inline" style="width: 50%">
            <input type="text" name="image" value=""
                   onmouseover="hui_img_preview('image-select-input',this.value)"
                   onmouseout="layer.closeAll();" id="image-select-input" autocomplete="off" class="layui-input">
        </div>
        <div class="layui-input-inline" style="width: 120px">
            <a class="layui-btn"
               data-open="{:__url('upload/fileList',['type'=>'one','select_id'=>'image-select-input'])}"
               data-title="Выбрать изображение"
               data-width="910" data-height="550"><i class="layui-icon"></i>Выбрать изображение</a>
        </div>
    </div>
</div>
<div class="layui-form-item">
    <label class="layui-form-label">Миниатюра 2</label>
    <div class="layui-input-block">
        <div class="layui-input-inline" style="width: 50%">
            <input type="text" name="image2" value=""
                   onmouseover="hui_img_preview('image-select-input2',this.value)"
                   onmouseout="layer.closeAll();" id="image-select-input2" autocomplete="off" class="layui-input">
        </div>
        <div class="layui-input-inline" style="width: 120px">
            <a class="layui-btn"
               data-open="{:__url('upload/fileList',['type'=>'one','select_id'=>'image-select-input2'])}"
               data-title="Выбрать изображение"
               data-width="910" data-height="550"><i class="layui-icon"></i>Выбрать изображение</a>
        </div>
    </div>
</div>

Примечание:

Значение текстового поля должно совпадать со значением параметра select_id в ссылке data-open. Это необходимо для того, чтобы можно было вернуть значение в соответствующее текстовое поле.

5. Использование готовой функции множественного выбора изображений

(Пример использования: загрузка нескольких изображений для статьи)

Добавьте код:


<div class="layui-form-item">
    <label class="layui-form-label">Выбор нескольких изображений</label>
    <div class="layui-input-block" style="margin-top: 15px;">
        <a class="layui-btn"

``` ```
data-open="{:__url('upload/fileList',['type'=>'more'])}" data-title="选择图片"
           data-width="910" data-height="550"><i class="layui-icon"></i>选择图片</a>
        <div style="margin-top: 15px;">
            <small>(可拖拽图片调整显示顺序 )</small>
        </div>
        <!--回调显示选择的图片-->
        <div class="uploader-list am-cf"></div>
    </div>
</div>```
多图选择
选择图片
(可拖拽图片调整显示顺序 )
{foreach name="data.thumbs" item="vo" key="k"}
{/foreach}
```

ps:多图上传后 可以拖动图片进行排序哦~~~。需要添加js代码:

layui.use(['jquery', 'ddSort'], function () {
  let $ = layui.jquery;

  // 图片列表拖动,需要引入ddSort
  $('.uploader-list').DDSort({
    target: '.file-item',
    delay: 100, // 延时处理,默认为 50 ms,防止手抖点击 A 链接无效
    floatStyle: {
      'border': '1px solid #ccc',
      'background-color': '#fff'
    }
  });
})

4、二开了think-addons扩展插件

插件基于:zzstudio/think-addons 进行了二开处理

  1. 在helper助手中增加了部分公共方法
  2. 修改了Addons.php文件,方便在程序中二次调用
  3. 插件文件夹里:
  • 插件名要和插件控制器一直,例如: test插件文件夹里的 Test.php文件
  • info.ini 一定要有,而且字段要对应
  • config.php文件参数 参考 test插件里的

5、后台表单省市区域三级联动


<div class="layui-form-item tpl-district-container">
    <label class="layui-form-label">地区</label>
    <div class="layui-inline">
        <select name="province" lay-filter="tpl-province" data-value="" class="form-control tpl-province">
        </select>
    </div>
    <div class="layui-inline">
        <select name="city" lay-filter="tpl-city" data-value="" class="form-control tpl-city">
        </select>
    </div>
    <div class="layui-inline">
        <select name="area" lay-filter="tpl-district" data-value="" class="form-control tpl-district">
        </select>
    </div>
</div>

之后在layui里引用一下即可。其中 data-value 属性是用于编辑的赋值

6、【小插件】-让数字动起来

<span class="number-timer">66</span>
layui.use(['jquery', 'miniCountUp'], function () {
  var $ = layui.jquery;
  var countUp = layui.miniCountUp;
  var count_up = new countUp({
    target: $('.number-timer'),
    startVal: 0, //目标开始的值,默认值为0
    endVal: 3, //到达目标值,默认值为元素的值
    decimals: 0, //小数位数,默认值为0
    duration: 1.5, //动画持续时间为秒,默认值为2
  });
  count_up.start();
});

总结注意事项(爬坑):

安装:

使用composer安装:(默认第一次composer后已安装)

composer require hg/apidoc

前端访问:

http://你的域名/apidoc

如果无法访问请查看伪静态是否正确

前端接口异常:

请检查路径是否正确

基础案例:

  1. 配置config/apidoc.php文件
  2. 案例控制器文件:app/api/controller/UserController.php

开发教程

1、API接口开发【在用版】

路径: app\api文件夹下。

文件说明:

1. config > api.php文件

配置里有详细说明。

2. controller > BaseController.php

基础控制器

3. controller > LoginController.php

普通会员登录接口

4. controller > TestController.php

测试接口

使用说明:

url:

/api/login/index?mobile=test&password=123456

method:

GET、POST等

Если необходимо, можно уточнить запрос. Определение статуса входа в систему

Стандарт определения того, вошёл ли пользователь в систему, заключается в том, есть ли сохранённый токен на локальном устройстве. Если он сохранён, то это состояние входа, если нет — состояние без входа, и требуется вход в систему. Интерфейсы, требующие авторизации, автоматически включают токен при запросе данных.

Добавление интерфейса

При добавлении нового интерфейса сначала необходимо создать новый контроллер интерфейса в модуле API. Все контроллеры интерфейса должны наследоваться от класса app\api\controller\ApiController. Например:

namespace app\api\controller;
class TestController extends ApiController{
    public function list(){}
}

Затем в файле конфигурации интерфейса app\api\config\api.php необходимо определить новый интерфейс:

'test'=>[
    'code' => 'Test',
    'method'    =>  [
        'getlist' => [
            'code' => 'list',
            'is_login' => false
        ]
    ]
]

Здесь:

  • test — это первый параметр URL-адреса вызова;
  • code соответствует имени класса контроллера интерфейса;
  • method определяет параметры;
  • getlist — метод внешнего доступа, а list внутри него — конкретный метод класса TestController;
  • is_login указывает, требуется ли авторизация. Когда is_login = true, необходимо передать токен. Можно использовать $this->userId для получения текущего пользователя.

Общий интерфейс

Если это общий интерфейс данных, можно просто написать методы в файле app\api\controller\CommonController.php. Любой способ запроса может быть использован для доступа:

http://ваш_домен/api.html/common/test

Пример вызова интерфейса (на примере UserController)

Основные сведения:

  • URL интерфейса: https://ваш_домен/api.html
  • Способ запроса: POST
  • Content-Type: multipart/form-data

Параметры запроса:

Параметр Пример значения Обязательный Описание
method user.login Да Метод интерфейса
username admin Да Имя пользователя
password admin Да Пароль

Пример правильного ответа:

{
  "code": 200,
  "data": "c9d2343fd754ca12a9be33e957574cce",
  "msg": ""
}

Пример неправильного ответа:



{
  "code": 0,
  "msg": "Не удалось найти этот аккаунт",
  "data": ""
}

Ответ с изображением:

L0xcd0.md.png


Благодарности

Следующие проекты не ранжируются по порядку:

Логотип PhpStorm Логотип PhpStorm

Информация об авторских правах

HuiCMF следует лицензии Apache 2.0 и разрешает коммерческое использование. Этот проект включает сторонние исходные коды и двоичные файлы, информация об авторских правах которых указана отдельно. Авторские права © 2019–2022 by xiaohuihui (https://xiaohuihui.net.cn). Все права защищены.

Отказ от ответственности

HuiCMF следует лицензии Apache 2.0 и разрешает коммерческое использование. Перед использованием фреймворка HuiCMF для бэкэнда, пожалуйста, внимательно прочитайте и полностью поймите это заявление. Вы можете выбрать не использовать HuiCMF, но как только вы начнёте использовать его, ваше поведение будет считаться признанием и принятием всего содержания этого заявления.

  • HuiCMF — это бесплатная структура для быстрой разработки бэкэндов, которая в основном используется для более удобного создания административных систем. Она уважает и защищает личную конфиденциальность всех пользователей и не собирает информацию с компьютеров пользователей. Он также не имеет функций хранения данных или сетевого обмена.
  • Вы обязуетесь использовать структуру HuiCMF в соответствии с законными и разумными принципами, не используя её для любых незаконных, вредоносных действий, которые нарушают права других людей, или для любой деятельности, нарушающей законы и правила моей страны.
  • Любая организация или лицо, которое получает или использует структуру HuiCMF и в результате этого или в связи с этим страдает от несчастного случая, небрежности, нарушения контракта, клеветы, нарушения авторских прав или других убытков (включая, помимо прочего, прямые, косвенные, сопутствующие или производные убытки), эта структура с открытым исходным кодом не несёт никакой юридической ответственности.
  • Пользователи явно соглашаются со всеми пунктами этого заявления об отказе от ответственности, принимают на себя все риски и последствия, связанные с использованием структуры HuiCMF. Эта структура с открытым исходным кодом не несёт никакой юридической ответственности.
  • Любые организации или лица, прочитавшие это заявление об отказе от ответственности после его прочтения, должны соблюдать условия лицензии MIT в рамках разрешённого использования, распространения и использования структуры HuiCMF. В случае нарушения настоящего заявления об отказе от ответственности или нарушения законов и правил, юридическая ответственность (включая, помимо прочего, гражданскую компенсацию и уголовную ответственность) лежит на стороне, нарушившей договор.
  • Если какая-либо часть этого заявления об отказе от ответственности считается недействительной или неисполнимой, остальная часть остаётся в силе. Недействительность или невозможность исполнения какой-либо части этого заявления не означает отказ от наших прав на исполнение этого заявления.
  • Эта структура с открытым исходным кодом оставляет за собой право в любое время вносить односторонние изменения в это заявление и прилагаемые материалы и публиковать их через push-уведомления, веб-объявления и т. д., которые вступают в силу немедленно без отдельного уведомления. Если вы продолжаете использовать эту структуру после публикации изменённого заявления, это означает, что вы полностью прочитали, поняли и приняли изменённое содержание заявления.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Huicmf_tp6 — это бесплатная открытая прикладная архитектура разработки приложений, основанная на ThinkPHP6 и layui. Она предназначена для быстрой разработки приложений. Архитектура поддерживает отличное быстродействие и предлагает новаторские идеи в дизайне, а также уделяет внимание простоте использования. Huicmf_tp6 опубликована согласно лиц... Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/xianrenqh-huicmf_tp6.git
git@api.gitlife.ru:oschina-mirror/xianrenqh-huicmf_tp6.git
oschina-mirror
xianrenqh-huicmf_tp6
xianrenqh-huicmf_tp6
master