{"id":26,"date":"2026-07-28T13:42:34","date_gmt":"2026-07-28T05:42:34","guid":{"rendered":"http:\/\/www.dxkua.cn\/index.php\/2026\/07\/28\/%e7%ac%ac%e4%ba%8c%e9%83%a8%e5%88%86%ef%bc%9a%e4%bb%8e%e9%9b%b6%e5%a4%8d%e7%8e%b0%e6%8c%87%e5%8d%97\/"},"modified":"2026-07-28T13:58:11","modified_gmt":"2026-07-28T05:58:11","slug":"%e7%ac%ac%e4%ba%8c%e9%83%a8%e5%88%86%ef%bc%9a%e4%bb%8e%e9%9b%b6%e5%a4%8d%e7%8e%b0%e6%8c%87%e5%8d%97","status":"publish","type":"post","link":"https:\/\/www.dxkua.cn\/index.php\/2026\/07\/28\/%e7%ac%ac%e4%ba%8c%e9%83%a8%e5%88%86%ef%bc%9a%e4%bb%8e%e9%9b%b6%e5%a4%8d%e7%8e%b0%e6%8c%87%e5%8d%97\/","title":{"rendered":"\u7b2c\u4e8c\u90e8\u5206\uff1a\u4ece\u96f6\u590d\u73b0\u6307\u5357"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\n\n<p class=\"wp-block-paragraph\">\u8865\u5168\u4e86\u6240\u6709\u7f3a\u5931\u7684\u914d\u7f6e\u3001\u811a\u624b\u67b6\u3001\u975e\u6838\u5fc3\u4ee3\u7801\u548c\u90e8\u7f72\u6b65\u9aa4\u3002\u8bfb\u5b8c\u524d\u976218\u7ae0+\u8fd9\u4e00\u90e8\u5206\uff0c\u53ef\u4ee5\u4ece\u96f6\u642d\u5efa\u4e00\u4e2a\u5b8c\u5168\u4e00\u6837\u7684\u5546\u57ce\u9879\u76ee\u3002<\/p>\n\n\n<\/blockquote>\n\n<hr \/>\n\n<h2 class=\"wp-block-heading\">19. \u73af\u5883\u642d\u5efa<\/h2>\n\n\n<h3 class=\"wp-block-heading\">19.1 \u9700\u8981\u7684\u8f6f\u4ef6<\/h3>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>\u8f6f\u4ef6<\/th>\n<th>\u7248\u672c<\/th>\n<th>\u7528\u9014<\/th>\n<th>\u4e0b\u8f7d\u65b9\u5f0f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>JDK<\/td>\n<td>17<\/td>\n<td>Java\u8fd0\u884c\/\u7f16\u8bd1<\/td>\n<td><code>winget install OpenJDK.OpenJDK.17<\/code> \u6216 <code>adoptium.net<\/code><\/td>\n<\/tr>\n<tr>\n<td>Maven<\/td>\n<td>3.8+<\/td>\n<td>Java\u9879\u76ee\u6784\u5efa<\/td>\n<td><code>winget install Apache.Maven.3<\/code> \u6216 <code>maven.apache.org<\/code><\/td>\n<\/tr>\n<tr>\n<td>MySQL<\/td>\n<td>8.0<\/td>\n<td>\u6570\u636e\u5e93<\/td>\n<td><code>winget install Oracle.MySQL<\/code> \u6216 <code>dev.mysql.com<\/code><\/td>\n<\/tr>\n<tr>\n<td>ZooKeeper<\/td>\n<td>3.8+<\/td>\n<td>Dubbo\u6ce8\u518c\u4e2d\u5fc3<\/td>\n<td><code>apache.org\/dyn\/closer.lua\/zookeeper\/<\/code> \u89e3\u538b\u5373\u7528<\/td>\n<\/tr>\n<tr>\n<td>Redis<\/td>\n<td>7.x<\/td>\n<td>\u9a8c\u8bc1\u7801\u7f13\u5b58<\/td>\n<td>Windows: <code>github.com\/microsoftarchive\/redis\/releases<\/code><\/td>\n<\/tr>\n<tr>\n<td>Node.js<\/td>\n<td>20+<\/td>\n<td>\u524d\u7aef\u8fd0\u884c\u65f6<\/td>\n<td><code>winget install OpenJS.NodeJS.LTS<\/code> \u6216 <code>nodejs.org<\/code><\/td>\n<\/tr>\n<tr>\n<td>IDE<\/td>\n<td>&#8211;<\/td>\n<td>IntelliJ IDEA (\u63a8\u8350)<\/td>\n<td><code>jetbrains.com\/idea<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n<h3 class=\"wp-block-heading\">19.2 \u542f\u52a8\u4e2d\u95f4\u4ef6<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>MySQL<\/strong>\uff1a\u521b\u5efa\u6570\u636e\u5e93\u548c\u7528\u6237\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE mall CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\nCREATE USER 'mall'@'localhost' IDENTIFIED BY 'nhZSCY2LPLjfm2ci';\nGRANT ALL PRIVILEGES ON mall.* TO 'mall'@'localhost';\nFLUSH PRIVILEGES;<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u6267\u884c\u5efa\u8868\u811a\u672c\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>mysql -umall -pnhZSCY2LPLjfm2ci mall &lt; mall.sql<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6267\u884c\u672c\u6b21\u65b0\u589e\u7684ALTER<\/strong>\uff08\u7ed9order\u8868\u52a0items\u5217\uff09\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>ALTER TABLE `order` ADD COLUMN `items` text CHARACTER SET utf8mb4 NULL COMMENT '\u8ba2\u5355\u5546\u54c1JSON\u5feb\u7167';<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>ZooKeeper<\/strong>\uff1a\u89e3\u538b\u2192<code>cp conf\/zoo_sample.cfg conf\/zoo.cfg<\/code>\u2192<code>bin\/zkServer.cmd<\/code>\uff08Windows\uff09<\/p>\n\n\n<p class=\"wp-block-paragraph\"><strong>Redis<\/strong>\uff1a\u542f\u52a8 <code>redis-server.exe<\/code>\uff08\u5bc6\u7801\u901a\u8fc7conf\u8bbe<code>requirepass 123456<\/code>\uff09<\/p>\n\n<hr \/>\n\n<h2 class=\"wp-block-heading\">20. \u9879\u76ee\u521d\u59cb\u5316<\/h2>\n\n\n<h3 class=\"wp-block-heading\">20.1 \u7236 POM\uff08\u5b8c\u6574\u7248\uff09<\/h3>\n\n\n<p class=\"wp-block-paragraph\">\u6587\u4ef6\u5185\u5bb9\u89c1 <code>C:Users24255Desktopmallpom.xml<\/code>\uff0c\u5173\u952e\u7ed3\u6784\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>&lt;groupId&gt;org.example&lt;\/groupId&gt;\n&lt;artifactId&gt;mall&lt;\/artifactId&gt;\n&lt;version&gt;1.0.0&lt;\/version&gt;\n&lt;packaging&gt;pom&lt;\/packaging&gt;\n&lt;modules&gt;\n    &lt;module&gt;common&lt;\/module&gt;\n    &lt;module&gt;admin_service&lt;\/module&gt;\n    &lt;module&gt;user_service&lt;\/module&gt;\n    &lt;module&gt;goods_service&lt;\/module&gt;\n    &lt;module&gt;order_service&lt;\/module&gt;\n&lt;\/modules&gt;<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>hutool-all 5.8.4<\/strong> \u5728\u7236POM\u4f9d\u8d56\u4e2d\u58f0\u660e\uff08\u6240\u6709\u6a21\u5757\u81ea\u52a8\u7ee7\u627f\uff09\u3002\n<strong>lombok 1.18.34<\/strong> \u540c\u6837\u81ea\u52a8\u7ee7\u627f\u3002<\/p>\n\n\n<p class=\"wp-block-paragraph\">\u6838\u5fc3\u4f9d\u8d56\u7248\u672c\u7ba1\u7406\uff1a<\/p>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>\u4f9d\u8d56<\/th>\n<th>\u7248\u672c<\/th>\n<th>\u4f5c\u7528<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>spring-boot-dependencies<\/td>\n<td>2.6.13<\/td>\n<td>SpringBoot\u6240\u6709starter\u7248\u672c\u7edf\u4e00\u7ba1\u7406<\/td>\n<\/tr>\n<tr>\n<td>dubbo-bom<\/td>\n<td>3.3.0<\/td>\n<td>Dubbo\u6240\u6709\u7ec4\u4ef6\u7248\u672c\u7edf\u4e00\u7ba1\u7406<\/td>\n<\/tr>\n<tr>\n<td>mybatis-spring-boot-starter<\/td>\n<td>2.2.2<\/td>\n<td>MyBatis\u96c6\u6210SpringBoot<\/td>\n<\/tr>\n<tr>\n<td>mysql-connector-java<\/td>\n<td>8.0.33<\/td>\n<td>MySQL\u9a71\u52a8<\/td>\n<\/tr>\n<tr>\n<td>pagehelper<\/td>\n<td>2.1.0<\/td>\n<td>\u5206\u9875\u63d2\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>java-jwt<\/td>\n<td>4.0.0<\/td>\n<td>JWT\u751f\u6210\/\u89e3\u6790<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n<h3 class=\"wp-block-heading\">20.2 \u5404\u5b50\u6a21\u5757 POM<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>common\/pom.xml<\/strong>\uff1a\u4f9d\u8d56 spring-boot-starter-web\u3001java-jwt\u3001pagehelper\u3001spring-data-redis\u3001dubbo-spring-boot-starter<\/p>\n\n\n<p class=\"wp-block-paragraph\"><strong>admin_service\/pom.xml<\/strong> \u548c <strong>user_service\/pom.xml<\/strong>\uff1a\u4f9d\u8d56 common\u3001mysql-connector-java\u3001mybatis-spring-boot-starter\u3001spring-boot-starter-data-redis\u3001dubbo-spring-boot-starter\u3001dubbo-zookeeper-curator5<\/p>\n\n\n<p class=\"wp-block-paragraph\"><strong>goods_service\/pom.xml<\/strong>\uff1a\u540c\u4e0a + pagehelper<\/p>\n\n\n<p class=\"wp-block-paragraph\"><strong>order_service\/pom.xml<\/strong>\uff1a\u540c\u4e0a + \u652f\u4ed8\u5b9dSDK\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n    &lt;groupId&gt;com.alipay.sdk&lt;\/groupId&gt;\n    &lt;artifactId&gt;alipay-sdk-java&lt;\/artifactId&gt;\n    &lt;version&gt;4.38.0.ALL&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">20.3 \u5b8c\u6574 application.yml \u914d\u7f6e<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>admin_service\/src\/main\/resources\/application.yml<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>server:\n  port: 8091\nspring:\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql:\/\/127.0.0.1:3306\/mall?useSSL=false&amp;serverTimezone=Asia\/Shanghai\n    username: mall\n    password: nhZSCY2LPLjfm2ci\n  redis:\n    host: localhost\n    port: 6379\n    password: 123456\nmybatis:\n  type-aliases-package: org.example.mall.common.bean\n  configuration:\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    map-underscore-to-camel-case: true\ncom:\n  picdir: \/www\/wwwroot\/mall.dxkua.cn\/mall\/pic\/\nwhite-list:\n  rules:\n    - method: GET\n      regpath: \/admin\/captcha\n    - method: POST\n      regpath: \/admin\/login<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>user_service\/src\/main\/resources\/application.yml<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>server:\n  port: 8092\nspring:\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql:\/\/127.0.0.1:3306\/mall?useSSL=false&amp;serverTimezone=Asia\/Shanghai\n    username: mall\n    password: nhZSCY2LPLjfm2ci\n  redis:\n    host: localhost\n    port: 6379\n    password: 123456\nmybatis:\n  type-aliases-package: org.example.mall.common.bean\n  configuration:\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    map-underscore-to-camel-case: true\ndubbo:\n  application:\n    name: user_service\n    qos-port: 28092\n  protocol:\n    name: dubbo\n    port: 38092\n  registry:\n    address: zookeeper:\/\/127.0.0.1:2181\nwhite-list:\n  rules:\n    - method: GET\n      regpath: \/user\/captcha\n    - method: POST\n      regpath: \/user\/login\n    - method: POST\n      regpath: \/user\/reg<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>goods_service\/src\/main\/resources\/application.yml<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>server:\n  port: 8090\nspring:\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql:\/\/127.0.0.1:3306\/mall?useSSL=false&amp;serverTimezone=Asia\/Shanghai\n    username: mall\n    password: nhZSCY2LPLjfm2ci\nmybatis:\n  type-aliases-package: org.example.mall.common.bean\n  configuration:\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    map-underscore-to-camel-case: true\ndubbo:\n  application:\n    name: goods_service\n    qos-port: 28090\n  protocol:\n    name: dubbo\n    port: 38090\n  registry:\n    address: zookeeper:\/\/127.0.0.1:2181\n  scan:\n    base-packages: org.example.mall.goods_service.service<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>order_service\/src\/main\/resources\/application.yml<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>server:\n  port: 8093\nspring:\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql:\/\/127.0.0.1:3306\/mall?useSSL=false&amp;serverTimezone=Asia\/Shanghai\n    username: mall\n    password: nhZSCY2LPLjfm2ci\nmybatis:\n  type-aliases-package: org.example.mall.common.bean\n  configuration:\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    map-underscore-to-camel-case: true\ndubbo:\n  application:\n    name: order_service\n    qos-port: 28093\n  protocol:\n    name: dubbo\n    port: 38093\n  registry:\n    address: zookeeper:\/\/127.0.0.1:2181\ncom:\n  picdir: \/www\/wwwroot\/mall.dxkua.cn\/mall\/pic\/\nalipay:\n  appId: ${ALIPAY_APP_ID:}\n  privateKey: ${ALIPAY_PRIVATE_KEY:}\n  publicKey: ${ALIPAY_PUBLIC_KEY:}\n  gateway: ${ALIPAY_GATEWAY:https:\/\/openapi-sandbox.dl.alipaydev.com\/gateway.do}\n  signType: RSA2\n  returnUrl: ${ALIPAY_RETURN_URL:http:\/\/www.dxkua.cn\/#\/user\/payResult}\n  notifyUrl: ${ALIPAY_NOTIFY_URL:http:\/\/www.dxkua.cn\/order\/notify}<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">20.4 \u5404\u5fae\u670d\u52a1\u542f\u52a8\u7c7b<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>admin_service<\/strong> \u548c <strong>user_service<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@SpringBootApplication(scanBasePackages = {\"org.example.mall\"})\n@MapperScan(basePackages = \"org.example.mall.xxx_service.mapper\")\npublic class XxxServiceApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(XxxServiceApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>goods_service<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@SpringBootApplication(scanBasePackages = {\"org.example.mall\"})\n@MapperScan(basePackages = \"org.example.mall.goods_service.mapper\")\n@EnableDubbo(scanBasePackages = \"org.example.mall.goods_service.service\")\npublic class GoodsServiceApplication { ... }<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>order_service<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@SpringBootApplication(scanBasePackages = {\"org.example.mall\"})\n@MapperScan(basePackages = \"org.example.mall.order_service.mapper\")\n@EnableDubbo\n@EnableScheduling  \/\/ \u5b9a\u65f6\u53d6\u6d88\u8d85\u65f6\u8ba2\u5355\npublic class OrderServiceApplication { ... }<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">20.5 common \u6a21\u5757\u5b8c\u6574\u6587\u4ef6\u6e05\u5355<\/h3>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>\u76ee\u5f55<\/th>\n<th>\u6587\u4ef6\u540d<\/th>\n<th>\u4f5c\u7528<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Order.java<\/td>\n<td>\u8ba2\u5355\u5b9e\u4f53\uff08Long id, items JSON, detailList, totalPrice\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>OrderDetail.java<\/td>\n<td>\u8ba2\u5355\u5546\u54c1\u660e\u7ec6DTO\uff08goodsId\/name\/pic\/price\/count\/subtotal\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>User.java<\/td>\n<td>\u7528\u6237\u5b9e\u4f53\uff08username, password+salt, money, status\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Admin.java<\/td>\n<td>\u7ba1\u7406\u5458\u5b9e\u4f53\uff08\u540cUser\u7ed3\u6784, status: 0\u6b63\u5e381\u7981\u7528\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Goods.java<\/td>\n<td>\u5546\u54c1\u5b9e\u4f53\uff08price, marketPrice, count, category\u5173\u8054, picList\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>GoodsPic.java<\/td>\n<td>\u5546\u54c1\u56fe\u7247\uff08url, goodsId\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Category.java<\/td>\n<td>\u5206\u7c7b\u5b9e\u4f53\uff08parentId, childlist\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Cart.java<\/td>\n<td>\u8d2d\u7269\u8f66\u5b9e\u4f53\uff08count, goodsId, userId, goods\u5173\u8054\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Addr.java<\/td>\n<td>\u5730\u5740\u5b9e\u4f53\uff08contact, phone, \u7701\u5e02\u533a\u8857\u9053, status\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Collect.java<\/td>\n<td>\u6536\u85cf\u5b9e\u4f53\uff08goodsId, userId, goods\u5173\u8054\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>RespBean.java<\/td>\n<td>\u7edf\u4e00\u54cd\u5e94\u4f53 {code, msg, data}<\/td>\n<\/tr>\n<tr>\n<td><code>bean\/<\/code><\/td>\n<td>Rule.java<\/td>\n<td>\u767d\u540d\u5355\u89c4\u5219 {method, regpath}<\/td>\n<\/tr>\n<tr>\n<td><code>service\/<\/code><\/td>\n<td>OrderService.java<\/td>\n<td>\u8ba2\u5355\u670d\u52a1\u63a5\u53e3\uff08create\/createDirect\/pay\/notifyPay\/queryAndUpdate\/selectByUserId\/search\/selectById\/updateStatus\/delete\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>service\/<\/code><\/td>\n<td>GoodsService.java<\/td>\n<td>\u5546\u54c1\u670d\u52a1\u63a5\u53e3\uff08insert\/delete\/update\/selectById\/selectByCondition\/reduceStock\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>service\/<\/code><\/td>\n<td>UserService.java<\/td>\n<td>\u7528\u6237\u670d\u52a1\u63a5\u53e3\uff08login\/reg\/selectById\/chgInfo\/chgPwd\/delete\/updateStatus\/search\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>service\/<\/code><\/td>\n<td>AdminService.java<\/td>\n<td>\u7ba1\u7406\u5458\u670d\u52a1\u63a5\u53e3\uff08login\/selectById\/update\/chgPwd\/insert\/delete\/search\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>service\/<\/code><\/td>\n<td>CartService.java<\/td>\n<td>\u8d2d\u7269\u8f66\u670d\u52a1\u63a5\u53e3\uff08insert\/delete\/deleteByIds\/update\/search\/selectById\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>service\/<\/code><\/td>\n<td>AddrService.java<\/td>\n<td>\u5730\u5740\u670d\u52a1\u63a5\u53e3\uff08insert\/update\/delete\/setDefault\/selectByUserId\/selectById\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>service\/<\/code><\/td>\n<td>CollectService.java<\/td>\n<td>\u6536\u85cf\u670d\u52a1\u63a5\u53e3\uff08insert\/delete\/selectByGoodsIdAndUserId\/selectByPage\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>utils\/<\/code><\/td>\n<td>JwtUtil.java<\/td>\n<td>JWT\u751f\u6210\/\u89e3\u6790\uff08generateJwt\/parseJwtToMap\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>utils\/<\/code><\/td>\n<td>RedisUtil.java<\/td>\n<td>Redis\u64cd\u4f5c\uff08set\/get\/delete\/hasKey\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>config\/<\/code><\/td>\n<td>JacksonConfig.java<\/td>\n<td>\u6240\u6709Long\u5e8f\u5217\u5316\u4e3aString<\/td>\n<\/tr>\n<tr>\n<td><code>config\/<\/code><\/td>\n<td>RedisConfig.java<\/td>\n<td>RedisTemplate Bean<\/td>\n<\/tr>\n<tr>\n<td><code>config\/<\/code><\/td>\n<td>WhiteListConfig.java<\/td>\n<td>\u767d\u540d\u5355\u914d\u7f6e\u7ed1\u5b9a<\/td>\n<\/tr>\n<tr>\n<td><code>intercepter\/<\/code><\/td>\n<td>JwtInterceptor.java<\/td>\n<td>\u8ba4\u8bc1\u62e6\u622a\u5668\uff08\u9a8c\u7b7e\u540d+\u5237\u65b0token\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>advice\/<\/code><\/td>\n<td>WebExceptionHandler.java<\/td>\n<td>@ExceptionHandler\u5168\u5c40\u5f02\u5e38\u5904\u7406<\/td>\n<\/tr>\n<tr>\n<td><code>exception\/<\/code><\/td>\n<td>StException.java<\/td>\n<td>\u4e1a\u52a1\u5f02\u5e38\uff08\u6784\u9020\u4f20\u5165message\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n<h3 class=\"wp-block-heading\">20.6 \u5de5\u5177\u7c7b\u548c\u914d\u7f6e\u7c7b\u4ee3\u7801<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>StException.java<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>package org.example.mall.common.exception;\npublic class StException extends Exception {\n    public StException(String message) { super(message); }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>WebExceptionHandler.java<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>package org.example.mall.common.advice;\nimport org.example.mall.common.bean.RespBean;\nimport org.example.mall.common.exception.StException;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\n@RestControllerAdvice\npublic class WebExceptionHandler {\n    @ExceptionHandler(StException.class)\n    public RespBean handleSt(StException e) {\n        return RespBean.error(e.getMessage());\n    }\n    @ExceptionHandler(Exception.class)\n    public RespBean handle(Exception e) {\n        return RespBean.error(\"\u672a\u77e5\u9519\u8bef\uff0c\u8bf7\u8054\u7cfb\u7ba1\u7406\u5458\");\n    }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Rule.java<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>package org.example.mall.common.bean;\nimport lombok.Data;\n@Data\npublic class Rule {\n    private String method;   \/\/ GET\/POST\/PUT\/DELETE\n    private String regpath;  \/\/ \u6b63\u5219\u8def\u5f84\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>RedisUtil.java<\/strong>\uff08\u6838\u5fc3\u65b9\u6cd5\uff09\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@Component\npublic class RedisUtil {\n    @Autowired private RedisTemplate&lt;String, Object&gt; redisTemplate;\n    public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); }\n    public Object get(String key) { return redisTemplate.opsForValue().get(key); }\n    public void delete(String key) { redisTemplate.delete(key); }\n    public boolean hasKey(String key) { return redisTemplate.hasKey(key); }\n}<\/code><\/pre>\n\n<hr \/>\n\n<h2 class=\"wp-block-heading\">21. \u5404\u5fae\u670d\u52a1\u5b8c\u6574Config\/Controller\/Mapper\u6e05\u5355<\/h2>\n\n\n<h3 class=\"wp-block-heading\">21.1 goods_service\uff088090\uff09<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>WebConfig<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class WebConfig implements WebMvcConfigurer {\n    @Value(\"${com.picdir}\")\n    private String picdir;\n\n    @Autowired\n    private JwtInterceptor jwtInterceptor;\n\n    @Override\n    public void addResourceHandlers(ResourceHandlerRegistry registry) {\n        \/\/ \u56fe\u7247\u9759\u6001\u8d44\u6e90\u6620\u5c04\uff08\u672c\u5730\u6587\u4ef6\u8def\u5f84 \u2192 URL\u8bbf\u95ee\u8def\u5f84\uff09\n        registry.addResourceHandler(\"\/category\/pic\/**\", \"\/goods\/pic\/**\")\n                .addResourceLocations(\"file:\" + picdir);\n    }\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(jwtInterceptor)\n                .addPathPatterns(\"\/category\/**\", \"\/goods\/**\")\n                .excludePathPatterns(\"\/category\/search\", \"\/category\/allParent\",\n                    \"\/category\/{id}\", \"\/category\/**\/pic\/**\",\n                    \"\/goods\", \"\/goods\/search\", \"\/goods\/{id}\", \"\/goods\/**\/pic\/**\");\n    }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>GoodsController<\/strong> \u5173\u952e\u7aef\u70b9\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@RestController\n@RequestMapping(\"\/goods\")\npublic class GoodsController {\n\n    @Autowired private GoodsService goodsService;\n\n    @GetMapping                      \/\/ selectByPage(condition, pageNum, pageSize)\n    @GetMapping(\"\/search\")           \/\/ selectByPage1(\u542b\u5b50\u5206\u7c7b\u641c\u7d22)\n    @GetMapping(\"\/{id}\")             \/\/ selectById(\u542b\u5173\u8054\u56fe\u7247+\u5206\u7c7b)\n    @PostMapping                     \/\/ insert(goods) + \u56fe\u7247\u5904\u7406\n    @PutMapping                      \/\/ update(goods) + \u56fe\u7247\u66ff\u6362\n    @DeleteMapping(\"\/{id}\")          \/\/ delete(id)\n    @PostMapping(\"\/upload\")          \/\/ \u56fe\u7247\u4e0a\u4f20\n    @GetMapping(\"\/pic\/{filename}\")   \/\/ \u56fe\u7247\u9759\u6001\u6587\u4ef6\uff08\u901a\u8fc7ResourceHandler\u63d0\u4f9b\uff09\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>CategoryController<\/strong> \u5173\u952e\u7aef\u70b9\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@RestController\n@RequestMapping(\"\/category\")\npublic class CategoryController {\n    @GetMapping(\"\/search\")           \/\/ selectByPage(condition, pageNum, pageSize)\n    @GetMapping(\"\/allParent\")        \/\/ \u67e5\u6240\u6709parent_id=0\u7684\u7236\u5206\u7c7b\n    @GetMapping(\"\/{id}\")             \/\/ selectById\n    @PostMapping                     \/\/ insert\n    @PutMapping                      \/\/ update\n    @DeleteMapping(\"\/{id}\")          \/\/ delete\n    @PostMapping(\"\/upload\")          \/\/ \u4e0a\u4f20\u5c01\u9762\u56fe\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapper\u6e05\u5355<\/strong>\uff1a<\/p>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Mapper<\/th>\n<th>XML<\/th>\n<th>\u5173\u952eSQL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>GoodsMapper<\/td>\n<td>GoodsMapper.xml<\/td>\n<td>insert\/delete\/update\/selectByCondition\/selectByid\/selectByCondition1\/selectByCategoryId\/reduceStock<\/td>\n<\/tr>\n<tr>\n<td>GoodsPicMapper<\/td>\n<td>GoodsPicMapper.xml<\/td>\n<td>insert(\u6279\u91cfforeach)\/delete(\u6309goodsId)\/selectByGoodsId<\/td>\n<\/tr>\n<tr>\n<td>CategoryMapper<\/td>\n<td>CategoryMapper.xml<\/td>\n<td>insert\/delete\/update\/selectByCondition\/selectById\/selectAllParent<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n<h3 class=\"wp-block-heading\">21.2 user_service\uff088092\uff09<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>WebConfig<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class WebConfig implements WebMvcConfigurer {\n    @Autowired\n    private JwtInterceptor jwtInterceptor;\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(jwtInterceptor)\n                .addPathPatterns(\"\/user\/**\", \"\/collect\/**\");\n        \/\/ \/addr\/**\u4e0d\u5728\u62e6\u622a\u8303\u56f4\u2014\u2014AddrController\u81ea\u5df1\u624b\u52a8 @RequestHeader token\n    }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>UserController<\/strong> \u5173\u952e\u7aef\u70b9\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@RestController\n@RequestMapping(\"\/user\")\npublic class UserController {\n    @Autowired private RedisUtil redisUtil;\n    @Autowired private UserService userService;\n\n    @GetMapping(\"\/captcha\")               \/\/ \u751f\u6210\u9a8c\u8bc1\u7801\u2192Redis\u5b58\u2192\u8fd4\u56debase64\u56fe\u7247\n    @PostMapping(\"\/login\")                \/\/ \u9a8c\u9a8c\u8bc1\u7801\u2192\u7528\u6237\u540d\u5bc6\u7801\u2192\u8fd4\u56deJWT\n    @PostMapping(\"\/reg\")                  \/\/ \u9a8c\u9a8c\u8bc1\u7801\u2192\u6ce8\u518c\u65b0\u7528\u6237\n    @PutMapping(\"\/chgInfo\")               \/\/ \u4fee\u6539\u4e2a\u4eba\u4fe1\u606f\n    @PutMapping(\"\/chgPwd\")                \/\/ \u4fee\u6539\u5bc6\u7801\n    @GetMapping(\"\/info\")                  \/\/ \u83b7\u53d6\u5f53\u524d\u767b\u5f55\u7528\u6237\u4fe1\u606f\n    @GetMapping(\"\/search\")                \/\/ \u540e\u53f0\u641c\u7d22\u7528\u6237\u5217\u8868\n    @PutMapping(\"\/status\")                \/\/ \u540e\u53f0\u4fee\u6539\u7528\u6237\u72b6\u6001\n    @DeleteMapping(\"\/{id}\")               \/\/ \u540e\u53f0\u5220\u9664\u7528\u6237\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapper\u6e05\u5355<\/strong>\uff1a<\/p>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Mapper<\/th>\n<th>XML<\/th>\n<th>\u5173\u952eSQL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>UserMapper<\/td>\n<td>UserMapper.xml<\/td>\n<td>insert\/selectByUsername\/selectById\/updateById\/delete\/selectByCondition<\/td>\n<\/tr>\n<tr>\n<td>CollectMapper<\/td>\n<td>CollectMapper.xml<\/td>\n<td>insert\/delect\/selectById\/selectByGoodsIdAndUserId\/selectByUserId(\u542bgoods JOIN)<\/td>\n<\/tr>\n<tr>\n<td>AddrMapper<\/td>\n<td>AddrMapper.xml<\/td>\n<td>insert\/update\/delete\/selectById\/selectByUserId\/clearDefault\/setDefault<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n<h3 class=\"wp-block-heading\">21.3 admin_service\uff088091\uff09<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>WebConfig<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class WebConfig implements WebMvcConfigurer {\n    @Autowired\n    private JwtInterceptor jwtInterceptor;\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(jwtInterceptor)\n                .addPathPatterns(\"\/admin\/**\")\n                .excludePathPatterns(\"\/admin\/captcha\", \"\/admin\/login\");\n    }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>AdminController<\/strong> \u5173\u952e\u7aef\u70b9\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@RestController\n@RequestMapping(\"\/admin\")\npublic class AdminController {\n    @GetMapping(\"\/captcha\")           \/\/ \u56fe\u5f62\u9a8c\u8bc1\u7801\n    @PostMapping(\"\/login\")            \/\/ \u767b\u5f55\n    @GetMapping(\"\/info\")              \/\/ \u5f53\u524d\u7ba1\u7406\u5458\u4fe1\u606f\n    @PutMapping(\"\/chgPwd\")            \/\/ \u6539\u5bc6\u7801\n    @PutMapping(\"\/chgInfo\")           \/\/ \u6539\u4fe1\u606f\n    @GetMapping(\"\/search\")            \/\/ \u641c\u7d22\u5217\u8868\n    @PostMapping                      \/\/ \u65b0\u589e\n    @PutMapping                       \/\/ \u4fee\u6539\n    @DeleteMapping(\"\/{id}\")           \/\/ \u5220\u9664\n    @GetMapping(\"\/{id}\")             \/\/ \u67e5\u5355\u6761\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapper\u6e05\u5355<\/strong>\uff1a<\/p>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Mapper<\/th>\n<th>XML<\/th>\n<th>\u5173\u952eSQL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>AdminMapper<\/td>\n<td>AdminMapper.xml<\/td>\n<td>insert\/delete\/update\/selectByCondition\/selectById\/selectByUsername<\/td>\n<\/tr>\n<tr>\n<td>DashboardMapper<\/td>\n<td>DashboardMapper.xml<\/td>\n<td>countOrders\/countUsers\/countGoods\/countTodayOrders\/selectTodayOrderItems\/selectRecentOrders\/selectRecentUsers\/countOrdersByStatus<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n<h3 class=\"wp-block-heading\">21.4 order_service\uff088093\uff09<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><strong>WebConfig<\/strong>\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class WebConfig implements WebMvcConfigurer {\n    @Autowired\n    private JwtInterceptor jwtInterceptor;\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(jwtInterceptor)\n                .addPathPatterns(\"\/cart\/**\");\n        \/\/ \/order\/**\u4e0d\u62e6\u622a\u2014\u2014OrderController\u6309\u7aef\u70b9\u7c7b\u578b\u533a\u5206\u6821\u9a8c\n    }\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>CartController<\/strong> \u5173\u952e\u7aef\u70b9\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>@RestController\n@RequestMapping(\"\/cart\")\npublic class CartController {\n    @PostMapping(\"\/{goodsId}\")             \/\/ \u52a0\u5165\u8d2d\u7269\u8f66\n    @GetMapping                            \/\/ \u67e5\u5f53\u524d\u7528\u6237\u8d2d\u7269\u8f66\u5217\u8868\n    @PutMapping                            \/\/ \u4fee\u6539\u6570\u91cf\n    @DeleteMapping(\"\/{id}\")                \/\/ \u5220\u5355\u6761\n    @DeleteMapping                          \/\/ \u6279\u91cf\u5220\u9664(body\u4f20ids)\n    @GetMapping(\"\/{id}\")                   \/\/ \u67e5\u5355\u6761\n}<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Mapper\u6e05\u5355<\/strong>\uff1a<\/p>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Mapper<\/th>\n<th>XML<\/th>\n<th>\u5173\u952eSQL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>CartMapper<\/td>\n<td>CartMapper.xml<\/td>\n<td>insert\/update\/delete\/deleteByIds(foreach)\/selectByGoodsIdAndUserId\/selectById\/selectByCondition<\/td>\n<\/tr>\n<tr>\n<td>OrderMapper<\/td>\n<td>OrderMapper.xml<\/td>\n<td>insert\/selectByCondition(JOIN user)\/selectById\/selectByUserId\/selectAddrById\/updateById(\u52a8\u6001SET)\/delete\/cancelExpiredOrders<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n<hr \/>\n\n<h2 class=\"wp-block-heading\">22. \u524d\u7aef\u9879\u76ee\u5b8c\u6574\u811a\u624b\u67b6<\/h2>\n\n\n<h3 class=\"wp-block-heading\">22.1 \u521b\u5efa\u6b65\u9aa4<\/h3>\n\n\n<pre class=\"wp-block-code\"><code>npm create vite@latest front -- --template vue\ncd front\nnpm install\nnpm install element-plus @element-plus\/icons-vue axios vue-router@4 pinia@3 pinia-plugin-persistedstate qs\nnpm install @wangeditor\/editor @wangeditor\/editor-for-vue<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">22.2 .env<\/h3>\n\n\n<pre class=\"wp-block-code\"><code>VITE_SERVER_ADDR=http:\/\/www.dxkua.cn\n# \u672c\u5730\u5f00\u53d1: http:\/\/localhost<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">22.3 vite.config.js<\/h3>\n\n\n<pre class=\"wp-block-code\"><code>import { fileURLToPath, URL } from 'node:url'\nimport { defineConfig } from 'vite'\nimport vue from '@vitejs\/plugin-vue'\n\nexport default defineConfig({\n  plugins: [vue()],\n  resolve: {\n    alias: { '@': fileURLToPath(new URL('.\/src', import.meta.url)) }\n  }\n})<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">22.4 index.html<\/h3>\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"zh-CN\"&gt;\n&lt;head&gt;\n  &lt;meta charset=\"UTF-8\" \/&gt;\n  &lt;link rel=\"icon\" href=\"\/favicon.ico\" \/&gt;\n  &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/&gt;\n  &lt;title&gt;\u5728\u7ebf\u5546\u57ce&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n  &lt;div id=\"app\"&gt;&lt;\/div&gt;\n  &lt;script type=\"module\" src=\"\/src\/main.js\"&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">22.5 \u524d\u7aef\u6e90\u6587\u4ef6\u5b8c\u6574\u6e05\u5355<\/h3>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>\u76ee\u5f55<\/th>\n<th>\u6587\u4ef6<\/th>\n<th>\u4f5c\u7528<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>src\/main.js<\/code><\/td>\n<td>&#8211;<\/td>\n<td>\u5165\u53e3\uff1a\u521b\u5efaApp\u2192\u5168\u5c40\u6ce8\u518c\u6240\u6709ElementPlus\u56fe\u6807\u2192\u6ce8\u518cPinia+\u6301\u4e45\u5316\u63d2\u4ef6\u2192\u6ce8\u518cRouter\u2192\u6ce8\u518cElementPlus\u2192\u6302\u8f7d<\/td>\n<\/tr>\n<tr>\n<td><code>src\/App.vue<\/code><\/td>\n<td>&#8211;<\/td>\n<td>\u6839\u7ec4\u4ef6\uff1a<code>&lt;transition name=\"fade\"&gt;&lt;router-view\/&gt;&lt;\/transition&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>src\/assets\/base.css<\/code><\/td>\n<td>&#8211;<\/td>\n<td>CSS\u53d8\u91cf <code>--theme-color: #FF6800; --theme-bg-color: #303133<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>src\/assets\/main.css<\/code><\/td>\n<td>&#8211;<\/td>\n<td>\u5168\u5c40\u6837\u5f0f <code>.center{width:1200px;margin:auto}<\/code> + a\u53bb\u4e0b\u5212\u7ebf+ul\u53bb\u70b9<\/td>\n<\/tr>\n<tr>\n<td><code>src\/stores\/token.js<\/code><\/td>\n<td>Pinia<\/td>\n<td>token\u72b6\u6001\u7ba1\u7406(sessionStorage\u6301\u4e45\u5316)\uff0c\u542btoken\/updateToken\/$reset<\/td>\n<\/tr>\n<tr>\n<td><code>src\/stores\/user.js<\/code><\/td>\n<td>Pinia<\/td>\n<td>\u7528\u6237\u4fe1\u606f\u72b6\u6001\u7ba1\u7406(sessionStorage\u6301\u4e45\u5316)\uff0c\u542buser\/updateUser\/$reset<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/index.js<\/code><\/td>\n<td>Axios\u5b9e\u4f8b<\/td>\n<td>baseURL+\u8bf7\u6c42\u62e6\u622a\u5668(\u52a0token)+\u54cd\u5e94\u62e6\u622a\u5668(\u5237\u65b0token, 403\u5904\u7406)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/userApi.js<\/code><\/td>\n<td>API<\/td>\n<td>captcha\/login\/reg\/getInfo\/chgPwd\/chgInfo\/search\/updateStatus\/delete<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/AdminApi.js<\/code><\/td>\n<td>API<\/td>\n<td>captcha\/login\/getInfo\/chgPwd\/chgInfo\/search\/insert\/update\/delete\/selectById<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/GoodsApi.js<\/code><\/td>\n<td>API<\/td>\n<td>insert\/delete\/update\/selectById\/selectByPage\/selectByPage1<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/CategoryApi.js<\/code><\/td>\n<td>API<\/td>\n<td>insert\/delete\/update\/selectById\/selectByPage\/selectAllParent<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/cartApi.js<\/code><\/td>\n<td>API<\/td>\n<td>insert\/delete\/deleteByIds\/update\/selectBycodition\/selectById<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/orderApi.js<\/code><\/td>\n<td>API<\/td>\n<td>search\/selectById\/updateStatus\/delete\/create\/createDirect\/pay\/cancel\/myOrders\/queryStatus<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/collectApi.js<\/code><\/td>\n<td>API<\/td>\n<td>insert\/delect\/selectByGoodsIdAndUserId\/selectByPage<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/addrApi.js<\/code><\/td>\n<td>API<\/td>\n<td>insert\/update\/delete\/setDefault\/selectByUserId\/selectById<\/td>\n<\/tr>\n<tr>\n<td><code>src\/api\/chatApi.js<\/code><\/td>\n<td>API<\/td>\n<td>sendMessage(sessionId, message)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/router\/index.js<\/code><\/td>\n<td>Router<\/td>\n<td>\u6240\u6709\u8def\u7531+\u5bfc\u822a\u5b88\u536b(\u516c\u5f00\u9875\u9762\u653e\u884c, \u5176\u4f59\u9700token, \u7ba1\u7406\u5458\u8df3\/admin\/login)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/components\/user\/home\/UserHeader.vue<\/code><\/td>\n<td>\u7ec4\u4ef6<\/td>\n<td>\u9876\u90e8\u5bfc\u822a(\u9996\u9875\/\u5168\u90e8\u5546\u54c1\/\u65b0\u54c1\u4e0a\u5e02\/\u9650\u65f6\u7279\u60e0\/\u54c1\u724c\u4e13\u533a\/\u5173\u4e8e\u6211\u4eec)+\u641c\u7d22\u6846+\u767b\u5f55\u72b6\u6001+\u5206\u7c7b\u83dc\u5355<\/td>\n<\/tr>\n<tr>\n<td><code>src\/components\/user\/home\/UserFooter.vue<\/code><\/td>\n<td>\u7ec4\u4ef6<\/td>\n<td>\u5e95\u90e8(\u94fe\u63a5+\u7248\u6743)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/LoginView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u767b\u5f55(\u7528\u6237\u540d+\u5bc6\u7801+\u9a8c\u8bc1\u7801), \u5361\u7247\u5f0f\u8868\u5355<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/RegView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u6ce8\u518c<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/IndexView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u9996\u9875(\u8f6e\u64ad\u56fe+\u5e7f\u544a\u4f4d+\u6309\u7236\u5206\u7c7b\u5206\u7ec4\u63a8\u8350\u5546\u54c1)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/SearchView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u5546\u54c1\u641c\u7d22\/\u5206\u7c7b\u6d4f\u89c8(\u5206\u7c7b\u6807\u7b7e+5\u5217\u7f51\u683c+\u5206\u9875)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/GoodsView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u5546\u54c1\u8be6\u60c5(\u8f6e\u64ad\u56fe+\u52a0\u5165\u8d2d\u7269\u8f66+\u76f4\u63a5\u8d2d\u4e70+\u6536\u85cf+\u5bcc\u6587\u672c\u8be6\u60c5)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/CartView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u8d2d\u7269\u8f66(\u8868\u683c+\u5168\u9009+\u6570\u91cf+\u5220\u9664+\u5168\u5220+\u7ed3\u7b97)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/CreateOrderView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u7ed3\u7b97\u9875(\u53cc\u6a21\u5f0f+\u5730\u5740+\u652f\u4ed8+\u5546\u54c1\u6e05\u5355+\u63d0\u4ea4\u2192\u652f\u4ed8)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/PayResultView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u652f\u4ed8\u7ed3\u679c(\u67e5\u72b6\u6001+\u663e\u793a\u7ed3\u679c)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/UserCenterView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u4e2a\u4eba\u4e2d\u5fc3(5\u4e2aTab\u9762\u677f\uff1a\u4fe1\u606f\/\u5bc6\u7801\/\u6536\u85cf\/\u5730\u5740\/\u8ba2\u5355)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/user\/HomeView.vue<\/code><\/td>\n<td>\u5e03\u5c40<\/td>\n<td>\u7528\u6237\u7aef\u7236\u5e03\u5c40(Header+RouterView+Footer+ChatWidget)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/LoginView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u7ba1\u7406\u5458\u767b\u5f55<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/HomeView.vue<\/code><\/td>\n<td>\u5e03\u5c40<\/td>\n<td>\u7ba1\u7406\u7aef\u7236\u5e03\u5c40(\u9876\u680f+\u4fa7\u8fb9\u680f+RouterView)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/IndexView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u4eea\u8868\u76d8(\u7edf\u8ba1\u5361\u7247+\u4eca\u65e5\u6982\u89c8+\u72b6\u6001\u5206\u5e03+\u6700\u8fd1\u8ba2\u5355+\u6700\u8fd1\u7528\u6237)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/UserView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u7528\u6237\u7ba1\u7406(\u641c\u7d22+\u8868\u683c+\u72b6\u6001\u4fee\u6539+\u5220\u9664)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/OrderView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u8ba2\u5355\u7ba1\u7406(\u641c\u7d22+\u8868\u683c+\u72b6\u6001\u4fee\u6539+\u5220\u9664)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/GoodsView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u5546\u54c1\u7ba1\u7406(\u641c\u7d22+\u8868\u683c+\u7ea7\u8054\u5206\u7c7b+\u56fe\u7247+\u5bcc\u6587\u672c+\u589e\u5220\u6539)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/CategoryView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u5206\u7c7b\u7ba1\u7406(\u641c\u7d22+\u8868\u683c+\u56fe\u7247+\u589e\u5220\u6539)<\/td>\n<\/tr>\n<tr>\n<td><code>src\/views\/admin\/AdminView.vue<\/code><\/td>\n<td>\u9875\u9762<\/td>\n<td>\u7ba1\u7406\u5458\u7ba1\u7406(\u641c\u7d22+\u8868\u683c+\u589e\u5220\u6539)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n<hr \/>\n\n<h2 class=\"wp-block-heading\">23. \u90e8\u7f72\u6b65\u9aa4<\/h2>\n\n\n<h3 class=\"wp-block-heading\">23.1 \u6253\u5305<\/h3>\n\n\n<pre class=\"wp-block-code\"><code># \u540e\u7aef\uff08\u9879\u76ee\u6839\u76ee\u5f55\uff09\nmvn clean package -DskipTests -q\n\n# \u524d\u7aef\ncd front &amp;&amp; npm run build<\/code><\/pre>\n\n\n<p class=\"wp-block-paragraph\">\u4ea7\u7269\uff1a<\/p>\n\n\n<pre class=\"wp-block-code\"><code>admin_service\/target\/admin_service-0.0.1-SNAPSHOT.jar  (~38MB)\nuser_service\/target\/user_service-0.0.1-SNAPSHOT.jar    (~42MB)\ngoods_service\/target\/goods_service-0.0.1-SNAPSHOT.jar  (~55MB)\norder_service\/target\/order_service-0.0.1-SNAPSHOT.jar  (~83MB)\nfront\/dist\/  (index.html + assets\/*.js + assets\/*.css)<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">23.2 \u90e8\u7f72\u5230\u670d\u52a1\u5668<\/h3>\n\n\n<pre class=\"wp-block-code\"><code># 1. \u90e8\u7f72\u524d\u7aef \u2192 nginx\u9759\u6001\u76ee\u5f55\ncp -r front\/dist\/* \/usr\/share\/nginx\/html\/\n\n# 2. \u90e8\u7f72nginx\u914d\u7f6e\ncp nginx\/conf\/nginx.conf \/etc\/nginx\/nginx.conf\nnginx -t &amp;&amp; nginx -s reload\n\n# 3. \u8bbe\u7f6e\u652f\u4ed8\u5b9d\u51ed\u8bc1\u73af\u5883\u53d8\u91cf\nexport ALIPAY_APP_ID=\u4f60\u7684\u6c99\u7bb1APPID\nexport ALIPAY_PRIVATE_KEY=\"\u4f60\u7684\u5e94\u7528\u79c1\u94a5\"\nexport ALIPAY_PUBLIC_KEY=\"\u652f\u4ed8\u5b9d\u516c\u94a5\"\nexport ALIPAY_RETURN_URL=http:\/\/\u4f60\u7684\u57df\u540d\/#\/user\/payResult\nexport ALIPAY_NOTIFY_URL=http:\/\/\u4f60\u7684\u57df\u540d\/order\/notify\n\n# 4. \u542f\u52a8\u56db\u4e2a\u5fae\u670d\u52a1\njava -jar admin_service\/target\/admin_service-0.0.1-SNAPSHOT.jar &amp;\njava -jar user_service\/target\/user_service-0.0.1-SNAPSHOT.jar &amp;\njava -jar goods_service\/target\/goods_service-0.0.1-SNAPSHOT.jar &amp;\njava -jar order_service\/target\/order_service-0.0.1-SNAPSHOT.jar &amp;<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\">23.3 \u9a8c\u8bc1\u6e05\u5355<\/h3>\n\n\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>\u6b65\u9aa4<\/th>\n<th>\u5730\u5740<\/th>\n<th>\u9884\u671f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u7528\u6237\u7aef\u9996\u9875<\/td>\n<td><code>http:\/\/\u4f60\u7684IP\/<\/code><\/td>\n<td>\u8f6e\u64ad\u56fe+\u63a8\u8350\u5546\u54c1<\/td>\n<\/tr>\n<tr>\n<td>\u7ba1\u7406\u7aef\u767b\u5f55<\/td>\n<td><code>http:\/\/\u4f60\u7684IP\/#\/admin\/login<\/code><\/td>\n<td>\u767b\u5f55\u8868\u5355<\/td>\n<\/tr>\n<tr>\n<td>\u7ba1\u7406\u5458\u767b\u5f55<\/td>\n<td>admin \/ \u5bc6\u7801\u540csalt\u52a0\u5bc6\u540e<\/td>\n<td>\u8fdb\u5165\u4eea\u8868\u76d8<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237\u767b\u5f55<\/td>\n<td>tom \/ \u5bc6\u7801\u540csalt\u52a0\u5bc6\u540e<\/td>\n<td>\u9996\u9875\u663e\u793a\u7528\u6237\u540d<\/td>\n<\/tr>\n<tr>\n<td>\u5730\u5740\u7ba1\u7406<\/td>\n<td>\u4e2a\u4eba\u4e2d\u5fc3\u2192\u5730\u5740\u7ba1\u7406<\/td>\n<td>6\u6761\u6d4b\u8bd5\u6570\u636e\u663e\u793a<\/td>\n<\/tr>\n<tr>\n<td>\u4e0b\u5355\u2192\u652f\u4ed8<\/td>\n<td>\u8d2d\u7269\u8f66\u2192\u7ed3\u7b97\u2192\u63d0\u4ea4\u2192\u8df3\u652f\u4ed8\u5b9d<\/td>\n<td>\u6c99\u7bb1\u4ed8\u6b3e\u9875\u9762<\/td>\n<\/tr>\n<tr>\n<td>\u652f\u4ed8\u7ed3\u679c<\/td>\n<td>\u652f\u4ed8\u5b9d\u4ed8\u6b3e\u540e\u8df3\u56de<\/td>\n<td>&#8220;\u652f\u4ed8\u6210\u529f&#8221;<\/td>\n<\/tr>\n<tr>\n<td>\u6211\u7684\u8ba2\u5355<\/td>\n<td>\u4e2a\u4eba\u4e2d\u5fc3\u2192\u6211\u7684\u8ba2\u5355<\/td>\n<td>\u8ba2\u5355\u5361\u7247<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n<hr \/>\n\n<h2 class=\"wp-block-heading\">24. \u652f\u4ed8\u5b9d\u6c99\u7bb1\u914d\u7f6e\u6b65\u9aa4<\/h2>\n\n\n<ol class=\"wp-block-list\">\n\n<li>\u8bbf\u95ee <a href=\"https:\/\/open.alipay.com\/\">open.alipay.com<\/a> \u2192 \u767b\u5f55 \u2192\u300c\u63a7\u5236\u53f0\u300d\u2192\u300c\u6c99\u7bb1\u73af\u5883\u300d<\/li>\n<li>\u83b7\u53d6 APPID\u3001\u4e0b\u8f7d\u5bc6\u94a5\u751f\u6210\u5de5\u5177\u751f\u6210 RSA2 \u5bc6\u94a5\u5bf9<\/li>\n<li>\u79c1\u94a5\u81ea\u5df1\u4fdd\u5b58 \u2192 \u516c\u94a5\u4e0a\u4f20\u5230\u6c99\u7bb1 \u2192 \u652f\u4ed8\u5b9d\u8fd4\u56de\u652f\u4ed8\u5b9d\u516c\u94a5<\/li>\n<li>\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff1a\n<pre class=\"wp-block-code\"><code>export ALIPAY_APP_ID=\u83b7\u53d6\u7684\u6c99\u7bb1APPID\nexport ALIPAY_PRIVATE_KEY=\"\u751f\u6210\u7684\u79c1\u94a5\uff08\u5b8c\u6574Base64\uff09\"\nexport ALIPAY_PUBLIC_KEY=\"\u652f\u4ed8\u5b9d\u8fd4\u56de\u7684\u516c\u94a5\"<\/code><\/pre>\n\n<\/li>\n<li>\u6c99\u7bb1\u4e70\u5bb6\u8d26\u53f7\u5728\u6c99\u7bb1\u63a7\u5236\u53f0\u2192\u300c\u6c99\u7bb1\u8d26\u53f7\u300d\u83b7\u53d6\uff0c\u4ed8\u6b3e\u65f6\u7528\u8fd9\u4e2a\u8d26\u53f7\u767b\u5f55<\/li>\n<li><strong>\u6c99\u7bb1\u7f51\u5173<\/strong>\uff1a<code>https:\/\/openapi-sandbox.dl.alipaydev.com\/gateway.do<\/code><\/li>\n<li><strong>\u6b63\u5f0f\u7f51\u5173<\/strong>\uff1a<code>https:\/\/openapi.alipay.com\/gateway.do<\/code>\uff08\u9700\u7b7e\u7ea6\u4ea7\u54c1+\u5907\u6848\u57df\u540d\uff09<\/li>\n\n<\/ol>\n\n<hr \/>\n\n<h2 class=\"wp-block-heading\">25. \u4ece\u96f6\u5230\u8fd0\u884c\u7684\u5b8c\u6574checklist<\/h2>\n\n\n<pre class=\"wp-block-code\"><code>\u25a1 \u5b89\u88c5 JDK17 + Maven3.8+ + Node.js20+\n\u25a1 \u542f\u52a8 MySQL \u2192 \u521b\u5efa mall \u5e93 \u2192 \u6267\u884c mall.sql \u2192 ALTER order \u52a0 items \u5217\n\u25a1 \u542f\u52a8 ZooKeeper (2181)\n\u25a1 \u542f\u52a8 Redis (6379, \u5bc6\u7801123456)\n\u25a1 \u521b\u5efa Maven \u591a\u6a21\u5757\u9879\u76ee (\u7236POM+5\u4e2a\u5b50\u6a21\u5757)\n\u25a1 \u521b\u5efa\u6240\u6709 common Bean\/Service\/Utils\/Config\/Interceptor\/Exception\n\u25a1 \u521b\u5efa admin_service \u5b8c\u6574\u7ed3\u6784 (Application\/Controller\/Service\/Mapper\/Config\/yml)\n\u25a1 \u521b\u5efa user_service \u5b8c\u6574\u7ed3\u6784\n\u25a1 \u521b\u5efa goods_service \u5b8c\u6574\u7ed3\u6784 (\u542b @EnableDubbo Dubbo\u670d\u52a1\u66b4\u9732)\n\u25a1 \u521b\u5efa order_service \u5b8c\u6574\u7ed3\u6784 (\u542b\u652f\u4ed8\u5b9dConfig+\u5b9a\u65f6\u4efb\u52a1+@EnableScheduling)\n\u25a1 \u542f\u52a8 goods_service \u2192 get http:\/\/localhost:8090\/goods \u2192 \u786e\u8ba4\u6709\u6570\u636e\u8fd4\u56de\n\u25a1 \u542f\u52a8 user_service \u2192 get http:\/\/localhost:8092\/user\/captcha \u2192 \u786e\u8ba4\u8fd4\u56de\u9a8c\u8bc1\u7801\n\u25a1 \u542f\u52a8 admin_service \u2192 get http:\/\/localhost:8091\/admin\/captcha \u2192 \u786e\u8ba4\u8fd4\u56de\u9a8c\u8bc1\u7801\n\u25a1 \u542f\u52a8 order_service \u2192 (\u5148\u4e0d\u914d\u652f\u4ed8\u5b9d\u51ed\u8bc1)\u2192 \u8d2d\u7269\u8f66\/\u4e0b\u5355\u529f\u80fd\u6b63\u5e38 \u2192 \u652f\u4ed8\u62a5\u9519\u6b63\u5e38\n\u25a1 \u521b\u5efa\u524d\u7aef\u9879\u76ee \u2192 npm install \u2192 npm run dev \u2192 http:\/\/localhost:5173\n\u25a1 \u521b\u5efa\u6240\u6709\u524d\u7aef\u9875\u9762\/API\/Store \u2192 \u9010\u9875\u9762\u9a8c\u8bc1\n\u25a1 \u914d\u7f6e\u652f\u4ed8\u5b9d\u6c99\u7bb1\u51ed\u8bc1 \u2192 \u91cd\u542f order_service \u2192 \u5b8c\u6574\u652f\u4ed8\u6d41\u7a0b\u9a8c\u8bc1\n\u25a1 npm run build \u2192 \u90e8\u7f72 dist\/ \u2192 \u914d\u7f6e nginx \u2192 nginx -s reload\n\u25a1 \u516c\u7f51\u9a8c\u8bc1\uff1a\u9996\u9875\/\u767b\u5f55\/\u8d2d\u7269\/\u4e0b\u5355\/\u652f\u4ed8\/\u4e2a\u4eba\u4e2d\u5fc3\/\u540e\u53f0\u7ba1\u7406 \u9010\u9879\u901a\u8fc7<\/code><\/pre>\n\n<hr \/>\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6587\u6863\u7248\u672c<\/strong>\uff1a2026-07-28<br \/>\n<strong>\u9002\u7528\u65b9\u5f0f<\/strong>\uff1a\u7b2c\u4e00\u90e8\u5206(1-18\u7ae0)\u7528\u4e8e\u5b66\u4e60\u7406\u89e3\uff0c\u7b2c\u4e8c\u90e8\u5206(19-25\u7ae0)\u7528\u4e8e\u4ece\u96f6\u590d\u73b0<\/p>\n\n\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\u8865\u5168\u4e86\u6240\u6709\u7f3a\u5931\u7684\u914d\u7f6e\u3001\u811a\u624b\u67b6\u3001\u975e\u6838\u5fc3\u4ee3\u7801\u548c\u90e8\u7f72\u6b65\u9aa4\u3002\u8bfb\u5b8c\u524d\u976218\u7ae0+\u8fd9\u4e00\u90e8\u5206\uff0c\u53ef\u4ee5\u4ece\u96f6\u642d\u5efa\u4e00\u4e2a\u5b8c\u5168\u4e00\u6837\u7684\u5546\u57ce\u9879 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-26","post","type-post","status-publish","format-standard","hentry","category-mall"],"_links":{"self":[{"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/posts\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":1,"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/posts\/26\/revisions"}],"predecessor-version":[{"id":29,"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/posts\/26\/revisions\/29"}],"wp:attachment":[{"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/media?parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/categories?post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dxkua.cn\/index.php\/wp-json\/wp\/v2\/tags?post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}