make other_title and genre list[str] and compatible with legacy data
This commit is contained in:
parent
d6c0cfad56
commit
fa960a2c7a
16 changed files with 2354 additions and 27 deletions
|
@ -236,7 +236,9 @@ class ArrayField(JSONFieldMixin, DJANGO_ArrayField):
|
||||||
kwargs["help_text"] = _("多项之间以英文逗号分隔")
|
kwargs["help_text"] = _("多项之间以英文逗号分隔")
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
pass
|
def from_json(self, value): # backward compatible with dirty legacy data
|
||||||
|
if value or value == []:
|
||||||
|
return value if isinstance(value, list) else [value]
|
||||||
|
|
||||||
|
|
||||||
class JSONField(JSONFieldMixin, DJANGO_JSONField):
|
class JSONField(JSONFieldMixin, DJANGO_JSONField):
|
||||||
|
|
|
@ -39,7 +39,7 @@ class Game(Item):
|
||||||
|
|
||||||
other_title = jsondata.ArrayField(
|
other_title = jsondata.ArrayField(
|
||||||
base_field=models.CharField(blank=True, default="", max_length=500),
|
base_field=models.CharField(blank=True, default="", max_length=500),
|
||||||
verbose_name=_("其他标题"),
|
verbose_name=_("其它标题"),
|
||||||
null=True,
|
null=True,
|
||||||
blank=True,
|
blank=True,
|
||||||
default=list,
|
default=list,
|
||||||
|
|
|
@ -25,6 +25,9 @@ class IGDBTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.metadata["title"], "Portal 2")
|
self.assertEqual(site.resource.metadata["title"], "Portal 2")
|
||||||
self.assertIsInstance(site.resource.item, Game)
|
self.assertIsInstance(site.resource.item, Game)
|
||||||
self.assertEqual(site.resource.item.steam, "620")
|
self.assertEqual(site.resource.item.steam, "620")
|
||||||
|
self.assertEqual(
|
||||||
|
site.resource.item.genre, ["Shooter", "Platform", "Puzzle", "Adventure"]
|
||||||
|
)
|
||||||
|
|
||||||
@use_local_response
|
@use_local_response
|
||||||
def test_scrape_non_steam(self):
|
def test_scrape_non_steam(self):
|
||||||
|
@ -38,6 +41,7 @@ class IGDBTestCase(TestCase):
|
||||||
)
|
)
|
||||||
self.assertIsInstance(site.resource.item, Game)
|
self.assertIsInstance(site.resource.item, Game)
|
||||||
self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IGDB)
|
self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IGDB)
|
||||||
|
self.assertEqual(site.resource.item.genre, ["Role-playing (RPG)", "Adventure"])
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
site.resource.item.primary_lookup_id_value,
|
site.resource.item.primary_lookup_id_value,
|
||||||
"the-legend-of-zelda-breath-of-the-wild",
|
"the-legend-of-zelda-breath-of-the-wild",
|
||||||
|
@ -70,6 +74,9 @@ class SteamTestCase(TestCase):
|
||||||
)
|
)
|
||||||
self.assertIsInstance(site.resource.item, Game)
|
self.assertIsInstance(site.resource.item, Game)
|
||||||
self.assertEqual(site.resource.item.steam, "620")
|
self.assertEqual(site.resource.item.steam, "620")
|
||||||
|
self.assertEqual(
|
||||||
|
site.resource.item.genre, ["Shooter", "Platform", "Puzzle", "Adventure"]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DoubanGameTestCase(TestCase):
|
class DoubanGameTestCase(TestCase):
|
||||||
|
@ -94,6 +101,8 @@ class DoubanGameTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.metadata["title"], "传送门2 Portal 2")
|
self.assertEqual(site.resource.metadata["title"], "传送门2 Portal 2")
|
||||||
self.assertIsInstance(site.resource.item, Game)
|
self.assertIsInstance(site.resource.item, Game)
|
||||||
self.assertEqual(site.resource.item.douban_game, "10734307")
|
self.assertEqual(site.resource.item.douban_game, "10734307")
|
||||||
|
self.assertEqual(site.resource.item.genre, ["第一人称射击", "益智", "射击", "动作"])
|
||||||
|
self.assertEqual(site.resource.item.other_title, [])
|
||||||
|
|
||||||
|
|
||||||
class BangumiGameTestCase(TestCase):
|
class BangumiGameTestCase(TestCase):
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.db import models
|
||||||
|
|
||||||
class MovieInSchema(ItemInSchema):
|
class MovieInSchema(ItemInSchema):
|
||||||
orig_title: str | None = None
|
orig_title: str | None = None
|
||||||
other_title: str | None = None
|
other_title: list[str]
|
||||||
director: list[str]
|
director: list[str]
|
||||||
playwright: list[str]
|
playwright: list[str]
|
||||||
actor: list[str]
|
actor: list[str]
|
||||||
|
@ -52,8 +52,12 @@ class Movie(Item):
|
||||||
orig_title = jsondata.CharField(
|
orig_title = jsondata.CharField(
|
||||||
verbose_name=_("原始标题"), blank=True, default="", max_length=500
|
verbose_name=_("原始标题"), blank=True, default="", max_length=500
|
||||||
)
|
)
|
||||||
other_title = jsondata.CharField(
|
other_title = jsondata.ArrayField(
|
||||||
verbose_name=_("其他标题"), blank=True, default="", max_length=500
|
verbose_name=_("其它标题"),
|
||||||
|
base_field=models.CharField(blank=True, default="", max_length=200),
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
default=list,
|
||||||
)
|
)
|
||||||
director = jsondata.ArrayField(
|
director = jsondata.ArrayField(
|
||||||
verbose_name=_("导演"),
|
verbose_name=_("导演"),
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.db import models
|
||||||
|
|
||||||
|
|
||||||
class AlbumInSchema(ItemInSchema):
|
class AlbumInSchema(ItemInSchema):
|
||||||
other_title: str | None = None
|
other_title: list[str]
|
||||||
genre: list[str]
|
genre: list[str]
|
||||||
artist: list[str]
|
artist: list[str]
|
||||||
company: list[str]
|
company: list[str]
|
||||||
|
@ -48,7 +48,13 @@ class Album(Item):
|
||||||
verbose_name=_("艺术家"),
|
verbose_name=_("艺术家"),
|
||||||
default=list,
|
default=list,
|
||||||
)
|
)
|
||||||
genre = jsondata.CharField(_("流派"), blank=True, default="", max_length=100)
|
genre = jsondata.ArrayField(
|
||||||
|
verbose_name=_("流派"),
|
||||||
|
base_field=models.CharField(blank=True, default="", max_length=50),
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
default=list,
|
||||||
|
)
|
||||||
company = jsondata.ArrayField(
|
company = jsondata.ArrayField(
|
||||||
models.CharField(blank=True, default="", max_length=500),
|
models.CharField(blank=True, default="", max_length=500),
|
||||||
verbose_name=_("发行方"),
|
verbose_name=_("发行方"),
|
||||||
|
@ -57,7 +63,13 @@ class Album(Item):
|
||||||
default=list,
|
default=list,
|
||||||
)
|
)
|
||||||
track_list = jsondata.TextField(_("曲目"), blank=True, default="")
|
track_list = jsondata.TextField(_("曲目"), blank=True, default="")
|
||||||
other_title = jsondata.CharField(_("其它标题"), blank=True, default="", max_length=500)
|
other_title = jsondata.ArrayField(
|
||||||
|
verbose_name=_("其它标题"),
|
||||||
|
base_field=models.CharField(blank=True, default="", max_length=200),
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
default=list,
|
||||||
|
)
|
||||||
album_type = jsondata.CharField(_("专辑类型"), blank=True, default="", max_length=500)
|
album_type = jsondata.CharField(_("专辑类型"), blank=True, default="", max_length=500)
|
||||||
media = jsondata.CharField(_("介质"), blank=True, default="", max_length=500)
|
media = jsondata.CharField(_("介质"), blank=True, default="", max_length=500)
|
||||||
bandcamp_album_id = jsondata.CharField(blank=True, default="", max_length=500)
|
bandcamp_album_id = jsondata.CharField(blank=True, default="", max_length=500)
|
||||||
|
|
|
@ -35,6 +35,8 @@ class SpotifyTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.metadata["title"], "The Race For Space")
|
self.assertEqual(site.resource.metadata["title"], "The Race For Space")
|
||||||
self.assertIsInstance(site.resource.item, Album)
|
self.assertIsInstance(site.resource.item, Album)
|
||||||
self.assertEqual(site.resource.item.barcode, "3610159662676")
|
self.assertEqual(site.resource.item.barcode, "3610159662676")
|
||||||
|
self.assertEqual(site.resource.item.genre, [])
|
||||||
|
self.assertEqual(site.resource.item.other_title, [])
|
||||||
|
|
||||||
|
|
||||||
class DoubanMusicTestCase(TestCase):
|
class DoubanMusicTestCase(TestCase):
|
||||||
|
@ -51,14 +53,16 @@ class DoubanMusicTestCase(TestCase):
|
||||||
|
|
||||||
@use_local_response
|
@use_local_response
|
||||||
def test_scrape(self):
|
def test_scrape(self):
|
||||||
t_url = "https://music.douban.com/subject/33551231/"
|
t_url = "https://music.douban.com/subject/1401362/"
|
||||||
site = SiteManager.get_site_by_url(t_url)
|
site = SiteManager.get_site_by_url(t_url)
|
||||||
self.assertEqual(site.ready, False)
|
self.assertEqual(site.ready, False)
|
||||||
site.get_resource_ready()
|
site.get_resource_ready()
|
||||||
self.assertEqual(site.ready, True)
|
self.assertEqual(site.ready, True)
|
||||||
self.assertEqual(site.resource.metadata["title"], "The Race For Space")
|
self.assertEqual(site.resource.metadata["title"], "Rubber Soul")
|
||||||
self.assertIsInstance(site.resource.item, Album)
|
self.assertIsInstance(site.resource.item, Album)
|
||||||
self.assertEqual(site.resource.item.barcode, "3610159662676")
|
self.assertEqual(site.resource.item.barcode, "0077774644020")
|
||||||
|
self.assertEqual(site.resource.item.genre, ["摇滚"])
|
||||||
|
self.assertEqual(site.resource.item.other_title, ["橡胶灵魂"])
|
||||||
|
|
||||||
|
|
||||||
class MultiMusicSitesTestCase(TestCase):
|
class MultiMusicSitesTestCase(TestCase):
|
||||||
|
@ -102,6 +106,8 @@ class BandcampTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.metadata["title"], "In These Times")
|
self.assertEqual(site.resource.metadata["title"], "In These Times")
|
||||||
self.assertEqual(site.resource.metadata["artist"], ["Makaya McCraven"])
|
self.assertEqual(site.resource.metadata["artist"], ["Makaya McCraven"])
|
||||||
self.assertIsInstance(site.resource.item, Album)
|
self.assertIsInstance(site.resource.item, Album)
|
||||||
|
self.assertEqual(site.resource.item.genre, [])
|
||||||
|
self.assertEqual(site.resource.item.other_title, [])
|
||||||
|
|
||||||
|
|
||||||
class DiscogsReleaseTestCase(TestCase):
|
class DiscogsReleaseTestCase(TestCase):
|
||||||
|
@ -130,6 +136,8 @@ class DiscogsReleaseTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.metadata["artist"], ["J.I.D"])
|
self.assertEqual(site.resource.metadata["artist"], ["J.I.D"])
|
||||||
self.assertIsInstance(site.resource.item, Album)
|
self.assertIsInstance(site.resource.item, Album)
|
||||||
self.assertEqual(site.resource.item.barcode, "0602445804689")
|
self.assertEqual(site.resource.item.barcode, "0602445804689")
|
||||||
|
self.assertEqual(site.resource.item.genre, ["Hip Hop"])
|
||||||
|
self.assertEqual(site.resource.item.other_title, [])
|
||||||
|
|
||||||
|
|
||||||
class DiscogsMasterTestCase(TestCase):
|
class DiscogsMasterTestCase(TestCase):
|
||||||
|
@ -155,3 +163,5 @@ class DiscogsMasterTestCase(TestCase):
|
||||||
self.assertEqual(site.resource.metadata["title"], "Coexist")
|
self.assertEqual(site.resource.metadata["title"], "Coexist")
|
||||||
self.assertEqual(site.resource.metadata["artist"], ["The XX"])
|
self.assertEqual(site.resource.metadata["artist"], ["The XX"])
|
||||||
self.assertIsInstance(site.resource.item, Album)
|
self.assertIsInstance(site.resource.item, Album)
|
||||||
|
self.assertEqual(site.resource.item.genre, ["Electronic", "Rock", "Pop"])
|
||||||
|
self.assertEqual(site.resource.item.other_title, [])
|
||||||
|
|
|
@ -10,7 +10,7 @@ class Performance(Item):
|
||||||
douban_drama = LookupIdDescriptor(IdType.DoubanDrama)
|
douban_drama = LookupIdDescriptor(IdType.DoubanDrama)
|
||||||
other_title = jsondata.ArrayField(
|
other_title = jsondata.ArrayField(
|
||||||
verbose_name=_("其它标题"),
|
verbose_name=_("其它标题"),
|
||||||
base_field=models.CharField(),
|
base_field=models.CharField(blank=True, default="", max_length=200),
|
||||||
null=False,
|
null=False,
|
||||||
blank=False,
|
blank=False,
|
||||||
default=list,
|
default=list,
|
||||||
|
|
|
@ -30,7 +30,7 @@ class DiscogsRelease(AbstractSite):
|
||||||
release = get_discogs_data("releases", self.id_value)
|
release = get_discogs_data("releases", self.id_value)
|
||||||
title = release.get("title")
|
title = release.get("title")
|
||||||
artist = [artist.get("name") for artist in release.get("artists")]
|
artist = [artist.get("name") for artist in release.get("artists")]
|
||||||
genre = release.get("genres")
|
genre = release.get("genres", [])
|
||||||
track_list = [track.get("title") for track in release.get("tracklist")]
|
track_list = [track.get("title") for track in release.get("tracklist")]
|
||||||
company = list(
|
company = list(
|
||||||
set([company.get("name") for company in release.get("companies")])
|
set([company.get("name") for company in release.get("companies")])
|
||||||
|
@ -96,7 +96,7 @@ class DiscogsMaster(AbstractSite):
|
||||||
master_release = get_discogs_data("masters", self.id_value)
|
master_release = get_discogs_data("masters", self.id_value)
|
||||||
title = master_release.get("title")
|
title = master_release.get("title")
|
||||||
artist = [artist.get("name") for artist in master_release.get("artists")]
|
artist = [artist.get("name") for artist in master_release.get("artists")]
|
||||||
genre = master_release.get("genres")
|
genre = master_release.get("genres", [])
|
||||||
track_list = [track.get("title") for track in master_release.get("tracklist")]
|
track_list = [track.get("title") for track in master_release.get("tracklist")]
|
||||||
|
|
||||||
image_url = None
|
image_url = None
|
||||||
|
|
|
@ -42,7 +42,7 @@ class DoubanMusic(AbstractSite):
|
||||||
genre_elem = content.xpath(
|
genre_elem = content.xpath(
|
||||||
"//div[@id='info']//span[text()='流派:']/following::text()[1]"
|
"//div[@id='info']//span[text()='流派:']/following::text()[1]"
|
||||||
)
|
)
|
||||||
genre = genre_elem[0].strip() if genre_elem else None
|
genre = genre_elem[0].strip().split(" / ") if genre_elem else []
|
||||||
|
|
||||||
date_elem = content.xpath(
|
date_elem = content.xpath(
|
||||||
"//div[@id='info']//span[text()='发行时间:']/following::text()[1]"
|
"//div[@id='info']//span[text()='发行时间:']/following::text()[1]"
|
||||||
|
@ -95,7 +95,7 @@ class DoubanMusic(AbstractSite):
|
||||||
"//div[@id='info']//span[text()='又名:']/following-sibling::text()[1]"
|
"//div[@id='info']//span[text()='又名:']/following-sibling::text()[1]"
|
||||||
)
|
)
|
||||||
if other_elem:
|
if other_elem:
|
||||||
data["other_title"] = other_elem[0].strip()
|
data["other_title"] = other_elem[0].strip().split(" / ")
|
||||||
other_elem = content.xpath(
|
other_elem = content.xpath(
|
||||||
"//div[@id='info']//span[text()='专辑类型:']/following-sibling::text()[1]"
|
"//div[@id='info']//span[text()='专辑类型:']/following-sibling::text()[1]"
|
||||||
)
|
)
|
||||||
|
|
|
@ -42,7 +42,7 @@ class Spotify(AbstractSite):
|
||||||
|
|
||||||
title = res_data["name"]
|
title = res_data["name"]
|
||||||
|
|
||||||
genre = ", ".join(res_data["genres"])
|
genre = res_data.get("genres", [])
|
||||||
|
|
||||||
company = []
|
company = []
|
||||||
for com in res_data["copyrights"]:
|
for com in res_data["copyrights"]:
|
||||||
|
|
|
@ -131,7 +131,7 @@ class TMDB_Movie(AbstractSite):
|
||||||
metadata={
|
metadata={
|
||||||
"title": title,
|
"title": title,
|
||||||
"orig_title": orig_title,
|
"orig_title": orig_title,
|
||||||
"other_title": None,
|
"other_title": [],
|
||||||
"imdb_code": imdb_code,
|
"imdb_code": imdb_code,
|
||||||
"director": director,
|
"director": director,
|
||||||
"playwright": playwright,
|
"playwright": playwright,
|
||||||
|
@ -278,7 +278,7 @@ class TMDB_TV(AbstractSite):
|
||||||
metadata={
|
metadata={
|
||||||
"title": title,
|
"title": title,
|
||||||
"orig_title": orig_title,
|
"orig_title": orig_title,
|
||||||
"other_title": None,
|
"other_title": [],
|
||||||
"imdb_code": imdb_code,
|
"imdb_code": imdb_code,
|
||||||
"director": director,
|
"director": director,
|
||||||
"playwright": playwright,
|
"playwright": playwright,
|
||||||
|
|
|
@ -80,7 +80,7 @@
|
||||||
{% if related_books.count > 0 %}
|
{% if related_books.count > 0 %}
|
||||||
<div class="aside-section-wrapper">
|
<div class="aside-section-wrapper">
|
||||||
<div class="action-panel">
|
<div class="action-panel">
|
||||||
<div class="action-panel__label">{% trans '其他版本' %}</div>
|
<div class="action-panel__label">{% trans '其它版本' %}</div>
|
||||||
<div >
|
<div >
|
||||||
{% for b in related_books %}
|
{% for b in related_books %}
|
||||||
<p>
|
<p>
|
||||||
|
|
|
@ -33,7 +33,7 @@ from django.utils.translation import gettext_lazy as _
|
||||||
class TVShowInSchema(ItemInSchema):
|
class TVShowInSchema(ItemInSchema):
|
||||||
season_count: int | None = None
|
season_count: int | None = None
|
||||||
orig_title: str | None = None
|
orig_title: str | None = None
|
||||||
other_title: str | None = None
|
other_title: list[str]
|
||||||
director: list[str]
|
director: list[str]
|
||||||
playwright: list[str]
|
playwright: list[str]
|
||||||
actor: list[str]
|
actor: list[str]
|
||||||
|
@ -54,7 +54,7 @@ class TVShowSchema(TVShowInSchema, BaseSchema):
|
||||||
class TVSeasonInSchema(ItemInSchema):
|
class TVSeasonInSchema(ItemInSchema):
|
||||||
season_number: int | None = None
|
season_number: int | None = None
|
||||||
orig_title: str | None = None
|
orig_title: str | None = None
|
||||||
other_title: str | None = None
|
other_title: list[str]
|
||||||
director: list[str]
|
director: list[str]
|
||||||
playwright: list[str]
|
playwright: list[str]
|
||||||
actor: list[str]
|
actor: list[str]
|
||||||
|
@ -105,8 +105,12 @@ class TVShow(Item):
|
||||||
orig_title = jsondata.CharField(
|
orig_title = jsondata.CharField(
|
||||||
verbose_name=_("原始标题"), blank=True, default="", max_length=500
|
verbose_name=_("原始标题"), blank=True, default="", max_length=500
|
||||||
)
|
)
|
||||||
other_title = jsondata.CharField(
|
other_title = jsondata.ArrayField(
|
||||||
verbose_name=_("其他标题"), blank=True, default="", max_length=500
|
base_field=models.CharField(blank=True, default="", max_length=500),
|
||||||
|
verbose_name=_("其它标题"),
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
default=list,
|
||||||
)
|
)
|
||||||
director = jsondata.ArrayField(
|
director = jsondata.ArrayField(
|
||||||
verbose_name=_("导演"),
|
verbose_name=_("导演"),
|
||||||
|
@ -229,7 +233,7 @@ class TVSeason(Item):
|
||||||
verbose_name=_("原始标题"), blank=True, default="", max_length=500
|
verbose_name=_("原始标题"), blank=True, default="", max_length=500
|
||||||
)
|
)
|
||||||
other_title = jsondata.ArrayField(
|
other_title = jsondata.ArrayField(
|
||||||
verbose_name=_("其他标题"),
|
verbose_name=_("其它标题"),
|
||||||
base_field=models.CharField(blank=True, default="", max_length=500),
|
base_field=models.CharField(blank=True, default="", max_length=500),
|
||||||
null=True,
|
null=True,
|
||||||
blank=True,
|
blank=True,
|
||||||
|
|
|
@ -3,6 +3,18 @@ from catalog.common import *
|
||||||
from catalog.tv.models import *
|
from catalog.tv.models import *
|
||||||
|
|
||||||
|
|
||||||
|
class JSONFieldTestCase(TestCase):
|
||||||
|
def test_legacy_data(self):
|
||||||
|
o = TVShow()
|
||||||
|
self.assertEqual(o.other_title, [])
|
||||||
|
o.other_title = "test"
|
||||||
|
self.assertEqual(o.other_title, ["test"])
|
||||||
|
o.other_title = ["a", "b"]
|
||||||
|
self.assertEqual(o.other_title, ["a", "b"])
|
||||||
|
o.other_title = None
|
||||||
|
self.assertEqual(o.other_title, None)
|
||||||
|
|
||||||
|
|
||||||
class TMDBTVTestCase(TestCase):
|
class TMDBTVTestCase(TestCase):
|
||||||
def test_parse(self):
|
def test_parse(self):
|
||||||
t_id = "57243"
|
t_id = "57243"
|
||||||
|
|
2274
test_data/https___music_douban_com_subject_1401362_
Normal file
2274
test_data/https___music_douban_com_subject_1401362_
Normal file
File diff suppressed because it is too large
Load diff
|
@ -23,7 +23,7 @@
|
||||||
{{ site_name }}还在不断完善中,丰富的内容需要大家共同创造。
|
{{ site_name }}还在不断完善中,丰富的内容需要大家共同创造。
|
||||||
试图添加垃圾数据(如添加信息混乱或缺失的书籍、以推广为主要目的的评论)将会受到严肃处理。
|
试图添加垃圾数据(如添加信息混乱或缺失的书籍、以推广为主要目的的评论)将会受到严肃处理。
|
||||||
{{ site_name }}继承了联邦宇宙的用户关系,比如您在联邦宇宙屏蔽了某人,那您将不会在书影音的公共区域看到TA的痕迹。
|
{{ site_name }}继承了联邦宇宙的用户关系,比如您在联邦宇宙屏蔽了某人,那您将不会在书影音的公共区域看到TA的痕迹。
|
||||||
本站为非盈利站点,cookie和其他数据保管使用原则请参阅<a href="/announcement/data-policy/">站内公告</a>。
|
本站为非盈利站点,cookie和其它数据保管使用原则请参阅<a href="/announcement/data-policy/">站内公告</a>。
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
此外,{{ site_name }}现处于测试阶段,疏漏在所难免,请妥善备份您的数据。
|
此外,{{ site_name }}现处于测试阶段,疏漏在所难免,请妥善备份您的数据。
|
||||||
|
@ -38,4 +38,4 @@
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Add table
Reference in a new issue