Browse Source

增加系统exe文件管理页面

jingbo 5 months ago
parent
commit
5e62c6e392

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesClientDao.java

@@ -0,0 +1,15 @@
+package com.jeesite.modules.mes.dao;
+
+import com.jeesite.common.dao.CrudDao;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import com.jeesite.modules.mes.entity.MesClient;
+
+/**
+ * 客户端版本管理DAO接口
+ * @author jingbo
+ * @version 2026-05-25
+ */
+@MyBatisDao
+public interface MesClientDao extends CrudDao<MesClient> {
+	MesClient findLatestVersion(MesClient mesClient);
+}

+ 77 - 0
src/main/java/com/jeesite/modules/mes/entity/MesClient.java

@@ -0,0 +1,77 @@
+package com.jeesite.modules.mes.entity;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+import com.jeesite.common.entity.DataEntity;
+import com.jeesite.common.mybatis.annotation.Column;
+import com.jeesite.common.mybatis.annotation.Table;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+
+/**
+ * 客户端版本管理Entity
+ * @author jingbo
+ * @version 2026-05-25
+ */
+@Table(name="mes_client", alias="a", label="客户端版本管理信息", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="version", attrName="version", label="版本号", isUpdateForce=true),
+		@Column(name="content", attrName="content", label="更新内容", queryType=QueryType.LIKE),
+		@Column(name="state", attrName="state", label="状态"),
+		@Column(name="create_by", attrName="createBy", label="创建者", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="创建时间", isUpdate=false, isQuery=false),
+		@Column(name="update_by", attrName="updateBy", label="更新者", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="更新时间", isQuery=false),
+	}, orderBy="a.update_date DESC"
+)
+public class MesClient extends DataEntity<MesClient> {
+	
+	private static final long serialVersionUID = 1L;
+	private Long version;		// 版本号
+	private String content;		// 更新内容
+	private String state;		// 状态
+	private String path;
+
+	public MesClient() {
+		this(null);
+	}
+	
+	public MesClient(String id){
+		super(id);
+	}
+	
+	public Long getVersion() {
+		return version;
+	}
+
+	public void setVersion(Long version) {
+		this.version = version;
+	}
+	
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+	
+	@NotBlank(message="状态不能为空")
+	@Size(min=0, max=1, message="状态长度不能超过 1 个字符")
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getPath() {
+		return path;
+	}
+
+	public void setPath(String path) {
+		this.path = path;
+	}
+	
+}

+ 99 - 0
src/main/java/com/jeesite/modules/mes/service/MesClientService.java

@@ -0,0 +1,99 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.entity.MesClient;
+import com.jeesite.modules.mes.dao.MesClientDao;
+import com.jeesite.modules.file.utils.FileUploadUtils;
+
+/**
+ * 客户端版本管理Service
+ * @author jingbo
+ * @version 2026-05-25
+ */
+@Service
+public class MesClientService extends CrudService<MesClientDao, MesClient> {
+
+	@Autowired
+	private MesClientDao mesClientDao;
+
+	/**
+	 * 获取单条数据
+	 * @param mesClient
+	 * @return
+	 */
+	@Override
+	public MesClient get(MesClient mesClient) {
+		return super.get(mesClient);
+	}
+	
+	/**
+	 * 查询分页数据
+	 * @param mesClient 查询条件
+	 * @param mesClient.page 分页对象
+	 * @return
+	 */
+	@Override
+	public Page<MesClient> findPage(MesClient mesClient) {
+		return super.findPage(mesClient);
+	}
+	
+	/**
+	 * 查询列表数据
+	 * @param mesClient
+	 * @return
+	 */
+	@Override
+	public List<MesClient> findList(MesClient mesClient) {
+		return super.findList(mesClient);
+	}
+	
+	/**
+	 * 保存数据(插入或更新)
+	 * @param mesClient
+	 */
+	@Override
+	@Transactional
+	public void save(MesClient mesClient) {
+		super.save(mesClient);
+		// 保存上传附件
+		FileUploadUtils.saveFileUpload(mesClient, mesClient.getId(), "mesClient_file");
+	}
+	
+	/**
+	 * 更新状态
+	 * @param mesClient
+	 */
+	@Override
+	@Transactional
+	public void updateStatus(MesClient mesClient) {
+		super.updateStatus(mesClient);
+	}
+	
+	/**
+	 * 删除数据
+	 * @param mesClient
+	 */
+	@Override
+	@Transactional
+	public void delete(MesClient mesClient) {
+		super.delete(mesClient);
+	}
+
+	/**
+	 * 获取app最新版本
+	 * @return
+	 */
+	public MesClient findLatestVersion(){
+		MesClient mesClient = new MesClient();
+		mesClient.setState("0");
+		return mesClientDao.findLatestVersion(mesClient);
+	}
+	
+}

+ 154 - 0
src/main/java/com/jeesite/modules/mes/web/MesClientController.java

@@ -0,0 +1,154 @@
+package com.jeesite.modules.mes.web;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.List;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeesite.common.collect.ListUtils;
+import com.jeesite.common.lang.ObjectUtils;
+import com.jeesite.modules.file.entity.FileUpload;
+import com.jeesite.modules.file.service.FileUploadService;
+import com.jeesite.modules.mes.resp.CommonResp;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.jeesite.common.config.Global;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesClient;
+import com.jeesite.modules.mes.service.MesClientService;
+
+/**
+ * 客户端版本管理Controller
+ * @author jingbo
+ * @version 2026-05-25
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesClient")
+public class MesClientController extends BaseController {
+
+	@Autowired
+	private MesClientService mesClientService;
+
+	@Resource
+	private FileUploadService fileUploadService;
+	
+	/**
+	 * 获取数据
+	 */
+	@ModelAttribute
+	public MesClient get(String id, boolean isNewRecord) {
+		return mesClientService.get(id, isNewRecord);
+	}
+	
+	/**
+	 * 查询列表
+	 */
+	@RequiresPermissions("mes:mesClient:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesClient mesClient, Model model) {
+		model.addAttribute("mesClient", mesClient);
+		return "modules/mes/mesClientList";
+	}
+	
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesClient:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesClient> listData(MesClient mesClient, HttpServletRequest request, HttpServletResponse response) {
+		mesClient.setPage(new Page<>(request, response));
+		Page<MesClient> page = mesClientService.findPage(mesClient);
+		return page;
+	}
+
+	/**
+	 * 查看编辑表单
+	 */
+	@RequiresPermissions("mes:mesClient:view")
+	@RequestMapping(value = "form")
+	public String form(MesClient mesClient, Model model) {
+		model.addAttribute("mesClient", mesClient);
+		return "modules/mes/mesClientForm";
+	}
+
+	/**
+	 * 保存数据
+	 */
+	@RequiresPermissions("mes:mesClient:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesClient mesClient) {
+		mesClientService.save(mesClient);
+		return renderResult(Global.TRUE, text("保存客户端版本管理成功!"));
+	}
+	
+	/**
+	 * 删除数据
+	 */
+	@RequiresPermissions("mes:mesClient:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesClient mesClient) {
+		mesClientService.delete(mesClient);
+		return renderResult(Global.TRUE, text("删除客户端版本管理成功!"));
+	}
+
+
+	/**
+	 *  获取最新版本
+	 *
+	 */
+	@RequestMapping(value = "findLatestVersion")
+	@ResponseBody
+	public void findLatestVersion(HttpServletRequest request,HttpServletResponse response){
+		try {
+			MesClient mesClient = mesClientService.findLatestVersion();
+			if (ObjectUtils.isEmpty(mesClient)){
+				response.setContentType("text/html;charset=utf-8");
+				response.getWriter().write("暂无版本记录");
+				return;
+			}
+
+			// 获取文件
+			FileUpload fu = new FileUpload();
+			fu.setBizKey(mesClient.getId());
+			fu.setBizType("mesClient_file");
+			List<FileUpload> finfo = fileUploadService.findList(fu);
+			if (ListUtils.isEmpty(finfo)){
+				response.setContentType("text/html;charset=utf-8");
+				response.getWriter().write("暂无可下载的文件");
+				return;
+			}
+
+			// 构建完整的文件URL
+			String host = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/js";
+			String fileUrl = host + finfo.get(0).getFileUrl();
+
+			// 重定向到文件地址进行下载
+			response.sendRedirect(fileUrl);
+		} catch (Exception e) {
+			logger.error("下载客户端版本文件失败", e);
+			try {
+				response.setContentType("text/html;charset=utf-8");
+				response.getWriter().write("下载失败:" + e.getMessage());
+			} catch (Exception ex) {
+				logger.error("响应错误信息失败", ex);
+			}
+		}
+	}
+
+
+}

+ 24 - 0
src/main/resources/mappings/modules/mes/MesClientDao.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeesite.modules.mes.dao.MesClientDao">
+	
+	<!-- 查询数据
+	<select id="findList" resultType="MesClient">
+		SELECT ${sqlMap.column.toSql()}
+		FROM ${sqlMap.table.toSql()}
+		<where>
+			${sqlMap.where.toSql()}
+		</where>
+		ORDER BY ${sqlMap.order.toSql()}
+	</select> -->
+
+    <select id="findLatestVersion" resultType="com.jeesite.modules.mes.entity.MesClient">
+        SELECT ${sqlMap.column.toSql()}
+        FROM ${sqlMap.table.toSql()}
+        <where>
+            ${sqlMap.where.toSql()}
+        </where>
+        ORDER BY create_date DESC
+        Limit 1
+    </select>
+</mapper>

+ 12 - 1
src/main/resources/views/include/sysIndex/topMenuUser.html

@@ -14,6 +14,10 @@
 		</li>
 		<li class="divider"></li>
 		<li>
+			<a href="javascript:" id="downloadClient">
+			<i class="fa fa-cloud-download"></i> ${text('客户端下载')}</a>
+		</li>
+		<li>
 			<a href="${ctx}/logout">
 			<i class="fa fa-sign-out"></i> ${text('退出登录')}</a>
 		</li>
@@ -50,4 +54,11 @@
 		<% } %>
 		<li class="mt10"></li>
 	</ul>
-</li>
+</li>
+<script>
+	$(document).ready(function(){
+		$('#downloadClient').click(function(){
+			window.location.href = '${ctx}/mes/mesClient/findLatestVersion';
+		});
+	});
+</script>

+ 89 - 0
src/main/resources/views/modules/mes/mesClientForm.html

@@ -0,0 +1,89 @@
+<% layout('/layouts/default.html', {title: '客户端版本管理管理', libs: ['validate','fileupload']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header with-border">
+			<div class="box-title">
+				<i class="fa icon-note"></i> ${text(mesClient.isNewRecord ? '新增客户端版本管理' : '编辑客户端版本管理')}
+			</div>
+			<div class="box-tools pull-right">
+				<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
+			</div>
+		</div>
+		<#form:form id="inputForm" model="${mesClient}" action="${ctx}/mes/mesClient/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('版本号')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="version" maxlength="9" class="form-control digits"/>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="row">
+					<div class="col-xs-12">
+						<div class="form-group">
+							<label class="control-label col-sm-2" title="">
+								<span class="required hide">*</span> ${text('更新内容')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-10">
+								<#form:textarea path="content" rows="4" class="form-control"/>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required ">*</span> ${text('状态')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:select path="state" dictType="mes_app_status" class="form-control required" />
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="row">
+					<div class="col-xs-12">
+						<div class="form-group">
+							<label class="control-label col-sm-2">
+								<span class="required hide">*</span> ${text('附件上传')}:</label>
+							<div class="col-sm-10">
+								<#form:fileupload id="uploadFile" bizKey="${mesClient.id}" bizType="mesClient_file"
+									uploadType="all" class="" readonly="false" preview="true"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesClient:edit')){ %>
+							<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
+						<% } %>
+						<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
+					</div>
+				</div>
+			</div>
+		</#form:form>
+	</div>
+</div>
+<% } %>
+<script>
+$("#inputForm").validate({
+	submitHandler: function(form){
+		js.ajaxSubmitForm($(form), function(data){
+			js.showMessage(data.message);
+			if(data.result == Global.TRUE){
+				js.closeCurrentTabPage(function(contentWindow){
+					contentWindow.page();
+				});
+			}
+		}, "json");
+    }
+});
+</script>

+ 75 - 0
src/main/resources/views/modules/mes/mesClientList.html

@@ -0,0 +1,75 @@
+<% layout('/layouts/default.html', {title: '客户端版本管理管理', libs: ['dataGrid']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header">
+			<div class="box-title">
+				<i class="fa icon-notebook"></i> ${text('客户端版本管理管理')}
+			</div>
+			<div class="box-tools pull-right">
+				<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
+				<% if(hasPermi('mes:mesClient:edit')){ %>
+					<a href="${ctx}/mes/mesClient/form" class="btn btn-default btnTool" title="${text('新增客户端版本管理')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
+				<% } %>
+				<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
+			</div>
+		</div>
+		<div class="box-body">
+			<#form:form id="searchForm" model="${mesClient}" action="${ctx}/mes/mesClient/listData" method="post" class="form-inline hide"
+					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+				<div class="form-group">
+					<label class="control-label">${text('版本号')}:</label>
+					<div class="control-inline">
+						<#form:input path="version" maxlength="9" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('更新内容')}:</label>
+					<div class="control-inline">
+						<#form:input path="content" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('状态')}:</label>
+					<div class="control-inline width-120">
+						<#form:select path="state" dictType="mes_app_status" blankOption="true" class="form-control"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
+					<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
+				</div>
+			</#form:form>
+			<table id="dataGrid"></table>
+			<div id="dataGridPage"></div>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+// 初始化DataGrid对象
+$('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("版本号")}', name:'version', index:'a.version', width:150, align:"left", frozen:true, formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesClient/form?id='+row.id+'" class="btnList" data-title="${text("编辑客户端版本管理")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("更新内容")}', name:'content', index:'a.content', width:150, align:"left"},
+		{header:'${text("状态")}', name:'state', index:'a.state', width:150, align:"center", formatter: function(val, obj, row, act){
+				return js.getDictLabel(${@DictUtils.getDictListJson('mes_app_status')}, val, '${text("未知")}', true);
+			}},
+		{header:'${text("更新时间")}', name:'updateDate', index:'a.update_date', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesClient:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesClient/form?id='+row.id+'" class="btnList" title="${text("编辑客户端版本管理")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesClient/delete?id='+row.id+'" class="btnList" title="${text("删除客户端版本管理")}" data-confirm="${text("确认要删除该客户端版本管理吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	// 加载成功后执行事件
+	ajaxSuccess: function(data){
+		
+	}
+});
+</script>