diff --git a/Server/Constants.cs b/Server/Constants.cs
index e4b247b..6098051 100644
--- a/Server/Constants.cs
+++ b/Server/Constants.cs
@@ -67,6 +67,7 @@ public sealed class Constants
         [(int)EventTypes.Sell] = new("sell", "出售", true),
         [(int)EventTypes.Share] = new("share", "分享"),
         [(int)EventTypes.Move] = new("move", "移动"),
+        [(int)EventTypes.Comment] = new("comment", "评论"),
     };
 }
 
@@ -103,6 +104,10 @@ public enum EventTypes
     /// 移动
     /// </summary>
     Move = 14,
+    /// <summary>
+    /// 评论
+    /// </summary>
+    Comment = 15,
 }
 
 /// <summary>
diff --git a/Server/Controller/EventApiController.cs b/Server/Controller/EventApiController.cs
index 07c7411..566580e 100644
--- a/Server/Controller/EventApiController.cs
+++ b/Server/Controller/EventApiController.cs
@@ -37,6 +37,7 @@ public class EventApiController : BaseController
     ///     p: bool?
     /// 
     /// </remarks>
+    /// <param name="flowerId">花草唯一 id</param>
     /// <param name="eventId">事件类型 id</param>
     /// <param name="key">查询关键字</param>
     /// <param name="from">起始日期</param>
@@ -56,6 +57,7 @@ public class EventApiController : BaseController
     [HttpGet]
     [ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
     public ActionResult<RecordItem[]> GetRecords(
+        [FromQuery(Name = "fid")] int? flowerId,
         [FromQuery(Name = "eid")] int? eventId,
         [FromQuery] string? key,
         [FromQuery] long? from,
@@ -74,7 +76,25 @@ public class EventApiController : BaseController
 
         SaveDatabase();
 
-        var records = database.Records.Where(r => r.OwnerId == user.Id);
+        var records = database.Records.Where(r => r.OwnerId == user.Id).Select(r => new RecordItem
+        {
+            Id = r.Id,
+            OwnerId = r.OwnerId,
+            ByUserId = r.ByUserId,
+            DateUnixTime = r.DateUnixTime,
+            EventId = r.EventId,
+            FlowerId = r.FlowerId,
+            IsHidden = r.IsHidden,
+            Latitude = r.Latitude,
+            Longitude = r.Longitude,
+            Title = r.Title,
+            Memo = r.Memo,
+            ByUserName = string.IsNullOrEmpty(r.ByUserName) && r.ByUserId != null ? database.Users.Single(u => u.Id == r.ByUserId).Name : r.ByUserName
+        });
+        if (flowerId != null)
+        {
+            records = records.Where(r => r.FlowerId == flowerId);
+        }
         if (eventId != null)
         {
             records = records.Where(r => r.EventId == eventId);
@@ -99,7 +119,16 @@ public class EventApiController : BaseController
             records = records.Include(r => r.Photos);
         }
 
-        return Ok(records.ToArray());
+        var array = records.ToArray();
+        foreach (var r in array)
+        {
+            if (string.IsNullOrEmpty(r.ByUserName))
+            {
+                r.ByUserName = user.Name;
+            }
+        }
+
+        return Ok(array);
     }
 
     /// <summary>
@@ -249,8 +278,10 @@ public class EventApiController : BaseController
             FlowerId = @event.FlowerId,
             EventId = @event.CategoryId,
             DateUnixTime = now,
+            IsHidden = @event.IsHidden,
             ByUserId = @event.ByUser == null ? user.Id : null,
             ByUserName = @event.ByUser,
+            Title = @event.Title,
             Memo = @event.Memo,
             Latitude = @event.Latitude,
             Longitude = @event.Longitude
@@ -357,6 +388,7 @@ public class EventApiController : BaseController
         record.FlowerId = update.FlowerId;
         record.EventId = update.CategoryId;
         record.DateUnixTime = now;
+        record.IsHidden = update.IsHidden;
         if (update.ByUser == null)
         {
             record.ByUserId = user.Id;
@@ -367,6 +399,7 @@ public class EventApiController : BaseController
             record.ByUserId = null;
             record.ByUserName = update.ByUser;
         }
+        record.Title = update.Title;
         record.Memo = update.Memo;
         record.Latitude = update.Latitude;
         record.Longitude = update.Longitude;
diff --git a/Server/Controller/EventApiController.structs.cs b/Server/Controller/EventApiController.structs.cs
index 64378e2..266018e 100644
--- a/Server/Controller/EventApiController.structs.cs
+++ b/Server/Controller/EventApiController.structs.cs
@@ -25,21 +25,26 @@ public record EventParameter
     /// <summary>
     /// 操作人姓名
     /// </summary>
-    [Required]
     [FromForm(Name = "byUser")]
-    public required string ByUser { get; init; }
+    public string? ByUser { get; init; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    [FromForm(Name = "title")]
+    public string? Title { get; init; }
 
     /// <summary>
     /// 备注
     /// </summary>
     [FromForm(Name = "memo")]
-    public string? Memo { get; set; }
+    public string? Memo { get; init; }
 
     /// <summary>
     /// 纬度
     /// </summary>
     [FromForm(Name = "lat")]
-    public double? Latitude { get; set; }
+    public double? Latitude { get; init; }
 
     /// <summary>
     /// 经度
@@ -47,6 +52,12 @@ public record EventParameter
     [FromForm(Name = "lon")]
     public double? Longitude { get; set; }
 
+    /// <summary>
+    /// 是否为私有记录
+    /// </summary>
+    [FromForm(Name = "hidden")]
+    public bool? IsHidden { get; init; }
+
     /// <summary>
     /// 关联的照片
     /// </summary>
@@ -64,5 +75,5 @@ public record EventUpdateParameter : EventParameter
     /// </summary>
     [Required]
     [FromForm(Name = "id")]
-    public required int Id { get; set; }
+    public required int Id { get; init; }
 }
diff --git a/Server/Controller/FlowerApiController.cs b/Server/Controller/FlowerApiController.cs
index f0a0ba4..24b4edb 100644
--- a/Server/Controller/FlowerApiController.cs
+++ b/Server/Controller/FlowerApiController.cs
@@ -301,7 +301,7 @@ public class FlowerApiController : BaseController
 
         var loc = database.Records
             .OrderByDescending(r => r.DateUnixTime)
-            .FirstOrDefault(r => r.FlowerId == id && (r.EventId == (int)EventTypes.Move || r.EventId == (int)EventTypes.Born));
+            .SingleOrDefault(r => r.FlowerId == id && (r.EventId == (int)EventTypes.Move || r.EventId == (int)EventTypes.Born));
         if (loc != null)
         {
             item.Location = loc.Memo;
diff --git a/Server/Controller/FlowerApiController.structs.cs b/Server/Controller/FlowerApiController.structs.cs
index 430129f..1876d8f 100644
--- a/Server/Controller/FlowerApiController.structs.cs
+++ b/Server/Controller/FlowerApiController.structs.cs
@@ -64,25 +64,25 @@ public record FlowerParameter : CoverParameter
     /// 备注
     /// </summary>
     [FromForm(Name = "memo")]
-    public string? Memo { get; set; }
+    public string? Memo { get; init; }
 
     /// <summary>
     /// 纬度
     /// </summary>
     [FromForm(Name = "lat")]
-    public double? Latitude { get; set; }
+    public double? Latitude { get; init; }
 
     /// <summary>
     /// 经度
     /// </summary>
     [FromForm(Name = "lon")]
-    public double? Longitude { get; set; }
+    public double? Longitude { get; init; }
 
     /// <summary>
     /// 存放位置
     /// </summary>
     [FromForm(Name = "location")]
-    public string? Location { get; set; }
+    public string? Location { get; init; }
 }
 
 /// <summary>
@@ -114,13 +114,13 @@ public record FlowerCoverParameter : CoverParameter
     /// 纬度
     /// </summary>
     [FromForm(Name = "lat")]
-    public double? Latitude { get; set; }
+    public double? Latitude { get; init; }
 
     /// <summary>
     /// 经度
     /// </summary>
     [FromForm(Name = "lon")]
-    public double? Longitude { get; set; }
+    public double? Longitude { get; init; }
 }
 
 /// <summary>
diff --git a/Server/Controller/ImageController.cs b/Server/Controller/ImageController.cs
index a640db9..5ce34a1 100644
--- a/Server/Controller/ImageController.cs
+++ b/Server/Controller/ImageController.cs
@@ -93,7 +93,7 @@ public class ImageController : BaseController
         {
             return BadRequest();
         }
-        if (!referrer.StartsWith(BaseUrl))
+        if (!referrer.StartsWith("https://app.tsanie.org"))
         {
             return Forbid();
         }
diff --git a/Server/Data/Model/RecordItem.cs b/Server/Data/Model/RecordItem.cs
index 12ff9fc..c939819 100644
--- a/Server/Data/Model/RecordItem.cs
+++ b/Server/Data/Model/RecordItem.cs
@@ -61,6 +61,12 @@ public class RecordItem : ILocation
     [JsonPropertyName("date")]
     public required long DateUnixTime { get; set; }
 
+    /// <summary>
+    /// 是否为私有记录
+    /// </summary>
+    [Column("hidden")]
+    public bool? IsHidden { get; set; }
+
     /// <summary>
     /// 操作人 uid
     /// </summary>
@@ -73,6 +79,12 @@ public class RecordItem : ILocation
     [Column("byname")]
     public string? ByUserName { get; set; }
 
+    /// <summary>
+    /// 标题
+    /// </summary>
+    [Column("title")]
+    public string? Title { get; set; }
+
     /// <summary>
     /// 备注
     /// </summary>
diff --git a/Server/Migrations/20230804035653_Add-Hidden-For-Record.Designer.cs b/Server/Migrations/20230804035653_Add-Hidden-For-Record.Designer.cs
new file mode 100644
index 0000000..783c358
--- /dev/null
+++ b/Server/Migrations/20230804035653_Add-Hidden-For-Record.Designer.cs
@@ -0,0 +1,357 @@
+// <auto-generated />
+using System;
+using Blahblah.FlowerStory.Server.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Blahblah.FlowerStory.Server.Migrations
+{
+    [DbContext(typeof(FlowerDatabase))]
+    [Migration("20230804035653_Add-Hidden-For-Record")]
+    partial class AddHiddenForRecord
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder.HasAnnotation("ProductVersion", "7.0.9");
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("fid");
+
+                    b.Property<int>("CategoryId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("categoryid");
+
+                    b.Property<decimal?>("Cost")
+                        .HasColumnType("real")
+                        .HasColumnName("cost");
+
+                    b.Property<long>("DateBuyUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("datebuy")
+                        .HasAnnotation("Relational:JsonPropertyName", "dateBuy");
+
+                    b.Property<double?>("Latitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("latitude");
+
+                    b.Property<double?>("Longitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("longitude");
+
+                    b.Property<string>("Memo")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("memo");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("name");
+
+                    b.Property<int>("OwnerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<string>("Purchase")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("purchase");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("OwnerId");
+
+                    b.ToTable("flowers");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("pid");
+
+                    b.Property<long>("DateUploadUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("dateupload")
+                        .HasAnnotation("Relational:JsonPropertyName", "dateUpload");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("filename");
+
+                    b.Property<string>("FileType")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("filetype");
+
+                    b.Property<int?>("FlowerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("fid");
+
+                    b.Property<int?>("Height")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("height");
+
+                    b.Property<int>("OwnerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("path");
+
+                    b.Property<int?>("RecordId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("rid");
+
+                    b.Property<int?>("Width")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("width");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("FlowerId");
+
+                    b.HasIndex("OwnerId");
+
+                    b.HasIndex("RecordId");
+
+                    b.ToTable("photos");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("rid");
+
+                    b.Property<int?>("ByUserId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("byuid");
+
+                    b.Property<string>("ByUserName")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("byname");
+
+                    b.Property<long>("DateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("date")
+                        .HasAnnotation("Relational:JsonPropertyName", "date");
+
+                    b.Property<int>("EventId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("eid");
+
+                    b.Property<int>("FlowerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("fid");
+
+                    b.Property<bool?>("Hidden")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("hidden");
+
+                    b.Property<double?>("Latitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("latitude");
+
+                    b.Property<double?>("Longitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("longitude");
+
+                    b.Property<string>("Memo")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("memo");
+
+                    b.Property<int>("OwnerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("FlowerId");
+
+                    b.HasIndex("OwnerId");
+
+                    b.ToTable("records");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.TokenItem", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("tid");
+
+                    b.Property<long>("ActiveDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("activedate")
+                        .HasAnnotation("Relational:JsonPropertyName", "activeDate");
+
+                    b.Property<string>("ClientAgent")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("clientagent");
+
+                    b.Property<string>("ClientApp")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("clientapp");
+
+                    b.Property<string>("DeviceId")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("deviceid");
+
+                    b.Property<long>("ExpireDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("expiredate")
+                        .HasAnnotation("Relational:JsonPropertyName", "expireDate");
+
+                    b.Property<int>("ExpireSeconds")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("expiresecs");
+
+                    b.Property<long>("LogonDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("logondate")
+                        .HasAnnotation("Relational:JsonPropertyName", "logonDate");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<string>("VerifyCode")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("verifycode");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("tokens");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.UserItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<long?>("ActiveDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("activedate");
+
+                    b.Property<byte[]>("Avatar")
+                        .HasColumnType("BLOB")
+                        .HasColumnName("avatar");
+
+                    b.Property<string>("Email")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("email");
+
+                    b.Property<int>("Level")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("level");
+
+                    b.Property<string>("Mobile")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("mobile");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("name");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("password");
+
+                    b.Property<long>("RegisterDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("regdate")
+                        .HasAnnotation("Relational:JsonPropertyName", "registerDate");
+
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("id");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("users");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b =>
+                {
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner")
+                        .WithMany()
+                        .HasForeignKey("OwnerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b =>
+                {
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower")
+                        .WithMany("Photos")
+                        .HasForeignKey("FlowerId");
+
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner")
+                        .WithMany()
+                        .HasForeignKey("OwnerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.RecordItem", "Record")
+                        .WithMany("Photos")
+                        .HasForeignKey("RecordId");
+
+                    b.Navigation("Flower");
+
+                    b.Navigation("Owner");
+
+                    b.Navigation("Record");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b =>
+                {
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower")
+                        .WithMany()
+                        .HasForeignKey("FlowerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner")
+                        .WithMany()
+                        .HasForeignKey("OwnerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Flower");
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b =>
+                {
+                    b.Navigation("Photos");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b =>
+                {
+                    b.Navigation("Photos");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/Server/Migrations/20230804035653_Add-Hidden-For-Record.cs b/Server/Migrations/20230804035653_Add-Hidden-For-Record.cs
new file mode 100644
index 0000000..6d347d6
--- /dev/null
+++ b/Server/Migrations/20230804035653_Add-Hidden-For-Record.cs
@@ -0,0 +1,28 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Blahblah.FlowerStory.Server.Migrations
+{
+    /// <inheritdoc />
+    public partial class AddHiddenForRecord : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<bool>(
+                name: "hidden",
+                table: "records",
+                type: "INTEGER",
+                nullable: true);
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "hidden",
+                table: "records");
+        }
+    }
+}
diff --git a/Server/Migrations/20230804133228_Add-Title-For-Record.Designer.cs b/Server/Migrations/20230804133228_Add-Title-For-Record.Designer.cs
new file mode 100644
index 0000000..af85ac0
--- /dev/null
+++ b/Server/Migrations/20230804133228_Add-Title-For-Record.Designer.cs
@@ -0,0 +1,361 @@
+// <auto-generated />
+using System;
+using Blahblah.FlowerStory.Server.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Blahblah.FlowerStory.Server.Migrations
+{
+    [DbContext(typeof(FlowerDatabase))]
+    [Migration("20230804133228_Add-Title-For-Record")]
+    partial class AddTitleForRecord
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder.HasAnnotation("ProductVersion", "7.0.9");
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("fid");
+
+                    b.Property<int>("CategoryId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("categoryid");
+
+                    b.Property<decimal?>("Cost")
+                        .HasColumnType("real")
+                        .HasColumnName("cost");
+
+                    b.Property<long>("DateBuyUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("datebuy")
+                        .HasAnnotation("Relational:JsonPropertyName", "dateBuy");
+
+                    b.Property<double?>("Latitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("latitude");
+
+                    b.Property<double?>("Longitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("longitude");
+
+                    b.Property<string>("Memo")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("memo");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("name");
+
+                    b.Property<int>("OwnerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<string>("Purchase")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("purchase");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("OwnerId");
+
+                    b.ToTable("flowers");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("pid");
+
+                    b.Property<long>("DateUploadUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("dateupload")
+                        .HasAnnotation("Relational:JsonPropertyName", "dateUpload");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("filename");
+
+                    b.Property<string>("FileType")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("filetype");
+
+                    b.Property<int?>("FlowerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("fid");
+
+                    b.Property<int?>("Height")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("height");
+
+                    b.Property<int>("OwnerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("path");
+
+                    b.Property<int?>("RecordId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("rid");
+
+                    b.Property<int?>("Width")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("width");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("FlowerId");
+
+                    b.HasIndex("OwnerId");
+
+                    b.HasIndex("RecordId");
+
+                    b.ToTable("photos");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("rid");
+
+                    b.Property<int?>("ByUserId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("byuid");
+
+                    b.Property<string>("ByUserName")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("byname");
+
+                    b.Property<long>("DateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("date")
+                        .HasAnnotation("Relational:JsonPropertyName", "date");
+
+                    b.Property<int>("EventId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("eid");
+
+                    b.Property<int>("FlowerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("fid");
+
+                    b.Property<bool?>("IsHidden")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("hidden");
+
+                    b.Property<double?>("Latitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("latitude");
+
+                    b.Property<double?>("Longitude")
+                        .HasColumnType("REAL")
+                        .HasColumnName("longitude");
+
+                    b.Property<string>("Memo")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("memo");
+
+                    b.Property<int>("OwnerId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<string>("Title")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("title");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("FlowerId");
+
+                    b.HasIndex("OwnerId");
+
+                    b.ToTable("records");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.TokenItem", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("tid");
+
+                    b.Property<long>("ActiveDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("activedate")
+                        .HasAnnotation("Relational:JsonPropertyName", "activeDate");
+
+                    b.Property<string>("ClientAgent")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("clientagent");
+
+                    b.Property<string>("ClientApp")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("clientapp");
+
+                    b.Property<string>("DeviceId")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("deviceid");
+
+                    b.Property<long>("ExpireDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("expiredate")
+                        .HasAnnotation("Relational:JsonPropertyName", "expireDate");
+
+                    b.Property<int>("ExpireSeconds")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("expiresecs");
+
+                    b.Property<long>("LogonDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("logondate")
+                        .HasAnnotation("Relational:JsonPropertyName", "logonDate");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<string>("VerifyCode")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("verifycode");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("tokens");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.UserItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("uid");
+
+                    b.Property<long?>("ActiveDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("activedate");
+
+                    b.Property<byte[]>("Avatar")
+                        .HasColumnType("BLOB")
+                        .HasColumnName("avatar");
+
+                    b.Property<string>("Email")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("email");
+
+                    b.Property<int>("Level")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("level");
+
+                    b.Property<string>("Mobile")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("mobile");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("name");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("password");
+
+                    b.Property<long>("RegisterDateUnixTime")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("regdate")
+                        .HasAnnotation("Relational:JsonPropertyName", "registerDate");
+
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("TEXT")
+                        .HasColumnName("id");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("users");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b =>
+                {
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner")
+                        .WithMany()
+                        .HasForeignKey("OwnerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.PhotoItem", b =>
+                {
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower")
+                        .WithMany("Photos")
+                        .HasForeignKey("FlowerId");
+
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner")
+                        .WithMany()
+                        .HasForeignKey("OwnerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.RecordItem", "Record")
+                        .WithMany("Photos")
+                        .HasForeignKey("RecordId");
+
+                    b.Navigation("Flower");
+
+                    b.Navigation("Owner");
+
+                    b.Navigation("Record");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b =>
+                {
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", "Flower")
+                        .WithMany()
+                        .HasForeignKey("FlowerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Blahblah.FlowerStory.Server.Data.Model.UserItem", "Owner")
+                        .WithMany()
+                        .HasForeignKey("OwnerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Flower");
+
+                    b.Navigation("Owner");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.FlowerItem", b =>
+                {
+                    b.Navigation("Photos");
+                });
+
+            modelBuilder.Entity("Blahblah.FlowerStory.Server.Data.Model.RecordItem", b =>
+                {
+                    b.Navigation("Photos");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/Server/Migrations/20230804133228_Add-Title-For-Record.cs b/Server/Migrations/20230804133228_Add-Title-For-Record.cs
new file mode 100644
index 0000000..a9157bc
--- /dev/null
+++ b/Server/Migrations/20230804133228_Add-Title-For-Record.cs
@@ -0,0 +1,28 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Blahblah.FlowerStory.Server.Migrations
+{
+    /// <inheritdoc />
+    public partial class AddTitleForRecord : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<string>(
+                name: "title",
+                table: "records",
+                type: "TEXT",
+                nullable: true);
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "title",
+                table: "records");
+        }
+    }
+}
diff --git a/Server/Migrations/FlowerDatabaseModelSnapshot.cs b/Server/Migrations/FlowerDatabaseModelSnapshot.cs
index 44cd4fb..678e7ae 100644
--- a/Server/Migrations/FlowerDatabaseModelSnapshot.cs
+++ b/Server/Migrations/FlowerDatabaseModelSnapshot.cs
@@ -155,6 +155,10 @@ namespace Blahblah.FlowerStory.Server.Migrations
                         .HasColumnType("INTEGER")
                         .HasColumnName("fid");
 
+                    b.Property<bool?>("IsHidden")
+                        .HasColumnType("INTEGER")
+                        .HasColumnName("hidden");
+
                     b.Property<double?>("Latitude")
                         .HasColumnType("REAL")
                         .HasColumnName("latitude");
@@ -171,6 +175,10 @@ namespace Blahblah.FlowerStory.Server.Migrations
                         .HasColumnType("INTEGER")
                         .HasColumnName("uid");
 
+                    b.Property<string>("Title")
+                        .HasColumnType("TEXT")
+                        .HasColumnName("title");
+
                     b.HasKey("Id");
 
                     b.HasIndex("FlowerId");
diff --git a/Server/Program.cs b/Server/Program.cs
index 9321e25..1f1dd24 100644
--- a/Server/Program.cs
+++ b/Server/Program.cs
@@ -11,7 +11,7 @@ public class Program
     /// <inheritdoc/>
     public const string ProjectName = "Flower Story";
     /// <inheritdoc/>
-    public const string Version = "0.8.803";
+    public const string Version = "1.0.807";
 
     /// <inheritdoc/>
     public static void Main(string[] args)
diff --git a/Server/Properties/launchSettings.json b/Server/Properties/launchSettings.json
index 868d3e6..1f921a5 100644
--- a/Server/Properties/launchSettings.json
+++ b/Server/Properties/launchSettings.json
@@ -13,7 +13,7 @@
       "commandName": "Project",
       "dotnetRunMessages": true,
       "launchBrowser": true,
-      "launchUrl": "#tag/UserApi",
+      "launchUrl": "swagger",
       "applicationUrl": "http://localhost:5247",
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development"