{"id":974,"date":"2023-05-28T02:28:44","date_gmt":"2023-05-27T18:28:44","guid":{"rendered":"https:\/\/xinchewhd.com.cn\/?p=974"},"modified":"2023-05-28T03:00:14","modified_gmt":"2023-05-27T19:00:14","slug":"hutool%e5%b7%a5%e5%85%b7-%e9%82%ae%e4%bb%b6%e9%aa%8c%e8%af%81%e7%a0%81%e4%b9%8bredis%e7%bc%93%e5%ad%98","status":"publish","type":"post","link":"https:\/\/xinchewhd.com.cn\/index.php\/uncategorized\/hutool%e5%b7%a5%e5%85%b7-%e9%82%ae%e4%bb%b6%e9%aa%8c%e8%af%81%e7%a0%81%e4%b9%8bredis%e7%bc%93%e5%ad%98\/","title":{"rendered":"hutool\u5de5\u5177-\u90ae\u4ef6\u9a8c\u8bc1\u7801\u4e4bRedis\u7f13\u5b58"},"content":{"rendered":"<div class=\"wxsyncmain\">\n<p>\u4e4b\u524d\u4e5f\u5199\u8fc7\u4e00\u7bc7java\u57fa\u7840\u7248\u7684\u90ae\u4ef6\u9a8c\u8bc1\u7801\uff0c\u8fd9\u7bc7\u662f\u91c7\u7528hutool\uff0cftl\u6a21\u677f\uff0c\u7ed3\u5408redis\u505a\u7684\u4e00\u7bc7\u5e26\u6709\u6709\u6548\u671f\u7684\u9a8c\u8bc1\u7801\u7684\u5b9e\u73b0\u65b9\u6848\u3002<\/p>\n<p>\u9996\u5148\u662fpom\u4f9d\u8d56\uff1a<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"xml\"><code><span class=\"code-snippet_outer\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span>org.springframework.boot<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span>spring-boot-starter-data-redis<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">version<\/span>&gt;<\/span>2.6.1<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">version<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span>org.apache.velocity<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span>velocity-engine-core<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">version<\/span>&gt;<\/span>2.2<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">version<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span>com.sun.mail<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span>javax.mail<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">version<\/span>&gt;<\/span>1.6.2<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">version<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n          <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n                <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span>org.springframework.boot<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">groupId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n                <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span>spring-boot-starter-freemarker<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">artifactId<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">                <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">version<\/span>&gt;<\/span>2.3.12.RELEASE<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">version<\/span>&gt;<\/span><\/span><\/code><code><\/code><\/pre>\n<pre class=\"code-snippet__js\" data-lang=\"xml\"><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">dependency<\/span>&gt;<\/span><\/span><\/code>\n\u518d\u5c31\u662fhutool\u00a0all\u00a05.8\u7248\u672c\u4f9d\u8d56\uff0c<code><span class=\"code-snippet_outer\">\n<\/span><\/code><\/pre>\n<\/section>\n<p>\u7136\u540e\u5c31\u662f\u914d\u7f6e\u6587\u4ef6\uff0c\u4e3b\u8981\u662f\u90ae\u7bb1\u914d\u7f6e\u4ee5\u53ca\u6a21\u677f\u914d\u7f6e\uff1a<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"properties\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__attr\">spring<\/span>:<span class=\"code-snippet__string\">\u00a0<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n  <span class=\"code-snippet__attr\">freemarker<\/span>:<\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">check-template-location<\/span>: <span class=\"code-snippet__string\">true<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">template-loader-path<\/span>: <span class=\"code-snippet__string\">classpath:\/templates<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n  <span class=\"code-snippet__attr\">profiles<\/span>:<\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__attr\">active<\/span>: <span class=\"code-snippet__string\">dev<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n  <span class=\"code-snippet__attr\">mail<\/span>:<\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__attr\">email<\/span>: <span class=\"code-snippet__string\">xxxx@163.com<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__attr\">host<\/span>: <span class=\"code-snippet__string\">smtp.163.com<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__attr\">port<\/span>: <span class=\"code-snippet__string\">465<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n\u00a0\u00a0\u00a0\u00a0username<\/span>:<span class=\"code-snippet__string\">\u00a0xxxxx\u00a0\u00a0#\u90ae\u7bb1@\u524d\u7f00\u90e8\u5206,\u6bd4\u5982\u624b\u673a\u53f7\u5565\u7684<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n    # \u6388\u6743\u5bc6\u7801\uff0c \u975e\u90ae\u7bb1\u5bc6\u7801\uff0c\u6388\u6743\u7801\u662f\u7528\u4e8e\u767b\u5f55\u7b2c\u4e09\u65b9\u90ae\u4ef6\u5ba2\u6237\u7aef\u7684\u4e13\u7528\u5bc6\u7801\u3002<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__attr\">password<\/span>: <span class=\"code-snippet__string\">xxxxxxx<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">#\u90ae\u7bb1\u9a8c\u8bc1\u7801\u6709\u6548\u65f6\u95f4\/\u79d2<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__attr\">\ncode<\/span>:<\/span><\/code><code><span class=\"code-snippet_outer\">  <span class=\"code-snippet__attr\">expiration<\/span>: <span class=\"code-snippet__string\">300<\/span><\/span><\/code><\/pre>\n<\/section>\n<p>\u56e0\u4e3a\u7528\u5230\u4e86redis\uff0c\u6240\u4ee5\u4e0a\u9762\u914d\u7f6e\u4e5f\u662f\u9700\u8981\u914d\u7f6eredis\u914d\u7f6e\uff0c\u6211\u662f\u7528\u7684\u672c\u5730\uff0credis\u914d\u7f6e\u7c7bRedisConfig:<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"typescript\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> com.alibaba.fastjson.JSON;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> com.alibaba.fastjson.parser.ParserConfig;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.apache.commons.codec.digest.DigestUtils;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.boot.autoconfigure.condition.ConditionalOnClass;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.boot.autoconfigure.data.redis.RedisProperties;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.boot.context.properties.EnableConfigurationProperties;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.cache.annotation.CachingConfigurerSupport;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.cache.annotation.EnableCaching;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.cache.interceptor.KeyGenerator;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.context.annotation.Bean;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.context.annotation.Configuration;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.data.redis.cache.RedisCacheConfiguration;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.data.redis.connection.RedisConnectionFactory;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.data.redis.core.RedisOperations;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.data.redis.core.RedisTemplate;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.data.redis.serializer.RedisSerializationContext;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span>\u00a0org.springframework.data.redis.serializer.StringRedisSerializer;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> java.time.Duration;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> java.util.HashMap;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span>\u00a0java.util.Map;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n\u00a0*\u00a0Redis\u914d\u7f6e\u7c7b<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n * @author ly<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n\u00a0*\u00a0@date\u00a02023-02-21<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@Configuration<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@EnableCaching<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@ConditionalOnClass<\/span>(RedisOperations.class)<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@EnableConfigurationProperties<\/span>(RedisProperties.class)<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\npublic<\/span> <span class=\"code-snippet__keyword\">class<\/span> RedisConfig <span class=\"code-snippet__keyword\">extends<\/span> CachingConfigurerSupport {<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\u8bbe\u7f6e redis \u6570\u636e\u9ed8\u8ba4\u8fc7\u671f\u65f6\u95f4<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@Bean<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> RedisCacheConfiguration redisCacheConfiguration(){<\/span><\/code><code><span class=\"code-snippet_outer\">\n        FastJsonRedisSerializer&lt;<span class=\"code-snippet__built_in\">Object<\/span>&gt; fastJsonRedisSerializer = <span class=\"code-snippet__keyword\">new<\/span> FastJsonRedisSerializer&lt;&gt;(<span class=\"code-snippet__built_in\">Object<\/span>.class);<\/span><\/code><code><span class=\"code-snippet_outer\">\n        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();<\/span><\/code><code><span class=\"code-snippet_outer\">\n        configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofHours(Constant.CACHE_TIMEOUT_HOUR));<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">return<\/span> configuration;<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@Bean<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> RedisTemplate&lt;<span class=\"code-snippet__built_in\">Object<\/span>, <span class=\"code-snippet__built_in\">Object<\/span>&gt; redisTemplate(RedisConnectionFactory redisConnectionFactory) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n        RedisTemplate&lt;<span class=\"code-snippet__built_in\">Object<\/span>, <span class=\"code-snippet__built_in\">Object<\/span>&gt; template = <span class=\"code-snippet__keyword\">new<\/span> RedisTemplate&lt;&gt;();<\/span><\/code><code><span class=\"code-snippet_outer\">\n        template.setConnectionFactory(redisConnectionFactory);<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        FastJsonRedisSerializer fastJsonRedisSerializer = <span class=\"code-snippet__keyword\">new<\/span> FastJsonRedisSerializer(<span class=\"code-snippet__built_in\">Object<\/span>.class);<\/span><\/code><code><span class=\"code-snippet_outer\">\n        template.setValueSerializer(fastJsonRedisSerializer);<\/span><\/code><code><span class=\"code-snippet_outer\">\n        template.setHashValueSerializer(fastJsonRedisSerializer);<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        ParserConfig.getGlobalInstance().setAutoTypeSupport(<span class=\"code-snippet__literal\">true<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        template.setKeySerializer(<span class=\"code-snippet__keyword\">new<\/span> StringRedisSerializer());<\/span><\/code><code><span class=\"code-snippet_outer\">\n        template.setHashKeySerializer(<span class=\"code-snippet__keyword\">new<\/span> StringRedisSerializer());<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        template.afterPropertiesSet();<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">return<\/span> template;<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u53c2\u8003:https:\/\/blog.csdn.net\/qq_15071263\/article\/details\/84335632<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u81ea\u5b9a\u4e49\u7f13\u5b58key\u751f\u6210\u7b56\u7565\uff0c\u9ed8\u8ba4\u5c06\u4f7f\u7528\u8be5\u7b56\u7565<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@Bean<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@Override<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> KeyGenerator keyGenerator() {<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">return<\/span> (target, method, params) -&gt; {<\/span><\/code><code><span class=\"code-snippet_outer\">\n            Map&lt;<span class=\"code-snippet__built_in\">String<\/span>,<span class=\"code-snippet__built_in\">Object<\/span>&gt; container = <span class=\"code-snippet__keyword\">new<\/span> HashMap&lt;&gt;(<span class=\"code-snippet__number\">3<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">\n            Class&lt;?&gt; targetClassClass = target.getClass();<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__comment\">\/\/ \u7c7b\u5730\u5740<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            container.put(<span class=\"code-snippet__string\">\"class\"<\/span>,targetClassClass.toGenericString());<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__comment\">\/\/ \u65b9\u6cd5\u540d\u79f0<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            container.put(<span class=\"code-snippet__string\">\"methodName\"<\/span>,method.getName());<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__comment\">\/\/ \u5305\u540d\u79f0<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            container.put(<span class=\"code-snippet__string\">\"package\"<\/span>,targetClassClass.getPackage());<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__comment\">\/\/ \u53c2\u6570\u5217\u8868<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">for<\/span> (int i = <span class=\"code-snippet__number\">0<\/span>; i &lt; params.length; i++) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n                container.put(<span class=\"code-snippet__built_in\">String<\/span>.valueOf(i),params[i]);<\/span><\/code><code><span class=\"code-snippet_outer\">\n            }<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__comment\">\/\/ \u8f6c\u4e3aJSON\u5b57\u7b26\u4e32<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__built_in\">String<\/span> jsonString = <span class=\"code-snippet__built_in\">JSON<\/span>.toJSONString(container);<\/span><\/code><code><span class=\"code-snippet_outer\"> \n           <span class=\"code-snippet__comment\">\/\/ \u505aSHA256 Hash\u8ba1\u7b97\uff0c\u5f97\u5230\u4e00\u4e2aSHA256\u6458\u8981\u4f5c\u4e3aKey<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">return<\/span> DigestUtils.sha256Hex(jsonString);<\/span><\/code><code><span class=\"code-snippet_outer\">\n        };<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><code><span class=\"code-snippet_outer\">}<\/span><\/code><\/pre>\n<\/section>\n<p>redis\u5de5\u5177\u7c7bRedisUtils:<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"kotlin\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> lombok.AllArgsConstructor;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.<span class=\"code-snippet__keyword\">data<\/span>.redis.core.RedisTemplate;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.stereotype.Component;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> java.util.concurrent.TimeUnit;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n * Redis\u5de5\u5177\u7c7b<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n *<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n * <span class=\"code-snippet__doctag\">@author<\/span> ly<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n\u00a0*\u00a0<span class=\"code-snippet__doctag\">@date<\/span>\u00a02023-02-23<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@Component<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@AllArgsConstructor<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\npublic<\/span> <span class=\"code-snippet__class\"><span class=\"code-snippet__keyword\">class<\/span> <span class=\"code-snippet__title\">RedisUtils<\/span> <\/span>{<\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">private<\/span> RedisTemplate&lt;Object, Object&gt; redisTemplate;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u666e\u901a\u83b7\u53d6\u952e\u5bf9\u5e94\u503c<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> key \u952e<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@return<\/span> \u503c<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> Object <span class=\"code-snippet__keyword\">get<\/span>(String key) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">return<\/span> key == <span class=\"code-snippet__literal\">null<\/span> ? <span class=\"code-snippet__literal\">null<\/span> : redisTemplate.opsForValue().<span class=\"code-snippet__keyword\">get<\/span>(key);<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u666e\u901a\u8bbe\u7f6e\u952e\u503c<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> key   \u952e<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> value \u503c<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@return<\/span> true\u6210\u529f false\u5931\u8d25<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> boolean <span class=\"code-snippet__keyword\">set<\/span>(String key, Object value) {<\/span><\/code>\n<code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">try<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">\n            redisTemplate.opsForValue().<span class=\"code-snippet__keyword\">set<\/span>(key, value);<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">return<\/span> <span class=\"code-snippet__literal\">true<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n        } <span class=\"code-snippet__keyword\">catch<\/span> (Exception e) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">return<\/span> <span class=\"code-snippet__literal\">false<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n        }<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u666e\u901a\u8bbe\u7f6e\u952e\u503c\u5e76\u8bbe\u7f6e\u8fc7\u671f\u65f6\u95f4<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> key   \u952e<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> value \u503c<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> time  \u65f6\u95f4(\u79d2) time\u8981\u5927\u4e8e0 \u5982\u679ctime\u5c0f\u4e8e\u7b49\u4e8e0 \u5c06\u8bbe\u7f6e\u65e0\u9650\u671f<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@return<\/span> true\u6210\u529f false \u5931\u8d25<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> boolean <span class=\"code-snippet__keyword\">set<\/span>(String key, Object value, long time) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">try<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">if<\/span> (time &gt; <span class=\"code-snippet__number\">0<\/span>) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n                redisTemplate.opsForValue().<span class=\"code-snippet__keyword\">set<\/span>(key, value, time, TimeUnit.SECONDS);<\/span><\/code><code><span class=\"code-snippet_outer\">\n            } <span class=\"code-snippet__keyword\">else<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">\n                <span class=\"code-snippet__keyword\">set<\/span>(key, value);<\/span><\/code><code><span class=\"code-snippet_outer\">\n            }<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">return<\/span> <span class=\"code-snippet__literal\">true<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n        } <span class=\"code-snippet__keyword\">catch<\/span> (Exception e) {\n<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__keyword\">return<\/span> <span class=\"code-snippet__literal\">false<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n        }<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u5220\u9664\u7f13\u5b58<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> key \u952e<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@return<\/span> \u662f\u5426\u6210\u529f<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> boolean del(String key) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">return<\/span> redisTemplate.delete(key);<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u6307\u5b9a\u7f13\u5b58\u7684\u5931\u6548\u65f6\u95f4<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> key  \u952e\u503c <span class=\"code-snippet__doctag\">@NotNull<\/span><\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> time \u65f6\u95f4(\u79d2) <span class=\"code-snippet__doctag\">@NotNull<\/span><\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">public<\/span> boolean expire(String key, long time) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">try<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">if<\/span> (time &gt; <span class=\"code-snippet__number\">0<\/span>) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n                redisTemplate.expire(key, time, TimeUnit.SECONDS);<\/span><\/code><code><span class=\"code-snippet_outer\">\n            }<\/span><\/code><code><span class=\"code-snippet_outer\">\n        } <span class=\"code-snippet__keyword\">catch<\/span> (Exception e) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n            e.printStackTrace();<\/span><\/code><code><span class=\"code-snippet_outer\">\n            <span class=\"code-snippet__keyword\">return<\/span> <span class=\"code-snippet__literal\">false<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n        }<\/span><\/code><code><span class=\"code-snippet_outer\">\n        <span class=\"code-snippet__keyword\">return<\/span> <span class=\"code-snippet__literal\">true<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n\u00a0\u00a0\u00a0\u00a0}<\/span><\/code><code><span class=\"code-snippet_outer\">\n}<\/span><\/code><\/pre>\n<\/section>\n<p>controller\u7c7b\uff1a<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"java\"><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@ApiOperation<\/span>(<span class=\"code-snippet__string\">\"\u53d1\u9001\u90ae\u4ef6\"<\/span>)<\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@PostMapping<\/span>(<span class=\"code-snippet__string\">\"\/sendToEmail\"<\/span>)<\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@YcApi<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__function\"><span class=\"code-snippet__keyword\">public<\/span>\u00a0<span class=\"code-snippet__keyword\">void<\/span>\u00a0<span class=\"code-snippet__title\">queryPageList<\/span><span class=\"code-snippet__params\">(HttpServletRequest\u00a0request)<\/span>\u00a0<span class=\"code-snippet__keyword\">throws<\/span>\u00a0BizException\u00a0<\/span>{<\/span><\/code><code><span class=\"code-snippet_outer\">\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0email\u00a0=\u00a0request.getParameter(<span class=\"code-snippet__string\">\"email\"<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">\n        userManagerService.sendToEmail(email);<\/span><\/code><code><span class=\"code-snippet_outer\">\n    }<\/span><\/code><\/pre>\n<\/section>\n<p>\u5b9e\u73b0\u7c7buserManagerServiceImpl:<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"swift\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> cn.hutool.core.lang.Dict;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span> cn.hutool.core.util.RandomUtil;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span> cn.hutool.extra.template.Template;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span> cn.hutool.extra.template.TemplateConfig;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span> cn.hutool.extra.template.TemplateEngine;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span> cn.hutool.extra.template.TemplateUtil;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span> lombok.RequiredArgsConstructor;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span>\u00a0org.springframework.beans.factory.annotation.Value;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\nimport<\/span> java.util.Collections;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> * &lt;p&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> *  \u9886\u57df\u670d\u52a1\u5c42\u5b9e\u73b0\u7c7b<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> * &lt;\/p&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> *<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> * @author ly<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> * @since 2023-02-22<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">@<span class=\"code-snippet__type\">Service<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">@<span class=\"code-snippet__type\">RequiredArgsConstructor<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">public<\/span>\u00a0<span class=\"code-snippet__class\"><span class=\"code-snippet__keyword\">class<\/span>\u00a0<span class=\"code-snippet__title\">UserManagerServiceImpl<\/span>\u00a0<span class=\"code-snippet__title\">implements<\/span>\u00a0<span class=\"code-snippet__title\">IUserManagerService<\/span>\u00a0<\/span>{<\/span><\/code><code><span class=\"code-snippet_outer\">    @<span class=\"code-snippet__type\">Value<\/span>(<span class=\"code-snippet__string\">\"${code.expiration}\"<\/span>)<\/span><\/code><code><span class=\"code-snippet_outer\">\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__keyword\">private<\/span>\u00a0<span class=\"code-snippet__type\">Long<\/span>\u00a0expiration;<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">private<\/span> <span class=\"code-snippet__keyword\">final<\/span> <span class=\"code-snippet__type\">RedisUtils<\/span> redisUtils;<\/span><\/code><code><span class=\"code-snippet_outer\">\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__keyword\">private<\/span>\u00a0<span class=\"code-snippet__keyword\">final<\/span>\u00a0<span class=\"code-snippet__type\">EmailService<\/span>\u00a0emailService;<\/span><\/code><code><span class=\"code-snippet_outer\">    @<span class=\"code-snippet__type\">Override<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">public<\/span> void sendToEmail(<span class=\"code-snippet__type\">String<\/span> email) {<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u67e5\u770b\u6ce8\u518c\u90ae\u7bb1\u662f\u5426\u5b58\u5728 dao\u5c42<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/\/        if (sysUserService.registerEmailExist(email)) {<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/\/            throw new RuntimeException(\"\u6ce8\u518c\u90ae\u7bb1\u5df2\u5b58\u5728\");<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/\/        }<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u83b7\u53d6\u53d1\u9001\u90ae\u7bb1\u9a8c\u8bc1\u7801\u7684HTML\u6a21\u677f<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__type\">TemplateEngine<\/span> engine = <span class=\"code-snippet__type\">TemplateUtil<\/span>.createEngine(new <span class=\"code-snippet__type\">TemplateConfig<\/span>(<span class=\"code-snippet__string\">\"templates\"<\/span>, <span class=\"code-snippet__type\">TemplateConfig<\/span>.<span class=\"code-snippet__type\">ResourceMode<\/span>.<span class=\"code-snippet__type\">CLASSPATH<\/span>));<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__type\">Template<\/span> template = engine.getTemplate(<span class=\"code-snippet__string\">\"templates\/email-code.ftl\"<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u4eceredis\u7f13\u5b58\u4e2d\u5c1d\u8bd5\u83b7\u53d6\u9a8c\u8bc1\u7801<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__type\">Object<\/span> code = redisUtils.<span class=\"code-snippet__keyword\">get<\/span>(email);<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">if<\/span> (code == null) {<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__comment\">\/\/ \u5982\u679c\u5728\u7f13\u5b58\u4e2d\u672a\u83b7\u53d6\u5230\u9a8c\u8bc1\u7801\uff0c\u5219\u4ea7\u751f6\u4f4d\u968f\u673a\u6570\uff0c\u653e\u5165\u7f13\u5b58\u4e2d<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">            code = <span class=\"code-snippet__type\">RandomUtil<\/span>.randomNumbers(<span class=\"code-snippet__number\">6<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__keyword\">if<\/span> (!redisUtils.<span class=\"code-snippet__keyword\">set<\/span>(email, code, expiration)) {<\/span><\/code><code><span class=\"code-snippet_outer\">                <span class=\"code-snippet__keyword\">throw<\/span> new <span class=\"code-snippet__type\">RuntimeException<\/span>(<span class=\"code-snippet__string\">\"\u540e\u53f0\u7f13\u5b58\u670d\u52a1\u5f02\u5e38\"<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">            }<\/span><\/code><code><span class=\"code-snippet_outer\">        }<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u53d1\u9001\u9a8c\u8bc1\u7801<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        emailService.send(new <span class=\"code-snippet__type\">EmailDto<\/span>(<span class=\"code-snippet__type\">Collections<\/span>.singletonList(email),<\/span><\/code><code><span class=\"code-snippet_outer\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"code-snippet__string\">\"\u90ae\u7bb1\u9a8c\u8bc1\u7801\"<\/span>,\u00a0template.render(<span class=\"code-snippet__type\">Dict<\/span>.create().<span class=\"code-snippet__keyword\">set<\/span>(<span class=\"code-snippet__string\">\"code\"<\/span>,\u00a0code))));<\/span><\/code><code><span class=\"code-snippet_outer\">    }<\/span><\/code><code><span class=\"code-snippet_outer\">}<\/span><\/code><\/pre>\n<\/section>\n<p>EmailDto:<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"typescript\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> lombok.AllArgsConstructor;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> lombok.Data;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> lombok.NoArgsConstructor;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> javax.validation.constraints.NotBlank;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> javax.validation.constraints.NotEmpty;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> java.util.List;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n * \u90ae\u4ef6\u4fe1\u606f<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n * @author ly<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n * @date 2023-02-25<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@Data<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@AllArgsConstructor<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">\n@NoArgsConstructor<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\npublic<\/span> <span class=\"code-snippet__keyword\">class<\/span> EmailDto {<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u53d1\u9001\u90ae\u7bb1\u5217\u8868<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@NotEmpty<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">private<\/span> List&lt;<span class=\"code-snippet__built_in\">String<\/span>&gt; tos;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u4e3b\u9898<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@NotBlank<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">private<\/span> <span class=\"code-snippet__built_in\">String<\/span> subject;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u5185\u5bb9<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__meta\">@NotBlank<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__keyword\">private<\/span> <span class=\"code-snippet__built_in\">String<\/span> content;<\/span><\/code><code><span class=\"code-snippet_outer\">\n}<\/span><\/code><\/pre>\n<\/section>\n<p>Emservice\u63a5\u53e3\uff1a<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"java\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n\u00a0*\u00a0\u90ae\u7bb1\u670d\u52a1\u63a5\u53e3<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n * <span class=\"code-snippet__doctag\">@author<\/span> ly<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n\u00a0*\u00a0<span class=\"code-snippet__doctag\">@date<\/span>\u00a02023-02-19<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">\npublic<\/span>\u00a0<span class=\"code-snippet__class\"><span class=\"code-snippet__keyword\">interface<\/span>\u00a0<span class=\"code-snippet__title\">EmailService<\/span>\u00a0<\/span>{<\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * \u53d1\u9001\u90ae\u4ef6<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     * <span class=\"code-snippet__doctag\">@param<\/span> emailDto \u90ae\u7bb1\u5217\u8868<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\n     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n    <span class=\"code-snippet__function\"><span class=\"code-snippet__keyword\">void<\/span> <span class=\"code-snippet__title\">send<\/span><span class=\"code-snippet__params\">(EmailDto emailDto)<\/span><\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n}<\/span><\/code><\/pre>\n<\/section>\n<p>EmailService\u63a5\u53e3\u5b9e\u73b0\u7c7bemailServiceImpl:<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"kotlin\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> cn.hutool.extra.mail.Mail;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> cn.hutool.extra.mail.MailAccount;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> lombok.RequiredArgsConstructor;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> lombok.extern.slf4j.Slf4j;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.beans.factory.<span class=\"code-snippet__keyword\">annotation<\/span>.Value;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.stereotype.Service;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span> org.springframework.transaction.<span class=\"code-snippet__keyword\">annotation<\/span>.Propagation;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">import<\/span>\u00a0org.springframework.transaction.<span class=\"code-snippet__keyword\">annotation<\/span>.Transactional;<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\u00a0*\u00a0\u90ae\u7bb1\u63a5\u53e3\u5b9e\u73b0\u7c7b<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> * <span class=\"code-snippet__doctag\">@author<\/span> ly<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\u00a0*\u00a0<span class=\"code-snippet__doctag\">@date<\/span>\u00a02023-02-19<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">@Slf4j<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">@Service<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">@RequiredArgsConstructor<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">public<\/span> <span class=\"code-snippet__class\"><span class=\"code-snippet__keyword\">class<\/span> <span class=\"code-snippet__title\">EmailServiceImpl<\/span> <span class=\"code-snippet__title\">implements<\/span> <span class=\"code-snippet__title\">EmailService<\/span> <\/span>{<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@Value(<span class=\"code-snippet__meta-string\">\"<span class=\"code-snippet__subst\">${spring.mail.email}<\/span>\"<\/span>)<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">private<\/span> String email;<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@Value(<span class=\"code-snippet__meta-string\">\"<span class=\"code-snippet__subst\">${spring.mail.host}<\/span>\"<\/span>)<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">private<\/span> String host;<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@Value(<span class=\"code-snippet__meta-string\">\"<span class=\"code-snippet__subst\">${spring.mail.port}<\/span>\"<\/span>)<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">private<\/span> String port;<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@Value(<span class=\"code-snippet__meta-string\">\"<span class=\"code-snippet__subst\">${spring.mail.username}<\/span>\"<\/span>)<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">private<\/span> String username;<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@Value(<span class=\"code-snippet__meta-string\">\"<span class=\"code-snippet__subst\">${spring.mail.password}<\/span>\"<\/span>)<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">private<\/span> String password;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__meta\">@Override<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">public<\/span> void send(EmailDto emailDto) {<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u8bfb\u53d6\u90ae\u7bb1\u914d\u7f6e<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">if<\/span> (email == <span class=\"code-snippet__literal\">null<\/span> || host == <span class=\"code-snippet__literal\">null<\/span> || port == <span class=\"code-snippet__literal\">null<\/span> || username == <span class=\"code-snippet__literal\">null<\/span> || password == <span class=\"code-snippet__literal\">null<\/span>) {<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__keyword\">throw<\/span> new RuntimeException(<span class=\"code-snippet__string\">\"\u90ae\u7bb1\u914d\u7f6e\u5f02\u5e38\"<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">        }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u8bbe\u7f6e<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        MailAccount account = new MailAccount();<\/span><\/code><code><span class=\"code-snippet_outer\">        account.setHost(host);<\/span><\/code><code><span class=\"code-snippet_outer\">        account.setPort(Integer.parseInt(port));<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u8bbe\u7f6e\u53d1\u9001\u4eba\u90ae\u7bb1<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        account.setFrom(username + <span class=\"code-snippet__string\">\"&lt;\"<\/span> + email + <span class=\"code-snippet__string\">\"&gt;\"<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u8bbe\u7f6e\u53d1\u9001\u4eba\u540d\u79f0<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        account.setUser(username);<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u8bbe\u7f6e\u53d1\u9001\u6388\u6743\u7801<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        account.setPass(password);<\/span><\/code><code><span class=\"code-snippet_outer\">        account.setAuth(<span class=\"code-snippet__literal\">true<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ ssl\u65b9\u5f0f\u53d1\u9001<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        account.setSslEnable(<span class=\"code-snippet__literal\">true<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u4f7f\u7528\u5b89\u5168\u8fde\u63a5<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        account.setStarttlsEnable(<span class=\"code-snippet__literal\">true<\/span>);<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__comment\">\/\/ \u53d1\u9001\u90ae\u4ef6<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__keyword\">try<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">            int size = emailDto.getTos().size();<\/span><\/code><code><span class=\"code-snippet_outer\">            Mail.create(account)<\/span><\/code><code><span class=\"code-snippet_outer\">                    .setTos(emailDto.getTos().toArray(new String[size]))<\/span><\/code><code><span class=\"code-snippet_outer\">                    .setTitle(emailDto.getSubject())<\/span><\/code><code><span class=\"code-snippet_outer\">                    .setContent(emailDto.getContent())<\/span><\/code><code><span class=\"code-snippet_outer\">                    .setHtml(<span class=\"code-snippet__literal\">true<\/span>)<\/span><\/code><code><span class=\"code-snippet_outer\">                    <span class=\"code-snippet__comment\">\/\/\u5173\u95edsession<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">                    .setUseGlobalSession(<span class=\"code-snippet__literal\">false<\/span>)<\/span><\/code><code><span class=\"code-snippet_outer\">                    .send();<\/span><\/code><code><span class=\"code-snippet_outer\">        } <span class=\"code-snippet__keyword\">catch<\/span> (Exception e) {<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__keyword\">throw<\/span> new RuntimeException(e.getMessage());<\/span><\/code><code><span class=\"code-snippet_outer\">        }<\/span><\/code><code><span class=\"code-snippet_outer\">    }<\/span><\/code><code><span class=\"code-snippet_outer\">}<\/span><\/code><\/pre>\n<\/section>\n<p>constant\u5e38\u91cf\u7ef4\u62a4\uff1a<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"php\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\u00a0*\u00a0\u5e38\u91cf\u7c7b<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> * <span class=\"code-snippet__doctag\">@author<\/span> ly<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">\u00a0*\u00a0<span class=\"code-snippet__doctag\">@date<\/span>\u00a02023-02-07<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\"> *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__keyword\">public<\/span>\u00a0<span class=\"code-snippet__class\"><span class=\"code-snippet__keyword\">class<\/span>\u00a0<span class=\"code-snippet__title\">Constant<\/span>\u00a0<\/span>{<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     * \u5b9a\u4e49Redis\u7f13\u5b58\u9ed8\u8ba4\u8fc7\u671f\u65f6\u95f4<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">public<\/span> <span class=\"code-snippet__keyword\">static<\/span> <span class=\"code-snippet__keyword\">final<\/span> int CACHE_TIMEOUT_HOUR=<span class=\"code-snippet__number\">2<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     * \u5b9a\u4e49unknown\u5b57\u4e32\u4e32\u7684\u5e38\u91cf<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">public<\/span>  <span class=\"code-snippet__keyword\">static<\/span> <span class=\"code-snippet__keyword\">final<\/span> String UNKNOWN = <span class=\"code-snippet__string\">\"unknown\"<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     * \u5b9a\u4e49MB\u7684\u8ba1\u7b97\u5e38\u91cf<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">public<\/span> <span class=\"code-snippet__keyword\">static<\/span> <span class=\"code-snippet__keyword\">final<\/span> int MB = <span class=\"code-snippet__number\">1024<\/span> * <span class=\"code-snippet__number\">1024<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__comment\">\/**<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     * \u5b9a\u4e49KB\u7684\u8ba1\u7b97\u5e38\u91cf<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__comment\">     *\/<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__keyword\">public<\/span> <span class=\"code-snippet__keyword\">static<\/span> <span class=\"code-snippet__keyword\">final<\/span> int KB = <span class=\"code-snippet__number\">1024<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">}<\/span><\/code><\/pre>\n<\/section>\n<p>ftl\u6a21\u677f\u5185\u5bb9\uff1a<\/p>\n<section class=\"code-snippet__fix code-snippet__js\">\n<pre class=\"code-snippet__js\" data-lang=\"xml\"><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__meta\">&lt;!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Strict\/\/EN\"  \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-strict.dtd\"&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">html<\/span> <span class=\"code-snippet__attr\">xmlns<\/span>=<span class=\"code-snippet__string\">\"http:\/\/www.w3.org\/1999\/xhtml\"<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">head<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">meta<\/span> <span class=\"code-snippet__attr\">http-equiv<\/span>=<span class=\"code-snippet__string\">\"Content-Type\"<\/span> <span class=\"code-snippet__attr\">content<\/span>=<span class=\"code-snippet__string\">\"text\/html; charset=UTF-8\"<\/span>\/&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">style<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        @<span class=\"code-snippet__keyword\">page<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">            <span class=\"code-snippet__attribute\">margin<\/span>: <span class=\"code-snippet__number\">0<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        }<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">style<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">head<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">body<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">div<\/span> <span class=\"code-snippet__attr\">class<\/span>=<span class=\"code-snippet__string\">\"header\"<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">div<\/span> <span class=\"code-snippet__attr\">style<\/span>=<span class=\"code-snippet__string\">\"padding: 10px;padding-bottom: 0px;\"<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">p<\/span> <span class=\"code-snippet__attr\">style<\/span>=<span class=\"code-snippet__string\">\"margin-bottom: 10px;padding-bottom: 0px;\"<\/span>&gt;<\/span>\u5c0a\u656c\u7684\u7528\u6237\uff0c\u60a8\u597d\uff1a<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">p<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">p<\/span> <span class=\"code-snippet__attr\">style<\/span>=<span class=\"code-snippet__string\">\"text-indent: 2em; margin-bottom: 10px;\"<\/span>&gt;<\/span>\u60a8\u6b63\u5728\u7533\u8bf7\u90ae\u7bb1\u9a8c\u8bc1\uff0c\u60a8\u7684\u9a8c\u8bc1\u7801\u4e3a\uff1a<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">p<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">p<\/span> <span class=\"code-snippet__attr\">class<\/span>=<span class=\"code-snippet__string\">\"code-text\"<\/span>&gt;<\/span>${code}<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">p<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">p<\/span> <span class=\"code-snippet__attr\">style<\/span>=<span class=\"code-snippet__string\">\"text-indent: 2em; margin-bottom: 10px;\"<\/span>&gt;<\/span>\u6b64\u6b21\u9a8c\u8bc1\u78015\u5206\u949f\u5185\u6709\u6548<span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">p<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">div<\/span> <span class=\"code-snippet__attr\">class<\/span>=<span class=\"code-snippet__string\">\"footer\"<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">div<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">div<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">div<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">body<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">html<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;<span class=\"code-snippet__name\">style<\/span> <span class=\"code-snippet__attr\">lang<\/span>=<span class=\"code-snippet__string\">\"css\"<\/span>&gt;<\/span><\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__selector-tag\">body<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">margin<\/span>: <span class=\"code-snippet__number\">0px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">padding<\/span>: <span class=\"code-snippet__number\">0px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">font<\/span>: <span class=\"code-snippet__number\">100%<\/span> SimSun, Microsoft YaHei, Times New Roman, Verdana, Arial, Helvetica, sans-serif;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">color<\/span>: <span class=\"code-snippet__number\">#000<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__selector-class\">.header<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">height<\/span>: auto;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">width<\/span>: <span class=\"code-snippet__number\">820px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">min-width<\/span>: <span class=\"code-snippet__number\">820px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">margin<\/span>: <span class=\"code-snippet__number\">0<\/span> auto;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">margin-top<\/span>: <span class=\"code-snippet__number\">20px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">border<\/span>: <span class=\"code-snippet__number\">1px<\/span> solid <span class=\"code-snippet__number\">#eee<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__selector-class\">.code-text<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">text-align<\/span>: center;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">font-family<\/span>: Times New Roman;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">font-size<\/span>: <span class=\"code-snippet__number\">22px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">color<\/span>: <span class=\"code-snippet__number\">#C60024<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">padding<\/span>: <span class=\"code-snippet__number\">20px<\/span> <span class=\"code-snippet__number\">0px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">margin-bottom<\/span>: <span class=\"code-snippet__number\">10px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">font-weight<\/span>: bold;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">background<\/span>: <span class=\"code-snippet__number\">#ebebeb<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">    }<\/span><\/code><code><span class=\"code-snippet_outer\">\n<\/span><\/code><code><span class=\"code-snippet_outer\">    <span class=\"code-snippet__selector-class\">.footer<\/span> {<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">margin<\/span>: <span class=\"code-snippet__number\">0<\/span> auto;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">z-index<\/span>: <span class=\"code-snippet__number\">111<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">width<\/span>: <span class=\"code-snippet__number\">800px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">margin-top<\/span>: <span class=\"code-snippet__number\">30px<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">        <span class=\"code-snippet__attribute\">border-top<\/span>: <span class=\"code-snippet__number\">1px<\/span> solid <span class=\"code-snippet__number\">#DA251D<\/span>;<\/span><\/code><code><span class=\"code-snippet_outer\">    }<\/span><\/code><code><span class=\"code-snippet_outer\"><span class=\"code-snippet__tag\">&lt;\/<span class=\"code-snippet__name\">style<\/span>&gt;<\/span><\/span><\/code><\/pre>\n<\/section>\n<p>\u6700\u540e\u4e0a\u5de5\u7a0b\u76ee\u5f55\u7ed3\u6784\uff1a<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"rich_pages wxw-img lazyload\" data-src=\"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021535117.png\" src=\"https:\/\/s.nmxc.ltd\/sakurairo_vision\/@2.6\/load_svg\/inload.svg\" onerror=\"imgError(this)\" data-galleryid=\"\" data-ratio=\"0.4578544061302682\" data-s=\"300,640\" data-type=\"png\" data-w=\"1566\" \/><noscript><img decoding=\"async\" class=\"rich_pages wxw-img\" src=\"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021535117.png\" data-galleryid=\"\" data-ratio=\"0.4578544061302682\" data-s=\"300,640\" data-type=\"png\" data-w=\"1566\" \/><\/noscript><\/p>\n<p>\u770b\u4e0b\u6548\u679c\uff1a<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"rich_pages wxw-img lazyload\" data-src=\"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021538859.png\" src=\"https:\/\/s.nmxc.ltd\/sakurairo_vision\/@2.6\/load_svg\/inload.svg\" onerror=\"imgError(this)\" data-galleryid=\"\" data-ratio=\"0.3386243386243386\" data-s=\"300,640\" data-type=\"png\" data-w=\"1134\" \/><noscript><img decoding=\"async\" class=\"rich_pages wxw-img\" src=\"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021538859.png\" data-galleryid=\"\" data-ratio=\"0.3386243386243386\" data-s=\"300,640\" data-type=\"png\" data-w=\"1134\" \/><\/noscript><\/p>\n<p>\u53ef\u4ee5\u770b\u5230redis\u7f13\u5b58\u5df2\u7ecf\u6709\u4e86\u9a8c\u8bc1\u7801\uff0c300\u79d2\u540e\u4e5f\u5df2\u6210\u529f\u79fb\u9664\u5931\u6548\u4e86<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"rich_pages wxw-img lazyload\" style=\"width: 578px; height: auto;\" data-src=\"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021540616.png\" src=\"https:\/\/s.nmxc.ltd\/sakurairo_vision\/@2.6\/load_svg\/inload.svg\" onerror=\"imgError(this)\" data-galleryid=\"\" data-ratio=\"0.09075043630017451\" data-s=\"300,640\" data-type=\"png\" data-w=\"1719\" \/><noscript><img decoding=\"async\" class=\"rich_pages wxw-img\" style=\"width: 578px; height: auto;\" src=\"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021540616.png\" data-galleryid=\"\" data-ratio=\"0.09075043630017451\" data-s=\"300,640\" data-type=\"png\" data-w=\"1719\" \/><\/noscript><\/p>\n<p>\u90ae\u7bb1\u91cc\u4e5f\u662f\u80fd\u627e\u5230\u5bf9\u5e94\u7684\u9a8c\u8bc1\u7801\uff0c\u597d\u4e86\uff0c\u5173\u4e8e\u8fd9\u90e8\u5206\u7684\u5148\u4ecb\u7ecd\u8fd9\u91cc\uff0c\u5173\u4e8ejava\u7248\u672c\u53d1\u9001\u90ae\u4ef6\u53ef\u4ee5\u67e5\u770b\u5386\u53f2\u6587\u7ae0\uff0c\u94fe\u63a5\u653e\u4e0b\u9762\u4e86\u3002\u5267\u900f\u4e0b\u63a5\u4e0b\u6765\u4e0b\u4e00\u7bc7\u6587\u7ae0\u5c06\u4f1a\u662f\u4ecb\u7ecd\u4e9a\u9a6c\u900a\u4e91\u540c\u6b3e\u4ea7\u54c1s3\u96c6\u6210\u4ee3\u7801\u4f7f\u7528.<\/p>\n<p><a href=\"http:\/\/mp.weixin.qq.com\/s?__biz=Mzg4OTUyNzQ3OA==&amp;mid=2247483972&amp;idx=1&amp;sn=6fa79634522f575c1f1e91465c70b606&amp;chksm=cfebcf9df89c468b90e3bb8cf3e35d2520cfa6160f68bbf87adbb98c70e2ace963587ceb35ff&amp;scene=21#wechat_redirect\" target=\"_blank\" rel=\"noopener\" data-itemshowtype=\"0\" data-linktype=\"2\" rel=\"nofollow\" >javeWeb\u53d1\u9001\u90ae\u4ef6<\/a><\/p>\n<p style=\"display: none;\">\n<blockquote><p>\u672c\u7bc7\u6587\u7ae0\u6765\u6e90\u4e8e\u5fae\u4fe1\u516c\u4f17\u53f7: \u5c0f\u738b\u5b50\u53e4\u6728\u5c4b<\/p><\/blockquote>\n<\/div>\n","raw":"","protected":false},"excerpt":{"rendered":"<p>\u4e4b\u524d\u4e5f\u5199\u8fc7\u4e00\u7bc7java\u57fa\u7840\u7248\u7684\u90ae\u4ef6\u9a8c\u8bc1\u7801\uff0c\u8fd9\u7bc7\u662f\u91c7\u7528hutool\uff0cftl\u6a21\u677f\uff0c\u7ed3\u5408redis\u505a\u7684\u4e00\u7bc7\u5e26\u6709\u6709\u6548\u671f\u7684\u9a8c\u8bc1\u7801\u7684\u5b9e\u73b0\u65b9\u6848\u3002 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":970,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-974","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"post_thumbnail_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021533690-150x150.jpeg","content_first_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021535117.png","post_medium_image_300":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021533690-300x128.jpeg","post_thumbnail_image_624":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021533690.jpeg","post_frist_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021535117.png","post_medium_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021533690-300x128.jpeg","post_large_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021533690.jpeg","post_full_image":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021533690.jpeg","post_all_images":[{"imagesurl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021535117.png","id":"image0"},{"imagesurl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021535117.png","id":"image1"},{"imagesurl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021538859.png","id":"image2"},{"imagesurl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021538859.png","id":"image3"},{"imagesurl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021540616.png","id":"image4"},{"imagesurl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230528021540616.png","id":"image5"}],"videoAdId":"","listAd":"0","listAdId":"","listAdEvery":6,"total_comments":0,"category_name":"\u672a\u5206\u7c7b","post_date":"2023-05-27","like_count":"0","praiseWord":"\u9f13\u52b1","copyright_state":"","excitationAd":"0","rewardedVideoAdId":"","detailAdId":"","detailAd":"0","enterpriseMinapp":"0","audios":[],"postImageUrl":"https:\/\/wp-moto-1258805347.cos.ap-shanghai.myqcloud.com\/2023\/05\/20230519082947553.jpg","avatarurls":[],"related_posts":null,"pageviews":312,"next_post_id":241,"next_post_title":"jetbrains\u5168\u5bb6\u6876\u6fc0\u6d3b\u6b65\u9aa4","previous_post_id":995,"previous_post_title":"\u544a\u522b\u5361\u987f\u56f0\u6270\uff1aIDEA \u6027\u80fd\u4f18\u5316\u8bbe\u7f6e","_links":{"self":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/posts\/974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/comments?post=974"}],"version-history":[{"count":0,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/posts\/974\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/media\/970"}],"wp:attachment":[{"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/media?parent=974"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/categories?post=974"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xinchewhd.com.cn\/index.php\/wp-json\/wp\/v2\/tags?post=974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}