一、项目整体技术栈
后端
Java8、Apache Maven 3.9.16、SSM (Spring5.0.2+SpringMVC+MyBatis3.4.5)、MyBatis Generator 逆向工程、Druid 连接池、Jersey 远程文件调用、FastJSON、SLF4J+Log4j 日志、Junit 单元测试
前端技术
HTML/CSS/jQuery、Layui、Bootstrap、AJAX 异步交互、EL&JSTL、JSP
数据库 & 开发工具
MySQL8.0、Navicat 数据库管理、IDEA 开发工具、独立 Tomcat 文件上传服务
二、项目 Maven 五层聚合架构
整体架构
ham-parent:顶层父工程,pom 打包类型,统一管控所有依赖版本、聚合全部子模块,消除版本冲突ham-core:底层公共 Jar 模块,存放数据库实体、Mapper、通用 Service、工具类,前后台模块全部依赖复用ham-console:管理员后台 war 模块,实现流派、歌手、专辑、歌曲全套 CRUD 管理ham-portal:用户前台 war 模块,面向普通用户实现歌曲筛选、歌手浏览、网页播放器、播放历史功能ham_file:独立静态文件服务器 war 模块,单独存储歌曲 MP3 音频、歌手 / 专辑封面图片,解耦业务与静态资源存储

三、数据库设计
1 六张核心数据表关联关系
数据库命名:hami_music,共 6 张 InnoDB 引擎业务表,经典一对多业务关联:
2 建库建表 SQL示例
-- 创建数据库
CREATE DATABASE IF NOT EXISTS hami_music DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hami_music;
-- 流派表 mtype
DROP TABLE IF EXISTS mtype;
CREATE TABLE mtype (
TID INT NOT NULL AUTO_INCREMENT COMMENT '流派主键ID',
TNAME VARCHAR(50) COMMENT '流派名称',
TDESC VARCHAR(100) COMMENT '流派简介描述',
PRIMARY KEY (TID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 歌手表 songer
DROP TABLE IF EXISTS songer;
CREATE TABLE songer (
SRID INT NOT NULL AUTO_INCREMENT COMMENT '歌手主键ID',
TID INT COMMENT '关联流派ID',
SRNAME VARCHAR(20) COMMENT '歌手名称',
INTRO TEXT COMMENT '歌手简介',
AREA VARCHAR(20) COMMENT '歌手地区',
PIC VARCHAR(100) COMMENT '歌手封面图片地址',
IS_HOT INT COMMENT '是否热门 0否 1是',
PRIMARY KEY (SRID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 专辑表 album
DROP TABLE IF EXISTS album;
CREATE TABLE album (
AID INT NOT NULL AUTO_INCREMENT COMMENT '专辑主键ID',
ANAME VARCHAR(100) COMMENT '专辑名称',
PIC VARCHAR(200) COMMENT '专辑封面地址',
COMPANY VARCHAR(50) COMMENT '发行公司',
PDATE DATE COMMENT '发行日期',
LANG VARCHAR(50) COMMENT '语种',
PRIMARY KEY (AID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 歌曲表 song
DROP TABLE IF EXISTS song;
CREATE TABLE song (
SID INT NOT NULL AUTO_INCREMENT COMMENT '歌曲主键ID',
TID INT COMMENT '流派ID',
SRID INT COMMENT '歌手ID',
AID INT COMMENT '专辑ID',
SNAME VARCHAR(50) COMMENT '歌曲名称',
PIC VARCHAR(100) COMMENT '歌曲封面',
MP3 VARCHAR(100) COMMENT 'MP3音频文件地址',
LRC TEXT COMMENT '歌词LRC文本',
IS_HOT INT COMMENT '是否热门',
IS_NEW INT COMMENT '是否新歌',
PTIMES INT COMMENT '播放次数',
AUDIT_STATUS INT COMMENT '审核状态',
SHOW_STATUS INT COMMENT '前端展示状态',
PRIMARY KEY (SID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户表 tx_user
DROP TABLE IF EXISTS tx_user;
CREATE TABLE tx_user (
USER_ID INT NOT NULL AUTO_INCREMENT COMMENT '用户主键',
USERNAME VARCHAR(20) COMMENT '登录账号',
PASSWORD VARCHAR(20) COMMENT '登录密码',
QQ VARCHAR(20) COMMENT 'QQ号',
EMAIL VARCHAR(20) COMMENT '邮箱',
NICK VARCHAR(20) COMMENT '用户昵称',
TEL VARCHAR(20) COMMENT '手机号',
REG_TIME DATE COMMENT '注册时间',
PRIMARY KEY (USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 评论表 comment
DROP TABLE IF EXISTS comment;
CREATE TABLE comment (
COMMENT_ID INT NOT NULL AUTO_INCREMENT COMMENT '评论主键',
COM_COMMENT_ID INT COMMENT '父评论ID,用于楼中楼',
USER_ID INT COMMENT '评论用户ID',
COMMENT_CONTENT TEXT COMMENT '评论内容',
Z_COUNT INT COMMENT '点赞数',
PRIMARY KEY (COMMENT_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
四、Maven 环境全局配置
1 IDEA Maven 全局参数配置
本地使用 Maven 3.9.16,自定义本地仓库路径,绑定专用 settings 配置文件,开启.mvn/maven.config项目内配置读取:
- Maven 主路径:
D:\apache-maven-3.9.16 - 用户自定义 settings 文件:
D:\apache-maven-3.9.16\conf\settings.xml - 本地依赖仓库:
C:\Users\think book\.m2\repository
2 settings.xml
<localRepository>C:\Users\think book\.m2\repository</localRepository>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
五、父工程 ham-parent pom.xml 完整配置
- 统一升级 Maven 版本至 3.9.16,MySQL 驱动升级 8.0.33 适配 MySQL8;
- 通过
dependencyManagement统一锁定全项目所有依赖版本,子模块无需重复声明 version; - 统一编码、编译 JDK1.8 参数,规范全部第三方组件版本号;
- 修正子模块名称
ham_file,与实际目录匹配。
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qcby</groupId>
<artifactId>ham-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>ham-core</module>
<module>ham-console</module>
<module>ham-portal</module>
<module>ham_file</module>
</modules>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!-- spring 全家桶 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 测试、数据库 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- web页面依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
</dependency>
<!-- 日志组件 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- MyBatis 核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- 工具、连接池、文件处理 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 全局版本统一管理 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>8.0.33</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
<aspectj.version>1.6.8</aspectj.version>
<junit.version>4.12</junit.version>
<servlet.version>2.5</servlet.version>
<jsp.version>2.0</jsp.version>
<jstl.version>1.2</jstl.version>
<standard.version>1.1.2</standard.version>
<druid.version>1.1.10</druid.version>
<fastjson.version>1.2.47</fastjson.version>
<commons-io.version>2.0.1</commons-io.version>
<commons-lang.version>2.6</commons-lang.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<commons-codec.version>1.10</commons-codec.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
<jersey.version>1.2</jersey.version>
</properties>
</project>
六、底层公共模块 ham-core pom.xml
ham-core 为 jar 打包模块,继承父工程,仅声明依赖名称、不写版本号,全部复用父工程锁定版本;整合数据库、MyBatis、文件工具、日志全套底层依赖,供后台、前台、文件服务模块统一依赖引入。
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ham-parent</artifactId>
<groupId>com.qcby</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ham-core</artifactId>
<dependencies>
<!-- Spring AOP、上下文、事务、JDBC -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<!-- 单元测试、MySQL驱动 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 日志体系 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<!-- MyBatis核心整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- 阿里连接池、JSON工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!-- IO、文件上传工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<!-- MyBatis逆向工程生成工具 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
</dependencies>
</project>
- Maven 子工程红:父 / 子模块 groupId、version 一致,模块名称大小写匹配;
- IDEA 读取不到 Maven 配置:手动重新指定 settings.xml 文件,勾选「重写」配置;
- MyBatis 逆向生成失败:数据库驱动版本与本地 MySQL 服务版本匹配,url 参数正确配置。
完整工程源码、全套 SQL 初始化脚本、所有 xml 配置文件已上传仓库,包含本文全部优化后代码,仓库地址:https://gitee.com/CCChisaki/ham-music.git