本文整理汇总了Golang中github.com/rs/rest-layer/resource.NewIndex函数的典型用法代码示例。如果您正苦于以下问题:Golang NewIndex函数的具体用法?Golang NewIndex怎么用?Golang NewIndex使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewIndex函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: TestHandlerGetItem
func TestHandlerGetItem(t *testing.T) {
s := mem.NewHandler()
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", Payload: map[string]interface{}{"id": "1"}},
{ID: "2", Payload: map[string]interface{}{"id": "2"}},
{ID: "3", Payload: map[string]interface{}{"id": "3"}},
})
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{}, s, resource.DefaultConf)
r, _ := http.NewRequest("GET", "/test/2", nil)
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "2",
Resource: test,
},
},
}
status, headers, body := itemGet(context.TODO(), r, rm)
assert.Equal(t, http.StatusOK, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &resource.Item{}) {
i := body.(*resource.Item)
assert.Equal(t, "2", i.ID)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:28,代码来源:method_item_get_test.go
示例2: TestHandlerDeleteItemInvalidFilter
func TestHandlerDeleteItemInvalidFilter(t *testing.T) {
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{}, nil, resource.DefaultConf)
r, _ := http.NewRequest("DELETE", "/test/2", nil)
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "2",
Resource: test,
},
},
Params: url.Values{
"filter": []string{"invalid"},
},
}
status, headers, body := itemDelete(context.TODO(), r, rm)
assert.Equal(t, 422, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, 422, err.Code)
assert.Equal(t, "Invalid `filter` parameter: must be valid JSON", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:26,代码来源:method_item_delete_test.go
示例3: TestHandlerGetItemInvalidIfModifiedSince
func TestHandlerGetItemInvalidIfModifiedSince(t *testing.T) {
s := mem.NewHandler()
now := time.Now()
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", Updated: now, Payload: map[string]interface{}{"id": "1"}},
{ID: "2", Updated: now, Payload: map[string]interface{}{"id": "2"}},
{ID: "3", Updated: now, Payload: map[string]interface{}{"id": "3"}},
})
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{}, s, resource.DefaultConf)
r, _ := http.NewRequest("GET", "/test/2", nil)
r.Header.Set("If-Modified-Since", "invalid date")
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "2",
Resource: test,
},
},
}
status, headers, body := itemGet(context.TODO(), r, rm)
assert.Equal(t, http.StatusBadRequest, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, http.StatusBadRequest, err.Code)
assert.Equal(t, "Invalid If-Modified-Since header", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:31,代码来源:method_item_get_test.go
示例4: TestHandlerGetItemInvalidLookupSort
func TestHandlerGetItemInvalidLookupSort(t *testing.T) {
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{}, nil, resource.DefaultConf)
r, _ := http.NewRequest("GET", "/test", nil)
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "1",
Resource: test,
},
},
Params: url.Values{
"sort": []string{"invalid"},
},
}
status, headers, body := itemGet(context.TODO(), r, rm)
assert.Equal(t, 422, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, 422, err.Code)
assert.Equal(t, "Invalid `sort` paramter: invalid sort field: invalid", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:26,代码来源:method_item_get_test.go
示例5: TestHandlerGetItemModifiedDontMatch
func TestHandlerGetItemModifiedDontMatch(t *testing.T) {
s := mem.NewHandler()
now := time.Now()
yesterday := now.Add(-24 * time.Hour)
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", Updated: now, Payload: map[string]interface{}{"id": "1"}},
{ID: "2", Updated: now, Payload: map[string]interface{}{"id": "2"}},
{ID: "3", Updated: now, Payload: map[string]interface{}{"id": "3"}},
})
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{}, s, resource.DefaultConf)
r, _ := http.NewRequest("GET", "/test/2", nil)
r.Header.Set("If-Modified-Since", yesterday.Format(time.RFC1123))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "2",
Resource: test,
},
},
}
status, headers, body := itemGet(context.TODO(), r, rm)
assert.Equal(t, http.StatusOK, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &resource.Item{}) {
i := body.(*resource.Item)
assert.Equal(t, "2", i.ID)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:31,代码来源:method_item_get_test.go
示例6: TestHandlerGetItemEtagMatch
func TestHandlerGetItemEtagMatch(t *testing.T) {
s := mem.NewHandler()
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", ETag: "a", Payload: map[string]interface{}{"id": "1"}},
{ID: "2", ETag: "a", Payload: map[string]interface{}{"id": "2"}},
{ID: "3", ETag: "a", Payload: map[string]interface{}{"id": "3"}},
})
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{}, s, resource.DefaultConf)
r, _ := http.NewRequest("GET", "/test/2", nil)
r.Header.Set("If-None-Match", "a")
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "2",
Resource: test,
},
},
}
status, headers, body := itemGet(context.TODO(), r, rm)
assert.Equal(t, http.StatusNotModified, status)
assert.Nil(t, headers)
assert.Nil(t, body)
}
开发者ID:rs,项目名称:rest-layer,代码行数:26,代码来源:method_item_get_test.go
示例7: main
func main() {
index := resource.NewIndex()
users := index.Bind("users", resource.New(models.UserSchema, mem.NewHandler(), resource.Conf{
AllowedModes: resource.ReadWrite,
PaginationDefaultLimit: 50,
}))
models.SetAuthUserResource(users)
index.Bind("auth", resource.New(models.AuthSchema, mem.NewHandler(), resource.Conf{
AllowedModes: []resource.Mode{resource.Create},
}))
api, err := rest.NewHandler(index)
if err != nil {
log.Fatal(err)
}
http.Handle("/", api)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
开发者ID:apuigsech,项目名称:rest-layer,代码行数:25,代码来源:main.go
示例8: TestHandlerDeleteItemEtag
func TestHandlerDeleteItemEtag(t *testing.T) {
s := mem.NewHandler()
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", ETag: "a", Payload: map[string]interface{}{"id": "1"}},
})
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{
Fields: schema.Fields{"foo": {Filterable: true}},
}, s, resource.DefaultConf)
r, _ := http.NewRequest("DELETE", "/test/2", nil)
r.Header.Set("If-Match", "a")
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "1",
Resource: test,
},
},
}
status, headers, body := itemDelete(context.TODO(), r, rm)
assert.Equal(t, http.StatusNoContent, status)
assert.Nil(t, headers)
assert.Nil(t, body)
l, err := s.Find(context.TODO(), resource.NewLookup(), 1, -1)
assert.NoError(t, err)
assert.Len(t, l.Items, 0)
}
开发者ID:rs,项目名称:rest-layer,代码行数:30,代码来源:method_item_delete_test.go
示例9: TestHandlerPostListWithReferenceNoRouter
func TestHandlerPostListWithReferenceNoRouter(t *testing.T) {
s := mem.NewHandler()
index := resource.NewIndex()
index.Bind("foo", schema.Schema{Fields: schema.Fields{"id": {}}}, s, resource.DefaultConf)
bar := index.Bind("bar", schema.Schema{Fields: schema.Fields{
"id": {},
"foo": {Validator: &schema.Reference{Path: "foo"}},
}}, s, resource.DefaultConf)
r, _ := http.NewRequest("POST", "/bar", bytes.NewBufferString(`{"id": "1", "foo": "nonexisting"}`))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "bar",
Resource: bar,
},
},
}
status, _, body := listPost(context.TODO(), r, rm)
assert.Equal(t, http.StatusInternalServerError, status)
if assert.IsType(t, &Error{}, body) {
err := body.(*Error)
assert.Equal(t, http.StatusInternalServerError, err.Code)
assert.Equal(t, "Router not available in context", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:25,代码来源:method_post_test.go
示例10: TestNewHandler
func TestNewHandler(t *testing.T) {
i := resource.NewIndex()
h, err := NewHandler(i)
assert.NoError(t, err)
assert.Equal(t, DefaultResponseSender{}, h.ResponseSender)
assert.Equal(t, i, h.index)
}
开发者ID:C8E,项目名称:rest-layer,代码行数:7,代码来源:handler_test.go
示例11: TestHandlerPatchItemReplaceInvalidModifiedSinceDate
func TestHandlerPatchItemReplaceInvalidModifiedSinceDate(t *testing.T) {
index := resource.NewIndex()
s := mem.NewHandler()
now := time.Now()
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", Updated: now, Payload: map[string]interface{}{"id": "1"}},
})
test := index.Bind("test", schema.Schema{Fields: schema.Fields{"id": {}}}, s, resource.DefaultConf)
r, _ := http.NewRequest("PATCH", "/test/1", bytes.NewBufferString(`{"id": "1"}`))
r.Header.Set("If-Unmodified-Since", "invalid date")
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "1",
Resource: test,
},
},
}
status, _, body := itemPatch(context.TODO(), r, rm)
assert.Equal(t, http.StatusBadRequest, status)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, http.StatusBadRequest, err.Code)
assert.Equal(t, "Invalid If-Unmodified-Since header", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:28,代码来源:method_item_patch_test.go
示例12: TestHandlerPatchItemNoStorage
func TestHandlerPatchItemNoStorage(t *testing.T) {
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{Fields: schema.Fields{"id": {}}}, nil, resource.Conf{
AllowedModes: []resource.Mode{resource.Replace},
})
r, _ := http.NewRequest("PATCH", "/test/1", bytes.NewBufferString(`{}`))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "1",
Resource: test,
},
},
}
status, headers, body := itemPatch(context.TODO(), r, rm)
assert.Equal(t, http.StatusNotImplemented, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, http.StatusNotImplemented, err.Code)
assert.Equal(t, "No Storage Defined", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:25,代码来源:method_item_patch_test.go
示例13: main
func main() {
// Create a REST API resource index
index := resource.NewIndex()
// Add a resource on /users[/:user_id]
users := index.Bind("users", user, mem.NewHandler(), resource.Conf{
// We allow all REST methods
// (rest.ReadWrite is a shortcut for []resource.Mode{resource.Create, resource.Read, resource.Update, resource.Delete, resource,List})
AllowedModes: resource.ReadWrite,
})
// Bind a sub resource on /users/:user_id/posts[/:post_id]
// and reference the user on each post using the "user" field of the posts resource.
posts := users.Bind("posts", "user", post, mem.NewHandler(), resource.Conf{
// Posts can only be read, created and deleted, not updated
AllowedModes: []resource.Mode{resource.Read, resource.List, resource.Create, resource.Delete},
})
// Add a friendly alias to public posts
// (equivalent to /users/:user_id/posts?filter={"published":true})
posts.Alias("public", url.Values{"filter": []string{"{\"published\":true}"}})
// Create API HTTP handler for the resource graph
api, err := rest.NewHandler(index)
if err != nil {
log.Fatalf("Invalid API configuration: %s", err)
}
c := alice.New()
// Add close notifier handler so context is cancelled when the client closes
// the connection
// c.Append(xhandler.CloseHandler)
// Add timeout handler
// c.Append(xhandler.TimeoutHandler(2 * time.Second))
// Install a logger (see https://github.com/rs/xlog)
c = c.Append(xlog.NewHandler(xlog.Config{}))
resource.LoggerLevel = resource.LogLevelDebug
resource.Logger = func(ctx context.Context, level resource.LogLevel, msg string, fields map[string]interface{}) {
xlog.FromContext(ctx).OutputF(xlog.Level(level), 2, msg, fields)
}
// Log API access
c = c.Append(xaccess.NewHandler())
// Add CORS support with passthrough option on so rest-layer can still
// handle OPTIONS method
c = c.Append(cors.New(cors.Options{OptionsPassthrough: true}).Handler)
// Bind the API under /api/ path
http.Handle("/api/", http.StripPrefix("/api/", c.Then(api)))
// Serve it
log.Print("Serving API on http://localhost:8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:60,代码来源:main.go
示例14: TestHandlerPatchItemCannotChangeID
func TestHandlerPatchItemCannotChangeID(t *testing.T) {
index := resource.NewIndex()
s := mem.NewHandler()
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", Payload: map[string]interface{}{"id": "1"}},
})
test := index.Bind("test", schema.Schema{Fields: schema.Fields{"id": {}}}, s, resource.DefaultConf)
r, _ := http.NewRequest("PATCH", "/test/1", bytes.NewBufferString(`{"id": "2"}`))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "1",
Resource: test,
},
},
}
status, headers, body := itemPatch(context.TODO(), r, rm)
assert.Equal(t, 422, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, 422, err.Code)
assert.Equal(t, "Cannot change document ID", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:27,代码来源:method_item_patch_test.go
示例15: Example
func Example() {
session, err := mgo.Dial("")
if err != nil {
log.Fatalf("Can't connect to MongoDB: %s", err)
}
db := "test_rest_layer"
index := resource.NewIndex()
users := index.Bind("users", user, mongo.NewHandler(session, db, "users"), resource.Conf{
AllowedModes: resource.ReadWrite,
})
users.Bind("posts", "user", post, mongo.NewHandler(session, db, "posts"), resource.Conf{
AllowedModes: resource.ReadWrite,
})
api, err := rest.NewHandler(index)
if err != nil {
log.Fatalf("Invalid API configuration: %s", err)
}
http.Handle("/", cors.New(cors.Options{OptionsPassthrough: true}).Handler(api))
log.Print("Serving API on http://localhost:8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
开发者ID:rs,项目名称:rest-layer-mongo,代码行数:29,代码来源:example_test.go
示例16: TestHandlerPatchItemFound
func TestHandlerPatchItemFound(t *testing.T) {
index := resource.NewIndex()
s := mem.NewHandler()
s.Insert(context.TODO(), []*resource.Item{
{ID: "1", Payload: map[string]interface{}{"id": "1", "foo": "bar"}},
{ID: "2", Payload: map[string]interface{}{"id": "2", "foo": "bar"}},
{ID: "3", Payload: map[string]interface{}{"id": "3", "foo": "bar"}},
})
test := index.Bind("test", schema.Schema{Fields: schema.Fields{
"id": {},
"foo": {},
}}, s, resource.DefaultConf)
r, _ := http.NewRequest("PATCH", "/test/2", bytes.NewBufferString(`{"id": "2", "foo": "baz"}`))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Field: "id",
Value: "2",
Resource: test,
},
},
}
status, headers, body := itemPatch(context.TODO(), r, rm)
assert.Equal(t, http.StatusOK, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &resource.Item{}) {
i := body.(*resource.Item)
assert.Equal(t, "2", i.ID)
assert.Equal(t, map[string]interface{}{"id": "2", "foo": "baz"}, i.Payload)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:32,代码来源:method_item_patch_test.go
示例17: TestHandlerPostListWithReference
func TestHandlerPostListWithReference(t *testing.T) {
s := mem.NewHandler()
s.Insert(context.Background(), []*resource.Item{{ID: "ref", Payload: map[string]interface{}{"id": "ref"}}})
index := resource.NewIndex()
index.Bind("foo", schema.Schema{Fields: schema.Fields{"id": {}}}, s, resource.DefaultConf)
bar := index.Bind("bar", schema.Schema{Fields: schema.Fields{
"id": {},
"foo": {Validator: &schema.Reference{Path: "foo"}},
}}, s, resource.DefaultConf)
r, _ := http.NewRequest("POST", "/bar", bytes.NewBufferString(`{"id": "1", "foo": "ref"}`))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "bar",
Resource: bar,
},
},
}
ctx := contextWithIndex(context.Background(), index)
status, _, body := listPost(ctx, r, rm)
assert.Equal(t, http.StatusCreated, status)
if assert.IsType(t, &resource.Item{}, body) {
item := body.(*resource.Item)
assert.Equal(t, "1", item.ID)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:26,代码来源:method_post_test.go
示例18: TestHandlerPostListWithSubSchemaReferenceNotFound
func TestHandlerPostListWithSubSchemaReferenceNotFound(t *testing.T) {
s := mem.NewHandler()
s.Insert(context.Background(), []*resource.Item{{ID: "ref", Payload: map[string]interface{}{"id": "ref"}}})
index := resource.NewIndex()
index.Bind("foo", schema.Schema{Fields: schema.Fields{"id": {}}}, s, resource.DefaultConf)
bar := index.Bind("bar", schema.Schema{Fields: schema.Fields{
"id": {},
"sub": {
Schema: &schema.Schema{
Fields: schema.Fields{
"foo": {Validator: &schema.Reference{Path: "foo"}},
},
},
},
}}, s, resource.DefaultConf)
r, _ := http.NewRequest("POST", "/bar", bytes.NewBufferString(`{"id": "1", "sub": {"foo": "notfound"}}`))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "bar",
Resource: bar,
},
},
}
ctx := contextWithIndex(context.Background(), index)
status, _, body := listPost(ctx, r, rm)
assert.Equal(t, http.StatusNotFound, status)
if assert.IsType(t, &Error{}, body) {
err := body.(*Error)
assert.Equal(t, http.StatusNotFound, err.Code)
assert.Equal(t, "Resource reference not found for field `foo'", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:33,代码来源:method_post_test.go
示例19: TestHandlerGetListInvalidPage
func TestHandlerGetListInvalidPage(t *testing.T) {
index := resource.NewIndex()
test := index.Bind("test", schema.Schema{}, nil, resource.DefaultConf)
r, _ := http.NewRequest("GET", "/test", nil)
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "test",
Resource: test,
},
},
Params: url.Values{
"page": []string{"invalid"},
},
}
status, headers, body := listGet(context.TODO(), r, rm)
assert.Equal(t, 422, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, 422, err.Code)
assert.Equal(t, "Invalid `page` parameter", err.Message)
}
rm.Params.Set("page", "-1")
status, headers, body = listGet(context.TODO(), r, rm)
assert.Equal(t, 422, status)
assert.Nil(t, headers)
if assert.IsType(t, body, &Error{}) {
err := body.(*Error)
assert.Equal(t, 422, err.Code)
assert.Equal(t, "Invalid `page` parameter", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:35,代码来源:method_get_test.go
示例20: TestHandlerPostListWithReferenceOtherError
func TestHandlerPostListWithReferenceOtherError(t *testing.T) {
s := mem.NewHandler()
index := resource.NewIndex()
index.Bind("foo", schema.Schema{Fields: schema.Fields{"id": {}}}, nil, resource.DefaultConf)
bar := index.Bind("bar", schema.Schema{Fields: schema.Fields{
"id": {},
"foo": {Validator: &schema.Reference{Path: "foo"}},
}}, s, resource.DefaultConf)
r, _ := http.NewRequest("POST", "/bar", bytes.NewBufferString(`{"id": "1", "foo": "1"}`))
rm := &RouteMatch{
ResourcePath: []*ResourcePathComponent{
&ResourcePathComponent{
Name: "bar",
Resource: bar,
},
},
}
ctx := contextWithIndex(context.Background(), index)
status, _, body := listPost(ctx, r, rm)
assert.Equal(t, http.StatusInternalServerError, status)
if assert.IsType(t, &Error{}, body) {
err := body.(*Error)
assert.Equal(t, http.StatusInternalServerError, err.Code)
assert.Equal(t, "Error fetching resource reference for field `foo': No Storage Defined", err.Message)
}
}
开发者ID:rs,项目名称:rest-layer,代码行数:26,代码来源:method_post_test.go
注:本文中的github.com/rs/rest-layer/resource.NewIndex函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论