HuiCMF v6.0
=========== ==
ps: синхронизация обновлений.
https://github.com/xianrenqh/huicmf_tp6
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 в регион, по умолчанию используется чистая база данных (необходимо обновить базу данных позже).
Обновление базы данных:
Если после переноса сайта появляется сообщение об ошибке «No input file specified», удалите файл .user.ini в папке public.
Пароль для доступа к бэкэнду можно изменить в разделе «Система управления — Системные настройки — Настройки безопасности»: «Бэкэнд с паролем». Не забудьте, что изменять файлы в папке public напрямую нельзя.
https://huicmf6.xiaohuihui.club/admin.php
Учётная запись: admin
Пароль: admin888
Все контроллеры должны наследовать AdminController.
Используется аннотация авторизации:
Аннотация авторизации применяется только к контроллерам бэкэнда, то есть к приложениям в каталоге 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()
{
}
Цель: скрыть модуль (admin) и точку входа бэкэнда.
Измените на: http://вашдомен/admin.php (можно настроить admin.php).
Почему проверка подлинности выполняется во внешнем интерфейсе, а не в бэкэнде? Здесь проверка подлинности относится к проверке того, имеет ли пользователь право просматривать данные (например, кнопки добавления, удаления и редактирования), которые будут проверяться только после нажатия соответствующей ссылки. Чтобы избежать путаницы, интерфейс также может выполнять проверку подлинности.
Пример 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}
// Всплывающее окно: ширина: 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: диалоговое окно подтверждения удаления.
**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 не совпадали (аналогично для возврата значения в текстовое поле).
<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 не совпадали (аналогично для возврата значения в текстовое поле).
Как показано на рисунке:
При загрузке одного изображения в многостраничном режиме будет возвращено только первое изображение.
Код вызова (пример двух загрузок):
<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. Это необходимо для того, чтобы можно было вернуть значение в соответствующее текстовое поле.
(Пример использования: загрузка нескольких изображений для статьи)
Добавьте код:
<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>```
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'
}
});
})
插件基于:zzstudio/think-addons 进行了二开处理
<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 属性是用于编辑的赋值
<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
如果无法访问请查看伪静态是否正确
请检查路径是否正确
路径: app\api文件夹下。
配置里有详细说明。
基础控制器
普通会员登录接口
测试接口
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)
Основные сведения:
https://ваш_домен/api.html
POST
multipart/form-data
Параметры запроса:
Параметр | Пример значения | Обязательный | Описание |
---|---|---|---|
method | user.login | Да | Метод интерфейса |
username | admin | Да | Имя пользователя |
password | admin | Да | Пароль |
Пример правильного ответа:
{
"code": 200,
"data": "c9d2343fd754ca12a9be33e957574cce",
"msg": ""
}
Пример неправильного ответа:
{
"code": 0,
"msg": "Не удалось найти этот аккаунт",
"data": ""
}
Ответ с изображением:
Следующие проекты не ранжируются по порядку:
HuiCMF следует лицензии Apache 2.0 и разрешает коммерческое использование. Этот проект включает сторонние исходные коды и двоичные файлы, информация об авторских правах которых указана отдельно. Авторские права © 2019–2022 by xiaohuihui (https://xiaohuihui.net.cn). Все права защищены.
HuiCMF следует лицензии Apache 2.0 и разрешает коммерческое использование. Перед использованием фреймворка HuiCMF для бэкэнда, пожалуйста, внимательно прочитайте и полностью поймите это заявление. Вы можете выбрать не использовать HuiCMF, но как только вы начнёте использовать его, ваше поведение будет считаться признанием и принятием всего содержания этого заявления.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )