система_управления
Введение
Это система управления фоном на базе koa2
Используйте jQuery
в качестве внешней среды JS. Используйте bootstrap
в качестве структуры CSS. Используйте pug
/ jade
и handlebars
в качестве шаблона HTML-страницы. Используйте PostgreSql
для хранения бизнес-данных. Используйте mongodb
для хранения session
Использование Bookshelf
+ Knex
в качестве ORM
и Query Builder
Используйте Sentry
в качестве платформы для сбора информации об ошибках. Используйте AJAX
для обработки внешних запросов. Используйте библиотеку CronJob
для выполнения запланированных задач.
Структуру каталогов и конфигурацию Babel можно найти на https://github.com/17koa/koa-demo.
Исходная ссылка, похоже, была удалена. Это версия, которую я развил https://github.com/liuyueyi1995/koa2-demo.
Внешний код веб-сайта взят из моего предыдущего проекта https://github.com/liuyueyi1995/oa.
основные задачи
- Регистрация входа в систему администратора бэкэнда
- B Управление информацией пользователей
- Управление ролями пользователей C
- D Организационное управление
- Управление электронными проектами
- F Отображение содержимого, полученного по запросу, и поиск с помощью внутреннего пейджинга +
AJAX
- G Создание временных пользователей, а также выделение и повторное использование временных ролей.
- Управление журналами H
Полнота
- Базовая структура MVC завершена;
- Задача А выполнена, включая регистрацию, вход в систему, а также чтение и запись сеанса;
- Задача B выполнена, включая запрос информации о пользователе, нечеткий поиск, добавление, удаление, изменение базовой информации и изменение пароля;
- Задача C выполнена, включая многотабличный запрос, нечеткий поиск, обработку каскадного раскрывающегося меню, добавление и удаление информации;
- Задача D завершена, включая запрос институциональной информации, нечеткий поиск, добавление, удаление и модификацию;
- Задача E выполнена, включая запрос информации о проекте, нечеткий поиск, добавление, удаление и изменение;
- Задача F выполнена. Путем оценки наличия содержимого в поле поиска при срабатывании события нажатия кнопки пейджинга определяется набор результатов, возвращаемый фоном;
- Задача G выполнена путем разделения пользователей на внутренних и внешних пользователей, использования различных методов генерации паролей, добавления к ролям атрибутов срока действия, в фоновом режиме регулярно очищается информация о просроченных ролях;
- Задача G выполнена, включая просмотр журнала и нечеткий поиск;
- Улучшена форма представления формы, изменено раскрывающееся меню, добавлен элемент управления датой, а ввод логического значения выполнен в виде радио;
- Две функции входа пользователя и управления данными были связаны;
- Различие между внешними и внутренними ролями завершено, а также завершено установление сроков для ролей;
TODO
- Необходимо улучшить запрос дат, чисел и логических значений (например: метка времени, логическое значение);
- Необходимо улучшить проверку вводимых пользователем данных (например, адрес электронной почты, телефон);
- Улучшить степень повторного использования кода;
Фокус
Файл config.js
содержащий конфиденциальную информацию, был удален из репозитория, и его необходимо добавить при его использовании:
var config = {
database: '',
username: '',
password: '',
host: '',
port:
};
module.exports = config;
Проблемы
- В каскадном меню есть ошибка. Изначально список
site
невозможно отобразить без изменения type
.- Решено.
- Это должна быть проблема с
onchange
. - Добавив нулевое значение по умолчанию в раскрывающееся меню
type
, вынудите пользователя изменить его.
- После изменения базы данных значение
updated_at
не изменилось.- Решено.
- Просто добавьте
hasTimestamps:true
при определении model
.
- После изменения базы данных порядок списка будет нарушен.
- Решено.
- Используйте
orderBy
для сортировки результатов поиска до того, как база данных вернет их.
- На странице управления ролями, когда значение сайта пусто, иногда может произойти сбой при добавлении.
- Решено.
- Когда
null
внешний интерфейс возвращается на серверную часть, он становится пустой строкой, которая конфликтует с integer
типом внешнего ключа.
- Если после пейджинга последующий контент будет изменен, он вернется на первую страницу после успешного изменения.
- Не решено .
- Это должна быть проблема
reload
.
- Если после разбивки по страницам результаты поиска содержат несколько страниц контента, нажатие на вторую страницу приведет к возврату на вторую страницу исходных результатов.
- Решено.
- Поскольку сейчас существует только одна обработка
AJAX
подкачки, если вы хотите, чтобы результаты поиска отображались в подкачке, вам нужно добавить еще одно состояние. - Добавьте решение на основе исходной страницы,
- Если в это время в поле поиска есть контент, база данных будет запрошена с этим контентом и будет возвращено содержимое соответствующей страницы;
- Если в это время поле поиска пусто, будет возвращено содержимое страницы, соответствующее исходным данным.
- После поиска количество страниц в компоненте разбиения на страницы неверно. Например, исходные результаты содержат 5 страниц, но результаты поиска содержат только 2 страницы, но по-прежнему отображаются 5 кнопок с номерами страниц.
- Решено.
- Получите количество результатов после поиска и перерисуйте кнопку перелистывания.
- При многократном поиске количество страниц в компоненте разбиения на страницы неверно. Например, первый результат поиска содержит 2 страницы, а второй результат поиска — 3 страницы, но по-прежнему отображаются только 2 кнопки с номерами страниц.
- Решено.
- Получайте содержимое поля поиска в режиме реального времени и обновляйте страницу, когда ее содержимое становится пустым.
- При использовании шаблона
handlebars
метка времени анализируется неправильно.- Решено.
- Используйте специальный
helper
для анализа временных меток.
- Если вы не вошли в систему, изменение URL-адреса приведет к пропуску входа в систему и использованию базы данных напрямую.
- Решено.
- Перед возвратом каждого запроса
get
добавляется решение session
. Если session
пуст, он перейдет на страницу login
.
- Удаление внутренних пользователей требует соединения. Удаление pgsql поддерживает только
using
, а книжная полка не поддерживает using
.- Решено.
- Вместо этого используйте
knex
для выполнения запроса напрямую.
- Значение поля даты/времени вне диапазона
- Решено.
- Хотя локальная тестовая база данных и база данных Alibaba Cloud имеют формат pgsql9.4, механизмы проверки различаются.
- Дискриминация по датам в Alibaba Cloud, похоже, не работает утром и днем (AM/PM).
- Поэтому в класс
Date
был добавлен метод format
дат.
- Переключение между результатами поиска и всеми результатами.
- Решено.
- Самый ранний метод заключался в использовании мониторинга в реальном времени. Когда поле поиска пусто, страница обновляется, но это недопустимо в некоторых браузерах и операционных системах;
- Поэтому вместо этого используйте метод ссылки в баннере, чтобы дать ссылку из результатов поиска на все результаты.
- Длинный формат даты занимает слишком много страниц.
- Решено.
- На серверной стороне обрабатывайте дату, форматируя ее и упрощая.
- Если в фоновой работе базы данных сообщается об ошибке, интерфейсная часть не получит обратной связи с соответствующей информацией.
- Решено.
- Добавьте блок then().catch() в серверную часть, чтобы выносить заключения об ошибках.
- Следующим шагом является анализ конкретного кода ошибки и предоставление подробной информации в интерфейсную часть.
- При добавлении ролей невозможно различить пользователей с одинаковым именем.
- Решено.
- Различайте пользователей с одинаковыми именами, указывая их адрес электронной почты после имени пользователя.