基于SpringBoot+mysql社团管理

学生社团管理系统的使用用户共分为四种:普通浏览者、社团成员、社团负责人和社团管理员。除了普通浏览者外,其它用户都需要通用用户名和密码的进行身份验证,验证成功后通过设计的不同的使用权限,来实现使用或管理系统的各份功能。系统整体模块图如图所示:

 代码已经上传github,下载地址:https://github.com/21503882/association


图4.1 社团管理系统总体结构图
(一)普通浏览者子系统是社团管理系统对外开放的部分, 由于本系统采用BS的模式进行设计,只要浏览者输入网址,就可以登录本系统进行常规的查看。普通浏览者子系统包括新闻资讯查看,社团介绍信息,活动日程信息,访客评论,访客留言信息等。


图4.2浏览者子系统功能模块图
(二)社团成员子系统主要完成社团成员对本站的操作。社团成员的主要操作包括社团成员注册、用户登录、个人资料修改、申请组建社团、申请加入社团、密码修改等。社团成员子系统功能模块图如图4.3所示:

 


图4.3社团成员子系统功能模块图

(三)社团负责人子系统主要完成社团负责人对所管理的社团进行管理与维护的操作,主要包括管理社团简介、新闻资讯管理、近期日程管理、社团成员管理、活动与经费管理、场地器材管理、网站留言管理等。社团负责人子系统功能模块图如图4.4所示:


图4.4社团负责人子系统功能模块图
(四)社团管理员子系统完成系统管理员本系统的管理与维护操作,是本系统最高权限用户,主要包括滚动公告管理、社团负责人管理、社团管理、活动经费审批、器材场地审批、社团成员管理、社团评优管理。社团管理子系统功能模块图如图4.5所示:
 

图4.5 社团管理员子系统功能模块图
 
图5.3 网站首页


 
新闻咨讯

 
社团简介
 
加入社团

 
活动日程

 
访客留言
 
会员中心
 
会员注册

 
注册


会员登录后界面


社团负责人登录后界面:

 

 

 

package me.zbl.activity.controller;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import me.zbl.common.config.Constant;
import me.zbl.common.controller.BaseController;
import me.zbl.common.utils.PageWrapper;
import me.zbl.common.utils.R;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.activiti.rest.editor.model.ModelEditorJsonRestResource;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;

import static org.activiti.editor.constants.ModelDataJsonConstants.*;

/**
 * @author 
 */
@RequestMapping("/activiti")
@RestController
public class ModelController extends BaseController {

  protected static final Logger LOGGER = LoggerFactory.getLogger(ModelEditorJsonRestResource.class);

  @Autowired
  private RepositoryService repositoryService;

  @Autowired
  private ObjectMapper objectMapper;

  @GetMapping("/model")
  ModelAndView model() {
    return new ModelAndView("act/model/model");
  }

  @GetMapping("/model/list")
  PageWrapper list(int offset, int limit) {
    List<Model> list = repositoryService.createModelQuery().listPage(offset
            , limit);
    int total = (int) repositoryService.createModelQuery().count();
    PageWrapper pageUtil = new PageWrapper(list, total);
    return pageUtil;
  }

  @RequestMapping("/model/add")
  public void newModel(HttpServletResponse response) throws UnsupportedEncodingException {

    //初始化一个空模型
    Model model = repositoryService.newModel();
    //设置一些默认信息
    String name = "new-process";
    String description = "";
    int revision = 1;
    String key = "process";

    ObjectNode modelNode = objectMapper.createObjectNode();
    modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
    modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
    modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);

    model.setName(name);
    model.setKey(key);
    model.setMetaInfo(modelNode.toString());

    repositoryService.saveModel(model);
    String id = model.getId();

    //完善ModelEditorSource
    ObjectNode editorNode = objectMapper.createObjectNode();
    editorNode.put("id", "canvas");
    editorNode.put("resourceId", "canvas");
    ObjectNode stencilSetNode = objectMapper.createObjectNode();
    stencilSetNode.put("namespace",
            "http://b3mn.org/stencilset/bpmn2.0#");
    editorNode.put("stencilset", stencilSetNode);
    repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8"));
    try {
      response.sendRedirect("/modeler.html?modelId=" + id);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  @GetMapping(value = "/model/{modelId}/json")
  public ObjectNode getEditorJson(@PathVariable String modelId) {
    ObjectNode modelNode = null;
    Model model = repositoryService.getModel(modelId);
    if (model != null) {
      try {
        if (StringUtils.isNotEmpty(model.getMetaInfo())) {
          modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
        } else {
          modelNode = objectMapper.createObjectNode();
          modelNode.put(MODEL_NAME, model.getName());
        }
        modelNode.put(MODEL_ID, model.getId());
        ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(
                new String(repositoryService.getModelEditorSource(model.getId()), "utf-8"));
        modelNode.put("model", editorJsonNode);

      } catch (Exception e) {
        LOGGER.error("Error creating model JSON", e);
        throw new ActivitiException("Error creating model JSON", e);
      }
    }
    return modelNode;
  }

  @RequestMapping(value = "/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
  public String getStencilset() {
    InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");
    try {
      return IOUtils.toString(stencilsetStream, "utf-8");
    } catch (Exception e) {
      throw new ActivitiException("Error while loading stencil set", e);
    }
  }

  @GetMapping("/model/edit/{id}")
  public void edit(HttpServletResponse response, @PathVariable("id") String id) {
    try {
      response.sendRedirect("/modeler.html?modelId=" + id);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  @DeleteMapping("/model/{id}")
  public R remove(@PathVariable("id") String id) {
    if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
      return R.error(1, "演示系统不允许修改,完整体验请部署程序");
    }
    repositoryService.deleteModel(id);
    return R.ok();
  }

  @PostMapping("/model/deploy/{id}")
  public R deploy(@PathVariable("id") String id) throws Exception {
    if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
      return R.error(1, "演示系统不允许修改,完整体验请部署程序");
    }
    //获取模型
    Model modelData = repositoryService.getModel(id);
    byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());

    if (bytes == null) {
      return R.error("模型数据为空,请先设计流程并成功保存,再进行发布。");
    }

    JsonNode modelNode = new ObjectMapper().readTree(bytes);

    BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
    if (model.getProcesses().size() == 0) {
      return R.error("数据模型不符要求,请至少设计一条主线流程。");
    }
    byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);

    //发布流程
    String processName = modelData.getName() + ".bpmn20.xml";
    Deployment deployment = repositoryService.createDeployment()
            .name(modelData.getName())
            .addString(processName, new String(bpmnBytes, "UTF-8"))
            .deploy();
    modelData.setDeploymentId(deployment.getId());
    repositoryService.saveModel(modelData);

    return R.ok();
  }

  @PostMapping("/model/batchRemove")
  public R batchRemove(@RequestParam("ids[]") String[] ids) {
    if (Constant.DEMO_ACCOUNT.equals(getUsername())) {
      return R.error(1, "演示系统不允许修改,完整体验请部署程序");
    }
    for (String id : ids) {
      repositoryService.deleteModel(id);
    }
    return R.ok();
  }

  @RequestMapping(value = "/model/{modelId}/save", method = RequestMethod.PUT)
  @ResponseStatus(value = HttpStatus.OK)
  public void saveModel(@PathVariable String modelId
          , String name, String description
          , String json_xml, String svg_xml) {
    try {

      Model model = repositoryService.getModel(modelId);

      ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());

      modelJson.put(MODEL_NAME, name);
      modelJson.put(MODEL_DESCRIPTION, description);
      model.setMetaInfo(modelJson.toString());
      model.setName(name);

      repositoryService.saveModel(model);

      repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));

      InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));
      TranscoderInput input = new TranscoderInput(svgStream);

      PNGTranscoder transcoder = new PNGTranscoder();
      // Setup output
      ByteArrayOutputStream outStream = new ByteArrayOutputStream();
      TranscoderOutput output = new TranscoderOutput(outStream);

      // Do the transformation
      transcoder.transcode(input, output);
      final byte[] result = outStream.toByteArray();
      repositoryService.addModelEditorSourceExtra(model.getId(), result);
      outStream.close();

    } catch (Exception e) {
      LOGGER.error("Error saving model", e);
      throw new ActivitiException("Error saving model", e);
    }
  }

  @GetMapping("/model/export/{id}")
  public void exportToXml(@PathVariable("id") String id, HttpServletResponse response) {
    try {
      org.activiti.engine.repository.Model modelData = repositoryService.getModel(id);
      BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
      JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
      BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);
      BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
      byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);

      ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
      IOUtils.copy(in, response.getOutputStream());
      String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml";
      response.setHeader("Content-Disposition", "attachment; filename=" + filename);
      response.flushBuffer();
    } catch (Exception e) {
      throw new ActivitiException("导出model的xml文件失败,模型ID=" + id, e);
    }
  }
}

 代码已经上传github,下载地址:https://github.com/21503882/association

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
校园社团管理系统是一个非常实用的应用,而基于Spring Boot和Vue.js实现该系统是一个不错的选择。Spring Boot是一个流行的Java开发框架,可以快速构建Web应用程序。Vue.js是一个流行的JavaScript框架,用于开发交互式Web界面。 下面是一个简单的校园社团管理系统的实现步骤: 1. 设计数据库模型 根据需求分析,设计合适的数据库模型。可以使用MySQL、Oracle等关系型数据库,或者使用MongoDB等非关系型数据库。 2. 建立Spring Boot项目 使用Spring Initializr创建一个新的Spring Boot项目,添加必要的依赖项,如Spring Data JPA、Spring MVC和MySQL连接器等。在application.properties文件中配置数据库连接信息。 3. 创建Vue.js前端 使用Vue.js创建前端界面。可以使用Vue CLI来创建基本项目结构,使用Vue Router来实现页面路由,使用Axios来发送HTTP请求。 4. 实现后端API 根据需求设计后端API接口,并在Spring Boot中实现。可以使用Spring Data JPA来访问数据库,使用Spring MVC来实现RESTful API。 5. 集成前后端 将Vue.js前端和Spring Boot后端集成在一起。可以使用Webpack来打包前端代码,并将其嵌入到Spring Boot项目中。在Spring Boot中配置CORS(跨域资源共享)以允许前端访问后端API。 6. 测试和部署 对系统进行测试,修复错误和缺陷。将系统部署到云服务器或本地服务器上,以便用户可以访问。 以上是一个简单的校园社团管理系统的实现步骤。当然,具体的实现还需要根据实际需求进行调整和优化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值