Giter Club home page Giter Club logo

mineadmin's Introduction

中文 | English

项目介绍

官网 | 文档 | 演示 | Hyperf官方文档

项目介绍

PHP有很多优秀的后台管理系统,但基于Swoole的后台管理系统没找到合适我自己的。 所以就开发了一套后台管理系统。系统可以用于网站管理后台、CMS、CRM、OA、ERP等。

后台系统基于 Hyperf 框架开发。企业级架构分层,轻松支撑创业公司及个人前期发展使用,使用少量的服务器资源媲美静态语言的性能。 前端使用Vue3 + Vite4 + Pinia + Arco,一端适配PC、移动端、平板

如果觉着还不错的话,就请点个 ⭐star 支持一下吧,这将是对我最大的支持和鼓励! 在使用 MineAdmin 前请认真阅读《免责声明》并同意该声明。

前端仓库地址

移步前端仓库

官方交流群

QQ群用于交流学习,请勿水群

内置功能

  1. 用户管理,完成用户添加、修改、删除配置,支持不同用户登录后台看到不同的首页
  2. 部门管理,部门组织机构(公司、部门、小组),树结构展现支持数据权限
  3. 岗位管理,可以给用户配置所担任职务
  4. 角色管理,角色菜单权限分配、角色数据权限分配
  5. 菜单管理,配置系统菜单和按钮等
  6. 字典管理,对系统中经常使用并且固定的数据可以重复使用和维护
  7. 系统配置,系统的一些常用设置管理
  8. 操作日志,用户对系统的一些正常操作的查询
  9. 登录日志,用户登录系统的记录查询
  10. 在线用户,查看当前登录的用户
  11. 服务监控,查看当前服务器状态和PHP环境等信息
  12. 附件管理,管理当前系统上传的文件及图片等信息
  13. 数据表维护,对系统的数据表可以进行清理碎片和优化
  14. 模块管理,管理系统当前所有模块
  15. 定时任务,在线(添加、修改、删除)任务调度包含执行结果日志
  16. 代码生成,前后端代码的生成(php、vue、js、sql),支持下载和生成到模块
  17. 缓存监控,查看Redis信息和系统所使用key的信息
  18. API管理,对应用和接口管理、接口授权等功能。接口文档自动生成,输入、输出参数检查等
  19. 队列管理,消息队列管理功能、消息管理、消息发送。使用ws方式即时消息提醒(需安装rabbitMQ)
  20. 应用市场,可下载各种基础应用、插件、前端组件等等(开发中...)

环境需求

  • Swoole >= 5.0 并关闭 Short Name
  • PHP >= 8.1 并开启以下扩展:
    • mbstring
    • json
    • pdo
    • openssl
    • redis
    • pcntl
  • Mysql >= 5.7
  • Pgsql >= 10
  • Sql Server Latest
  • Sqlsrv is Latest
  • Redis >= 4.0
  • Git >= 2.x

下载项目

  • MineAdmin没有使用SQL文件导入安装,系统使用Migrates迁移文件形式安装和填充数据,请知悉。

  • 项目下载,请确保已经安装了 Composer

git clone https://gitee.com/xmo/MineAdmin && cd MineAdmin
composer config -g repo.packagist composer https://mirrors.tencent.com/composer/
composer install

项目安装

打开终端,执行安装命令,按照提示,一步步完成.env文件的配置

php bin/hyperf.php mine:install

待提示以下信息后

Reset the ".env" file. Please restart the service before running 
the installation command to continue the installation.

再次执行安装命令,执行Migrates数据迁移文件和SQL数据填充,完成安装。

php bin/hyperf.php mine:install

点这里 -> 查看常见问题

免责声明

《免责声明》

使用本软件不得用于开发违反国家有关政策的相关软件和应用,若因使用本软件造成的一切法律责任均与 MineAdmin 无关

体验地址

体验地址

  • 账号:superAdmin
  • 密码:admin123

请勿添加脏数据

鸣谢

以下排名不分先后

Hyperf 一款高性能企业级协程框架

Arco 字节跳动出品的企业级设计系统

Swoole PHP协程框架

Vue

Vite

Jetbrains 生产力工具

通过 OSCS 安全认证

OSCS Status

star 趋势

Stargazers over time

贡献者

感谢所有参与 MineAdmin 开发的代码贡献者。 [contributors]

贡献者趋势

演示图片

mineadmin's People

Contributors

496222968 avatar a77uu avatar assert6 avatar chance-fyi avatar dependabot[bot] avatar eno233 avatar faizel-88 avatar getda avatar hi-noikiy avatar huangzhhui avatar jiangslee avatar kanyxmo avatar lait233 avatar larvacent avatar littlezo avatar loyating avatar nekgod avatar netyum avatar nonsecurity avatar people-sea avatar putyy avatar qiuyibin avatar sunsgneayo avatar taobali32 avatar zds-s avatar zhanghangt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mineadmin's Issues

关于依赖代理

我觉得,如果values为空是不是可以隐式,取类的第一个实现接口类,通常都会用接口约束,特例再指定

模型生成代码可能需要优化

image

  1. 上面的箭头 应该默认返回个 string.. 不然
    不会显示到$casts里面.
    image

命令:

php bin/hyperf.php gen:model test_article --refresh-fillable --refresh-fillable --with-comments --path app/Test/Model/Api

数据库结构
image

2.0[BUG]

PHP Fatal error: Declaration of App\Setting\Mapper\SettingConfigMapper::save(array $data): mixed must be compatible with Mine\Abstracts\AbstractMapper::save(array $data): int in /opt/www/app/Setting/Mapper/SettingConfigMapper.php on line 78

一键curd生成单选框 单选框字段配置项 value值为code

一键curd生成单选框 单选框字段配置项 value值为code 与ma-curd组件中的value不一致

建议将 { title: "是否推荐", dataIndex: "is_show", formType: "radio", search: true, dict: { data: [ { label: "是", value: "1" }, { label: "否", value: "0" } ], translation: true } },
改成 { title: "是否推荐", dataIndex: "is_show", formType: "radio", search: true, dict: { data: function () { return [ { label: "是", value: "1" }, { label: "否", value: "0" } ]; }, translation: true } },

使用 dockerfile 安装时提示错误

错误信息如下:

#5 https://php.hernandev.com/key/php-alpine.rsa.pub
#5 ERROR: invalid response status 404
------
 > https://php.hernandev.com/key/php-alpine.rsa.pub:
------
ERROR: failed to solve: failed to load cache key: invalid response status 404

好像是因为这个网址打不开了,导致现在无法进行部署安装

系统设置中的动态配置表单的逻辑似乎写错了

https://github.com/kanyxmo/MineAdmin-Vue/blob/main/src/views/setting/config/index.vue

此代码的149行开始 ,我理解的是 如果是checkbox类型,那么就检测 item.value的值,用户可以输入两种形式来确认checkbox的值,一种是 1,2,3,第二种是[1,2,3],但是下面这么写,会永远命中第一个if,因为第二种也包括逗号

我理解的没错吧,好像要把else if提前

if (item.value && item.value.toString().indexOf(',') > -1 && item.input_type === 'checkbox') {
        item.value = item.value.split(',')
      } else if (/^\[/.test(item.value) && /\]$/.test(item.value)) {
        item.value = JSON.parse(item.value)
      }

使用hyperf的模型查询数据时,刷新API接口时,有50%的概率会报这个错误

[2023-05-20 07:20:36 $12089.0] WARNING Server::check_worker_exit_status(): worker(pid=12102, id=11) abnormal exit, status=0, signal=11
A bug occurred in Swoole-v5.0.1, please report it.
The Swoole developers probably don't know about it,
and unless you report it, chances are it won't be fixed.
You can read How to report a bug doc before submitting any bug reports:

https://github.com/swoole/swoole-src/blob/master/.github/ISSUE.md
Please do not send bug reports in the mailing list or personal letters.
The issue page is also suitable to submit feature requests.

OS: Darwin 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 21:00:17 PST 2023; root:xnu-8796.101.5~3/RELEASE_X86_64 x86_64
GCC_VERSION: Apple LLVM 14.0.0 (clang-1400.0.29.202)
PHP_VERSION : 8.1.12

API接口极简模式问题

App\System\Service\SystemAppService

image
查询里面没有带app_id,而下面使用的是$model->app_id,根本拿不到

登录报错

[ERROR] Error while decoding from Base64Url, invalid base64 characters detected
[ERROR] /home/shipin520/dev/project/admin/MineAdmin/vendor/lcobucci/jwt/src/Encoding/CannotDecodeContent.php
string(3184) "#0 /home/shipin520/dev/project/admin/MineAdmin/vendor/lcobucci/jwt/src/SodiumBase64Polyfill.php(66): Lcobucci\JWT\Encoding\CannotDecodeContent::invalidBase64String()
#1 /home/shipin520/dev/project/admin/MineAdmin/vendor/lcobucci/jwt/src/Signer/Key/InMemory.php(39): Lcobucci\JWT\SodiumBase64Polyfill::base642bin('abcdefg', 1)
#2 /home/shipin520/dev/project/admin/MineAdmin/vendor/xmo/jwt-auth/src/JWT.php(202): Lcobucci\JWT\Signer\Key\InMemory::base64Encoded('abcdefg')
#3 /home/shipin520/dev/project/admin/MineAdmin/vendor/xmo/jwt-auth/src/JWT.php(64): Xmo\JWTAuth\JWT->getKey(Array)
#4 /home/shipin520/dev/project/admin/MineAdmin/mine/Helper/LoginUser.php(156): Xmo\JWTAuth\JWT->getToken(Array)
#5 /home/shipin520/dev/project/admin/MineAdmin/runtime/container/proxy/App_System_Service_SystemUserService.proxy.php(142): Mine\Helper\LoginUser->getToken(Array)
#6 /home/shipin520/dev/project/admin/MineAdmin/runtime/container/proxy/App_System_Controller_LoginController.proxy.php(58): App\System\Service\SystemUserService->login(Array)
#7 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/http-server/src/CoreMiddleware.php(161): App\System\Controller\LoginController->login(Object(App\System\Request\User\SystemUserLoginRequest))
#8 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/http-server/src/CoreMiddleware.php(113): Hyperf\HttpServer\CoreMiddleware->handleFound(Object(Hyperf\HttpServer\Router\Dispatched), Object(Hyperf\HttpMessage\Server\Request))
#9 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): Hyperf\HttpServer\CoreMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#10 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#11 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/validation/src/Middleware/ValidationMiddleware.php(83): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#12 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): Hyperf\Validation\Middleware\ValidationMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#13 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#14 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/dispatcher/src/HttpDispatcher.php(40): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#15 /home/shipin520/dev/project/admin/MineAdmin/vendor/hyperf/http-server/src/Server.php(117): Hyperf\Dispatcher\HttpDispatcher->dispatch(Object(Hyperf\HttpMessage\Server\Request), Array, Object(Mine\Middlewares\HttpCoreMiddleware))
#16 /home/shipin520/dev/project/admin/MineAdmin/mine/MineServer.php(25): Hyperf\HttpServer\Server->onRequest(Object(Swoole\Http\Request), Object(Swoole\Http\Response))
#17 {main}"

有没有办法像fastapi框架一样,它的请求参数、验证、自动接口文档,是我见过最优秀简洁的做法。

痛点:
同一批请求入参,业务代码里接收所有入参的字段、另外一个地方的代码里书写所有入参字段的验证、再另外一个地方书写所有入参字段的接口文档。

(1)特别麻烦,重复性的工作。
(3)三个地方,有时候加字段减字段改字段,弄来弄去,结果是:很严重。

见过最优秀的做法:

1 办法一,参数入参:
image

2 办法二,请求体入参:
image

Chat请求体:
image

只需要这样做,入参自动做了验证了、接口文档自动生成了,特别简洁,特别规范,特别不容易出错。

[BUG] 最新版本 v1.14.1 安装失败

目前发现两处错误:

  1. declare(strict_types=1); 没有放在代码首行,目前发现有几个配置文件
    image

  2. SettingCrontab 类重复了,需要给 use App\Setting\Model\SettingCrontab 添加下别名
    image

Bug SystemDeptService :: 115

if (isset($data['id']) && isset($data['parent_id']) && $data['id'] == $data['parent_id']) {
throw new NormalStatusException(t('system.parent_dept_error'), 500);
}

代码生成器模块与数据库匹配问题

目前我生成了一个模块名为Member 数据库前缀为s 生成model的时候s_member不可以配置 但是s_members s_memberopp s_member_info 都可匹配上 设计上就这样的吗

在PHP 8.1.8下安装报错 php bin/hyperf.php mine:install

php: 8.1.8
OS: MacOS 12.2
尝试过的操作: composer update后依然报错
各项依赖的扩展都有,且composer install正常
php bin/hyperf.php mine:install 报错

php bin/hyperf.php mine:install                                                                                                                     ✔  39s   16:32:43  
PHP Deprecated:  Return type of Hyperf\Utils\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1646

Deprecated: Return type of Hyperf\Utils\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1646
PHP Deprecated:  Return type of Hyperf\Utils\Collection::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1657

Deprecated: Return type of Hyperf\Utils\Collection::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1657
PHP Deprecated:  Return type of Hyperf\Utils\Collection::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1668

Deprecated: Return type of Hyperf\Utils\Collection::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1668
PHP Deprecated:  Return type of Hyperf\Utils\Collection::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1682

Deprecated: Return type of Hyperf\Utils\Collection::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Collection.php on line 1682
PHP Deprecated:  Hyperf\AsyncQueue\Message implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/async-queue/src/Message.php on line 18

Deprecated: Hyperf\AsyncQueue\Message implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/async-queue/src/Message.php on line 18
PHP Deprecated:  Return type of Hyperf\Database\Model\Model::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1156

Deprecated: Return type of Hyperf\Database\Model\Model::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1156
PHP Deprecated:  Return type of Hyperf\Database\Model\Model::offsetGet($offset) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1165

Deprecated: Return type of Hyperf\Database\Model\Model::offsetGet($offset) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1165
PHP Deprecated:  Return type of Hyperf\Database\Model\Model::offsetSet($offset, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1175

Deprecated: Return type of Hyperf\Database\Model\Model::offsetSet($offset, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1175
PHP Deprecated:  Return type of Hyperf\Database\Model\Model::offsetUnset($offset) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1184

Deprecated: Return type of Hyperf\Database\Model\Model::offsetUnset($offset) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 1184
PHP Deprecated:  Return type of Hyperf\Database\Model\Model::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 850

Deprecated: Return type of Hyperf\Database\Model\Model::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/database/src/Model/Model.php on line 850
PHP Deprecated:  Return type of Hyperf\Utils\Fluent::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 165

Deprecated: Return type of Hyperf\Utils\Fluent::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 165
PHP Deprecated:  Return type of Hyperf\Utils\Fluent::offsetGet($offset) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 175

Deprecated: Return type of Hyperf\Utils\Fluent::offsetGet($offset) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 175
PHP Deprecated:  Return type of Hyperf\Utils\Fluent::offsetSet($offset, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 186

Deprecated: Return type of Hyperf\Utils\Fluent::offsetSet($offset, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 186
PHP Deprecated:  Return type of Hyperf\Utils\Fluent::offsetUnset($offset) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 196

Deprecated: Return type of Hyperf\Utils\Fluent::offsetUnset($offset) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 196
PHP Deprecated:  Return type of Hyperf\Utils\Fluent::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 143

Deprecated: Return type of Hyperf\Utils\Fluent::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Fluent.php on line 143
PHP Deprecated:  Return type of Hyperf\Utils\Optional::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 94

Deprecated: Return type of Hyperf\Utils\Optional::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 94
PHP Deprecated:  Return type of Hyperf\Utils\Optional::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 105

Deprecated: Return type of Hyperf\Utils\Optional::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 105
PHP Deprecated:  Return type of Hyperf\Utils\Optional::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 116

Deprecated: Return type of Hyperf\Utils\Optional::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 116
PHP Deprecated:  Return type of Hyperf\Utils\Optional::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 128

Deprecated: Return type of Hyperf\Utils\Optional::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Optional.php on line 128
PHP Deprecated:  Return type of Hyperf\Utils\Stringable::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Stringable.php on line 799

Deprecated: Return type of Hyperf\Utils\Stringable::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/utils/src/Stringable.php on line 799
PHP Deprecated:  Return type of Hyperf\Paginator\AbstractPaginator::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/paginator/src/AbstractPaginator.php on line 406

Deprecated: Return type of Hyperf\Paginator\AbstractPaginator::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/paginator/src/AbstractPaginator.php on line 406
PHP Deprecated:  Return type of Hyperf\Paginator\AbstractPaginator::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/paginator/src/AbstractPaginator.php on line 406

Deprecated: Return type of Hyperf\Paginator\AbstractPaginator::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/paginator/src/AbstractPaginator.php on line 406
[INFO] Swagger Url at 0.0.0.0:9501/swagger
PHP Fatal error:  Uncaught Hyperf\Di\Exception\InvalidDefinitionException: Entry "Mine\Command\UpdateProjectCommand" cannot be resolved: Parameter $name of __construct() has no value defined or guessable
Full definition:
Object[Mine\Command\UpdateProjectCommand] in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Exception/InvalidDefinitionException.php:20
Stack trace:
#0 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ObjectResolver.php(103): Hyperf\Di\Exception\InvalidDefinitionException::create(Object(Hyperf\Di\Definition\ObjectDefinition), 'Entry "Mine\\Com...')
#1 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ObjectResolver.php(66): Hyperf\Di\Resolver\ObjectResolver->createInstance(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#2 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(62): Hyperf\Di\Resolver\ObjectResolver->resolve(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#3 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/DepthGuard.php(73): Hyperf\Di\Resolver\ResolverDispatcher->Hyperf\Di\Resolver\{closure}()
#4 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call('Mine\\Command\\Up...', Object(Closure))
#5 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(194): Hyperf\Di\Resolver\ResolverDispatcher->resolve(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#6 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(82): Hyperf\Di\Container->resolveDefinition(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#7 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(127): Hyperf\Di\Container->make('Mine\\Command\\Up...')
#8 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/framework/src/ApplicationFactory.php(48): Hyperf\Di\Container->get('Mine\\Command\\Up...')
#9 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/FactoryResolver.php(56): Hyperf\Framework\ApplicationFactory->__invoke(Object(Hyperf\Di\Container))
#10 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(62): Hyperf\Di\Resolver\FactoryResolver->resolve(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#11 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/DepthGuard.php(73): Hyperf\Di\Resolver\ResolverDispatcher->Hyperf\Di\Resolver\{closure}()
#12 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call('Hyperf\\Contract...', Object(Closure))
#13 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(194): Hyperf\Di\Resolver\ResolverDispatcher->resolve(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#14 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(82): Hyperf\Di\Container->resolveDefinition(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#15 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(127): Hyperf\Di\Container->make('Hyperf\\Contract...')
#16 /Applications/MxSrvs/www/cloudcpadmin/bin/hyperf.php(27): Hyperf\Di\Container->get('Hyperf\\Contract...')
#17 /Applications/MxSrvs/www/cloudcpadmin/bin/hyperf.php(29): {closure}()
#18 {main}
  thrown in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Exception/InvalidDefinitionException.php on line 20

Fatal error: Uncaught Hyperf\Di\Exception\InvalidDefinitionException: Entry "Mine\Command\UpdateProjectCommand" cannot be resolved: Parameter $name of __construct() has no value defined or guessable
Full definition:
Object[Mine\Command\UpdateProjectCommand] in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Exception/InvalidDefinitionException.php:20
Stack trace:
#0 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ObjectResolver.php(103): Hyperf\Di\Exception\InvalidDefinitionException::create(Object(Hyperf\Di\Definition\ObjectDefinition), 'Entry "Mine\\Com...')
#1 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ObjectResolver.php(66): Hyperf\Di\Resolver\ObjectResolver->createInstance(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#2 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(62): Hyperf\Di\Resolver\ObjectResolver->resolve(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#3 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/DepthGuard.php(73): Hyperf\Di\Resolver\ResolverDispatcher->Hyperf\Di\Resolver\{closure}()
#4 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call('Mine\\Command\\Up...', Object(Closure))
#5 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(194): Hyperf\Di\Resolver\ResolverDispatcher->resolve(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#6 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(82): Hyperf\Di\Container->resolveDefinition(Object(Hyperf\Di\Definition\ObjectDefinition), Array)
#7 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(127): Hyperf\Di\Container->make('Mine\\Command\\Up...')
#8 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/framework/src/ApplicationFactory.php(48): Hyperf\Di\Container->get('Mine\\Command\\Up...')
#9 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/FactoryResolver.php(56): Hyperf\Framework\ApplicationFactory->__invoke(Object(Hyperf\Di\Container))
#10 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(62): Hyperf\Di\Resolver\FactoryResolver->resolve(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#11 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/DepthGuard.php(73): Hyperf\Di\Resolver\ResolverDispatcher->Hyperf\Di\Resolver\{closure}()
#12 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call('Hyperf\\Contract...', Object(Closure))
#13 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(194): Hyperf\Di\Resolver\ResolverDispatcher->resolve(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#14 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(82): Hyperf\Di\Container->resolveDefinition(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#15 /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Container.php(127): Hyperf\Di\Container->make('Hyperf\\Contract...')
#16 /Applications/MxSrvs/www/cloudcpadmin/bin/hyperf.php(27): Hyperf\Di\Container->get('Hyperf\\Contract...')
#17 /Applications/MxSrvs/www/cloudcpadmin/bin/hyperf.php(29): {closure}()
#18 {main}
  thrown in /Applications/MxSrvs/www/cloudcpadmin/vendor/hyperf/di/src/Exception/InvalidDefinitionException.php on line 20


模型生成一点小建议

建议增加类输出属性注释,模型的主键,自增,时间戳属性判断,是否软删判断,以及casts类型映射,这样在预览代码时比较方便

增加:Swagger只扫描指定目录下接口生成文档

目前Swagger 扫描的是全部路由,包括后台的路由
image

我重写了Hyperf\ApiDocs\Listener\AfterDtoStartListener方法实现只扫码api接口路由.
效果
image

代码

api_docs.php增加
// 设置空数组则还是扫描全部路由

    'scan_path_prefix' =>  [
        "App\Test\Controller\Api"
    ],
<?php

namespace App\Test\Ext;

use Hyperf\ApiDocs\Listener\AfterDtoStartListener as BaseAfterDtoStartListener;
use Closure;
use Hyperf\ApiDocs\Swagger\SwaggerComponents;
use Hyperf\ApiDocs\Swagger\SwaggerConfig;
use Hyperf\ApiDocs\Swagger\SwaggerOpenApi;
use Hyperf\ApiDocs\Swagger\SwaggerPaths;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\DTO\Event\AfterDtoStart;
use Hyperf\HttpServer\Router\Handler;
use Mine\Annotation\DependProxy;

#[DependProxy(values: [ BaseAfterDtoStartListener::class ])]
class AfterDtoStartListener extends BaseAfterDtoStartListener
{
    public function __construct(
        private StdoutLoggerInterface $logger,
        private SwaggerOpenApi $swaggerOpenApi,
        private SwaggerComponents $swaggerComponents,
        private SwaggerConfig $swaggerConfig,
    ) {
    }


    /**
     * @param AfterDtoStart $event
     */
    public function process(object $event): void
    {
        $server = $event->serverConfig;
        $router = $event->router;

        if (! $this->swaggerConfig->isEnable()) {
            return;
        }
        if (! $this->swaggerConfig->getOutputDir()) {
            return;
        }

        $this->swaggerOpenApi->init();

        /** @var SwaggerPaths $swagger */
        $swagger = make(SwaggerPaths::class, [$server['name']]);

        $scan_path_prefix =  config('api_docs.scan_path_prefix',[]);

        foreach ($router->getData() ?? [] as $routeData) {

            foreach ($routeData ?? [] as $methods => $handlerArr) {

                array_walk_recursive($handlerArr, function ($item) use ($swagger, $methods,$scan_path_prefix) {
                    if ($item instanceof Handler && ! ($item->callback instanceof Closure)) {
                        $prepareHandler = $this->prepareHandler($item->callback);

                        if (count($prepareHandler) > 1) {
                            [$controller, $methodName] = $prepareHandler;

                            if ($scan_path_prefix == []){
                                $swagger->addPath($controller, $methodName, $item->route, $methods);
                            }else{
                                $lastBackslashPos = strrpos($controller, "\\");
                                if ($lastBackslashPos !== false) {
                                    $result = substr($controller, 0, $lastBackslashPos);

                                    if (in_array($result,$scan_path_prefix)){
                                        $swagger->addPath($controller, $methodName, $item->route, $methods);
                                    }
                                }
                            }
                        }
                    }
                });
            }
        }

        $schemas = $this->swaggerComponents->getSchemas();
        $this->swaggerOpenApi->setComponentsSchemas($schemas);
        $this->swaggerOpenApi->save($server['name']);

        $this->swaggerOpenApi->clean();
        $this->swaggerComponents->setSchemas([]);

        $this->logger->debug('swagger server:[' . $server['name'] . '] file has been generated');
    }
}

迁移数据表错误:setting_datasource

首次安装完成后,打开部门管理中的领导列表显示如下错误:
QQ20230524-0

随后使用 php bin/hyperf.php mine:update 操作,显示 setting_datasource 表已存在

Xnip2023-05-24_11-07-11

cascader 为什么只有第一级数据, 是我哪里写的不对吗?

image

{ title: '类目', dataIndex: 'category_id', search: true, hide:true, formType: 'cascader', multiple: false, expandTrigger:"hover", dict: { url: "category/tree", }, commonRules: [{ required: true, message: '类别必选' }], editDefaultValue: async (record) => { const response = await product.read(record.id) return response.data.name } }

几个建议关于api的问题

我不是总的重度使用者, 最近帮朋友看api这一块,感觉有点繁琐。

  1. 签名觉得可以加个不使用。
  2. 我看官方给出的api 的中间件 VerifyParamsMiddleware 基本也没用上,是交给开发者自己实现吗?
  3. 由于api这里通过apiController 调度了一层, 原本验证中间件不能用了, 觉得可以通过反射调用method,以便可以, 注入formRequest实现在api interface里也可以使用formRequest验证。
    public function v1(): ResponseInterface
    {
        $apiData = $this->__init();

        try {
// 这里不是简单的call
            $class = make($apiData['class_name']);
            return $class->{$apiData['method_name']}();
        } catch (\Throwable $e) {
//判断是不是验证类异常,处理验证异常
            throw new NormalStatusException(
                t('mineadmin.interface_exception') . $e->getMessage(),
                MineCode::INTERFACE_EXCEPTION
            );
        }
    }

4.后台配置每一个api,感觉很繁琐,是否考虑使用注解特性, 直接设置api

class TestApi
{
    public function __construct(SystemUserMapper $user, SystemDeptMapper $dept)
    {
        $this->response = container()->get(MineResponse::class);
        $this->user = $user;
        $this->dept = $dept;
    }

    #[SystemApi(description: "测试", appId:"a7ccdef6d7", name: "测试", accessName: "haha", requestMode: 'P')]
    #[SystemApiRequestParam("XXX")]
    #[SystemApiResonseParam("XXX")]
   // 不加请求响应参数也行,这是为了生成文档, 请求有验证,响应还没有 过滤,用户自己处理使用resource或者vo,
    public function test(TestRequest $request)
    {
        return $this->response->success("xxxx", []);
    }
}

以便先看注解收集, 有注解直接处理,没有再去查库了, 而且代码与文档在一起, 比较直观

模块直接是否可以增加依赖关系呢

建议:
模块之间是否可以增加依赖关系呢?毕竟不是微服务模式,如果开发单体应用,例如会员模块,其他许多模块都会依赖它,这样如果卸载模块,就要看是否有模块依赖了它,不能随意就卸载了,所以可以在config.json中增加依赖模块配置

[bug]自动生成器

1.生成的前端代码 index.vue 中 formOption: {
viewType: modal,
width: 600
},
需要把 modal 改为 "modal",才能正常运行

2.生成的php代码中的Mapper 的代码中 handleSearch 方法中 判断函数是否为空用的自定义的blank 函数来判断的,需要用empty判断
3.生成的代码在后台删除数据时会报出mineadmin-admin | [ERROR] Cannot use "::class" on value of type string[313] in /opt/www/vendor/xmo/mine-core/src/Traits/MapperTrait.php
mineadmin-admin | [ERROR] #0 /opt/www/vendor/xmo/mine-core/src/Traits/ServiceTrait.php(168): Mine\Abstracts\AbstractMapper->delete()
4.新增角色时,如果选择了状态会报错,具体应该是status的字段类型设置有问题[ERROR] SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'statistics' for column 'status' at row 1 (SQL: insert into system_role (sort, status, name, code, created_by, updated_by, updated_at, created_at) values (1, 'statistics', 'dd', 'ddd', 1000, 1000, '2024-01-24 07:22:24', '2024-01-24 07:22:24'))[64] in /opt/www/vendor/xmo/mine-core/src/Aspect/TransactionAspect.php
image

关于api返回格式的探讨

刚了解此框架,我看到返回结构里面有status,也有code,后来发现status不是有true,false,而是有301,404等数字,不知道作者你是怎么考虑的

[BUG] #[Resubmit] 防止重复提交问题

目前测试了下 #[Resubmit] 注解,发现虽然返回正确的提示信息 【访问太频繁,请稍后访问】,但代码还是会执行,达不到预期的作用。

暂时不清楚是否bug,还是设计如此。目前如果想使用,那么代码层面需要做下幂等性处理。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.