Giter Site home page Giter Site logo

amisadmin / fastapi-amis-admin Goto Github PK

View Code? Open in Web Editor NEW
903.0 19.0 137.0 2.26 MB

FastAPI-Amis-Admin is a high-performance, efficient and easily extensible FastAPI admin framework. Inspired by django-admin, and has as many powerful functions as django-admin.

Home Page: http://docs.amis.work

License: Apache License 2.0

Python 98.31% HTML 1.69%
sqlalchemy fastapi fastapi-admin sqlmodel django-admin amis fastapi-amis-admin starlette

fastapi-amis-admin's People

Contributors

1219295581 avatar 625412505 avatar alldevic avatar amisadmin avatar cc1001001 avatar chaoyingz avatar cnss63 avatar dependabot[bot] avatar fanbinbill avatar matsiukmykola avatar munikes avatar swelcker avatar tomasky avatar undertone0809 avatar vsipchenko 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fastapi-amis-admin's Issues

InputKV 键值对,value值已经自定义为input-number类型,从表单上http发出去,后端接收到的value还是字符串

{
"draggable": True,
"type": "input-kv",
"label": "兑换奖品",
"name": "rewards666",
"id": "u:8cfc8df288e5",
"multiple": True,
"items": [
{
"placeholder": "Key",
"type": "input-text",
"unique": True,
"name": "key",
"required": True,
"validateOnChange": True
},
{
"placeholder": "Value",
"type": "input-number",
"name": "value"
}
],
"size": "md",
"valueType": "input-number",
"validateApi": ""
},

UX optimization/proposal for any overlay Dialog

This is just an idea/proposal to optimize the user experience while using the UI. Any overlay dialog title only shows the action type, like Create or Update etc. I believe it would be helpfull if we add the page_schema.label in admin.admin.py to it.

            dialog=Dialog(
                title=_("Create") + " " + _(self.page_schema.label),  # Something like this
                size=SizeEnum.lg,
                body=await self.get_create_form(request, bulk=bulk),

datetime 序列化报错

from datetime import datetime
print(datetime.now())
2022-06-29 01:27:38.214869
print(datetime.utcnow())
2022-06-28 17:27:47.372238
from datetime import datetime,timedelta
print(datetime.now() + timedelta(days=1))
2022-06-30 01:28:23.930576

create_time: Optional[datetime] = Field(default_factory=datetime.utcnow(), title='CreateTime')
upload_time: Optional[datetime] = Field(default_factory=datetime.now(), title='UploadTime')
defaultdate= datetime.now() + timedelta(days=1)
schedule_date: Optional[datetime] = Field(default_factory=defaultdate, title='ScheduleTime')

File "D:\Programs\anaconda\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.class.name} '
TypeError: Object of type datetime is not JSON serializable

运行报错,TypeError: sequence item 2: expected str instance, NoneType found

安装命令行拓展

pip install fastapi_amis_admin[cli]

查看帮助

faa --help

初始化一个FastAPI-Amis-Admin项目

faa new project_name --init

初始化一个FastAPI-Amis-Admin应用

faa new app_name

快速运行项目

faa run

$ faa run                      
Traceback (most recent call last):

  File "/usr/local/bin/faa", line 5, in <module>
    from fastapi_amis_admin_cli.main import app

  File "/usr/local/lib/python3.8/dist-packages/fastapi_amis_admin_cli/main.py", line 3, in <module>
    app(prog_name="faa")

  File "/usr/local/lib/python3.8/dist-packages/fastapi_amis_admin_cli/commands/main.py", line 58, in run
    os.system('uvicorn ' + ' '.join(args))

TypeError: sequence item 2: expected str instance, NoneType found

一个好玩意,没有好说明书,这怎么整

按照文档中的page添加后,做操作各种失败,
而demo中通过faa run执行的模式下,跟原教程完全不同。

这让人咋入手。

教程并没有一个从头到尾的哪怕一个简单的demo。感觉学习成本挺高的,

可能我智力有问题吧,
抱歉。

还是想多说一句,一个好东西,如果他是使用广泛的,必然搜索引擎多少都会有相关的使用片段。
可结果是,搜索引擎中检索到的所有相关内容,都是简单的复制官方不完善的文档而已。一个自定义使用的文章都不存在。

M2M 关系中,添加的其他字段,如何表现在前端?

class ClassStudentLink(SQLModel, table=True):
    __tablename__ = 'class_student_link'
    class_id: Optional[int] = Field(
        default=None, foreign_key="class.id", primary_key=True, nullable=False
    )
    student_id: Optional[int] = Field(
        default=None, foreign_key="student.id", primary_key=True, nullable=False
    )
    comment: str = Field(..., title='备注', sa_column=Column(String(256), index=True))

这样的数据表如何在前端进行展示呢?

O2M/M2M等关系中,选择页面默认自带了过滤

image
以官方demo中的标签管理为例,当点击添加文章右侧的按钮后,展示的默认项目只有两个。
image
点击筛选按钮后,在所有输入框都为空的状态下,展示的项目依旧为2个没有变化。
image
点击清空按钮后,展示的项目发生了变化。

期望值:默认打开在没有任何过滤器的情况下应该显示所有内容,在设置过滤后进行对应展示。

URL 组件示例无法正常运行

按照文档复制以下代码:

# adminsite.py

from fastapi_amis_admin.admin import admin
from fastapi_amis_admin.amis import PageSchema


@site.register_admin
class GitHubLinkAdmin(admin.LinkAdmin):
    # 通过page_schema类属性设置页面菜单信息;
    # PageSchema组件支持属性参考: https://baidu.gitee.io/amis/zh-CN/components/app
    page_schema = PageSchema(label='AmisLinkAdmin', icon='fa fa-github')
    # 设置跳转链接
    link = 'https://github.com/amisadmin/fastapi_amis_admin'

在侧边栏可得一选项, 但点击后并没有在新页面打开超链接, 而在在本页面开了一个frame, 由于同源策略, github.com 拒绝了我们的连接请求。.

其余代码如下:

from fastapi import FastAPI
from fastapi_amis_admin.admin.settings import Settings
from fastapi_amis_admin.admin.site import AdminSite
from adminsite import site

# 创建FastAPI应用
app = FastAPI()


# 挂载后台管理系统
site.mount_app(app)

if __name__ == '__main__':
    import uvicorn

    uvicorn.run('main:app', debug=True, reload=True, workers=1)
  • fastapi_amis_admin 0.2.0
  • python 3.10.5

Dialog buttons and title keep showing Chinese caption

fastapi-amis-admin>=0.2.3
fastapi_user_auth
fastapi-scheduler

All the UI (tables etc. is shown in en_US) but when i click on delete of a record or on pause in the scheduler the popup dialog show title and button captions in chinese.

What am i doing wrong?

'AsyncAdapt_asyncpg_cursor' object has no attribute 'lastrowid'

使用 postgresql+asyncpg 时,当插入数据时,能够正常写入数据库,但是客户端会提示内部错误,终端提示没有 lastrowid 的问题。
YB0R2~7ZXG){`) H T6G8Y8
AttributeError: 'AsyncAdapt_asyncpg_cursor' object has no attribute 'lastrowid'

如需更多有效信息,请告知

ImportError

Traceback (most recent call last):
  File "c:/Users/dell/Desktop/learn/fastapi_amis_admin/main.py", line 2, in <module>
    from adminsite import site
  File "c:\Users\dell\Desktop\learn\fastapi_amis_admin\adminsite.py", line 7, in <module>
    from fastapi_amis_admin.crud import BaseApiOut
ImportError: cannot import name 'BaseApiOut' from 'fastapi_amis_admin.crud' (C:\Users\dell\anaconda3\Anaconda\envs\Web\lib\site-packages\fastapi_amis_admin\crud\__init__.py)

当模型的主键不是用的id,比如自定义成user_id ,设置pk_name后, 可以显示数据,但是编辑更新数据,会报405错误,是接口没有传递item_id参数

class Users(SQLModel,table = True):
user_id: str =Field(default=None,primary_key=True)
name: str = Field(title="昵称")
face_url:str = Field(title='头像')
gender: int = Field(title='性别')
phone_number:Optional[str] = Field(title='手机号码',default=None)
birth:datetime = Field(title='生日')
email:str = Field(title='用户名')
ex:Optional[str]= Field(title='扩展字段',default=None)
create_time:datetime = Field(title='创建时间')
app_manger_level:int = Field(title='用户等级')

@site.register_admin
class UserInfoAdmin(admin.ModelAdmin):
group_schema = '基本管理'
page_schema = '用户管理'
model = Users
pk_name = 'user_id'

Sort Order of fields in Create and Update Dialog (_create_schema... are different)

The Create Dialog uses exactly the sort order provided by the 'create_fields` list, the Update Dialog has a different sort order each time you start the ASGI instance.

Reason:
in _sqlmodel, the def _create_schema_update(self):and the def _create_schema_create(self): are very different. The createversion gives me the freedom to define which field i want to show for record creation, the update version checks against the 'readonly_fields' list, which seems to be a logical idea at first BUT takes the freedom away from me while i provide the ùpdate_fields`list.

Solution/Proposal:
Make the update function the same as create:

def _create_schema_update(self):
    if self.schema_update:
        return self.schema_update
    if not self.update_fields:
        return super(SQLModelCrud, self)._create_schema_update()
    modelfields = list(
        filter(
            None,
            [self.parser.get_modelfield(field, deepcopy=True) for field in self.update_fields],
        )
    )
    return schema_create_by_modelfield(f"{self.schema_name_prefix}Update", modelfields, set_none=True)

iframe无法指定外部src

当iframe的src指定为不以site_url开头的外部地址时候,这个iframe page就无法加载。

查看源码后感觉这个判断有问题
https://github.com/amisadmin/fastapi_amis_admin/blob/7e5d603a40755f772275d857e9b26276bd332029/fastapi_amis_admin/admin/admin.py#L647-L650

应该改成这样:

if self.site.settings.site_url and iframe.src.startswith(self.site.settings.site_url):
    self.page_schema.url = re.sub(r"^https?://", "", iframe.src)
else:
    self.page_schema.url = iframe.src

sqlalchemy.exc.ArgumentError: Mapper mapped class UserRoleLink->auth_user_roles could not assemble any primary key columns for mapped table 'auth_user_roles'

您好,我在使用的过程中有一点点问题,希望能得到您的思路指导。

报错信息如下:

INFO:     Started reloader process [1] using StatReload
Process SpawnProcess-1:
Traceback (most recent call last):
  File "/opt/conda/lib/python3.9/multiprocessing/process.py", line 315, in _bootstrap
    self.run()
  File "/opt/conda/lib/python3.9/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/conda/lib/python3.9/site-packages/uvicorn/_subprocess.py", line 76, in subprocess_started
    target(sockets=sockets)
  File "/opt/conda/lib/python3.9/site-packages/uvicorn/server.py", line 60, in run
    return asyncio.run(self.serve(sockets=sockets))
  File "/opt/conda/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/opt/conda/lib/python3.9/asyncio/base_events.py", line 647, in run_until_complete
    return future.result()
  File "/opt/conda/lib/python3.9/site-packages/uvicorn/server.py", line 67, in serve
    config.load()
  File "/opt/conda/lib/python3.9/site-packages/uvicorn/config.py", line 477, in load
    self.loaded_app = import_from_string(self.app)
  File "/opt/conda/lib/python3.9/site-packages/uvicorn/importer.py", line 21, in import_from_string
    module = importlib.import_module(module_str)
  File "/opt/conda/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/jovyan/./ui_server/main.py", line 7, in <module>
    from fastapi_user_auth.auth import AuthBackend
  File "/opt/conda/lib/python3.9/site-packages/fastapi_user_auth/auth/__init__.py", line 1, in <module>
    from .auth import Auth as Auth
  File "/opt/conda/lib/python3.9/site-packages/fastapi_user_auth/auth/auth.py", line 37, in <module>
    from .backends.base import BaseTokenStore
  File "/opt/conda/lib/python3.9/site-packages/fastapi_user_auth/auth/backends/base.py", line 3, in <module>
    from fastapi_user_auth.auth.schemas import BaseTokenData
  File "/opt/conda/lib/python3.9/site-packages/fastapi_user_auth/auth/schemas.py", line 5, in <module>
    from .models import BaseUser, EmailMixin, PasswordMixin, UsernameMixin
  File "/opt/conda/lib/python3.9/site-packages/fastapi_user_auth/auth/models.py", line 56, in <module>
    class UserRoleLink(SQLModel, table=True):
  File "/opt/conda/lib/python3.9/site-packages/sqlmodelx/main.py", line 182, in __init__
    DeclarativeMeta.__init__(cls, classname, bases, dict_used, **kw)
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/decl_api.py", line 72, in __init__
    _as_declarative(reg, cls, dict_)
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.py", line 126, in _as_declarative
    return _MapperConfig.setup_mapping(registry, cls, dict_, None, {})
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.py", line 177, in setup_mapping
    return cfg_cls(registry, cls_, dict_, table, mapper_kw)
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.py", line 326, in __init__
    self._early_mapping(mapper_kw)
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.py", line 209, in _early_mapping
    self.map(mapper_kw)
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.py", line 1004, in map
    mapper_cls(self.cls, self.local_table, **self.mapper_args),
  File "<string>", line 2, in __init__
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/util/deprecations.py", line 298, in warned
    return fn(*args, **kwargs)
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 685, in __init__
    self._configure_pks()
  File "/opt/conda/lib/python3.9/site-packages/sqlalchemy/orm/mapper.py", line 1370, in _configure_pks
    raise sa_exc.ArgumentError(
sqlalchemy.exc.ArgumentError: Mapper mapped class UserRoleLink->auth_user_roles could not assemble any primary key columns for mapped table 'auth_user_roles'

我的环境:
FROM jupyterhub/k8s-singleuser-sample:1.2.0

我的pip包版本:
`
aiosqlite 0.17.0

sqlalchemy_database 0.1.0

sqlalchemy2-stubs 0.0.2a29

sqlmodel 0.0.8

sqlmodelx 0.0.4

sqlparse 0.4.3

`

M2M 关系中,添加关系后无法保存

image
如图,在官方的例子中,选择了需要的条目后,虽然能够显示到页面上,但是无法自动保存,也没有按钮等操作可以保存到数据库,导致页面刷新后,已选择的数据会丢失。

QuickSaveItemApi错误,请修正代码

admin/admin.py 文件 中 :
primaryField=self.pk_name,
quickSaveItemApi=f"put:{self.router_path}/item/" + "${id}",
改为:
primaryField=self.pk_name,
quickSaveItemApi=f"put:{self.router_path}/item/${self.pk_name}"
否则pk_name不为id时,会报405错误

[建议]使用amis-python代替fastapi_amis.admin.amis

amis-python对fastapi_amis.admin.amis做了一些改进:

  • 涵盖amis截至2.3.1版本的所有组件
  • 使用jinja2模板,方便扩展
  • 支持修改主题

fastapi-amis-admin通过简单的修改即可迁移到amis-python:

  1. 将对BaseAmisModel.amis_dictBaseAmisModel.amis_json两个方法的调用修改为to_dictto_json,或者增加别名方法也可。
  2. Type[Page].amis_html的调用修改为Page.render,或者在Page中增加render的别名方法。只要注意template_pathtemplate_name两个参数的不同即可。

运行报错,提示AttributeError: 'NoneType' object has no attribute 'lower'

按照Readme文件配置运行,faa run或者 ./scripts/run.sh时均出现以下错误

File "./main.py", line 4, in
from core.adminsite import site
File "./core/init.py", line 1, in
from fastapi_amis_admin import i18n
File "/root/venv/lib/python3.8/site-packages/fastapi_amis_admin/init.py", line 7, in
from .utils.translation import i18n
File "/root/venv/lib/python3.8/site-packages/fastapi_amis_admin/utils/translation.py", line 46, in
i18n = I18N()
File "/root/venv/lib/python3.8/site-packages/fastapi_amis_admin/utils/translation.py", line 11, in init
self._language: str = self.set_language()
File "/root/venv/lib/python3.8/site-packages/fastapi_amis_admin/utils/translation.py", line 27, in set_language
self._language = 'zh_CN' if language.lower().startswith('zh') else 'en_US'
AttributeError: 'NoneType' object has no attribute 'lower'

不知道怎么解决?

请教:fastapi-sqlmodel-crud 怎么使用?

class Article(SQLModel, table=True):
id: int = Field(default=None, primary_key=True, nullable=False)
title: str = Field(title='ArticleTitle', max_length=200)
description: Optional[str] = Field(default='', title='ArticleDescription', max_length=400)
status: bool = Field(None, title='status')
content: str = Field(title='ArticleContent')

article_crud = SQLModelCrud(model=Article, engine=engine).register_crud()

我想用的model的主键字段不是id,需要制定pk_name,请问SQLModelCrud的构造方法应该怎么写?

Post array data to ModelAdmin.create, get wrong response

using ModelAdmin Example, as default enable_bulk_create is False

class CategoryAdmin(admin.ModelAdmin):
    page_schema = "Category"
    model = Category
    #enable_bulk_create = True

post to /admin/CategoryAdmin/item

use data [{"name":"1","description":"1"},{"name":"2","description":"2"}], get correct response value_error.jsondecode.

but use data [{"name":"1","description":"1"}], get wrong response msg : success "data" : {"name" : "description", "description" : ""}`

change enable_bulk_create = True

class CategoryAdmin(admin.ModelAdmin):
    page_schema = "Category"
    model = Category
    enable_bulk_create = True

post to /admin/CategoryAdmin/item

use data [{"name":"1","description":"1"}] or [{"name":"1","description":"1"},{"name":"2","description":"2"}], get same wrong response msg : success "data" : {"name" : "description", "description" : ""}`

404

/demo (master)$ git pull
$ python demo-model.py
INFO: Started server process [23792]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: 127.0.0.1:13268 - "GET / HTTP/1.1" 404 Not Found
INFO: 127.0.0.1:13268 - "GET /pwabuilder-sw.js HTTP/1.1" 40 04 Not Found

excel批量上传的字段赋值

update_time: Optional[datetime] = Field(default_factory=datetime.utcnow, title='UpdateTime')
description: str = Field(default='', title='描述', amis_form_item='textarea')

我想定义一个字段为
1.可选,
要实现excel批量上传时,不会出现字段值不存在的情况
2.存在但是有默认值设置
要实现excel批量上传时,不会出现字段值不合理的情况

我测试的情况 好像excel必须要对这些字段值进行填充才能上传

如何实现一个动态内容的下拉选择?

我希望能在每一次加载页面的时候根据情况生成下拉选择框的成员, 我尝试在get_form_item里截取当前item然后往里面添加一些新的选项, 但是新的选项过不了FastApi的校验, 我尝试修改枚举也无效, 似乎fastapi总是持有最开始的那个枚举. 当前代码如下:

class NtpVersionEnum(Choices):
    t = "t"
    q = 'asd'

@site.register_admin
class 生成区域掩码(admin.FormAdmin):
    page_schema = '生成'

    form = Form(title='生成区域参数', submitText='提交')

    class schema(BaseModel):
        ntp_version: NtpVersionEnum = Field(NtpVersionEnum.t, title='NTP版本')

    async def handle(self, request: Request, data: BaseModel, **kwargs) -> BaseApiOut[Any]:
        return BaseApiOut(msg='登录成功!', data={'token': 'xxxxxx'})

    async def get_form_item(self, request: Request, modelfield: ModelField) -> Form:
        item = await super().get_form_item(request, modelfield)

        if item.label == 'NTP版本':
            global NtpVersionEnum
            new_enum = Choices('NtpVersionEnum', {'t': 't', 'q': 'q', 'apple': 'apple'})
            print(NtpVersionEnum._member_map_, NtpVersionEnum._member_names_)
            NtpVersionEnum._member_map_ = new_enum._member_map_
            NtpVersionEnum._member_names_ = new_enum._member_names_
            NtpVersionEnum._member_type_ = new_enum._member_type_
            objprint.objprint(NtpVersionEnum._member_map_, NtpVersionEnum._member_names_)
            objprint.objprint(NtpVersionEnum.__dict__)

            item.options.append(Select(value='apple', label='apple'))

        return item

报错为:

{"detail":[{"loc":["body","ntp_version"],"msg":"value is not a valid enumeration member; permitted: 't', 'q', 'apple'","type":"type_error.enum","ctx":{"enum_values":["t","q","apple"]}}]}

说是不允许 apple, 实际上传入的就是 apple.

我已经搜了一些关于如何动态定于应用于fastapi的enum的东西, 不过看起来很难, amis这里是否可能给出一个动态选项并且不使用枚举来约束呢? 如果不太复杂, 也可以给我一些指引, 我来做一个PR

postgresql+asyncpg 组合改数据有问题

使用 postgresql+asyncpg 的组合,在更改数据时界面提示内部错误,终端提示:

sqlalchemy.exc.ProgrammingError: (sqlalchemy.dialects.postgresql.asyncpg.ProgrammingError) <class 'asyncpg.exceptions.UndefinedFunctionError'>: operator does not exist: integer = character varying        
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
[SQL: UPDATE "user" SET username=%s WHERE "user".id IN (%s)]
[parameters: ('zhangsan6', '1')]
(Background on this error at: https://sqlalche.me/e/14/f405)

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.