技术栈设计

后端技术栈

  • Spring Boot 2.x:提供RESTful API、事务管理及安全控制。
  • Spring Security:实现JWT token认证与权限控制。
  • MyBatis/MyBatis-Plus:数据库ORM框架,支持动态SQL。
  • Redis:缓存投票结果、防止重复提交。
  • MySQL:关系型数据库存储核心数据。

前端技术栈

  • Vue 3:构建微信小程序前端,使用Composition API。
  • Uni-app:跨平台框架,编译为微信小程序代码。
  • Vant Weapp:UI组件库,提供表单、按钮等组件。
  • 微信小程序原生API:调用微信登录、支付等功能。

辅助工具

  • Swagger:API文档生成与测试。
  • Jenkins:自动化部署。
  • JUnit/Mockito:后端单元测试。

功能模块设计

用户模块

  • 微信授权登录(获取openid及用户信息)。
  • 个人中心(查看历史投票、修改昵称)。

投票模块

  • 创建投票(单选/多选、截止时间、匿名设置)。
  • 投票列表(分页、按热度/时间排序)。
  • 投票详情(实时结果统计、图表展示)。

管理模块

  • 后台审核(敏感词过滤、人工审核投票内容)。
  • 数据报表(导出Excel、用户活跃度分析)。

安全模块

  • IP限流(防止刷票)。
  • Token失效机制(JWT过期时间设置)。

数据库表设计

用户表(user)

CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `openid` varchar(64) NOT NULL COMMENT '微信openid',
  `nickname` varchar(50) DEFAULT NULL,
  `avatar_url` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_openid` (`openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

投票表(vote)

CREATE TABLE `vote` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint NOT NULL COMMENT '创建人ID',
  `title` varchar(100) NOT NULL,
  `description` text,
  `type` tinyint DEFAULT '0' COMMENT '0单选 1多选',
  `anonymous` tinyint DEFAULT '0' COMMENT '是否匿名',
  `end_time` datetime NOT NULL,
  `status` tinyint DEFAULT '0' COMMENT '0正常 1关闭',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

选项表(option)

CREATE TABLE `option` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `vote_id` bigint NOT NULL,
  `content` varchar(255) NOT NULL,
  `image_url` varchar(255) DEFAULT NULL,
  `count` int DEFAULT '0' COMMENT '票数',
  PRIMARY KEY (`id`),
  KEY `idx_vote_id` (`vote_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

投票记录表(vote_record)

CREATE TABLE `vote_record` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint NOT NULL,
  `vote_id` bigint NOT NULL,
  `option_id` bigint NOT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_vote` (`user_id`,`vote_id`) COMMENT '用户每票仅投一次'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


核心代码示例

Spring Boot 投票接口(Controller)

@RestController
@RequestMapping("/api/vote")
public class VoteController {
    @Autowired
    private VoteService voteService;

    @PostMapping("/create")
    public Result createVote(@RequestBody VoteDTO voteDTO) {
        return voteService.createVote(voteDTO);
    }

    @GetMapping("/list")
    public Result listVotes(@RequestParam(defaultValue = "1") Integer page) {
        return voteService.getVoteList(page, 10);
    }
}

Vue 小程序投票页面

<template>
  <view class="vote-item" v-for="item in list" :key="item.id">
    <text>{{ item.title }}</text>
    <button @click="goDetail(item.id)">查看详情</button>
  </view>
</template>

<script setup>
import { ref } from 'vue';
const list = ref([]);

const fetchData = async () => {
  const res = await uni.request({ url: '/api/vote/list' });
  list.value = res.data;
};
fetchData();
</script>


系统测试方案

接口测试(Postman)

  • 测试注册/登录接口的Token返回有效性。
  • 模拟高并发投票请求验证Redis限流。

UI测试(微信开发者工具)

  • 页面渲染速度(WXML加载时间)。
  • 表单验证(选项为空时的提示逻辑)。

性能测试(JMeter)

  • 压测投票接口(500并发下的响应时间)。
  • 数据库查询优化(EXPLAIN分析慢SQL)。

安全测试

  • XSS注入测试(提交带脚本的投票标题)。
  • SQL注入尝试(通过选项ID参数测试)。

技术栈设计

后端技术栈

  • Spring Boot 2.x:提供RESTful API、事务管理及安全控制。
  • Spring Security:实现JWT token认证与权限控制。
  • MyBatis/MyBatis-Plus:数据库ORM框架,支持动态SQL。
  • Redis:缓存投票结果、防止重复提交。
  • MySQL:关系型数据库存储核心数据。

前端技术栈

  • Vue 3:构建微信小程序前端,使用Composition API。
  • Uni-app:跨平台框架,编译为微信小程序代码。
  • Vant Weapp:UI组件库,提供表单、按钮等组件。
  • 微信小程序原生API:调用微信登录、支付等功能。

辅助工具

  • Swagger:API文档生成与测试。
  • Jenkins:自动化部署。
  • JUnit/Mockito:后端单元测试。

功能模块设计

用户模块

  • 微信授权登录(获取openid及用户信息)。
  • 个人中心(查看历史投票、修改昵称)。

投票模块

  • 创建投票(单选/多选、截止时间、匿名设置)。
  • 投票列表(分页、按热度/时间排序)。
  • 投票详情(实时结果统计、图表展示)。

管理模块

  • 后台审核(敏感词过滤、人工审核投票内容)。
  • 数据报表(导出Excel、用户活跃度分析)。

安全模块

  • IP限流(防止刷票)。
  • Token失效机制(JWT过期时间设置)。

数据库表设计

用户表(user)

CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `openid` varchar(64) NOT NULL COMMENT '微信openid',
  `nickname` varchar(50) DEFAULT NULL,
  `avatar_url` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_openid` (`openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

投票表(vote)

CREATE TABLE `vote` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint NOT NULL COMMENT '创建人ID',
  `title` varchar(100) NOT NULL,
  `description` text,
  `type` tinyint DEFAULT '0' COMMENT '0单选 1多选',
  `anonymous` tinyint DEFAULT '0' COMMENT '是否匿名',
  `end_time` datetime NOT NULL,
  `status` tinyint DEFAULT '0' COMMENT '0正常 1关闭',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

选项表(option)

CREATE TABLE `option` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `vote_id` bigint NOT NULL,
  `content` varchar(255) NOT NULL,
  `image_url` varchar(255) DEFAULT NULL,
  `count` int DEFAULT '0' COMMENT '票数',
  PRIMARY KEY (`id`),
  KEY `idx_vote_id` (`vote_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

投票记录表(vote_record)

CREATE TABLE `vote_record` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint NOT NULL,
  `vote_id` bigint NOT NULL,
  `option_id` bigint NOT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_vote` (`user_id`,`vote_id`) COMMENT '用户每票仅投一次'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


核心代码示例

Spring Boot 投票接口(Controller)

@RestController
@RequestMapping("/api/vote")
public class VoteController {
    @Autowired
    private VoteService voteService;

    @PostMapping("/create")
    public Result createVote(@RequestBody VoteDTO voteDTO) {
        return voteService.createVote(voteDTO);
    }

    @GetMapping("/list")
    public Result listVotes(@RequestParam(defaultValue = "1") Integer page) {
        return voteService.getVoteList(page, 10);
    }
}

Vue 小程序投票页面

<template>
  <view class="vote-item" v-for="item in list" :key="item.id">
    <text>{{ item.title }}</text>
    <button @click="goDetail(item.id)">查看详情</button>
  </view>
</template>

<script setup>
import { ref } from 'vue';
const list = ref([]);

const fetchData = async () => {
  const res = await uni.request({ url: '/api/vote/list' });
  list.value = res.data;
};
fetchData();
</script>


系统测试方案

接口测试(Postman)

  • 测试注册/登录接口的Token返回有效性。
  • 模拟高并发投票请求验证Redis限流。

UI测试(微信开发者工具)

  • 页面渲染速度(WXML加载时间)。
  • 表单验证(选项为空时的提示逻辑)。

性能测试(JMeter)

  • 压测投票接口(500并发下的响应时间)。
  • 数据库查询优化(EXPLAIN分析慢SQL)。

安全测试

  • XSS注入测试(提交带脚本的投票标题)。
  • SQL注入尝试(通过选项ID参数测试)。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐