无码人妻丰满熟妇奶水区码,麻豆一区区三,亚洲日韩欧美精品综合,亚洲无码地址

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

來(lái)源:blog.csdn.net/Gaowumao?type=blog

難度分析

雖然但是聽到這個(gè)消息的時(shí)候,內(nèi)心還是挺震驚的,畢竟是一個(gè)完整的管理系統(tǒng),功能界面還不能太過簡(jiǎn)陋。而且從數(shù)據(jù)庫(kù)設(shè)計(jì)到整個(gè)系統(tǒng)的交付全由自己一人完成,挑戰(zhàn)效果直接拉滿!但是冷靜下來(lái)思考一下,其實(shí)也并不是很難,整體的項(xiàng)目流程即為:設(shè)計(jì)——>文檔——>編碼——>交付。整體的流程劃清之后,就開始一步步從無(wú)到有的實(shí)現(xiàn),沒想到到最后一步的時(shí)候,我竟然才用一天半的時(shí)間!!后面又用了半天的時(shí)間對(duì)整體的項(xiàng)目做了一個(gè)優(yōu)化處理!

項(xiàng)目回顧

最終效果演示:

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

技術(shù)選型:

  • SpringBoot

  • Thymeleaf

  • mybatis-Plus

  • MySQL

  • PageHelper

  • Lombok

  • Redis(后期頁(yè)面優(yōu)化使用)

項(xiàng)目業(yè)務(wù)流程簡(jiǎn)介

登錄模塊、用戶模塊管理以及對(duì)用戶的角色分配,新聞公告模塊的管理、商品模塊(包括對(duì)商品、商品分類、訂單)的管理、角色模塊的管理;對(duì)于前端某資源是否有權(quán)限操作該資源,使用的是thymeleaf模板語(yǔ)法進(jìn)行判斷鑒別以及文件上傳等基本功能。

項(xiàng)目搭建(使用模板引擎)

1. 首先創(chuàng)建Maven項(xiàng)目

引入相應(yīng)的依賴,構(gòu)建所需文件目錄

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

2. 編寫yaml配置文件

server:
port: 8080

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/supplier?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT+8
username: root
password: root
# thymeleaf 配置
thymeleaf:
# 關(guān)閉緩存
cache: false
prefix: classpath:/templates/

mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml

3. 項(xiàng)目初期基本搭建

在搭建一個(gè)項(xiàng)目的初期,為了讓系統(tǒng)顯得更規(guī)范化,我一般會(huì)提前做好基礎(chǔ)的配置和聲明,一個(gè)項(xiàng)目從開始設(shè)想時(shí)所涉及到技術(shù)以及這些技術(shù)對(duì)應(yīng)的一些基礎(chǔ)配置,都要提前規(guī)劃清楚(個(gè)人習(xí)慣)。比如:異常處理、攔截器、過濾器、常量類等等。

①異常處理

@ControllerAdvice
public class exceptionHandler {

private final org.slf4j.Logger logger = LoggerFactory.getLogger(this.getClass);

@org.springframework.web.bind.Annotation.ExceptionHandler(Exception.class)
public ModelAndView exception(HttpServletrequest request, Exception e ) throws Exception {
logger.error(\"Request URL:{},Exception:{}\",request.getRequestURL,e);

if (AnnotationUtils.findAnnotation(e.getClass, ResponseStatus.class )!= ){
throw e;
}

ModelAndView mv = new ModelAndView;
mv.addObject(\"url\",request.getRequestURL);
mv.addObject(\"exception\",e);
mv.setViewName(\"error/error\");

return mv;
}
}

② 攔截器

攔截器主要是對(duì)一些資源做的處理,類似于某些資源需要用戶登錄后才能訪問的,某些是不需要的,比如:登錄功能就不需要有所攔截,而對(duì)用戶的各種管理就需要添加攔截操作,這樣才能使系統(tǒng)的安全性有所提高。

登錄攔截

public class LoginInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getSession.getAttribute(\"user\") == ){
response.sendRedirect(\"/api\");
return false;
}
return true;
}
}

資源放行

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addInterceptors(Interceptorregistry registry) {
registry.addInterceptor(new LoginInterceptor)
.addPathPatterns(\"/api/**\")
.excludePathPatterns(\"/api\",\"/api/doLogin\");
}
}

4. 編寫Controller前端控制器代碼

首先創(chuàng)建一個(gè)FileController類

① 跳轉(zhuǎn)文件上傳的頁(yè)面

//跳轉(zhuǎn)文件上傳的頁(yè)面
@RequestMapping(\"/File-upload\")
public StringuserList{
return \"file-upload\";
}

② 實(shí)現(xiàn)文件上傳的功能

@RequestMapping(\"/doAddForUser\")
public String doAdd(User user, @RequestParam(\"file\") MultipartFile files, HttpServletRequest request) throws IOException {
//String path = ;
if (files != && !files.isEmpty){
String name = UUID.randomUUID.toString.replace(\"-\",\"\");
//獲取文件的擴(kuò)展名
String ext = FilenameUtils.getExtension(files.getOriginalFilename);
//設(shè)置文件上傳的路徑
String url =request.getSession.getServletContext.getRealPath(\"/upload/\");

File file = new File(url);
if (!file.exists){
file.mkdir;
}
//測(cè)試路徑
System.out.println(request.getServletPath \"/upload\");
System.out.println(request.getContextPath \"/upload/\");
//以絕對(duì)路徑保存重命名后的文件
files.transferTo(new File(url \"/\" name \".\" ext));
user.setAvatar(request.getContextPath \"/upload/\" name \".\" ext);
}

user.setId(UUID.randomUUID.toString);
String salt = PasswordUtils.getSalt;
String password = user.getPassword;
String encode = PasswordUtils.encode(password, salt);
user.setSalt(salt) ;
user.setPassword(encode);
user.setCreateTime(new Date);
userService.save(user);
return \"redirect:/api/users\";
}

注:如何想要實(shí)現(xiàn)多文件上傳需要更改的地方如下:

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

③ 實(shí)現(xiàn)多文件上傳功能

在這個(gè)項(xiàng)目中并未實(shí)現(xiàn)多文件上傳功能

private void commons(Object obj, @RequestParam(\"file\") CommonsMultipartFile files, HttpServletRequest request) throws IOException {
//String path = ;
for (int i = 0; i < files.length; i ) {

if (files[i] != && !files[i].isEmpty){
String name = UUID.randomUUID.toString.replace(\"-\",\"\");
//獲取文件的擴(kuò)展名
String ext = FilenameUtils.getExtension(files[i].getOriginalFilename);
//設(shè)置文件上傳的路徑
String url =request.getSession.getServletContext.getRealPath(\"/upload/\");

File file = new File(url);
if (!file.exists){
file.mkdir;
}
//測(cè)試路徑
System.out.println(request.getServletPath \"/upload\");
System.out.println(request.getContextPath \"/upload/\");
//以絕對(duì)路徑保存重命名后的文件
files[i].transferTo(new File(url \"/\" name \".\" ext));

if (i == 0){
obj.setUrl1(request.getContextPath \"/upload/\" name \".\" ext);
}
if (i == 1){
obj.setUrl2(request.getContextPath \"/upload/\" name \".\" ext);
}
if (i == 2){
obj.setUrl3(request.getContextPath \"/upload/\" name \".\" ext);
}
if (i == 3){
obj.setUrl4(request.getContextPath \"/upload/\" name \".\" ext);
}
if (i == 4){
obj.setUrl5(request.getContextPath \"/upload/\" name \".\" ext);
}
}
}
}

5. 項(xiàng)目?jī)?yōu)化

對(duì)于前后端不分離的項(xiàng)目,多數(shù)使用的是頁(yè)面緩存優(yōu)化,當(dāng)系統(tǒng)某一瞬間遭受巨大流量時(shí),當(dāng)?shù)谝粋€(gè)用戶進(jìn)行頁(yè)面訪問時(shí)可以將該頁(yè)面數(shù)據(jù)進(jìn)行緩存,這樣,后來(lái)的用戶訪問到的頁(yè)面都是從緩存中獲取的,這樣就減少了 對(duì)數(shù)據(jù)庫(kù)的操作,減輕了數(shù)據(jù)庫(kù)的壓力,從而達(dá)到優(yōu)化的處理。

① 導(dǎo)入依賴

<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--commons-pools2 對(duì)象池依賴-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>

② yaml配置

## Redis配置
redis:
# 服務(wù)器地址
host: localhost
# 端口
port: 6379
# 數(shù)據(jù)庫(kù)
database: 0
# 超時(shí)時(shí)間
connect-timeout: 10000ms
lettuce:
pool:
# 最大連接數(shù)
max-active: 8
# 最大連接阻塞等待時(shí)間 默認(rèn) -1
max-wait: 10000ms
# 最大空閑時(shí)間 默認(rèn)8
max-idle: 200
# 最小空閑連接 默認(rèn)8
min-idle: 5

④ Redis序列化處理

@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>;
//key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer);
//value序列化
redisTemplate.setValueSerializer(new GenericJackson2JSONRedisSerializer);
//hash類型key的序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer);
//hash類型value的序列化
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer);
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}

③ 優(yōu)化處理

@Autowired
private NewsService newsService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private ThymeleafViewResolver viewResolver;

@RequestMapping(value = \"/news\",produces = \"text/html;charset=utf-8\")
@ResponseBody
public String roles(Model model, @RequestParam(value = \"pageNo\",defaultValue = \"1\")Integer pageNo
, @RequestParam(value = \"pageSize\",defaultValue = \"10\")Integer pageSize
, HttpServletRequest request, HttpServletResponse response){
//Redis中獲取頁(yè)面,如果不為空,則直接返回頁(yè)面
ValueOperations valueOperations = redisTemplate.opsForValue;
String html = (String) valueOperations.get(\"news-list\");
if (!StringUtils.isEmpty(html)){
return html;
}
PageHelper.startPage(pageNo,pageSize);
List<News> list = newsService.list;
PageInfo<News> pageInfo = new PageInfo<>(list);
model.addAttribute(\"news\",list);
model.addAttribute(\"pageInfo\",pageInfo);
//如果為空,手動(dòng)渲染,存入Redis中并返回
WebContext context = new WebContext(request, response, request.getServletContext, request.getLocale, model.asMap);
html = viewResolver.getTemplateEngine.process(\"news-list\", context);
if (!StringUtils.isEmpty(html)){
//給緩存設(shè)置過期時(shí)間
valueOperations.set(\"news-list\",html,60, TimeUnit.SECONDS);
}
return html;
}

④ Redis查看

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

6. 注意事項(xiàng)

注意@Controller和@RestController的區(qū)別,本項(xiàng)目使用的是模板渲染頁(yè)面,而@Controller就是用來(lái)響應(yīng)頁(yè)面的;而@RestController是用來(lái)返回Json

在項(xiàng)目?jī)?yōu)化階段需要在方法上添加注解@ResponseBody,因?yàn)槲覀兪菍⒄麄€(gè)頁(yè)面進(jìn)行緩存 ,所以要將頁(yè)面轉(zhuǎn)換成JSON進(jìn)行存儲(chǔ)。

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

注入Thymeleaf解析器,將具體的 頁(yè)面進(jìn)行解析成Json字符串進(jìn)行存儲(chǔ)

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

將存入Redis中的數(shù)據(jù)加上過期時(shí)間,因?yàn)轫?yè)面中的數(shù)據(jù)要和數(shù)據(jù)庫(kù)保持一致,如果用戶看到是幾十秒之前或一分鐘之前的數(shù)據(jù)還是勉強(qiáng)可以接受的。

你敢信?開發(fā)一個(gè)管理系統(tǒng)我只用了兩天!附源碼

目前代碼已經(jīng)同步到Gitee:

https://gitee.com/gao-wumao/supplier

如果有需要的自行前去倉(cāng)庫(kù)拉取

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2022年12月17日 上午10:44
下一篇 2022年12月17日 上午10:58

相關(guān)推薦

  • 漢語(yǔ)言文學(xué)能參加什么科研項(xiàng)目比賽(漢語(yǔ)言文學(xué)能參加什么科研項(xiàng)目)

    漢語(yǔ)言文學(xué)是一門涵蓋廣泛的學(xué)科,可以應(yīng)用于許多不同的科研項(xiàng)目中。以下是一些可以參加的漢語(yǔ)言文學(xué)科研項(xiàng)目: 1. 文化多樣性研究:文化多樣性是當(dāng)前全球化時(shí)代的一個(gè)重要議題。漢語(yǔ)言文學(xué)…

    科研百科 2024年4月3日
    287
  • 科研項(xiàng)目經(jīng)費(fèi)考核方案

    科研項(xiàng)目經(jīng)費(fèi)考核方案 隨著科技的不斷發(fā)展,科研項(xiàng)目經(jīng)費(fèi)的重要性也越來(lái)越凸顯。科研項(xiàng)目經(jīng)費(fèi)的考核方案不僅可以幫助機(jī)構(gòu)更好地管理資金,還可以提高科研項(xiàng)目的質(zhì)量和效率。本文將介紹一種科研…

    科研百科 2025年3月17日
    5
  • 圖書管理系統(tǒng)項(xiàng)目期望

    圖書管理系統(tǒng)項(xiàng)目期望 隨著現(xiàn)代社會(huì)的發(fā)展,圖書館成為了人們獲取知識(shí)的重要場(chǎng)所。然而,傳統(tǒng)的圖書館系統(tǒng)存在一些問題,例如書籍信息不準(zhǔn)確、借閱流程復(fù)雜、用戶權(quán)限不足等。因此,開發(fā)一款現(xiàn)…

    科研百科 2024年12月25日
    6
  • 校務(wù)管理系統(tǒng)項(xiàng)目背景

    校務(wù)管理系統(tǒng)項(xiàng)目背景 學(xué)校是一個(gè)國(guó)家的重要教育機(jī)構(gòu),它為國(guó)家的繁榮和穩(wěn)定做出了巨大貢獻(xiàn)。然而,隨著學(xué)校規(guī)模的不斷擴(kuò)大和教學(xué)任務(wù)的日益增加,學(xué)校管理也變得越來(lái)越復(fù)雜。因此,開發(fā)一套校…

    科研百科 2025年6月19日
    0
  • 全國(guó)科研項(xiàng)目高校資金表

    全國(guó)科研項(xiàng)目高校資金表 隨著國(guó)家對(duì)于高等教育的重視,高??蒲许?xiàng)目也越來(lái)越受到關(guān)注。然而,如何分配和支配這些資金,成為了高??茖W(xué)家們新的挑戰(zhàn)。今天,我們發(fā)布了最新的全國(guó)科研項(xiàng)目高校資…

    科研百科 2025年4月1日
    5
  • 如何注冊(cè)一家進(jìn)出口公司(如何注冊(cè)一家進(jìn)出口公司營(yíng)業(yè)執(zhí)照)

    雖然說2019年是出口與進(jìn)口貿(mào)易不好的一年,但是也并非說進(jìn)出口貿(mào)易沒有前途,國(guó)際化是未來(lái)的趨勢(shì),即使偶爾有貿(mào)易戰(zhàn)那也只是暫時(shí)的,所以說,做進(jìn)出口貿(mào)易還是有前途的,那么,要如何注冊(cè)進(jìn)…

    科研百科 2024年4月23日
    62
  • 美國(guó)國(guó)防科研項(xiàng)目排名榜

    美國(guó)國(guó)防科研項(xiàng)目排名榜 隨著全球安全形勢(shì)的不斷變化,美國(guó)國(guó)防科研項(xiàng)目的重要性也越來(lái)越凸顯。在過去的幾十年中,美國(guó)國(guó)防科研項(xiàng)目取得了巨大的成就,這些項(xiàng)目不僅為美國(guó)的國(guó)家安全提供了有力…

    科研百科 2025年5月23日
    1
  • 低代碼開發(fā)平臺(tái)之心通達(dá)OA速卓開發(fā)平臺(tái)(心通達(dá)oa下載)

    低代碼開發(fā)平臺(tái)之心通達(dá)OA速卓開發(fā)平臺(tái) 速卓開發(fā)平臺(tái)是心通達(dá)OA研發(fā)的一款面向數(shù)字化管理員的低代碼開發(fā)工具,擁有可視化表單、自動(dòng)化流程、智能報(bào)表、豐富API接口等強(qiáng)大功能,通過拖拉…

    科研百科 2024年5月18日
    43
  • 贛州到會(huì)昌的定制快車多少錢

    贛州到會(huì)昌的定制快車多少錢 從贛州到會(huì)昌,這是一條非常重要的線路,因?yàn)闀?huì)昌是江西省的一個(gè)重要城市,也是贛江的畔城市。這條線路也是很多游客前往贛江畔城市的重要選擇之一。 目前,從贛州…

    科研百科 2024年10月27日
    11
  • 開源的低碼設(shè)計(jì)系統(tǒng)

    開源的低碼設(shè)計(jì)系統(tǒng)開源的低碼設(shè)計(jì)系統(tǒng) 1、產(chǎn)品設(shè)計(jì):設(shè)計(jì)出產(chǎn)品本質(zhì),搭建消費(fèi)者的虛擬世界,通過創(chuàng)設(shè)消費(fèi)者體驗(yàn)、合作合作、體驗(yàn)、創(chuàng)意等游戲來(lái)發(fā)揮創(chuàng)造者的作用。2、說明:消費(fèi)者的創(chuàng)造性…

    科研百科 2024年11月22日
    6
国产又大又黄又粗又长| 久久久久婷婷婷| 午夜福利162| 色欲无码乱码| 无码毛片视频一区二区免费播放| 亚洲www,成人网站在线观看| a级毛片网页| 美性色色就是干国产在线| 午夜 激情 极品 一区| 大鸡巴操操B| 小h片一区二区| 欧美黄片级黄片| 美女视频黄a| 天天干天天射天| 日韩夜夜夜一区二区三区| chaoporn亚洲在线| 一区=区三区日韩欧美| 婷婷午夜激情网| 偷拍二区中文字幕视频| 色欲网站一区二区| 日本一区二区群交视频| 成年人福利av| 国产精品久久久久久久麻豆| 好吊视频一区二区在线观看| 黄色AV链接在线观看| 洛南县| 美女AV在线搞| 久久中文字幕无码Aⅴ| 操逼99一区二区| 亚洲三区 久久| vip色哟哟五月婷婷在线一区二区| 午夜激情视频免费| 日插夜插| 涩爱av无码| 全国免费啪视频| 囯产一区欧美在线| 久久黄色三及片| 深夜福利全集| 色大香蕉91| 午夜美女在线一区| 欧美操大骚逼。|