Quellcode durchsuchen

homepage recommend

丁云鹏 vor 1 Jahr
Ursprung
Commit
66d7f74756
23 geänderte Dateien mit 6770 neuen und 3 gelöschten Zeilen
  1. 1 1
      logs/recommend-server/log_info.log
  2. 0 1
      pom.xml
  3. 49 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/common/Common.java
  4. 637 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/common/Result.java
  5. 31 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/common/ResultOrBuilder.java
  6. 2779 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendRequest.java
  7. 235 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendRequestOrBuilder.java
  8. 966 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendResponse.java
  9. 48 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendResponseOrBuilder.java
  10. 95 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/Recommend.java
  11. 245 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendService.java
  12. 300 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendServiceGrpc.java
  13. 1028 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/Video.java
  14. 63 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/VideoOrBuilder.java
  15. 9 0
      recommend-server-client/src/main/proto/com/tzld/piaoquan/recommend/server/common.proto
  16. 52 0
      recommend-server-client/src/main/proto/com/tzld/piaoquan/recommend/server/recommend.proto
  17. 5 0
      recommend-server-service/pom.xml
  18. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/grpcservice/HelloService.java
  19. 23 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/grpcservice/RecommendService.java
  20. 18 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/param/AbExpCode.java
  21. 27 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/param/HomepageRecommendParam.java
  22. 26 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/MidService.java
  23. 132 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java

+ 1 - 1
logs/recommend-server/log_info.log

@@ -99,7 +99,7 @@ Error starting ApplicationContext. To display the conditions report re-run your
 2023-10-30 15:56:31.455 [main] INFO  org.apache.coyote.http11.Http11NioProtocol(173) - Starting ProtocolHandler ["http-nio-8080"]
 2023-10-30 15:56:31.492 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer(220) - Tomcat started on port(s): 8080 (http) with context path '/recommend-sort'
 2023-10-30 15:56:31.498 [main] INFO  o.s.c.n.e.s.EurekaAutoServiceRegistration(144) - Updating port to 8080
-2023-10-30 15:56:31.526 [main] INFO  n.d.b.g.s.serverfactory.AbstractGrpcServerFactory(115) - Registered gRPC service: HelloService, bean: helloService, class: com.tzld.piaoquan.recommend.server.service.HelloService
+2023-10-30 15:56:31.526 [main] INFO  n.d.b.g.s.serverfactory.AbstractGrpcServerFactory(115) - Registered gRPC service: HelloService, bean: helloService, class: com.tzld.piaoquan.recommend.server.grpcservice.HelloService
 2023-10-30 15:56:31.530 [DiscoveryClient-InstanceInfoReplicator-0] INFO  com.netflix.discovery.DiscoveryClient(882) - DiscoveryClient_RECOMMEND-SERVER/192.168.80.15:recommend-server:8080 - registration status: 204
 2023-10-30 15:56:36.599 [main] INFO  n.d.b.g.server.serverfactory.GrpcServerLifecycle(91) - gRPC Server started, listening on address: *, port: 9090
 2023-10-30 15:56:36.641 [main] INFO  com.tzld.piaoquan.recommend.server.Application(61) - Started Application in 47.131 seconds (JVM running for 52.808)

+ 0 - 1
pom.xml

@@ -20,7 +20,6 @@
     </modules>
 
     <dependencies>
-
     </dependencies>
 
 </project>

+ 49 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/common/Common.java

@@ -0,0 +1,49 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/common.proto
+
+package com.tzld.piaoquan.recommend.server.gen.common;
+
+public final class Common {
+  private Common() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_Result_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_Result_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n/com/tzld/piaoquan/recommend/server/com" +
+      "mon.proto\"\'\n\006Result\022\014\n\004code\030\001 \001(\005\022\017\n\007mes" +
+      "sage\030\002 \001(\tB1\n-com.tzld.piaoquan.recommen" +
+      "d.server.gen.commonP\001b\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        });
+    internal_static_Result_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_Result_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_Result_descriptor,
+        new java.lang.String[] { "Code", "Message", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}

+ 637 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/common/Result.java

@@ -0,0 +1,637 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/common.proto
+
+package com.tzld.piaoquan.recommend.server.gen.common;
+
+/**
+ * Protobuf type {@code Result}
+ */
+public final class Result extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:Result)
+    ResultOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Result.newBuilder() to construct.
+  private Result(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Result() {
+    message_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new Result();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Result(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            code_ = input.readInt32();
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            message_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.server.gen.common.Common.internal_static_Result_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.server.gen.common.Common.internal_static_Result_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.server.gen.common.Result.class, com.tzld.piaoquan.recommend.server.gen.common.Result.Builder.class);
+  }
+
+  public static final int CODE_FIELD_NUMBER = 1;
+  private int code_;
+  /**
+   * <pre>
+   * 1 成功
+   * </pre>
+   *
+   * <code>int32 code = 1;</code>
+   * @return The code.
+   */
+  @java.lang.Override
+  public int getCode() {
+    return code_;
+  }
+
+  public static final int MESSAGE_FIELD_NUMBER = 2;
+  private volatile java.lang.Object message_;
+  /**
+   * <code>string message = 2;</code>
+   * @return The message.
+   */
+  @java.lang.Override
+  public java.lang.String getMessage() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      message_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string message = 2;</code>
+   * @return The bytes for message.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMessageBytes() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      message_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (code_ != 0) {
+      output.writeInt32(1, code_);
+    }
+    if (!getMessageBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, message_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (code_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(1, code_);
+    }
+    if (!getMessageBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, message_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.server.gen.common.Result)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.server.gen.common.Result other = (com.tzld.piaoquan.recommend.server.gen.common.Result) obj;
+
+    if (getCode()
+        != other.getCode()) return false;
+    if (!getMessage()
+        .equals(other.getMessage())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + CODE_FIELD_NUMBER;
+    hash = (53 * hash) + getCode();
+    hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getMessage().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.server.gen.common.Result prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code Result}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:Result)
+      com.tzld.piaoquan.recommend.server.gen.common.ResultOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.server.gen.common.Common.internal_static_Result_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.server.gen.common.Common.internal_static_Result_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.server.gen.common.Result.class, com.tzld.piaoquan.recommend.server.gen.common.Result.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.server.gen.common.Result.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      code_ = 0;
+
+      message_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.server.gen.common.Common.internal_static_Result_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.common.Result getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.server.gen.common.Result.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.common.Result build() {
+      com.tzld.piaoquan.recommend.server.gen.common.Result result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.common.Result buildPartial() {
+      com.tzld.piaoquan.recommend.server.gen.common.Result result = new com.tzld.piaoquan.recommend.server.gen.common.Result(this);
+      result.code_ = code_;
+      result.message_ = message_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.server.gen.common.Result) {
+        return mergeFrom((com.tzld.piaoquan.recommend.server.gen.common.Result)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.server.gen.common.Result other) {
+      if (other == com.tzld.piaoquan.recommend.server.gen.common.Result.getDefaultInstance()) return this;
+      if (other.getCode() != 0) {
+        setCode(other.getCode());
+      }
+      if (!other.getMessage().isEmpty()) {
+        message_ = other.message_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.server.gen.common.Result parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.server.gen.common.Result) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private int code_ ;
+    /**
+     * <pre>
+     * 1 成功
+     * </pre>
+     *
+     * <code>int32 code = 1;</code>
+     * @return The code.
+     */
+    @java.lang.Override
+    public int getCode() {
+      return code_;
+    }
+    /**
+     * <pre>
+     * 1 成功
+     * </pre>
+     *
+     * <code>int32 code = 1;</code>
+     * @param value The code to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCode(int value) {
+      
+      code_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * 1 成功
+     * </pre>
+     *
+     * <code>int32 code = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCode() {
+      
+      code_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object message_ = "";
+    /**
+     * <code>string message = 2;</code>
+     * @return The message.
+     */
+    public java.lang.String getMessage() {
+      java.lang.Object ref = message_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        message_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string message = 2;</code>
+     * @return The bytes for message.
+     */
+    public com.google.protobuf.ByteString
+        getMessageBytes() {
+      java.lang.Object ref = message_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        message_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string message = 2;</code>
+     * @param value The message to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMessage(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string message = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMessage() {
+      
+      message_ = getDefaultInstance().getMessage();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string message = 2;</code>
+     * @param value The bytes for message to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMessageBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:Result)
+  }
+
+  // @@protoc_insertion_point(class_scope:Result)
+  private static final com.tzld.piaoquan.recommend.server.gen.common.Result DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.server.gen.common.Result();
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.common.Result getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Result>
+      PARSER = new com.google.protobuf.AbstractParser<Result>() {
+    @java.lang.Override
+    public Result parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Result(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Result> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Result> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.common.Result getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 31 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/common/ResultOrBuilder.java

@@ -0,0 +1,31 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/common.proto
+
+package com.tzld.piaoquan.recommend.server.gen.common;
+
+public interface ResultOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:Result)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * 1 成功
+   * </pre>
+   *
+   * <code>int32 code = 1;</code>
+   * @return The code.
+   */
+  int getCode();
+
+  /**
+   * <code>string message = 2;</code>
+   * @return The message.
+   */
+  java.lang.String getMessage();
+  /**
+   * <code>string message = 2;</code>
+   * @return The bytes for message.
+   */
+  com.google.protobuf.ByteString
+      getMessageBytes();
+}

+ 2779 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendRequest.java

@@ -0,0 +1,2779 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+/**
+ * Protobuf type {@code HomepageRecommendRequest}
+ */
+public final class HomepageRecommendRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:HomepageRecommendRequest)
+    HomepageRecommendRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use HomepageRecommendRequest.newBuilder() to construct.
+  private HomepageRecommendRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private HomepageRecommendRequest() {
+    requestId_ = "";
+    mid_ = "";
+    uid_ = "";
+    categoryId_ = "";
+    algoType_ = "";
+    clientInfo_ = "";
+    abExpInfo_ = "";
+    abInfoData_ = "";
+    machineInfoBrand_ = "";
+    machineInfoModel_ = "";
+    machineInfoPlatform_ = "";
+    pageSource_ = "";
+    recommendSource_ = "";
+    recommendTraceId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new HomepageRecommendRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private HomepageRecommendRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            requestId_ = s;
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            mid_ = s;
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            uid_ = s;
+            break;
+          }
+          case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            categoryId_ = s;
+            break;
+          }
+          case 40: {
+
+            size_ = input.readInt32();
+            break;
+          }
+          case 48: {
+
+            appType_ = input.readInt32();
+            break;
+          }
+          case 58: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            algoType_ = s;
+            break;
+          }
+          case 66: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            clientInfo_ = s;
+            break;
+          }
+          case 74: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            abExpInfo_ = s;
+            break;
+          }
+          case 82: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            abInfoData_ = s;
+            break;
+          }
+          case 88: {
+
+            versionAuditStatus_ = input.readInt32();
+            break;
+          }
+          case 98: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            machineInfoBrand_ = s;
+            break;
+          }
+          case 106: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            machineInfoModel_ = s;
+            break;
+          }
+          case 114: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            machineInfoPlatform_ = s;
+            break;
+          }
+          case 122: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            pageSource_ = s;
+            break;
+          }
+          case 128: {
+
+            versionCode_ = input.readInt32();
+            break;
+          }
+          case 138: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            recommendSource_ = s;
+            break;
+          }
+          case 144: {
+
+            sceneType_ = input.readInt32();
+            break;
+          }
+          case 154: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            recommendTraceId_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.class, com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.Builder.class);
+  }
+
+  public static final int REQUEST_ID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object requestId_;
+  /**
+   * <code>string request_id = 1;</code>
+   * @return The requestId.
+   */
+  @java.lang.Override
+  public java.lang.String getRequestId() {
+    java.lang.Object ref = requestId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      requestId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string request_id = 1;</code>
+   * @return The bytes for requestId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getRequestIdBytes() {
+    java.lang.Object ref = requestId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      requestId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int MID_FIELD_NUMBER = 2;
+  private volatile java.lang.Object mid_;
+  /**
+   * <code>string mid = 2;</code>
+   * @return The mid.
+   */
+  @java.lang.Override
+  public java.lang.String getMid() {
+    java.lang.Object ref = mid_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      mid_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string mid = 2;</code>
+   * @return The bytes for mid.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMidBytes() {
+    java.lang.Object ref = mid_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      mid_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int UID_FIELD_NUMBER = 3;
+  private volatile java.lang.Object uid_;
+  /**
+   * <code>string uid = 3;</code>
+   * @return The uid.
+   */
+  @java.lang.Override
+  public java.lang.String getUid() {
+    java.lang.Object ref = uid_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      uid_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string uid = 3;</code>
+   * @return The bytes for uid.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getUidBytes() {
+    java.lang.Object ref = uid_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      uid_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CATEGORY_ID_FIELD_NUMBER = 4;
+  private volatile java.lang.Object categoryId_;
+  /**
+   * <code>string category_id = 4;</code>
+   * @return The categoryId.
+   */
+  @java.lang.Override
+  public java.lang.String getCategoryId() {
+    java.lang.Object ref = categoryId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      categoryId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string category_id = 4;</code>
+   * @return The bytes for categoryId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCategoryIdBytes() {
+    java.lang.Object ref = categoryId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      categoryId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int SIZE_FIELD_NUMBER = 5;
+  private int size_;
+  /**
+   * <pre>
+   * default 4
+   * </pre>
+   *
+   * <code>int32 size = 5;</code>
+   * @return The size.
+   */
+  @java.lang.Override
+  public int getSize() {
+    return size_;
+  }
+
+  public static final int APP_TYPE_FIELD_NUMBER = 6;
+  private int appType_;
+  /**
+   * <pre>
+   * default 4
+   * </pre>
+   *
+   * <code>int32 app_type = 6;</code>
+   * @return The appType.
+   */
+  @java.lang.Override
+  public int getAppType() {
+    return appType_;
+  }
+
+  public static final int ALGO_TYPE_FIELD_NUMBER = 7;
+  private volatile java.lang.Object algoType_;
+  /**
+   * <code>string algo_type = 7;</code>
+   * @return The algoType.
+   */
+  @java.lang.Override
+  public java.lang.String getAlgoType() {
+    java.lang.Object ref = algoType_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      algoType_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string algo_type = 7;</code>
+   * @return The bytes for algoType.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAlgoTypeBytes() {
+    java.lang.Object ref = algoType_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      algoType_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CLIENT_INFO_FIELD_NUMBER = 8;
+  private volatile java.lang.Object clientInfo_;
+  /**
+   * <code>string client_info = 8;</code>
+   * @return The clientInfo.
+   */
+  @java.lang.Override
+  public java.lang.String getClientInfo() {
+    java.lang.Object ref = clientInfo_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      clientInfo_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string client_info = 8;</code>
+   * @return The bytes for clientInfo.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getClientInfoBytes() {
+    java.lang.Object ref = clientInfo_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      clientInfo_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int AB_EXP_INFO_FIELD_NUMBER = 9;
+  private volatile java.lang.Object abExpInfo_;
+  /**
+   * <code>string ab_exp_info = 9;</code>
+   * @return The abExpInfo.
+   */
+  @java.lang.Override
+  public java.lang.String getAbExpInfo() {
+    java.lang.Object ref = abExpInfo_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      abExpInfo_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string ab_exp_info = 9;</code>
+   * @return The bytes for abExpInfo.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAbExpInfoBytes() {
+    java.lang.Object ref = abExpInfo_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      abExpInfo_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int AB_INFO_DATA_FIELD_NUMBER = 10;
+  private volatile java.lang.Object abInfoData_;
+  /**
+   * <code>string ab_info_data = 10;</code>
+   * @return The abInfoData.
+   */
+  @java.lang.Override
+  public java.lang.String getAbInfoData() {
+    java.lang.Object ref = abInfoData_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      abInfoData_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string ab_info_data = 10;</code>
+   * @return The bytes for abInfoData.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAbInfoDataBytes() {
+    java.lang.Object ref = abInfoData_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      abInfoData_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int VERSION_AUDIT_STATUS_FIELD_NUMBER = 11;
+  private int versionAuditStatus_;
+  /**
+   * <pre>
+   * default 2
+   * </pre>
+   *
+   * <code>int32 version_audit_status = 11;</code>
+   * @return The versionAuditStatus.
+   */
+  @java.lang.Override
+  public int getVersionAuditStatus() {
+    return versionAuditStatus_;
+  }
+
+  public static final int MACHINE_INFO_BRAND_FIELD_NUMBER = 12;
+  private volatile java.lang.Object machineInfoBrand_;
+  /**
+   * <code>string machine_info_brand = 12;</code>
+   * @return The machineInfoBrand.
+   */
+  @java.lang.Override
+  public java.lang.String getMachineInfoBrand() {
+    java.lang.Object ref = machineInfoBrand_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      machineInfoBrand_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string machine_info_brand = 12;</code>
+   * @return The bytes for machineInfoBrand.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMachineInfoBrandBytes() {
+    java.lang.Object ref = machineInfoBrand_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      machineInfoBrand_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int MACHINE_INFO_MODEL_FIELD_NUMBER = 13;
+  private volatile java.lang.Object machineInfoModel_;
+  /**
+   * <code>string machine_info_model = 13;</code>
+   * @return The machineInfoModel.
+   */
+  @java.lang.Override
+  public java.lang.String getMachineInfoModel() {
+    java.lang.Object ref = machineInfoModel_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      machineInfoModel_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string machine_info_model = 13;</code>
+   * @return The bytes for machineInfoModel.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMachineInfoModelBytes() {
+    java.lang.Object ref = machineInfoModel_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      machineInfoModel_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int MACHINE_INFO_PLATFORM_FIELD_NUMBER = 14;
+  private volatile java.lang.Object machineInfoPlatform_;
+  /**
+   * <code>string machine_info_platform = 14;</code>
+   * @return The machineInfoPlatform.
+   */
+  @java.lang.Override
+  public java.lang.String getMachineInfoPlatform() {
+    java.lang.Object ref = machineInfoPlatform_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      machineInfoPlatform_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string machine_info_platform = 14;</code>
+   * @return The bytes for machineInfoPlatform.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getMachineInfoPlatformBytes() {
+    java.lang.Object ref = machineInfoPlatform_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      machineInfoPlatform_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PAGE_SOURCE_FIELD_NUMBER = 15;
+  private volatile java.lang.Object pageSource_;
+  /**
+   * <code>string page_source = 15;</code>
+   * @return The pageSource.
+   */
+  @java.lang.Override
+  public java.lang.String getPageSource() {
+    java.lang.Object ref = pageSource_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      pageSource_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string page_source = 15;</code>
+   * @return The bytes for pageSource.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getPageSourceBytes() {
+    java.lang.Object ref = pageSource_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      pageSource_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int VERSION_CODE_FIELD_NUMBER = 16;
+  private int versionCode_;
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>int32 version_code = 16;</code>
+   * @return The versionCode.
+   */
+  @java.lang.Override
+  public int getVersionCode() {
+    return versionCode_;
+  }
+
+  public static final int RECOMMEND_SOURCE_FIELD_NUMBER = 17;
+  private volatile java.lang.Object recommendSource_;
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>string recommend_source = 17;</code>
+   * @return The recommendSource.
+   */
+  @java.lang.Override
+  public java.lang.String getRecommendSource() {
+    java.lang.Object ref = recommendSource_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      recommendSource_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>string recommend_source = 17;</code>
+   * @return The bytes for recommendSource.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getRecommendSourceBytes() {
+    java.lang.Object ref = recommendSource_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      recommendSource_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int SCENE_TYPE_FIELD_NUMBER = 18;
+  private int sceneType_;
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>int32 scene_type = 18;</code>
+   * @return The sceneType.
+   */
+  @java.lang.Override
+  public int getSceneType() {
+    return sceneType_;
+  }
+
+  public static final int RECOMMEND_TRACE_ID_FIELD_NUMBER = 19;
+  private volatile java.lang.Object recommendTraceId_;
+  /**
+   * <code>string recommend_trace_id = 19;</code>
+   * @return The recommendTraceId.
+   */
+  @java.lang.Override
+  public java.lang.String getRecommendTraceId() {
+    java.lang.Object ref = recommendTraceId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      recommendTraceId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string recommend_trace_id = 19;</code>
+   * @return The bytes for recommendTraceId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getRecommendTraceIdBytes() {
+    java.lang.Object ref = recommendTraceId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      recommendTraceId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getRequestIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, requestId_);
+    }
+    if (!getMidBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, mid_);
+    }
+    if (!getUidBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, uid_);
+    }
+    if (!getCategoryIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, categoryId_);
+    }
+    if (size_ != 0) {
+      output.writeInt32(5, size_);
+    }
+    if (appType_ != 0) {
+      output.writeInt32(6, appType_);
+    }
+    if (!getAlgoTypeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 7, algoType_);
+    }
+    if (!getClientInfoBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 8, clientInfo_);
+    }
+    if (!getAbExpInfoBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 9, abExpInfo_);
+    }
+    if (!getAbInfoDataBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 10, abInfoData_);
+    }
+    if (versionAuditStatus_ != 0) {
+      output.writeInt32(11, versionAuditStatus_);
+    }
+    if (!getMachineInfoBrandBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 12, machineInfoBrand_);
+    }
+    if (!getMachineInfoModelBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 13, machineInfoModel_);
+    }
+    if (!getMachineInfoPlatformBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 14, machineInfoPlatform_);
+    }
+    if (!getPageSourceBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 15, pageSource_);
+    }
+    if (versionCode_ != 0) {
+      output.writeInt32(16, versionCode_);
+    }
+    if (!getRecommendSourceBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 17, recommendSource_);
+    }
+    if (sceneType_ != 0) {
+      output.writeInt32(18, sceneType_);
+    }
+    if (!getRecommendTraceIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 19, recommendTraceId_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getRequestIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, requestId_);
+    }
+    if (!getMidBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, mid_);
+    }
+    if (!getUidBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, uid_);
+    }
+    if (!getCategoryIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, categoryId_);
+    }
+    if (size_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(5, size_);
+    }
+    if (appType_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(6, appType_);
+    }
+    if (!getAlgoTypeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, algoType_);
+    }
+    if (!getClientInfoBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, clientInfo_);
+    }
+    if (!getAbExpInfoBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, abExpInfo_);
+    }
+    if (!getAbInfoDataBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, abInfoData_);
+    }
+    if (versionAuditStatus_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(11, versionAuditStatus_);
+    }
+    if (!getMachineInfoBrandBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(12, machineInfoBrand_);
+    }
+    if (!getMachineInfoModelBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, machineInfoModel_);
+    }
+    if (!getMachineInfoPlatformBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, machineInfoPlatform_);
+    }
+    if (!getPageSourceBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(15, pageSource_);
+    }
+    if (versionCode_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(16, versionCode_);
+    }
+    if (!getRecommendSourceBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(17, recommendSource_);
+    }
+    if (sceneType_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(18, sceneType_);
+    }
+    if (!getRecommendTraceIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(19, recommendTraceId_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest other = (com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest) obj;
+
+    if (!getRequestId()
+        .equals(other.getRequestId())) return false;
+    if (!getMid()
+        .equals(other.getMid())) return false;
+    if (!getUid()
+        .equals(other.getUid())) return false;
+    if (!getCategoryId()
+        .equals(other.getCategoryId())) return false;
+    if (getSize()
+        != other.getSize()) return false;
+    if (getAppType()
+        != other.getAppType()) return false;
+    if (!getAlgoType()
+        .equals(other.getAlgoType())) return false;
+    if (!getClientInfo()
+        .equals(other.getClientInfo())) return false;
+    if (!getAbExpInfo()
+        .equals(other.getAbExpInfo())) return false;
+    if (!getAbInfoData()
+        .equals(other.getAbInfoData())) return false;
+    if (getVersionAuditStatus()
+        != other.getVersionAuditStatus()) return false;
+    if (!getMachineInfoBrand()
+        .equals(other.getMachineInfoBrand())) return false;
+    if (!getMachineInfoModel()
+        .equals(other.getMachineInfoModel())) return false;
+    if (!getMachineInfoPlatform()
+        .equals(other.getMachineInfoPlatform())) return false;
+    if (!getPageSource()
+        .equals(other.getPageSource())) return false;
+    if (getVersionCode()
+        != other.getVersionCode()) return false;
+    if (!getRecommendSource()
+        .equals(other.getRecommendSource())) return false;
+    if (getSceneType()
+        != other.getSceneType()) return false;
+    if (!getRecommendTraceId()
+        .equals(other.getRecommendTraceId())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getRequestId().hashCode();
+    hash = (37 * hash) + MID_FIELD_NUMBER;
+    hash = (53 * hash) + getMid().hashCode();
+    hash = (37 * hash) + UID_FIELD_NUMBER;
+    hash = (53 * hash) + getUid().hashCode();
+    hash = (37 * hash) + CATEGORY_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getCategoryId().hashCode();
+    hash = (37 * hash) + SIZE_FIELD_NUMBER;
+    hash = (53 * hash) + getSize();
+    hash = (37 * hash) + APP_TYPE_FIELD_NUMBER;
+    hash = (53 * hash) + getAppType();
+    hash = (37 * hash) + ALGO_TYPE_FIELD_NUMBER;
+    hash = (53 * hash) + getAlgoType().hashCode();
+    hash = (37 * hash) + CLIENT_INFO_FIELD_NUMBER;
+    hash = (53 * hash) + getClientInfo().hashCode();
+    hash = (37 * hash) + AB_EXP_INFO_FIELD_NUMBER;
+    hash = (53 * hash) + getAbExpInfo().hashCode();
+    hash = (37 * hash) + AB_INFO_DATA_FIELD_NUMBER;
+    hash = (53 * hash) + getAbInfoData().hashCode();
+    hash = (37 * hash) + VERSION_AUDIT_STATUS_FIELD_NUMBER;
+    hash = (53 * hash) + getVersionAuditStatus();
+    hash = (37 * hash) + MACHINE_INFO_BRAND_FIELD_NUMBER;
+    hash = (53 * hash) + getMachineInfoBrand().hashCode();
+    hash = (37 * hash) + MACHINE_INFO_MODEL_FIELD_NUMBER;
+    hash = (53 * hash) + getMachineInfoModel().hashCode();
+    hash = (37 * hash) + MACHINE_INFO_PLATFORM_FIELD_NUMBER;
+    hash = (53 * hash) + getMachineInfoPlatform().hashCode();
+    hash = (37 * hash) + PAGE_SOURCE_FIELD_NUMBER;
+    hash = (53 * hash) + getPageSource().hashCode();
+    hash = (37 * hash) + VERSION_CODE_FIELD_NUMBER;
+    hash = (53 * hash) + getVersionCode();
+    hash = (37 * hash) + RECOMMEND_SOURCE_FIELD_NUMBER;
+    hash = (53 * hash) + getRecommendSource().hashCode();
+    hash = (37 * hash) + SCENE_TYPE_FIELD_NUMBER;
+    hash = (53 * hash) + getSceneType();
+    hash = (37 * hash) + RECOMMEND_TRACE_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getRecommendTraceId().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code HomepageRecommendRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:HomepageRecommendRequest)
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.class, com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      requestId_ = "";
+
+      mid_ = "";
+
+      uid_ = "";
+
+      categoryId_ = "";
+
+      size_ = 0;
+
+      appType_ = 0;
+
+      algoType_ = "";
+
+      clientInfo_ = "";
+
+      abExpInfo_ = "";
+
+      abInfoData_ = "";
+
+      versionAuditStatus_ = 0;
+
+      machineInfoBrand_ = "";
+
+      machineInfoModel_ = "";
+
+      machineInfoPlatform_ = "";
+
+      pageSource_ = "";
+
+      versionCode_ = 0;
+
+      recommendSource_ = "";
+
+      sceneType_ = 0;
+
+      recommendTraceId_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest build() {
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest buildPartial() {
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest result = new com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest(this);
+      result.requestId_ = requestId_;
+      result.mid_ = mid_;
+      result.uid_ = uid_;
+      result.categoryId_ = categoryId_;
+      result.size_ = size_;
+      result.appType_ = appType_;
+      result.algoType_ = algoType_;
+      result.clientInfo_ = clientInfo_;
+      result.abExpInfo_ = abExpInfo_;
+      result.abInfoData_ = abInfoData_;
+      result.versionAuditStatus_ = versionAuditStatus_;
+      result.machineInfoBrand_ = machineInfoBrand_;
+      result.machineInfoModel_ = machineInfoModel_;
+      result.machineInfoPlatform_ = machineInfoPlatform_;
+      result.pageSource_ = pageSource_;
+      result.versionCode_ = versionCode_;
+      result.recommendSource_ = recommendSource_;
+      result.sceneType_ = sceneType_;
+      result.recommendTraceId_ = recommendTraceId_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest other) {
+      if (other == com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.getDefaultInstance()) return this;
+      if (!other.getRequestId().isEmpty()) {
+        requestId_ = other.requestId_;
+        onChanged();
+      }
+      if (!other.getMid().isEmpty()) {
+        mid_ = other.mid_;
+        onChanged();
+      }
+      if (!other.getUid().isEmpty()) {
+        uid_ = other.uid_;
+        onChanged();
+      }
+      if (!other.getCategoryId().isEmpty()) {
+        categoryId_ = other.categoryId_;
+        onChanged();
+      }
+      if (other.getSize() != 0) {
+        setSize(other.getSize());
+      }
+      if (other.getAppType() != 0) {
+        setAppType(other.getAppType());
+      }
+      if (!other.getAlgoType().isEmpty()) {
+        algoType_ = other.algoType_;
+        onChanged();
+      }
+      if (!other.getClientInfo().isEmpty()) {
+        clientInfo_ = other.clientInfo_;
+        onChanged();
+      }
+      if (!other.getAbExpInfo().isEmpty()) {
+        abExpInfo_ = other.abExpInfo_;
+        onChanged();
+      }
+      if (!other.getAbInfoData().isEmpty()) {
+        abInfoData_ = other.abInfoData_;
+        onChanged();
+      }
+      if (other.getVersionAuditStatus() != 0) {
+        setVersionAuditStatus(other.getVersionAuditStatus());
+      }
+      if (!other.getMachineInfoBrand().isEmpty()) {
+        machineInfoBrand_ = other.machineInfoBrand_;
+        onChanged();
+      }
+      if (!other.getMachineInfoModel().isEmpty()) {
+        machineInfoModel_ = other.machineInfoModel_;
+        onChanged();
+      }
+      if (!other.getMachineInfoPlatform().isEmpty()) {
+        machineInfoPlatform_ = other.machineInfoPlatform_;
+        onChanged();
+      }
+      if (!other.getPageSource().isEmpty()) {
+        pageSource_ = other.pageSource_;
+        onChanged();
+      }
+      if (other.getVersionCode() != 0) {
+        setVersionCode(other.getVersionCode());
+      }
+      if (!other.getRecommendSource().isEmpty()) {
+        recommendSource_ = other.recommendSource_;
+        onChanged();
+      }
+      if (other.getSceneType() != 0) {
+        setSceneType(other.getSceneType());
+      }
+      if (!other.getRecommendTraceId().isEmpty()) {
+        recommendTraceId_ = other.recommendTraceId_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object requestId_ = "";
+    /**
+     * <code>string request_id = 1;</code>
+     * @return The requestId.
+     */
+    public java.lang.String getRequestId() {
+      java.lang.Object ref = requestId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        requestId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string request_id = 1;</code>
+     * @return The bytes for requestId.
+     */
+    public com.google.protobuf.ByteString
+        getRequestIdBytes() {
+      java.lang.Object ref = requestId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        requestId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string request_id = 1;</code>
+     * @param value The requestId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRequestId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      requestId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string request_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRequestId() {
+      
+      requestId_ = getDefaultInstance().getRequestId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string request_id = 1;</code>
+     * @param value The bytes for requestId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRequestIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      requestId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object mid_ = "";
+    /**
+     * <code>string mid = 2;</code>
+     * @return The mid.
+     */
+    public java.lang.String getMid() {
+      java.lang.Object ref = mid_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        mid_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string mid = 2;</code>
+     * @return The bytes for mid.
+     */
+    public com.google.protobuf.ByteString
+        getMidBytes() {
+      java.lang.Object ref = mid_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        mid_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string mid = 2;</code>
+     * @param value The mid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMid(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      mid_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string mid = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMid() {
+      
+      mid_ = getDefaultInstance().getMid();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string mid = 2;</code>
+     * @param value The bytes for mid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMidBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      mid_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object uid_ = "";
+    /**
+     * <code>string uid = 3;</code>
+     * @return The uid.
+     */
+    public java.lang.String getUid() {
+      java.lang.Object ref = uid_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        uid_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string uid = 3;</code>
+     * @return The bytes for uid.
+     */
+    public com.google.protobuf.ByteString
+        getUidBytes() {
+      java.lang.Object ref = uid_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        uid_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string uid = 3;</code>
+     * @param value The uid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUid(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      uid_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string uid = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUid() {
+      
+      uid_ = getDefaultInstance().getUid();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string uid = 3;</code>
+     * @param value The bytes for uid to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUidBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      uid_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object categoryId_ = "";
+    /**
+     * <code>string category_id = 4;</code>
+     * @return The categoryId.
+     */
+    public java.lang.String getCategoryId() {
+      java.lang.Object ref = categoryId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        categoryId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string category_id = 4;</code>
+     * @return The bytes for categoryId.
+     */
+    public com.google.protobuf.ByteString
+        getCategoryIdBytes() {
+      java.lang.Object ref = categoryId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        categoryId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string category_id = 4;</code>
+     * @param value The categoryId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCategoryId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      categoryId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string category_id = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCategoryId() {
+      
+      categoryId_ = getDefaultInstance().getCategoryId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string category_id = 4;</code>
+     * @param value The bytes for categoryId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCategoryIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      categoryId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private int size_ ;
+    /**
+     * <pre>
+     * default 4
+     * </pre>
+     *
+     * <code>int32 size = 5;</code>
+     * @return The size.
+     */
+    @java.lang.Override
+    public int getSize() {
+      return size_;
+    }
+    /**
+     * <pre>
+     * default 4
+     * </pre>
+     *
+     * <code>int32 size = 5;</code>
+     * @param value The size to set.
+     * @return This builder for chaining.
+     */
+    public Builder setSize(int value) {
+      
+      size_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * default 4
+     * </pre>
+     *
+     * <code>int32 size = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearSize() {
+      
+      size_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int appType_ ;
+    /**
+     * <pre>
+     * default 4
+     * </pre>
+     *
+     * <code>int32 app_type = 6;</code>
+     * @return The appType.
+     */
+    @java.lang.Override
+    public int getAppType() {
+      return appType_;
+    }
+    /**
+     * <pre>
+     * default 4
+     * </pre>
+     *
+     * <code>int32 app_type = 6;</code>
+     * @param value The appType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAppType(int value) {
+      
+      appType_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * default 4
+     * </pre>
+     *
+     * <code>int32 app_type = 6;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAppType() {
+      
+      appType_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object algoType_ = "";
+    /**
+     * <code>string algo_type = 7;</code>
+     * @return The algoType.
+     */
+    public java.lang.String getAlgoType() {
+      java.lang.Object ref = algoType_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        algoType_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string algo_type = 7;</code>
+     * @return The bytes for algoType.
+     */
+    public com.google.protobuf.ByteString
+        getAlgoTypeBytes() {
+      java.lang.Object ref = algoType_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        algoType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string algo_type = 7;</code>
+     * @param value The algoType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAlgoType(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      algoType_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string algo_type = 7;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAlgoType() {
+      
+      algoType_ = getDefaultInstance().getAlgoType();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string algo_type = 7;</code>
+     * @param value The bytes for algoType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAlgoTypeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      algoType_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object clientInfo_ = "";
+    /**
+     * <code>string client_info = 8;</code>
+     * @return The clientInfo.
+     */
+    public java.lang.String getClientInfo() {
+      java.lang.Object ref = clientInfo_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        clientInfo_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string client_info = 8;</code>
+     * @return The bytes for clientInfo.
+     */
+    public com.google.protobuf.ByteString
+        getClientInfoBytes() {
+      java.lang.Object ref = clientInfo_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        clientInfo_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string client_info = 8;</code>
+     * @param value The clientInfo to set.
+     * @return This builder for chaining.
+     */
+    public Builder setClientInfo(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      clientInfo_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string client_info = 8;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearClientInfo() {
+      
+      clientInfo_ = getDefaultInstance().getClientInfo();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string client_info = 8;</code>
+     * @param value The bytes for clientInfo to set.
+     * @return This builder for chaining.
+     */
+    public Builder setClientInfoBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      clientInfo_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object abExpInfo_ = "";
+    /**
+     * <code>string ab_exp_info = 9;</code>
+     * @return The abExpInfo.
+     */
+    public java.lang.String getAbExpInfo() {
+      java.lang.Object ref = abExpInfo_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        abExpInfo_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string ab_exp_info = 9;</code>
+     * @return The bytes for abExpInfo.
+     */
+    public com.google.protobuf.ByteString
+        getAbExpInfoBytes() {
+      java.lang.Object ref = abExpInfo_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        abExpInfo_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string ab_exp_info = 9;</code>
+     * @param value The abExpInfo to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAbExpInfo(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      abExpInfo_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ab_exp_info = 9;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAbExpInfo() {
+      
+      abExpInfo_ = getDefaultInstance().getAbExpInfo();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ab_exp_info = 9;</code>
+     * @param value The bytes for abExpInfo to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAbExpInfoBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      abExpInfo_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object abInfoData_ = "";
+    /**
+     * <code>string ab_info_data = 10;</code>
+     * @return The abInfoData.
+     */
+    public java.lang.String getAbInfoData() {
+      java.lang.Object ref = abInfoData_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        abInfoData_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string ab_info_data = 10;</code>
+     * @return The bytes for abInfoData.
+     */
+    public com.google.protobuf.ByteString
+        getAbInfoDataBytes() {
+      java.lang.Object ref = abInfoData_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        abInfoData_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string ab_info_data = 10;</code>
+     * @param value The abInfoData to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAbInfoData(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      abInfoData_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ab_info_data = 10;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAbInfoData() {
+      
+      abInfoData_ = getDefaultInstance().getAbInfoData();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ab_info_data = 10;</code>
+     * @param value The bytes for abInfoData to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAbInfoDataBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      abInfoData_ = value;
+      onChanged();
+      return this;
+    }
+
+    private int versionAuditStatus_ ;
+    /**
+     * <pre>
+     * default 2
+     * </pre>
+     *
+     * <code>int32 version_audit_status = 11;</code>
+     * @return The versionAuditStatus.
+     */
+    @java.lang.Override
+    public int getVersionAuditStatus() {
+      return versionAuditStatus_;
+    }
+    /**
+     * <pre>
+     * default 2
+     * </pre>
+     *
+     * <code>int32 version_audit_status = 11;</code>
+     * @param value The versionAuditStatus to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVersionAuditStatus(int value) {
+      
+      versionAuditStatus_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * default 2
+     * </pre>
+     *
+     * <code>int32 version_audit_status = 11;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVersionAuditStatus() {
+      
+      versionAuditStatus_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object machineInfoBrand_ = "";
+    /**
+     * <code>string machine_info_brand = 12;</code>
+     * @return The machineInfoBrand.
+     */
+    public java.lang.String getMachineInfoBrand() {
+      java.lang.Object ref = machineInfoBrand_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        machineInfoBrand_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string machine_info_brand = 12;</code>
+     * @return The bytes for machineInfoBrand.
+     */
+    public com.google.protobuf.ByteString
+        getMachineInfoBrandBytes() {
+      java.lang.Object ref = machineInfoBrand_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        machineInfoBrand_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string machine_info_brand = 12;</code>
+     * @param value The machineInfoBrand to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineInfoBrand(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      machineInfoBrand_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machine_info_brand = 12;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMachineInfoBrand() {
+      
+      machineInfoBrand_ = getDefaultInstance().getMachineInfoBrand();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machine_info_brand = 12;</code>
+     * @param value The bytes for machineInfoBrand to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineInfoBrandBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      machineInfoBrand_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object machineInfoModel_ = "";
+    /**
+     * <code>string machine_info_model = 13;</code>
+     * @return The machineInfoModel.
+     */
+    public java.lang.String getMachineInfoModel() {
+      java.lang.Object ref = machineInfoModel_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        machineInfoModel_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string machine_info_model = 13;</code>
+     * @return The bytes for machineInfoModel.
+     */
+    public com.google.protobuf.ByteString
+        getMachineInfoModelBytes() {
+      java.lang.Object ref = machineInfoModel_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        machineInfoModel_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string machine_info_model = 13;</code>
+     * @param value The machineInfoModel to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineInfoModel(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      machineInfoModel_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machine_info_model = 13;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMachineInfoModel() {
+      
+      machineInfoModel_ = getDefaultInstance().getMachineInfoModel();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machine_info_model = 13;</code>
+     * @param value The bytes for machineInfoModel to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineInfoModelBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      machineInfoModel_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object machineInfoPlatform_ = "";
+    /**
+     * <code>string machine_info_platform = 14;</code>
+     * @return The machineInfoPlatform.
+     */
+    public java.lang.String getMachineInfoPlatform() {
+      java.lang.Object ref = machineInfoPlatform_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        machineInfoPlatform_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string machine_info_platform = 14;</code>
+     * @return The bytes for machineInfoPlatform.
+     */
+    public com.google.protobuf.ByteString
+        getMachineInfoPlatformBytes() {
+      java.lang.Object ref = machineInfoPlatform_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        machineInfoPlatform_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string machine_info_platform = 14;</code>
+     * @param value The machineInfoPlatform to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineInfoPlatform(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      machineInfoPlatform_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machine_info_platform = 14;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearMachineInfoPlatform() {
+      
+      machineInfoPlatform_ = getDefaultInstance().getMachineInfoPlatform();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string machine_info_platform = 14;</code>
+     * @param value The bytes for machineInfoPlatform to set.
+     * @return This builder for chaining.
+     */
+    public Builder setMachineInfoPlatformBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      machineInfoPlatform_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object pageSource_ = "";
+    /**
+     * <code>string page_source = 15;</code>
+     * @return The pageSource.
+     */
+    public java.lang.String getPageSource() {
+      java.lang.Object ref = pageSource_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        pageSource_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string page_source = 15;</code>
+     * @return The bytes for pageSource.
+     */
+    public com.google.protobuf.ByteString
+        getPageSourceBytes() {
+      java.lang.Object ref = pageSource_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        pageSource_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string page_source = 15;</code>
+     * @param value The pageSource to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPageSource(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      pageSource_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string page_source = 15;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPageSource() {
+      
+      pageSource_ = getDefaultInstance().getPageSource();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string page_source = 15;</code>
+     * @param value The bytes for pageSource to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPageSourceBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      pageSource_ = value;
+      onChanged();
+      return this;
+    }
+
+    private int versionCode_ ;
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>int32 version_code = 16;</code>
+     * @return The versionCode.
+     */
+    @java.lang.Override
+    public int getVersionCode() {
+      return versionCode_;
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>int32 version_code = 16;</code>
+     * @param value The versionCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVersionCode(int value) {
+      
+      versionCode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>int32 version_code = 16;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVersionCode() {
+      
+      versionCode_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object recommendSource_ = "";
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>string recommend_source = 17;</code>
+     * @return The recommendSource.
+     */
+    public java.lang.String getRecommendSource() {
+      java.lang.Object ref = recommendSource_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        recommendSource_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>string recommend_source = 17;</code>
+     * @return The bytes for recommendSource.
+     */
+    public com.google.protobuf.ByteString
+        getRecommendSourceBytes() {
+      java.lang.Object ref = recommendSource_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        recommendSource_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>string recommend_source = 17;</code>
+     * @param value The recommendSource to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRecommendSource(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      recommendSource_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>string recommend_source = 17;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRecommendSource() {
+      
+      recommendSource_ = getDefaultInstance().getRecommendSource();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>string recommend_source = 17;</code>
+     * @param value The bytes for recommendSource to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRecommendSourceBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      recommendSource_ = value;
+      onChanged();
+      return this;
+    }
+
+    private int sceneType_ ;
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>int32 scene_type = 18;</code>
+     * @return The sceneType.
+     */
+    @java.lang.Override
+    public int getSceneType() {
+      return sceneType_;
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>int32 scene_type = 18;</code>
+     * @param value The sceneType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setSceneType(int value) {
+      
+      sceneType_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * default 0
+     * </pre>
+     *
+     * <code>int32 scene_type = 18;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearSceneType() {
+      
+      sceneType_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object recommendTraceId_ = "";
+    /**
+     * <code>string recommend_trace_id = 19;</code>
+     * @return The recommendTraceId.
+     */
+    public java.lang.String getRecommendTraceId() {
+      java.lang.Object ref = recommendTraceId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        recommendTraceId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string recommend_trace_id = 19;</code>
+     * @return The bytes for recommendTraceId.
+     */
+    public com.google.protobuf.ByteString
+        getRecommendTraceIdBytes() {
+      java.lang.Object ref = recommendTraceId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        recommendTraceId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string recommend_trace_id = 19;</code>
+     * @param value The recommendTraceId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRecommendTraceId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      recommendTraceId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string recommend_trace_id = 19;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRecommendTraceId() {
+      
+      recommendTraceId_ = getDefaultInstance().getRecommendTraceId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string recommend_trace_id = 19;</code>
+     * @param value The bytes for recommendTraceId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRecommendTraceIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      recommendTraceId_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:HomepageRecommendRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:HomepageRecommendRequest)
+  private static final com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<HomepageRecommendRequest>
+      PARSER = new com.google.protobuf.AbstractParser<HomepageRecommendRequest>() {
+    @java.lang.Override
+    public HomepageRecommendRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new HomepageRecommendRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<HomepageRecommendRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<HomepageRecommendRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 235 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendRequestOrBuilder.java

@@ -0,0 +1,235 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+public interface HomepageRecommendRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:HomepageRecommendRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string request_id = 1;</code>
+   * @return The requestId.
+   */
+  java.lang.String getRequestId();
+  /**
+   * <code>string request_id = 1;</code>
+   * @return The bytes for requestId.
+   */
+  com.google.protobuf.ByteString
+      getRequestIdBytes();
+
+  /**
+   * <code>string mid = 2;</code>
+   * @return The mid.
+   */
+  java.lang.String getMid();
+  /**
+   * <code>string mid = 2;</code>
+   * @return The bytes for mid.
+   */
+  com.google.protobuf.ByteString
+      getMidBytes();
+
+  /**
+   * <code>string uid = 3;</code>
+   * @return The uid.
+   */
+  java.lang.String getUid();
+  /**
+   * <code>string uid = 3;</code>
+   * @return The bytes for uid.
+   */
+  com.google.protobuf.ByteString
+      getUidBytes();
+
+  /**
+   * <code>string category_id = 4;</code>
+   * @return The categoryId.
+   */
+  java.lang.String getCategoryId();
+  /**
+   * <code>string category_id = 4;</code>
+   * @return The bytes for categoryId.
+   */
+  com.google.protobuf.ByteString
+      getCategoryIdBytes();
+
+  /**
+   * <pre>
+   * default 4
+   * </pre>
+   *
+   * <code>int32 size = 5;</code>
+   * @return The size.
+   */
+  int getSize();
+
+  /**
+   * <pre>
+   * default 4
+   * </pre>
+   *
+   * <code>int32 app_type = 6;</code>
+   * @return The appType.
+   */
+  int getAppType();
+
+  /**
+   * <code>string algo_type = 7;</code>
+   * @return The algoType.
+   */
+  java.lang.String getAlgoType();
+  /**
+   * <code>string algo_type = 7;</code>
+   * @return The bytes for algoType.
+   */
+  com.google.protobuf.ByteString
+      getAlgoTypeBytes();
+
+  /**
+   * <code>string client_info = 8;</code>
+   * @return The clientInfo.
+   */
+  java.lang.String getClientInfo();
+  /**
+   * <code>string client_info = 8;</code>
+   * @return The bytes for clientInfo.
+   */
+  com.google.protobuf.ByteString
+      getClientInfoBytes();
+
+  /**
+   * <code>string ab_exp_info = 9;</code>
+   * @return The abExpInfo.
+   */
+  java.lang.String getAbExpInfo();
+  /**
+   * <code>string ab_exp_info = 9;</code>
+   * @return The bytes for abExpInfo.
+   */
+  com.google.protobuf.ByteString
+      getAbExpInfoBytes();
+
+  /**
+   * <code>string ab_info_data = 10;</code>
+   * @return The abInfoData.
+   */
+  java.lang.String getAbInfoData();
+  /**
+   * <code>string ab_info_data = 10;</code>
+   * @return The bytes for abInfoData.
+   */
+  com.google.protobuf.ByteString
+      getAbInfoDataBytes();
+
+  /**
+   * <pre>
+   * default 2
+   * </pre>
+   *
+   * <code>int32 version_audit_status = 11;</code>
+   * @return The versionAuditStatus.
+   */
+  int getVersionAuditStatus();
+
+  /**
+   * <code>string machine_info_brand = 12;</code>
+   * @return The machineInfoBrand.
+   */
+  java.lang.String getMachineInfoBrand();
+  /**
+   * <code>string machine_info_brand = 12;</code>
+   * @return The bytes for machineInfoBrand.
+   */
+  com.google.protobuf.ByteString
+      getMachineInfoBrandBytes();
+
+  /**
+   * <code>string machine_info_model = 13;</code>
+   * @return The machineInfoModel.
+   */
+  java.lang.String getMachineInfoModel();
+  /**
+   * <code>string machine_info_model = 13;</code>
+   * @return The bytes for machineInfoModel.
+   */
+  com.google.protobuf.ByteString
+      getMachineInfoModelBytes();
+
+  /**
+   * <code>string machine_info_platform = 14;</code>
+   * @return The machineInfoPlatform.
+   */
+  java.lang.String getMachineInfoPlatform();
+  /**
+   * <code>string machine_info_platform = 14;</code>
+   * @return The bytes for machineInfoPlatform.
+   */
+  com.google.protobuf.ByteString
+      getMachineInfoPlatformBytes();
+
+  /**
+   * <code>string page_source = 15;</code>
+   * @return The pageSource.
+   */
+  java.lang.String getPageSource();
+  /**
+   * <code>string page_source = 15;</code>
+   * @return The bytes for pageSource.
+   */
+  com.google.protobuf.ByteString
+      getPageSourceBytes();
+
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>int32 version_code = 16;</code>
+   * @return The versionCode.
+   */
+  int getVersionCode();
+
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>string recommend_source = 17;</code>
+   * @return The recommendSource.
+   */
+  java.lang.String getRecommendSource();
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>string recommend_source = 17;</code>
+   * @return The bytes for recommendSource.
+   */
+  com.google.protobuf.ByteString
+      getRecommendSourceBytes();
+
+  /**
+   * <pre>
+   * default 0
+   * </pre>
+   *
+   * <code>int32 scene_type = 18;</code>
+   * @return The sceneType.
+   */
+  int getSceneType();
+
+  /**
+   * <code>string recommend_trace_id = 19;</code>
+   * @return The recommendTraceId.
+   */
+  java.lang.String getRecommendTraceId();
+  /**
+   * <code>string recommend_trace_id = 19;</code>
+   * @return The bytes for recommendTraceId.
+   */
+  com.google.protobuf.ByteString
+      getRecommendTraceIdBytes();
+}

+ 966 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendResponse.java

@@ -0,0 +1,966 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+/**
+ * <pre>
+ * https://sls.console.aliyun.com/lognext/project/rov-server/logsearch/info
+ * </pre>
+ *
+ * Protobuf type {@code HomepageRecommendResponse}
+ */
+public final class HomepageRecommendResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:HomepageRecommendResponse)
+    HomepageRecommendResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use HomepageRecommendResponse.newBuilder() to construct.
+  private HomepageRecommendResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private HomepageRecommendResponse() {
+    video_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new HomepageRecommendResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private HomepageRecommendResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.tzld.piaoquan.recommend.server.gen.common.Result.Builder subBuilder = null;
+            if (result_ != null) {
+              subBuilder = result_.toBuilder();
+            }
+            result_ = input.readMessage(com.tzld.piaoquan.recommend.server.gen.common.Result.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(result_);
+              result_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              video_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.server.gen.recommend.Video>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            video_.add(
+                input.readMessage(com.tzld.piaoquan.recommend.server.gen.recommend.Video.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        video_ = java.util.Collections.unmodifiableList(video_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.class, com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.Builder.class);
+  }
+
+  public static final int RESULT_FIELD_NUMBER = 1;
+  private com.tzld.piaoquan.recommend.server.gen.common.Result result_;
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  @java.lang.Override
+  public boolean hasResult() {
+    return result_ != null;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.common.Result getResult() {
+    return result_ == null ? com.tzld.piaoquan.recommend.server.gen.common.Result.getDefaultInstance() : result_;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.common.ResultOrBuilder getResultOrBuilder() {
+    return getResult();
+  }
+
+  public static final int VIDEO_FIELD_NUMBER = 2;
+  private java.util.List<com.tzld.piaoquan.recommend.server.gen.recommend.Video> video_;
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.tzld.piaoquan.recommend.server.gen.recommend.Video> getVideoList() {
+    return video_;
+  }
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder> 
+      getVideoOrBuilderList() {
+    return video_;
+  }
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  @java.lang.Override
+  public int getVideoCount() {
+    return video_.size();
+  }
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.recommend.Video getVideo(int index) {
+    return video_.get(index);
+  }
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder getVideoOrBuilder(
+      int index) {
+    return video_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (result_ != null) {
+      output.writeMessage(1, getResult());
+    }
+    for (int i = 0; i < video_.size(); i++) {
+      output.writeMessage(2, video_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (result_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getResult());
+    }
+    for (int i = 0; i < video_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, video_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse other = (com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (!getVideoList()
+        .equals(other.getVideoList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasResult()) {
+      hash = (37 * hash) + RESULT_FIELD_NUMBER;
+      hash = (53 * hash) + getResult().hashCode();
+    }
+    if (getVideoCount() > 0) {
+      hash = (37 * hash) + VIDEO_FIELD_NUMBER;
+      hash = (53 * hash) + getVideoList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * https://sls.console.aliyun.com/lognext/project/rov-server/logsearch/info
+   * </pre>
+   *
+   * Protobuf type {@code HomepageRecommendResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:HomepageRecommendResponse)
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.class, com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getVideoFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (resultBuilder_ == null) {
+        result_ = null;
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+      if (videoBuilder_ == null) {
+        video_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        videoBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_HomepageRecommendResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse build() {
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse buildPartial() {
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse result = new com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      if (videoBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          video_ = java.util.Collections.unmodifiableList(video_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.video_ = video_;
+      } else {
+        result.video_ = videoBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse other) {
+      if (other == com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      if (videoBuilder_ == null) {
+        if (!other.video_.isEmpty()) {
+          if (video_.isEmpty()) {
+            video_ = other.video_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureVideoIsMutable();
+            video_.addAll(other.video_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.video_.isEmpty()) {
+          if (videoBuilder_.isEmpty()) {
+            videoBuilder_.dispose();
+            videoBuilder_ = null;
+            video_ = other.video_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            videoBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getVideoFieldBuilder() : null;
+          } else {
+            videoBuilder_.addAllMessages(other.video_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.tzld.piaoquan.recommend.server.gen.common.Result result_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.server.gen.common.Result, com.tzld.piaoquan.recommend.server.gen.common.Result.Builder, com.tzld.piaoquan.recommend.server.gen.common.ResultOrBuilder> resultBuilder_;
+    /**
+     * <code>.Result result = 1;</code>
+     * @return Whether the result field is set.
+     */
+    public boolean hasResult() {
+      return resultBuilder_ != null || result_ != null;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     * @return The result.
+     */
+    public com.tzld.piaoquan.recommend.server.gen.common.Result getResult() {
+      if (resultBuilder_ == null) {
+        return result_ == null ? com.tzld.piaoquan.recommend.server.gen.common.Result.getDefaultInstance() : result_;
+      } else {
+        return resultBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(com.tzld.piaoquan.recommend.server.gen.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result_ = value;
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(
+        com.tzld.piaoquan.recommend.server.gen.common.Result.Builder builderForValue) {
+      if (resultBuilder_ == null) {
+        result_ = builderForValue.build();
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder mergeResult(com.tzld.piaoquan.recommend.server.gen.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (result_ != null) {
+          result_ =
+            com.tzld.piaoquan.recommend.server.gen.common.Result.newBuilder(result_).mergeFrom(value).buildPartial();
+        } else {
+          result_ = value;
+        }
+        onChanged();
+      } else {
+        resultBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder clearResult() {
+      if (resultBuilder_ == null) {
+        result_ = null;
+        onChanged();
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.common.Result.Builder getResultBuilder() {
+      
+      onChanged();
+      return getResultFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.common.ResultOrBuilder getResultOrBuilder() {
+      if (resultBuilder_ != null) {
+        return resultBuilder_.getMessageOrBuilder();
+      } else {
+        return result_ == null ?
+            com.tzld.piaoquan.recommend.server.gen.common.Result.getDefaultInstance() : result_;
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.server.gen.common.Result, com.tzld.piaoquan.recommend.server.gen.common.Result.Builder, com.tzld.piaoquan.recommend.server.gen.common.ResultOrBuilder> 
+        getResultFieldBuilder() {
+      if (resultBuilder_ == null) {
+        resultBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.server.gen.common.Result, com.tzld.piaoquan.recommend.server.gen.common.Result.Builder, com.tzld.piaoquan.recommend.server.gen.common.ResultOrBuilder>(
+                getResult(),
+                getParentForChildren(),
+                isClean());
+        result_ = null;
+      }
+      return resultBuilder_;
+    }
+
+    private java.util.List<com.tzld.piaoquan.recommend.server.gen.recommend.Video> video_ =
+      java.util.Collections.emptyList();
+    private void ensureVideoIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        video_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.server.gen.recommend.Video>(video_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.server.gen.recommend.Video, com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder, com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder> videoBuilder_;
+
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.server.gen.recommend.Video> getVideoList() {
+      if (videoBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(video_);
+      } else {
+        return videoBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public int getVideoCount() {
+      if (videoBuilder_ == null) {
+        return video_.size();
+      } else {
+        return videoBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.recommend.Video getVideo(int index) {
+      if (videoBuilder_ == null) {
+        return video_.get(index);
+      } else {
+        return videoBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder setVideo(
+        int index, com.tzld.piaoquan.recommend.server.gen.recommend.Video value) {
+      if (videoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoIsMutable();
+        video_.set(index, value);
+        onChanged();
+      } else {
+        videoBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder setVideo(
+        int index, com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder builderForValue) {
+      if (videoBuilder_ == null) {
+        ensureVideoIsMutable();
+        video_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        videoBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder addVideo(com.tzld.piaoquan.recommend.server.gen.recommend.Video value) {
+      if (videoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoIsMutable();
+        video_.add(value);
+        onChanged();
+      } else {
+        videoBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder addVideo(
+        int index, com.tzld.piaoquan.recommend.server.gen.recommend.Video value) {
+      if (videoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoIsMutable();
+        video_.add(index, value);
+        onChanged();
+      } else {
+        videoBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder addVideo(
+        com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder builderForValue) {
+      if (videoBuilder_ == null) {
+        ensureVideoIsMutable();
+        video_.add(builderForValue.build());
+        onChanged();
+      } else {
+        videoBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder addVideo(
+        int index, com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder builderForValue) {
+      if (videoBuilder_ == null) {
+        ensureVideoIsMutable();
+        video_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        videoBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder addAllVideo(
+        java.lang.Iterable<? extends com.tzld.piaoquan.recommend.server.gen.recommend.Video> values) {
+      if (videoBuilder_ == null) {
+        ensureVideoIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, video_);
+        onChanged();
+      } else {
+        videoBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder clearVideo() {
+      if (videoBuilder_ == null) {
+        video_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        videoBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public Builder removeVideo(int index) {
+      if (videoBuilder_ == null) {
+        ensureVideoIsMutable();
+        video_.remove(index);
+        onChanged();
+      } else {
+        videoBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder getVideoBuilder(
+        int index) {
+      return getVideoFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder getVideoOrBuilder(
+        int index) {
+      if (videoBuilder_ == null) {
+        return video_.get(index);  } else {
+        return videoBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public java.util.List<? extends com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder> 
+         getVideoOrBuilderList() {
+      if (videoBuilder_ != null) {
+        return videoBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(video_);
+      }
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder addVideoBuilder() {
+      return getVideoFieldBuilder().addBuilder(
+          com.tzld.piaoquan.recommend.server.gen.recommend.Video.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder addVideoBuilder(
+        int index) {
+      return getVideoFieldBuilder().addBuilder(
+          index, com.tzld.piaoquan.recommend.server.gen.recommend.Video.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .Video video = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder> 
+         getVideoBuilderList() {
+      return getVideoFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.server.gen.recommend.Video, com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder, com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder> 
+        getVideoFieldBuilder() {
+      if (videoBuilder_ == null) {
+        videoBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.tzld.piaoquan.recommend.server.gen.recommend.Video, com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder, com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder>(
+                video_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        video_ = null;
+      }
+      return videoBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:HomepageRecommendResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:HomepageRecommendResponse)
+  private static final com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<HomepageRecommendResponse>
+      PARSER = new com.google.protobuf.AbstractParser<HomepageRecommendResponse>() {
+    @java.lang.Override
+    public HomepageRecommendResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new HomepageRecommendResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<HomepageRecommendResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<HomepageRecommendResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 48 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/HomepageRecommendResponseOrBuilder.java

@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+public interface HomepageRecommendResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:HomepageRecommendResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  boolean hasResult();
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  com.tzld.piaoquan.recommend.server.gen.common.Result getResult();
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  com.tzld.piaoquan.recommend.server.gen.common.ResultOrBuilder getResultOrBuilder();
+
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  java.util.List<com.tzld.piaoquan.recommend.server.gen.recommend.Video> 
+      getVideoList();
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.server.gen.recommend.Video getVideo(int index);
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  int getVideoCount();
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  java.util.List<? extends com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder> 
+      getVideoOrBuilderList();
+  /**
+   * <code>repeated .Video video = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder getVideoOrBuilder(
+      int index);
+}

+ 95 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/Recommend.java

@@ -0,0 +1,95 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+public final class Recommend {
+  private Recommend() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_HomepageRecommendRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_HomepageRecommendRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_HomepageRecommendResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_HomepageRecommendResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_Video_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_Video_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n2com/tzld/piaoquan/recommend/server/rec" +
+      "ommend.proto\032\031google/protobuf/any.proto\032" +
+      "/com/tzld/piaoquan/recommend/server/comm" +
+      "on.proto\"\272\003\n\030HomepageRecommendRequest\022\022\n" +
+      "\nrequest_id\030\001 \001(\t\022\013\n\003mid\030\002 \001(\t\022\013\n\003uid\030\003 " +
+      "\001(\t\022\023\n\013category_id\030\004 \001(\t\022\014\n\004size\030\005 \001(\005\022\020" +
+      "\n\010app_type\030\006 \001(\005\022\021\n\talgo_type\030\007 \001(\t\022\023\n\013c" +
+      "lient_info\030\010 \001(\t\022\023\n\013ab_exp_info\030\t \001(\t\022\024\n" +
+      "\014ab_info_data\030\n \001(\t\022\034\n\024version_audit_sta" +
+      "tus\030\013 \001(\005\022\032\n\022machine_info_brand\030\014 \001(\t\022\032\n" +
+      "\022machine_info_model\030\r \001(\t\022\035\n\025machine_inf" +
+      "o_platform\030\016 \001(\t\022\023\n\013page_source\030\017 \001(\t\022\024\n" +
+      "\014version_code\030\020 \001(\005\022\030\n\020recommend_source\030" +
+      "\021 \001(\t\022\022\n\nscene_type\030\022 \001(\005\022\032\n\022recommend_t" +
+      "race_id\030\023 \001(\t\"K\n\031HomepageRecommendRespon" +
+      "se\022\027\n\006result\030\001 \001(\0132\007.Result\022\025\n\005video\030\002 \003" +
+      "(\0132\006.Video\"v\n\005Video\022\020\n\010video_id\030\001 \001(\003\022\021\n" +
+      "\trov_score\030\002 \001(\001\022\021\n\tpush_from\030\003 \001(\t\022\017\n\007a" +
+      "b_code\030\004 \001(\t\022\022\n\nsort_score\030\005 \001(\t\022\020\n\010posi" +
+      "tion\030\006 \001(\0052^\n\020RecommendService\022J\n\021Homepa" +
+      "geRecommend\022\031.HomepageRecommendRequest\032\032" +
+      ".HomepageRecommendResponseB7\n0com.tzld.p" +
+      "iaoquan.recommend.server.gen.recommendP\001" +
+      "\210\001\001b\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          com.google.protobuf.AnyProto.getDescriptor(),
+          com.tzld.piaoquan.recommend.server.gen.common.Common.getDescriptor(),
+        });
+    internal_static_HomepageRecommendRequest_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_HomepageRecommendRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_HomepageRecommendRequest_descriptor,
+        new java.lang.String[] { "RequestId", "Mid", "Uid", "CategoryId", "Size", "AppType", "AlgoType", "ClientInfo", "AbExpInfo", "AbInfoData", "VersionAuditStatus", "MachineInfoBrand", "MachineInfoModel", "MachineInfoPlatform", "PageSource", "VersionCode", "RecommendSource", "SceneType", "RecommendTraceId", });
+    internal_static_HomepageRecommendResponse_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_HomepageRecommendResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_HomepageRecommendResponse_descriptor,
+        new java.lang.String[] { "Result", "Video", });
+    internal_static_Video_descriptor =
+      getDescriptor().getMessageTypes().get(2);
+    internal_static_Video_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_Video_descriptor,
+        new java.lang.String[] { "VideoId", "RovScore", "PushFrom", "AbCode", "SortScore", "Position", });
+    com.google.protobuf.AnyProto.getDescriptor();
+    com.tzld.piaoquan.recommend.server.gen.common.Common.getDescriptor();
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}

+ 245 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendService.java

@@ -0,0 +1,245 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+/**
+ * Protobuf service {@code RecommendService}
+ */
+public  abstract class RecommendService
+    implements com.google.protobuf.Service {
+  protected RecommendService() {}
+
+  public interface Interface {
+    /**
+     * <pre>
+     * 首页推荐和tab分类 /applet/video/homepage/recommend
+     * </pre>
+     *
+     * <code>rpc HomepageRecommend(.HomepageRecommendRequest) returns (.HomepageRecommendResponse);</code>
+     */
+    public abstract void homepageRecommend(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> done);
+
+  }
+
+  public static com.google.protobuf.Service newReflectiveService(
+      final Interface impl) {
+    return new RecommendService() {
+      @java.lang.Override
+      public  void homepageRecommend(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> done) {
+        impl.homepageRecommend(controller, request, done);
+      }
+
+    };
+  }
+
+  public static com.google.protobuf.BlockingService
+      newReflectiveBlockingService(final BlockingInterface impl) {
+    return new com.google.protobuf.BlockingService() {
+      public final com.google.protobuf.Descriptors.ServiceDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+
+      public final com.google.protobuf.Message callBlockingMethod(
+          com.google.protobuf.Descriptors.MethodDescriptor method,
+          com.google.protobuf.RpcController controller,
+          com.google.protobuf.Message request)
+          throws com.google.protobuf.ServiceException {
+        if (method.getService() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "Service.callBlockingMethod() given method descriptor for " +
+            "wrong service type.");
+        }
+        switch(method.getIndex()) {
+          case 0:
+            return impl.homepageRecommend(controller, (com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest)request);
+          default:
+            throw new java.lang.AssertionError("Can't get here.");
+        }
+      }
+
+      public final com.google.protobuf.Message
+          getRequestPrototype(
+          com.google.protobuf.Descriptors.MethodDescriptor method) {
+        if (method.getService() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "Service.getRequestPrototype() given method " +
+            "descriptor for wrong service type.");
+        }
+        switch(method.getIndex()) {
+          case 0:
+            return com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.getDefaultInstance();
+          default:
+            throw new java.lang.AssertionError("Can't get here.");
+        }
+      }
+
+      public final com.google.protobuf.Message
+          getResponsePrototype(
+          com.google.protobuf.Descriptors.MethodDescriptor method) {
+        if (method.getService() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "Service.getResponsePrototype() given method " +
+            "descriptor for wrong service type.");
+        }
+        switch(method.getIndex()) {
+          case 0:
+            return com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance();
+          default:
+            throw new java.lang.AssertionError("Can't get here.");
+        }
+      }
+
+    };
+  }
+
+  /**
+   * <pre>
+   * 首页推荐和tab分类 /applet/video/homepage/recommend
+   * </pre>
+   *
+   * <code>rpc HomepageRecommend(.HomepageRecommendRequest) returns (.HomepageRecommendResponse);</code>
+   */
+  public abstract void homepageRecommend(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> done);
+
+  public static final
+      com.google.protobuf.Descriptors.ServiceDescriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.getDescriptor().getServices().get(0);
+  }
+  public final com.google.protobuf.Descriptors.ServiceDescriptor
+      getDescriptorForType() {
+    return getDescriptor();
+  }
+
+  public final void callMethod(
+      com.google.protobuf.Descriptors.MethodDescriptor method,
+      com.google.protobuf.RpcController controller,
+      com.google.protobuf.Message request,
+      com.google.protobuf.RpcCallback<
+        com.google.protobuf.Message> done) {
+    if (method.getService() != getDescriptor()) {
+      throw new java.lang.IllegalArgumentException(
+        "Service.callMethod() given method descriptor for wrong " +
+        "service type.");
+    }
+    switch(method.getIndex()) {
+      case 0:
+        this.homepageRecommend(controller, (com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse>specializeCallback(
+            done));
+        return;
+      default:
+        throw new java.lang.AssertionError("Can't get here.");
+    }
+  }
+
+  public final com.google.protobuf.Message
+      getRequestPrototype(
+      com.google.protobuf.Descriptors.MethodDescriptor method) {
+    if (method.getService() != getDescriptor()) {
+      throw new java.lang.IllegalArgumentException(
+        "Service.getRequestPrototype() given method " +
+        "descriptor for wrong service type.");
+    }
+    switch(method.getIndex()) {
+      case 0:
+        return com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.getDefaultInstance();
+      default:
+        throw new java.lang.AssertionError("Can't get here.");
+    }
+  }
+
+  public final com.google.protobuf.Message
+      getResponsePrototype(
+      com.google.protobuf.Descriptors.MethodDescriptor method) {
+    if (method.getService() != getDescriptor()) {
+      throw new java.lang.IllegalArgumentException(
+        "Service.getResponsePrototype() given method " +
+        "descriptor for wrong service type.");
+    }
+    switch(method.getIndex()) {
+      case 0:
+        return com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance();
+      default:
+        throw new java.lang.AssertionError("Can't get here.");
+    }
+  }
+
+  public static Stub newStub(
+      com.google.protobuf.RpcChannel channel) {
+    return new Stub(channel);
+  }
+
+  public static final class Stub extends com.tzld.piaoquan.recommend.server.gen.recommend.RecommendService implements Interface {
+    private Stub(com.google.protobuf.RpcChannel channel) {
+      this.channel = channel;
+    }
+
+    private final com.google.protobuf.RpcChannel channel;
+
+    public com.google.protobuf.RpcChannel getChannel() {
+      return channel;
+    }
+
+    public  void homepageRecommend(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(0),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.class,
+          com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance()));
+    }
+  }
+
+  public static BlockingInterface newBlockingStub(
+      com.google.protobuf.BlockingRpcChannel channel) {
+    return new BlockingStub(channel);
+  }
+
+  public interface BlockingInterface {
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse homepageRecommend(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request)
+        throws com.google.protobuf.ServiceException;
+  }
+
+  private static final class BlockingStub implements BlockingInterface {
+    private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {
+      this.channel = channel;
+    }
+
+    private final com.google.protobuf.BlockingRpcChannel channel;
+
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse homepageRecommend(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(0),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance());
+    }
+
+  }
+
+  // @@protoc_insertion_point(class_scope:RecommendService)
+}
+

+ 300 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendServiceGrpc.java

@@ -0,0 +1,300 @@
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncUnaryCall;
+import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
+import static io.grpc.stub.ClientCalls.blockingUnaryCall;
+import static io.grpc.stub.ClientCalls.futureUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
+
+/**
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.34.1)",
+    comments = "Source: com/tzld/piaoquan/recommend/server/recommend.proto")
+public final class RecommendServiceGrpc {
+
+  private RecommendServiceGrpc() {}
+
+  public static final String SERVICE_NAME = "RecommendService";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest,
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> getHomepageRecommendMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "HomepageRecommend",
+      requestType = com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.class,
+      responseType = com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest,
+      com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> getHomepageRecommendMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest, com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> getHomepageRecommendMethod;
+    if ((getHomepageRecommendMethod = RecommendServiceGrpc.getHomepageRecommendMethod) == null) {
+      synchronized (RecommendServiceGrpc.class) {
+        if ((getHomepageRecommendMethod = RecommendServiceGrpc.getHomepageRecommendMethod) == null) {
+          RecommendServiceGrpc.getHomepageRecommendMethod = getHomepageRecommendMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest, com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "HomepageRecommend"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new RecommendServiceMethodDescriptorSupplier("HomepageRecommend"))
+              .build();
+        }
+      }
+    }
+    return getHomepageRecommendMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static RecommendServiceStub newStub(io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<RecommendServiceStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<RecommendServiceStub>() {
+        @java.lang.Override
+        public RecommendServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new RecommendServiceStub(channel, callOptions);
+        }
+      };
+    return RecommendServiceStub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static RecommendServiceBlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<RecommendServiceBlockingStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<RecommendServiceBlockingStub>() {
+        @java.lang.Override
+        public RecommendServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new RecommendServiceBlockingStub(channel, callOptions);
+        }
+      };
+    return RecommendServiceBlockingStub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static RecommendServiceFutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<RecommendServiceFutureStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<RecommendServiceFutureStub>() {
+        @java.lang.Override
+        public RecommendServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new RecommendServiceFutureStub(channel, callOptions);
+        }
+      };
+    return RecommendServiceFutureStub.newStub(factory, channel);
+  }
+
+  /**
+   */
+  public static abstract class RecommendServiceImplBase implements io.grpc.BindableService {
+
+    /**
+     * <pre>
+     * 首页推荐和tab分类 /applet/video/homepage/recommend
+     * </pre>
+     */
+    public void homepageRecommend(com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getHomepageRecommendMethod(), responseObserver);
+    }
+
+    @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+      return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+          .addMethod(
+            getHomepageRecommendMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest,
+                com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse>(
+                  this, METHODID_HOMEPAGE_RECOMMEND)))
+          .build();
+    }
+  }
+
+  /**
+   */
+  public static final class RecommendServiceStub extends io.grpc.stub.AbstractAsyncStub<RecommendServiceStub> {
+    private RecommendServiceStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected RecommendServiceStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new RecommendServiceStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * 首页推荐和tab分类 /applet/video/homepage/recommend
+     * </pre>
+     */
+    public void homepageRecommend(com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getHomepageRecommendMethod(), getCallOptions()), request, responseObserver);
+    }
+  }
+
+  /**
+   */
+  public static final class RecommendServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub<RecommendServiceBlockingStub> {
+    private RecommendServiceBlockingStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected RecommendServiceBlockingStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new RecommendServiceBlockingStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * 首页推荐和tab分类 /applet/video/homepage/recommend
+     * </pre>
+     */
+    public com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse homepageRecommend(com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getHomepageRecommendMethod(), getCallOptions(), request);
+    }
+  }
+
+  /**
+   */
+  public static final class RecommendServiceFutureStub extends io.grpc.stub.AbstractFutureStub<RecommendServiceFutureStub> {
+    private RecommendServiceFutureStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected RecommendServiceFutureStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new RecommendServiceFutureStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * 首页推荐和tab分类 /applet/video/homepage/recommend
+     * </pre>
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse> homepageRecommend(
+        com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getHomepageRecommendMethod(), getCallOptions()), request);
+    }
+  }
+
+  private static final int METHODID_HOMEPAGE_RECOMMEND = 0;
+
+  private static final class MethodHandlers<Req, Resp> implements
+      io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+    private final RecommendServiceImplBase serviceImpl;
+    private final int methodId;
+
+    MethodHandlers(RecommendServiceImplBase serviceImpl, int methodId) {
+      this.serviceImpl = serviceImpl;
+      this.methodId = methodId;
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        case METHODID_HOMEPAGE_RECOMMEND:
+          serviceImpl.homepageRecommend((com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse>) responseObserver);
+          break;
+        default:
+          throw new AssertionError();
+      }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver<Req> invoke(
+        io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        default:
+          throw new AssertionError();
+      }
+    }
+  }
+
+  private static abstract class RecommendServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+    RecommendServiceBaseDescriptorSupplier() {}
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.getDescriptor();
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+      return getFileDescriptor().findServiceByName("RecommendService");
+    }
+  }
+
+  private static final class RecommendServiceFileDescriptorSupplier
+      extends RecommendServiceBaseDescriptorSupplier {
+    RecommendServiceFileDescriptorSupplier() {}
+  }
+
+  private static final class RecommendServiceMethodDescriptorSupplier
+      extends RecommendServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+    private final String methodName;
+
+    RecommendServiceMethodDescriptorSupplier(String methodName) {
+      this.methodName = methodName;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+      return getServiceDescriptor().findMethodByName(methodName);
+    }
+  }
+
+  private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+  public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+    io.grpc.ServiceDescriptor result = serviceDescriptor;
+    if (result == null) {
+      synchronized (RecommendServiceGrpc.class) {
+        result = serviceDescriptor;
+        if (result == null) {
+          serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+              .setSchemaDescriptor(new RecommendServiceFileDescriptorSupplier())
+              .addMethod(getHomepageRecommendMethod())
+              .build();
+        }
+      }
+    }
+    return result;
+  }
+}

+ 1028 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/Video.java

@@ -0,0 +1,1028 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+/**
+ * Protobuf type {@code Video}
+ */
+public final class Video extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:Video)
+    VideoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Video.newBuilder() to construct.
+  private Video(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Video() {
+    pushFrom_ = "";
+    abCode_ = "";
+    sortScore_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new Video();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Video(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            videoId_ = input.readInt64();
+            break;
+          }
+          case 17: {
+
+            rovScore_ = input.readDouble();
+            break;
+          }
+          case 26: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            pushFrom_ = s;
+            break;
+          }
+          case 34: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            abCode_ = s;
+            break;
+          }
+          case 42: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            sortScore_ = s;
+            break;
+          }
+          case 48: {
+
+            position_ = input.readInt32();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_Video_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_Video_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.server.gen.recommend.Video.class, com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder.class);
+  }
+
+  public static final int VIDEO_ID_FIELD_NUMBER = 1;
+  private long videoId_;
+  /**
+   * <code>int64 video_id = 1;</code>
+   * @return The videoId.
+   */
+  @java.lang.Override
+  public long getVideoId() {
+    return videoId_;
+  }
+
+  public static final int ROV_SCORE_FIELD_NUMBER = 2;
+  private double rovScore_;
+  /**
+   * <code>double rov_score = 2;</code>
+   * @return The rovScore.
+   */
+  @java.lang.Override
+  public double getRovScore() {
+    return rovScore_;
+  }
+
+  public static final int PUSH_FROM_FIELD_NUMBER = 3;
+  private volatile java.lang.Object pushFrom_;
+  /**
+   * <code>string push_from = 3;</code>
+   * @return The pushFrom.
+   */
+  @java.lang.Override
+  public java.lang.String getPushFrom() {
+    java.lang.Object ref = pushFrom_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      pushFrom_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string push_from = 3;</code>
+   * @return The bytes for pushFrom.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getPushFromBytes() {
+    java.lang.Object ref = pushFrom_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      pushFrom_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int AB_CODE_FIELD_NUMBER = 4;
+  private volatile java.lang.Object abCode_;
+  /**
+   * <code>string ab_code = 4;</code>
+   * @return The abCode.
+   */
+  @java.lang.Override
+  public java.lang.String getAbCode() {
+    java.lang.Object ref = abCode_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      abCode_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string ab_code = 4;</code>
+   * @return The bytes for abCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getAbCodeBytes() {
+    java.lang.Object ref = abCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      abCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int SORT_SCORE_FIELD_NUMBER = 5;
+  private volatile java.lang.Object sortScore_;
+  /**
+   * <code>string sort_score = 5;</code>
+   * @return The sortScore.
+   */
+  @java.lang.Override
+  public java.lang.String getSortScore() {
+    java.lang.Object ref = sortScore_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      sortScore_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string sort_score = 5;</code>
+   * @return The bytes for sortScore.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getSortScoreBytes() {
+    java.lang.Object ref = sortScore_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      sortScore_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int POSITION_FIELD_NUMBER = 6;
+  private int position_;
+  /**
+   * <code>int32 position = 6;</code>
+   * @return The position.
+   */
+  @java.lang.Override
+  public int getPosition() {
+    return position_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (videoId_ != 0L) {
+      output.writeInt64(1, videoId_);
+    }
+    if (rovScore_ != 0D) {
+      output.writeDouble(2, rovScore_);
+    }
+    if (!getPushFromBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, pushFrom_);
+    }
+    if (!getAbCodeBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, abCode_);
+    }
+    if (!getSortScoreBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 5, sortScore_);
+    }
+    if (position_ != 0) {
+      output.writeInt32(6, position_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (videoId_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(1, videoId_);
+    }
+    if (rovScore_ != 0D) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeDoubleSize(2, rovScore_);
+    }
+    if (!getPushFromBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, pushFrom_);
+    }
+    if (!getAbCodeBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, abCode_);
+    }
+    if (!getSortScoreBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, sortScore_);
+    }
+    if (position_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(6, position_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.server.gen.recommend.Video)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.server.gen.recommend.Video other = (com.tzld.piaoquan.recommend.server.gen.recommend.Video) obj;
+
+    if (getVideoId()
+        != other.getVideoId()) return false;
+    if (java.lang.Double.doubleToLongBits(getRovScore())
+        != java.lang.Double.doubleToLongBits(
+            other.getRovScore())) return false;
+    if (!getPushFrom()
+        .equals(other.getPushFrom())) return false;
+    if (!getAbCode()
+        .equals(other.getAbCode())) return false;
+    if (!getSortScore()
+        .equals(other.getSortScore())) return false;
+    if (getPosition()
+        != other.getPosition()) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + VIDEO_ID_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getVideoId());
+    hash = (37 * hash) + ROV_SCORE_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        java.lang.Double.doubleToLongBits(getRovScore()));
+    hash = (37 * hash) + PUSH_FROM_FIELD_NUMBER;
+    hash = (53 * hash) + getPushFrom().hashCode();
+    hash = (37 * hash) + AB_CODE_FIELD_NUMBER;
+    hash = (53 * hash) + getAbCode().hashCode();
+    hash = (37 * hash) + SORT_SCORE_FIELD_NUMBER;
+    hash = (53 * hash) + getSortScore().hashCode();
+    hash = (37 * hash) + POSITION_FIELD_NUMBER;
+    hash = (53 * hash) + getPosition();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.server.gen.recommend.Video prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code Video}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:Video)
+      com.tzld.piaoquan.recommend.server.gen.recommend.VideoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_Video_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_Video_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.server.gen.recommend.Video.class, com.tzld.piaoquan.recommend.server.gen.recommend.Video.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.server.gen.recommend.Video.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      videoId_ = 0L;
+
+      rovScore_ = 0D;
+
+      pushFrom_ = "";
+
+      abCode_ = "";
+
+      sortScore_ = "";
+
+      position_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Recommend.internal_static_Video_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.Video getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.server.gen.recommend.Video.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.Video build() {
+      com.tzld.piaoquan.recommend.server.gen.recommend.Video result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.server.gen.recommend.Video buildPartial() {
+      com.tzld.piaoquan.recommend.server.gen.recommend.Video result = new com.tzld.piaoquan.recommend.server.gen.recommend.Video(this);
+      result.videoId_ = videoId_;
+      result.rovScore_ = rovScore_;
+      result.pushFrom_ = pushFrom_;
+      result.abCode_ = abCode_;
+      result.sortScore_ = sortScore_;
+      result.position_ = position_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.server.gen.recommend.Video) {
+        return mergeFrom((com.tzld.piaoquan.recommend.server.gen.recommend.Video)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.server.gen.recommend.Video other) {
+      if (other == com.tzld.piaoquan.recommend.server.gen.recommend.Video.getDefaultInstance()) return this;
+      if (other.getVideoId() != 0L) {
+        setVideoId(other.getVideoId());
+      }
+      if (other.getRovScore() != 0D) {
+        setRovScore(other.getRovScore());
+      }
+      if (!other.getPushFrom().isEmpty()) {
+        pushFrom_ = other.pushFrom_;
+        onChanged();
+      }
+      if (!other.getAbCode().isEmpty()) {
+        abCode_ = other.abCode_;
+        onChanged();
+      }
+      if (!other.getSortScore().isEmpty()) {
+        sortScore_ = other.sortScore_;
+        onChanged();
+      }
+      if (other.getPosition() != 0) {
+        setPosition(other.getPosition());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.server.gen.recommend.Video parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.server.gen.recommend.Video) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private long videoId_ ;
+    /**
+     * <code>int64 video_id = 1;</code>
+     * @return The videoId.
+     */
+    @java.lang.Override
+    public long getVideoId() {
+      return videoId_;
+    }
+    /**
+     * <code>int64 video_id = 1;</code>
+     * @param value The videoId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideoId(long value) {
+      
+      videoId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int64 video_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVideoId() {
+      
+      videoId_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private double rovScore_ ;
+    /**
+     * <code>double rov_score = 2;</code>
+     * @return The rovScore.
+     */
+    @java.lang.Override
+    public double getRovScore() {
+      return rovScore_;
+    }
+    /**
+     * <code>double rov_score = 2;</code>
+     * @param value The rovScore to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRovScore(double value) {
+      
+      rovScore_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>double rov_score = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRovScore() {
+      
+      rovScore_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object pushFrom_ = "";
+    /**
+     * <code>string push_from = 3;</code>
+     * @return The pushFrom.
+     */
+    public java.lang.String getPushFrom() {
+      java.lang.Object ref = pushFrom_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        pushFrom_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string push_from = 3;</code>
+     * @return The bytes for pushFrom.
+     */
+    public com.google.protobuf.ByteString
+        getPushFromBytes() {
+      java.lang.Object ref = pushFrom_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        pushFrom_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string push_from = 3;</code>
+     * @param value The pushFrom to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPushFrom(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      pushFrom_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string push_from = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPushFrom() {
+      
+      pushFrom_ = getDefaultInstance().getPushFrom();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string push_from = 3;</code>
+     * @param value The bytes for pushFrom to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPushFromBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      pushFrom_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object abCode_ = "";
+    /**
+     * <code>string ab_code = 4;</code>
+     * @return The abCode.
+     */
+    public java.lang.String getAbCode() {
+      java.lang.Object ref = abCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        abCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string ab_code = 4;</code>
+     * @return The bytes for abCode.
+     */
+    public com.google.protobuf.ByteString
+        getAbCodeBytes() {
+      java.lang.Object ref = abCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        abCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string ab_code = 4;</code>
+     * @param value The abCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAbCode(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      abCode_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ab_code = 4;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearAbCode() {
+      
+      abCode_ = getDefaultInstance().getAbCode();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string ab_code = 4;</code>
+     * @param value The bytes for abCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setAbCodeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      abCode_ = value;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object sortScore_ = "";
+    /**
+     * <code>string sort_score = 5;</code>
+     * @return The sortScore.
+     */
+    public java.lang.String getSortScore() {
+      java.lang.Object ref = sortScore_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        sortScore_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string sort_score = 5;</code>
+     * @return The bytes for sortScore.
+     */
+    public com.google.protobuf.ByteString
+        getSortScoreBytes() {
+      java.lang.Object ref = sortScore_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        sortScore_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string sort_score = 5;</code>
+     * @param value The sortScore to set.
+     * @return This builder for chaining.
+     */
+    public Builder setSortScore(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      sortScore_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string sort_score = 5;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearSortScore() {
+      
+      sortScore_ = getDefaultInstance().getSortScore();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string sort_score = 5;</code>
+     * @param value The bytes for sortScore to set.
+     * @return This builder for chaining.
+     */
+    public Builder setSortScoreBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      sortScore_ = value;
+      onChanged();
+      return this;
+    }
+
+    private int position_ ;
+    /**
+     * <code>int32 position = 6;</code>
+     * @return The position.
+     */
+    @java.lang.Override
+    public int getPosition() {
+      return position_;
+    }
+    /**
+     * <code>int32 position = 6;</code>
+     * @param value The position to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPosition(int value) {
+      
+      position_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int32 position = 6;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPosition() {
+      
+      position_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:Video)
+  }
+
+  // @@protoc_insertion_point(class_scope:Video)
+  private static final com.tzld.piaoquan.recommend.server.gen.recommend.Video DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.server.gen.recommend.Video();
+  }
+
+  public static com.tzld.piaoquan.recommend.server.gen.recommend.Video getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Video>
+      PARSER = new com.google.protobuf.AbstractParser<Video>() {
+    @java.lang.Override
+    public Video parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Video(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Video> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Video> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.server.gen.recommend.Video getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 63 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/VideoOrBuilder.java

@@ -0,0 +1,63 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/server/recommend.proto
+
+package com.tzld.piaoquan.recommend.server.gen.recommend;
+
+public interface VideoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:Video)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>int64 video_id = 1;</code>
+   * @return The videoId.
+   */
+  long getVideoId();
+
+  /**
+   * <code>double rov_score = 2;</code>
+   * @return The rovScore.
+   */
+  double getRovScore();
+
+  /**
+   * <code>string push_from = 3;</code>
+   * @return The pushFrom.
+   */
+  java.lang.String getPushFrom();
+  /**
+   * <code>string push_from = 3;</code>
+   * @return The bytes for pushFrom.
+   */
+  com.google.protobuf.ByteString
+      getPushFromBytes();
+
+  /**
+   * <code>string ab_code = 4;</code>
+   * @return The abCode.
+   */
+  java.lang.String getAbCode();
+  /**
+   * <code>string ab_code = 4;</code>
+   * @return The bytes for abCode.
+   */
+  com.google.protobuf.ByteString
+      getAbCodeBytes();
+
+  /**
+   * <code>string sort_score = 5;</code>
+   * @return The sortScore.
+   */
+  java.lang.String getSortScore();
+  /**
+   * <code>string sort_score = 5;</code>
+   * @return The bytes for sortScore.
+   */
+  com.google.protobuf.ByteString
+      getSortScoreBytes();
+
+  /**
+   * <code>int32 position = 6;</code>
+   * @return The position.
+   */
+  int getPosition();
+}

+ 9 - 0
recommend-server-client/src/main/proto/com/tzld/piaoquan/recommend/server/common.proto

@@ -0,0 +1,9 @@
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "com.tzld.piaoquan.recommend.server.gen.common";
+
+message Result {
+  int32 code = 1; // 1 成功
+  string message = 2;
+}

+ 52 - 0
recommend-server-client/src/main/proto/com/tzld/piaoquan/recommend/server/recommend.proto

@@ -0,0 +1,52 @@
+syntax = "proto3";
+
+import "google/protobuf/any.proto";
+import "com/tzld/piaoquan/recommend/server/common.proto";
+
+option java_multiple_files = true;
+option java_package = "com.tzld.piaoquan.recommend.server.gen.recommend";
+option java_generic_services = true;
+
+
+message HomepageRecommendRequest {
+  string request_id = 1;
+  string mid = 2;
+  string uid = 3;
+  string category_id = 4;
+  int32 size = 5; // default 4
+  string app_type = 6; // default 4
+  string algo_type = 7;
+  string client_info = 8;
+  string ab_exp_info = 9;
+  string ab_info_data = 10;
+  int32 version_audit_status = 11; // default 2
+  string machine_info_brand = 12;
+  string machine_info_model = 13;
+  string machine_info_platform = 14;
+  string page_source = 15;
+  int32 version_code = 16; // default 0
+  string recommend_source = 17; // default 0
+  int32 scene_type = 18; // default 0
+  string recommend_trace_id = 19;
+}
+
+// https://sls.console.aliyun.com/lognext/project/rov-server/logsearch/info
+message HomepageRecommendResponse {
+  Result result = 1;
+  repeated Video video = 2;
+}
+
+message Video{
+    int64 video_id = 1;
+    double rov_score = 2;
+    string push_from = 3;
+    string ab_code = 4;
+    string sort_score = 5;
+    int32 position = 6;
+}
+
+service RecommendService {
+  // 首页推荐和tab分类 /applet/video/homepage/recommend
+  rpc HomepageRecommend (HomepageRecommendRequest) returns (HomepageRecommendResponse);
+
+}

+ 5 - 0
recommend-server-service/pom.xml

@@ -127,6 +127,11 @@
             <artifactId>jersey-apache-client4</artifactId>
             <version>1.9.1</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.1</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 1 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/HelloService.java → recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/grpcservice/HelloService.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.recommend.server.service;
+package com.tzld.piaoquan.recommend.server.grpcservice;
 
 import com.tzld.piaoquan.recommend.server.gen.demo.HelloRequest;
 import com.tzld.piaoquan.recommend.server.gen.demo.HelloResponse;

+ 23 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/grpcservice/RecommendService.java

@@ -0,0 +1,23 @@
+package com.tzld.piaoquan.recommend.server.grpcservice;
+
+import com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest;
+import com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse;
+import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendServiceGrpc;
+import io.grpc.stub.StreamObserver;
+import net.devh.boot.grpc.server.service.GrpcService;
+
+/**
+ * @author dyp
+ */
+@GrpcService
+public class RecommendService extends RecommendServiceGrpc.RecommendServiceImplBase {
+    @Override
+    public void homepageRecommend(HomepageRecommendRequest request, StreamObserver<HomepageRecommendResponse> responseObserver) {
+        HomepageRecommendResponse.Builder builder = HomepageRecommendResponse.newBuilder();
+
+
+
+        responseObserver.onNext(builder.build());
+        responseObserver.onCompleted();
+    }
+}

+ 18 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/param/AbExpCode.java

@@ -0,0 +1,18 @@
+package com.tzld.piaoquan.recommend.server.model.param;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author dyp
+ */
+@NoArgsConstructor
+@Getter
+@Setter
+public class AbExpCode {
+    private String data_key;
+    private String rule_key;
+    private String rank_key_prefix;
+    private String ab_code;
+}

+ 27 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/param/HomepageRecommendParam.java

@@ -0,0 +1,27 @@
+package com.tzld.piaoquan.recommend.server.model.param;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author dyp
+ */
+
+@NoArgsConstructor
+@Getter
+@Setter
+public class HomepageRecommendParam {
+    private int top_K;
+    private double flow_pool_P;
+    private String ab_code;
+    private String rule_key;
+    private String data_key;
+    private int expire_time;
+    private boolean no_op_flag;
+    private int old_video_index;
+    private String rule_key_30day;
+    private String shield_config;
+    private String flow_pool_abtest_group;
+    private String rank_key_prefix;
+}

+ 26 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/MidService.java

@@ -0,0 +1,26 @@
+package com.tzld.piaoquan.recommend.server.service;
+
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author dyp
+ */
+@Service
+public class MidService {
+    public Set<String> getSpecialMids() {
+        // TODO
+        //def get_special_mid_list():
+        //    redis_helper = RedisHelper()
+        //    special_mid_list = redis_helper.get_data_from_set(key_name=config_.KEY_NAME_SPECIAL_MID)
+        //    if special_mid_list:
+        //        return special_mid_list
+        //    else:
+        //        return []
+        //     KEY_NAME_SPECIAL_MID = 'special:mid'
+
+        return Collections.emptySet();
+    }
+}

+ 132 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java

@@ -0,0 +1,132 @@
+package com.tzld.piaoquan.recommend.server.service;
+
+import com.tzld.piaoquan.recommend.server.gen.common.Result;
+import com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendRequest;
+import com.tzld.piaoquan.recommend.server.gen.recommend.HomepageRecommendResponse;
+import com.tzld.piaoquan.recommend.server.gen.recommend.Video;
+import com.tzld.piaoquan.recommend.server.model.param.HomepageRecommendParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ZSetOperations;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.PostConstruct;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author dyp
+ */
+@Service
+public class RecommendService {
+    @Autowired
+    private MidService midService;
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+    private String abExpCode;
+
+    private Map<String, String> ab_initial_config_map = new HashMap<>();
+
+    @PostConstruct
+    public void init() {
+        ab_initial_config_map.put("VLOG", "095");
+        ab_initial_config_map.put("LOVE_LIVE", "144");
+        ab_initial_config_map.put("LONG_VIDEO", "121");
+        ab_initial_config_map.put("LAO_HAO_KAN_VIDEO", "074");
+        ab_initial_config_map.put("ZUI_JING_QI", "069");
+        ab_initial_config_map.put("other", "095-1");
+    }
+
+    public HomepageRecommendResponse homepageRecommend(HomepageRecommendRequest request) {
+
+        if (request.getVersionAuditStatus() == 1) {
+            return specialMidRecommend(request);
+        }
+        if (StringUtils.isNotBlank(request.getMid())
+                && redisTemplate.opsForSet().isMember("special:mid", request.getMid())) {
+            return specialMidRecommend(request);
+        }
+
+        HomepageRecommendParam param = genHomepageRecommendParam(request);
+        return null;
+
+    }
+
+    private HomepageRecommendParam genHomepageRecommendParam(HomepageRecommendRequest request) {
+        HomepageRecommendParam param = new HomepageRecommendParam();
+        param.setTop_K(3);
+        param.setFlow_pool_P(0.3);
+        param.setNo_op_flag(true);
+        param.setExpire_time(3600);
+        param.setOld_video_index(-1);
+
+        String abInitialConfig = ab_initial_config_map.containsKey(request.getAppType())
+                ? ab_initial_config_map.get(request.getAppType())
+                : ab_initial_config_map.get("other");
+
+
+        return param;
+    }
+
+    private HomepageRecommendResponse specialMidRecommend(HomepageRecommendRequest request) {
+        String keyNamePrefix = "special:videos:item:";
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
+        Date currentDate = new Date();
+        String dateStr = dateFormat.format(currentDate);
+        String specialKeyName = keyNamePrefix + dateStr;
+        if (!redisTemplate.hasKey(specialKeyName)) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(currentDate);
+            calendar.add(Calendar.DAY_OF_MONTH, -1);
+            Date previousDate = calendar.getTime();
+            dateStr = dateFormat.format(previousDate);
+            specialKeyName = keyNamePrefix + dateStr;
+        }
+
+        String lastSpecialRecallKey = String.format("recall:last:special:%s:%s:%s", request.getAppType(), request.getMid(), dateStr);
+        String value = redisTemplate.opsForValue().get(lastSpecialRecallKey);
+        Long idx = 0L;
+        if (StringUtils.isNotBlank(value)) {
+            idx = redisTemplate.opsForZSet().reverseRank(specialKeyName, value);
+            idx = idx == null ? 0L : idx;
+        }
+
+        int getSize = request.getSize() * 5;
+        int freq = 0;
+        List<Video> results = new ArrayList<>();
+        while (results.size() < request.getSize()) {
+            freq += 1;
+            if (freq > 2) {
+                break;
+            }
+            Set<ZSetOperations.TypedTuple<String>> data = redisTemplate.opsForZSet().reverseRangeWithScores(specialKeyName, idx, idx + getSize - 1);
+            if (CollectionUtils.isEmpty(data)) {
+                break;
+            }
+            idx += getSize;
+            data.stream().forEach(t ->
+                    results.add(Video.newBuilder()
+                            .setVideoId(Long.getLong(t.getValue(), 0L))
+                            .setRovScore(t.getScore())
+                            .setAbCode("99999")
+                            .setPushFrom("special_mid_videos")
+                            .build())
+            );
+        }
+
+        if (StringUtils.isNotBlank(request.getMid()) && !CollectionUtils.isEmpty(results)) {
+            redisTemplate.opsForValue().set(lastSpecialRecallKey, String.valueOf(results.get(results.size() - 1).getVideoId()), 1, TimeUnit.DAYS);
+        }
+
+        return HomepageRecommendResponse.newBuilder()
+                .setResult(Result.newBuilder().setCode(1).setMessage("success"))
+                .addAllVideo(results)
+                .build();
+    }
+
+}