作者主頁:編程指南針
作者簡(jiǎn)介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、CSDN博客專家 、CSDN內(nèi)容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構(gòu)師設(shè)計(jì)經(jīng)驗(yàn)、騰訊課堂常駐講師
主要內(nèi)容:Java項(xiàng)目、Python項(xiàng)目、前端項(xiàng)目、人工智能與大數(shù)據(jù)、簡(jiǎn)歷模板、學(xué)習(xí)資料、面試題庫、技術(shù)互助
收藏點(diǎn)贊不迷路? 關(guān)注作者有好處
文末獲取源碼?
項(xiàng)目編號(hào):BS-XCX-021
一,環(huán)境介紹
語言環(huán)境:Java:? jdk1.8
數(shù)據(jù)庫:Mysql: mysql5.7
應(yīng)用服務(wù)器:Tomcat:? tomcat8.5.31
開發(fā)工具:IDEA或eclipse
前端開發(fā)技術(shù):Uniapp生成微信小程序+vue+nodejs
后臺(tái)開發(fā)技術(shù):springboot+mybatisplus
二,項(xiàng)目簡(jiǎn)介
2.1?需求分析
本課題主要是要實(shí)現(xiàn)一個(gè)基于微信小程序的比賽編排管理系統(tǒng),主要是為了方便于當(dāng)下各類小型比賽的賽制活動(dòng)安排,減少人力的投入,提升比賽管理系統(tǒng)效率。系統(tǒng)基于微信小程序開發(fā),后臺(tái)采用Java技術(shù)平臺(tái)來完成服務(wù)接口和業(yè)務(wù)邏輯的開發(fā)處理。主要實(shí)現(xiàn)在小程序端的比賽信息展示,比賽的編排結(jié)果展示,體育新的展示,對(duì)比賽的點(diǎn)贊、評(píng)論、收藏和在線報(bào)名操作,以及個(gè)人中心管理功能。后臺(tái)管理主要實(shí)現(xiàn)對(duì)于基本信息的管理,包含用戶管理、賽事管理、賽事編排管理、體育新聞管理等相關(guān)數(shù)據(jù)管理模塊。比賽管理的相關(guān)業(yè)務(wù)數(shù)據(jù)采用MySQL5.7來進(jìn)行管理,程序整設(shè)計(jì)采用三層架構(gòu),完成一個(gè)前后端分離的比賽編排管理系統(tǒng)。系統(tǒng)整體設(shè)計(jì)功能完整,結(jié)構(gòu)清晰,用戶體驗(yàn)效果較好。
在對(duì)小型比賽自動(dòng)編排系統(tǒng)進(jìn)行開發(fā)時(shí),首要任務(wù)就是對(duì)系統(tǒng)的需求進(jìn)行分析,包含功能性需求分析和非功能性需求分析。系統(tǒng)最終實(shí)現(xiàn)的目標(biāo)是,實(shí)現(xiàn)比賽賽事的信息化管理,通過計(jì)算機(jī)信息化來替代原來的人工操作,簡(jiǎn)化賽事管理和編排的工作量,提升工作效率。經(jīng)過對(duì)舉辦過賽事的人群進(jìn)行走訪了解和調(diào)查分析,得出本系統(tǒng)主要兩類用戶,一個(gè)是小程序端用戶,一類是后臺(tái)管理員用戶。
下面分別展示一下各個(gè)角色對(duì)應(yīng)的用例圖。
前端用戶的主要功能如圖1所示。
圖1 前端用例圖
后臺(tái)管理用戶主要的功能用例如圖2所示。
圖2 教師用例圖
系統(tǒng)管理員的主要功能如下圖3所示。
圖3 管理員用例圖
2.2?功能設(shè)計(jì)
微信小程序端的選手用戶的業(yè)務(wù)功能模塊根據(jù)以上的需求分析,主要包含以下幾個(gè)業(yè)務(wù)模塊,具體的功能展示如下圖4所示功能結(jié)構(gòu)圖。
圖4 選手功能模塊
(1)注冊(cè)登陸:小型比賽自動(dòng)編排系統(tǒng)中的選手用戶,需要注冊(cè)后才可以登陸系統(tǒng)進(jìn)行相關(guān)的業(yè)務(wù)操作。
(2)新聞瀏覽:選手用戶可以在線進(jìn)行新聞信息的瀏覽操作,并可以對(duì)新聞進(jìn)行點(diǎn)贊和評(píng)論操作。
(3)公告瀏覽:可以在微信小程序端查看系統(tǒng)發(fā)布的平臺(tái)公告信息。
(4)賽事瀏覽:可以查看系統(tǒng)管理員發(fā)布的比賽信息。
(5)賽事編排查看:可以查看平臺(tái)對(duì)于舉辦的賽事編排的情況。
(6)在線報(bào)名:可以實(shí)現(xiàn)用戶在線報(bào)名操作,用戶進(jìn)入賽事詳情中查看時(shí)可以點(diǎn)擊報(bào)名進(jìn)行在線報(bào)名操作。
(7)在線互動(dòng):可以在賽事詳情中進(jìn)行點(diǎn)贊、收藏和評(píng)論等互動(dòng)操作。
(8)個(gè)人中心:可以在個(gè)人中心處管理個(gè)人的信息、收藏的信息、個(gè)人報(bào)名的信息等。
管理員用戶登陸賽事管理系統(tǒng)的后臺(tái)主要進(jìn)行一些基礎(chǔ)數(shù)據(jù)的管理操作,包含用戶管理、賽事管理、編排管理、新聞管理等模塊,具體本用戶角色的的業(yè)務(wù)功能模塊如圖5所示。
圖5管理員功能模塊
(1)用戶管理:小型比賽自動(dòng)編排系統(tǒng)中的選手用戶,注冊(cè)后的信息可以在后臺(tái)由管理員進(jìn)行相應(yīng)的管理操作。
(2)管理員管理:可以在后臺(tái)管理管理員用戶信息。
(3)新聞管理:主要管理微信小程序端查看的體育新聞信息。
(4)新聞?lì)愋凸芾恚褐饕菫榉奖阌脩舴诸惒榭葱侣勗O(shè)置的分類信息。
(5)公告管理:系統(tǒng)的公告管理包含公告的增刪改查,數(shù)據(jù)在微信小程序端可以看到。
(6)賽事管理:主要管理系統(tǒng)中安排的比賽賽事情況信息。
(7)賽事編排管理:賽事的編排操作由管理員在后臺(tái)進(jìn)行實(shí)現(xiàn)。
(8)報(bào)名管理:選擇在前端進(jìn)行的報(bào)名信息,可由管理員在后臺(tái)進(jìn)行相應(yīng)的管理操作。
(9)比賽結(jié)果管理:主要對(duì)每場(chǎng)比賽的結(jié)果名次進(jìn)行數(shù)據(jù)處理操作。
(10)輪播圖管理:前端小程序展示的廣告輪播圖片,可以在后臺(tái)由管理員進(jìn)行管理操作。
2.3?數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì)
根據(jù)以上的邏輯結(jié)構(gòu)的數(shù)據(jù)分析,可初步得到系統(tǒng)的基本數(shù)據(jù)架構(gòu),在和用戶進(jìn)行充分的溝通和修改后,最終確定了本系統(tǒng)中用的數(shù)據(jù)庫表結(jié)構(gòu),下面展示一下小型比賽自動(dòng)編排系統(tǒng)中具體的表結(jié)構(gòu)信息。
(1)用戶信息表:此表主要用來存儲(chǔ)系統(tǒng)中參與管理的用戶信息,包含管理員用戶、教師用戶、學(xué)生用戶,不同的用戶通過外鍵關(guān)聯(lián)的身份信息來表示不同的身份,具體的表結(jié)構(gòu)如下表1所示。
表1 用戶信息表(users)
名稱 |
類型 |
空 |
備注 |
user_id |
mediumint(8) |
否 |
用戶ID:[0,8388607]用戶獲取其他與用戶相關(guān)的數(shù)據(jù) |
state |
smallint(1) |
否 |
賬戶狀態(tài):[0,10](1可用|2異常|3已凍結(jié)|4已注銷) |
user_group |
varchar(32) |
是 |
所在用戶組:[0,32767]決定用戶身份和權(quán)限 |
login_time |
timestamp |
否 |
上次登錄時(shí)間: |
phone |
varchar(11) |
是 |
手機(jī)號(hào)碼:[0,11]用戶的手機(jī)號(hào)碼,用于找回密碼時(shí)或登錄時(shí) |
phone_state |
smallint(1) |
否 |
手機(jī)認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證) |
username |
varchar(16) |
否 |
用戶名:[0,16]用戶登錄時(shí)所用的賬戶名稱 |
nickname |
varchar(16) |
是 |
昵稱:[0,16] |
password |
varchar(64) |
否 |
密碼:[0,32]用戶登錄所需的密碼,由6-16位數(shù)字或英文組成 |
|
varchar(64) |
是 |
郵箱:[0,64]用戶的郵箱,用于找回密碼時(shí)或登錄時(shí) |
email_state |
smallint(1) |
否 |
郵箱認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證) |
avatar |
varchar(255) |
是 |
頭像地址:[0,255] |
create_time |
timestamp |
否 |
創(chuàng)建時(shí)間: |
(2)用戶身份信息表:此表主要用來存儲(chǔ)系統(tǒng)中不同用戶的角色身分信息,具體的表結(jié)構(gòu)如下表2所示。
表2 用戶信息表(users_group)
名稱 |
類型 |
空 |
備注 |
group_id |
mediumint(8) unsigned |
否 |
用戶組ID:[0,8388607] |
display |
smallint(4) unsigned |
否 |
顯示順序:[0,1000] |
name |
varchar(16) |
否 |
名稱:[0,16] |
description |
varchar(255) |
是 |
描述:[0,255]描述該用戶組的特點(diǎn)或權(quán)限范圍 |
source_table |
varchar(255) |
是 |
來源表: |
source_field |
varchar(255) |
是 |
來源字段: |
source_id |
int(10) unsigned |
否 |
來源ID: |
register |
smallint(1) unsigned |
是 |
注冊(cè)位置: |
create_time |
timestamp |
否 |
創(chuàng)建時(shí)間: |
update_time |
timestamp |
否 |
更新時(shí)間: |
(3)賽事信息表:此表主要用來存儲(chǔ)系統(tǒng)中設(shè)計(jì)的比賽賽事信息,具體的表結(jié)構(gòu)如下表3所示。
表3 賽事信息表(event)
名稱 |
類型 |
空 |
備注 |
event_id |
int(11) |
否 |
比賽項(xiàng)目ID |
event |
varchar(64) |
是 |
比賽項(xiàng)目 |
project_code |
varchar(64) |
是 |
項(xiàng)目代號(hào) |
competition_format |
varchar(64) |
是 |
比賽賽制 |
event_location |
varchar(64) |
是 |
賽事地點(diǎn) |
competition_schedule |
date |
是 |
比賽日程 |
event_cover |
varchar(255) |
是 |
賽事封面 |
event_details |
text |
是 |
賽事詳情 |
hits |
int(11) |
否 |
點(diǎn)擊數(shù) |
praise_len |
int(11) |
否 |
點(diǎn)贊數(shù) |
recommend |
int(11) |
否 |
智能推薦 |
create_time |
datetime |
否 |
創(chuàng)建時(shí)間 |
update_time |
timestamp |
否 |
更新時(shí)間 |
(4)選手報(bào)名信息表:此表主要用來存儲(chǔ)系統(tǒng)中選手報(bào)名比賽的信息,具體的表結(jié)構(gòu)如下表4所示。
表4 比賽報(bào)名信息表(contestant_registration)
名稱 |
類型 |
空 |
備注 |
contestant_registration_id |
int(11) |
否 |
選手報(bào)名ID |
event |
varchar(64) |
是 |
比賽項(xiàng)目 |
project_code |
varchar(64) |
是 |
項(xiàng)目代號(hào) |
competition_format |
varchar(64) |
是 |
比賽賽制 |
event_location |
varchar(64) |
是 |
賽事地點(diǎn) |
competition_schedule |
date |
是 |
比賽日程 |
player_user |
int(11) |
是 |
選手用戶 |
player_name |
varchar(64) |
是 |
選手姓名 |
recommend |
int(11) |
否 |
智能推薦 |
create_time |
datetime |
否 |
創(chuàng)建時(shí)間 |
update_time |
timestamp |
否 |
更新時(shí)間 |
(5)賽事編排結(jié)果信息表:此表主要用來存儲(chǔ)系統(tǒng)中對(duì)比賽賽事的編排信息,具體的表結(jié)構(gòu)如下表5所示。
表5 比賽賽事編排信息表(arrange_results)
名稱 |
類型 |
空 |
默認(rèn)值 |
其他 |
備注 |
arrange_results_id |
int(11) |
否 |
<auto_increment> |
編排結(jié)果ID |
|
event |
varchar(64) |
是 |
<空> |
比賽項(xiàng)目 |
|
project_code |
varchar(64) |
是 |
<空> |
項(xiàng)目代號(hào) |
|
competition_format |
varchar(64) |
是 |
<空> |
比賽賽制 |
|
player_user |
int(11) |
是 |
0 |
選手用戶 |
|
player_name |
varchar(64) |
是 |
<空> |
選手姓名 |
|
arrange_results |
text |
是 |
編排結(jié)果 |
||
recommend |
int(11) |
否 |
0 |
智能推薦 |
|
create_time |
datetime |
否 |
<INSERT-TimeStamp> |
創(chuàng)建時(shí)間 |
|
update_time |
timestamp |
否 |
<INSERT-TimeStamp> |
更新時(shí)間 |
(6)比賽結(jié)果信息表:此表主要用來存儲(chǔ)系統(tǒng)中各個(gè)場(chǎng)次的比賽結(jié)果信息,具體的表結(jié)構(gòu)如下表6所示。
表6 比賽信息表(competition_results)
名稱 |
類型 |
空 |
備注 |
competition_results_id |
int(11) |
否 |
比賽結(jié)果ID |
event |
varchar(64) |
是 |
比賽項(xiàng)目 |
project_code |
varchar(64) |
是 |
項(xiàng)目代號(hào) |
competition_format |
varchar(64) |
是 |
比賽賽制 |
player_user |
int(11) |
是 |
選手用戶 |
player_name |
varchar(64) |
是 |
選手姓名 |
ranking_of_contestants |
varchar(64) |
是 |
選手名次 |
number_of_victories |
int(11) |
是 |
勝利場(chǎng)數(shù) |
number_of_failed_events |
int(11) |
是 |
失敗場(chǎng)數(shù) |
recommend |
int(11) |
否 |
智能推薦 |
create_time |
datetime |
否 |
創(chuàng)建時(shí)間 |
update_time |
timestamp |
否 |
更新時(shí)間 |
(7)新聞?lì)愋托畔⒈恚捍吮碇饕脕泶鎯?chǔ)系統(tǒng)中存儲(chǔ)的新聞?lì)愋托畔ⅲ唧w的表結(jié)構(gòu)如下表7所示。
表7 新聞?lì)愋托畔⒈?article_type)
名稱 |
類型 |
空 |
備注 |
type_id |
smallint(5) unsigned |
否 |
分類ID:[0,10000] |
display |
smallint(4) unsigned |
否 |
顯示順序:[0,1000]決定分類顯示的先后順序 |
name |
varchar(16) |
否 |
分類名稱:[2,16] |
father_id |
smallint(5) unsigned |
否 |
上級(jí)分類ID:[0,32767] |
description |
varchar(255) |
是 |
描述:[0,255]描述該分類的作用 |
icon |
text |
是 |
分類圖標(biāo): |
url |
varchar(255) |
是 |
外鏈地址:[0,255]如果該分類是跳轉(zhuǎn)到其他網(wǎng)站的情況下,就在該URL上設(shè)置 |
create_time |
timestamp |
否 |
創(chuàng)建時(shí)間: |
update_time |
timestamp |
否 |
更新時(shí)間: |
(8)新聞信息表:此表主要用來存儲(chǔ)系統(tǒng)中添加的體育新聞相關(guān)信息,具體的表結(jié)構(gòu)如下表8所示。
表8 新聞信息表(article)
名稱 |
類型 |
空 |
備注 |
article_id |
mediumint(8) |
否 |
文章id:[0,8388607] |
title |
varchar(125) |
否 |
標(biāo)題:[0,125]用于文章和html的title標(biāo)簽中 |
type |
varchar(64) |
否 |
文章分類:[0,1000]用來搜索指定類型的文章 |
hits |
int(10) |
否 |
點(diǎn)擊數(shù):[0,1000000000]訪問這篇文章的人次 |
praise_len |
int(11) |
否 |
點(diǎn)贊數(shù) |
create_time |
timestamp |
否 |
創(chuàng)建時(shí)間: |
update_time |
timestamp |
否 |
更新時(shí)間: |
source |
varchar(255) |
是 |
來源:[0,255]文章的出處 |
url |
varchar(255) |
是 |
來源地址:[0,255]用于跳轉(zhuǎn)到發(fā)布該文章的網(wǎng)站 |
tag |
varchar(255) |
是 |
標(biāo)簽:[0,255]用于標(biāo)注文章所屬相關(guān)內(nèi)容,多個(gè)標(biāo)簽用空格隔開 |
content |
longtext |
是 |
正文:文章的主體內(nèi)容 |
img |
varchar(255) |
是 |
封面圖 |
description |
text |
是 |
文章描述 |
(9)評(píng)論信息表:此表主要用來存儲(chǔ)系統(tǒng)中用戶對(duì)賽事的評(píng)論基本信息,具體的表結(jié)構(gòu)如下表9所示。
表9 評(píng)論信息表(comment)
名稱 |
類型 |
空 |
備注 |
comment_id |
int(11) |
否 |
評(píng)論ID: |
user_id |
int(11) |
否 |
評(píng)論人ID: |
reply_to_id |
int(11) |
否 |
回復(fù)評(píng)論ID:空為0 |
content |
longtext |
是 |
內(nèi)容: |
nickname |
varchar(255) |
是 |
昵稱: |
avatar |
varchar(255) |
是 |
頭像地址:[0,255] |
create_time |
timestamp |
否 |
創(chuàng)建時(shí)間: |
update_time |
timestamp |
否 |
更新時(shí)間: |
source_table |
varchar(255) |
是 |
來源表: |
source_field |
varchar(255) |
是 |
來源字段: |
source_id |
int(10) unsigned |
否 |
來源ID: |
(10)收藏信息表:此表主要用來存儲(chǔ)系統(tǒng)中用戶對(duì)賽事的收藏基本信息,具體的表結(jié)構(gòu)如下表10所示。
表10 收藏信息表(collect)
名稱 |
類型 |
空 |
備注 |
collect_id |
int(10) unsigned |
否 |
收藏ID: |
user_id |
int(10) unsigned |
否 |
收藏人ID: |
source_table |
varchar(255) |
是 |
來源表: |
source_field |
varchar(255) |
是 |
來源字段: |
source_id |
int(10) unsigned |
否 |
來源ID: |
title |
varchar(255) |
是 |
標(biāo)題: |
img |
varchar(255) |
是 |
封面: |
create_time |
timestamp |
否 |
創(chuàng)建時(shí)間: |
update_time |
timestamp |
否 |
更新時(shí)間: |
三,系統(tǒng)展示
用戶注冊(cè)登錄
?
?
比賽賽事瀏覽
?
?賽事編排
?
比賽結(jié)果
?賽事資訊
?后臺(tái)管理功能模塊
賽事管理
?用戶管理
?比賽編排管理
?選手報(bào)名管理
?
四,核心代碼展示
package com.project.demo.controller.base;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.project.demo.service.base.BaseService;
import com.project.demo.utils.IdWorker;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*/
@Slf4j
public class BaseController<E, S extends BaseService<E>> {
@Setter
protected S service;
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));
if (resultList.size() > 0) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("obj",resultList.get(0));
return success(jsonObject);
} else {
return success(null);
}
}
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/list_group")
public Map<String, Object> listGroup(HttpServletRequest request) {
Map<String,Object> map = service.selectToList(service.readQuery(request), service.readConfig(request));
Map<String,Object> result = new HashMap<>();
result.put("result",map);
return result;
}
@RequestMapping("/bar_group")
public Map<String, Object> barGroup(HttpServletRequest request) {
Map<String, Object> map = service.selectBarGroup(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping(value = {"/count_group", "/count"})
public Map<String, Object> count(HttpServletRequest request) {
Integer value= service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request)));
return success(value);
}
@RequestMapping(value = {"/sum_group", "/sum"})
public Map<String, Object> sum(HttpServletRequest request) {
Integer value = service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request)));
return success(value);
}
@RequestMapping(value = {"/avg_group", "/avg"})
public Map<String, Object> avg(HttpServletRequest request) {
Integer value = service.selectSqlToInteger(service.avg(service.readQuery(request), service.readConfig(request)));
return success(value);
}
// @RequestMapping(value = {"/count_group", "/count"})
// public Map<String, Object> count(HttpServletRequest request) {
// Query count = service.count(service.readQuery(request), service.readConfig(request));
// return success(count.getResultList());
// }
//
// @RequestMapping(value = {"/sum_group", "/sum"})
// public Map<String, Object> sum(HttpServletRequest request) {
// Query count = service.sum(service.readQuery(request), service.readConfig(request));
// return success(count.getResultList());
// }
//
// @RequestMapping(value = {"/avg_group", "/avg"})
// public Map<String, Object> avg(HttpServletRequest request) {
// Query count = service.avg(service.readQuery(request), service.readConfig(request));
// return success(count.getResultList());
// }
@PostMapping("/upload")
public Map<String, Object> upload(@RequestParam(value = "file",required=false) MultipartFile file,HttpServletRequest request) {
log.info("進(jìn)入方法");
if (file.isEmpty()) {
return error(30000, "沒有選擇文件");
}
try {
//判斷有沒路徑,沒有則創(chuàng)建
String filePath = request.getSession().getServletContext().getRealPath("\\") +"\\upload\\";
// String filePath = System.getProperty("user.dir") + "\\target\\classes\\static\\upload\\";
File targetDir = new File(filePath);
if (!targetDir.exists() && !targetDir.isDirectory()) {
if (targetDir.mkdirs()) {
log.info("創(chuàng)建目錄成功");
} else {
log.error("創(chuàng)建目錄失敗");
}
}
// String path = ResourceUtils.getURL("classpath:").getPath() + "static/upload/";
// String filePath = path.replace('/', '\\').substring(1, path.length());
String fileName = file.getOriginalFilename();
int lastIndexOf = fileName.lastIndexOf(".");
//獲取文件的后綴名 .jpg
String suffix = fileName.substring(lastIndexOf);
fileName = IdWorker.getId()+suffix;
File dest = new File(filePath + fileName);
log.info("文件路徑:{}", dest.getPath());
log.info("文件名:{}", dest.getName());
file.transferTo(dest);
JSONObject jsonObject = new JSONObject();
jsonObject.put("url", "/api/upload/" + fileName);
return success(jsonObject);
} catch (IOException e) {
log.info("上傳失?。簕}", e.getMessage());
}
return error(30000, "上傳失敗");
}
// @PostMapping("/import_db")
// public Map<String, Object> importDb(@RequestParam("file") MultipartFile file) throws IOException {
// service.importDb(file);
// return success(1);
// }
//
// @RequestMapping("/export_db")
// public void exportDb(HttpServletRequest request, HttpServletResponse response) throws IOException {
// HSSFWorkbook sheets = service.exportDb(service.readQuery(request), service.readConfig(request));
// response.setContentType("application/octet-stream");
// response.setHeader("Content-disposition", "attachment;filename=employee.xls");
// response.flushBuffer();
// sheets.write(response.getOutputStream());
// sheets.close();
// }
public Map<String, Object> success(Object o) {
Map<String, Object> map = new HashMap<>();
if (o == null) {
map.put("result", null);
return map;
}
if (o instanceof List) {
if (((List) o).size() == 1) {
o = ((List) o).get(0);
map.put("result", o);
}else {
String jsonString = JSONObject.toJSONString(o);
JSONArray objects = service.covertArray(JSONObject.parseArray(jsonString));
map.put("result", objects);
}
} else if (o instanceof Integer || o instanceof String) {
map.put("result", o);
} else {
String jsonString = JSONObject.toJSONString(o);
JSONObject jsonObject = JSONObject.parseObject(jsonString);
JSONObject j = service.covertObject(jsonObject);
map.put("result", j);
}
return map;
}
public Map<String, Object> error(Integer code, String message) {
Map<String, Object> map = new HashMap<>();
map.put("error", new HashMap<String, Object>(4) {{
put("code", code);
put("message", message);
}});
return map;
}
}
五,相關(guān)作品展示
基于Java開發(fā)、Python開發(fā)、PHP開發(fā)、C#開發(fā)等相關(guān)語言開發(fā)的實(shí)戰(zhàn)項(xiàng)目
基于Nodejs、Vue等前端技術(shù)開發(fā)的前端實(shí)戰(zhàn)項(xiàng)目
基于微信小程序和安卓APP應(yīng)用開發(fā)的相關(guān)作品
基于51單片機(jī)等嵌入式物聯(lián)網(wǎng)開發(fā)應(yīng)用
基于各類算法實(shí)現(xiàn)的AI智能應(yīng)用
基于大數(shù)據(jù)實(shí)現(xiàn)的各類數(shù)據(jù)管理和推薦系統(tǒng)
?
文章來源:http://www.zghlxwxcb.cn/news/detail-513009.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-513009.html
到了這里,關(guān)于uniapp小程序開發(fā)|基于微信小程序?qū)崿F(xiàn)小型比賽自動(dòng)編排系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!