栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

freemark实现一个论坛

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

freemark实现一个论坛

首先新建一个站点

 创建之后会在

 front-template文件夹下面自动创建gblt的资源

同时在hosts文件中 把域名写好,这样访问域名的时候就会为其分配对应的资源


我们在common包下创建对应的domain,mapper,service,因为后台管理系统和对应的站点都会使用到这些文件,同时xml文件也放在common包下的resources的mybatis文件夹中

 


在admin包中创建controller用于后台管理系统进行交互

在font包中创建路由controller和directive用于对站点进行交互

并在TagConfig 中队directive进行注册,以便站点的前台页面拿到directive中的标签

所有的站点的切入点都是这个方法

我们首先会访问站点设置中设置的默认首页的网页位置

我们采用form表单的方式去向后台提交数据

 

这里是向bbs路由类中的登录方法提交的数据

这里通过session的方式,把登录的用户数据存起来

登录成功之后,转跳至 当前站点对应的index资源

 


index.ftl

 在前台页面中有许多freekmark的标签

我们通过这些标签可以获取到数据

我

我们创建了一个分类的标签

 

 需要对标签类在TagConfig中进行注册

 

 

 这里我们引入了通用的部分

这里面有对应转跳的各种方法

 

我们点击转跳到板块的方法,就会携带入参(分类id)进入到论坛路由类中的转跳板块方法

 这里我们设置默认拿到的是当前分类下第一个板块的id,直接展示第一个板块下的帖子

同时如果我们点击相应板块 会触发此方法来获取相应板块id

路由类中

 前端页面

 帖子标签类中

 我们可以进入发帖页面进行发帖

 帖子路由类中

 

 我们还可以进入帖子,查看帖子回复和回复

 

login.ftl




    
    

    登录论坛








账号: 密码:

<#include "/${realPath}public/footer.ftl"/>

 index.ftl




    
    
    论坛



<@bbs_classes_list siteId = '13'>
    <#list tag_list as classes>
        
              
             ${classes.id}
            类名: ${classes.name}
            介绍: ${classes.description}
            
<#include "/${realPath}public/footer.ftl"/>

bbs.ftl




    
    

    帖子




    <@bbs_board_list siteId = '13' classId = "${classesId}">
        <#list tag_list as board>
            
                  
                版面: ${board.name}
                版主: ${board.master}
                公告: ${board.pcard}
                
<#if (boardId!=0)>
<@bbs_list siteId = '13' boardId = "${boardId}"> <#list tag_list as bbs>
标题 内容 发布者 发布时间 最后时间
<#if (bbs.topFlag==1)> <#if (bbs.goodFlag==1)>${bbs.title} ${bbs.content} ${bbs.sender} ${bbs.createTime} ${bbs.updateTime}
<#include "/${realPath}public/footer.ftl"/>

writePost.ftl




    
    

    发帖








标题: 内容:

<#include "/${realPath}public/footer.ftl"/>

post.ftl




    
    

    发帖



    
        <@bbs_answer_list siteId = '13' rootId = "${rootId}">
                
帖子标题 帖子内容 发帖人
${tag_bean.title} ${tag_bean.content} ${tag_bean.sender}
<@bbs_answer_list siteId = '13' rootId = "${rootId}"> <#list tag_list as answer>
回复标题 回复内容 回复人 回帖时间 最后时间
${answer.title} ${answer.content} ${answer.sender} ${answer.createTime} ${answer.updateTime}

回复标题: 回复内容:

<#include "/${realPath}public/footer.ftl"/>

footer.ftl


BbsRouterController

package tech.niua.front.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import tech.niua.admin.bbs.domain.Bbs;
import tech.niua.admin.bbs.service.IBbsService;
import tech.niua.admin.bbsanswer.domain.BbsAnswer;
import tech.niua.admin.bbsanswer.service.IBbsAnswerService;
import tech.niua.admin.board.domain.Board;
import tech.niua.admin.board.service.IBoardService;
import tech.niua.admin.classes.service.IClassesService;
import tech.niua.admin.member.domain.Member;
import tech.niua.admin.member.service.IMemberService;
import tech.niua.admin.site.domain.Site;
import tech.niua.common.enums.BusinessType;
import tech.niua.front.annotation.View;
import tech.niua.front.util.FrontUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.File;

@Controller
@RequestMapping("/bs")
@Slf4j
public class BbsRouterController {

    @Autowired
    private FrontUtils frontUtils;
    @Autowired
    private IBbsService bbsService;
    @Autowired
    private IClassesService classesService;
    @Autowired
    private IBoardService boardService;
    @Autowired
    private IBbsAnswerService bbsAnswerService;
    @Autowired
    private IMemberService memberService;
    @Resource
    private HttpSession httpSession;

//    private Long classId;

    @ModelAttribute
    public void addAttributes(Model model) {
        String realPath = frontUtils.getRealTemplatePath();
        Site site = frontUtils.loadSite();
        String staticPath =  "static" + File.separator + frontUtils.getRealTemplatePath();
        model.addAttribute("res", staticPath);
        model.addAttribute("realPath", realPath);
        model.addAttribute("site", site);

    }

    
    @View(value = "登录", businessType = BusinessType.VIEW)
    @RequestMapping(value = {"/login.whtml"})
    public String login(Model model, Member member) {
        String password = member.getPassword();
        String username = member.getUsername();
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",username);
        queryWrapper.eq("password",password);
        Member realMember = memberService.getOne(queryWrapper);
        //把登录的用户存到session里
        if(realMember==null){
            return frontUtils.getRealTemplatePath() + "login";
        }

        httpSession.setAttribute("member",realMember);

        return frontUtils.getRealTemplatePath() + "index";
    }

    
    @View(value = "进入对应分类", businessType = BusinessType.VIEW)
    @RequestMapping("/toBoard/{classesId}.whtml")
    public String toBoard(Model model, @PathVariable("classesId") Long classesId) {
        model.addAttribute("classesId", classesId);
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("class_id",classesId);
        queryWrapper.orderByAsc("id");
        queryWrapper.last("limit 1");
        //默认拿到当前分类的第一个板块
        Board board = boardService.getOne(queryWrapper);
        if(board != null){
            Long boardId = board.getId();
            model.addAttribute("boardId", boardId);
        }
        //如果板块为空,设置板块id为0(因为没有板块的id为0),供前台页面判断是否有板块数据,在前台用到boardId的地方可以判空
        else {
            int boardId = 0;
            model.addAttribute("boardId", boardId);
        }
        model.addAttribute("classesId", classesId);
        return frontUtils.getRealTemplatePath() + "bbs";
    }

    
    @View(value = "进入栏目", businessType = BusinessType.VIEW)
    @RequestMapping(value = {"/toBBS/{boardId}/{classesId}.whtml"})
    public String toBBS(Model model, @PathVariable("boardId") Long boardId,@PathVariable("classesId") Long classesId) {
        model.addAttribute("boardId", boardId);
        model.addAttribute("classesId", classesId);
        return frontUtils.getRealTemplatePath() + "bbs";
    }

    
    @View(value = "发帖", businessType = BusinessType.VIEW)
    @RequestMapping(value = {"/post/{boardId}/{classesId}.whtml"})
    public String post(Model model, @PathVariable("boardId") Long boardId,@PathVariable("classesId") Long classesId) {
        model.addAttribute("boardId", boardId);
        Bbs bbs = new Bbs();
        model.addAttribute("bbs",bbs);
        model.addAttribute("classesId",classesId);
        return frontUtils.getRealTemplatePath() + "writePost";
    }

    
    @View(value = "保存发帖", businessType = BusinessType.VIEW)
    @RequestMapping(value = {"/savePost/{boardId}/{classesId}.whtml"})
    public String savePost(Model model, @PathVariable("boardId") Long boardId, Bbs bbs,@PathVariable("classesId") Long classesId) {
        model.addAttribute("boardId", boardId);
        Site site = frontUtils.loadSite();
        bbs.setSiteId(site.getId());
        bbs.setBoardId(boardId);
        Object object = httpSession.getAttribute("member");
        if(object!=null){
            Member member = (Member) object;
            Long userId = member.getId();
            bbs.setSenderUserId(userId);
            bbs.setSender(member.getNickname());
        }
        bbsService.save(bbs);
        model.addAttribute("classesId", classesId);
        return frontUtils.getRealTemplatePath() + "bbs";
    }

    
    @View(value = "回帖", businessType = BusinessType.VIEW)
    @RequestMapping(value = {"/enterPost/{rootId}.whtml"})
    public String enterPost(Model model, @PathVariable("rootId") Long rootId) {
        model.addAttribute("rootId", rootId);
        return frontUtils.getRealTemplatePath() + "post";
    }

    
    @View(value = "保存回帖", businessType = BusinessType.VIEW)
    @RequestMapping(value = {"/saveAnswer/{rootId}.whtml"})
    public String saveAnswer(Model model, @PathVariable("rootId") Long rootId, BbsAnswer bbsAnswer) {
        model.addAttribute("rootId", rootId);
        Site site = frontUtils.loadSite();
        bbsAnswer.setSiteId(site.getId());
        bbsAnswer.setRootId(rootId);
        Object object = httpSession.getAttribute("member");
        if(object!=null){
            Member member = (Member) object;
            bbsAnswer.setSenderUserId(member.getId());
            bbsAnswer.setSender(member.getNickname());
        }
        bbsAnswerService.save(bbsAnswer);
        return frontUtils.getRealTemplatePath() + "post";
    }


}

ClassesDirective
package tech.niua.front.directive.bbs;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tech.niua.admin.classes.domain.Classes;
import tech.niua.admin.classes.service.IClassesService;

import java.io.IOException;
import java.util.List;
import java.util.Map;
@Component
public class ClassesDirective implements TemplateDirectiveModel {
    public static final String TPL_NAME = "bbs_classes_list";
    public static final String SITE_ID = "siteId";
    public static final String CLASSES_ID = "id";
   @Autowired
   private IClassesService classesService;
    
    public Object list(Object siteId) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        if (siteId != null) {
            queryWrapper.eq("site_id", Long.parseLong(siteId.toString()));
        }
        queryWrapper.eq("deleted_flag",0);
        List classesList = classesService.list(queryWrapper);
        return classesList;
    }
    
    @Override
    public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
        Object siteId = map.get(SITE_ID);
        //Object classesId = map.get(CLASSES_ID);
        environment.setVariable("tag_list", getModel(list(siteId)));

        templateDirectiveBody.render(environment.getOut());
    }

    private DefaultObjectWrapper getBuilder() {
        return new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25).build();
    }

    private TemplateModel getModel(Object o) throws TemplateModelException {
        return this.getBuilder().wrap(o);
    }
}
BoardDirective
package tech.niua.front.directive.bbs;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tech.niua.admin.bbs.service.IBbsService;
import tech.niua.admin.board.domain.Board;
import tech.niua.admin.board.service.IBoardService;
import tech.niua.admin.classes.service.IClassesService;

import java.io.IOException;
import java.util.List;
import java.util.Map;

@Component
public class BoardDirective implements TemplateDirectiveModel {

    public static final String TPL_NAME = "bbs_board_list";
    private static final String CLASS_ID = "classId";
    private static final String SITE_ID = "site_id";




    @Autowired
    private IBbsService bbsService;
    @Autowired
    private IClassesService classesService;
    @Autowired
    private IBoardService boardService;

    public Object list(Object siteId,Object classId) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        if (siteId != null) {
            queryWrapper.eq("site_id", Long.parseLong(siteId.toString()));
        }
        if (classId != null) {
            queryWrapper.eq("class_id", Long.parseLong(classId.toString()));
        }
        queryWrapper.eq("deleted_flag",0);
        List boardList = boardService.list(queryWrapper);
        return boardList;
    }


    
    @Override
    public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
        Object siteId = map.get(SITE_ID);
        Object classId = map.get(CLASS_ID);
        environment.setVariable("tag_list", getModel(list(siteId,classId)));
        templateDirectiveBody.render(environment.getOut());
    }

    private DefaultObjectWrapper getBuilder() {
        return new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25).build();
    }

    private TemplateModel getModel(Object o) throws TemplateModelException {
        return this.getBuilder().wrap(o);
    }
}
BbsDirective
package tech.niua.front.directive.bbs;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tech.niua.admin.bbs.domain.Bbs;
import tech.niua.admin.bbs.service.IBbsService;
import tech.niua.admin.classes.service.IClassesService;

import java.io.IOException;
import java.util.List;
import java.util.Map;

@Component
public class BbsDirective implements TemplateDirectiveModel {

    public static final String TPL_NAME = "bbs_list";
    private static final String BOARD_ID = "boardId";
    private static final String SITE_ID = "site_id";
    @Autowired
    private IBbsService bbsService;
    @Autowired
    private IClassesService classesService;
    public Object list(Object siteId,Object boardId) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        if (siteId != null) {
            queryWrapper.eq("site_id", Long.parseLong(siteId.toString()));
        }
        if (boardId != null) {
            queryWrapper.eq("board_id", Long.parseLong(boardId.toString()));
        }
        queryWrapper.eq("deleted_flag",0);
        queryWrapper.last( "ORDER BY top_flag DESC, to_top_time DESC, tb_bbs.update_time DESC");
        List bbsList = bbsService.list(queryWrapper);

        return bbsList;
    }
    
    @Override
    public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
        Object siteId = map.get(SITE_ID);
        Object boardId = map.get(BOARD_ID);
        environment.setVariable("tag_list", getModel(list(siteId,boardId)));
        templateDirectiveBody.render(environment.getOut());
    }

    private DefaultObjectWrapper getBuilder() {
        return new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25).build();
    }

    private TemplateModel getModel(Object o) throws TemplateModelException {
        return this.getBuilder().wrap(o);
    }
}
BbsAnswerDirective
package tech.niua.front.directive.bbs;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tech.niua.admin.bbs.domain.Bbs;
import tech.niua.admin.bbs.service.IBbsService;
import tech.niua.admin.bbsanswer.domain.BbsAnswer;
import tech.niua.admin.bbsanswer.service.IBbsAnswerService;
import tech.niua.admin.member.domain.Member;
import tech.niua.admin.member.service.IMemberService;

import java.io.IOException;
import java.util.List;
import java.util.Map;

@Component
public class BbsAnswerDirective implements TemplateDirectiveModel {

    public static final String TPL_NAME = "bbs_answer_list";
    private static final String ROOT_ID="rootId";
    private static final String SITE_ID = "site_id";
    @Autowired
    private IBbsAnswerService bbsAnswerService;
    @Autowired
    private IBbsService bbsService;
    @Autowired
    private IMemberService memberService;

    public Object list(Object siteId,Object rootId) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        if (siteId != null) {
            queryWrapper.eq("site_id", Long.parseLong(siteId.toString()));
        }
        if (rootId != null) {
            queryWrapper.eq("root_id", Long.parseLong(rootId.toString()));
        }
        queryWrapper.eq("deleted_flag",0);
        List bbsAnswerList= bbsAnswerService.list(queryWrapper);

        return bbsAnswerList;
    }
    public Object post(Object siteId,Object rootId) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        if (siteId != null) {
            queryWrapper.eq("site_id", Long.parseLong(siteId.toString()));
        }
        if (rootId != null) {
            queryWrapper.eq("id", Long.parseLong(rootId.toString()));
        }
        queryWrapper.eq("deleted_flag",0);
        Bbs bbs = bbsService.getOne(queryWrapper);
        Long userId = bbs.getSenderUserId();
        QueryWrapper memberQueryWrapper = new QueryWrapper<>();
        memberQueryWrapper.eq("id",userId);
        Member member = memberService.getOne(memberQueryWrapper);
        bbs.setSender(member.getNickname());
        return bbs;
    }

    
    @Override
    public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
        Object siteId = map.get(SITE_ID);
        Object rootId = map.get(ROOT_ID);
        environment.setVariable("tag_list", getModel(list(siteId,rootId)));
        environment.setVariable("tag_bean", getModel(post(siteId,rootId)));
        templateDirectiveBody.render(environment.getOut());
    }

    private DefaultObjectWrapper getBuilder() {
        return new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25).build();
    }

    private TemplateModel getModel(Object o) throws TemplateModelException {
        return this.getBuilder().wrap(o);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936535.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号