Эта статья участвует"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Бутик Java завершен [Система управления проектами для студенческого конкурса дисциплин.mp4]
Ссылка на дизайн диссертации:
1.1 Предыстория исследования 7
2.2 Операционная среда системы 8
2.3 Описание функциональных требований 9
3.1 Общая идея разработки и дизайна 9
3.2 Общая архитектура системного модуля 9
3.4 Описание потока системы 10
3.5 Архитектура исходного кода проекта 11
4.1 Основные классы программ 12
4.1.1 Класс объекта пользователя 13
4.1.4 Категория заявки проекта 16
4.1.5 Класс объявления проекта 17
4.2 Введение в основную структуру и технологию 17
4.2.2 Введение в Spring Boot 18
4.3 Скриншоты основных модулей реализации функций системы 19
4.3.4 Часть отображения исходного кода ключа: 28
4.4 Дизайн основных таблиц базы данных 31
4.4.0 Диаграмма ER таблицы базы данных 32
4.4.1 Дизайн пользовательской таблицы 32
4.4.4 Дизайн формы объявления конкурса 33
4.4.5 Оформление таблицы конкурсных позиций 33
4.4.6 Дизайн регистрационной формы конкурсного проекта 34
4.4.7 Оформление таблицы финансирования конкурсного проекта 34
4.4.8 Оформление регистрационной формы для личного зачета 34
4.4.8 Дизайн регистрационной формы командного соревнования 35
Дизайн системных функций
(1) Логин: введите пароль учетной записи и проверочный код для входа;
(2) Информационный модуль пользователя
(3) Модуль меню
(4) ролевой модуль
(5) Заявочный модуль для конкурсов проектов
(6) Модуль подачи заявок на фонды конкурса проектов
(7) Модуль утверждения управления конкурсом проектов
(8) Модуль регистрации для индивидуального конкурса проектов
(9) Модуль регистрации для участия в конкурсе проектных команд
(10) Модуль статистики завершения проекта
(11) Модуль оповещения уведомления
Скриншоты основных функций:
Вход пользователя: введите пароль учетной записи и проверочный код для входа. После входа в систему отображаются различные меню в соответствии с разрешениями пользователя, а роли гибко контролируются.
Функциональные модули администратора: управление пользователями, управление регистрационной информацией о конкурсе, управление информацией о заявке на финансирование и управление информацией x-аудита, информация о заключении проекта, управление ролями управления, управление меню, управление полномочиями, управление проектными заявками и управление другими конкретными модулями.
Управление пользователями: отображение списка пользователей, добавление данных, удаление и изменение и т. д.
Управление ролями: привязывайте роли к пользователям, гибко управляйте меню ролей и отображайте разрешения меню. Можно создать несколько ролей
Управление сообщениями меню:
Мониторинг системного журнала: программирование аспекта aop. Реализовать операции логирования.
функция бизнес-модуля
Функция приложения проекта
Утверждение проекта:
Финансирование деятельности, заявка на бюджет
Заявка проекта для управления индивидуальными соревнованиями и командными соревнованиями, введите информацию в поля, связанные с регистрацией.
Информация об управлении проектом:
После завершения проекта выберите проект для заполнения статистики использования средств. Введите сумму
Статистика окончания проекта:
Дизайн таблицы базы данных:
пользовательская таблица:
CREATE TABLE `NewTable` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT ,
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名' ,
`salt` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '盐' ,
`email` varchar(1
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码' ,
00) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱' ,
`mobile` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号' ,
`status` tinyint(4) NULL DEFAULT NULL COMMENT '状态 0:禁用 1:正常' ,
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间' ,
PRIMARY KEY (`user_id`),
UNIQUE INDEX `username` (`username`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci
COMMENT='系统用户'
AUTO_INCREMENT=3
ROW_FORMAT=COMPACT
Таблица меню:
CREATE TABLE `NewTable` (
`menu_id` bigint(20) NOT NULL AUTO_INCREMENT ,
`parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父菜单ID,一级菜单为0' ,
`name` varchar(50) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单名称' ,
`url` varchar(200) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单URL' ,
`perms` varchar(500) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)' ,
`type` int(11) NULL DEFAULT NULL COMMENT '类型 0:目录 1:菜单 2:按钮' ,
`icon` varchar(50) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标' ,
`order_num` int(11) NULL DEFAULT NULL COMMENT '排序' ,
PRIMARY KEY (`menu_id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci
COMMENT='菜单管理'
AUTO_INCREMENT=69
ROW_FORMAT=COMPACT
;
Заявка на проект:
CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(255) SET utf8 COLLATE NULL NULL ,
`zsdw` varchar(255) SET utf8 COLLATE NULL ,
`type` varchar(255) SET utf8 COLLATE utf8_general_ci NULL NULL ,
`principal` varchar(255) SET utf8 COLLATE NULL DEFAULT NULL ,
`phone` varchar(255) SET utf8 COLLATE NULL NULL ,
`start_time` datetime NULL DEFAULT NULL ,
`ent_time` datetime NULL DEFAULT NULL ,
`majozhuban` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`sponsor` varchar(255) SET utf8 COLLATE utf8_general_ci NULL NULL ,
`undertaeker` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL NULL ,
`remark` varchar(255) SET utf8 COLLATE utf8_general_ci NULL NULL ,
`audit_stu` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=COMPACT
;
Индивидуальный матч:
CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`college` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`class_name` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`grade` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`major` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`email` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`phone` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`title` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=12
ROW_FORMAT=COMPACT
;
Заявка на финансирование:
CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`zhuche` double NULL NULL ,
`rate` double NULL NULL ,
`train` double NULL NULL ,
`guidance` double NULL NULL ,
`haocai` double NULL NULL ,
`bonus` double NULL NULL ,
`other` double NULL ,
`total` double NULL NULL ,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=10
ROW_FORMAT=COMPACT
;
Реализация основного кода:
Фильтрация разрешений пользователей:
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
shiroFilter.setLoginUrl("/login.html");
shiroFilter.setUnauthorizedUrl("/");
filterMap.put("/statics/**", "anon");
filterMap.put("/login.html", "anon");
filterMap.put("/sys/login", "anon");
filterMap.put("/favicon.ico", "anon");
filterMap.put("/captcha.jpg", "anon");
filterMap.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(filterMap);
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/swagger/**", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/webjars/**", "anon");
filterMap.put("/swagger-resources/**", "anon");
return shiroFilter;
}
Проверка модуля входа:
/**
* 登录
*/
@ResponseBody
@RequestMapping(value = "/sys/login")
public R login(String username, String password, String captcha) {
String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
if(!captcha.equalsIgnoreCase(kaptcha)){
return R.error("验证码不正确。。。。。。");
}
try{
Subject subject = ShiroUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);//md5+Jiayan
subject.login(token);
}catch (UnknownAccountException e) {
return R.error(e.getMessage());
}catch (IncorrectCredentialsException e) {
return R.error("账号或密码不正确。。。。");
}catch (LockedAccountException e) {
return R.error("账号已被锁定,请联系管理。。。员");
}catch (AuthenticationException e) {
return R.error("账户验证失败。。。。");
}
return R.ok();
}
Единая обработка исключений:
/**
* 异常处理器
*
* @author Mark sunlightcs@gmail.com
*/
@RestControllerAdvice
public class RRExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* 处理自定义异常
*/
@ExceptionHandler(RRException.class)
public R handleRRException(RRException e){
R r = new R();
r.put("code", e.getCode());
r.put("msg", e.getMessage());
return r;
}
@ExceptionHandler(AuthorizationException.class)
public R handleAuthorizationException(AuthorizationException e){
logger.error(e.getMessage(), e);
return R.error("没有权限,请联系管理员授权");
}
@ExceptionHandler(Exception.class)
public R handleException(Exception e){
logger.error(e.getMessage(), e);
return R.error();
}
@ExceptionHandler(DuplicateKeyException.class)
public R handleDuplicateKeyException(DuplicateKeyException e){
logger.error(e.getMessage(), e);
return R.error("数据库中已存在该记录");
}
}
Пейджинговый запрос
package io.renren.common.utils;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.renren.common.xss.SQLFilter;
import org.apache.commons.lang.StringUtils;
import java.util.Map;
/**
* 查询参数
*
* @author Mark sunlightcs@gmail.com
*/
public class Query<T> {
public IPage<T> getPage(Map<String, Object> params) {
return this.getPage(params, null, false);
}
public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
//分页参数
long curPage = 1;
long limit = 10;
//分页对象
Page<T> page = new Page<>(curPage, limit);
//分页参数
params.put(Constant.PAGE, page);
if(params.get(Constant.PAGE) != null){
curPage = Long.parseLong((String)params.get(Constant.PAGE));
}
if(params.get(Constant.LIMIT) != null){
limit = Long.parseLong((String)params.get(Constant.LIMIT));
}
//排序字段
//防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
String orderField = SQLFilter.sqlInject((String)params.get(Constant.ORDER_FIELD));
String order = (String)params.get(Constant.ORDER);
//前端字段排序
if(StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)){
if(Constant.ASC.equalsIgnoreCase(order)) {
return page.addOrder(OrderItem.asc(orderField));
}else {
return page.addOrder(OrderItem.desc(orderField));
}
}
//没有排序字段,则不排序
if(StringUtils.isBlank(defaultOrderField)){
return page;
}
//默认排序
if(isAsc) {
page.addOrder(OrderItem.asc(defaultOrderField));
}else {
page.addOrder(OrderItem.desc(defaultOrderField));
}
return page;
}
}
Хорошо, давайте сегодня остановимся, я Сяо Ао, увидимся в следующем выпуске~~
КаждыйНравится, Избранное, Следите, КомментируйтеЛа,
Обновление статьи о пунше70/ 100 дней