东晟密封科技博客:打造密封件技术交流新平台

一、建设背景与目标

广东东晟密封科技有限公司作为一家集研发、生产、销售于一体的国家高新技术企业,专注于聚四氟乙烯、聚氨酯、橡胶等高分子材料密封元件的研制。为深化品牌影响力,构建技术护城河,特规划企业级博客系统。本方案旨在通过内容营销,将东晟密封件在工程机械、液压气动、石油天然气等领域的密封件解决方案进行沉淀,打造一个集技术分享、密封圈选型指导、行业交流于一体的专业平台,让“怕漏油,装东晟油封”的品牌理念深入人心。

1.1、技术栈选型

前端技术栈

  • 框架: Vue 3 + TypeScript + Vite
  • UI组件库: Element Plus
  • 状态管理: Pinia
  • 路由: Vue Router 4
  • HTTP客户端: Axios
  • 富文本编辑器: WangEditor 5
  • 3D可视化: Three.js + GLTFLoader
  • 图表: ECharts 5

后端技术栈

  • 框架: Spring Boot 2.7 + Java 17
  • 安全框架: Spring Security + JWT
  • ORM: MyBatis Plus
  • 数据库: MySQL 8.0 + Redis 7.0
  • 搜索: Elasticsearch 8.0
  • 文件存储: MinIO (兼容S3)
  • API文档: Knife4j + Swagger 3
  • 部署: Docker + Docker Compose

数据库设计

-- 用户表 CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) NOT NULL COMMENT '密码', `nickname` varchar(50) DEFAULT NULL COMMENT '昵称', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `avatar` varchar(500) DEFAULT NULL COMMENT '头像', `role` tinyint NOT NULL DEFAULT '1' COMMENT '角色:0-管理员 1-注册用户 2-访客', `company` varchar(100) DEFAULT NULL COMMENT '公司名称', `position` varchar(50) DEFAULT NULL COMMENT '职位', `focus_seal_types` json DEFAULT NULL COMMENT '关注的密封件类型', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0-禁用 1-正常', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), KEY `idx_email` (`email`), KEY `idx_role_status` (`role`,`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 密封件分类表 CREATE TABLE `seal_category` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类ID', `name` varchar(50) NOT NULL COMMENT '分类名称', `code` varchar(20) NOT NULL COMMENT '分类编码', `description` varchar(200) DEFAULT NULL COMMENT '分类描述', `icon` varchar(200) DEFAULT NULL COMMENT '图标', `sort` int DEFAULT '0' COMMENT '排序', `parent_id` bigint DEFAULT '0' COMMENT '父分类ID', `level` tinyint DEFAULT '1' COMMENT '层级', `status` tinyint DEFAULT '1' COMMENT '状态:0-禁用 1-启用', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_code` (`code`), KEY `idx_parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='密封件分类表'; -- 博客文章表 CREATE TABLE `blog_article` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '文章ID', `title` varchar(200) NOT NULL COMMENT '文章标题', `summary` varchar(500) DEFAULT NULL COMMENT '文章摘要', `cover_image` varchar(500) DEFAULT NULL COMMENT '封面图', `content` longtext NOT NULL COMMENT '文章内容(HTML)', `content_md` longtext COMMENT '文章内容(Markdown)', `author_id` bigint NOT NULL COMMENT '作者ID', `category_id` bigint DEFAULT NULL COMMENT '分类ID', `view_count` int DEFAULT '0' COMMENT '阅读量', `like_count` int DEFAULT '0' COMMENT '点赞数', `comment_count` int DEFAULT '0' COMMENT '评论数', `share_count` int DEFAULT '0' COMMENT '分享数', `is_top` tinyint DEFAULT '0' COMMENT '是否置顶:0-否 1-是', `is_recommend` tinyint DEFAULT '0' COMMENT '是否推荐:0-否 1-是', `is_original` tinyint DEFAULT '1' COMMENT '是否原创:0-转载 1-原创', `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0-草稿 1-待审核 2-已发布 3-已下架', `publish_time` datetime DEFAULT NULL COMMENT '发布时间', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_author_id` (`author_id`), KEY `idx_category_id` (`category_id`), KEY `idx_status_publish_time` (`status`,`publish_time`), FULLTEXT KEY `ft_title_summary` (`title`,`summary`) WITH PARSER ngram ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='博客文章表'; -- 文章标签关联表 CREATE TABLE `blog_article_tag` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '关联ID', `article_id` bigint NOT NULL COMMENT '文章ID', `tag_id` bigint NOT NULL COMMENT '标签ID', PRIMARY KEY (`id`), UNIQUE KEY `uk_article_tag` (`article_id`,`tag_id`), KEY `idx_tag_id` (`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章标签关联表'; -- 标签表 CREATE TABLE `blog_tag` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '标签ID', `name` varchar(50) NOT NULL COMMENT '标签名称', `color` varchar(20) DEFAULT '#409EFF' COMMENT '标签颜色', `hot` int DEFAULT '0' COMMENT '热度', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='标签表'; -- 密封件选型参数表 CREATE TABLE `seal_selection_param` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '参数ID', `param_name` varchar(50) NOT NULL COMMENT '参数名称', `param_code` varchar(30) NOT NULL COMMENT '参数编码', `param_type` tinyint NOT NULL COMMENT '参数类型:1-数值 2-枚举 3-布尔', `unit` varchar(20) DEFAULT NULL COMMENT '单位', `min_value` decimal(10,2) DEFAULT NULL COMMENT '最小值', `max_value` decimal(10,2) DEFAULT NULL COMMENT '最大值', `options` json DEFAULT NULL COMMENT '枚举选项', `required` tinyint DEFAULT '1' COMMENT '是否必填:0-否 1-是', `sort` int DEFAULT '0' COMMENT '排序', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_param_code` (`param_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='密封件选型参数表'; -- 密封件产品库 CREATE TABLE `seal_product` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '产品ID', `product_code` varchar(50) NOT NULL COMMENT '产品编码', `product_name` varchar(100) NOT NULL COMMENT '产品名称', `product_type` varchar(50) NOT NULL COMMENT '产品类型', `material` varchar(50) NOT NULL COMMENT '材料', `category_id` bigint NOT NULL COMMENT '分类ID', `description` text COMMENT '产品描述', `specifications` json DEFAULT NULL COMMENT '规格参数', `application_scenarios` json DEFAULT NULL COMMENT '应用场景', `technical_data_url` varchar(500) DEFAULT NULL COMMENT '技术资料URL', `3d_model_url` varchar(500) DEFAULT NULL COMMENT '3D模型URL', `price_range` varchar(100) DEFAULT NULL COMMENT '价格区间', `status` tinyint DEFAULT '1' COMMENT '状态:0-下架 1-上架', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_product_code` (`product_code`), KEY `idx_category_id` (`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='密封件产品库'; -- 成功案例表 CREATE TABLE `success_case` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '案例ID', `title` varchar(200) NOT NULL COMMENT '案例标题', `customer_name` varchar(100) NOT NULL COMMENT '客户名称', `industry` varchar(50) NOT NULL COMMENT '所属行业', `application_scenario` varchar(200) NOT NULL COMMENT '应用场景', `problem_description` text COMMENT '问题描述', `solution` text NOT NULL COMMENT '解决方案', `seal_products` json NOT NULL COMMENT '使用的密封件产品', `performance_improvement` json DEFAULT NULL COMMENT '性能提升数据', `images` json DEFAULT NULL COMMENT '案例图片', `video_url` varchar(500) DEFAULT NULL COMMENT '视频URL', `view_count` int DEFAULT '0' COMMENT '查看次数', `is_featured` tinyint DEFAULT '0' COMMENT '是否精选', `publish_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间', PRIMARY KEY (`id`), KEY `idx_industry` (`industry`), KEY `idx_publish_time` (`publish_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成功案例表'; -- 评论表 CREATE TABLE `blog_comment` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论ID', `article_id` bigint NOT NULL COMMENT '文章ID', `user_id` bigint NOT NULL COMMENT '用户ID', `parent_id` bigint DEFAULT '0' COMMENT '父评论ID', `content` text NOT NULL COMMENT '评论内容', `like_count` int DEFAULT '0' COMMENT '点赞数', `status` tinyint DEFAULT '1' COMMENT '状态:0-删除 1-正常 2-审核中', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_article_id` (`article_id`), KEY `idx_user_id` (`user_id`), KEY `idx_parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论表';

2.1、后端核心代码实现

1. 项目结构

dongcheng-blog/ ├── dongcheng-common/ # 公共模块 ├── dongcheng-system/ # 系统模块 ├── dongcheng-blog/ # 博客模块 ├── dongcheng-seal/ # 密封件模块 ├── dongcheng-search/ # 搜索模块 ├── dongcheng-file/ # 文件模块 └── dongcheng-admin/ # 后台管理

2. 用户与权限管理模块

UserController.java

@RestController @RequestMapping("/api/user") @Api(tags = "用户管理") public class UserController { @Autowired private UserService userService; @PostMapping("/register") @ApiOperation("用户注册") public Result<UserVO> register(@Valid @RequestBody UserRegisterDTO dto) { return Result.success(userService.register(dto)); } @PostMapping("/login") @ApiOperation("用户登录") public Result<LoginVO> login(@Valid @RequestBody LoginDTO dto) { return Result.success(userService.login(dto)); } @GetMapping("/profile") @ApiOperation("获取用户信息") @PreAuthorize("hasAnyRole('USER', 'ADMIN')") public Result<UserProfileVO> getProfile() { Long userId = SecurityUtils.getUserId(); return Result.success(userService.getProfile(userId)); } @PutMapping("/profile") @ApiOperation("更新用户信息") @PreAuthorize("hasAnyRole('USER', 'ADMIN')") public Result<Void> updateProfile(@Valid @RequestBody UserUpdateDTO dto) { Long userId = SecurityUtils.getUserId(); userService.updateProfile(userId, dto); return Result.success(); } @PostMapping("/focus/seal-types") @ApiOperation("更新关注的密封件类型") @PreAuthorize("hasAnyRole('USER', 'ADMIN')") public Result<Void> updateFocusSealTypes(@RequestBody List<String> sealTypes) { Long userId = SecurityUtils.getUserId(); userService.updateFocusSealTypes(userId, sealTypes); return Result.success(); } } // 用户服务实现 @Service @Slf4j public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private PasswordEncoder passwordEncoder; @Autowired private JwtTokenProvider tokenProvider; @Override @Transactional(rollbackFor = Exception.class) public UserVO register(UserRegisterDTO dto) { // 检查用户名是否已存在 if (userMapper.existsByUsername(dto.getUsername())) { throw new BusinessException("用户名已存在"); } // 检查邮箱是否已存在 if (StringUtils.hasText(dto.getEmail()) && userMapper.existsByEmail(dto.getEmail())) { throw new BusinessException("邮箱已被注册"); } // 创建用户 SysUser user = new SysUser(); user.setUsername(dto.getUsername()); user.setPassword(passwordEncoder.encode(dto.getPassword())); user.setNickname(dto.getNickname()); user.setEmail(dto.getEmail()); user.setPhone(dto.getPhone()); user.setRole(UserRole.REGISTERED_USER.getCode()); user.setStatus(UserStatus.NORMAL.getCode()); userMapper.insert(user); // 返回用户信息 return convertToVO(user); } @Override public LoginVO login(LoginDTO dto) { SysUser user = userMapper.selectByUsername(dto.getUsername()); if (user == null) { throw new BusinessException("用户名或密码错误"); } if (!passwordEncoder.matches(dto.getPassword(), user.getPassword())) { throw new BusinessException("用户名或密码错误"); } if (user.getStatus() == UserStatus.DISABLED.getCode()) { throw new BusinessException("账号已被禁用"); } // 生成token String token = tokenProvider.generateToken(user.getId(), user.getUsername(), user.getRole()); // 更新登录信息 userMapper.updateLoginInfo(user.getId()); LoginVO vo = new LoginVO(); vo.setToken(token); vo.setUserInfo(convertToVO(user)); return vo; } @Override public UserProfileVO getProfile(Long userId) { SysUser user = userMapper.selectById(userId); if (user == null) { throw new BusinessException("用户不存在"); } UserProfileVO vo = new UserProfileVO(); vo.setId(user.getId()); vo.setUsername(user.getUsername()); vo.setNickname(user.getNickname()); vo.setEmail(user.getEmail()); vo.setPhone(user.getPhone()); vo.setAvatar(user.getAvatar()); vo.setCompany(user.getCompany()); vo.setPosition(user.getPosition()); vo.setFocusSealTypes(JSON.parseArray(user.getFocusSealTypes(), String.class)); vo.setRole(user.getRole()); return vo; } }

3. 技术博客与内容管理模块

ArticleController.java

@RestController @RequestMapping("/api/blog") @Api(tags = "博客管理") public class ArticleController { @Autowired private ArticleService articleService; @PostMapping("/articles") @ApiOperation("创建文章") @PreAuthorize("hasAnyRole('USER', 'ADMIN')") public Result<Long> createArticle(@Valid @RequestBody ArticleCreateDTO dto) { Long userId = SecurityUtils.getUserId(); Long articleId = articleService.createArticle(userId, dto); return Result.success(articleId); } @PutMapping("/articles/{id}") @ApiOperation("更新文章") @PreAuthorize("hasAnyRole('USER', 'ADMIN')") public Result<Void> updateArticle(@PathVariable Long id, @Valid @RequestBody ArticleUpdateDTO dto) { Long userId = SecurityUtils.getUserId(); articleService.updateArticle(id, userId, dto); return Result.success(); } @PostMapping("/articles/{id}/publish") @ApiOperation("发布文章") @PreAuthorize("hasAnyRole('USER', 'ADMIN')") public Result<Void> publishArticle(@PathVariable Long id) { Long userId = SecurityUtils.getUserId(); articleService.publishArticle(id, userId); return Result.success(); } @GetMapping("/articles/{id}") @ApiOperation("获取文章详情") public Result<ArticleDetailVO> getArticleDetail(@PathVariable Long id) { ArticleDetailVO vo = articleService.getArticleDetail(id); // 增加阅读量(异步) articleService.incrementViewCount(id); return Result.success(vo); } @GetMapping("/articles") @ApiOperation("分页查询文章") public Result<PageResult<ArticleVO>> listArticles( @RequestParam(defaultValue = "1") Integer page, @R

二、核心功能模块设计

1. 用户与权限管理系统设立三级角色:访客、注册用户(工程师/客户)及管理员。注册用户可完善个人信息,记录其关注的液压密封件类型。管理员拥有最高权限,负责审核内容、管理用户,并针对重点客户设置专属访问权限,以便查看特定工况下的油封技术白皮书。

2. 技术博客与内容管理这是系统的核心。博主(技术团队)可发布关于骨架油封防尘圈斯特封等产品的深度解析文章。编辑器需支持图文混排,并能插入密封件的3D剖面图或动态演示。文章发布时,必须关联特定的密封件分类(如旋转密封、往复密封)和标签(如“耐高温密封圈”、“食品级密封件”),形成结构化的知识库。系统将自动统计每篇密封件技术文章的阅读量,作为热度排序的依据。

3. 智能选型与交互模块区别于普通博客,本方案深度融合业务场景。在文章页面侧边栏或底部,嵌入“密封件选型助手”入口。用户阅读关于“挖掘机液压缸漏油”的案例时,可直接跳转至选型工具,输入轴径、压力、温度等参数,系统基于东晟密封件235种材料配方库,推荐匹配的V型组合密封格来圈型号。同时,用户可对文章进行点赞、评论,分享在实际应用中更换聚四氟乙烯密封件的心得,形成互动社区。

4. 案例库与搜索优化设立“成功案例”专区,展示东晟密封件在比亚迪、三一重工等知名企业的应用实例。重点突出密封件在超高压、强腐蚀等苛刻工况下的优异表现。前端首页提供全文检索功能,用户可通过“泄漏率”、“耐磨性”等关键词,快速定位到相关的橡胶密封件解决方案。同时,系统支持按最新发布或最热文章排序,并展示热门标签,如“无油润滑密封件”、“PTFE密封件”。

三、视觉与运营支撑

页面设计采用东晟蓝为主色调,保持品牌统一性。技术文档区支持PDF下载,方便一线工程师离线查阅密封件安装维护教程。后台需具备数据看板,监测“密封圈”等关键词的搜索频次,指导内容创作方向。通过持续输出高质量的密封件技术干货,将博客打造为东晟密封件连接全球客户的数字化纽带。