范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  今天还是一些CRUD操作,继续分享k8s集群和应用的管理。Kubernetes和应用模型class KubernetesCluster(TimeAbstract):     """     K8s集群配置     """     name = models.CharField(max_length=100, unique=True, verbose_name="集群名称")     version = models.JSONField(default=dict, verbose_name="版本",                                help_text="{"core": "1.14", "apiversion": "apps/v1"} core: 集群版本 apiversion: API版本")     desc = models.TextField(null=True, blank=True, verbose_name="集群描述")     config = models.JSONField(default=dict, verbose_name="集群配置")     environment = models.ManyToManyField(Environment, related_name="env_k8s", blank=True, verbose_name="环境")     product = models.ManyToManyField(Product, related_name="product_k8s", blank=True, verbose_name="产品")     idc = models.ForeignKey(Idc, blank=True, null=True, on_delete=models.PROTECT, verbose_name="IDC")      def __str__(self):         return self.name      class ExtMeta:         related = True         dashboard = True         icon = "k8s"      class Meta:         default_permissions = ()         ordering = ["-id"]         verbose_name = "K8s集群"         verbose_name_plural = verbose_name + "管理"   def get_default_value():     return {         "key": "default", "value": "default"     }   # 应用部署方式 G_DEPLOY_TYPE = (     ("nonk8s", "非Kubernetes部署"),     ("docker", "Docker部署"),     ("k8s", "Kubernetes部署") )   G_ONLINE_CHOICE = (     (0, "未上线"),     (1, "已上线"),     (2, "部署中"),     (3, "部署异常"),     (9, "已申请上线") )   class MicroApp(TimeAbstract):     # product.project.microapp     appid = models.CharField(max_length=250, db_index=True, unique=True, verbose_name="应用ID",                              help_text="应用唯一标识,无需填写")     name = models.CharField(max_length=128, verbose_name="应用")     alias = models.CharField(max_length=128, blank=True, verbose_name="别名")     project = models.ForeignKey(Project, on_delete=models.PROTECT, null=True, blank=True, verbose_name="项目")     creator = models.ForeignKey(User, on_delete=models.PROTECT, null=True, blank=True, verbose_name="创建者",                                 help_text="前端不需要传递")     repo = models.JSONField(default=dict, verbose_name="仓库地址",                             help_text="{"name": name, "description": "", "path_with_namespace": "", "http_url_to_repo": url}")     target = models.JSONField(default=get_default_value, verbose_name="JAR包配置",                               help_text="默认:default, {"default": "default", "custom": "xxx/a.war"}")     extra_members = models.JSONField(default=get_default_extra_members,                                      verbose_name="额外成员组", help_text="{"name": "自定义成员组1", members: [1,2,3]}")     category = models.CharField(max_length=128, blank=True, null=True, verbose_name="应用分类")     template = models.JSONField(default=dict, verbose_name="K8sDeployment模板",                                 help_text="Kubernetes Deployment部署模板配置")     language = models.CharField(max_length=32, default="java", verbose_name="开发语言")     multiple_app = models.BooleanField(default=False, blank=True, verbose_name="多应用标志")     multiple_ids = models.JSONField(default=list, verbose_name="多应用关联ID列表")     dockerfile = models.JSONField(default=get_default_value, verbose_name="Dockerfile配置",                                   help_text="默认:{default: null}, 可选: {"default|默认": null, "project|使用项目Dockerfile": "project", "custom|自定义Dockerfile": ""}")     online = models.BooleanField(default=True, blank=True, verbose_name="上线下线",                                  help_text="应用上线/下线状态标记, 下线状态的应用禁止发布.")     desc = models.TextField(verbose_name="描述", null=True, blank=True)     notify = models.JSONField(default=dict, verbose_name="消息通知")     can_edit = models.JSONField(default=list, verbose_name="管理人员",                                 help_text="有权限编辑该应用的人员ID 格式为数组, 如[1,2]")     is_k8s = models.CharField(max_length=8, default="k8s", choices=G_DEPLOY_TYPE, verbose_name="部署方式",                               help_text=f"默认k8s, 可选: {dict(G_DEPLOY_TYPE)}")     modules = models.JSONField(default=list, verbose_name="工程模块")      def __str__(self):         return "[%s]%s" % (self.name, self.alias)      class ExtMeta:         related = True         dashboard = True         icon = "component"      class Meta:         default_permissions = ()         ordering = ["-created_time"]         verbose_name = "应用"         verbose_name_plural = verbose_name + "管理"   class AppInfo(TimeAbstract):     # uniq_tag: product.project.microapp.env     uniq_tag = models.CharField(max_length=128, unique=True, verbose_name="唯一标识", help_text="前端留空,无需传值")     app = models.ForeignKey(MicroApp, blank=True, null=True, on_delete=models.PROTECT, verbose_name="应用")     environment = models.ForeignKey(Environment, on_delete=models.PROTECT, null=True, verbose_name="环境")     branch = models.CharField(max_length=64, blank=True, null=True, verbose_name="默认构建分支")     allow_ci_branch = models.JSONField(default=list, verbose_name="允许构建的分支",                                        help_text="存储数组格式,具体的分支名; 默认["*"], 表示允许所有分支.")     allow_cd_branch = models.JSONField(default=list, verbose_name="允许发布的分支",                                        help_text="存储数组格式,具体的分支名; 默认["*"], 表示允许所有分支.")     build_command = models.CharField(max_length=250, blank=True, null=True, verbose_name="构建命令",                                      help_text="根据应用开发语言, 从getKey("LANGUAGE")获取数据, 取出extra字段的build值")     kubernetes = models.ManyToManyField(KubernetesCluster, related_name="k8s_app", through="KubernetesDeploy",                                         verbose_name="K8s集群")     hosts = models.JSONField(default=list, verbose_name="部署主机", help_text="部署主机, 格式: []")     template = models.JSONField(default=dict, verbose_name="K8sDeployment模板",                                 help_text="继承自当前应用的template字段,数据格式为对象 字段说明: type: 0|1, 0表示继承应用模板,template为空字典;1表示自定义模板 示例: {"type": 0, "template": {}}")     # {0: 禁用, 1: 启用}     is_enable = models.SmallIntegerField(default=1, verbose_name="启用", help_text="状态 {0: 禁用, 1: 启用},默认值为1")     desc = models.TextField(verbose_name="描述", null=True, blank=True)     can_edit = models.JSONField(default=list, verbose_name="管理人员",                                 help_text="有权限编辑该应用的人员ID 格式为数组, 如[1,2]")     online = models.SmallIntegerField(default=0, choices=G_ONLINE_CHOICE, verbose_name="是否上线",                                       help_text=f"默认为0,即未上线 可选项: {G_ONLINE_CHOICE}")      def __str__(self):         return self.uniq_tag      @property     def namespace(self):         return f"{self.environment.name.replace("_", "-")}-{self.app.project.name.replace("_", "-")}".lower()      @property     def jenkins_jobname(self):         try:             job_name = f"{self.environment.name}-{self.app.category.split(".")[-1]}-{self.app.project.name}-{self.app.name.split(".")[-1]}".lower()         except AppInfo.DoesNotExist:             job_name = ""         return job_name      class ExtMeta:         related = True         dashboard = True      class Meta:         default_permissions = ()         ordering = ["-update_time", "-id"]         verbose_name = "应用模块"         verbose_name_plural = verbose_name + "管理"   class KubernetesDeploy(TimeAbstract):     appinfo = models.ForeignKey(AppInfo, related_name="app_info", null=True, on_delete=models.CASCADE)     kubernetes = models.ForeignKey(KubernetesCluster, related_name="app_k8s", null=True, on_delete=models.CASCADE)     online = models.SmallIntegerField(default=0, choices=G_ONLINE_CHOICE, verbose_name="是否上线",                                       help_text=f"默认为0,即未上线 可选项: {G_ONLINE_CHOICE}")     version = models.CharField(max_length=250, blank=True, null=True, verbose_name="当前版本")      def __str__(self):         return "%s-%s" % (self.appinfo.app.appid, self.kubernetes.name)      class Meta:         default_permissions = ()   class DataDict(CommonParent):     key = models.CharField(max_length=80, unique=True, verbose_name="键")     value = models.CharField(max_length=80, verbose_name="值")     extra = models.TextField(null=True, blank=True, default="", verbose_name="额外参数")     desc = models.CharField(max_length=255, blank=True, null=True, verbose_name="备注")      def __str__(self):         return self.value      class Meta:         default_permissions = ()         verbose_name = "字典"         verbose_name_plural = verbose_name + "管理" 编写序列化器import json from typing import List from rest_framework import serializers  from django.db import transaction from django.contrib.auth.models import User  from cmdb.models import Product, Project, Environment, KubernetesCluster, MicroApp, AppInfo, KubernetesDeploy   class KubernetesClusterListSerializers(serializers.ModelSerializer):     config = serializers.SerializerMethodField()      def get_config(self, instance):         return json.loads(instance.config)      class Meta:         model = KubernetesCluster         fields = "__all__"   class KubernetesClusterSerializers(serializers.ModelSerializer):     class Meta:         model = KubernetesCluster         fields = "__all__"   class MicroAppListSerializers(serializers.ModelSerializer):     project_info = serializers.SerializerMethodField()     appinfo = serializers.SerializerMethodField()     creator_info = serializers.SerializerMethodField()     extra_team_info = serializers.SerializerMethodField()      def get_project_info(self, instance):         project = instance.project         return {"project": {"id": project.id, "alias": project.alias},                  "product": {"id": project.product.id, "alias": project.product.alias}}      def get_appinfo(self, instance):         return [             {"id": i.id, "env_alias": i.environment.alias, "env": {"name": i.environment.name, "id": i.environment.id},              "online": i.online} for i in instance.appinfo_set.all()]      def get_creator_info(self, instance):         try:             return {"id": instance.creator.id, "first_name": instance.creator.first_name,                     "username": instance.creator.username}         except BaseException as e:             return {"id": "", "first_name": "", "username": ""}      def get_extra_team_info(self, instance):         data = {}         for k, v in instance.extra_members.items():             data[k] = [                 {"id": i.id, "name": i.name, "first_name": i.first_name, "username": i.username}                 for i in User.objects.filter(id__in=v)             ]         return data      class Meta:         model = MicroApp         fields = "__all__"   class MicroAppSerializers(serializers.ModelSerializer):     class Meta:         model = MicroApp         fields = "__all__"         read_only_fields = ("appid",)      @staticmethod     def perform_extend_save(validated_data):         def default_value(fields: List):             for field in fields:                 if validated_data.get(field):                     if validated_data[field].get("key") != "custom":                         validated_data[field]["value"] = validated_data[field]["key"]             return validated_data          validated_data = default_value(["dockerfile", "target"])         validated_data[             "appid"] = f"{validated_data["project"].product.name}.{validated_data["project"].name}.{validated_data["name"]}"         return validated_data      def create(self, validated_data):         instance = MicroApp.objects.create(can_edit=[validated_data["creator"].id],                                            **self.perform_extend_save(validated_data))         return instance      def update(self, instance, validated_data):         return super().update(instance, self.perform_extend_save(validated_data))   class AppInfoListSerializers(serializers.ModelSerializer):     app = MicroAppSerializers()     kubernetes_info = serializers.SerializerMethodField()      def get_kubernetes_info(self, instance):         serializer = KubernetesDeploySerializers(data=KubernetesDeploy.objects.filter(appinfo=instance.id), many=True)         serializer.is_valid()         return serializer.data      class Meta:         model = AppInfo         fields = "__all__"   class AppInfoSerializers(serializers.ModelSerializer):     class Meta:         model = AppInfo         fields = "__all__"      def perform_extend_save(self, validated_data, *args, **kwargs):         if validated_data.get("app", None) and validated_data.get("environment", None):             validated_data[                 "uniq_tag"] = f"{validated_data["app"].appid}.{validated_data["environment"].name.split("_")[-1].lower()}"          if kwargs.get("instance", None):             kubernetes = self.initial_data.get("kubernetes")             _bulk = []             for kid in kubernetes:                 _ks = KubernetesCluster.objects.get(id=kid)                 _bulk.append(KubernetesDeploy(appinfo=kwargs["instance"], kubernetes=_ks))             KubernetesDeploy.objects.bulk_create(_bulk, ignore_conflicts=True)         return validated_data      @transaction.atomic     def create(self, validated_data):         instance = AppInfo.objects.create(**self.perform_extend_save(validated_data))         if "kubernetes" in self.initial_data:             self.perform_extend_save(validated_data, **{"instance": instance})         return instance      @transaction.atomic     def update(self, instance, validated_data):         KubernetesDeploy.objects.filter(appinfo=instance).delete()         instance.__dict__.update(**self.perform_extend_save(validated_data, **{"instance": instance}))         instance.save()         return instance 编写视图from rest_framework.response import Response from rest_framework.decorators import action from django.db import transaction  from cmdb.models import Product, Project, Environment, KubernetesCluster, MicroApp, AppInfo from cmdb.serializers import AppInfoListSerializers, AppInfoSerializers, KubernetesClusterListSerializers, KubernetesClusterSerializers, MicroAppListSerializers, MicroAppSerializers from common.extends.decorators import cmdb_app_unique_check   class KubernetesClusterViewSet(viewsets.ModelViewSet):     """     Kubernetes集群视图      ### Kubernetes集群权限         {"*": ("k8scluster_all", "k8s集群管理")},         {"get": ("k8scluster_list", "查看k8s集群")},         {"post": ("k8scluster_create", "创建k8s集群")},         {"put": ("k8scluster_edit", "编辑k8s集群")},         {"patch": ("k8scluster_edit", "编辑k8s集群")},         {"delete": ("k8scluster_delete", "删除k8s集群")}     """     perms_map = (         {"*": ("admin", "管理员")},         {"*": ("k8scluster_all", "k8s集群管理")},         {"get": ("k8scluster_list", "查看k8s集群")},         {"post": ("k8scluster_create", "创建k8s集群")},         {"put": ("k8scluster_edit", "编辑k8s集群")},         {"patch": ("k8scluster_edit", "编辑k8s集群")},         {"delete": ("k8scluster_delete", "删除k8s集群")}     )     queryset = KubernetesCluster.objects.all()     serializer_class = KubernetesClusterSerializers      def get_serializer_class(self):         if self.action in ["list", "retrieve"]:             return KubernetesClusterListSerializers         return KubernetesClusterSerializers       class MicroAppViewSet(viewsets.ModelViewSet):     """     项目应用视图      ### 项目应用权限         {"*": ("microapp_all", "应用管理")},         {"get": ("microapp_list", "查看应用")},         {"post": ("microapp_create", "创建应用")},         {"put": ("microapp_edit", "编辑应用")},         {"patch": ("microapp_edit", "编辑应用")},         {"delete": ("microapp_delete", "删除应用")}     """     perms_map = (         {"*": ("admin", "管理员")},         {"*": ("microapp_all", "应用管理")},         {"get": ("microapp_list", "查看应用")},         {"post": ("microapp_create", "创建应用")},         {"put": ("microapp_edit", "编辑应用")},         {"patch": ("microapp_edit", "编辑应用")},         {"delete": ("microapp_delete", "删除应用")}     )     queryset = MicroApp.objects.all()     serializer_class = MicroAppSerializers      def get_serializer_class(self):         if self.action in ["list", "retrieve"]:             return MicroAppListSerializers         return MicroAppSerializers          @cmdb_app_unique_check()     def create(self, request, *args, **kwargs):         """         创建应用          提交参数         创建:{}         """         try:             request.data["name"] = request.data["name"].strip(" ").replace(" ", "-")         except BaseException as e:             logger.error("exception ", str(e))         serializer = self.get_serializer(data=request.data)         if not serializer.is_valid():             return Response({"code": 40000, "status": "failed", "message": serializer.errors})         try:             self.perform_create(serializer)         except BaseException as e:             logger.error(e)             return Response({"code": 50000, "status": "failed", "message": str(e)})         data = {"data": serializer.data, "status": "success", "code": 20000}         return Response(data)       @transaction.atomic     def perform_create(self, serializer):         serializer.save(creator=self.request.user)      @action(methods=["POST"], url_path="related", detail=False)     def app_related(self, request):         """         应用关联          ### 传递参数:             ids: 待关联应用id数组             target: 目标应用id         """         try:             target = request.data.get("target", None)             ids = request.data.get("ids", None)             if target:                 instance = self.queryset.get(id=target)                 ids.extend(instance.multiple_ids)             self.queryset.filter(id__in=list(set(ids))).update(multiple_app=True, multiple_ids=list(set(ids)))             return Response({"code": 20000, "data": "应用关联成功."})         except BaseException as e:             logger.error("err", e)             return Response({"code": 50000, "data": "关联应用异常,请联系管理员!"})      @action(methods=["POST"], url_path="unrelated", detail=False)     def app_unrelated(self, request):         """         取消应用关联          ### 传递参数:             id: 应用id         """         try:             instance = self.queryset.filter(id=request.data.get("id"))             # 获取关联应用ID列表             ids = instance[0].multiple_ids             ids.remove(instance[0].id)             if len(ids) == 1:                 # 如果关联应用只剩下一个,则一起取消关联                 self.queryset.filter(id__in=instance[0].multiple_ids).update(multiple_app=False, multiple_ids=[])             else:                 # 更新其它应用的关联应用ID                 self.queryset.filter(id__in=ids).update(multiple_ids=ids)                 # 取消当前实例应用关联                 instance.update(multiple_app=False, multiple_ids=[])             return Response({"code": 20000, "data": "应用取消关联成功."})         except BaseException as e:             return Response({"code": 50000, "data": "关联应用异常,请联系管理员!"})   class AppInfoViewSet(viewsets.ModelViewSet):     """     项目应用服务      * 服务对应着应用的不同环境,即应用每个环境创建一个对应的服务      ### 项目应用服务权限         {"*": ("microapp_all", "应用管理")},         {"get": ("microapp_list", "查看应用")},         {"post": ("microapp_create", "创建应用")},         {"put": ("microapp_edit", "编辑应用")},         {"patch": ("microapp_edit", "编辑应用")},         {"delete": ("microapp_delete", "删除应用")}     """     perms_map = (         {"*": ("admin", "管理员")},         {"*": ("microapp_all", "应用管理")},         {"get": ("microapp_list", "查看应用")},         {"post": ("microapp_create", "创建应用")},         {"put": ("microapp_edit", "编辑应用")},         {"patch": ("microapp_edit", "编辑应用")},         {"delete": ("microapp_delete", "删除应用")}     )     queryset = AppInfo.objects.all()     serializer_class = AppInfoSerializers      def get_serializer_class(self):         if self.action in ["list", "retrieve"]:             return AppInfoListSerializers         return AppInfoSerializers      def create(self, request, *args, **kwargs):         request.data["uniq_tag"] = "default"         serializer = self.get_serializer(data=request.data)         serializer.is_valid(raise_exception=True)         self.perform_create(serializer)         data = serializer.data          data = {"code": 20000, "status": 200, "data": data}         return Response(data) 添加装饰器
  细心的朋友应该可以发现,在视图里文件里导入一个自己编写的装饰器
  from common.extends.decorators import cmdb_app_unique_check
  我们先在项目根下创建common目录(venv) ➜  ydevops-backend mkdir -p common/extends (venv) ➜  ydevops-backend touch common/extends/decorators.py
  然后编写装饰器cmdb_app_unique_checkfrom functools import wraps from rest_framework.response import Response from cmdb.models import MicroApp   def cmdb_app_unique_check():     """     应用唯一性检查     appid: {product.name}.{app.name}     """      def check_app(product, name):         try:             if MicroApp.objects.filter(project__product__id=product, name=name).exists():                 # 存在应用                 return True         except BaseException as e:             pass         return False      def decorator(func):         @wraps(func)         def wrapper(self, request, *args, **kwargs):             if check_app(request.data["product"], request.data["name"]):                 return Response({"code": 50000, "message": f"该产品下已存在[{request.data["name"]}]同名应用."})             return func(self, request, *args, **kwargs)          return wrapper      return decorator 添加路由from django.contrib import admin from django.urls import path, include from cmdb.view.view_cmdb import AppInfoViewSet, KubernetesClusterViewSet, MicroAppViewSet  from rest_framework.routers import DefaultRouter  from cmdb.views import RegionViewSet, IdcViewSet, ProductViewSet, ProjectViewSet, EnvironmentViewSet   router = DefaultRouter()  router.register("region", RegionViewSet) router.register("asset/idc", IdcViewSet) router.register("product", ProductViewSet) router.register("project", ProjectViewSet) router.register("environment", EnvironmentViewSet) router.register("app/service", AppInfoViewSet) router.register("app", MicroAppViewSet) router.register("kubernetes", KubernetesClusterViewSet)  urlpatterns = [     path("admin/", admin.site.urls),     path("api/", include(router.urls)), ]迁移数据表(venv) ➜  ydevops-backend python manage.py makemigrations Migrations for "cmdb":   apps/cmdb/migrations/0003_appinfo_kubernetescluster_microapp_kubernetesdeploy_and_more.py     - Create model AppInfo     - Create model KubernetesCluster     - Create model MicroApp     - Create model KubernetesDeploy     - Add field app to appinfo     - Add field environment to appinfo     - Add field kubernetes to appinfo (venv) ➜  ydevops-backend python manage.py makemigrations Migrations for "cmdb":   apps/cmdb/migrations/0004_datadict.py     - Create model DataDict (venv) ➜  ydevops-backend python manage.py migrate        Operations to perform:   Apply all migrations: admin, auth, cmdb, contenttypes, sessions Running migrations:   Applying cmdb.0003_appinfo_kubernetescluster_microapp_kubernetesdeploy_and_more... OK   Applying cmdb.0004_datadict... OK运行项目(venv) ➜  ydevops-backend python manage.py runserver 0.0.0.0:9000 Watching for file changes with StatReloader Performing system checks...  System check identified no issues (0 silenced). March 23, 2023 - 22:13:47 Django version 4.1.7, using settings "devops_backend.settings" Starting development server at http://0.0.0.0:9000/ Quit the server with CONTROL-C.
  打开浏览器访问http://localhost:9000/api/就可以看到目前已完成的接口了

临近50岁或60岁,这几个征兆的出现,往往暗示了余生的大苦图源自网络侵权请联系删除中年时期,是人生的一道分水岭,也是晚年是否过得幸福的关键。这时候的人生选择极为重要,一步走错了,就会导致步步错,且再也没有回头的机会和挽回的可能。古人云五十三部门联合开展艺考培训机构专项治理中国青年报客户端北京10月26日电(中青报中青网记者樊未晨)记者从教育部获悉,为加强艺考培训机构规范管理,防范遏制机构及其人员违法犯罪行为,教育部公安部市场监管总局联合作出部署,对银行存款一万,就送电动车是真的吗,有没有套路?现如今,商家各种营销方式层出不穷,买一赠一各种抽奖赠送礼品之类的活动,大家也是屡见不鲜。就连银行,也时不时地推出各种活动,比如端午存款送粽子,春节存款送对联,平常也有一些赠送米面油大鹏教育被爆出问题4千员工面临追债难题,套路学员交钱做助教文江湖独白专栏大鹏教育被爆出问题?4千员工面临追债难题,套路学员交钱做助教有兴趣在线上做知识付费的人员应该知道大鹏教育,这是一家依托于互联网的信息平台,以数字化多媒体的方式对传统文当年的破局英雄,奇瑞qq回来了,还要什么五菱前几天看到了一款小电动,外观还挺可爱。后来询问了一下价格,感觉还挺合适。这就是奇瑞qq冰淇淋。要是在去年,这车还真不是太值得注意,但是现在就不一样了,电动汽车整体涨价了。连五菱都到逛鬼是怎样炼成的73沁河边的古村皇城相府小时候在村里,总有游街串巷的补锅人,拉着一辆小平车,炉子锅瓦瓢盆铺盖卷都在车上,吃饭的时候就一口锅,里面是小米面条青菜一锅烩,大人们说他们是阳城来的,那时我并不知道阳城在哪里,只是金句摘抄与感悟41。最没前途的人,就是那些凡事无交代,做事不沟通的人。罗振宇很多人抱怨有些人在职场中能力不行,全靠一张嘴,但是有些时候,一张嘴能解决很多事,因为善于沟通协调的人能够使资源得到最大化还没买车的朋友别着急!财政部2023年新能源汽车继续免征购置税好消息!近日国家财政部发布公告称2023年新能源汽车将继续实施免征车辆购置税政策,对于购置日期在2023年1月1日至2023年12月31日期间内的新能源汽车,免征车辆购置税。如此一哈登大爆发,老里弗斯终于妥协!恩比德认清地位,哈登有望圆梦NBA常规赛继续进行,76人主场迎战步行者,此前遭遇3连败的76人处在风口浪尖之中,很多截图或者视频片段显示,这支球队如今氛围并不好,老里弗斯和哈登之间,哈登和恩比德之间,火箭系和澳门赛国乒奖金曝光!孙颖莎王楚钦最多,王曼昱林高远一轮游最少2022WTT澳门冠军赛于10月23日圆满落幕,中国乒乓球队包揽了男女单项的冠亚军,成为本届赛事的最大赢家。比赛结束之后,国乒10人主力团队获得的奖金也全部出炉。孙颖莎和王楚钦拿到1场3好消息,泰山队国脚时隔1年复出,5外援合体PK海港,郝伟留力1场3好消息,泰山队国脚时隔1年复出,5外援合体PK海港,郝伟留力对阵广州队的比赛,山东泰山队心态比较好,开场并不是很急躁,仅仅半场比赛就取得了20的领先。让山东泰山队早早地锁定了
春秋几度又相逢,冷暖知多少,世态炎凉看不清烟雨中,春秋几度又相逢,冷暖知多少,世态炎凉看不清。春秋几度叹蹉跎,往事如烟梦里过,世态人情知冷暖,炎凉岁月任消磨。冷暖奈如何,世态炎凉逐逝波,一枕黄粱几度叹蹉跎。炎凉世态人情有限人到中年,不管过得好不好,都别去三个人家里串门,这才是高情商图来自网络,侵权请联系删除以前,很多人都喜欢去别人家里串门,唠一唠家常,品一品岁月,打发些无聊时光,日后想起来还能心头一暖。但这只是以前,现如今人心薄凉,再加上生活方式的转变,这种仰高别把书读进了狗肚子别把书读进了狗肚子仰高在乡下老家,最怕长辈们骂我们上过学念过书的晚辈把书读进了狗肚子。这句话的本意,并不是说一个人在学校不好好念书而蹉跎岁月,而是书念了不少,大道理也懂得不少,但却听说懂手机的人,才会买iQOO?这3款机型目前最值得入手听说懂手机的人,才会买iQOO?蓝厂出身,没有爆雷机型,堆料不比小米差,家族式设计也很上心,今天我就来跟大家好好聊一聊!蓝厂做手机,向来都是稳扎稳打,子品牌iQOO也挺争气的,三年市场占有率全球第三?除了华为之外,还有其他国产手机有这本事?在说正事之前,笔者我想先问屏幕前的大家一个问题,不知道屏幕前的大家,有多少人关注过全球手机市场的?相信应该有不少朋友,对国际手机市场的情况都不太了解吧?其实到了现在,大家都很熟悉的(科技)日本研究人员发现降低物质热传导率的新机制新华社东京1月19日电(记者钱铮)提高电子设备的性能节能率等都离不开对物质导热难易程度即热传导率的调节。日本研究人员最新发现,在金属互化物晶体结构的隧道中,构成原子链的原子间的距离2023即将发布的几款拍照最好的手机,款款堪比小单反,等等党福音喜欢拍照的朋友不妨再等等,这三款手机即将发布!款款堪比小单反!第一款vivoNEX6系列加入了VIVO自研的V2专业影像芯片,并且采用了双主摄的概念前置32MP自拍镜头(三星S5K充电快,有高刷大内存的手机,还支持5G游戏新春创作纪苹果已经为AirPods2,AirPods3,初代AirPodsPro,AirPodsMax推出了新的5B59固件,高于11月发布的5B58固件。苹果公司没有提供关于小米13Pro打败iPhone14ProMax,拿下2022年度旗舰手机第二名目前,市场调研机构发布了2022年度高端旗舰手机前三名,从排行看出,vivoX90Pro拿下了第一名,而小米13Pro则打败iPhone14ProMax,也就是说3款入榜的旗舰手机贵州贵安新区数据中心创新机贵安新区华为云数据中心(以道路为界右侧)和腾讯贵安七星数据中心(左侧)。新华社记者欧东衢摄冬雾笼罩的山城贵阳美景如画,在其临近的贵安新区,还有一番景观地势平坦视野开阔,一批超大型数热熔胶领先企业鹿山新材紧抓光伏新机遇,打开成长空间(报告出品方分析师东亚前海证券郑倩怡)1。公司聚焦热熔粘接业绩屡创新高1。1。积淀二十余载成就领先地位国内领先的高性能热熔粘接材料企业。公司专注于绿色环保高性能的高分子热熔粘接材料