• Stars
    star
    244
  • Rank 159,730 (Top 4 %)
  • Language
    PHP
  • License
    GNU General Publi...
  • Created about 8 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

基于Web界面的Rest风格API生成器For LazyPHP4

LazyRest4 完全手册

[TOC]

简介

LazyRest,是一个基于Web的类Rest风格API生成器。LazyRest4(以下简称LR4)是为LazyPHP4专门定制的全新设计的版本,但只要简单的修改代码模板,就可以为其他的框架生成代码。

和之前的版本相比,LR4具有以下特性:

  • 直接生成最终代码,更好调试、更高性能。
  • 全新的交互界面,更漂亮和便捷。
  • 按接口而非数据表设计界面,具有更大的灵活性。
  • 本身不需要数据库,项目配置直接保存成文件,方便分享。

请使用Chrome浏览器访问本应用,其他浏览器并未做兼容性处理。

安装

获取源文件

下载安装包,并解压。或者直接Git Clone。 Repo地址: https://github.com/easychen/LazyRest4

将apache指定到对应目录

注意,必须将Document Root指定到LR4的根目录,否则会出现路径问题。

初始化项目

使用composer安装PHP依赖

composer install --no-dev

使用Bower安装JS依赖

cp sample.bowerrc .bowerrc 
bower install

修改URL重写规则

cp sample.htaccess .htaccess 

设置默认管理帐号

打开 /config/app.php 修改以下内容

$GLOBALS['lpconfig']['admin_email'] = 'your email';
$GLOBALS['lpconfig']['admin_password'] = 'your password';

如果配置正常,这时候访问Web根目录,LazyRest就已经可以使用了。

实战指南

为了更好的演示,我们选择一个真实需求来看看LR4到底怎么用。

需求

我们需要一个公司部门内使用的函数共享库。这个共享库位于公司内网,公司员工可以注册帐号,登入帐号以后可以添加、下载、修改和删除函数。添加函数时可以将其设置为私有,这样别人就无法浏览和下载该函数了。

设计MySQL表

我们使用PHPMyAdmin来设计数据表。新建一个库,coderemote。总共两张表,一张user表用来存放开发者帐号、领一张code表,用来存放函数。

user表结构如下:

设计数据表时需要注意以下两点:

  • 每个表需要有id字段,这个字段在查询接口中用于since_id,这个后文详细讲。
  • 每个字段需要添加注释,注释的内容是字段的中文名。

code表结构如下:

为了方便显示,我们对账户名做了冗余(uname)字段,同时通过private字段来标识是否私有。

索引一般在整个API完成后,根据SQL来添加,这里就暂时跳过了。

创建新项目

LR4采用项目文件保存数据,所以使用方式类似软件。已有项目可以直接上传项目文件,然后继续,这里我们直接「创建新项目」。

在设计接口之前,我们需要把数据库配置下。这样在添加字段时,可以便捷的使用数据库的信息。点击顶导航右侧的图标,设置好Mysql信息。注意这个数据库可以是远程的,并不要一定和LR在一台机器上。

点击保存后,LR会连接数据库,并把数据表信息缓存起来。所以如果后续有数据库变动,请再到设置页面,点一遍保存来刷新数据表信息。

创建接口

然后我们来创建接口。首先是帐号注册接口。

一般我会把写操作设置为POST,把读操作设置为GET。这里我并不严格遵守RESTful的规范,因为觉得这样更简单一些。

目标数据表是我们生成SQL时需要操作的数据表,如果要使用联表操作,则目标数据表可以不选。

然后是输入字段和输入过滤代码。简单的说,「输入字段」部分,会帮你自动生成输入过滤代码,包括输入检查,类型转换等。而如果你觉得生成的代码不好用,或者没有把事情做完时,可以在「输入过滤代码」部分进行补充。

然后我们来添加字段,点击「添加新字段」,然后会出现字段设置界面。因为是LazyRest,所以当然不会让你挨个手工去填写,我们在右边做了快速输入。在「来自数据库」tab下,选择「user」表,然后选上Email字段,点「填至左侧」,LR会根据数据表信息自动填上一部分信息。

因为email字段设置为了not null,所以检查函数默认启用了check_not_empty。但是则会这个函数不够强,我们需要检查是否为email,所以我们自己写一个,先把名字写上(注意LP4中的检查函数必须以check_开头,过滤函数则没有限制):

保存好。LR也直接提供了公共函数的在线编写界面,点击顶导航第二个图标🖋,会弹出代码编辑图层。

保存后,点右上角关掉。接着再把其他帐号注册接口需要的字段添进来。 我们不希望密码明文存储,所以我们在输入过滤代码中对它进行sha1编码(生产环境需要更强的密码策略)。

<?php
// 在自动化输入检查之后执行
// 可以直接使用input里边的变量
$password = sha1( $password );
?>		

这样输入部分就完成。接下来看业务逻辑代码。LR预置了添加、修改、列表、删除四大内业务逻辑模板,这些模板你都可以在/codetpl/code目录下进行修改。

这里我们选添加,添加模板预置了唯一字段检查逻辑。在我们的需求里,email字段是唯一的。于是把email字段加上。

这样核心逻辑就完成了。为了方便使用,在预置逻辑里,添加、修改和删除都会返回对应的那条数据的信息(用于提示,某某数据已经删除之类)。

所以这里还用到输出字段和输出过滤代码。这输入很像,但记住password字段其实是不需要返回的。

选完以后我们就可以保存接口了。

生成和测试代码

点击顶导航右三图标,代码会生成到controller目录下的LazyRestController.php。为了调试和部署方便,LR目前所有代码都放到这个文件里。

这时候就可以开始测试了。

	如果生成代码中有语法错,会导致LR整体报错,只需要删除生成的文件就好。

如果路由没有更新,请记得把LazyPHP4的自动重建路由开关打开。在/config/app.php中

	$GLOBALS['lpconfig']['buildeverytime'] = true;

测试接口

我一般使用PostMan来测试API,所以以下以它为例。

注意几个点:

  • 我们设置了这个接口只支持POST,所以用GET会提示404
  • LazyPHP4.5开始因为支持了Web界面,所以要在添加一个特殊的Header才能强制返回json。
'LP4-Request-Type':'json'

填好参数,接口已经正常工作了。

授权机制

在这个项目里,我们采用token机制:通过email和密码换取一个token,需要授权的接口,带上这个token来访问。

首先我们来做这个接口,在LR中再新建一个。顺便说句,点击这个图标就可以返回接口列表。

将email和password添加为输入字段,设置为必填。

然后我们这次直接自定义业务逻辑代码

<?php
// 首先取得用户信息
if( $user = get_line( "SELECT * FROM `user` WHERE `email` = '" . s( $email ) . "'" ) )
{
    if( $user['password'] == sha1( $password ) )
    {
        // 创建一个Session
        session_start();
        $_SESSION['uid'] = $user['id'];
        $_SESSION['uname'] = $user['name'];
        $_SESSION['level'] = $user['level'];
        
        return render_json( session_id() );
        
    }
    else
        return send_error( 'AUTH' , '错误的密码' );
}
else
    return send_error( 'INPUT' , '电子邮件不存在' );

Build一下代码,然后我们来测试。

这里我们直接把session_id当成token返回了。这样可以很好的利用上PHP本身的session机制。

然后我们来做一个需要权限的接口:添加代码,顺便把权限限制加上。

仍然是先设置输入字段。

这里需要注意的是,create_at的值不是来自REQUEST,而是来自php本身的。

将所属table写成「-phpfunction-」,并在过滤函数上填上函数名,LR就会把过滤函数的值返回给这个字段。

顺手在公共函数里把now实现了:

function now()
{
    return date("Y-m-d H:i:s");
}

uid和uname来自于也做类似处理,不过它们的值来自session。

function uid()
{
    return $_SESSION['uid'];
}

function uname()
{
    return $_SESSION['uname'];
}

最后我们来做权限控制。如果你查看一下生成好的代码,会发现在构造函数中有这么一段:

public function __construct()
{
   $noauth[] = 'user_lcadd_1460691333694';
   $noauth[] = 'user_lccustom_1460694654897';
       
   if( function_exists('lazyrest_auth_check') )
   {
   	if( !in_array( g('a') , $noauth ) )
   	{
			$this->auth();
			lazyrest_auth_check();
   	}
   }
}

可以看到,所有授权控制的「任意访问」设置为否的接口,都会通过lazyrest_auth_check函数进行权限检查。但是lazyrest_auth_check函数默认是没定义的,所以默认不生效。我们只需要在公共函数中把这个函数实现了,就完成了权限控制。

先看看$this->auth()的实现,在/controller/AuthedContrllor.php里边:

protected function auth()
{
	$token = t(v('_token'));
	if( strlen( $token ) > 0 )
	{
		session_id( $token );
	}
	
	session_start();
}

它接受_token参数,并把其作为session id,自动enable了session。所以我们只需要在lazyrest_auth_check里边简单的检查下$_SESSION数据是否正常就OK了。

function lazyrest_auth_check()
{
    if( intval( $_SESSION['level'] ) < 1 )
    {
        send_error( 'AUTH' , '当前权限不足以访问本接口' );
        exit;
    }
}

同时,如果对auth函数的实现不满意,可以直接覆盖它的实现。 保存后Build下代码,就可以测试了:

带上token,已经可以访问了。

其他预置接口

修改接口

id和code作为输入字段;业务逻辑代码选「 修改 」,WHERE子句添加id,选完全匹配。

然后因为只有自己才能修改自己的代码,所以在业务逻辑代码中加上权限检查:

if( $last['uid'] != uid() ) return send_error( 'AUTH' , '只能修改自己发布的函数' );

注意在UPDATE和DELETE预置模块中,会查询对应的记录,并保存到$last中供使用。

列表接口

列表接口很简单,预置的业务逻辑也是WHERE匹配,和前文一样处理就好。

下边是列表接口支持的参数:

  • _order:asc/dsec。
  • _order_by:字段名。
  • _since_id:从某个id开始返回。
  • _count:每次返回的数据条数,最多1000条。

但上文我们发现了一个问题,私有函数也被列出来。所以我们需要在业务逻辑处,进行调整,给where子句再加一个条件:

$add_where = " (`private` != 1 OR `uid` = '" . intval( $uid ) . "' ) ";

if( strlen( t( $where_sql ) ) < 1 )  $where_sql = 'WHERE ' . $add_where;
else $where_sql .= ' AND (' . $add_where . ')';		

要了解如何调整sql的拼接,直接查看生成好的代码是最好的办法。

另外,为了让查询的实现更简单点,LR预置的删除是直接删除,而非标记删除。

CodeRemote项目的LR文件,可以 点击这里查看 ;我还准备了一个只有用户注册和授权验证的LR文件,方便大家直接开始做业务逻辑。

部署

首先你要有一个可以运行的LazyPHP4环境,然后把LazyRestController.php放到controller目录下,再php _build.php 更新下路由就能用了。

其他

继续开发和贡献代码

如果你有兴趣给LR贡献代码,有几个我觉得很值得做的地方供参考:

  • 自动生成API的JS SDK。
  • 自动打包LazyRestController.php,并发布到云平台。可以生成phing文件来完成。
  • 整理并分享LR项目文件,让有同样需求的同学不用重复开发(记得分享的文件要干点数据库信息)。
  • 根据LR项目文件里边的数据库信息,在数据表不存在时,自动创建数据表。

几个开发Tips

  • 访问 /session 页面可以查看全部元数据。
  • 代码模板使用Twig引擎,挺好用的。
  • css使用less完成,php _build.php的时候会自动编译app.less到app.css

捐助

本来只是做来给自己用的,但因为很多同学表示也想用,就放出来了。写文档解释如何使用什么的挺费事,所以当LazyRest帮你节省了时间和精力之后,可以考虑打赏我一点零花钱 😁

微信

支付宝

More Repositories

1

howto-make-more-money

程序员如何优雅的挣零花钱,2.0版,升级为小书了。Most of this not work outside China , so no English translate
PHP
16,190
star
2

lean-side-bussiness

精益副业:程序员如何优雅地做副业
8,305
star
3

pushdeer

开放源码的无App推送服务,iOS14+扫码即用。亦支持快应用/iOS和Mac客户端、Android客户端、自制设备
C
4,353
star
4

one-person-businesses-methodology

一人公司方法论
3,220
star
5

stack-roadmap

方糖全栈路线图2023,为「从螺丝钉到一人企业」补全技能栈
PHP
3,063
star
6

CookieCloud

CookieCloud是一个和自架服务器同步浏览器Cookie和LocalStorage的小工具,支持端对端加密,可设定同步时间间隔。本仓库包含了插件和服务器端源码。CookieCloud is a small tool for synchronizing browser cookies and LocalStorage with a self-hosted server. It supports end-to-end encryption and allows for setting the synchronization interval. This repository contains both the plugin and the server-side source code
JavaScript
1,581
star
7

checkchan-dist

Check酱:监测网页内容变化,并发送异动到微信。亦支持http status、json和rss监测。配合自架云端,关电脑后也能运行。
JavaScript
1,532
star
8

openai-api-proxy

一行Docker命令部署的 OpenAI/GPT API代理,支持SSE流式返回、腾讯云函数 。Simple proxy for OpenAi api via a one-line docker command
JavaScript
1,450
star
9

openai-gpt-dev-notes-for-cn-developer

如何快速开发一个OpenAI/GPT应用:国内开发者笔记
Shell
1,403
star
10

wecomchan

微信推送服务Server酱的开源替代。通过企业微信向微信推送消息的配置文档、直推函数和可自行搭建的在线服务代码。
Go
1,233
star
11

docker2saas

An open source tool that lets you create a SaaS website from docker images in 10 minutes.
PHP
765
star
12

chatchan-dist

Chat酱独立部署版,docker方案自带代理
Dockerfile
729
star
13

catgate

CatGate is a small crawler framework based on Chrome extension . CatGate是一个基于浏览器插件的数据抓取工具。做成浏览器插件无需模拟登入,能最真实的模仿用户行为和特征。
Vue
673
star
14

TeamToy

企业协同办公工具TeamToy2(多人TODO版)官方Git源
PHP
662
star
15

LazyPHP

轻框架。包含一个前端控制器,20个常用函数和用于页面布局的Layout系统,10分钟即可学会。LP采用BSD开源协议,在代码内保留框架名即可随意商用。
PHP
573
star
16

rsspush

监测RSS变动,并发送最新内容到微信、Webhook 和 Telegram, Discord, Slack, Amazon SNS, Gotify 等数十个消息通道。
499
star
17

telechan

message api for telegram bot 可供多人发送消息的 telegram 机器人 api , 类似server酱的开源实现
TypeScript
414
star
18

not-only-fans

an open source, self-hosted digital content subscription platform like `onlyfans.com` with cryptocurrency payment
HTML
356
star
19

career-guide-for-cs-graduate

计算机系应届生求职指北
316
star
20

LazyPHP4

LazyPHP4 , an API first framework for php developer
PHP
315
star
21

MemberPrism2

open source alternative to memberstack / memberspace , but with both front and backend member-only content protection
PHP
273
star
22

http-t-shirts

Open source http status code T shirt · http状态码系列T恤设计稿
266
star
23

tumblr-like-exporter

Download tumblr photos you liked , or others liked . Or even images in your blog . It supports videos now , see README to enable it
PHP
262
star
24

botchan

基于微信测试号的ChatBot,对接OpenAI API
JavaScript
242
star
25

lianmilite

莲米粒是一个基于PHP+MySQL+微信小程序技术栈的、拥有用户登入、发布、修改、删除和转发信息、以及私信聊天模块的信息流应用。
PHP
233
star
26

deepgpt-dist

DeepGPT,类agentGPT/AutoGPT 工具,支持 api2d / 和自定义 openai key。此为静态网页独立部署版,部署方便
JavaScript
227
star
27

book-by-ai

Generate high-quality books with AI
JavaScript
216
star
28

TeamToy-Pocket

TeamToy是跨平台的团队TODO应用,官网 TeamToy.net。 TeamToyPocket是其移动客户端。本项目采用GPLV2协议,本分支代码用于在新浪移动云上直接打包。如果自行用PhoneGap打包,请将代码中<phonegap></phonegap>换成phonegap.js的路径。
JavaScript
203
star
29

LazyREST

可通过Web配置的REST Server,采用GPLV2授权
PHP
193
star
30

gpt-bat

GPT长文本批处理工具,Batch Processing tools for GPT
JavaScript
184
star
31

LazyAudioBook

将 txt 文件生成语音书。
PHP
167
star
32

flowdeer-dist

可用于深度思考和复杂流程的AI工具
163
star
33

LeanBase

143
star
34

aiapi

A Claude-driven, OpenAI specification-compliant API, free
135
star
35

onlytech-javascript-info

纯粹技术免费课计划·现代JavaScript 教程
112
star
36

timetodo-server

remote server for timetodo
PHP
108
star
37

windrecorder

JavaScript
103
star
38

rumenqi

从入门到放弃系列周边补全计划
98
star
39

api2d-js

OpenAI/Api2d pure js sdk 无需node后端直接在浏览器中运行,支持SSE流式输出
JavaScript
90
star
40

fangPHP

fangPHP is a docker based development env with php7 mysql redis and livereload
PHP
84
star
41

any2api

A framework( or a tool? ) that turns any website into an API
JavaScript
81
star
42

h2webreader

h2book web reader
JavaScript
78
star
43

awesome-checkchan

Check酱任务分享清单
76
star
44

windmark-practice

采用 windmark 编写的视频的源文件
74
star
45

h2reader-host

方糖小剧场Web阅读器和上传网站
JavaScript
72
star
46

Simple-Weibo

PS: 这个方案有些过时了,建议用新方案 https://github.com/qhm123/tinybo open source phonegap weibo client demo 。想要更多功能的同学自己写嘛,别偷懒哈。
JavaScript
70
star
47

url2pdf

url2pdf docker image based on wkhtmltopdf with Chinese support.
PHP
68
star
48

code-tattoo

语言纹身贴纸图案库
60
star
49

GPT4Company

Gpt4Company is a request forwarder used to prevent Samsung-style leaks. Gpt4Company 是一个用来避免三星式泄密的请求转发器
JavaScript
57
star
50

ffonline

video creating in browser
JavaScript
57
star
51

LazyBoardExt

定时采集数据并发送到指定接口的Chrome扩展机器人🤖
JavaScript
54
star
52

nCoV-push

nCoV疫情实时播报推送脚本。数据基于丁香园。
PHP
53
star
53

Wechat-Wordpress-Search

a wordpress plugin allowed user search blogs in wechat app
PHP
52
star
54

MoDocker

modo动漫私有云(modo.moe)的Docker构建用文件。
PHP
40
star
55

ask-gpt-download

通过GPT向微博账号提问
39
star
56

WindChat

A React Chatbot starter with highly customizable styles can be achieved through TailwindCSS. 可以通过 TailwindCSS 高度定制样式的 React Chatbot starter。
JavaScript
36
star
57

fo-pay

基于加密稳定币 FOUSDT 的 WordPress 付费阅读插件。
PHP
33
star
58

Fangtang-Chrome-Starter-Kit

Starter Kit for chrome extension based on Vue2 and ElementUI
JavaScript
33
star
59

serverchan-demo

Server酱多语言调用实例
Java
31
star
60

vue-starter

JavaScript
27
star
61

fangtangtree

方糖知识树
26
star
62

nowboard

基于SAE Channel服务的实时信息流展板。通过微博帐号登入、可聊天;支持API发布信息,可用于服务器调试信息、错误信息展示。
PHP
26
star
63

TeamToy-Plugins

TeamToy插件目录
PHP
24
star
64

LazyExtKit

a simple chrome extension startkit
JavaScript
24
star
65

github-action-server-chan

TypeScript
23
star
66

MetaToy2

通用命令行和可视化代码生成工具
EJS
19
star
67

WeiboList

微博上活跃的技术帐号整理
19
star
68

easy-starter2

react + mobx + react-router v4 + react-next-i18n starter for create-react-app 2.x
JavaScript
17
star
69

fangtangCV-react-native

react native demo
JavaScript
16
star
70

serverchan-wordpress-comments-notice

Server酱WordPress博客评论微信通知插件
PHP
16
star
71

easy-starter

一个整合了 react 、 react-router v4 和 mobx 的简单起始项目脚手架
JavaScript
15
star
72

LazyBot

一些基于 robo.li 的日常自动化/半自动化脚本
PHP
15
star
73

one-person-businesses-methodology-v2

用AI撰写的一本小书
Shell
14
star
74

teamtoy-mina-demo

一个调用TeamToy API 的微信小程序 Demo
JavaScript
14
star
75

CubismWebSamples-with-lip-sync

TypeScript
14
star
76

fullstack-learnning-map

全栈创业者(fullstack-creator)的知识地图
13
star
77

fangtangCV

PHP
12
star
78

2dstudio-dist

使用 API2D Key 的 Stable Studio,独立部署版
HTML
12
star
79

Aoi

LazyPHP3的看板娘,能帮你自动创建模板,Action和测试。
PHP
12
star
80

xf-tts-sdk

php & node sdk for xunfei tts websocket api
JavaScript
10
star
81

easychen.github.com

8
star
82

tcp

tcp包介绍网站
CSS
8
star
83

autoplay-web-specification

自播放网页规范 specification of autoplay web
7
star
84

imgShare

为文章中的图片添加鼠标浮动时分享到微博的链接。封装自 国内首家互联网人才拍卖网站 JobDeer.com
JavaScript
6
star
85

fangtangGif

方糖动图生成器
6
star
86

telegram-bot-api-proxy

express app for forwarding request to api.telegram.org
JavaScript
4
star
87

GameDemo

DemoGame for FE courses , Just a hosting , not open source project
4
star
88

easychen.github.io

HTML
4
star
89

book-by-ai-demo-book

3
star
90

LitePHP

Simple version of LazyPHP in one file
PHP
3
star
91

wordpress-local-dev-env

3
star
92

serverchan-e2e-demo

Server酱端对端加密函数和DEMO
2
star
93

fangCV

PHP
2
star
94

easychen

2
star
95

cubeslam

Automatically exported from code.google.com/p/cubeslam
JavaScript
2
star
96

TeamToy-Language-Files

translate teamtoy to other languages
PHP
2
star
97

fxd

Flow eXtension Define,它是一个被设计用于工作流(尤其是AI和自动化工作流)扩展的规范。"Flow eXtension Define" is a specification designed for extending workflows, especially AI and automation workflows.
JavaScript
2
star
98

bluesky-wave

Bluesky bulk follow tool
JavaScript
2
star
99

m5dash

Python
1
star
100

2d-ai-chatbot

TypeScript
1
star