項目編號: S 061 ,文末獲取源碼。 \color{red}{項目編號:S061,文末獲取源碼。} 項目編號:S061,文末獲取源碼。
目錄
- 一、摘要
- 1.1 項目介紹
- 1.2 項目錄屏
- 二、功能模塊
- 2.1 數據中心模塊
- 2.2 興趣標簽模塊
- 2.3 活動檔案模塊
- 2.4 活動報名模塊
- 2.5 活動留言模塊
- 三、系統設計
- 3.1 用例設計
- 3.2 業務流程設計
- 3.3 數據流程設計
- 3.4 E-R圖設計
- 四、系統展示
- 五、核心代碼
- 5.1 查詢興趣標簽
- 5.2 查詢活動推薦
- 5.3 新增活動報名
- 5.4 新增活動收藏
- 5.5 新增活動留言
- 六、免責說明
一、摘要
1.1 項目介紹
基于JAVA+Vue+SpringBoot+MySQL的用戶畫像活動推薦系統,使用了協同推薦算法,包含了標簽管理、活動檔案、活動收藏、活動報名、活動留言模塊,還包含系統自帶的用戶管理、部門管理、角色管理、菜單管理、日志管理、數據字典管理、文件管理、圖表展示等基礎模塊,用戶畫像活動推薦系統基于角色的訪問控制,給活動管理員、普通用戶使用,可將權限精確到按鈕級別,您可以自定義角色并分配權限,系統適合設計精確的權限約束需求。
1.2 項目錄屏
源碼下載
二、功能模塊
系統平臺設計包括系統網絡配置、數據庫選擇、軟件平臺選擇和硬件平臺選擇。該推薦系統前端使用了Vue.JS,采用MVVM的思想雙向綁定界面和數據;后端采用了Java的框架SpringBoot,使用MyBatis整合MySQL數據庫。
基于用戶畫像的活動推薦系統的功能性需求主要包含數據中心模塊、興趣標簽模塊、活動檔案模塊、活動報名模塊、活動留言模塊這五大模塊,系統是基于瀏覽器運行的web管理后端,其中各個模塊詳細說明如下。
2.1 數據中心模塊
數據中心模塊包含了基于用戶畫像的活動推薦系統的系統基礎配置,如登錄用戶的管理、運營公司組織架構的管理、用戶菜單權限的管理、系統日志的管理、公用文件云盤的管理。
其中登錄用戶管理模塊,由管理員負責運維工作,管理員可以對登錄用戶進行增加、刪除、修改、查詢操作。
組織架構,指的是高校的組織架構,該模塊適用于管理這些組織架構的部門層級和教師的部門歸屬情況。
用戶菜單權限管理模塊,用于管理不同權限的用戶,擁有哪些具體的菜單權限。
系統日志的管理,用于維護用戶登入系統的記錄,方便定位追蹤用戶的操作情況。
公用云盤管理模塊,用于統一化維護基于用戶畫像的活動推薦系統中的圖片,如合同簽訂文件、合同照片等等。
2.2 興趣標簽模塊
興趣標簽是對用戶進行活動推薦的標準,不同的用戶可以有不同的興趣標簽,所以需要對興趣標簽進行維護,興趣標簽的數據包括標簽名稱、標簽狀態、排序值、備注、創建人、創建時間、更新人、更新時間,管理員可以新增、刪除、編輯和條件查詢興趣標簽數據,用戶可以查詢管理員發布的興趣標簽數據。
2.3 活動檔案模塊
活動是活動推薦系統的核心實體,需要建立活動檔案模塊對管理員發布的活動進行管理,活動的字段包括活動標題、活動介紹、活動地點、活動時間、創建人、創建時間、更新人、更新時間,管理員可以新增、刪除、編輯和條件查詢活動數據,用戶可以查詢管理員發布的活動數據。
2.4 活動報名模塊
有了活動數據之后,用戶就可以選擇活動進行報名,進入頁面后各種活動會呈現在用戶面前,用戶可以搜索活動,用戶可以選擇活動參加,活動報名的數據包括報名人、活動名稱、報名日期、報名狀態、創建人、創建時間、更新人、更新時間,管理員可以新增、刪除、編輯和條件查詢活動報名數據,用戶可以申請活動報名,和查詢我的歷史活動報名信息。
2.5 活動留言模塊
在使用基于用戶畫像的活動推薦系統中,用戶可能會有一些問題需要咨詢,所以建立了活動留言模塊,活動留言數據包括留言人、留言內容、留言時間、狀態、備注、回復人、回復內容、回復時間,用戶可以發起活動留言,管理員可以對用戶的留言進行回復和刪除操作。
三、系統設計
3.1 用例設計
3.2 業務流程設計
3.3 數據流程設計
3.4 E-R圖設計
四、系統展示
五、核心代碼
5.1 查詢興趣標簽
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查詢興趣標簽")
public Result<IPage<Label>> getByPage(@ModelAttribute Label label ,@ModelAttribute PageVo page){QueryWrapper<Label> qw = new QueryWrapper<>();if(!ZwzNullUtils.isNull(label.getTitle())) {qw.like("title",label.getTitle());}if(!ZwzNullUtils.isNull(label.getContent())) {qw.like("content",label.getContent());}IPage<Label> data = iLabelService.page(PageUtil.initMpPage(page),qw);return new ResultUtil<IPage<Label>>().setData(data);
}
5.2 查詢活動推薦
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查詢活動")
public Result<IPage<Activity>> getByPage(@ModelAttribute Activity activity ,@ModelAttribute PageVo page){/*** 接受前端傳來的參數,開始模擬搜索*/QueryWrapper<Activity> qw = new QueryWrapper<>();/*** 獲取當前登錄的用戶對象*/User currUser = securityUtil.getCurrUser();if(ZwzNullUtils.isNull(currUser.getLabel())) {currUser.setLabel("");}/*** 分析用戶的興趣標簽*/String[] labelList = currUser.getLabel().split(",");if(!ZwzNullUtils.isNull(activity.getTitle())) {qw.like("title",activity.getTitle());}if(!ZwzNullUtils.isNull(activity.getContent())) {qw.like("content",activity.getContent());}if(!ZwzNullUtils.isNull(activity.getStatus())) {qw.eq("status",activity.getStatus());}/*** 查詢系統全部的活動留言數據*/List<Message> messageList = iMessageService.list();/*** 查詢系統全部的活動預定數據*/List<ActivityOrder> orderList = iActivityOrderService.list();IPage<Activity> data = iActivityService.page(PageUtil.initMpPage(page),qw);for (Activity vo : data.getRecords()) {/*** 判斷登錄用戶是否預定了這個活動*/QueryWrapper<ActivityOrder> orderQw = new QueryWrapper<>();orderQw.eq("act_id",vo.getId());orderQw.eq("user_id",currUser.getId());vo.setOrderFlag(iActivityOrderService.count(orderQw));/*** 判斷收藏*/QueryWrapper<Collect> coQw = new QueryWrapper<>();coQw.eq("user_id",currUser.getId());coQw.eq("act_id",vo.getId());vo.setCoFlag(iCollectService.count(coQw));Long likeNumber = 0L;/*** 自己喜愛的活動,一個標簽加十分*/for (String s : labelList) {if(vo.getLabel().indexOf(s) > -1) {likeNumber += 10L;}}/*** 他人預定,每次加三分*/for (ActivityOrder activityOrder : orderList) {if(Objects.equals(activityOrder.getActId(),vo.getId())) {likeNumber += 3L;}}/*** 被別人留言,每次加兩分*/for (Message message : messageList) {if(message.getContent().indexOf(vo.getTitle()) > -1) {likeNumber += 2L;}}vo.setLikeLevel(likeNumber);}/*** 最后對即將返回的活動數據,針對加權分值降序排序*/Collections.sort(data.getRecords(), new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {return o2.getLikeLevel().compareTo(o1.getLikeLevel());}});/*** 返回給前端*/return new ResultUtil<IPage<Activity>>().setData(data);
}
5.3 新增活動報名
@RequestMapping(value = "/addOne", method = RequestMethod.GET)
@ApiOperation(value = "新增單條活動報名")
public Result<ActivityOrder> addOne(@RequestParam String id){Activity activity = iActivityService.getById(id);if(activity == null) {return ResultUtil.error("活動不存在");}User currUser = securityUtil.getCurrUser();QueryWrapper<ActivityOrder> qw = new QueryWrapper<>();qw.eq("act_id",id);qw.eq("user_id",currUser.getId());iActivityOrderService.remove(qw);ActivityOrder order = new ActivityOrder();order.setActId(activity.getId());order.setTitle(activity.getTitle());order.setContent(activity.getContent());order.setAddress(activity.getAddress());order.setTime(activity.getTime());order.setUserId(currUser.getId());order.setUserName(currUser.getNickname());iActivityOrderService.saveOrUpdate(order);return ResultUtil.success();
}
5.4 新增活動收藏
@RequestMapping(value = "/addOne", method = RequestMethod.GET)
@ApiOperation(value = "新增收藏")
public Result<Object> addOne(@RequestParam String id){Activity a = iActivityService.getById(id);if(a == null) {return ResultUtil.error("活動不存在");}User currUser = securityUtil.getCurrUser();QueryWrapper<Collect> coQw = new QueryWrapper<>();coQw.eq("user_id",currUser.getId());coQw.eq("act_id",a.getId());long coCount = iCollectService.count(coQw);if(coCount < 1) {Collect c = new Collect();c.setUserId(currUser.getId());c.setUserName(currUser.getNickname());c.setActId(a.getId());c.setActTitle(a.getTitle());c.setTime(DateUtil.now());iCollectService.saveOrUpdate(c);}return ResultUtil.success();
}
5.5 新增活動留言
@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增活動留言")
public Result<Message> insert(Message message){Activity activity = iActivityService.getById(message.getActId());if(activity == null) {return ResultUtil.error("活動不存在");}message.setActTitle(activity.getTitle());User currUser = securityUtil.getCurrUser();message.setUserId(currUser.getId());message.setUserName(currUser.getNickname());message.setTime(DateUtil.now());message.setReplyContent("");message.setReplyName("");message.setReplyId("");message.setReplyTime("");iMessageService.saveOrUpdate(message);return new ResultUtil<Message>().setData(message);
}
六、免責說明
- 本項目僅供個人學習使用,商用授權請聯系博主,否則后果自負。
- 博主擁有本軟件構建后的應用系統全部內容所有權及獨立的知識產權,擁有最終解釋權。
- 如有問題,歡迎在倉庫 Issue 留言,看到后會第一時間回復,相關意見會酌情考慮,但沒有一定被采納的承諾或保證。
下載本系統代碼或使用本系統的用戶,必須同意以下內容,否則請勿下載!
- 出于自愿而使用/開發本軟件,了解使用本軟件的風險,且同意自己承擔使用本軟件的風險。
- 利用本軟件構建的網站的任何信息內容以及導致的任何版權糾紛和法律爭議及后果和博主無關,博主對此不承擔任何責任。
- 在任何情況下,對于因使用或無法使用本軟件而導致的任何難以合理預估的損失(包括但不僅限于商業利潤損失、業務中斷與業務信息丟失),博主概不承擔任何責任。
- 必須了解使用本軟件的風險,博主不承諾提供一對一的技術支持、使用擔保,也不承擔任何因本軟件而產生的難以預料的問題的相關責任。