<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Ckli的blog</title><link>https://blog.lck.yn.cn/</link><description>[绝不人云亦云] 只发亲测、完整的教程</description><item><title>从零构建共享API平台：基于Swoft 2.0的微服务架构实践</title><link>https://blog.lck.yn.cn/?id=11</link><description>&lt;div&gt;&lt;br/&gt;&lt;div&gt;&amp;lt;本文介绍如何基于Swoft 2.0框架&amp;gt;&lt;/div&gt;&lt;p&gt;&amp;lt;构建共享API网关平台，探讨公益与技术,商业化的平衡之道。&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 前言&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;做公益这件事，我走了好多年。中间有过委屈，有过难，甚至看着自己搭建的平台，明明能帮人，却因&amp;quot;不会吆喝&amp;quot;而少有人问津时，也会陷入迷茫。但每当想起乡镇里，有人为了赶一趟班车，天不亮就守在路边；残障朋友想找份能做的活，却被大平台的门槛挡在门外；还有那些假期里，为买不到票、怕堵车而发愁的乡亲们，我又觉得这件事必须得做下去。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;——摘自《七家坡的&amp;quot;摆渡人&amp;quot;》&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;作为一名在PHP领域深耕近20年的后端工程师，我一直在思考：如何用技术力量帮助更多人，同时又能让技术实现可持续发展？本文将分享我基于Swoft 2.0框架构建共享API平台的实践经验。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 项目背景&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;我的共享API平台目前已经支撑了多个公益项目：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;- **七家坡基层互助站** (https://lo.lck.yn.cn/)&lt;/p&gt;&lt;p&gt;&amp;nbsp; 提共基于用户当前位置（查询、发布）拼车、运营（车辆、路线）信息等便民服务&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;- **AI合集** (https://ai.lck.yn.cn/)&lt;/p&gt;&lt;p&gt;&amp;nbsp; 基于AI的（含八字&lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;算命，将持续增加更多服务&lt;/span&gt;）传统文化服务&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;这些项目虽然面向不同场景，但都需要相同的底层能力：用户认证、地理定位、支付、数据存储等。为了避免重复造轮子，我决定构建一个**共享API平台**，让所有项目都能快速接入这些通用能力。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 技术选型：为什么选择Swoft 2.0？&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;在选型时，我对比了多个PHP框架：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;| 框架 | 协程支持 | 微服务 | 学习成本 | 性能 |&lt;/p&gt;&lt;p&gt;|------|---------|--------|---------|------|&lt;/p&gt;&lt;p&gt;| Laravel | 无 | 无 | 低 | 中 |&lt;/p&gt;&lt;p&gt;| Hyperf | 有 | 有 | 中 | 高 |&lt;/p&gt;&lt;p&gt;| Swoft 2.0 | 有 | 有 | 中 | 高 |&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;最终选择**Swoft 2.0**的原因：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **成熟的协程支持**：基于Swoole扩展，提供原生协程能力，性能接近Go语言&lt;/p&gt;&lt;p&gt;2. **gRPC原生支持**：内置gRPC支持，可与任何语言无缝对接&lt;/p&gt;&lt;p&gt;3. **微服务架构**：内置RPC服务注册与发现，完美契合我的分布式架构需求&lt;/p&gt;&lt;p&gt;4. **注解驱动**：类似Spring Cloud的注解机制，代码简洁优雅&lt;/p&gt;&lt;p&gt;5. **完善的生态**：内置连接池、AOP、任务调度等企业级功能&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 关于框架选择的真实思考&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**Swoft 2.0的现状**：&lt;/p&gt;&lt;p&gt;- 官方早已停止维护，官网已无法访问&lt;/p&gt;&lt;p&gt;- 基本查不到相关资料，社区支持很少&lt;/p&gt;&lt;p&gt;- 很多功能文档缺失，需要自己摸索&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**为什么还是选择了它？**&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **协程性能优势**：Swoole扩展的性能优势难以替代&lt;/p&gt;&lt;p&gt;2. **架构设计优秀**：微服务、RPC、注解机制的设计理念先进&lt;/p&gt;&lt;p&gt;3. **自主掌控**：既然官方不维护，我就自己维护&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**填坑之路**：&lt;/p&gt;&lt;p&gt;- 很多功能的实现方案，AI都无法给出正确答案&lt;/p&gt;&lt;p&gt;- 每个坑都花了超过一周的时间去研究、测试、验证&lt;/p&gt;&lt;p&gt;- 通过理解作者意图、结合实战经验、深入底层源码，最终全部实现&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**给后来者的建议**：&lt;/p&gt;&lt;p&gt;技术选型不要盲目追求&amp;quot;官方维护&amp;quot;，关键是否适合你的场景。&lt;/p&gt;&lt;p&gt;框架只是工具，你的技术积累和解决问题的能力才是核心。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 架构设计&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 整体架构&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;┌──────────────────────┐&lt;/p&gt;&lt;p&gt;│&amp;nbsp; &amp;nbsp; 前端应用层&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;│ ┌────────┐┌────────┐│&lt;/p&gt;&lt;p&gt;│ │七家坡&amp;nbsp; ││AI站点&amp;nbsp; ││&lt;/p&gt;&lt;p&gt;│ └────────┘└────────┘│&lt;/p&gt;&lt;p&gt;└──────────────────────┘&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;▼&lt;/p&gt;&lt;p&gt;┌──────────────────────┐&lt;/p&gt;&lt;p&gt;│&amp;nbsp; &amp;nbsp; API网关层&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&lt;/p&gt;&lt;p&gt;│ Gateway&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&lt;/p&gt;&lt;p&gt;│ - JWT认证&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; │&lt;/p&gt;&lt;p&gt;│ - 权限控制&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;│ - 限流&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;│ - 日志审计&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;└──────────────────────┘&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;▼&lt;/p&gt;&lt;p&gt;┌──────────────────────┐&lt;/p&gt;&lt;p&gt;│&amp;nbsp; &amp;nbsp; 微服务层&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;│ ┌────┐┌────┐┌────┐│&lt;/p&gt;&lt;p&gt;│ │Traf││Stay││Admi││&lt;/p&gt;&lt;p&gt;│ │fic&amp;nbsp; ││&amp;nbsp; &amp;nbsp; ││n&amp;nbsp; &amp;nbsp;││&lt;/p&gt;&lt;p&gt;│ └────┘└────┘└────┘│&lt;/p&gt;&lt;p&gt;└──────────────────────┘&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;▼&lt;/p&gt;&lt;p&gt;┌──────────────────────┐&lt;/p&gt;&lt;p&gt;│&amp;nbsp; &amp;nbsp; 数据存储层&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;│ ┌────┐┌────┐┌────┐│&lt;/p&gt;&lt;p&gt;│ │MyS ││Redi││支付││&lt;/p&gt;&lt;p&gt;│ │QL&amp;nbsp; ││s&amp;nbsp; &amp;nbsp;││接口││&lt;/p&gt;&lt;p&gt;│ └────┘└────┘└────┘│&lt;/p&gt;&lt;p&gt;└──────────────────────┘&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 服务拆分&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;根据业务领域，我将服务拆分为以下模块（端口为示意配置，实际部署时可自定义）：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**网关层：**&lt;/p&gt;&lt;p&gt;| 服务 | 职责 | 端口 |&lt;/p&gt;&lt;p&gt;|------|------|------|&lt;/p&gt;&lt;p&gt;| **gateway** | API网关，负责认证、路由、限流、域名授权 | 80 |&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**微服务层：**&lt;/p&gt;&lt;p&gt;| 服务 | 职责 | 包含的子服务 |&lt;/p&gt;&lt;p&gt;|------|------|-------------|&lt;/p&gt;&lt;p&gt;| **login** | 登录服务 | 登录 |&lt;/p&gt;&lt;p&gt;| **user** | 用户服务 | 用户、地址等 |&lt;/p&gt;&lt;p&gt;| **code** | 验证服务 | 邮箱验证、短信验证（已测试通过） |&lt;/p&gt;&lt;p&gt;| **category** | 分类服务 | 分类 |&lt;/p&gt;&lt;p&gt;| **traffic** | 交通服务 | 拼车、运营（岗位信息） |&lt;/p&gt;&lt;p&gt;| **stay** | 住宿服务 | 小屋（民宿） |&lt;/p&gt;&lt;p&gt;| **aigc** | AI合集服务 | 八字取名等AI服务 |&lt;/p&gt;&lt;p&gt;| **pay** | 支付服务 | 订单、支付回调 |&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;共 **8个微服务**，每个服务下可能有1或多个子服务。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 核心功能实现&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 1. API网关设计&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;网关是整个系统的入口，负责：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;- **JWT认证**：基于`Swoft\Auth`组件实现，支持token自动刷新&lt;/p&gt;&lt;p&gt;- **域授权机制**：根据请求来源域名进行授权控制&lt;/p&gt;&lt;p&gt;- **本地开发友好**：localhost/127.0.0.1等本地域名默认已授权&lt;/p&gt;&lt;p&gt;- **权限控制**：通过中间件拦截未授权请求&lt;/p&gt;&lt;p&gt;- **服务路由**：将请求转发到对应的微服务&lt;/p&gt;&lt;p&gt;- **限流保护**：使用`Swoft\Limiter`防止接口滥用&lt;/p&gt;&lt;p&gt;- **文档生成**：自动生成Swagger文档&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;网关配置示例（`config/beans.php`）：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```php&lt;/p&gt;&lt;p&gt;return [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;#39;userAuth&amp;#39; =&amp;gt; [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;class&amp;#39; =&amp;gt; Swoft\Auth\Manager::class,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;name&amp;#39;&amp;nbsp; =&amp;gt; &amp;#39;user&amp;#39;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;language&amp;#39; =&amp;gt; &amp;#39;zh&amp;#39;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;ttl&amp;#39; =&amp;gt; 7200, // token有效期2小时&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;refreshTtl&amp;#39; =&amp;gt; 2592000, // 刷新token有效期30天&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ],&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;#39;jwtAuth&amp;#39; =&amp;gt; [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;class&amp;#39; =&amp;gt; Swoft\Auth\Parser\JWTAuthParser::class,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ]&lt;/p&gt;&lt;p&gt;];&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**Token自动刷新机制**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```php&lt;/p&gt;&lt;p&gt;// 中间件中实现token自动刷新&lt;/p&gt;&lt;p&gt;public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $token = $this-&amp;gt;jwtAuth-&amp;gt;parse($request);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $payload = $token-&amp;gt;payload();&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // 检查token是否即将过期（剩余时间小于10分钟）&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if ($payload[&amp;#39;exp&amp;#39;] - time() &amp;lt; 600) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $newToken = $this-&amp;gt;auth-&amp;gt;refreshToken($token);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 在响应头中返回新token&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $handler-&amp;gt;handle($request)-&amp;gt;withHeader(&amp;#39;X-New-Token&amp;#39;, $newToken);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return $handler-&amp;gt;handle($request);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 2. 地理位置查询优化（LBS）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;顺风车和民宿服务都需要根据用户位置查询附近信息。这是典型的地理围栏查询场景。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#### 优化前的问题&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;传统使用`HAVING`计算距离的方式效率低下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```sql&lt;/p&gt;&lt;p&gt;SELECT *,&lt;/p&gt;&lt;p&gt;&amp;nbsp; (6371 * ACOS(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; COS(RADIANS(lat)) * COS(RADIANS(24.88)) *&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; COS(RADIANS(lng) - RADIANS(102.83)) +&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; SIN(RADIANS(lat)) * SIN(RADIANS(24.88))&lt;/p&gt;&lt;p&gt;&amp;nbsp; )) AS distance&lt;/p&gt;&lt;p&gt;FROM sys_carpooling&lt;/p&gt;&lt;p&gt;HAVING distance &amp;lt; 10&lt;/p&gt;&lt;p&gt;ORDER BY distance&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**问题**：&lt;/p&gt;&lt;p&gt;- 每次查询都要计算全表距离，性能极差&lt;/p&gt;&lt;p&gt;- 无法使用索引，随着数据量增加性能急剧下降&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#### 优化方案&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;采用**边界框预过滤 + 空间索引**的双重优化策略：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```sql&lt;/p&gt;&lt;p&gt;SELECT *,&lt;/p&gt;&lt;p&gt;&amp;nbsp; ST_Distance_Sphere(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; location,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ST_GeomFromText(&amp;#39;POINT(102.83 24.88)&amp;#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; ) AS distance&lt;/p&gt;&lt;p&gt;FROM sys_carpooling&lt;/p&gt;&lt;p&gt;WHERE lat BETWEEN 24.01 AND 25.75&lt;/p&gt;&lt;p&gt;&amp;nbsp; AND lng BETWEEN 101.91 AND 103.75&lt;/p&gt;&lt;p&gt;&amp;nbsp; AND ST_Distance_Sphere(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; location,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; POINT(102.83, 24.88)&lt;/p&gt;&lt;p&gt;&amp;nbsp; ) &amp;lt;= 10000&lt;/p&gt;&lt;p&gt;ORDER BY distance&lt;/p&gt;&lt;p&gt;LIMIT 20&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**优化要点**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **添加空间索引**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```sql&lt;/p&gt;&lt;p&gt;ALTER TABLE sys_carpooling&lt;/p&gt;&lt;p&gt;ADD COLUMN location POINT NOT NULL COMMENT &amp;#39;位置坐标&amp;#39; AFTER lat,&lt;/p&gt;&lt;p&gt;ADD SPATIAL INDEX idx_location (location);&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;2. **范围级别参数化**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```php&lt;/p&gt;&lt;p&gt;$rangeMap = [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 1 =&amp;gt; 10,&amp;nbsp; &amp;nbsp;// 10公里&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 2 =&amp;gt; 50,&amp;nbsp; &amp;nbsp;// 50公里&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 3 =&amp;gt; 100,&amp;nbsp; // 100公里（默认）&lt;/p&gt;&lt;p&gt;];&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;$range = $rangeMap[$level] ?? 100;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;3. **计算边界框**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```php&lt;/p&gt;&lt;p&gt;$lngMin = $lng - $range / 111.32 / cos($lat * PI() / 180);&lt;/p&gt;&lt;p&gt;$lngMax = $lng + $range / 111.32 / cos($lat * PI() / 180);&lt;/p&gt;&lt;p&gt;$latMin = $lat - $range / 111.32;&lt;/p&gt;&lt;p&gt;$latMax = $lat + $range / 111.32;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**性能对比**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;| 数据量 | 优化前 | 优化后 | 提升 |&lt;/p&gt;&lt;p&gt;|--------|--------|--------|------|&lt;/p&gt;&lt;p&gt;| 1万条&amp;nbsp; | 2.5s&amp;nbsp; &amp;nbsp;| 0.05s&amp;nbsp; | 50x |&lt;/p&gt;&lt;p&gt;| 10万条 | 25s&amp;nbsp; &amp;nbsp; | 0.08s&amp;nbsp; | 312x |&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 3. RPC微服务通信&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;平台支持**gRPC协议**，这是微服务通信的最佳选择。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#### 为什么选择gRPC？&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;gRPC相比传统HTTP API有以下优势：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;| 特性 | HTTP/REST | gRPC |&lt;/p&gt;&lt;p&gt;|------|-----------|------|&lt;/p&gt;&lt;p&gt;| 协议 | 文本(JSON) | 二进制(Protobuf) |&lt;/p&gt;&lt;p&gt;| 传输效率 | 低（数据大） | 高（数据小） |&lt;/p&gt;&lt;p&gt;| 序列化速度 | 慢 | 快（5-10倍） |&lt;/p&gt;&lt;p&gt;| 跨语言支持 | 需要手动适配 | 自动生成代码 |&lt;/p&gt;&lt;p&gt;| 流式传输 | 不支持 | 支持（单向流/双向流） |&lt;/p&gt;&lt;p&gt;| 代码量 | 手动解析 | 自动生成 |&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**关键优势**：&lt;/p&gt;&lt;p&gt;- **任何语言对接**：支持Go、Java、Python、Node.js、C#、PHP等20+种语言&lt;/p&gt;&lt;p&gt;- **协程友好**：完美配合Swoole协程，无阻塞&lt;/p&gt;&lt;p&gt;- **内存运行**：常驻内存，无需每次请求启动&lt;/p&gt;&lt;p&gt;- **性能更快**：二进制协议，传输速度提升3-5倍&lt;/p&gt;&lt;p&gt;- **资源占用少**：相比传统HTTP API，内存占用降低50%以上&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;服务间通过RPC调用，Swoft提供了优雅的注解方式：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**定义Proto文件**（`traffic.proto`）：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```protobuf&lt;/p&gt;&lt;p&gt;syntax = &amp;quot;proto3&amp;quot;;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;package traffic;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;service TrafficService {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; rpc NearList(NearRequest) returns (NearResponse);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; rpc CreateCarpooling(CarpoolingRequest) returns (CommonResponse);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;message NearRequest {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; float lng = 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; float lat = 2;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int32 level = 3;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;message NearResponse {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; repeated Carpooling items = 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int32 total = 2;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**PHP服务端实现**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```php&lt;/p&gt;&lt;p&gt;/**&lt;/p&gt;&lt;p&gt;&amp;nbsp;* @RpcService(name=&amp;quot;trafficService&amp;quot;, version=&amp;quot;1.0&amp;quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;*/&lt;/p&gt;&lt;p&gt;class TrafficService&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; /**&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 查询附近顺风车&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public function nearList(float $lng, float $lat, int $level = 3): array&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return CarpoolingDao::nearList($lng, $lat, $level);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**服务消费者通过`@Reference`注解注入**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```php&lt;/p&gt;&lt;p&gt;/**&lt;/p&gt;&lt;p&gt;&amp;nbsp;* @Reference(name=&amp;quot;trafficService&amp;quot;, version=&amp;quot;1.0&amp;quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;*/&lt;/p&gt;&lt;p&gt;private $trafficService;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;public function near(Request $request): Response&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $data = $this-&amp;gt;trafficService-&amp;gt;nearList(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $request-&amp;gt;get(&amp;#39;lng&amp;#39;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $request-&amp;gt;get(&amp;#39;lat&amp;#39;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $request-&amp;gt;get(&amp;#39;level&amp;#39;, 3)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return context()-&amp;gt;getResponse()-&amp;gt;withData($data);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**跨语言调用示例**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```go&lt;/p&gt;&lt;p&gt;// Go客户端&lt;/p&gt;&lt;p&gt;conn, _ := grpc.Dial(&amp;quot;localhost:8307&amp;quot;, grpc.WithInsecure())&lt;/p&gt;&lt;p&gt;client := pb.NewTrafficServiceClient(conn)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;req := &amp;amp;pb.NearRequest{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Lng: 102.83,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Lat: 24.88,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Level: 3,&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;resp, _ := client.NearList(context.Background(), req)&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 4. 支付系统集成&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;支付系统支持微信和支付宝，需要区分PC端和移动端：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```php&lt;/p&gt;&lt;p&gt;public function createOrder(Request $request): Response&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $deviceType = getDeviceType(); // H5/Pc&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // 支付方式判断&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $method = $this-&amp;gt;getPaymentMethod($channel, $deviceType);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // 微信PC端: Native, 支付宝PC端: PcWeb, 移动端: H5&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $order = [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;ser_name&amp;#39; =&amp;gt; &amp;#39;aigc&amp;#39;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;amount&amp;#39; =&amp;gt; $amount * 100, // 转为分&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;channel&amp;#39; =&amp;gt; $channel, // Wechat/Alipay&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;method&amp;#39; =&amp;gt; $method,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;body&amp;#39; =&amp;gt; &amp;#39;套餐名称&amp;#39;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;source&amp;#39; =&amp;gt; &amp;#39;总部自营&amp;#39;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;user_id&amp;#39; =&amp;gt; $userId ?: null,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;temp_id&amp;#39; =&amp;gt; $tempId ?: null,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ];&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; return $this-&amp;gt;orderApi-&amp;gt;create($order);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 5. 自动化部署&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;为了提高开发效率，我实现了完整的自动化部署流程：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```bash&lt;/p&gt;&lt;p&gt;# 部署脚本&lt;/p&gt;&lt;p&gt;#!/bin/bash&lt;/p&gt;&lt;p&gt;git pull origin master&lt;/p&gt;&lt;p&gt;composer install --no-dev&lt;/p&gt;&lt;p&gt;php bin/swoft stop&lt;/p&gt;&lt;p&gt;php bin/swoft start -d&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Git提交后自动触发部署，无需人工干预。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## API文档管理&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;使用Swagger自动生成API文档，部署在：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;- **生产环境**：https://api.micro.lck.yn.cn/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;- **测试环境**：https://apitest.micro.lck.yn.cn/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 接入模式与商业化思考&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 灵活的接入方式&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;平台提供两种接入模式，开发者可以根据项目发展阶段自由选择：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#### 1. 共享API模式（适合项目初期）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**适用场景**：&lt;/p&gt;&lt;p&gt;- 项目刚起步，用户量和并发较低&lt;/p&gt;&lt;p&gt;- 希望节省服务器和运维成本&lt;/p&gt;&lt;p&gt;- 快速验证商业想法&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**优势**：&lt;/p&gt;&lt;p&gt;- **零运维成本**：无需搭建服务器、数据库等基础设施&lt;/p&gt;&lt;p&gt;- **快速上线**：5分钟即可完成接入&lt;/p&gt;&lt;p&gt;- **按需授权**：根据项目域名进行授权，灵活便捷&lt;/p&gt;&lt;p&gt;- **本地开发友好**：localhost等本地域名默认已授权，开发无忧&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**授权方式**：&lt;/p&gt;&lt;p&gt;- 通过申请域名授权，绑定项目前端域名&lt;/p&gt;&lt;p&gt;- 本地开发环境（localhost、127.0.0.1）默认已授权&lt;/p&gt;&lt;p&gt;- 域名审核通过后，即可在生产环境使用&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#### 2. 独立部署模式（适合项目成长期）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**适用场景**：&lt;/p&gt;&lt;p&gt;- 项目已有一定用户量和流量&lt;/p&gt;&lt;p&gt;- 需要更高的性能和稳定性&lt;/p&gt;&lt;p&gt;- 数据安全要求更高&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**优势**：&lt;/p&gt;&lt;p&gt;- **完全独立**：网关、微服务、数据库全部独立部署&lt;/p&gt;&lt;p&gt;- **跨服务器架构**：可根据需要分布式部署&lt;/p&gt;&lt;p&gt;- **性能无上限**：根据业务需求灵活扩展&lt;/p&gt;&lt;p&gt;- **数据完全掌控**：所有数据存储在自有服务器&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**部署灵活性**：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;方式1：单机部署（小型项目）&lt;/p&gt;&lt;p&gt;┌──────────┐&lt;/p&gt;&lt;p&gt;│ 单服务器&amp;nbsp; │&lt;/p&gt;&lt;p&gt;└──────────┘&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方式2：分布式部署（中型项目）&lt;/p&gt;&lt;p&gt;┌────┐┌────┐┌────┐&lt;/p&gt;&lt;p&gt;│网关││应用││数据库│&lt;/p&gt;&lt;p&gt;└────┘└────┘└────┘&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方式3：集群部署（大型项目）&lt;/p&gt;&lt;p&gt;┌────┐┌────┐┌────┐&lt;/p&gt;&lt;p&gt;│网关││应用││数据库│&lt;/p&gt;&lt;p&gt;│集群││集群││集群 │&lt;/p&gt;&lt;p&gt;└────┘└────┘└────┘&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 无缝迁移路径&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;平台设计了平滑的迁移路径：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;项目起步期 → 项目成长期 → 项目成熟期&lt;/p&gt;&lt;p&gt;共享API&amp;nbsp; &amp;nbsp; → 独立部署&amp;nbsp; &amp;nbsp; → 完全私有化&lt;/p&gt;&lt;p&gt;(零成本)&amp;nbsp; &amp;nbsp; &amp;nbsp; (逐步)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (掌控)&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**迁移优势**：&lt;/p&gt;&lt;p&gt;- **代码无需修改**：API接口保持一致&lt;/p&gt;&lt;p&gt;- **数据平滑迁移**：支持数据导出和导入&lt;/p&gt;&lt;p&gt;- **无缝切换**：域名授权即可切换模式&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 技术支持&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;提供多渠道技术支持：&lt;/p&gt;&lt;p&gt;- **微信**：kmwmkj&lt;/p&gt;&lt;p&gt;- **邮箱**：admin@lck.yn.cn&lt;/p&gt;&lt;p&gt;- **电话**：15687658489（微信同号）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 公益与可持续&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;做公益不代表不能商业化，关键是找到平衡点：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**公益初心**：&lt;/p&gt;&lt;p&gt;- 始终记得为什么出发，不要因为商业化而偏离公益使命&lt;/p&gt;&lt;p&gt;- 为公益项目提供技术支持，降低公益项目的技术门槛&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**可持续发展**：&lt;/p&gt;&lt;p&gt;- 公益也需要资金支持，合理的商业化能让平台走得更远&lt;/p&gt;&lt;p&gt;- 通过商业化项目反哺公益项目，形成良性循环&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**开放共赢**：&lt;/p&gt;&lt;p&gt;- 欢迎更多公益项目接入，共同服务社会&lt;/p&gt;&lt;p&gt;- 建立开发者社区，共享技术资源和经验&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 经验总结&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 技术层面&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **协程编程思维**：协程不是万能的，要避免阻塞操作，使用连接池、协程客户端等&lt;/p&gt;&lt;p&gt;2. **服务拆分粒度**：不要过度拆分，按业务领域划分，保持服务独立但不过于分散&lt;/p&gt;&lt;p&gt;3. **数据库优化**：善用MySQL 8.0的空间索引，地理位置查询性能提升显著&lt;/p&gt;&lt;p&gt;4. **监控告警**：建立完善的监控体系，及时发现和处理问题&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 产品层面&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **文档先行**：好的API文档能让开发者快速上手，降低接入门槛&lt;/p&gt;&lt;p&gt;2. **示例代码**：提供Vue/React/小程序等多语言示例，覆盖主流技术栈&lt;/p&gt;&lt;p&gt;3. **渐进式开放**：先开放基础接口，逐步开放高级能力&lt;/p&gt;&lt;p&gt;4. **社区运营**：建立开发者社区，收集反馈，持续改进&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 商业层面&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **灵活接入**：提供共享API和独立部署两种模式，满足不同阶段需求&lt;/p&gt;&lt;p&gt;2. **公益初心**：始终记得为什么出发，为公益项目降低技术门槛&lt;/p&gt;&lt;p&gt;3. **可持续发展**：合理的商业化能让平台更好地服务公益&lt;/p&gt;&lt;p&gt;4. **开放共赢**：欢迎更多项目接入，共同创造价值&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 展望&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;未来计划：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **扩展服务**：验证服务已支持邮箱验证（发送验证码、邮箱验证）和阿里云短信验证（代码已完成并测试通过），后续更换通过审核的短信模板ID即可正常使用&lt;/p&gt;&lt;p&gt;2. **多区域部署**：在更多地区部署节点，降低延迟&lt;/p&gt;&lt;p&gt;3. **AI能力开放**：将AI算命等服务标准化后对外开放&lt;/p&gt;&lt;p&gt;4. **社区建设**：建立开发者社区，鼓励共享代码和经验&lt;/p&gt;&lt;p&gt;5. **接入示例**：提供更多接入示例（Vue、React、微信小程序等）&lt;/p&gt;&lt;p&gt;6. **管理后台**：开发可视化的域授权管理系统&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 接入指南&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 快速接入&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1. **联系授权**：通过微信、邮箱或电话申请域名授权&lt;/p&gt;&lt;p&gt;2. **获取密钥**：获取项目的API密钥和配置信息&lt;/p&gt;&lt;p&gt;3. **配置调用**：根据文档配置API调用&lt;/p&gt;&lt;p&gt;4. **测试上线**：本地测试通过后即可上线&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**本地开发说明**：&lt;/p&gt;&lt;p&gt;- localhost、127.0.0.1等本地域名默认已授权&lt;/p&gt;&lt;p&gt;- 开发过程中无需额外配置&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;### 技术支持&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;- **微信**：kmwmkj&lt;/p&gt;&lt;p&gt;- **邮箱**：admin@lck.yn.cn&lt;/p&gt;&lt;p&gt;- **电话**：15687658489（微信同号）&lt;/p&gt;&lt;p&gt;- **API文档**：https://api.micro.lck.yn.cn/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;## 结语&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;技术不仅是工具，更是一种改变世界的力量。作为一名开发者，我有幸能用自己的专长帮助他人，这让我感到无比充实。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;我希望通过这个共享API平台，降低技术门槛，让更多人能够快速实现自己的想法。无论你是想做公益项目，还是想开发商业应用，都可以在这里找到你需要的基础能力。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;如果你也想接入我的共享API平台，欢迎联系我。让我们一起用技术创造价值，让世界变得更美好一点。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**联系方式**：&lt;/p&gt;&lt;p&gt;- 微信：kmwmkj&lt;/p&gt;&lt;p&gt;- 邮箱：admin@lck.yn.cn&lt;/p&gt;&lt;p&gt;- 电话：15687658489（微信同号）&lt;/p&gt;&lt;p&gt;- 网关地址：https://api.micro.lck.yn.cn/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;**作者简介**：李成坤（Ckli），后端工程师，系统架构师，技术总监。从事PHP开发近20年，现任云南某科技公司技术总监。热衷于公益事业，用技术帮助需要帮助的人。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;个人主页：https://www.lck.yn.cn/&lt;/p&gt;&lt;p&gt;技术博客：https://blog.lck.yn.cn/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 12 Feb 2026 18:54:25 +0800</pubDate></item><item><title>宝塔的情况下 certbot 证书安装管理(亲测)</title><link>https://blog.lck.yn.cn/?id=10</link><description>&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;1，安装&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;code class=&quot;  language-undefined&quot; style=&quot;font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; font-size: 12px; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;yum install certbot python3-certbot-nginx -y&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;2,检查一下nginx的配置文件&lt;/p&gt;&lt;pre class=&quot;line-numbers language-undefined highlighter-hljs&quot; highlighted=&quot;true&quot; has-selection=&quot;true&quot; style=&quot;transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; margin: 10px auto; color: rgb(75, 75, 75); font-size: 13px; background-color: rgb(255, 255, 255);&quot;&gt;nginx&amp;nbsp;-t&lt;/pre&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;3,宝塔安装的，nginx目录没有在etc下，会有错误提示，需要更改下命令，加上nginx的目录配置&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;certbot --nginx --nginx-server-root=/www/server/nginx/conf/&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;4，运行成功后，&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;第一个填写使用的邮箱&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;第二个选择Y&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;第三个选择你要配置的域名的序号&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;5，重启nginx&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;6，证书只有3个月的有效期，需要设置一个定时任务，之后增加上&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;7，&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px; overflow-wrap: break-word; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box;&quot;&gt;设置自动续签，&lt;/span&gt;为了避免手动续签的麻烦，可以将续签操作添加到crontab计划任务中（执行命令 crontab -e ，把以下定时任务内容写入），确保证书在到期前自动更新：&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px; overflow-wrap: break-word; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box;&quot;&gt;0&amp;nbsp;0&amp;nbsp;1&amp;nbsp;*&amp;nbsp;*&amp;nbsp;certbot&amp;nbsp;renew&amp;nbsp;--quiet&amp;nbsp;--renew-hook&amp;nbsp;&amp;#39;sudo&amp;nbsp;systemctl&amp;nbsp;reload&amp;nbsp;nginx&amp;#39;&amp;nbsp;&amp;gt;&amp;nbsp;/dev/null&amp;nbsp;2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin: 10px auto; color: rgb(75, 75, 75); font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;特别说明：来源于网络，但本人已亲测整理通过。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Mon, 22 Dec 2025 21:47:18 +0800</pubDate></item><item><title>七家坡的 “摆渡人”：在代码与乡野间，搭一座公益的桥</title><link>https://blog.lck.yn.cn/?id=9</link><description>&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;敲下最后一行代码，我望着电脑屏幕上 “七家坡基层互助站” 的顺风车页面，上面 “燃灯寺→七家坡” 的行程信息清晰可见。窗外没有高楼大厦的霓虹，只有乡野夜晚的静谧，可我知道，这行代码背后，是无数个等待着 “被摆渡” 的乡亲。&lt;/div&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;做公益这件事，我走了好多年。中间有过委屈，有过难，甚至看着自己搭建的平台，明明能帮人，却因 “不会吆喝” 而少有人问津时，也会陷入迷茫。但每当想起乡镇里，有人为了赶一趟班车，天不亮就守在路边；残障朋友想找份能做的活，却被大平台的门槛挡在门外；还有那些假期里，为买不到票、怕堵车而焦虑的身影，我就觉得，手里的键盘还得继续敲。&lt;/div&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;现在的 “七家坡基层互助站”，技术上，我用 Swoft2.0 搭建独立网关和服务，让数据库与服务分离部署，为的是高可用、高并发，能承载更多乡亲的使用需求。前端从微信小程序转向 Vue3 做 PC+H5 自适应，绕开企业认证的各种限制，就想让更多人，哪怕是乡镇村级的乡亲，都能无阻碍地用上。&lt;/div&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;平台里的顺风车 / 拼车服务，是我扎根基层的第一个尝试。大假里，有人本就要从 A 点到 B 点，愿意捎上同路的人；也有人买不到票，或是不想开车添堵，或是想省点钱。这个平台，就是要把这些需求连起来。后续，我还会上线运营班次查询，让乡亲们不用再在路边盲目等车；做残障招聘，帮残障朋友找到能实现价值的工作；还有家政等服务，一步步来，做完一个就上线一个。&lt;/div&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;有人说，腾讯、阿里、美团这些大平台已经做得够好。可我清楚，他们的出发点和模式不同，带着资本的属性，很多服务到了省市级就难再下沉。而我要做的，就是补这个缺口，做乡亲们用得上、用得顺的公益平台。&lt;/div&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;这些年，我一头扎进深层技术，对美感没什么研究，拍不出多精致的照片。但我站在乡镇街头，指着电脑上的平台页面时，心里是踏实的。因为我知道，这不是什么花哨的东西，是能真真正正帮到人的工具。&lt;/div&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;我信儒释道，却不受限于任何一教，只秉持着 “持身正，不损人” 的念头。技术是术，本身无好坏，用它来为乡亲们搭一座公益的桥，就是我认定的 “正”。&lt;/div&gt;&lt;div class=&quot;auto-hide-last-sibling-br paragraph-pP9ZLC paragraph-element br-paragraph-space&quot; style=&quot;outline: none; -webkit-font-smoothing: antialiased; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); border: 0px solid; margin: 8px 0px; padding: 0px 4px; line-height: 28px; overflow-anchor: auto; font-size: 16px; font-family: ui-sans-serif, system-ui, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; text-wrap-mode: wrap; background-color: rgb(252, 252, 252);&quot;&gt;未来的路还长，代码要继续写，服务要继续加。我只想做七家坡，做更多基层地方的 “摆渡人”，在代码的世界与乡野的土地间，稳稳地搭起一座公益的桥。&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;img src=&quot;https://blog.lck.yn.cn/zb_users/upload/2025/09/202509281759035443748443.jpg&quot; title=&quot;顺风车.jpg&quot; alt=&quot;顺风车.jpg&quot;/&gt;&lt;/p&gt;</description><pubDate>Sun, 28 Sep 2025 10:38:30 +0800</pubDate></item><item><title>熊猫库存，不只是库存----企业数字化移动办工系统（数字企业SaaS系统）</title><link>https://blog.lck.yn.cn/?id=8</link><description>&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;strong&gt;一、系统介绍&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;1-01、应用名称&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;熊猫库存，不只是库存----企业数字化移动办工系统（数字企业SaaS系统）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px; color: #00B0F0;&quot;&gt;1-02、部署&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;系统可公有化部署，也可私有化部署（应对某些产品OR数据为高隐私，不便让让外部人员看到的产品）&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;1-03、适用场景及基本功能&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A：）适用于一切实体生产或原材料企业数字化转型。销售、借还、结算，等数据随着线上操作自动生成。省去人工记录、统计等不可避免的错误等。使企业全身心投入到自己的生厂OR加工中去。&lt;/p&gt;&lt;p&gt;若产品为贵重、稀缺类，本系统还支持服务商（担保服务）&lt;/p&gt;&lt;p&gt;B：）适用于直播带货的企业OR个人对所需货品的 借、还、售&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;1-04、特色&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A：）支持多仓库。（一个商户可以有多个仓库）&lt;/p&gt;&lt;p&gt;B：）支持员工及权限管理。（老板帐号不受权限控制，员工帐号可以分别给货品操作、帐单权限）&lt;/p&gt;&lt;p&gt;C：）支持只做熟人生意。（关闭公开展示后，其他人员在供货中心看不到本货品。仅货主方能从仓库中选择并创建订单）&lt;/p&gt;&lt;p&gt;D：）支持物品曝光。（开启公开展示后，供货中心可见且可下单。可推入地滩区展示。货品可在PC端引流展示）&lt;/p&gt;&lt;p&gt;E：）支持多价格。（成本价、借货价、一口价），借货价：可默认也可因人而异。&lt;/p&gt;&lt;p&gt;F：）支持服务商。（为借还货双方提供送货及结算服务，使借还双方不用接触，以确保货品、资源、财产等安全）&lt;/p&gt;&lt;p&gt;G：）支持电子帐单。（自动生成电子帐单，并可以打印纸质帐单。线上、线下 双保险）&lt;/p&gt;&lt;p&gt;H：）支持货主自定义货号、可生成系统唯一条码。（条码与商户绑定，当条码所绑定的货品售出后，可另绑定货品）&lt;/p&gt;&lt;p&gt;I：）支持再次转借、售。（确认收货后，会在借货方仓库自动生成货品基本数据，商户可设置价格后再次转借、售）&lt;/p&gt;&lt;p&gt;J：）支持一键导图。（保存本地，用户自行到其他所有平台售卖）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;strong&gt;二、系统使用（微信小程序）&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;2-01，注册&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;系统支持 用户名+密码、手机号+密码、邮箱号+密码 三种常规注册方式+微信登录自动注册方式。且册并登录成功后，可添加、解绑其他登录方式。微信登录自动生成的用户未发生业务时，可以自行注销。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0; font-size: 18px;&quot;&gt;2-02，实名认证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;只要是后期需要操作的帐号，都需要进行实名认证（国家公安库核实）&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-03，企业入驻&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-04，创建仓库&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-05，邀情微信好友为员工&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;（可操作业务）&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-06，员工权限管理&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-07，产品管理&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;（添加，编辑，特殊属性管理等）&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-08，生成订单&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;（两种方式 a：取货方在供货中心选对货品下单 b：供货方在仓库中选择货品下单）&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-09，订单操作&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;，若为供货方创建则取供双方员工扫码完成货品交接，否则双方匀不直接操作，而是与服务商操作&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-10，还货（结算）&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;。注：目标商户只能是来源商户。未还货或结算完成的货物可再次操作。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;2-11，订单查看&lt;span style=&quot;font-size: 14px; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #00B0F0;&quot;&gt;&lt;span style=&quot;font-size: 14px; color: #000000;&quot;&gt;（&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;boss 或 有订单权限的员工可以看所有员工的订单，其他员工仅能看到自己产生的订单）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 31 Mar 2023 09:52:26 +0800</pubDate></item><item><title>TP6 swagger(自动生成 api 接口文档，根据需要开启或关闭)</title><link>https://blog.lck.yn.cn/?id=7</link><description>&lt;p&gt;[&lt;span style=&quot;color: #E36C09;&quot;&gt;以下内容来自本人一边做一边记录。本打算直接录视频，但发现有些问题更需要先解决。固先发文字教程&lt;/span&gt;]&lt;/p&gt;&lt;p&gt;[虽然还不太会录，但是今天还是录成了视频]&lt;/p&gt;&lt;p&gt;&lt;video class=&quot;edui-upload-video    &quot; controls=&quot;&quot; preload=&quot;none&quot; width=&quot;420&quot; height=&quot;280&quot; src=&quot;https://blog.lck.yn.cn/zb_users/upload/2021/06/14/TP6_swagger.mp4&quot; data-setup=&quot;{}&quot;&gt;&lt;source src=&quot;https://blog.lck.yn.cn/zb_users/upload/2021/06/14/TP6_swagger.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;一，安装配置 TP6，及多应用。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;【这里就不说了,自行查看】&lt;/p&gt;&lt;p&gt;官方手册 https://www.kancloud.cn/manual/thinkphp6_0&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;二，打开 php 项目安装 swagger-php 扩展&lt;/p&gt;&lt;p&gt;composer require zircote/swagger-php&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;三，为 swagger 添加路由&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;注意：分别在多应用的路由中写路由，而不是到全局路由中写&lt;/p&gt;&lt;p&gt;比如：项目下有 三个应用 index(pc站应用) api(前台接口应用) admin（后台接口应用）&lt;/p&gt;&lt;p&gt;因为，api和admin应用需要生成文档，所以在其下的路由中书写，不需要的应用就不用管它。&lt;/p&gt;&lt;p&gt;我的例子中路径分别为：&lt;/p&gt;&lt;p&gt;app\api\route\route.php 中内容如下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;?php&lt;/p&gt;&lt;p&gt;use think\facade\Route;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Route::get(&amp;#39;/swagger&amp;#39;, function() {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;$openapi = \OpenApi\scan(&amp;#39;../app/api/controller&amp;#39;);//各应用下的controller&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; header(&amp;#39;Content-Type: application/json&amp;#39;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; echo $openapi-&amp;gt;toJson();&lt;/p&gt;&lt;p&gt;});&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;app\admin\route\route.php （照着上面写，记得把路径中的api改成admin）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;四， 下载 swagger 的用户界面 swagger-ui&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;下载，clone 都行。 你自怎么用方便就怎么用&lt;/p&gt;&lt;p&gt;git clone https://github.com/swagger-api/swagger-ui.git&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;解压后项目根目录下的 public 下 swagger-ui 目录&lt;/p&gt;&lt;p&gt;修改 public/swagger-ui/dist/index.html 文件中的 数据来源&lt;/p&gt;&lt;p&gt;如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // url: &amp;quot;https://petstore.swagger.io/v2/swagger.json&amp;quot;, // 这里是官方给的实例接口数据&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url: &amp;quot;/swagger/docs/swagger.json&amp;quot;, //这里是我们自己项目中自动生成的接口数据&lt;/p&gt;&lt;p&gt;还有语言 en 改为 zh-cn 。也可以不管它&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;五，建控制器 Swagger.php (&lt;span style=&quot;color: #FF0000;&quot;&gt;注意：很多教程都掉了这一步，&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 13px; background-color: #FFFFFF;&quot;&gt;以讹传讹。这也是我会去亲测后，发完整教程的原因。&lt;/span&gt;&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;在需要生成文档的应用下的 controller 目录下建控制器&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;这里的控制器名称来源于第三步中写的路由地址 swagger&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Swagger.php 中 只需要有类 Swagger 就可以了，不用写方法。&lt;/p&gt;&lt;p&gt;同时写入文档配置信息（共用的部份），以后要改也方便，只需要改这个文件里的配置&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;如下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;?php&lt;/p&gt;&lt;p&gt;namespace app\api\controller;&lt;/p&gt;&lt;p&gt;use think\Request;&lt;/p&gt;&lt;p&gt;use app\api\Base;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;/**&lt;/p&gt;&lt;p&gt;&amp;nbsp;* @OA\Swagger(&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;schemes={&amp;quot;http&amp;quot;,&amp;quot;https&amp;quot;},&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;host=&amp;quot;api.cnfeicui.com&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;basePath=&amp;quot;/&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;@OA\Info(&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;version=&amp;quot;1.0.0&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;title=&amp;quot;中国翡翠API-【前台：支持在线测试】&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;description=&amp;quot;注：请在接口路径前加上应用地址!如下&amp;lt;br&amp;gt;1、线上&amp;lt;br&amp;gt;前台API添加：http://api.cnfeicui.com/&amp;lt;br&amp;gt;后台api添加：http://api.admin.cnfeicui.com/&amp;lt;br&amp;gt;2、线下&amp;lt;br&amp;gt;前台API添加：http://api.dev.cnfeicui.com/&amp;lt;br&amp;gt;后台api添加：http://api.admin.dev.cnfeicui.com/&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;termsOfService=&amp;quot;&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@OA\Contact(&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;email=&amp;quot;admin@lck.yn.cn&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;),&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@OA\License(&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;name=&amp;quot;cnfeicui&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;url=&amp;quot;https://api.cnfeicui.com&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;),&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;@OA\ExternalDocumentation(&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;description=&amp;quot;http://www.lck.yn.cn&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;url=&amp;quot;http://www.lck.yn.cn&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; @OA\SecurityScheme(&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;type=&amp;quot;http&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;in=&amp;quot;header&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;name=&amp;quot;Authorization&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;scheme=&amp;quot;bearer&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;securityScheme=&amp;quot;bearerAuth&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;bearerFormat=&amp;quot;JWT&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;*&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;* )&lt;/p&gt;&lt;p&gt;&amp;nbsp;*/&lt;/p&gt;&lt;p&gt;class Swagger extends Base&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;六，在需要生成文档的接口方法前，以 swagger 的要求写注释，即可自动生成接口文档&lt;/p&gt;&lt;p&gt;如需对登录（ Login.php ）接口生成文档。&lt;/p&gt;&lt;p&gt;&amp;lt;?php&lt;/p&gt;&lt;p&gt;namespace app\api\controller;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;use app\api\Base;&lt;/p&gt;&lt;p&gt;use think\Request;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;class Login extends Base&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; /**&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; * @OA\Post(path=&amp;quot;/login/system&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;tags={&amp;quot;用户登录&amp;quot;},&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;summary=&amp;quot;系统帐号登录&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;@OA\Parameter(name=&amp;quot;deviceid&amp;quot;, in=&amp;quot;header&amp;quot;,description=&amp;quot;设备唯一值&amp;quot;,required=true,@OA\Schema(type=&amp;quot;string&amp;quot;)),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;@OA\RequestBody(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;@OA\MediaType(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp;mediaType=&amp;quot;content-type/json&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@OA\Schema(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@OA\Property(description=&amp;quot;帐 号&amp;quot;, property=&amp;quot;identifier&amp;quot;, type=&amp;quot;string&amp;quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@OA\Property(description=&amp;quot;密 码&amp;quot;, property=&amp;quot;credential&amp;quot;, type=&amp;quot;string&amp;quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;required={&amp;quot;identifier&amp;quot;,&amp;quot;credential&amp;quot;})&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;@OA\Response(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response=&amp;quot;100&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;description=&amp;quot;返回结果请以真实API拿数到数据为准&amp;quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; *&amp;nbsp; &amp;nbsp;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; * )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; public function system(Request $request)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return json([&amp;#39;code&amp;#39;=&amp;gt;0,&amp;#39;msg&amp;#39;=&amp;gt;&amp;#39;这里是返回提示&amp;#39;,&amp;#39;data&amp;#39;=&amp;gt;[]]);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;自此，swagger 就算配成功。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;七，由于安全等多方面原因，我们生产环境是需要关闭 swagger 的&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;回到第三步，我们添加的路由文件中&lt;/p&gt;&lt;p&gt;先引入 Env&lt;/p&gt;&lt;p&gt;use think\facade\Env;&lt;/p&gt;&lt;p&gt;再修改路由方法：在其中加入环境变量判断。&lt;/p&gt;&lt;p&gt;在需要开启文档的环境 .env 文件中 配置 SWAGGER.START 的值为：true 。 未配置或 false 提示关闭&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;修改后的路由文件( route.php )如下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;?php&lt;/p&gt;&lt;p&gt;use think\facade\Route;&lt;/p&gt;&lt;p&gt;use think\facade\Env;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Route::get(&amp;#39;/swagger&amp;#39;, function() {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;if(Env::get(&amp;#39;SWAGGER.START&amp;#39;,0)){&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;$openapi = \OpenApi\scan(&amp;#39;../app/api/controller&amp;#39;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; header(&amp;#39;Content-Type: application/json&amp;#39;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; echo $openapi-&amp;gt;toJson();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;}else{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;echo&amp;#39;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;quot;openapi&amp;quot;: &amp;quot;3.0.0&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;quot;info&amp;quot;: {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;title&amp;quot;: &amp;quot;中国翡翠API-【前台：支持在线测试】&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;description&amp;quot;: &amp;quot;当前环境，已关闭！&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;termsOfService&amp;quot;: &amp;quot;&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;contact&amp;quot;: {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;email&amp;quot;: &amp;quot;admin@lck.yn.cn&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;license&amp;quot;: {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;name&amp;quot;: &amp;quot;Private License&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;url&amp;quot;: &amp;quot;URL to the license&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; },&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;quot;paths&amp;quot;: {},&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;quot;components&amp;quot;: {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;securitySchemes&amp;quot;: {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;bearerAuth&amp;quot;: {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;type&amp;quot;: &amp;quot;http&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;name&amp;quot;: &amp;quot;Authorization&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;in&amp;quot;: &amp;quot;header&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;bearerFormat&amp;quot;: &amp;quot;JWT&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;scheme&amp;quot;: &amp;quot;bearer&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; },&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;quot;externalDocs&amp;quot;: {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;description&amp;quot;: &amp;quot;http://www.lck.yn.cn&amp;quot;,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;url&amp;quot;: &amp;quot;http://www.lck.yn.cn&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;}&amp;#39;;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;});&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 13 Jun 2021 01:39:23 +0800</pubDate></item><item><title>10秒一个API接口文档，你也可以。</title><link>https://blog.lck.yn.cn/?id=6</link><description>&lt;p&gt;一，phprap 的各方面优点，我就不说了。需要看的朋友上其官方网站 http://www.phprap.com&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;二，eidt by Ckli&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1，修改数据库字段类型，长度&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;2，修改model，使添加API接口时自动生成需重复性填写内容，解除后端人员写API文档的烦恼。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;3，修改view中默认网关地址。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;4，数据库在 根目录下 lck-data 下，登录邮箱地址：258205740@qq.com 默认密码：123456&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;5，Ckli 官方网站： http://www.lck.yn.cn Ckli blog：http://blog.lck.yn.cn 欢迎交流&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;6，下载地址：https://gitee.com/lck8203/phprap&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;三，线上测试观看&lt;/p&gt;&lt;p&gt;&lt;video class=&quot;edui-upload-video  &quot; controls=&quot;&quot; preload=&quot;none&quot; width=&quot;420&quot; height=&quot;280&quot; src=&quot;https://blog.lck.yn.cn/zb_users/upload/2019/08/201908211566399905626990.mp4&quot; data-setup=&quot;{}&quot;&gt;&lt;source src=&quot;https://blog.lck.yn.cn/zb_users/upload/2019/08/201908211566399905626990.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/p&gt;</description><pubDate>Wed, 21 Aug 2019 22:58:30 +0800</pubDate></item><item><title>TP3.2.3(thinkphp3.2.3)  关联模型之---非主键关联（已亲测可用）</title><link>https://blog.lck.yn.cn/?id=5</link><description>&lt;p&gt;TP3.2.3(thinkphp3.2.3)&amp;nbsp; 关联模型之---非主键关联（已亲测可用）、TP5，暂无时间测试，如果人兄有测试结果，烦请&amp;nbsp;发邮件给我一下，我好做一下更改。以方便遇到同样问题的朋友、&lt;/p&gt;&lt;p&gt;我的应用场景是：有一个表（风格：style表---字段：1，id 2，title）,另一个表（安例：anli：字段：style&amp;nbsp;存储&amp;nbsp;风格表中的 title&amp;nbsp;的内容，这里非&amp;nbsp;id，也非主键）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;?php&lt;/p&gt;&lt;p&gt;namespace Wap\Model;&lt;/p&gt;&lt;p&gt;use Think\Model\RelationModel;&lt;/p&gt;&lt;p&gt;class StyleModel extends RelationModel{&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; protected $_link = array(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //风格对应anli&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;anlis&amp;#39;=&amp;gt;array(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;mapping_type&amp;#39; =&amp;gt; self::HAS_ONE,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;class_name&amp;#39;&amp;nbsp; =&amp;gt; &amp;#39;Anli&amp;#39;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;mapping_key&amp;#39; =&amp;gt;&amp;#39;title&amp;#39;,//&amp;nbsp; style&amp;nbsp;表字段。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;foreign_key&amp;#39; =&amp;gt;&amp;#39;style&amp;#39;, //&amp;nbsp;anli（表），即关联模型对应表中的字段名。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;mapping_order&amp;#39; =&amp;gt; &amp;#39;id ASC&amp;#39;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;#39;mapping_fields&amp;#39;&amp;nbsp; =&amp;gt; &amp;#39;id,pic_m_l&amp;#39;,&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;希望对你有帮助。&lt;/p&gt;&lt;p&gt;申明：本文所道之处，由本人（Lck，Ckli）亲测可用。&lt;/p&gt;</description><pubDate>Mon, 29 Apr 2019 14:50:18 +0800</pubDate></item><item><title>laravel-admin 集成 ueditor </title><link>https://blog.lck.yn.cn/?id=4</link><description>&lt;p&gt;因为我最近 集成 ueditor 看到了网上很多文章，要么这里错了，要么哪里错了。现在我把过程发给大家，按照我的步骤走下就能OK了哈。&lt;/p&gt;&lt;p&gt;1，下载ueditor 解压放入你的项目&amp;nbsp;&amp;nbsp;/public/packages/&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;2，&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;app/Admin/Extensions/&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 下新建文件名：&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;UEditor.php&amp;nbsp; &amp;nbsp;文件内容如下：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp;namespace App\Admin\Extensions;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp;use Encore\Admin\Form\Field;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;class UEditor extends Field&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;protected $view = &amp;#39;admin.ueditor&amp;#39;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;protected static $css = [];&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;protected static $js = [&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;#39;/packages/utf8-php/ueditor.config.js&amp;#39;,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;#39;/packages/utf8-php/ueditor.all.js&amp;#39;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;];&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;public function render()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; $name = $this-&amp;gt;formatName($this-&amp;gt;column);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; $this-&amp;gt;script = &amp;lt;&amp;lt;&amp;lt;EOT&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; //解决第二次进入加载不出来的问题&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; UE.delEditor(&amp;quot;container&amp;quot;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; var ue = UE.getEditor(&amp;#39;container&amp;#39;,{&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; elementPathEnabled: false,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; enableContextMenu: false,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; autoClearEmptyNode: true,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; wordCount: false,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; imagePopup: false,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;autotypeset: {indent: true, imageBlockLine: &amp;#39;center&amp;#39;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; ue.ready(function() {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ue.execCommand(&amp;#39;serverparam&amp;#39;, &amp;#39;_token&amp;#39;, &amp;#39;{{ csrf_token() }}&amp;#39;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;EOT;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; return parent::render();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;3，&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&amp;nbsp;resources/views/admin/&amp;nbsp; 下新建文件：ueditor.blade.php&amp;nbsp; 内容如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;lt;div class=&amp;quot;form-group {!! !$errors-&amp;gt;has($errorKey) ?: &amp;#39;has-error&amp;#39; !!}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;lt;label for=&amp;quot;{{$id}}&amp;quot; class=&amp;quot;col-sm-2 control-label&amp;quot;&amp;gt;{{$label}}&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;lt;div class=&amp;quot;col-sm-8&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; @include(&amp;#39;admin::form.error&amp;#39;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;textarea type=&amp;#39;text/plain&amp;#39; style=&amp;quot;height:400px;&amp;quot; id=&amp;#39;container&amp;#39; id=&amp;quot;{{$id}}&amp;quot; name=&amp;quot;{{$name}}&amp;quot; placeholder=&amp;quot;{{ $placeholder }}&amp;quot; {!! $attributes !!}&amp;nbsp; class=&amp;#39;ueditor&amp;#39;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {!! old($column, $value) !!}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/textarea&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;nbsp; @include(&amp;#39;admin::form.help-block&amp;#39;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;4，&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;app/Admin/bootstrap.php&amp;nbsp; &amp;nbsp; 修改此文件内容如下（如果没有，请自已新建）：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;use App\Admin\Extensions\UEditor;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;use Encore\Admin\Form;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFC000;&quot;&gt;Form::extend(&amp;#39;ueditor&amp;#39;, UEditor::class);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;5，在你自己控制器中的 form 方法里调用如：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFC000;&quot;&gt;$form-&amp;gt;ueditor(&amp;#39;experience&amp;#39;,&amp;#39;职业经历&amp;#39;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;6，上图看效果&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://blog.lck.yn.cn/zb_users/upload/2018/11/201811291543497025449325.png&quot; title=&quot;ssssssss.png&quot; alt=&quot;ssssssss.png&quot; width=&quot;750&quot; height=&quot;404&quot; border=&quot;0&quot; vspace=&quot;0&quot; style=&quot;width: 750px; height: 404px;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #2F2F2F; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2f2f2f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;最后，因为ueditor 官方提供下载地址是国外的，如果你下载不了，可以去我的 blog 找我提供的百度网盘下载地址和提取码。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2f2f2f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2f2f2f&quot; face=&quot;-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;Lck 的 blog&amp;nbsp;&lt;a href=&quot;https://blog.lck.yn.cn/?id=3&quot; target=&quot;_blank&quot;&gt;https://blog.lck.yn.cn/?id=3&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description><pubDate>Thu, 29 Nov 2018 20:49:55 +0800</pubDate></item><item><title>百度编辑器(ueditor)下载不了的同学看过来！</title><link>https://blog.lck.yn.cn/?id=3</link><description>&lt;p&gt;最近因为想把百度编辑器添加到 laravel-admin 去官网下载。一直都下不出来。经查看，官网放出的连接是国外的。后来想起自已电脑安装了 蓝色&amp;nbsp;chrome （已跳墙）。马上打开，几十秒就下下来了。现为了方便国内未跳墙小伙伴们下载。本人已将下载的&amp;nbsp;ueditor1_4_3_3-utf8-php.zip&lt;/p&gt;&lt;p&gt;上传至百度云盘（未做过任何更改）。以方便大家。以下是下载链接和提取码：&lt;/p&gt;&lt;p&gt;&amp;nbsp;链接: https://pan.baidu.com/s/1y3U_fblHWoQPOSoIhbU8gQ 提取码: p6wp&amp;nbsp;&lt;/p&gt;</description><pubDate>Thu, 29 Nov 2018 19:49:17 +0800</pubDate></item></channel></rss><!--55.54 ms , 6 query , 987kb memory , 0 error-->