CompanyManager проект
Техническая часть
Основное назначение Реализованы функции управления пользователями, меню, отделами, финансами, отчётами о финансах, задачами и словарями. Может служить примером для демонстрации возможностей (demo) для тех, кто имеет конкретные потребности, или для обучения новичков.
Требования:
- В проекте есть три роли пользователей: обычные пользователи, системные администраторы и суперадминистраторы.
- Управление правами: суперадминистратор имеет все права, включая добавление, изменение и удаление системных администраторов, а системный администратор может управлять обычными пользователями в соответствии с принципом иерархии.
Реализация блока управления пользователями:
- Начнём с уровня dao: в cn.springmvc.dao создаём UserInfoDao, который является интерфейсом и содержит информацию о пользователях. Подробнее см. реализацию в проекте cn.springmvc.dao.UserInfoDao.
- В соответствующем каталоге настраиваем маппер (Mapper) для UserInfoDao для реализации конкретных функций в mybatis. Подробнее см. реализацию в проекте cn.springmvc.dao.UserInfoMapper.
- В cn.springmvc.service создаём соответствующий сервисный интерфейс и реализуем конкретные функции на уровне сервиса в cn.springmvc.service.impl. Подробнее см. реализацию в проекте cn.springmvc.service.impl.UserInfoServiceImpl.
- В cn.springmvc.controller реализуем соответствующий контроллер. Подробнее см. реализацию в проекте cn.springmvc.service.controller.UserInfoController.
Требования:
- Меню проекта можно разделить на две категории: системное меню, которое требует написания соответствующего кода для подключения, и веб-меню, для которого достаточно предоставить ссылку для перехода.
- Основное внимание уделяется реализации CRUD для меню.
Реализация блока управления меню:
- Разделение на слои и реализация аналогичны блоку управления пользователями. Можно напрямую обратиться к исходному коду.
Здесь я хотел бы рассказать о том, как я реализовал физическую разбивку на страницы с помощью mybatis:
Все, кто знаком с mybatis, знают, что разбивка на страницы, реализованная с использованием RowBounds, является логической разбивкой, то есть сначала выбираются все записи данных, а затем обрезаются в соответствии со значениями offset и limit. Чтобы реализовать физическую разбивку на страницы без изменения логики функций mybatis, можно написать плагин для перехвата Executorstatementhandler в mybatis и переписать SQL для выполнения запросов.
Как я это реализовал в проекте?
Я передал объект PageInfo, связанный с разбиением на страницы, через три слоя: представление, контроллер и модель.
В контроллере:
@RequestMapping(value = "/queryUser")
public String queryUser(Model model, @ModelAttribute(value = "pageInfo") PageInfo<UserInfo> pageInfo,@ModelAttribute(value = "user") UserInfo userInfo, @ModelAttribute(value = "dept") DeptInfo dept) { //Реализация бизнес-логики }
На уровне сервиса: после того как PageInfo упакован в RowBounds, он передаётся на уровень dao.
public ArrayList<UserInfo> queryUsers(Map<String, String> map,PageInfo<UserInfo> pageInfo) {
return userInfoDao.queryUsers(new RowBounds(pageInfo.getFromRecord(),pageInfo.getPageSize()), map);}
В файле конфигурации mybatis настройте плагин: атрибут interceptor указывает на перехватчик;
<plugins>
<plugin interceptor="cn.springmvc.utildao.PaginationInterceptor" />
</plugins>
PaginationInterceptor можно посмотреть в исходном коде проекта cn.springmvc.utildao. Для основных функций CRUD в mapper не было никаких изменений.
Примечание: остальные блоки похожи на два вышеупомянутых, подробности можно найти в исходном коде!
Чтобы решить эту проблему, добавьте следующее в файл springmvc-servlet:
<!-- json формат конфигурации -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="serializationInclusion">
<value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
</property>
<!--
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property> -->
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
Это решит проблему.
Примечание: приглашаем заинтересованных друзей присоединиться к проекту и добавить свои уникальные идеи!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )