# my-store **Repository Path**: yookoo/my-store ## Basic Information - **Project Name**: my-store - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-18 - **Last Updated**: 2026-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # My-Store 软件应用商店管理系统 一个基于 Spring Boot 的软件应用商店管理系统,支持用户端应用下载、管理端应用维护和系统管理功能。 ## 项目简介 My-Store 是一个功能完善的软件应用商店管理系统,采用前后端分离架构,提供应用上架、下载、权限管理等核心功能。系统支持多平台应用分发,具备完善的用户认证和权限控制机制。 ## 技术栈 ### 后端框架 - **Spring Boot** 2.7.18 - 核心框架 - **Java** 8 - 开发语言 - **Maven** - 项目构建工具 ### 数据库与缓存 - **MySQL** 5.7 - 关系型数据库 - **Redis** 7 - 缓存与会话管理 - **Druid** 1.2.16 - 数据库连接池 ### ORM 框架 - **MyBatis Plus** 3.5.2 - ORM 框架增强 - **MyBatis Plus Join** 1.3.3 - 多表关联查询插件 ### 安全认证 - **Sa-Token** 1.45.0 - 轻量级权限认证框架 ### 部署 - **Docker** - 容器化部署 - **Docker Compose** - 多容器编排 ### 前端框架 - **Vue 3** - 渐进式 JavaScript 框架 - **TypeScript** - JavaScript 超集 - **Vite** - 下一代前端构建工具 - **Naive UI** - Vue 3 组件库 - **Pinia** - Vue 状态管理 - **Vue Router** - Vue 官方路由 - **Axios** - HTTP 客户端 ### 其他工具 - **Lombok** - 代码简化 - **Thymeleaf** - 服务端模板引擎 - **JavaMail** 1.4.1 - 邮件发送 ## 模块架构 ``` my-store-demo/ ├── my-store-common # 公共模块(工具类、配置) ├── my-store-framework # 框架核心模块(实体、Mapper、Service) ├── my-store-manage # 管理后台模块(启动入口、系统管理) ├── my-store-web-admin # 前端管理界面(Vue 3 + TypeScript) ├── Dockerfile # Docker 镜像构建文件 ├── docker-compose.yml # Docker Compose 编排文件 ├── build-and-push.sh # 镜像构建和推送脚本 └── docker-start.sh # Docker 快速启动脚本 ``` ### 模块说明 #### my-store-common(公共模块) 提供通用的工具类和基础设施支持: - Redis 缓存配置 - MyBatis Plus 配置(分页插件、关联查询) - 文件上传下载工具类 - MD5 加密工具 - 验证码生成工具 - 权限字符串处理工具 - 分页封装(StylePage) - JSON 响应封装(JSONEntity) #### my-store-framework(框架核心模块) 定义数据模型、Mapper 接口和 Service 实现: - **实体类**:User、Role、App、AppModel、FileModel、Uri、LoginUser - **Mapper 接口**:6 个 Mapper 接口(支持关联查询) - **Service 实现**:9 个 Service 实现类 - **邮件服务**:支持注册验证 #### my-store-author(认证授权模块) 系统安全配置和权限拦截: - Sa-Token 安全配置 - 全局异常处理 - URL 工具类 - 自定义拦截器 #### my-store-console(用户控制台模块) 面向普通用户的应用浏览和下载功能: - 用户登录/注册 - 邮箱验证注册 - 应用搜索 - 应用详情展示 - 文件下载 - 用户个人中心 - 密码/用户名修改 #### my-store-manage(管理后台模块) 面向管理员的系统管理功能: - Spring Boot 启动类 - 管理员登录 - 用户管理(CRUD、角色分配) - 角色管理(权限配置) - URI 资源管理 - 应用管理(CRUD、上下架、版本更新) - 文件模型管理 - 文件上传 - 提供后端 API 接口 #### my-store-web-admin(前端管理界面) 基于 Vue 3 + TypeScript 的现代化前端管理界面: - 用户登录/登出 - 用户管理界面 - 角色管理界面 - 应用管理界面(上架/下架、版本管理) - 文件管理界面 - 标签管理界面 - 响应式设计 - RESTful API 对接 ## 数据库设计 ### 主要数据表 | 表名 | 说明 | 主要字段 | |------|------|----------| | tb_user | 用户表 | user_id, username, password, role_id, status | | tb_role | 角色表 | role_id, role_name, permissions | | tb_uri | URI 资源表 | uri_id, uri_path, description | | tb_app | 应用表 | app_id, app_name, app_description, app_icon, download_count, app_state | | tb_app_model | 应用模型表 | app_model_id, app_id, app_version, app_platform, file_model_id | | tb_file_model | 文件模型表 | file_model_id, file_model_path | ## 系统功能 ### 用户功能 - 用户注册(支持邮箱验证) - 用户登录 - 个人信息管理 - 密码修改 - 应用搜索和浏览 - 应用下载 ### 应用管理 - 应用上架/下架 - 应用版本管理 - 多平台支持(Windows 等) - 下载次数统计 - 应用图标和截图管理 ### 权限管理 - 基于角色的权限控制(RBAC) - URI 资源管理 - 权限细粒度控制 ### 文件管理 - 文件上传(支持多文件) - 文件下载 - 图片展示 - 自定义文件存储路径 ## 快速开始 ### 方式一:Docker 部署(推荐) > 📖 详细文档请查看: [Docker 快速部署指南](./DOCKER_QUICKSTART.md) | [Docker 部署详细指南](./DOCKER_DEPLOYMENT.md) #### 环境要求 - Docker 20.10+ - Docker Compose 2.0+ #### 快速启动 1. **克隆项目** ```bash git clone cd my-store-demo ``` 2. **启动服务** ```bash # 方式 1: 使用启动脚本 ./docker-start.sh # 方式 2: 使用 Makefile make start # 方式 3: 使用 docker-compose docker-compose up -d ``` > **说明**: Docker 构建会自动打包前端(Vue 3)和后端(Spring Boot),构建时间约 3-5 分钟 3. **访问应用** - 首页: http://localhost:8099 - 管理后台: http://localhost:8099/api/manage/index 默认管理员账号: - 用户名: `admin` - 密码: `admin123` #### 构建并推送镜像到阿里云容器镜像服务 ```bash # 登录阿里云容器镜像服务 docker login --username=your_username registry.cn-hangzhou.aliyuncs.com # 构建镜像 docker build -t registry.cn-hangzhou.aliyuncs.com/yuanbao116/my-store:latest . # 推送镜像 docker push registry.cn-hangzhou.aliyuncs.com/yuanbao116/my-store:latest ``` #### 常用命令 ```bash # 停止服务 docker-compose down # 停止并删除数据卷(谨慎操作) docker-compose down -v # 重启服务 docker-compose restart # 查看服务状态 docker-compose ps # 进入应用容器 docker exec -it my-store-app sh # 查看应用日志 docker logs -f my-store-app ``` #### 数据持久化 Docker Compose 配置了以下数据卷: - `mysql-data`: MySQL 数据 - `redis-data`: Redis 数据 - `app-files`: 应用上传的文件 - `app-logs`: 应用日志 所有数据持久化在本地,容器重启不会丢失数据。 --- ### 方式二:本地开发 #### 环境要求 - JDK 1.8+ - Maven 3.6+ - MySQL 5.x - Redis 3.x+ #### 配置说明 编辑 `my-store-manage/src/main/resources/application.yml`: ```yaml server: port: 8099 spring: datasource: url: jdbc:mysql://localhost:3306/my-store?useUnicode=true&characterEncoding=UTF8 username: root password: your_password driver-class-name: com.mysql.jdbc.Driver redis: host: localhost port: 6379 database: 0 mybatis-plus: configuration: table-prefix: tb_ ``` #### 数据库初始化 1. 创建数据库 `my-store` 2. 执行 `mystore.sql` 脚本初始化表结构和数据 ```bash mysql -u root -p < mystore.sql ``` #### 项目启动 ```bash # 编译打包 mvn clean package -DskipTests # 启动应用 cd my-store-manage mvn spring-boot:run ``` 或直接运行打包后的 jar: ```bash java -jar my-store-manage/target/my-store-manage-1.0-SNAPSHOT.jar ``` 启动成功后访问:`http://localhost:8099` ## 访问路径 | 功能 | 访问地址 | |------|----------| | 首页 | http://localhost:8099 | | 用户控制台 | http://localhost:8099/api/console | | 管理后台 | http://localhost:8099/api/manage/index | | API 文档 | http://localhost:8099/api/docs | > **注意**: 应用使用了 context-path `/api`,所有后端接口都需要在路径前加上 `/api` ## API 接口文档 ### 一、登录认证模块 #### LoginController - 统一登录控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | loginPage | GET | `/login` | - | String | 登录页面 | | login | POST | `/login` | User | String | 登录处理(成功后根据角色跳转) | | logout | POST | `/login/logout` | - | String | 退出登录,跳转到登录页 | **说明:** - 角色ID 1(admin)登录成功后跳转到 `/manage/index` - 角色ID 2(普通用户)登录成功后跳转到 `/` - 未登录用户访问需要权限的页面会重定向到 `/login` --- ### 二、用户控制台模块 #### UserCenterController - 用户中心控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | userCenter | GET | `/user/center` | msg | String | 用户中心页面(需登录) | | save | POST | `/user/save` | User | String | 保存用户信息 | | updateUserPassword | GET | `/user/updatePassword` | - | String | 更新密码页面(需登录) | | saveUserPassword | POST | `/user/savePassword` | User | String | 保存新密码 | | updateUserName | GET | `/user/updateName` | - | String | 更新用户名页面(需登录) | | saveUserName | POST | `/user/saveName` | User | String | 保存用户名 | **注意:** 所有需要登录的接口,如果未登录会重定向到 `/login` --- #### AppCenterController - 应用中心控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | search | GET | `/app/search` | data, current, size | String | 搜索应用(分页) | | info | GET | `/app/info` | appId | String | 获取应用详情页 | **参数说明:** - data: 搜索关键词 - current: 当前页码(默认1) - size: 每页条数(默认4) - appId: 应用ID --- #### FileDownLoadController - 文件下载控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | download | GET | `/file/download` | fileModelId, appId | void | 下载文件(增加下载计数) | | image | GET | `/file/image` | fileModelId | void | 获取图片 | --- ### 三、管理后台模块 #### ManageController - 管理后台首页控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | manageIndex | GET | `/manage` | - | String | 管理后台首页(需登录) | | manageIndexPage | GET | `/manage/index` | - | String | 管理后台首页(需登录) | --- #### AppController - 应用管理控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | page | GET | `/manage/app/page.do` | data, current, size, result | String | 应用列表页(分页) | | insert | GET | `/manage/app/insert.do` | - | String | 新增应用页面 | | update | GET | `/manage/app/update.do` | appId | String | 更新应用页面 | | save | POST | `/manage/app/save.do` | App, mode | String | 保存应用(新增/更新) | | delete | GET | `/manage/app/delete.do` | appId | String | 删除应用 | | online | GET | `/manage/app/onlinePage.do` | data, current, size, result | String | 上线页面(显示离线应用) | | offline | GET | `/manage/app/offlinePage.do` | data, current, size, result | String | 下线页面(显示在线应用) | | onlineApp | GET | `/manage/app/onlineApp.do` | appId | String | 上线应用 | | offlineApp | GET | `/manage/app/offlineApp.do` | appId | String | 下线应用 | | updateAppVersion | GET | `/manage/app/updateAppVersion.do` | msg, data, current, size, result | String | 更新应用版本页面 | | updateAppPage | GET | `/manage/app/updateAppPage.do` | appId | String | 更新应用信息页面 | | saveUpdateApp | POST | `/manage/app/saveUpdateApp.do` | appId, appVersion, platforms[], fileModelIds[] | String | 保存更新应用 | **参数说明:** - mode: "insert" 或 "update" - platforms[]: 平台数组(如 ["Windows", "Mac"]) - fileModelIds[]: 文件ID数组 --- #### AppModelController - 应用模型控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | page | GET | `/manage/appModel/page.do` | data, current, size, result | String | 应用模型列表页(分页) | | insert | GET | `/manage/appModel/insert.do` | - | String | 新增应用模型页面 | | update | GET | `/manage/appModel/update.do` | appModelId | String | 更新应用模型页面 | | save | POST | `/manage/appModel/save.do` | AppModel, mode | String | 保存应用模型(新增/更新) | | delete | GET | `/manage/appModel/delete.do` | appModelId | String | 删除应用模型 | --- #### FileModelController - 文件模型控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | upload | POST | `/manage/fileModel/upload.do` | file[], appId, appModelId | JSONEntity | 上传文件(返回JSON) | | page | GET | `/manage/fileModel/page.do` | data, current, size, result | String | 文件列表页(分页) | | insert | GET | `/manage/fileModel/insert.do` | - | String | 新增文件页面 | | update | GET | `/manage/fileModel/update.do` | fileModelId | String | 更新文件页面 | | save | POST | `/manage/fileModel/save.do` | FileModel, mode | String | 保存文件(新增/更新) | | delete | GET | `/manage/fileModel/delete.do` | fileModelId | String | 删除文件 | **参数说明:** - file[]: 上传的文件数组(MultipartFile类型) - upload 方法返回 JSONEntity 格式:`{code: 0/1, msg: "成功/失败", data: {...}}` --- #### RoleController - 角色控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | page | GET | `/manage/role/page.do` | data, current, size, result | String | 角色列表页(分页) | | insert | GET | `/manage/role/insert.do` | - | String | 新增角色页面 | | update | GET | `/manage/role/update.do` | roleId | String | 更新角色页面 | | selectUris | GET | `/manage/role/selectUris.do` | roleId | JSONEntity | 查询角色的URI列表(返回JSON) | | save | POST | `/manage/role/save.do` | Role, mode | String | 保存角色(新增/更新) | | delete | GET | `/manage/role/delete.do` | roleId | String | 删除角色 | --- #### UriController - URI资源控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | page | GET | `/manage/uri/page.do` | data, current, size, result | String | URI列表页(分页) | | insert | GET | `/manage/uri/insert.do` | - | String | 新增URI页面 | | update | GET | `/manage/uri/update.do` | uriId | String | 更新URI页面 | | save | POST | `/manage/uri/save.do` | Uri, mode | String | 保存URI(新增/更新) | | delete | GET | `/manage/uri/delete.do` | uriId | String | 删除URI | --- #### UserController - 管理后台用户控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | page | GET | `/manage/user/page.do` | data, current, size, result | String | 用户列表页(分页) | | insert | GET | `/manage/user/insert.do` | - | String | 新增用户页面 | | update | GET | `/manage/user/update.do` | userId | String | 更新用户页面 | | save | POST | `/manage/user/save.do` | User, mode | String | 保存用户(新增/更新) | | delete | GET | `/manage/user/delete.do` | userId | String | 删除用户 | --- ### 四、网站启动模块 #### DefaultPageController - 默认页面控制器 | 方法名 | 请求方式 | 请求路径 | 参数 | 返回值 | 说明 | |--------|----------|----------|------|--------|------| | index | GET | `/` | - | String | 首页(展示热门应用TOP3) | | mainIndex | GET | `/index.do` | - | String | 主页 | | notFoundResource | GET | `/notFoundResource.do` | - | String | 资源未找到页面(404) | | getApps | GET | `/api/apps` | page, size | Map | 获取应用列表API(返回JSON) | **API接口说明:** - getApps 方法返回格式: ```json { "data": [...], // 应用列表 "total": 100, // 总记录数 "page": 1, // 当前页 "size": 20 // 每页条数 } ``` --- ### 五、接口汇总统计 | 模块 | Controller数量 | 接口数量 | 主要功能 | |------|----------------|----------|----------| | 登录认证 | 1 | 3 | 登录、登出 | | 用户控制台 | 3 | 9 | 用户中心、应用搜索、文件下载 | | 管理后台 | 7 | 42 | 应用、用户、角色、URI、文件管理 | | 网站启动 | 1 | 4 | 首页、API接口 | | **总计** | **12** | **58** | 完整的应用商店系统 | --- ### 六、通用说明 #### 1. 权限控制 - 使用 Sa-Token 进行权限认证 - 部分接口需要登录后才能访问(检查 `StpUtil.isLogin()`) - 未登录用户访问需要权限的接口会重定向到 `/login` #### 2. 访客白名单 以下路径允许访客访问(无需登录): - `/login/**` - 登录相关 - `/file/**` - 文件访问 - `/author/**` - 认证相关 - `/` - 首页 - `/index.do` - 主页 - `/notFoundResource.do` - 404页面 - `/api/**` - API接口 #### 3. 分页参数 - 列表查询接口支持分页 - `current` 或 `page`: 当前页码(从1开始) - `size`: 每页显示条数 - `data`: 搜索关键词 #### 4. 返回值类型 - 大部分返回 `String`(视图名称) - 少数返回 `JSONEntity` 或 `Map`(JSON响应) #### 5. CRUD标准模式 大多数管理模块遵循以下标准模式: - `page.do` - 列表页 - `insert.do` - 新增页面 - `update.do` - 更新页面 - `save.do` - 保存(新增/更新) - `delete.do` - 删除 ## 系统架构特点 1. **分层清晰**:Web 层 → Service 层 → Mapper 层 → 数据库 2. **安全机制**:Sa-Token 权限认证 + MD5 密码加密 3. **缓存策略**:Redis 二级缓存 + Spring Cache 注解 4. **关联查询优化**:使用 MyBatis Plus Join 插件,避免 N+1 查询 5. **文件存储**:本地文件系统存储,支持按会话 ID 分目录存储 ## 部署相关文档 - [Docker 快速部署指南](./DOCKER_QUICKSTART.md) - Docker 快速开始指南 - [Docker 构建说明](./DOCKER_BUILD.md) - Docker 多阶段构建详细说明 - [Docker 部署详细指南](./DOCKER_DEPLOYMENT.md) - 详细的 Docker 部署说明 - [部署指南](./DEPLOYMENT_GUIDE.md) - 通用部署指南 ## 许可证 本项目采用 MIT 许可证。 ## 作者 My-Store Development Team