关系经济人类预测化学自然
中准网
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

从0到1开发自动化运维平台Kubernetes集群和应用管理

3月7日 夜未央投稿
  今天还是一些CRUD操作,继续分享k8s集群和应用的管理。Kubernetes和应用模型classKubernetesCluster(TimeAbstract):K8s集群配置namemodels。CharField(maxlength100,uniqueTrue,verbosename集群名称)versionmodels。JSONField(defaultdict,verbosename版本,helptext{core:1。14,apiversion:appsv1}core:集群版本apiversion:API版本)descmodels。TextField(nullTrue,blankTrue,verbosename集群描述)configmodels。JSONField(defaultdict,verbosename集群配置)environmentmodels。ManyToManyField(Environment,relatednameenvk8s,blankTrue,verbosename环境)productmodels。ManyToManyField(Product,relatednameproductk8s,blankTrue,verbosename产品)idcmodels。ForeignKey(Idc,blankTrue,nullTrue,ondeletemodels。PROTECT,verbosenameIDC)defstr(self):returnself。nameclassExtMeta:relatedTruedashboardTrueiconk8sclassMeta:defaultpermissions()ordering〔id〕verbosenameK8s集群verbosenamepluralverbosename管理defgetdefaultvalue():return{key:default,value:default}应用部署方式GDEPLOYTYPE((nonk8s,非Kubernetes部署),(docker,Docker部署),(k8s,Kubernetes部署))GONLINECHOICE((0,未上线),(1,已上线),(2,部署中),(3,部署异常),(9,已申请上线))classMicroApp(TimeAbstract):product。project。microappappidmodels。CharField(maxlength250,dbindexTrue,uniqueTrue,verbosename应用ID,helptext应用唯一标识,无需填写)namemodels。CharField(maxlength128,verbosename应用)aliasmodels。CharField(maxlength128,blankTrue,verbosename别名)projectmodels。ForeignKey(Project,ondeletemodels。PROTECT,nullTrue,blankTrue,verbosename项目)creatormodels。ForeignKey(User,ondeletemodels。PROTECT,nullTrue,blankTrue,verbosename创建者,helptext前端不需要传递)repomodels。JSONField(defaultdict,verbosename仓库地址,helptext{name:name,description:,pathwithnamespace:,httpurltorepo:url})targetmodels。JSONField(defaultgetdefaultvalue,verbosenameJAR包配置,helptext默认:default,{default:default,custom:xxxa。war})extramembersmodels。JSONField(defaultgetdefaultextramembers,verbosename额外成员组,helptext{name:自定义成员组1,members:〔1,2,3〕})categorymodels。CharField(maxlength128,blankTrue,nullTrue,verbosename应用分类)templatemodels。JSONField(defaultdict,verbosenameK8sDeployment模板,helptextKubernetesDeployment部署模板配置)languagemodels。CharField(maxlength32,defaultjava,verbosename开发语言)multipleappmodels。BooleanField(defaultFalse,blankTrue,verbosename多应用标志)multipleidsmodels。JSONField(defaultlist,verbosename多应用关联ID列表)dockerfilemodels。JSONField(defaultgetdefaultvalue,verbosenameDockerfile配置,helptext默认:{default:null},可选:{default默认:null,project使用项目Dockerfile:project,custom自定义Dockerfile:})onlinemodels。BooleanField(defaultTrue,blankTrue,verbosename上线下线,helptext应用上线下线状态标记,下线状态的应用禁止发布。)descmodels。TextField(verbosename描述,nullTrue,blankTrue)notifymodels。JSONField(defaultdict,verbosename消息通知)caneditmodels。JSONField(defaultlist,verbosename管理人员,helptext有权限编辑该应用的人员ID格式为数组,如〔1,2〕)isk8smodels。CharField(maxlength8,defaultk8s,choicesGDEPLOYTYPE,verbosename部署方式,helptextf默认k8s,可选:{dict(GDEPLOYTYPE)})modulesmodels。JSONField(defaultlist,verbosename工程模块)defstr(self):return〔s〕s(self。name,self。alias)classExtMeta:relatedTruedashboardTrueiconcomponentclassMeta:defaultpermissions()ordering〔createdtime〕verbosename应用verbosenamepluralverbosename管理classAppInfo(TimeAbstract):uniqtag:product。project。microapp。envuniqtagmodels。CharField(maxlength128,uniqueTrue,verbosename唯一标识,helptext前端留空,无需传值)appmodels。ForeignKey(MicroApp,blankTrue,nullTrue,ondeletemodels。PROTECT,verbosename应用)environmentmodels。ForeignKey(Environment,ondeletemodels。PROTECT,nullTrue,verbosename环境)branchmodels。CharField(maxlength64,blankTrue,nullTrue,verbosename默认构建分支)allowcibranchmodels。JSONField(defaultlist,verbosename允许构建的分支,helptext存储数组格式,具体的分支名;默认〔〕,表示允许所有分支。)allowcdbranchmodels。JSONField(defaultlist,verbosename允许发布的分支,helptext存储数组格式,具体的分支名;默认〔〕,表示允许所有分支。)buildcommandmodels。CharField(maxlength250,blankTrue,nullTrue,verbosename构建命令,helptext根据应用开发语言,从getKey(LANGUAGE)获取数据,取出extra字段的build值)kubernetesmodels。ManyToManyField(KubernetesCluster,relatednamek8sapp,throughKubernetesDeploy,verbosenameK8s集群)hostsmodels。JSONField(defaultlist,verbosename部署主机,helptext部署主机,格式:〔〕)templatemodels。JSONField(defaultdict,verbosenameK8sDeployment模板,helptext继承自当前应用的template字段,数据格式为对象字段说明:type:01,0表示继承应用模板,template为空字典;1表示自定义模板示例:{type:0,template:{}}){0:禁用,1:启用}isenablemodels。SmallIntegerField(default1,verbosename启用,helptext状态{0:禁用,1:启用},默认值为1)descmodels。TextField(verbosename描述,nullTrue,blankTrue)caneditmodels。JSONField(defaultlist,verbosename管理人员,helptext有权限编辑该应用的人员ID格式为数组,如〔1,2〕)onlinemodels。SmallIntegerField(default0,choicesGONLINECHOICE,verbosename是否上线,helptextf默认为0,即未上线可选项:{GONLINECHOICE})defstr(self):returnself。uniqtagpropertydefnamespace(self):returnf{self。environment。name。replace(,)}{self。app。project。name。replace(,)}。lower()propertydefjenkinsjobname(self):try:jobnamef{self。environment。name}{self。app。category。split(。)〔1〕}{self。app。project。name}{self。app。name。split(。)〔1〕}。lower()exceptAppInfo。DoesNotExist:jobnamereturnjobnameclassExtMeta:relatedTruedashboardTrueclassMeta:defaultpermissions()ordering〔updatetime,id〕verbosename应用模块verbosenamepluralverbosename管理classKubernetesDeploy(TimeAbstract):appinfomodels。ForeignKey(AppInfo,relatednameappinfo,nullTrue,ondeletemodels。CASCADE)kubernetesmodels。ForeignKey(KubernetesCluster,relatednameappk8s,nullTrue,ondeletemodels。CASCADE)onlinemodels。SmallIntegerField(default0,choicesGONLINECHOICE,verbosename是否上线,helptextf默认为0,即未上线可选项:{GONLINECHOICE})versionmodels。CharField(maxlength250,blankTrue,nullTrue,verbosename当前版本)defstr(self):returnss(self。appinfo。app。appid,self。kubernetes。name)classMeta:defaultpermissions()classDataDict(CommonParent):keymodels。CharField(maxlength80,uniqueTrue,verbosename键)valuemodels。CharField(maxlength80,verbosename值)extramodels。TextField(nullTrue,blankTrue,default,verbosename额外参数)descmodels。CharField(maxlength255,blankTrue,nullTrue,verbosename备注)defstr(self):returnself。valueclassMeta:defaultpermissions()verbosename字典verbosenamepluralverbosename管理编写序列化器importjsonfromtypingimportListfromrestframeworkimportserializersfromdjango。dbimporttransactionfromdjango。contrib。auth。modelsimportUserfromcmdb。modelsimportProduct,Project,Environment,KubernetesCluster,MicroApp,AppInfo,KubernetesDeployclassKubernetesClusterListSerializers(serializers。ModelSerializer):configserializers。SerializerMethodField()defgetconfig(self,instance):returnjson。loads(instance。config)classMeta:modelKubernetesClusterfieldsallclassKubernetesClusterSerializers(serializers。ModelSerializer):classMeta:modelKubernetesClusterfieldsallclassMicroAppListSerializers(serializers。ModelSerializer):projectinfoserializers。SerializerMethodField()appinfoserializers。SerializerMethodField()creatorinfoserializers。SerializerMethodField()extrateaminfoserializers。SerializerMethodField()defgetprojectinfo(self,instance):projectinstance。projectreturn{project:{id:project。id,alias:project。alias},product:{id:project。product。id,alias:project。product。alias}}defgetappinfo(self,instance):return〔{id:i。id,envalias:i。environment。alias,env:{name:i。environment。name,id:i。environment。id},online:i。online}foriininstance。appinfoset。all()〕defgetcreatorinfo(self,instance):try:return{id:instance。creator。id,firstname:instance。creator。firstname,username:instance。creator。username}exceptBaseExceptionase:return{id:,firstname:,username:}defgetextrateaminfo(self,instance):data{}fork,vininstance。extramembers。items():data〔k〕〔{id:i。id,name:i。name,firstname:i。firstname,username:i。username}foriinUser。objects。filter(idinv)〕returndataclassMeta:modelMicroAppfieldsallclassMicroAppSerializers(serializers。ModelSerializer):classMeta:modelMicroAppfieldsallreadonlyfields(appid,)staticmethoddefperformextendsave(validateddata):defdefaultvalue(fields:List):forfieldinfields:ifvalidateddata。get(field):ifvalidateddata〔field〕。get(key)!custom:validateddata〔field〕〔value〕validateddata〔field〕〔key〕returnvalidateddatavalidateddatadefaultvalue(〔dockerfile,target〕)validateddata〔appid〕f{validateddata〔project〕。product。name}。{validateddata〔project〕。name}。{validateddata〔name〕}returnvalidateddatadefcreate(self,validateddata):instanceMicroApp。objects。create(canedit〔validateddata〔creator〕。id〕,self。performextendsave(validateddata))returninstancedefupdate(self,instance,validateddata):returnsuper()。update(instance,self。performextendsave(validateddata))classAppInfoListSerializers(serializers。ModelSerializer):appMicroAppSerializers()kubernetesinfoserializers。SerializerMethodField()defgetkubernetesinfo(self,instance):serializerKubernetesDeploySerializers(dataKubernetesDeploy。objects。filter(appinfoinstance。id),manyTrue)serializer。isvalid()returnserializer。dataclassMeta:modelAppInfofieldsallclassAppInfoSerializers(serializers。ModelSerializer):classMeta:modelAppInfofieldsalldefperformextendsave(self,validateddata,args,kwargs):ifvalidateddata。get(app,None)andvalidateddata。get(environment,None):validateddata〔uniqtag〕f{validateddata〔app〕。appid}。{validateddata〔environment〕。name。split()〔1〕。lower()}ifkwargs。get(instance,None):kubernetesself。initialdata。get(kubernetes)bulk〔〕forkidinkubernetes:ksKubernetesCluster。objects。get(idkid)bulk。append(KubernetesDeploy(appinfokwargs〔instance〕,kubernetesks))KubernetesDeploy。objects。bulkcreate(bulk,ignoreconflictsTrue)returnvalidateddatatransaction。atomicdefcreate(self,validateddata):instanceAppInfo。objects。create(self。performextendsave(validateddata))ifkubernetesinself。initialdata:self。performextendsave(validateddata,{instance:instance})returninstancetransaction。atomicdefupdate(self,instance,validateddata):KubernetesDeploy。objects。filter(appinfoinstance)。delete()instance。dict。update(self。performextendsave(validateddata,{instance:instance}))instance。save()returninstance编写视图fromrestframework。responseimportResponsefromrestframework。decoratorsimportactionfromdjango。dbimporttransactionfromcmdb。modelsimportProduct,Project,Environment,KubernetesCluster,MicroApp,AppInfofromcmdb。serializersimportAppInfoListSerializers,AppInfoSerializers,KubernetesClusterListSerializers,KubernetesClusterSerializers,MicroAppListSerializers,MicroAppSerializersfromcommon。extends。decoratorsimportcmdbappuniquecheckclassKubernetesClusterViewSet(viewsets。ModelViewSet):Kubernetes集群视图Kubernetes集群权限{:(k8sclusterall,k8s集群管理)},{get:(k8sclusterlist,查看k8s集群)},{post:(k8sclustercreate,创建k8s集群)},{put:(k8sclusteredit,编辑k8s集群)},{patch:(k8sclusteredit,编辑k8s集群)},{delete:(k8sclusterdelete,删除k8s集群)}permsmap({:(admin,管理员)},{:(k8sclusterall,k8s集群管理)},{get:(k8sclusterlist,查看k8s集群)},{post:(k8sclustercreate,创建k8s集群)},{put:(k8sclusteredit,编辑k8s集群)},{patch:(k8sclusteredit,编辑k8s集群)},{delete:(k8sclusterdelete,删除k8s集群)})querysetKubernetesCluster。objects。all()serializerclassKubernetesClusterSerializersdefgetserializerclass(self):ifself。actionin〔list,retrieve〕:returnKubernetesClusterListSerializersreturnKubernetesClusterSerializersclassMicroAppViewSet(viewsets。ModelViewSet):项目应用视图项目应用权限{:(microappall,应用管理)},{get:(microapplist,查看应用)},{post:(microappcreate,创建应用)},{put:(microappedit,编辑应用)},{patch:(microappedit,编辑应用)},{delete:(microappdelete,删除应用)}permsmap({:(admin,管理员)},{:(microappall,应用管理)},{get:(microapplist,查看应用)},{post:(microappcreate,创建应用)},{put:(microappedit,编辑应用)},{patch:(microappedit,编辑应用)},{delete:(microappdelete,删除应用)})querysetMicroApp。objects。all()serializerclassMicroAppSerializersdefgetserializerclass(self):ifself。actionin〔list,retrieve〕:returnMicroAppListSerializersreturnMicroAppSerializerscmdbappuniquecheck()defcreate(self,request,args,kwargs):创建应用提交参数创建:{}try:request。data〔name〕request。data〔name〕。strip()。replace(,)exceptBaseExceptionase:logger。error(exception,str(e))serializerself。getserializer(datarequest。data)ifnotserializer。isvalid():returnResponse({code:40000,status:failed,message:serializer。errors})try:self。performcreate(serializer)exceptBaseExceptionase:logger。error(e)returnResponse({code:50000,status:failed,message:str(e)})data{data:serializer。data,status:success,code:20000}returnResponse(data)transaction。atomicdefperformcreate(self,serializer):serializer。save(creatorself。request。user)action(methods〔POST〕,urlpathrelated,detailFalse)defapprelated(self,request):应用关联传递参数:ids:待关联应用id数组target:目标应用idtry:targetrequest。data。get(target,None)idsrequest。data。get(ids,None)iftarget:instanceself。queryset。get(idtarget)ids。extend(instance。multipleids)self。queryset。filter(idinlist(set(ids)))。update(multipleappTrue,multipleidslist(set(ids)))returnResponse({code:20000,data:应用关联成功。})exceptBaseExceptionase:logger。error(err,e)returnResponse({code:50000,data:关联应用异常,请联系管理员!})action(methods〔POST〕,urlpathunrelated,detailFalse)defappunrelated(self,request):取消应用关联传递参数:id:应用idtry:instanceself。queryset。filter(idrequest。data。get(id))获取关联应用ID列表idsinstance〔0〕。multipleidsids。remove(instance〔0〕。id)iflen(ids)1:如果关联应用只剩下一个,则一起取消关联self。queryset。filter(idininstance〔0〕。multipleids)。update(multipleappFalse,multipleids〔〕)else:更新其它应用的关联应用IDself。queryset。filter(idinids)。update(multipleidsids)取消当前实例应用关联instance。update(multipleappFalse,multipleids〔〕)returnResponse({code:20000,data:应用取消关联成功。})exceptBaseExceptionase:returnResponse({code:50000,data:关联应用异常,请联系管理员!})classAppInfoViewSet(viewsets。ModelViewSet):项目应用服务服务对应着应用的不同环境,即应用每个环境创建一个对应的服务项目应用服务权限{:(microappall,应用管理)},{get:(microapplist,查看应用)},{post:(microappcreate,创建应用)},{put:(microappedit,编辑应用)},{patch:(microappedit,编辑应用)},{delete:(microappdelete,删除应用)}permsmap({:(admin,管理员)},{:(microappall,应用管理)},{get:(microapplist,查看应用)},{post:(microappcreate,创建应用)},{put:(microappedit,编辑应用)},{patch:(microappedit,编辑应用)},{delete:(microappdelete,删除应用)})querysetAppInfo。objects。all()serializerclassAppInfoSerializersdefgetserializerclass(self):ifself。actionin〔list,retrieve〕:returnAppInfoListSerializersreturnAppInfoSerializersdefcreate(self,request,args,kwargs):request。data〔uniqtag〕defaultserializerself。getserializer(datarequest。data)serializer。isvalid(raiseexceptionTrue)self。performcreate(serializer)dataserializer。datadata{code:20000,status:200,data:data}returnResponse(data)添加装饰器
  细心的朋友应该可以发现,在视图里文件里导入一个自己编写的装饰器
  fromcommon。extends。decoratorsimportcmdbappuniquecheck
  我们先在项目根下创建common目录(venv)ydevopsbackendmkdirpcommonextends(venv)ydevopsbackendtouchcommonextendsdecorators。py
  然后编写装饰器cmdbappuniquecheckfromfunctoolsimportwrapsfromrestframework。responseimportResponsefromcmdb。modelsimportMicroAppdefcmdbappuniquecheck():应用唯一性检查appid:{product。name}。{app。name}defcheckapp(product,name):try:ifMicroApp。objects。filter(projectproductidproduct,namename)。exists():存在应用returnTrueexceptBaseExceptionase:passreturnFalsedefdecorator(func):wraps(func)defwrapper(self,request,args,kwargs):ifcheckapp(request。data〔product〕,request。data〔name〕):returnResponse({code:50000,message:f该产品下已存在〔{request。data〔name〕}〕同名应用。})returnfunc(self,request,args,kwargs)returnwrapperreturndecorator添加路由fromdjango。contribimportadminfromdjango。urlsimportpath,includefromcmdb。view。viewcmdbimportAppInfoViewSet,KubernetesClusterViewSet,MicroAppViewSetfromrestframework。routersimportDefaultRouterfromcmdb。viewsimportRegionViewSet,IdcViewSet,ProductViewSet,ProjectViewSet,EnvironmentViewSetrouterDefaultRouter()router。register(region,RegionViewSet)router。register(assetidc,IdcViewSet)router。register(product,ProductViewSet)router。register(project,ProjectViewSet)router。register(environment,EnvironmentViewSet)router。register(appservice,AppInfoViewSet)router。register(app,MicroAppViewSet)router。register(kubernetes,KubernetesClusterViewSet)urlpatterns〔path(admin,admin。site。urls),path(api,include(router。urls)),〕迁移数据表(venv)ydevopsbackendpythonmanage。pymakemigrationsMigrationsforcmdb:appscmdbmigrations0003appinfokubernetesclustermicroappkubernetesdeployandmore。pyCreatemodelAppInfoCreatemodelKubernetesClusterCreatemodelMicroAppCreatemodelKubernetesDeployAddfieldapptoappinfoAddfieldenvironmenttoappinfoAddfieldkubernetestoappinfo(venv)ydevopsbackendpythonmanage。pymakemigrationsMigrationsforcmdb:appscmdbmigrations0004datadict。pyCreatemodelDataDict(venv)ydevopsbackendpythonmanage。pymigrateOperationstoperform:Applyallmigrations:admin,auth,cmdb,contenttypes,sessionsRunningmigrations:Applyingcmdb。0003appinfokubernetesclustermicroappkubernetesdeployandmore。。。OKApplyingcmdb。0004datadict。。。OK运行项目(venv)ydevopsbackendpythonmanage。pyrunserver0。0。0。0:9000WatchingforfilechangeswithStatReloaderPerformingsystemchecks。。。Systemcheckidentifiednoissues(0silenced)。March23,202322:13:47Djangoversion4。1。7,usingsettingsdevopsbackend。settingsStartingdevelopmentserverathttp:0。0。0。0:9000QuittheserverwithCONTROLC。
  打开浏览器访问http:localhost:9000api就可以看到目前已完成的接口了
投诉 评论 转载

30年前被称断货王的3种酒,现在却很少见,喝过的人都老了时光往回追溯,到30年前,也就是上世纪的八九十年代,在那个车马邮件都慢的时代,不仅娱乐设施非常的简单,就连购物也非常的不便捷,大部分都是凭各种票在供销社里买东西。供销社里……中成药柴胡舒肝丸,不光疏肝解郁,还能摆平5种病,学会就是你的大家好,我是李医生,我们知道柴胡舒肝丸,它主要有疏肝解郁的作用,是用于肝气不舒的常用中成药,但是仍有很多人并不知道自己哪些情况是可以参考柴胡舒肝丸来改善?那关于这个问题,今天李……美股开盘道指涨近250点第一公民银行接盘硅谷银行大涨50金融界3月27日消息,投资者关注企业财报及经济数据,同时在多日银行业阴霾后第一公民银行宣布正式接手硅谷银行为全球市场送来救命稻草,地方性银行股强势反弹,美股延续上周趋势全线高开……直播吧在现场丨吴冠希最后4场都很重要要拿出必胜的心态去打直播吧3月26日讯江苏球员吴冠希今天接受了直播吧的专访。当谈到最后的四个对手(吉林、四川、福建、北京),吴冠希认为:这四场球对我们都非常重要,我们要以必胜的心态去打。应该……沂起乘上电商的翅膀,足不出户即可买到全球货!从买全国,卖全国到买全球,卖全球,创新本土智造,临沂进出口贸易的带动联动能力到底有多强?3月25日下午13:30,由临沂市商务局、中共兰山区委、兰山区人民政府主办,兰山区商务局……聪明人放弃苹果14买iPhone13Pro?真的就是14升级不大,13才是首选吗?入手苹果13pro后,体验后的优缺点这里都说给你你听。先说优点!【优点】系统动画丝滑流畅录像非常顶手机壳好买,又多……30岁赛琳娜穿婚纱!身材丰腴,脸显大,体型胖了一圈,让人唏嘘当地时间3月22日,赛琳娜戈麦斯拍摄的新剧《OnlyMurdersintheBuilding》第三季现场照曝光,一组最新造型路透公之于众,超大裙摆的蕾丝婚纱,加上很梦幻的蕾丝头……四川饮酒怪象高端五粮液,低端丰谷酒,但更多人偏爱这3款四川是继贵州以后的另一个酿酒大省,细看川酒的发展历程,3000多年的酿酒史,底蕴非常的深厚,据数据统计,早在上世纪八十年代,川酒的整体销量便在全国排名前三。川酒之所以受欢……天王补心丹与柴胡舒肝散加减可用于心肝气郁型遗精天王补心丹与柴胡舒肝散裁化方:药用党参、郁金、酸枣仁、川芎、白芍、茯苓、五味子、黄连、当归、丹参、木香、柴胡、山茱萸、车前子、朱砂(冲服)。水煎服。此方可用于心肝气郁型遗精。……重磅发布2022第三章颠荡起伏下的CEX市场从破产到黑天鹅的图片来源视觉中国得得智库20222023全球加密货币市场年报:再出发是链得得旗下得得智库团队针对2022年全球加密货币市场进的综合分析与复盘。在本年报中,得得智库首……从0到1开发自动化运维平台Kubernetes集群和应用管理今天还是一些CRUD操作,继续分享k8s集群和应用的管理。Kubernetes和应用模型classKubernetesCluster(TimeAbstract):K8s集群配置……中国黄岩岛吹填成功或成战略支点黄岩岛位于中国南海的中沙群岛,是中沙群岛众多岛礁中唯一露出水面的岛礁。黄岩岛早在元代时期,由中国天文学家郭守敬所记录和勘测,自古以来就是中国的领土。这里拥有美丽的珊瑚礁以及丰富……
高龄剩女婚后面临生育关中职语文阅读教学的建议中药佳方治疗腰突散剂方有效率Qt开发QTQuick熬过人生的低谷期,才能够重生草原火灾会引起空气污染吗亚运趣谈老人血脂高吃什么汤好怀孕吃哪些中药安胎药好荷花百科硫辛酸能美白吗硫辛酸可以祛斑吗土豆焖鸡,口感软糯,孩子们爱吃,收藏了
高晓攀首挑公安题材无言之证无言鉴证开机引期待谯周简介三国时期蜀汉学者谯周怎么死的梁文博31小组称雄,中国名将完胜小司机,鲁宁略有遗憾贝壳如视VR亮相“双创周”,用技术推动居住升级哈登首次亮相76人替补席!76人用单场狂输48分,欢迎登哥的城市副中心服贸会设元宇宙专区,创意虚拟人苏小妹欢迎您夫妻结婚一年离婚财产规定是什么?玩手机被抓保证书范文3篇这路好难走风格与居住的幸福对话新妈妈们该如何清爽做好月子解开这个公式你将拥有无尽财富纯干货

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州