{"id":576,"date":"2026-09-21T18:27:26","date_gmt":"2026-09-21T10:27:26","guid":{"rendered":"https:\/\/www.kirasu.cn\/index.php\/2026\/09\/21\/%e8%af%be%e7%a8%8b-01-%e8%af%be%e7%a8%8b%e5%af%bc%e8%ae%ba%e4%b8%8e%e9%a1%b9%e7%9b%ae%e5%85%a8%e6%99%af-2\/"},"modified":"2026-09-21T18:27:26","modified_gmt":"2026-09-21T10:27:26","slug":"%e8%af%be%e7%a8%8b-01-%e8%af%be%e7%a8%8b%e5%af%bc%e8%ae%ba%e4%b8%8e%e9%a1%b9%e7%9b%ae%e5%85%a8%e6%99%af-2","status":"publish","type":"post","link":"https:\/\/www.kirasu.cn\/index.php\/2026\/09\/21\/%e8%af%be%e7%a8%8b-01-%e8%af%be%e7%a8%8b%e5%af%bc%e8%ae%ba%e4%b8%8e%e9%a1%b9%e7%9b%ae%e5%85%a8%e6%99%af-2\/","title":{"rendered":"\u7b2c 1 \u8bfe \u8bfe\u7a0b\u5bfc\u8bba + \u9879\u76ee\u5168\u666f"},"content":{"rendered":"<h1>\u7b2c 1 \u8bfe \u8bfe\u7a0b\u5bfc\u8bba + \u9879\u76ee\u5168\u666f<\/h1>\n<blockquote>\n<p>\u672c\u8bfe\u662f 30 \u8282\u8bfe\u7a0b\u7684\u8d77\u70b9\uff1a\u5148\u770b\u6e05\u300c\u6211\u4eec\u8981\u5b66\u7684\u662f\u4e00\u4e2a\u4ec0\u4e48\u4e1c\u897f\u3001\u7531\u54ea\u4e9b\u90e8\u5206\u7ec4\u6210\u3001\u7528\u5230\u4e86\u54ea\u4e9b\u6280\u672f\u3001\u600e\u4e48\u8dd1\u8d77\u6765\u300d\u3002\u4e0d\u5199\u4ee3\u7801\uff0c\u4f46\u8981\u5efa\u7acb\u5bf9\u6574\u4e2a\u9879\u76ee\u7684\u6574\u4f53\u8ba4\u77e5\u3002<\/p>\n<\/blockquote>\n<hr \/>\n<h2>\u672c\u8bfe\u5b66\u4e60\u76ee\u6807<\/h2>\n<p>\u5b8c\u6210\u672c\u8bfe\u540e\uff0c\u4f60\u5c06\u80fd\u591f\uff1a<\/p>\n<ol>\n<li>\u8bf4\u6e05 novel-plus \u662f\u4ec0\u4e48\u3001\u6709\u54ea\u51e0\u4e2a\u5b50\u7cfb\u7edf\uff0c\u5404\u81ea\u804c\u8d23\u4e0e\u7aef\u53e3<\/li>\n<li>\u7406\u89e3\u591a\u6a21\u5757\u5de5\u7a0b\u7684\u7ec4\u7ec7\u65b9\u5f0f\uff08\u7236\u5de5\u7a0b + 4 \u4e2a\u6a21\u5757\uff09<\/li>\n<li>\u6309\u5c42\u5f52\u7c7b\u6574\u4e2a\u9879\u76ee\u7684\u6280\u672f\u6808\uff0c\u5e76\u77e5\u9053\u6bcf\u9879\u6280\u672f\u7528\u5728\u54ea<\/li>\n<li>\u628a\u9879\u76ee\u8dd1\u8d77\u6765\uff0c\u8bbf\u95ee\u5230\u524d\u53f0\u95e8\u6237\u548c\u7ba1\u7406\u540e\u53f0<\/li>\n<\/ol>\n<hr \/>\n<h2>\u4e00\u3001\u77e5\u8bc6\u70b9\u8be6\u89e3<\/h2>\n<h3>1.1 \u9879\u76ee\u5b9a\u4f4d\uff1a\u6211\u4eec\u5b66\u7684\u5230\u5e95\u662f\u4ec0\u4e48<\/h3>\n<p><strong>novel-plus<\/strong> \u662f\u4e00\u4e2a<strong>\u591a\u7aef\uff08PC \/ WAP\uff09\u5c0f\u8bf4\u9605\u8bfb\u4e0e\u521b\u4f5c\u5e73\u53f0<\/strong>\uff08\u539f\u521b\u6587\u5b66 CMS\uff0cContent Management System\uff09\uff0c\u4e0d\u662f\u5355\u673a\u5c0f\u6e38\u620f\u3002\u5b83\u5305\u542b\u5c0f\u8bf4\u63a8\u8350\u3001\u4f5c\u54c1\u68c0\u7d22\u3001\u5c0f\u8bf4\u6392\u884c\u3001\u5c0f\u8bf4\u9605\u8bfb\u3001\u8bc4\u8bba\u3001\u4f1a\u5458\u4e2d\u5fc3\u3001\u4f5c\u5bb6\u521b\u4f5c\u3001AI \u5199\u4f5c\u3001\u4f1a\u5458\u5145\u503c\u8ba2\u9605\u3001\u722c\u866b\u91c7\u96c6\u3001\u5b9e\u65f6\u7edf\u8ba1\u62a5\u8868\u7b49\u5b8c\u6574\u529f\u80fd\u3002<\/p>\n<ul>\n<li>\u5f53\u524d\u7248\u672c\uff1a<strong>5.3.3<\/strong><\/li>\n<li>\u6280\u672f\u5e95\u5ea7\uff1a<strong>Spring Boot 3.4.0 + Java 21<\/strong><\/li>\n<li>\u9879\u76ee\u5730\u5740\uff08\u5b98\u65b9\uff09\uff1aGitHub \/ Gitee \u641c\u7d22 <code>201206030\/novel-plus<\/code>\uff0c\u53e6\u6709\u5b66\u4e60\u7248 <code>novel<\/code> \u548c\u5fae\u670d\u52a1\u7248 <code>novel-cloud<\/code><\/li>\n<\/ul>\n<p><strong>\u4e3a\u4ec0\u4e48\u8fd9\u4e2a\u9879\u76ee\u503c\u5f97\u5b66\uff1f<\/strong> \u5b83\u662f\u4e00\u4e2a\u628a\u4e3b\u6d41\u540e\u7aef\u6280\u672f\u771f\u5b9e\u7ec4\u5408\u8d77\u6765\u7684\u5b8c\u6574\u4e1a\u52a1\u7cfb\u7edf\uff1a\u6709\u6e05\u6670\u7684\u5206\u5c42\u3001\u771f\u5b9e\u7684\u7f13\u5b58 \/ \u5206\u8868 \/ \u652f\u4ed8 \/ \u722c\u866b \/ AI \u573a\u666f\u3002\u5403\u900f\u5b83 \u2248 \u770b\u61c2\u4e00\u4e2a\u4e2d\u5927\u578b Java \u540e\u7aef\u9879\u76ee\u7684\u901a\u7528\u9aa8\u67b6\uff0c\u4e4b\u540e\u5b66\u5176\u4ed6\u9879\u76ee\u80fd\u300c\u4e3e\u4e00\u53cd\u4e09\u300d\u3002<\/p>\n<h3>1.2 \u56db\u4e2a\u6a21\u5757\uff1a\u6574\u4e2a\u9879\u76ee\u600e\u4e48\u62c6\u5206<\/h3>\n<p>\u6574\u4e2a\u5de5\u7a0b\u662f\u4e00\u4e2a Maven \u591a\u6a21\u5757\u9879\u76ee\uff08\u6839\u76ee\u5f55 <code>pom.xml<\/code> \u901a\u8fc7 <code>&lt;modules&gt;<\/code> \u805a\u5408\uff09\uff0c\u5206 4 \u4e2a\u6a21\u5757\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u6a21\u5757<\/th>\n<th>\u804c\u8d23<\/th>\n<th>\u5165\u53e3\u7c7b<\/th>\n<th>\u9ed8\u8ba4\u7aef\u53e3<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>novel-common<\/code><\/td>\n<td>\u901a\u7528\u6a21\u5757\uff1a\u5b9e\u4f53\u3001Mapper\u3001\u7f13\u5b58\u3001\u5de5\u5177\u3001\u5168\u5c40\u589e\u5f3a<\/td>\n<td>\u65e0\u5165\u53e3\uff08\u88ab\u4e0b\u9762\u4e09\u4e2a\u4f9d\u8d56\uff09<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<tr>\n<td><code>novel-front<\/code><\/td>\n<td><strong>\u524d\u53f0\u95e8\u6237 + \u4f5c\u5bb6\u540e\u53f0<\/strong>\uff1a\u4e66\u57ce\u3001\u9605\u8bfb\u3001\u8bc4\u8bba\u3001\u4f1a\u5458\u3001\u4f5c\u8005\u521b\u4f5c\u3001AI \u5199\u4f5c\u3001\u5145\u503c<\/td>\n<td><code>novel-front\/src\/main\/java\/com\/java2nb\/novel\/FrontNovelApplication.java<\/code><\/td>\n<td>8083<\/td>\n<\/tr>\n<tr>\n<td><code>novel-crawl<\/code><\/td>\n<td><strong>\u722c\u866b\u7ba1\u7406\u7cfb\u7edf<\/strong>\uff1a\u6309\u89c4\u5219\u81ea\u52a8\u91c7\u96c6\u3001\u66f4\u65b0\u5c0f\u8bf4\u6570\u636e<\/td>\n<td><code>novel-crawl\/src\/main\/java\/com\/java2nb\/novel\/CrawlNovelApplication.java<\/code><\/td>\n<td>8081<\/td>\n<\/tr>\n<tr>\n<td><code>novel-admin<\/code><\/td>\n<td><strong>\u5e73\u53f0\u7ba1\u7406\u540e\u53f0<\/strong>\uff1a\u5c0f\u8bf4\/\u7528\u6237\/\u652f\u4ed8\u7ba1\u7406\u3001\u7cfb\u7edf RBAC \u6743\u9650<\/td>\n<td><code>novel-admin\/src\/main\/java\/com\/java2nb\/AdminApplication.java<\/code><\/td>\n<td>80<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p>\u8bb0\u5fc6\u70b9\uff1a<strong>\u524d\u53f0\u770b\u4e66\u3001\u4f5c\u5bb6\u5199\u5b57\u3001\u722c\u866b\u642c\u4e66\u3001\u540e\u53f0\u7ba1\u4e66<\/strong>\uff0c\u901a\u7528\u6a21\u5757\u6253\u5e95\u3002<\/p>\n<\/blockquote>\n<p><strong>\u4e09\u4e2a\u542f\u52a8\u7c7b\u90fd\u957f\u5f97\u50cf\uff0c\u4f46\u6ce8\u89e3\u6709\u5dee\u5f02\uff0c\u8fd9\u6b63\u662f\u7406\u89e3\u5b83\u4eec\u89d2\u8272\u7684\u94a5\u5319\u3002<\/strong> \u4ee5 <code>FrontNovelApplication.java<\/code> \u4e3a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">@SpringBootApplication          \/\/ \u58f0\u660e\u8fd9\u662f Spring Boot \u5e94\u7528\uff08\u81ea\u52a8\u88c5\u914d\uff09\n@EnableTransactionManagement    \/\/ \u5f00\u542f\u58f0\u660e\u5f0f\u4e8b\u52a1\n@EnableScheduling               \/\/ \u5f00\u542f\u5b9a\u65f6\u4efb\u52a1\n@EnableCaching                  \/\/ \u5f00\u542f\u7f13\u5b58\uff08\u914d\u5408 Redis\uff09\n@ServletComponentScan           \/\/ \u626b\u63cf Servlet \u7ec4\u4ef6\uff08\u8fc7\u6ee4\u5668\u7b49\uff09\n@MapperScan(basePackages = {\"com.java2nb.novel.mapper\"})  \/\/ \u626b\u63cf MyBatis Mapper\npublic class FrontNovelApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(FrontNovelApplication.class);\n    }\n}<\/code><\/pre>\n<p>\u4e09\u4e2a\u5165\u53e3\u7c7b\u5bf9\u6bd4\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u5bf9\u6bd4\u9879<\/th>\n<th>front<\/th>\n<th>crawl<\/th>\n<th>admin<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>@EnableTransactionManagement<\/code><\/td>\n<td>\u2705<\/td>\n<td>\u2014<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><code>@EnableCaching<\/code><\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td><code>@MapperScan<\/code> \u5305\u540d<\/td>\n<td><code>com.java2nb.novel.mapper<\/code><\/td>\n<td><code>com.java2nb.novel.mapper<\/code><\/td>\n<td><code>com.java2nb.*.dao<\/code><\/td>\n<\/tr>\n<tr>\n<td>\u662f\u5426\u6392\u9664 Spring Security<\/td>\n<td>\u5426<\/td>\n<td>\u5426\uff08crawl \u81ea\u5e26 SecurityConfiguration\uff09<\/td>\n<td><strong>\u2705 \u6392\u9664 SecurityAutoConfiguration<\/strong>\uff08\u6539\u7528 Shiro\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u542f\u52a8\u65f6\u884c\u4e3a<\/td>\n<td>\u6253\u5370\u8bbf\u95ee\u5730\u5740<\/td>\n<td>\u6253\u5370\u8bbf\u95ee\u5730\u5740<\/td>\n<td>\u5148\u521b\u5efa\u8fde\u63a5\u6c60\u3001\u6253\u5370\u6570\u636e\u5e93\u4fe1\u606f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u4e24\u4e2a\u503c\u5f97\u6ce8\u610f\u7684\u7ec6\u8282\uff1a<\/strong><\/p>\n<ul>\n<li><strong>admin \u4e3a\u4ec0\u4e48\u6392\u9664 Spring Security\uff1f<\/strong> \u56e0\u4e3a\u7ba1\u7406\u540e\u53f0\u7684\u9274\u6743\u7528\u7684\u662f <strong>Apache Shiro<\/strong>\uff08<code>novel-admin\/pom.xml<\/code> \u5f15\u5165 shiro-core\/shiro-spring\uff09\uff0c\u4e0d\u662f Spring Security\uff0c\u6240\u4ee5\u8981\u628a Spring Security \u7684\u81ea\u52a8\u88c5\u914d\u5173\u6389\uff0c\u907f\u514d\u51b2\u7a81\u3002<\/li>\n<li><strong>Mapper \u626b\u63cf\u5305\u540d\u4e0d\u540c<\/strong>\uff1afront\/crawl \u626b\u63cf <code>com.java2nb.novel.mapper<\/code>\uff0cadmin \u626b\u63cf <code>com.java2nb.*.dao<\/code>\u3002\u8bf4\u660e\u7ba1\u7406\u540e\u53f0\u7684\u6301\u4e45\u5c42\u7c7b\u653e\u5728 <code>dao<\/code> \u5305\u4e0b\uff08\u8fd9\u4e5f\u662f\u540e\u7eed\u8bfb\u4ee3\u7801\u65f6\u627e\u4f4d\u7f6e\u7684\u5173\u952e\u7ebf\u7d22\uff09\u3002<\/li>\n<\/ul>\n<h3>1.3 \u6280\u672f\u6808\u5168\u666f\uff1a\u9879\u76ee\u7528\u4e86\u54ea\u4e9b\u4e1c\u897f<\/h3>\n<p>\u6309\u300c\u4ece\u5e95\u5c42\u5230\u4e0a\u5c42\u300d\u5206 8 \u7c7b\uff0c\u4e00\u76ee\u4e86\u7136\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u5206\u7c7b<\/th>\n<th>\u6280\u672f<\/th>\n<th>\u7528\u5728\u54ea<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u6784\u5efa\u4e0e\u8bed\u8a00<\/td>\n<td>Java 21\u3001Maven\u3001Lombok<\/td>\n<td>\u5168\u9879\u76ee\uff08Lombok \u7b80\u5316\u5b9e\u4f53\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u636e\u5e93<\/td>\n<td>MySQL 8.0<\/td>\n<td>\u4e3b\u5e93\uff0c<code>doc\/sql\/novel_plus.sql<\/code> \u521d\u59cb\u5316<\/td>\n<\/tr>\n<tr>\n<td>\u6301\u4e45\u5c42<\/td>\n<td>MyBatis\u3001MyBatis Dynamic SQL\u3001PageHelper\u3001MyBatis Generator<\/td>\n<td>\u5168\u9879\u76ee\uff08\u52a8\u6001 SQL + \u5206\u9875\u63d2\u4ef6\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u5206\u5e93\u5206\u8868<\/td>\n<td>ShardingSphere-JDBC 5.5.1<\/td>\n<td>admin \u6570\u636e\u6e90\uff0c<code>book_content<\/code> \u6309 <code>index_id % 10<\/code> \u5206 10 \u8868<\/td>\n<\/tr>\n<tr>\n<td>\u6846\u67b6<\/td>\n<td>Spring Boot 3.4<\/td>\n<td>\u5168\u9879\u76ee<\/td>\n<\/tr>\n<tr>\n<td>\u5b89\u5168\u8ba4\u8bc1<\/td>\n<td>JJWT\uff08\u524d\u53f0\u767b\u5f55\uff09\u3001Spring Security\uff08crawl\uff09\u3001Apache Shiro\uff08admin\uff09<\/td>\n<td>\u4e09\u4e2a\u6a21\u5757\u5404\u53f8\u5176\u804c<\/td>\n<\/tr>\n<tr>\n<td>\u7f13\u5b58<\/td>\n<td>Redis\u3001Redisson<\/td>\n<td>\u524d\u53f0\u767b\u5f55\u6001 + \u70ed\u70b9\u6570\u636e\u7f13\u5b58<\/td>\n<\/tr>\n<tr>\n<td>\u524d\u7aef<\/td>\n<td>Thymeleaf\u3001Layui<\/td>\n<td>\u6a21\u677f\u6e32\u67d3 + \u7ba1\u7406\u7aef UI<\/td>\n<\/tr>\n<tr>\n<td>\u4e1a\u52a1\u6269\u5c55<\/td>\n<td>Spring AI 1.0\uff08\u5199\u4f5c\/\u5c01\u9762\uff09\u3001alipay-sdk-java\uff08\u5145\u503c\uff09\u3001\u963f\u91cc\u4e91 OSS\uff08\u56fe\u7247\uff09<\/td>\n<td>\u5747\u5728 novel-front<\/td>\n<\/tr>\n<tr>\n<td>\u8fd0\u7ef4<\/td>\n<td>Docker\u3001GitHub Actions CI<\/td>\n<td>\u90e8\u7f72\u4e0e\u53d1\u5e03<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p>\u8fd9\u4e9b\u6280\u672f\u5728\u540e\u7eed\u8bfe\u7a0b\u4e2d\u4f1a\u9010\u4e00\u5c55\u5f00\uff1aMyBatis\/\u5206\u9875\/\u5206\u8868\uff08L6-L10\uff09\u3001Spring Boot\uff08L11-L15\uff09\u3001JWT\/Spring Security\/Shiro\uff08L16-L18\uff09\u3001\u4e1a\u52a1\u5b9e\u6218\uff08L19-L24\uff09\u3001Spring AI\/\u5f02\u6b65\uff08L25-L26\uff09\u3002<\/p>\n<\/blockquote>\n<h3>1.4 \u600e\u4e48\u8dd1\u8d77\u6765\uff1a\u524d\u7f6e\u73af\u5883\u4e0e\u542f\u52a8\u987a\u5e8f<\/h3>\n<p><strong>\u524d\u7f6e\u8981\u6c42\uff1a<\/strong><\/p>\n<ul>\n<li>JDK 21\uff08\u9879\u76ee\u8981\u6c42 <code>java.version=21<\/code>\uff0c\u4f4e\u4e8e\u6b64\u7248\u672c\u65e0\u6cd5\u7f16\u8bd1\uff09<\/li>\n<li>Maven\uff083.x\uff09+ \u672c\u5730\u4ed3\u5e93\u80fd\u8bbf\u95ee\u963f\u91cc\u955c\u50cf\uff08<code>pom.xml<\/code> \u91cc\u5df2\u914d\u597d aliyun \u4ed3\u5e93\uff09<\/li>\n<li>MySQL 8.x\u3001Redis\uff08\u542f\u52a8\u524d\u53f0\u767b\u5f55\u6001\/\u7f13\u5b58\u9700\u8981\uff09<\/li>\n<\/ul>\n<p><strong>\u521d\u59cb\u5316\u6570\u636e\u5e93\uff1a<\/strong><\/p>\n<ol>\n<li>\u7528 <code>doc\/sql\/novel_plus.sql<\/code> \u5efa\u5e93\u5efa\u8868\uff08\u4e3b\u811a\u672c\uff0c\u5e93\u540d <code>novel_plus<\/code>\uff09<\/li>\n<li>\u82e5\u9700\u8981\u6700\u65b0\u7ed3\u6784\uff0c\u6309\u6587\u4ef6\u540d\u65f6\u95f4\u987a\u5e8f\u6267\u884c <code>doc\/sql\/<\/code> \u4e0b\u7684\u589e\u91cf\u811a\u672c\uff08\u5982 <code>20250712.sql<\/code>\uff09<\/li>\n<\/ol>\n<p><strong>\u542f\u52a8\u987a\u5e8f\uff08\u5efa\u8bae\uff09\uff1a<\/strong><\/p>\n<ol>\n<li>\u542f\u52a8 MySQL\u3001Redis<\/li>\n<li>\u4f9d\u6b21\u542f\u52a8 <code>novel-front<\/code>\uff088083\uff09\u3001<code>novel-crawl<\/code>\uff088081\uff09\u3001<code>novel-admin<\/code>\uff0880\uff09<\/li>\n<\/ol>\n<p><strong>\u8bbf\u95ee\u5165\u53e3\uff1a<\/strong><\/p>\n<ul>\n<li>\u524d\u53f0\u95e8\u6237\uff1a<code>http:\/\/localhost:8083<\/code><\/li>\n<li>\u722c\u866b\u7ba1\u7406\uff1a<code>http:\/\/localhost:8081<\/code>\uff08\u8d26\u53f7 admin \/ admin\uff0c\u89c1 crawl \u7684 <code>application.yml<\/code>\uff09<\/li>\n<li>\u7ba1\u7406\u540e\u53f0\uff1a<code>http:\/\/localhost:80<\/code><\/li>\n<\/ul>\n<blockquote>\n<p>\u5404\u6a21\u5757\u7aef\u53e3\u5728\u5404\u81ea <code>application.yml<\/code> \u7684 <code>server.port<\/code> \u914d\u7f6e\uff1b<code>novel-front<\/code> \u9ed8\u8ba4\u6fc0\u6d3b <code>dev<\/code> \u73af\u5883\u5e76\u5f15\u5165 <code>website,alipay,oss<\/code> \u4e09\u4e2a profile\uff08<code>application.yml<\/code> \u7b2c 4-7 \u884c\uff09\u3002<\/p>\n<\/blockquote>\n<h3>1.5 \u5b66\u4e60\u6587\u6863\u7d22\u5f15\uff1a\u5df2\u6709\u8d44\u6e90\u522b\u6d6a\u8d39<\/h3>\n<table>\n<thead>\n<tr>\n<th>\u6587\u6863<\/th>\n<th>\u7c7b\u578b<\/th>\n<th>\u4ec0\u4e48\u65f6\u5019\u7528<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>doc\/novel-plus-tutorial.md<\/code><\/td>\n<td>\u6e90\u7801\u7ea7\u6559\u7a0b\uff0811 \u7ae0\uff09<\/td>\n<td>\u73af\u5883\u642d\u5efa\u3001\u6570\u636e\u5e93\u3001\u6a21\u5757\u8be6\u89e3\u3001\u6838\u5fc3\u6d41\u7a0b<\/td>\n<\/tr>\n<tr>\n<td><code>doc\/novel-plus-source-study.md<\/code><\/td>\n<td>\u6e90\u7801\u5b66\u4e60\u7b14\u8bb0\uff08\u9636\u6bb5 0-3\uff09<\/td>\n<td>\u6df1\u5165\u8bfb\u6e90\u7801\u3001\u4e8c\u6b21\u5f00\u53d1<\/td>\n<\/tr>\n<tr>\n<td><code>doc\/tech-stack-learning-roadmap.md<\/code><\/td>\n<td>\u6280\u672f\u6808\u5b66\u4e60\u8def\u7ebf\u56fe<\/td>\n<td>\u8865\u67d0\u9879\u6280\u672f\u7684\u57fa\u7840<\/td>\n<\/tr>\n<tr>\n<td><code>Tutorial\/\u5b66\u4e60\u5efa\u8bae-\u4e8c\u6b21\u5f00\u53d1\u8def\u7ebf.md<\/code><\/td>\n<td>\u5b66\u4e60\u8def\u5f84\u4e0e\u7ec3\u4e60<\/td>\n<td>\u603b\u4f53\u8282\u594f\u3001\u52a8\u624b\u7ec3\u4e60 P0-P5<\/td>\n<\/tr>\n<tr>\n<td><code>Tutorial\/\u8bfe\u7a0b\u5927\u7eb2-30\u8282\u8bfe.md<\/code><\/td>\n<td>\u8bfe\u7a0b\u5927\u7eb2<\/td>\n<td>\u6bcf\u8bfe\u4e3b\u9898\u4e0e\u53c2\u8003\u7ae0\u8282<\/td>\n<\/tr>\n<tr>\n<td><code>doc\/AI\u529f\u80fd\u65e0\u53cd\u5e94\u8bca\u65ad.md<\/code><\/td>\n<td>\u6392\u969c\u8bb0\u5f55<\/td>\n<td>AI \u529f\u80fd\u51fa\u95ee\u9898\u65f6\u7684\u6392\u67e5\u53c2\u8003<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>1.6 \u5b89\u5168\u63d0\u9192<\/h3>\n<p><code>novel-front<\/code> \u7684 <code>application.yml<\/code> \u91cc\u76f4\u63a5\u5199\u7740\u771f\u5b9e\u53ef\u7528\u7684 <strong>API Key<\/strong>\uff08\u5982 Spring AI \u8c03\u7528\u7684 deepseek key\uff09\u3002\u5b66\u4e60\u65f6\u6ce8\u610f\uff1a<\/p>\n<ul>\n<li><strong>\u4e0d\u8981\u628a\u8fd9\u4e2a\u4ed3\u5e93\u63a8\u5230\u516c\u5f00\u4ed3\u5e93<\/strong>\uff0c\u6216\u63a8\u4e4b\u524d\u52a1\u5fc5\u628a key \u6e05\u6389 \/ \u6362\u6210\u4f60\u81ea\u5df1\u7684<\/li>\n<li>\u5373\u4fbf\u53ea\u5728\u672c\u5730\u5b66\uff0c\u4e5f\u5efa\u8bae\u6362\u6210\u81ea\u5df1\u7684 key\uff0c\u907f\u514d\u88ab\u76d7\u7528\u4ea7\u751f\u8d39\u7528<\/li>\n<li>\u5b66\u914d\u7f6e\u65f6\u770b\u300ckey \u914d\u5728\u54ea\u91cc\u3001\u4ec0\u4e48\u683c\u5f0f\u300d\uff0c\u4e0d\u8981\u4f20\u64ad\u539f\u6587<\/li>\n<\/ul>\n<hr \/>\n<h2>\u4e8c\u3001\u52a8\u624b\u7ec3\u4e60\uff08\u542b\u9a8c\u8bc1\u6807\u51c6\uff09<\/h2>\n<blockquote>\n<p>\u5efa\u8bae\u8ddf\u7740\u505a\uff0c\u505a\u5b8c\u4e00\u9879\u52fe\u4e00\u9879\u3002\u8fd9\u662f\u68c0\u9a8c\u300c\u770b\u61c2\u4e86\u300d\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u3002<\/p>\n<\/blockquote>\n<h3>\u7ec3\u4e60 1\uff1a\u628a\u9879\u76ee\u8dd1\u8d77\u6765<\/h3>\n<ul>\n<li><strong>\u76ee\u6807<\/strong>\uff1a\u5b8c\u6210\u6570\u636e\u5e93\u521d\u59cb\u5316\u548c\u4e09\u6a21\u5757\u542f\u52a8\uff0c\u80fd\u8bbf\u95ee\u5230\u524d\u53f0\u548c\u7ba1\u7406\u540e\u53f0\u3002<\/li>\n<li><strong>\u6b65\u9aa4<\/strong>\uff1a\u5b89\u88c5 JDK21\/Maven\/MySQL\/Redis \u2192 \u7528 <code>doc\/sql\/novel_plus.sql<\/code> \u5efa\u5e93 \u2192 \u4f9d\u6b21\u542f\u52a8\u4e09\u4e2a\u6a21\u5757\u3002<\/li>\n<li><strong>\u9a8c\u8bc1\u6807\u51c6<\/strong>\uff1a\u6d4f\u89c8\u5668\u8bbf\u95ee <code>http:\/\/localhost:8083<\/code> \u80fd\u770b\u5230\u524d\u53f0\u9996\u9875\u6570\u636e\uff1b\u8bbf\u95ee <code>http:\/\/localhost:80<\/code> \u80fd\u6253\u5f00\u7ba1\u7406\u540e\u53f0\u767b\u5f55\u9875\uff1b\u4e09\u4e2a\u6a21\u5757\u63a7\u5236\u53f0\u90fd\u51fa\u73b0\u300c\u9879\u76ee\u542f\u52a8\u5566\u300d\u65e5\u5fd7\u3002<\/li>\n<\/ul>\n<h3>\u7ec3\u4e60 2\uff1a\u7ed3\u6784\u8ba4\u77e5<\/h3>\n<ul>\n<li><strong>\u76ee\u6807<\/strong>\uff1a\u5728 IDEA \u91cc\u5c55\u5f00\u56db\u4e2a\u6a21\u5757\uff0c\u5f62\u6210\u300c\u54ea\u91cc\u662f\u4ec0\u4e48\u300d\u7684\u76f4\u89c9\u3002<\/li>\n<li><strong>\u6b65\u9aa4<\/strong>\uff1a\u7528 IDE \u6253\u5f00\u6839\u76ee\u5f55 <code>pom.xml<\/code>\uff08\u4f1a\u4f5c\u4e3a Maven \u5de5\u7a0b\u52a0\u8f7d\uff09\uff0c\u5c55\u5f00 <code>novel-common \/ novel-front \/ novel-crawl \/ novel-admin<\/code>\uff0c\u6bcf\u4e2a\u6a21\u5757\u627e 2-3 \u4e2a\u6838\u5fc3\u7c7b\uff08\u5982 front \u4e0b\u7684 <code>PageController<\/code>\u3001admin \u4e0b\u7684 <code>sys<\/code> \u76ee\u5f55\uff09\u3002<\/li>\n<li><strong>\u9a8c\u8bc1\u6807\u51c6<\/strong>\uff1a\u80fd\u4e0d\u770b\u6587\u6863\u8bf4\u51fa\u6bcf\u4e2a\u6a21\u5757\u7684\u804c\u8d23\uff0c\u5e76\u6307\u51fa\u5176\u4e2d 1-2 \u4e2a\u6838\u5fc3\u7c7b\u7684\u5305\u8def\u5f84\u3002<\/li>\n<\/ul>\n<h3>\u7ec3\u4e60 3\uff1a\u914d\u7f6e\u89c2\u5bdf<\/h3>\n<ul>\n<li><strong>\u76ee\u6807<\/strong>\uff1a\u81ea\u5df1\u627e\u5230\u7aef\u53e3\u3001\u73af\u5883\u3001\u6570\u636e\u6e90\u914d\u7f6e\uff0c\u5efa\u7acb\u300c\u914d\u7f6e\u5728\u54ea\u300d\u7684\u8ba4\u77e5\u3002<\/li>\n<li><strong>\u6b65\u9aa4<\/strong>\uff1a\u6253\u5f00 <code>novel-front\/src\/main\/resources\/application.yml<\/code>\uff0c\u627e\u5230 <code>server.port<\/code> \u4e0e <code>spring.profiles.active<\/code>\uff1b\u6253\u5f00 <code>novel-admin\/src\/main\/resources\/application.yml<\/code>\uff0c\u627e\u5230\u6570\u636e\u6e90\uff08ShardingSphereDriver\uff09\u6307\u5411\u7684\u6587\u4ef6\u3002<\/li>\n<li><strong>\u9a8c\u8bc1\u6807\u51c6<\/strong>\uff1a\u80fd\u56de\u7b54\u300cfront \u7aef\u53e3\u662f\u591a\u5c11\u3001\u6fc0\u6d3b\u4e86\u4ec0\u4e48\u73af\u5883\u300d\u300cadmin \u7684\u6570\u636e\u6e90\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u662f\u4ec0\u4e48\u300d\u3002<\/li>\n<\/ul>\n<hr \/>\n<h2>\u4e09\u3001\u672c\u8bfe\u5c0f\u7ed3<\/h2>\n<p>novel-plus \u662f\u4e00\u4e2a <strong>Spring Boot 3.4 \/ Java 21 \u7684\u591a\u6a21\u5757\u5c0f\u8bf4 CMS<\/strong>\uff1a\u524d\u53f0\u770b\u4e66\uff08front\uff0c8083\uff09\u3001\u4f5c\u5bb6\u5199\u5b57\uff08front\uff09\u3001\u722c\u866b\u642c\u4e66\uff08crawl\uff0c8081\uff09\u3001\u540e\u53f0\u7ba1\u4e66\uff08admin\uff0c80\uff09\uff0c\u901a\u7528\u6a21\u5757\uff08common\uff09\u6253\u5e95\u3002\u5b83\u628a MyBatis\u3001\u5206\u9875\u3001\u5206\u8868\u3001JWT\/Shiro\u3001Redis\u3001Spring AI\u3001\u652f\u4ed8\u5b9d\u3001Docker \u7b49\u4e3b\u6d41\u6280\u672f<strong>\u771f\u5b9e\u5730\u7ec4\u5408<\/strong>\u5728\u4e00\u8d77\uff0c\u662f\u4e00\u4e2a\u6781\u4f73\u7684\u5927\u578b\u540e\u7aef\u5de5\u7a0b\u5b66\u4e60\u8303\u672c\u3002\u4e0b\u4e00\u8bfe\u8d77\uff0c\u6211\u4eec\u4ece <strong>Java 21 \u4e0e\u5de5\u7a0b\u5de5\u5177<\/strong>\u5f00\u59cb\u6253\u57fa\u7840\uff0c\u9010\u6b65\u6df1\u5165\u5230\u6570\u636e\u5e93\u3001\u6846\u67b6\u3001\u4e1a\u52a1\u4e0e\u90e8\u7f72\u3002<\/p>\n<hr \/>\n<h2>\u56db\u3001\u81ea\u6d4b\u9898<\/h2>\n<ol>\n<li>\u3010\u9009\u62e9\u3011novel-front \u7684\u9ed8\u8ba4\u7aef\u53e3\u662f\uff1f\uff08A. 80\u3000B. 8081\u3000C. 8083\u3000D. 8080\uff09<\/li>\n<li>\u3010\u9009\u62e9\u3011\u54ea\u4e2a\u6a21\u5757\u6392\u9664\u4e86 Spring Security \u81ea\u52a8\u88c5\u914d\u3001\u6539\u7528 Shiro \u9274\u6743\uff1f\uff08A. front\u3000B. crawl\u3000C. admin\u3000D. common\uff09<\/li>\n<li>\u3010\u9009\u62e9\u3011front \/ crawl \u7684 <code>@MapperScan<\/code> \u626b\u63cf\u54ea\u4e2a\u5305\uff1f\uff08A. <code>com.java2nb.*.dao<\/code>\u3000B. <code>com.java2nb.novel.mapper<\/code>\u3000C. <code>com.java2nb.novel.entity<\/code>\u3000D. <code>com.java2nb<\/code>\uff09<\/li>\n<li>\u3010\u7b80\u7b54\u3011\u5206\u522b\u7528\u4e00\u53e5\u8bdd\u8bf4\u51fa\u56db\u4e2a\u6a21\u5757\u5404\u8d1f\u8d23\u4ec0\u4e48\u3002<\/li>\n<li>\u3010\u7b80\u7b54\u3011\u4e3a\u4ec0\u4e48\u542f\u52a8\u524d\u5fc5\u987b\u5148\u521d\u59cb\u5316\u6570\u636e\u5e93\uff1fadmin \u6a21\u5757\u7684\u6570\u636e\u6e90\u6307\u5411\u54ea\u4e2a\u914d\u7f6e\u6587\u4ef6\uff1f<\/li>\n<\/ol>\n<blockquote>\n<p>\u7b54\u6848\u5728\u6587\u5185\u5bf9\u5e94\u7ae0\u8282\uff1a\u7aef\u53e3\u89c1 1.2 \u8868\u3001Shiro \u89c1 1.2 \u7ec6\u8282\u8bf4\u660e\u3001MapperScan \u89c1 1.2 \u5bf9\u6bd4\u8868\u3001\u6a21\u5757\u804c\u8d23\u89c1 1.2 \u8868\u3001\u6570\u636e\u6e90\u89c1\u7ec3\u4e60 3\u3002<\/p>\n<\/blockquote>\n<hr \/>\n<h2>\u4e94\u3001\u53c2\u8003\u8d44\u6e90<\/h2>\n<ul>\n<li>\u672c\u8bfe\u7a0b\u5927\u7eb2\uff1a<code>Tutorial\/\u8bfe\u7a0b\u5927\u7eb2-30\u8282\u8bfe.md<\/code> \u2192 \u7b2c 1 \u8bfe<\/li>\n<li>\u6559\u7a0b\uff1a<code>doc\/novel-plus-tutorial.md<\/code> \u2192 \u7b2c 1\u30012 \u7ae0\uff08\u9879\u76ee\u6982\u8ff0\u3001\u73af\u5883\u642d\u5efa\u4e0e\u8fd0\u884c\uff09<\/li>\n<li>\u6e90\u7801\u7b14\u8bb0\uff1a<code>doc\/novel-plus-source-study.md<\/code> \u2192 \u9636\u6bb5 0\uff08\u9879\u76ee\u8ba4\u77e5\u4e0e\u8dd1\u901a\uff09<\/li>\n<li>\u6280\u672f\u6808\u8def\u7ebf\uff1a<code>doc\/tech-stack-learning-roadmap.md<\/code> \u2192 \u7b2c 2.1-2.3 \u8282\uff08Java\/Maven\/Lombok\uff09<\/li>\n<li>\u9879\u76ee\u9996\u9875\uff1a\u6839\u76ee\u5f55 <code>README.md<\/code><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c 1 \u8bfe \u8bfe\u7a0b\u5bfc\u8bba + \u9879\u76ee\u5168\u666f \u672c\u8bfe\u662f 30 \u8282\u8bfe\u7a0b\u7684\u8d77\u70b9\uff1a\u5148\u770b\u6e05\u300c\u6211\u4eec\u8981\u5b66\u7684\u662f\u4e00\u4e2a\u4ec0\u4e48\u4e1c\u897f\u3001\u7531\u54ea\u4e9b\u90e8\u5206\u7ec4 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[22],"class_list":["post-576","post","type-post","status-publish","format-standard","hentry","category-project","tag-22"],"_links":{"self":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/posts\/576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/comments?post=576"}],"version-history":[{"count":0,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/posts\/576\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/media?parent=576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/categories?post=576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kirasu.cn\/index.php\/wp-json\/wp\/v2\/tags?post=576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}