Ver código fonte

帮助中心

fanzherong_v 3 meses atrás
pai
commit
796a5a4407
15 arquivos alterados com 944 adições e 1 exclusões
  1. 2 1
      snowy-admin-web/package.json
  2. 32 0
      snowy-admin-web/src/api/biz/helpCenterApi.js
  3. 123 0
      snowy-admin-web/src/views/biz/helpcenter/form.vue
  4. 159 0
      snowy-admin-web/src/views/biz/helpcenter/index.vue
  5. 133 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/controller/HelpCenterController.java
  6. 71 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/entity/HelpCenter.java
  7. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/enums/HelpCenterEnum.java
  8. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/mapper/HelpCenterMapper.java
  9. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/mapper/mapping/HelpCenterMapper.xml
  10. 44 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterAddParam.java
  11. 49 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterEditParam.java
  12. 35 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterIdParam.java
  13. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterPageParam.java
  14. 82 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/service/HelpCenterService.java
  15. 99 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/service/impl/HelpCenterServiceImpl.java

+ 2 - 1
snowy-admin-web/package.json

@@ -55,7 +55,8 @@
 		"vue-router": "4.4.5",
 		"vue3-colorpicker": "2.3.0",
 		"vue3-tree-org": "4.2.2",
-		"vuedraggable-es": "4.1.1"
+		"vuedraggable-es": "4.1.1",
+		"wangeditor": "^4.7.15"
 	},
 	"devDependencies": {
 		"@babel/eslint-parser": "7.25.9",

+ 32 - 0
snowy-admin-web/src/api/biz/helpCenterApi.js

@@ -0,0 +1,32 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/helpcenter/` + url, ...arg)
+
+/**
+ * 帮助中心Api接口管理器
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+export default {
+	// 获取帮助中心分页
+	helpCenterPage(data) {
+		return request('page', data, 'get')
+	},
+	// 提交帮助中心表单 edit为true时为编辑,默认为新增
+	helpCenterSubmitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除帮助中心
+	helpCenterDelete(data) {
+		return request('delete', data)
+	},
+	// 获取帮助中心详情
+	helpCenterDetail(data) {
+		return request('detail', data, 'get')
+	},
+	// 获取帮助中心数据回显
+	helpCenter(data){
+		return request("helpCenter",data,'get')
+	}
+}

+ 123 - 0
snowy-admin-web/src/views/biz/helpcenter/form.vue

@@ -0,0 +1,123 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑帮助中心' : '增加帮助中心'"
+		:width="1200"
+		v-model:open="open"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="标题:" name="helpTitle">
+				<a-input v-model:value="formData.helpTitle" placeholder="请输入标题" allow-clear />
+			</a-form-item>
+			<a-form-item label="内容:" name="helpContext">
+				<div id="editor"></div>
+<!--				<tinymce-editor v-model:value="formData.helpContent" :init="config" />-->
+			</a-form-item>
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+		</template>
+	</xn-form-container>
+</template>
+
+<script setup name="helpCenterForm">
+	//import { ref, reactive, watch } from 'vue';
+	//import { Form, message } from 'ant-design-vue';
+	import { cloneDeep } from 'lodash-es'
+	import { required } from '@/utils/formRules'
+	import helpCenterApi from '@/api/biz/helpCenterApi'
+
+	import E from "wangeditor"
+
+	//import TinymceEditor from '@/components/TinymceEditor/index.vue';
+	//import { uploadFile } from '@/api/system/file';
+
+
+
+	// 抽屉状态
+	const open = ref(false)
+	const emit = defineEmits({ successful: null })
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const submitLoading = ref(false)
+	const editor = ref(null)
+
+	/*const config = ref({
+		height: 525,
+		images_upload_handler: (blobInfo, success, error) => {
+			const file = blobInfo.blob();
+			uploadFile(file, '2').then((res) => {
+				success(API_FILE_PATH_URL + res);
+			}).catch((e) => {
+				error(e.message);
+			});
+		}
+	});*/
+
+	// 打开抽屉
+	const onOpen = (record) => {
+		open.value = true
+		nextTick(() => {
+			editor.value = new E('#editor')
+			// 设置图片上传接口地址
+			editor.value.config.uploadImgServer = 'http://127.0.0.1:82/dev/file/uploadLocalReturnUrl'
+			editor.value.config.customUploadImg = function (files, insertImgFn) {
+				const formData = new FormData()
+				formData.append('file', files[0])
+				//其他参数根据需要自行添加 formData形式与JSON形式自行使用
+				editor.value.config.uploadImgParams.file = files[0]
+				const xhr = new XMLHttpRequest()
+				xhr.open('POST', editor.value.config.uploadImgServer, false)
+				xhr.onload = function (e) {
+					if (xhr.status === 200) {
+						const response = JSON.parse(xhr.responseText)
+						insertImgFn(response.data) // 插入图片
+					}
+				}
+				xhr.send(formData)
+			}
+			editor.value.create()
+		})
+		if (record) {
+			let recordData = cloneDeep(record)
+			formData.value = Object.assign({}, recordData)
+		}
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		formRef.value.resetFields()
+		formData.value = {}
+		open.value = false
+	}
+	// 默认要校验的
+	const formRules = {
+		helpTitle: [required('请输入标题')],
+		helpContext: [required('请输入内容')],
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value
+			.validate()
+			.then(() => {
+				submitLoading.value = true
+				const formDataParam = cloneDeep(formData.value)
+				helpCenterApi
+					.helpCenterSubmitForm(formDataParam, formDataParam.id)
+					.then(() => {
+						onClose()
+						emit('successful')
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			})
+			.catch(() => {})
+	}
+	// 抛出函数
+	defineExpose({
+		onOpen
+	})
+</script>

+ 159 - 0
snowy-admin-web/src/views/biz/helpcenter/index.vue

@@ -0,0 +1,159 @@
+<template>
+	<a-card :bordered="false">
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="标题:" name="helpTitle">
+				<a-input v-model:value="formData.helpTitle" placeholder="请输入标题" allow-clear />
+			</a-form-item>
+			<a-form-item label="内容:" name="helpContext">
+				<div id="editor"></div>
+			</a-form-item>
+		</a-form>
+		<div style="height:60px;width:100%;line-height:60px;">
+			<div style="margin-right:20px;text-align: right">
+				<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+				<a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+			</div>
+		</div>
+
+
+	</a-card>
+<!--	<Form ref="formRef" @successful="tableRef.refresh()" />-->
+</template>
+
+<script setup name="helpcenter">
+	import { cloneDeep } from 'lodash-es'
+	import Form from './form.vue'
+	import helpCenterApi from '@/api/biz/helpCenterApi'
+	import E from "wangeditor"
+	import { required } from '@/utils/formRules'
+
+	const tableRef = ref()
+	const formRef = ref()
+	// 表单数据
+	const formData = ref({})
+	const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+	const editor = ref(null)
+	const submitLoading = ref(false)
+
+	nextTick(() => {
+		editor.value = new E('#editor')
+		// 设置图片上传接口地址 ru
+		editor.value.config.uploadImgServer = 'http://218.2.6.74:8065/minio/batchUploadFile'
+		editor.value.config.customUploadImg = function (files, insertImgFn) {
+			const formData = new FormData()
+			formData.append('imageFile', files[0])
+			formData.append('groupName','bbt')
+			//其他参数根据需要自行添加 formData形式与JSON形式自行使用
+			editor.value.config.uploadImgParams.file = files[0]
+			const xhr = new XMLHttpRequest()
+			xhr.open('POST', editor.value.config.uploadImgServer, false)
+			xhr.onload = function (e) {
+				if (xhr.status === 200) {
+					const response = JSON.parse(xhr.responseText)
+					insertImgFn('https://wx.js-whzl.com:8055/preview/'+response.imageFile) // 插入图片
+				}
+			}
+			xhr.send(formData)
+		}
+		editor.value.create()
+		helpCenterApi.helpCenter().then((res)=>{
+			console.log("res:"+JSON.stringify(res))
+			if(res){
+				formData.value = res
+				editor.value.txt.html(formData.value.helpContext)
+			}
+		})
+	})
+
+	const columns = [
+		{
+			title: '标题',
+			dataIndex: 'helpTitle'
+		},
+		{
+			title: '内容',
+			dataIndex: 'helpContext'
+		},
+	]
+
+	// 默认要校验的
+	const formRules = {
+		helpTitle: [required('请输入标题')],
+		helpContext: [required('请输入内容')],
+	}
+	// 操作栏通过权限判断是否显示
+	if (hasPerm(['helpCenterEdit', 'helpCenterDelete'])) {
+		columns.push({
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: 150
+		})
+	}
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		// columns数字类型字段加入 needTotal: true 可以勾选自动算账
+		alert: {
+			show: true,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	const loadData = (parameter) => {
+		return helpCenterApi.helpCenterPage(parameter).then((data) => {
+			return data
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		tableRef.value.refresh(true)
+	}
+	// 删除
+	const deleteHelpCenter = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		helpCenterApi.helpCenterDelete(params).then(() => {
+			tableRef.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchHelpCenter = (params) => {
+		helpCenterApi.helpCenterDelete(params).then(() => {
+			tableRef.value.clearRefreshSelected()
+		})
+	}
+
+	//保存
+	const onSubmit = () => {
+		/*formRef.value
+			.validate()
+			.then(() => {
+
+			})
+			.catch(() => {})*/
+		submitLoading.value = true
+		formData.value.helpContext = editor.value.txt.html()
+		debugger
+		const formDataParam = cloneDeep(formData.value)
+		helpCenterApi
+			.helpCenterSubmitForm(formDataParam, formDataParam.id)
+			.then(() => {
+				onClose()
+				emit('successful')
+			})
+			.finally(() => {
+				submitLoading.value = false
+			})
+	}
+</script>

+ 133 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/controller/HelpCenterController.java

@@ -0,0 +1,133 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.biz.modular.helpcenter.entity.HelpCenter;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterAddParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterEditParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterIdParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterPageParam;
+import vip.xiaonuo.biz.modular.helpcenter.service.HelpCenterService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 帮助中心控制器
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ */
+@Tag(name = "帮助中心控制器")
+@RestController
+@Validated
+public class HelpCenterController {
+
+    @Resource
+    private HelpCenterService helpCenterService;
+
+    /**
+     * 获取帮助中心分页
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    @Operation(summary = "获取帮助中心分页")
+    @SaCheckPermission("/biz/helpcenter/page")
+    @GetMapping("/biz/helpcenter/page")
+    public CommonResult<Page<HelpCenter>> page(HelpCenterPageParam helpCenterPageParam) {
+        return CommonResult.data(helpCenterService.page(helpCenterPageParam));
+    }
+
+    /**
+     * 添加帮助中心
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    @Operation(summary = "添加帮助中心")
+    @CommonLog("添加帮助中心")
+    @SaCheckPermission("/biz/helpcenter/add")
+    @PostMapping("/biz/helpcenter/add")
+    public CommonResult<String> add(@RequestBody @Valid HelpCenterAddParam helpCenterAddParam) {
+        helpCenterService.add(helpCenterAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑帮助中心
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    @Operation(summary = "编辑帮助中心")
+    @CommonLog("编辑帮助中心")
+    @SaCheckPermission("/biz/helpcenter/edit")
+    @PostMapping("/biz/helpcenter/edit")
+    public CommonResult<String> edit(@RequestBody @Valid HelpCenterEditParam helpCenterEditParam) {
+        helpCenterService.edit(helpCenterEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除帮助中心
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    @Operation(summary = "删除帮助中心")
+    @CommonLog("删除帮助中心")
+    @SaCheckPermission("/biz/helpcenter/delete")
+    @PostMapping("/biz/helpcenter/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   List<HelpCenterIdParam> helpCenterIdParamList) {
+        helpCenterService.delete(helpCenterIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取帮助中心详情
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    @Operation(summary = "获取帮助中心详情")
+    @SaCheckPermission("/biz/helpcenter/detail")
+    @GetMapping("/biz/helpcenter/detail")
+    public CommonResult<HelpCenter> detail(@Valid HelpCenterIdParam helpCenterIdParam) {
+        return CommonResult.data(helpCenterService.detail(helpCenterIdParam));
+    }
+
+    /**
+     * 获取帮助中心数据回显
+     */
+    @Operation(summary = "获取帮助中心数据回显")
+    @SaCheckPermission("/biz/helpcenter/helpCenter")
+    @GetMapping("/biz/helpcenter/helpCenter")
+    public CommonResult<HelpCenter> helpCenter() {
+        return CommonResult.data(helpCenterService.helpCenter());
+    }
+}

+ 71 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/entity/HelpCenter.java

@@ -0,0 +1,71 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 帮助中心实体
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+@Getter
+@Setter
+@TableName("help_center")
+public class HelpCenter {
+
+    /** 主键ID */
+    @TableId
+    @Schema(description = "主键ID")
+    private String id;
+
+    /** 标题 */
+    @Schema(description = "标题")
+    private String helpTitle;
+
+    /** 内容 */
+    @Schema(description = "内容")
+    private String helpContext;
+
+    /** 删除标识 */
+    @Schema(description = "删除标识")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 创建时间 */
+    @Schema(description = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 创建人 */
+    @Schema(description = "创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 修改时间 */
+    @Schema(description = "修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 修改人 */
+    @Schema(description = "修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/enums/HelpCenterEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.enums;
+
+import lombok.Getter;
+
+/**
+ * 帮助中心枚举
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+@Getter
+public enum HelpCenterEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    HelpCenterEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/mapper/HelpCenterMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.helpcenter.entity.HelpCenter;
+
+/**
+ * 帮助中心Mapper接口
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+public interface HelpCenterMapper extends BaseMapper<HelpCenter> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/mapper/mapping/HelpCenterMapper.xml

@@ -0,0 +1,5 @@
+<?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="vip.xiaonuo.biz.modular.helpcenter.mapper.HelpCenterMapper">
+
+</mapper>

+ 44 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterAddParam.java

@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 帮助中心添加参数
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+@Getter
+@Setter
+public class HelpCenterAddParam {
+
+    /** 标题 */
+    @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "标题不能为空")
+    private String helpTitle;
+
+    /** 内容 */
+    @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "内容不能为空")
+    private String helpContext;
+
+}

+ 49 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterEditParam.java

@@ -0,0 +1,49 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 帮助中心编辑参数
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+@Getter
+@Setter
+public class HelpCenterEditParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 标题 */
+    @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "标题不能为空")
+    private String helpTitle;
+
+    /** 内容 */
+    @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "内容不能为空")
+    private String helpContext;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 帮助中心Id参数
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+@Getter
+@Setter
+public class HelpCenterIdParam {
+
+    /** 主键ID */
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/param/HelpCenterPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 帮助中心查询参数
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+@Getter
+@Setter
+public class HelpCenterPageParam {
+
+    /** 当前页 */
+    @Schema(description = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @Schema(description = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @Schema(description = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @Schema(description = "关键词")
+    private String searchKey;
+
+}

+ 82 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/service/HelpCenterService.java

@@ -0,0 +1,82 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.helpcenter.entity.HelpCenter;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterAddParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterEditParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterIdParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterPageParam;
+
+import java.util.List;
+
+/**
+ * 帮助中心Service接口
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+public interface HelpCenterService extends IService<HelpCenter> {
+
+    /**
+     * 获取帮助中心分页
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    Page<HelpCenter> page(HelpCenterPageParam helpCenterPageParam);
+
+    /**
+     * 添加帮助中心
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    void add(HelpCenterAddParam helpCenterAddParam);
+
+    /**
+     * 编辑帮助中心
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    void edit(HelpCenterEditParam helpCenterEditParam);
+
+    /**
+     * 删除帮助中心
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    void delete(List<HelpCenterIdParam> helpCenterIdParamList);
+
+    /**
+     * 获取帮助中心详情
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     */
+    HelpCenter detail(HelpCenterIdParam helpCenterIdParam);
+
+    HelpCenter helpCenter();
+
+    /**
+     * 获取帮助中心详情
+     *
+     * @author fanzherong
+     * @date  2025/02/05 09:38
+     **/
+    HelpCenter queryEntity(String id);
+}

+ 99 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/helpcenter/service/impl/HelpCenterServiceImpl.java

@@ -0,0 +1,99 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.helpcenter.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.helpcenter.entity.HelpCenter;
+import vip.xiaonuo.biz.modular.helpcenter.mapper.HelpCenterMapper;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterAddParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterEditParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterIdParam;
+import vip.xiaonuo.biz.modular.helpcenter.param.HelpCenterPageParam;
+import vip.xiaonuo.biz.modular.helpcenter.service.HelpCenterService;
+
+import java.util.List;
+
+/**
+ * 帮助中心Service接口实现类
+ *
+ * @author fanzherong
+ * @date  2025/02/05 09:38
+ **/
+@Service
+public class HelpCenterServiceImpl extends ServiceImpl<HelpCenterMapper, HelpCenter> implements HelpCenterService {
+
+    @Override
+    public Page<HelpCenter> page(HelpCenterPageParam helpCenterPageParam) {
+        QueryWrapper<HelpCenter> queryWrapper = new QueryWrapper<HelpCenter>().checkSqlInjection();
+        if(ObjectUtil.isAllNotEmpty(helpCenterPageParam.getSortField(), helpCenterPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(helpCenterPageParam.getSortOrder());
+            queryWrapper.orderBy(true, helpCenterPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(helpCenterPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(HelpCenter::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(HelpCenterAddParam helpCenterAddParam) {
+        HelpCenter helpCenter = BeanUtil.toBean(helpCenterAddParam, HelpCenter.class);
+        this.save(helpCenter);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(HelpCenterEditParam helpCenterEditParam) {
+        HelpCenter helpCenter = this.queryEntity(helpCenterEditParam.getId());
+        BeanUtil.copyProperties(helpCenterEditParam, helpCenter);
+        this.updateById(helpCenter);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<HelpCenterIdParam> helpCenterIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(helpCenterIdParamList, HelpCenterIdParam::getId));
+    }
+
+    @Override
+    public HelpCenter detail(HelpCenterIdParam helpCenterIdParam) {
+        return this.queryEntity(helpCenterIdParam.getId());
+    }
+
+    @Override
+    public HelpCenter helpCenter() {
+        return this.getOne(new QueryWrapper<HelpCenter>().last("limit 1"));
+    }
+
+    @Override
+    public HelpCenter queryEntity(String id) {
+        HelpCenter helpCenter = this.getById(id);
+        if(ObjectUtil.isEmpty(helpCenter)) {
+            throw new CommonException("帮助中心不存在,id值为:{}", id);
+        }
+        return helpCenter;
+    }
+}