Browse Source

更新优化

lex-xin 2 years ago
parent
commit
4883158445
32 changed files with 1793 additions and 501 deletions
  1. BIN
      public/favicon - 副本.ico
  2. 349 0
      public/privacyProtocol.html
  3. 2 2
      src/business-components/section-detail/index.tsx
  4. 1 1
      src/business-components/subject-list/index.tsx
  5. 5 1
      src/business-components/user-detail/index.tsx
  6. 25 9
      src/business-components/user-list/index.tsx
  7. BIN
      src/common/images/icon_student.png
  8. 8 1
      src/components/col-result/index.module.less
  9. 1 8
      src/components/col-result/index.tsx
  10. 1 1
      src/router/routes-common.ts
  11. 8 0
      src/router/routes-student.ts
  12. 8 0
      src/router/routes-teacher.ts
  13. 89 13
      src/student/live-class/index.tsx
  14. 48 0
      src/student/live-class/live-detail.module.less
  15. 147 0
      src/student/live-class/live-detail.tsx
  16. 59 19
      src/student/live-class/live-item.tsx
  17. 1 1
      src/student/video-class/video-detail.tsx
  18. 11 8
      src/teacher/live-class/create-components/arrange.tsx
  19. 19 9
      src/teacher/live-class/live-detail.tsx
  20. 90 0
      src/teacher/practice-class/practice-setting.module.less
  21. 206 0
      src/teacher/practice-class/practice-setting.tsx
  22. 72 35
      src/teacher/teacher-cert/cert-two.tsx
  23. 57 32
      src/teacher/video-class/video-detail.tsx
  24. 22 7
      src/views/404/index.tsx
  25. 33 13
      src/views/order-detail/index.tsx
  26. 49 0
      src/views/order-detail/order-live/index.module.less
  27. 116 0
      src/views/order-detail/order-live/index.tsx
  28. 0 0
      src/views/order-detail/order-video/index.module.less
  29. 0 0
      src/views/order-detail/order-video/index.tsx
  30. 6 0
      src/views/order-detail/orderStatus.ts
  31. 127 231
      src/views/protocol/privacy.tsx
  32. 233 110
      src/views/protocol/register.tsx

BIN
public/favicon - 副本.ico


+ 349 - 0
public/privacyProtocol.html

@@ -0,0 +1,349 @@
+<!DOCTYPE html>
+<html lang="zh">
+
+<head>
+  <meta charset="UTF-8" />
+  <link rel="icon" href="/favicon.ico" />
+  <meta name="viewport"
+    content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover">
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <!-- 设置苹果工具栏颜色 -->
+  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+  <!-- 忽略页面中的数字识别为电话,忽略email识别 -->
+  <meta name="format-detection" content="telphone=no, email=no" />
+  <!-- 启用360浏览器的极速模式(webkit) -->
+  <meta name="renderer" content="webkit">
+  <!-- 避免IE使用兼容模式 -->
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="HandheldFriendly" content="true">
+  <!-- uc强制竖屏 -->
+  <meta name="screen-orientation" content="portrait">
+  <!-- QQ强制竖屏 -->
+  <meta name="x5-orientation" content="portrait">
+  <!-- UC强制全屏 -->
+  <meta name="full-screen" content="yes">
+  <!-- QQ强制全屏 -->
+  <meta name="x5-fullscreen" content="true">
+  <!-- UC应用模式 -->
+  <meta name="browsermode" content="application">
+  <!-- QQ应用模式 -->
+  <meta name="x5-page-mode" content="app">
+  <!-- 设置在apple上以应用模式启动时,是否全屏 -->
+  <meta name="apple-touch-fullscreen" content="yes">
+  <!-- windows phone 点击无高光 -->
+  <meta name="msapplication-tap-highlight" content="no">
+  <title>酷乐秀隐私政策</title>
+  <style>
+    .container {
+      padding: 0.58667rem 0.32rem 0.8rem;
+      font-size: 0.37333rem;
+      line-height: 1.3;
+    }
+
+    .container h1 {
+      font-size: 0.42667rem;
+      text-align: center;
+    }
+
+    .container h2 {
+      font-size: 0.42667rem;
+      font-weight: bold;
+      padding-top: 0.4rem;
+    }
+
+    .container h3 {
+      font-size: 0.37333rem;
+      font-weight: bold;
+    }
+
+    .container .signature {
+      display: flex;
+      padding-top: 0.13333rem;
+    }
+
+    .container .signature .sign {
+      flex: 1;
+      position: relative;
+    }
+
+    .container .signature span {
+      display: block;
+      padding-left: 0.53333rem;
+    }
+
+    .container .signature .cachet {
+      position: absolute;
+      top: -1.6rem;
+      left: 0;
+      width: 0.4rem;
+      height: 0.4rem;
+    }
+
+    .iInfo {
+      display: flex;
+    }
+
+    .iInfo span {
+      flex: 1;
+    }
+
+    .btnback {
+      display: inline-block;
+      font-size: 0.48rem;
+      color: #fff;
+      background: #F1111B;
+      border-radius: 0.10667rem;
+      box-shadow: 0 0.05333rem 0.10667rem 0 rgba(0, 0, 0, 0.19);
+      padding: 0.21333rem 0;
+      margin-top: 2.13333rem;
+      width: 100%;
+      text-align: center;
+    }
+
+    .line {
+      border-bottom: 0.02667rem solid #000;
+    }
+
+  </style>
+</head>
+
+<body>
+  <div class="container">
+    版本更新时间
+    <br />
+    <strong>更新日期:2022年4月18日</strong>
+    <br />
+    <strong>生效日期:2022年4月18日</strong>
+    <br />
+    版本更新提示
+    <br />
+    我们可能适时修订本《隐私政策》的条款,该修订构成本《隐私政策》的一部分。如该修订造成您在本《隐私政策》下权利的实质减少,我们将在修订生效前通过在主页上显著位置提示或向您发送电子邮件或以其他方式通知您。在该种情况下,若您继续使用我们的服务,即表示同意受经修订的本《隐私政策》的约束。
+    <br />
+    引言
+    <br />
+    酷乐秀是由武汉酷乐秀科技有限公司(以下简称“酷乐秀”)为您提供的一款找谱,智能练琴,社交学习平台,问答于一体的综合音乐服务产品。酷乐秀十分重视用户的个人信息和数据。您在使用我们的服务时,我们可能会收集和使用您的相关信息。我们希望通过本《隐私政策》向您说明,在使用我们的服务时,我们如何收集、使用、储存和分享这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。本《隐私政策》与您所使用的酷乐秀服务息息相关,希望您仔细阅读,在需要时,按照本《隐私政策》的指引,作出您认为适当的选择。本《隐私政策》中涉及的相关技术词汇,我们尽量以简明扼要的表述,并提供进一步说明的链接,以便您的理解。
+    <br />
+    您使用或继续使用我们的服务,即意味着同意我们按照本《隐私政策》收集、使用、储存和分享您的相关信息。
+    <br />
+    我们如何收集的信息
+    <br />
+    您在使用我们的产品与/或服务时,我们需要/可能需要收集和使用您的一些个人信息,我们收集和使用的您的个人信息类型包括两种: 第一种:我们产品与/或服务的核心业务功能所必需的信息:此类信息为产品与/或服务正常运行的必备信息,您须授权我们收集。如您拒绝提供,您将无法正常使用我们的产品与/或服务 第二种:我们产品与/或服务的附加业务功能可能需要收集的信息:此信息为非核心业务功能所需的信息,您可以选择是否授权我们收集。如您拒绝提供,将导致附加业务功能无法实现或无法达到我们拟达到的效果,但不影响您对核心业务功能的正常使用。
+    <br />
+    <h2>(一)账号注册/登录功能</h2>
+    个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。
+    <br />
+    1. 用户账户信息:
+    当您使用账号注册功能时,我们会收集由您主动提供给我们的一些单独或者结合识别您实名身份的信息,包括:手机号码、验证码匹配结果,并创建密码。您的密码将以加密形式进行自动存储、传输、验证,我们不会以明文方式存储、传输、验证您的密码。您在保管、输入、使用您的密码时,应当对物理环境、电子环境审慎评估,以防密码外泄。我们收集这些信息是用以完成注册程序、为您持续稳定提供专属于注册用户的产品与/或服务,并保护您的账号安全。您应知悉,手机号码和验证码匹配结果属于您的个人敏感信息,我们收集该类信息是为了满足相关法律法规的要求,如您拒绝提供可能导致您无法使用我们的此功能,请您谨慎考虑后再提供。
+    <br />
+    需要说明的是,我们的一些产品支持您使用第三方平台的账号(例如:微信)进行登录,如您使用第三方平台的账号登录的,我们将根据您的授权获取该第三方账号下的相关信息(包括:昵称、头像,具体以您的授权内容为准)以及身份验证信息(个人敏感信息)。我们收集这些信息是用于为您提供账号登录服务以及保障您的账号安全,防范安全风险。如您拒绝授权此类信息的,您将无法使用第三方平台的账号登录我们平台,但不影响我们为您提供的其他产品和服务的正常使用。
+    <br />
+    <h2>(二)服务内容展示/浏览/播放/下载/上传功能</h2>
+    我们的产品与/或服务为您提供曲谱、视频、帖子服务内容的展示、浏览、播放、下载和上传功能,在此过程中,我们会根据您使用我们产品与/或服务的具体操作收集您的一些信息,包括如下个人信息:
+    <br />
+    设备信息:包括设备MAC地址、唯一设备识别码、登录IP地址、设备型号、设备名称、设备标识、浏览器类型和设置、语言设置、操作系统和应用程序版本、接入网络的方式、网络质量数据、移动网络信息(包括运营商名称)、产品版本号、设备所在位置相关信息(包括您授权我们获取的地理位置信息)。为了收集上述基本的个人设备信息,我们将会申请访问您的设备信息的权限并根据您的授权获取相关信息。
+    <br />
+    日志信息:当您使用我们的产品与/或服务时,我们会自动收集您的个人上网记录,并作为有关操作日志、服务日志保存,包括您的浏览记录、点赞/分享/评论/互动记录、收藏/关注记录、播放记录、播放时长、访问日期和时间。
+    <br />
+    获取运行中的进程:当您使用我们的产品与/或服务时,我们会不定期获取当前设备正在运行中的进程,以用来判定本App是否在前台运行,从而使App可以正常开展业务逻辑。获取的进程信息,仅用来做App是否在前台运行的判定,不会对该信息进行存储、上传、转发操作。
+    <br />
+    位置信息:附近的人,您通过具有定位功能的移动设备使用我们的服务时,通过GPS或WiFi方式收集的您的地理位置信息;您或其他用户提供的包含您所处地理位置的实时信息,例如您提供的账户信息中包含的您所在地区信息,您或其他人上传的显示您当前或曾经所处地理位置的共享信息,您或其他人共享的照片包含的地理标记信息;您可以通过关闭定位功能,停止对您的地理位置信息的收集。
+    <br />
+    录音信息:当前App的核心功能是通过录音信息分析来获取频率信息,所以我们需要获取您的设备录音(麦克风)的相关权限,以用来完成当前声音频率的识别。如果您不允许App使用录音权限,该App将无法正常使用。App获取录音信息后仅用于声音分析,不会对录音信息进行存储、上传操作。
+    <br />
+    软件安装列表:近期出现不法分子通过反编译、套壳一些非法手段生成盗版的“酷乐秀”App,可能会导致您的个人信息泄露,个人权益受损。获取软件安装列表是为了从安装列表中获取到“酷乐秀”App的安装包名,包体大小,以此来判定app是否已被盗版攻击,以更好的保护您的个人权益和隐私。
+    <br />
+    我们收集这些信息是为了向您提供我们最核心的服务内容展示/播放/下载服务,如您拒绝提供上述信息和/或权限将可能导致您无法使用我们的产品与服务。请您知悉,单独的设备信息、日志信息无法识别您的身份信息。
+    <br />
+    <h2>(三)信息统计、消息推送、分享、支付</h2>
+    为了完成支付、统计、推送、地图,分享功能,我们还集成了其他的SDK,如您在我们平台上使用这类由第三方提供的服务时,您同意将由其直接收集和处理您的信息(如以嵌入代码、插件形式)。目前我们产品中包含的第三方SDK服务以及隐私政策详情请参阅《酷乐秀第三方SDK目录及其隐私政策》。
+    <br />
+    <h2>(四)信息制作、发布、上传、交流互动功能</h2>
+    当您在我们的部分产品与/或服务中使用视频剪辑创作、上传、发布、社区发帖、平台内交流互动、点赞、评论、分享服务/功能时,除注册登录账户之外,您可能会主动提供相关图文/视频内容、互动信息(包括但不限于帖子、点赞/评论/分享/交流互动信息)。我们会自动收集您的上述信息,并展示您的昵称、头像、发布的信息内容。请您知悉,您发布的信息中可能包含他人的个人信息,请您务必取得他人的合法授权,避免非法泄露他人的个人信息。如您不同意我们收集上述信息,您将无法使用我们的信息发布功能,但不影响您使用我们为您提供的其他产品和服务。
+    <br />
+    摄像头权限:当您需要上传个人中心头像跟背景图片或者上传帖子内容里面的图片、视频的时候,拍照功能需要调取您的摄像头权限,如果您拒绝授权,可能会影响您上传个人中心头像以及背景图片,发布帖子,由此带来的不便请您理解。
+    <br />
+    <h2>(五)下单与交付</h2>
+    当您在我们的产品与/或服务中购买商品或服务的,我们需要根据商品或服务类型收集如下部分或全部的个人信息,包括:交易商品或服务信息、收货人信息(收货人姓名、收货地址及其联系电话)(个人敏感信息)、交易金额、下单时间、订单商户、订单编号、订单状态、支付方式、支付账号、支付状态(个人敏感信息),我们收集这些信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息、提供客户服务。
+    <br />
+    <h2>(六)客服、其他用户响应功能</h2>
+    当您与我们的客服互动时或使用其他用户响应功能时(包括:在线提交意见反馈、与在线/人工客服沟通、提出我们的产品与/或服务的售后申请、行使您的相关个人信息控制权、其他客户投诉和需求),为了您的账号与系统安全,我们可能需要您先行提供账号信息,并与您之前的个人信息相匹配以验证您的用户身份。在您使用客服或其他用户响应功能时,我们可能还会需要收集您的如下个人敏感信息:联系方式(您与我们联系时使用的电话号码/电子邮箱或您向我们主动提供的其他联系方式)、您与我们的沟通信息(包括文字/图片/音视频/通话记录形式)、与您需求相关联的其他必要信息。我们收集这些信息是为了调查事实与帮助您解决问题,如您拒绝提供可能导致您无法使用我们的客服用户响应机制。
+    <br />
+    <h2>(七)产品安全保障功能</h2>
+    我们需要收集您的一些信息来保障您使用我们的产品与/或服务时的账号与系统安全,并协助提升我们的产品与/服务的安全性和可靠性,以防产生任何危害用户、酷乐秀、社会的行为,包括您的如下个人信息:账号登录地、个人常用设备信息(例如:硬件型号、设备MAC地址、IMEI、IMSI)、登录IP地址、产品版本号、语言模式、浏览记录、网络使用习惯、服务故障信息,以及个人敏感信息:交易信息、会员实名认证信息。我们会根据上述信息来综合判断您账号、账户及交易风险、进行身份验证、客户服务、检测及防范安全事件、诈骗监测、存档和备份用途,并依法采取必要的记录、审计、分析、处置措施,一旦我们检测出存在或疑似存在账号安全风险时,我们会使用相关信息进行安全验证与风险排除,确保我们向您提供的产品和服务的安全性,以用来保障您的权益不受侵害。同时,当发生账号或系统安全问题时,我们会收集这些信息来优化我们的产品和服务。
+    <br />
+    此外,为确保您设备操作环境的安全以及提供我们的产品与/或服务所必需,防止恶意程序和反作弊,我们会在您同意本《隐私政策》后获取您设备上已安装或正在运行的必要的应用/软件列表信息(包括应用/软件来源、应用/软件总体运行情况、崩溃情况、使用频率)。请您知悉,单独的应用/软件列表信息无法识别您的特定身份。
+    <br />
+    例外情形,另外,您充分理解并同意,我们在以下情况下收集、使用您的个人信息无需您的授权同意:
+    <br />
+    与我们履行法律法规规定的义务相关的;
+    <br />
+    与国家安全、国防安全直接相关的;
+    <br />
+    与公共安全、公共卫生、重大公共利益直接相关的;
+    <br />
+    与犯罪侦查、起诉、审判和判决执行直接相关的;
+    <br />
+    出于维护您或其他个人的生命、财产重大合法权益但又很难得到您本人同意的;
+    <br />
+    所收集的信息是您自行向社会公开的或者是从合法公开的渠道(如合法的新闻报道、政府信息公开渠道)中收集到的;
+    <br />
+    根据与您签订和履行相关协议或其他书面文件所必需的;
+    <br />
+    用于维护我们的产品与/或服务的安全稳定运行所必需的,例如发现、处置产品与/或服务的故障
+    <br />
+    有权机关的要求、法律法规规定的其他情形。
+    <br />
+    我们如何使用Cookie和同类技术
+    <br />
+    (一)关于Cookie和同类技术
+    <br />
+    Cookie是包含字符串的小文件,在您登入和使用网站或其他网络内容时发送、存放在您的计算机、移动设备或其他装置内(通常经过加密)。Cookie同类技术是可用于与Cookie类似用途的其他技术,例如:Web
+    Beacon、Proxy、嵌入式脚本。
+    <br />
+    目前,我们主要使用Cookie收集您的个人信息。您知悉并同意,随着技术的发展和我们产品和服务的进一步完善,我们也可能会使用Cookie同类技术
+    <br />
+    (二)我们如何使用Cookie和同类技术
+    <br />
+    在您使用我们的产品与/或服务时,我们可能会使用Cookie和同类技术收集您的一些个人信息,包括:您访问网站的习惯、您的浏览信息、您的登录信息
+    <br />
+    如果您的浏览器允许,您可以通过您的浏览器的设置以管理、(部分/全部)拒绝Cookie与/或同类技术;或删除已经储存在您的计算机、移动设备或其他装置内的Cookie与/或同类技术,从而实现我们无法全部或部分追踪您的个人信息。您如需详细了解如何更改浏览器设置,请具体查看您使用的浏览器的相关设置页面。您理解并知悉:我们的某些产品/服务只能通过使用Cookie或同类技术才可得到实现,如您拒绝使用或删除的,您可能将无法正常使用我们的相关产品与/或服务或无法通过我们的产品与/或服务获得最佳的服务体验,同时也可能会对您的信息保护和账号安全性造成一定的影响。
+    <br />
+    我们如何共享、转让、公开披露您的个人信息
+    <br />
+    除以下情形外,未经您同意,我们以及我们的关联公司不会与任何第三方分享您的个人信息:
+    <br />
+    我们以及我们的关联公司,可能将您的个人信息与我们的关联公司、合作伙伴及第三方服务供应商、承包商及代理(例如代表我们发出电子邮件或推送通知的通讯服务提供商、为我们提供位置数据的地图服务供应商)分享(他们可能并非位于您所在的法域),用作下列用途:
+    <br />
+    向您提供我们的服务;
+    <br />
+    实现“我们可能如何使用信息”部分所述目的;
+    <br />
+    履行我们在《酷乐秀服务协议》或本《隐私政策》中的义务和行使我们的权利;
+    <br />
+    理解、维护和改善我们的服务。
+    <br />
+    如我们或我们的关联公司与任何上述第三方分享您的个人信息,我们将努力确保该第三方在使用您的个人信息时遵守本《隐私政策》及我们要求其遵守的其他适当的保密和安全措施。
+    <br />
+    随着我们业务的持续发展,我们以及我们的关联公司有可能进行合并、收购、资产转让或类似的交易,您的个人信息有可能作为此类交易的一部分而被转移。我们将在转移前通知您。
+    <br />
+    我们或我们的关联公司还可能为以下需要而保留、保存或披露您的个人信息:
+    <br />
+    遵守适用的法律法规;
+    <br />
+    遵守法院命令或其他法律程序的规定;
+    <br />
+    遵守相关政府机关的要求;
+    <br />
+    为遵守适用的法律法规、维护社会公共利益,或保护我们的客户、我们或我们的集团公司、其他用户或雇员的人身和财产安全或合法权益所合理必需的用途。
+    <br />
+    您对个人信息享有的控制权
+    <br />
+    您对我们产品与/或服务中的您的个人信息享有多种方式的控制权,包括:您可以访问、更正/修改、删除您的个人信息,也可以撤回之前作出的对您个人信息的同意,同时您也可以注销您的账号。为便于您行使您的上述控制权,我们在产品的相关功能页面为您提供了操作指引和操作设置,您可以自行进行操作,如您在操作过程中有疑惑或困难的可以通过文末的方式联系我们来进行控制,我们会及时为您处理。
+    <br />
+    (一)访问权
+    <br />
+    您可以在我们的产品与/或服务中查询或访问您的相关个人信息,包括:
+    <br />
+    账号信息:您可以通过相关产品页面随时登录您的个人账号,随时查询或访问您的账号中的个人资料信息,包括:头像、昵称、性别、个性签名。
+    <br />
+    使用信息:您可以通过相关产品页面随时访问您的使用信息,包括:收藏记录、观看历史、离线下载记录、搜索记录、上传内容、订单信息。
+    <br />
+    其他信息:如您在此访问过程中遇到操作问题的或如需获取其他前述无法获知的个人信息内容,您可通过文末提供的方式联系我们,我们将在核实您的身份后在合理期限内向您提供,但法律法规另有规定的或本政策另有约定的除外。
+    <br />
+    (二)更正/修改权
+    <br />
+    您可以在我们的产品与/或服务中更正/修改您的相关个人信息。为便于您行使您的上述权利,我们为您提供了在线自行更正/修改和向我们提出更正/修改申请两种方式。
+    <br />
+    对于您的部分个人信息,我们在产品的相关功能页面为您提供了操作指引和操作设置,您可以直接进行更正/修改,例如:“头像/昵称/性别/个性签名”信息在“手机端APP”中的更正/修改路径为:我的—设置;
+    <br />
+    对于您在行使上述权利过程中遇到的困难,或其他可能未/无法向您提供在线自行更正/修改权限的,
+    经对您的身份进行验证,且更正不影响信息的客观性和准确性的情况下,您有权对错误或不完整的信息作出更正或修改,或在特定情况下,尤其是数据错误时,通过我们公布的反馈与报错措施将您的更正/修改申请提交给我们,要求我们更正或修改您的数据,但法律法规另有规定的除外。但出于安全性和身份识别的考虑,您可能无法修改注册时提交的某些初始注册信息。
+    <br />
+    (三)注销权
+    <br />
+    我们为您提供账号注销的多种途径,您可以通过在线申请注销或联系我们的客服或通过其他我们公示的方式申请注销您的账号。在您注销账号后,您将无法再以此账号登录和使用酷乐秀旗下的相关产品与服务;该账号在酷乐秀的产品与服务使用期间已产生的但未消耗完毕的权益及未来的预期利益全部权益将被清除;该账号下的内容、信息、数据、记录将会被删除或匿名化处理(但法律法规另有规定或监管部门另有要求的除外);同时,账号一旦注销超过一定时间,将无法恢复。
+    <br />
+    (四)提前获知产品与/或服务停止运营权
+    <br />
+    我们将持续为您提供优质服务,若因特殊原因导致我们的部分或全部产品与/或服务被迫停止运营,我们将提前在显著位置或向您发送推送消息或以其他方式通知您,并将停止对您个人信息的收集,同时在超出法律法规规定的必需且最短期限后,我们将会对所持有的您的个人信息进行删除或匿名化处理。
+    <br />
+    (五)帮助反馈权
+    <br />
+    我们为您提供了多种反馈渠道,联系客服,联系电话,帮助反馈。
+    <br />
+    我们如何存储和保护您的个人信息
+    <br />
+    (一)个人信息的存储
+    <br />
+    存储地点:我们依照法律法规的规定,将您的个人信息存储于中华人民共和国境内。目前我们不存在跨境存储您的个人信息或向境外提供个人信息的场景。如需跨境存储或向境外提供个人信息的,我们会单独向您明确告知(包括出境的目的、接收方、使用方式与范围、使用内容、安全保障措施、安全风险)并再次征得您的授权同意,并严格要求接收方按照本《隐私政策》以及法律法规相关要求来处理您的个人信息;
+    <br />
+    存储期限:我们在为提供我们的产品和服务之目的所必需且最短的期间内保留您的个人信息,例如:当您使用我们的注册登录及会员功能时,我们需要收集您的手机号码,且在您提供后并在您使用该功能期间,我们需要持续为您保留您的手机号码,以向您正常提供该功能、保障您的账号和系统安全。在超出上述存储期限后,我们会对您的个人信息进行删除或匿名化处理。但您行使删除权、注销账号的或法律法规另有规定的除外(例如:《电子商务法》规定:商品和服务信息、交易信息保存时间自交易完成之日起不少于三年)。
+    <br />
+    (二)个人信息的保护措施
+    <br />
+    我们一直都极为重视保护用户的个人信息安全,为此我们采用了符合行业标准的安全技术措施及组织和管理措施保护措施以最大程度降低您的信息被泄露、毁损、误用、非授权访问、非授权披露和更改的风险。
+    <br />
+    未成年人保护
+    <br />
+    酷乐秀一直非常注重对未成年人的保护,致力于践行我们的企业社会责任。
+    <br />
+    酷乐秀的绝大部分产品与/或服务主要面向成年人提供,针对这部分产品与/或服务,我们不会主动直接向未成年人收集其个人信息,如未成年人需要使用的,应首先取得其监护人的同意(包括本政策),在监护人同意后和指导下进行使用、提交个人信息;我们希望监护人亦能积极的教育和引导未成年人增强个人信息保护意识和能力,保护未成年人个人信息安全。酷乐秀会严格履行法律规定的未成年人保护义务与责任,我们只会在法律允许、监护人同意或保护未成年人所必要的情况下收集、使用、共享、转让或披露未成年人个人信息,如果我们发现未成年人在未事先获得其监护人同意的情况下使用了我们的产品与/或服务的,我们会尽最大努力与监护人取得联系,并在监护人要求下尽快删除相关未成年人个人信息。
+    <br />
+    本《隐私政策》的更新
+    <br />
+    我们鼓励您在每次使用我们的产品或服务时都查阅我们的《隐私政策》。为了给您提供更好的服务,我们会根据产品的更新情况及法律法规的相关要求更新本《隐私政策》的条款,该更新构成本《隐私政策》的一部分。如该更新造成您在本《隐私政策》下权利的实质减少或重大变更,我们将在本政策生效前通过在显著位置提示或向您发送推送消息或以其他方式通知您,若您继续使用我们的服务,即表示您充分阅读、理解并同意受经修订的《隐私政策》的约束。为保障您的合法权益,我们建议您可以定期在我们平台的设置页面中查看本政策。
+    <br />
+    上述的“重大变更”包括但不限于:
+    <br />
+    我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息的类型、个人信息的使用方式;
+    <br />
+    我们在所有权结构、组织架构方面发生重大变化。如业务调整、破产并购引起的所有者变更;
+    <br />
+    个人信息共享、转让或公开披露的主要对象发生变化;
+    <br />
+    您参与个人信息处理方面的权利及其行使方式发生重大变化;
+    <br />
+    我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;
+    <br />
+    个人信息安全影响评估报告表明存在高风险时;
+    <br />
+    其他重要的或可能严重影响您的个人权益的情况发生时。
+    <br />
+    如何联系我们
+    <br />
+    (一)如您对本《隐私政策》的执行或使用我们的服务时遇到的与隐私保护相关的事宜有任何问题(包括问题咨询、投诉),我们专门为您提供了多种反馈通道,希望为您提供满意的解决方案:
+    <br />
+    在线客服/其他在线意见反馈通道:您可与我们平台上产品功能页面的在线客服联系或者在线提交意见反馈;
+    <br />
+    人工客服通道:您可以拨打我们的任何一部客服电话与我们联系(400-018-5077);
+    <br />
+    (二)我们会在收到您的意见及建议后,并在验证您的用户身份后的15个工作日内或法律法规规定的期限内尽快向您回复,一般情况下,我们不会因此对您收取服务费。但是,在以下情形下,您理解并知悉,我们将无法响应您的请求:
+    <br />
+    与我们履行法律法规规定的义务相关的;
+    <br />
+    与国家安全、国防安全直接相关的
+    <br />
+    与公共安全、公共卫生、重大公共利益直接相关的
+    <br />
+    与犯罪侦查、起诉和审判有关的;
+    <br />
+    有充分证据表明您存在主观恶意或滥用权利的;
+    <br />
+    出于维护您或其他个人的生命、财产重大权益但又难得到本人授权同意的;
+    <br />
+    响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
+    <br />
+    涉及商业秘密的;
+    <br />
+    法律法规规定的其他情形。
+    <br />
+    其他
+    <br />
+    (一)本《隐私政策》的解释及争议解决均应适用中华人民共和国大陆地区法律。如就本政策的签订、履行发生任何争议的,双方应尽量友好协商解决;协商不成时,任何一方均可向被告住所地享有管辖权的人民法院提起诉讼。
+    <br />
+    (二)本《隐私政策》的标题仅为方便及阅读而设,并不影响正文其中任何规定的含义或解释。
+    <br />
+  </div>
+</body>
+
+</html>

+ 2 - 2
src/business-components/section-detail/index.tsx

@@ -20,7 +20,7 @@ export default defineComponent({
     },
     border: {
       type: Boolean,
-      default: true
+      default: false
     },
     titleShow: {
       // 是否显示标题
@@ -37,7 +37,7 @@ export default defineComponent({
   render() {
     return (
       <div class={styles['section-detail']}>
-        <CellGroup>
+        <CellGroup border={this.border}>
           {this.titleShow ? (
             <Cell
               center

+ 1 - 1
src/business-components/subject-list/index.tsx

@@ -55,7 +55,7 @@ export default defineComponent({
   },
   async mounted() {
     this.checkBox = this.choiceSubjectIds as never[]
-    console.log(this.subjectList)
+    // console.log(this.subjectList)
   },
   methods: {
     onSelect(id: number) {

+ 5 - 1
src/business-components/user-detail/index.tsx

@@ -40,6 +40,10 @@ export default defineComponent({
     showType: {
       type: String as PropType<'BUY' | 'TIME'>,
       default: 'BUY'
+    },
+    border: {
+      type: Boolean,
+      default: false
     }
   },
   render() {
@@ -50,7 +54,7 @@ export default defineComponent({
           src={this.userInfo.lessonCoverUrl}
           fit="cover"
         />
-        <CellGroup class={styles.userInfo}>
+        <CellGroup class={styles.userInfo} border={this.border}>
           <Cell
             title={this.userInfo.lessonName}
             titleClass={styles.userTitle}

+ 25 - 9
src/business-components/user-list/index.tsx

@@ -1,20 +1,36 @@
-import { Image } from "vant";
-import { defineComponent } from "vue";
-import styles from './index.module.less';
+import { Image } from 'vant'
+import { defineComponent, PropType } from 'vue'
+import styles from './index.module.less'
 
-import defaultIcon from '@common/images/icon_teacher.png';
+import defaultIcon from '@common/images/icon_teacher.png'
+
+interface UserType {
+  avatar: string
+  studentName: string
+  createTime: string
+}
 
 export default defineComponent({
-  name: "UserDetail",
+  name: 'UserDetail',
+  props: {
+    users: {
+      type: Object as PropType<UserType>,
+      default: {}
+    }
+  },
   render() {
     return (
       <div class={styles['user-detail']}>
         <div class={styles['user-names']}>
-          <Image class={styles['user-logo']} src={defaultIcon} fit="cover" />
-          邓飞宇
+          <Image
+            class={styles['user-logo']}
+            src={this.users.avatar || defaultIcon}
+            fit="cover"
+          />
+          {this.users.studentName}
         </div>
-        <span class={styles['user-time']}>2022年3月31日19:26:37</span>
+        <span class={styles['user-time']}>{this.users.createTime}</span>
       </div>
     )
   }
-})
+})

BIN
src/common/images/icon_student.png


+ 8 - 1
src/components/col-result/index.module.less

@@ -11,7 +11,14 @@
     width: 90%;
     margin: 0 auto;
   }
-
+  .SMALL {
+    :global {
+      .van-empty__image {
+        width: 182px;
+        height: 161px;
+      }
+    }
+  }
   .CERT {
     :global {
       .van-empty__image {

+ 1 - 8
src/components/col-result/index.tsx

@@ -31,11 +31,7 @@ export default defineComponent({
       default: 'empty'
     },
     classImgSize: {
-      type: String as PropType<'CERT'>,
-      default: ''
-    },
-    imageSize: {
-      type: [String, Number],
+      type: String as PropType<'CERT' | 'SMALL'>,
       default: ''
     },
     btnStatus: {
@@ -92,15 +88,12 @@ export default defineComponent({
   render() {
     return (
       <div class={styles['col-result']}>
-        {/* <Image fit="cover" width="100%" src={this.img} /> */}
         <Empty
           image={this.image}
           class={styles[this.classImgSize]}
           description={this.tips}
         />
 
-        {/* { this.tips && <p class={styles.tips}>{ this.tips }</p> } */}
-
         {this.btnStatus ? (
           <Button
             class={styles.btn}

+ 1 - 1
src/router/routes-common.ts

@@ -25,7 +25,7 @@ export const rootRouter = [
     name: 'privacyProtocol',
     component: () => import('@/views/protocol/privacy'),
     meta: {
-      title: '隐私协议'
+      title: '酷乐秀隐私政策'
     }
   }
 ]

+ 8 - 0
src/router/routes-student.ts

@@ -65,6 +65,14 @@ export default [
         }
       },
       {
+        path: '/liveDetail',
+        name: 'liveDetail',
+        component: () => import('@/student/live-class/live-detail'),
+        meta: {
+          title: '直播课详情'
+        }
+      },
+      {
         path: '/memberCenter',
         name: 'memberCenter',
         component: () => import('@/student/member-center/index'),

+ 8 - 0
src/router/routes-teacher.ts

@@ -101,6 +101,14 @@ export default [
         meta: {
           title: '创建直播课'
         }
+      },
+      {
+        path: '/practiceSetting',
+        name: 'practiceSetting',
+        component: () => import('@/teacher/practice-class/practice-setting'),
+        meta: {
+          title: '创建直播课'
+        }
       }
     ]
   },

+ 89 - 13
src/student/live-class/index.tsx

@@ -1,32 +1,108 @@
-import ColHeader from "@/components/col-header";
-import ColSearch from "@/components/col-search";
-import { Sticky, Image } from "vant";
-import { defineComponent } from "vue";
+import ColHeader from '@/components/col-header'
+import ColSearch from '@/components/col-search'
+import { Sticky, Image, List } from 'vant'
+import { defineComponent } from 'vue'
 import styles from './index.module.less'
+import request from '@/helpers/request'
+import ColResult from '@/components/col-result'
+import LiveItem from './live-item'
 
 import banner from '../video-class/images/banner.png'
-import LiveItem from "./live-item";
 
 export default defineComponent({
   name: 'liveClass',
+  data() {
+    return {
+      list: [],
+      dataShow: true, // 判断是否有数据
+      loading: false,
+      finished: false,
+      params: {
+        search: '',
+        groupStatus: 'APPLY',
+        page: 1,
+        rows: 20
+      }
+    }
+  },
+  methods: {
+    onSearch(value: string) {
+      this.dataShow = true
+      this.loading = false
+      this.finished = false
+      this.list = []
+      this.params.page = 1
+      this.params.search = value
+      this.getList()
+    },
+    async getList() {
+      try {
+        let params = this.params
+        const res = await request.post(
+          '/api-student/courseGroup/queryPageCourseGroup',
+          {
+            data: {
+              ...params
+            }
+          }
+        )
+        const result = res.data || {}
+        // 处理重复请求数据
+        if (this.list.length > 0 && result.pageNo === 1) {
+          return
+        }
+        this.list = this.list.concat(result.rows || [])
+        this.finished = result.pageNo >= result.totalPage
+        this.params.page = result.pageNo + 1
+        this.dataShow = this.list.length > 0
+      } catch {}
+    },
+    onDetail(item: any) {
+      console.log(item)
+      this.$router.push({
+        path: '/liveDetail',
+        query: {
+          groupId: item.courseGroupId
+        }
+      })
+    }
+  },
   render() {
     return (
       <div>
         <Sticky offsetTop={0}>
-          <ColHeader class={styles.classHeader} border={false} background="transparent" isFixed={false} />
-          <ColSearch placeholder="请输入老师名称/课程名称" onSearch={this.onSearch} />
+          <ColHeader
+            class={styles.classHeader}
+            border={false}
+            background="transparent"
+            isFixed={false}
+          />
+          <ColSearch
+            placeholder="请输入老师名称/课程名称"
+            onSearch={this.onSearch}
+          />
         </Sticky>
 
         <div class={styles.banner}>
           <Image src={banner} />
         </div>
 
-        <div class={styles.liveList}>
-          {[1, 2, 3].map(item => (
-            <LiveItem />
-          ))}
-        </div>
+        {this.dataShow ? (
+          <List
+            v-model:loading={this.loading}
+            finished={this.finished}
+            finishedText=" "
+            class={styles.liveList}
+            onLoad={this.getList}
+          >
+            {this.list.map((item: any) => (
+              <LiveItem onClick={this.onDetail} liveInfo={item} />
+            ))}
+          </List>
+        ) : (
+          <ColResult btnStatus={false} classImgSize="SMALL" tips="暂无直播课" />
+        )}
       </div>
     )
   }
-})
+})

+ 48 - 0
src/student/live-class/live-detail.module.less

@@ -0,0 +1,48 @@
+.live-detail {
+  .introduction {
+    color: #7a7a7a;
+    line-height: 23px;
+    padding-bottom: 8px;
+  }
+
+  :global {
+    .van-tabs__wrap {
+      margin-bottom: 15px;
+    }
+  }
+
+  .tips {
+    background-color: white;
+    border-radius: 10px;
+    margin: 14px;
+    padding: var(--van-cell-vertical-padding) var(--van-cell-horizontal-padding);
+    h3 {
+      display: flex;
+      font-size: 14px;
+      font-weight: 500;
+      color: #333333;
+      line-height: 1;
+    }
+    p {
+      padding-top: 9px;
+      font-size: 12px;
+      color: #7a7a7a;
+      line-height: 23px;
+    }
+    :global {
+      .van-icon {
+        margin-right: 6px;
+      }
+    }
+  }
+
+  .btnMore {
+    display: flex;
+    justify-content: space-around;
+    :global {
+      .van-button {
+        width: 60%;
+      }
+    }
+  }
+}

+ 147 - 0
src/student/live-class/live-detail.tsx

@@ -0,0 +1,147 @@
+import CoursePlanStep from '@/business-components/course-plan-step'
+import SectionDetail from '@/business-components/section-detail'
+import UserDetail from '@/business-components/user-detail'
+import request from '@/helpers/request'
+import { state } from '@/state'
+import dayjs from 'dayjs'
+import { Icon, Sticky, Button } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './live-detail.module.less'
+import iconTips from '@common/images/icon_tips.png'
+import { orderStatus } from '@/views/order-detail/orderStatus'
+interface IProps {
+  courseTime: string
+  coursePlan: string
+  videoPosterUrl?: string
+  id?: number | string
+}
+export default defineComponent({
+  name: 'LiveDetail',
+  data() {
+    const query = this.$route.query
+    return {
+      groupId: query.groupId,
+      live: {} as any
+    }
+  },
+  computed: {
+    userInfo() {
+      const live = this.live as any
+      const planList = live.planList || []
+      const startTime = planList[0]?.startTime || new Date()
+      const endTime = planList[0]?.endTime || new Date()
+      return {
+        headUrl: live.avatar,
+        username: live.teacherName,
+        startTime:
+          `${dayjs(startTime).format('YYYY-MM-DD')} ${dayjs(startTime).format(
+            'HH:mm'
+          )}~${dayjs(endTime).format('HH:mm')}` || '',
+        buyNum: 0,
+        lessonPrice: live.coursePrice,
+        lessonNum: live.courseNum,
+        lessonDesc: live.courseIntroduce,
+        lessonCoverUrl: live.backgroundPic || live.backgroundPicTemplate,
+        lessonName: live.courseGroupName
+      }
+    },
+    courseInfo() {
+      let tempArr = [] as IProps[]
+      const coursePlanList = this.live.planList || []
+      coursePlanList.forEach((item: any) => {
+        const startTime = item.startTime || new Date()
+        const endTime = item.endTime || new Date()
+        tempArr.push({
+          courseTime: `${dayjs(startTime).format('YYYY-MM-DD')} ${dayjs(
+            startTime
+          ).format('HH:mm')}~${dayjs(endTime).format('HH:mm')}`,
+          coursePlan: item.plan
+        })
+      })
+      return tempArr || []
+    },
+    salesEndDate() {
+      const live = this.live as any
+      return dayjs(live.salesEndDate || new Date()).format('YYYY-MM-DD')
+    }
+  },
+  async mounted() {
+    try {
+      const res = await request.get(
+        '/api-student/courseGroup/queryLiveCourseInfo',
+        {
+          params: {
+            groupId: this.groupId
+          }
+        }
+      )
+      console.log(res)
+      this.live = res.data || {}
+    } catch {}
+  },
+  methods: {
+    onBuy() {
+      const live = this.live
+      orderStatus.orderType = 'LIVE'
+      orderStatus.liveInfo = {
+        courseGroupId: live.courseGroupId,
+        courseGroupName: live.courseGroupName,
+        coursePrice: live.coursePrice,
+        teacherName: live.teacherName,
+        teacherId: live.teacherId,
+        avatar: live.avatar,
+        courseInfo: this.courseInfo
+      }
+      this.$router.push({
+        path: '/orderDetail',
+        query: {
+          orderType: 'LIVE',
+          courseGroupId: live.courseGroupId
+        }
+      })
+    }
+  },
+  render() {
+    return (
+      <div class={[styles['live-detail'], 'mb12']}>
+        <UserDetail userInfo={this.userInfo} />
+        <SectionDetail>
+          <p class={styles.introduction}>{this.userInfo.lessonDesc}</p>
+        </SectionDetail>
+
+        <SectionDetail
+          title="课程列表"
+          icon="courseList"
+          contentStyle={{ paddingTop: '0' }}
+        >
+          <CoursePlanStep courseInfo={this.courseInfo} />
+        </SectionDetail>
+
+        <div class={styles.tips}>
+          <h3>
+            <Icon name={iconTips} size={15} />
+            温馨提示
+          </h3>
+          <p>
+            1、该直播课程销售截止后,报名人数若少于
+            {this.live.mixStudentNum || 0}
+            人将取消开课,已购买学员付费金额将自动返还,请您放心购买;
+            <br />
+            2、直播课教学计划中的上课时间为老师预计时间,实际上课时间以老师开启直播时间为准;
+            <br />
+            3、若您错过老师直播,可通过视频回放观看完整课程。
+          </p>
+        </div>
+        {this.courseInfo.length > 0 && (
+          <Sticky offsetBottom={0} position="bottom">
+            <div class={['btnGroup', styles.btnMore]}>
+              <Button block round type="primary" onClick={this.onBuy}>
+                立即购买
+              </Button>
+            </div>
+          </Sticky>
+        )}
+      </div>
+    )
+  }
+})

+ 59 - 19
src/student/live-class/live-item.tsx

@@ -1,33 +1,73 @@
-import { defineComponent } from "vue";
-import { Image, CellGroup, Cell } from "vant";
-import styles from './live-item.module.less';
+import { defineComponent, PropType } from 'vue'
+import { Image, CellGroup, Cell } from 'vant'
+import styles from './live-item.module.less'
+
+interface IProps {
+  backgroundPic: string
+  courseGroupId: number
+  courseGroupName: string
+  courseNum: string
+  courseStartTime: number
+  coursePrice: number
+  teacherName: string
+  teacherId: number
+  studentCount: number
+}
 
 export default defineComponent({
-  name: "liveItem",
+  name: 'liveItem',
+  props: {
+    onClick: {
+      type: Function,
+      default: (item?: any) => {}
+    },
+    liveInfo: {
+      type: Object as PropType<IProps>,
+      default: {}
+    }
+  },
   render() {
     return (
       <Cell
         center
         border={false}
         class={styles.liveItem}
+        onClick={() => this.onClick(this.liveInfo)}
         v-slots={{
-          icon: () => (<Image class={styles.liCover} fit="cover" src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" />),
-          title: () => <div>
-            <div class={[styles.liTitle, 'van-ellipsis']}>竖笛基础入门练习</div>
-            <div class={styles.liUserInfo}>
-              <p>老师:李云磊</p>
-              <p>开课时间:2月28日 19:30</p>
-            </div>
-            <div class={styles.liPrice}>
-              <p>
-                <span class={styles.price}><i>¥</i>299</span>
-                <span class={styles.classNum}>12课时</span>
-              </p>
-              <span class={styles.num}>6人已购买</span>
+          icon: () => (
+            <Image
+              class={styles.liCover}
+              fit="cover"
+              src={this.liveInfo.backgroundPic}
+            />
+          ),
+          title: () => (
+            <div>
+              <div class={[styles.liTitle, 'van-ellipsis']}>
+                {this.liveInfo.courseGroupName}
+              </div>
+              <div class={styles.liUserInfo}>
+                <p>老师:{this.liveInfo.teacherName}</p>
+                <p>开课时间:{this.liveInfo.courseStartTime}</p>
+              </div>
+              <div class={styles.liPrice}>
+                <p>
+                  <span class={styles.price}>
+                    <i>¥</i>
+                    {this.liveInfo.coursePrice}
+                  </span>
+                  <span class={styles.classNum}>
+                    {this.liveInfo.courseNum}课时
+                  </span>
+                </p>
+                <span class={styles.num}>
+                  {this.liveInfo.studentCount}人已购买
+                </span>
+              </div>
             </div>
-          </div>
+          )
         }}
       />
     )
   }
-})
+})

+ 1 - 1
src/student/video-class/video-detail.tsx

@@ -115,7 +115,7 @@ export default defineComponent({
         </SectionDetail>
 
         <Sticky offsetBottom={0} position="bottom">
-          <div class={[styles.btnGroup, styles.btnMore]}>
+          <div class={['btnGroup', styles.btnMore]}>
             <Button block round type="primary" onClick={this.onBuy}>
               立即购买
             </Button>

+ 11 - 8
src/teacher/live-class/create-components/arrange.tsx

@@ -13,7 +13,6 @@ export default defineComponent({
   data() {
     return {
       selectStatus: false,
-
       calendarList: {}
     }
   },
@@ -165,17 +164,21 @@ export default defineComponent({
       } catch {}
     },
     async onReset() {
-      if (this.selectType === 'noEnough') {
-        this.selectStatus = false
-      } else if (this.selectType === 'enough') {
+      // 是否有锁课状态 或 是锁课类型的
+      if (createState.coursePlanStatus || this.selectType === 'enough') {
         await this._unLookCourse()
+      } else if (this.selectType === 'noEnough') {
+        this.selectStatus = false
       }
       createState.coursePlanStatus = false
     },
     async onSure() {
+      const status = createState.coursePlanStatus
       await this._lookCourse(() => {
-        this.selectStatus = false
-        createState.active = 4
+        if (status) {
+          this.selectStatus = false
+          createState.active = 4
+        }
       })
     }
   },
@@ -248,13 +251,13 @@ export default defineComponent({
             </div>
             <div class={styles.selectPopupContent}>
               <p class={styles.desc}>
-                {this.selectType === 'noEnough'
+                {this.selectType === 'noEnough' && !createState.coursePlanStatus
                   ? '您所选择的上课时间未达到您输入的课时数,系统根据已选时间将自动按周顺延排课。'
                   : '您已选择以下上课时间,请确认后点击确认按'}
               </p>
               {createState.live.coursePlanList &&
                 createState.live.coursePlanList.length > 0 &&
-                this.selectType === 'enough' && (
+                createState.coursePlanStatus && (
                   <p class={styles.times}>
                     {createState.live.coursePlanList.map((item: any) => (
                       <span>

+ 19 - 9
src/teacher/live-class/live-detail.tsx

@@ -2,6 +2,7 @@ import CoursePlanStep from '@/business-components/course-plan-step'
 import SectionDetail from '@/business-components/section-detail'
 import UserDetail from '@/business-components/user-detail'
 import UserList from '@/business-components/user-list'
+import ColResult from '@/components/col-result'
 import request from '@/helpers/request'
 import { state } from '@/state'
 import dayjs from 'dayjs'
@@ -27,8 +28,8 @@ export default defineComponent({
     userInfo() {
       const live = this.live as any
       const planList = live.planList || []
-      const startTime = planList?.startTime || new Date()
-      const endTime = planList?.endTime || new Date()
+      const startTime = planList[0]?.startTime || new Date()
+      const endTime = planList[0]?.endTime || new Date()
       return {
         headUrl: state.user.data?.headUrl,
         username: state.user.data?.username,
@@ -58,6 +59,10 @@ export default defineComponent({
         })
       })
       return tempArr || []
+    },
+    studentList() {
+      const live = this.live as any
+      return live.studentList || []
     }
   },
   async mounted() {
@@ -71,7 +76,7 @@ export default defineComponent({
         }
       )
       console.log(res)
-      this.live = res.data || []
+      this.live = res.data || {}
     } catch {}
   },
   render() {
@@ -89,14 +94,19 @@ export default defineComponent({
           contentStyle={{ paddingTop: '0' }}
         >
           <Tabs color="var(--van-primary)" lineWidth={20} sticky>
-            <Tab title="全部课程" titleClass="van-hairline--bottom">
+            <Tab title="课程" titleClass="van-hairline--bottom">
               <CoursePlanStep courseInfo={this.courseInfo} />
             </Tab>
-            <Tab title="已购课程" titleClass="van-hairline--bottom">
-              {[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3].map(
-                item => (
-                  <UserList class="mb12" />
-                )
+            <Tab title="学员列表" titleClass="van-hairline--bottom">
+              {this.studentList.map((item: any) => (
+                <UserList class="mb12" users={item} />
+              ))}
+              {this.studentList.length === 0 && (
+                <ColResult
+                  tips="暂无购买学员"
+                  classImgSize="SMALL"
+                  btnStatus={false}
+                />
               )}
             </Tab>
           </Tabs>

+ 90 - 0
src/teacher/practice-class/practice-setting.module.less

@@ -0,0 +1,90 @@
+.select {
+  padding: 0 12px;
+  height: 24px;
+}
+
+.tag-list {
+  margin-top: 12px;
+  :global {
+    .van-tag {
+      margin-right: 6px;
+      margin-bottom: 6px;
+    }
+  }
+}
+
+.radio-group,
+.checkbox-group {
+  display: flex;
+  margin-top: 14px;
+  .radio:first-child {
+    :global {
+      .van-radio__label {
+        margin-left: 0;
+      }
+    }
+  }
+  .checkbox:first-child {
+    :global {
+      .van-checked__label {
+        margin-left: 0;
+      }
+    }
+  }
+}
+
+.radio {
+  :global {
+    .van-radio__icon {
+      display: none;
+    }
+    .van-tag--large {
+      width: 94px;
+      height: 30px;
+      font-size: 16px;
+      text-align: center;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+    .van-tag {
+      box-sizing: border-box;
+    }
+    .van-tag--default {
+      color: var(--van-tag-text-default-color);
+    }
+    .van-tag--primary {
+      background-color: var(--tag-bg-color);
+    }
+  }
+}
+
+.checkbox-group {
+  padding-bottom: 12px;
+}
+
+.checkbox {
+  :global {
+    .van-checkbox__icon {
+      display: none;
+    }
+    .van-tag--large {
+      width: 94px;
+      height: 30px;
+      font-size: 16px;
+      text-align: center;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+    .van-tag {
+      box-sizing: border-box;
+    }
+    .van-tag--default {
+      color: var(--van-tag-text-default-color);
+    }
+    .van-tag--primary {
+      background-color: var(--tag-bg-color);
+    }
+  }
+}

+ 206 - 0
src/teacher/practice-class/practice-setting.tsx

@@ -0,0 +1,206 @@
+import ColField from '@/components/col-field'
+import ColFieldGroup from '@/components/col-field-group'
+import SubjectModel from '@/business-components/subject-list'
+import ColPopup from '@/components/col-popup'
+import request from '@/helpers/request'
+import {
+  Form,
+  Radio,
+  RadioGroup,
+  Tag,
+  Sticky,
+  Button,
+  Field,
+  ActionSheet,
+  CheckboxGroup,
+  Checkbox
+} from 'vant'
+import { defineComponent } from 'vue'
+import styles from './practice-setting.module.less'
+
+export default defineComponent({
+  name: 'PracticeSetting',
+  data() {
+    return {
+      subjectList: [],
+      chargeType: 0,
+      chargeTypeArr: {
+        1: '是',
+        0: '否'
+      },
+      classTimeStatus: false,
+      subjectStatus: false,
+      form: {
+        subjectId: [] as any[]
+      }
+    }
+  },
+  computed: {
+    choiceSubject() {
+      // 选择的科目
+      let tempArr: any[] = []
+      this.subjectList.forEach((sub: any) => {
+        if (this.form.subjectId.includes(sub.id)) {
+          tempArr.push(sub as never)
+        }
+      })
+      return tempArr
+    }
+  },
+  async mounted() {
+    try {
+      let teacher = await request.post('/api-teacher/teacher/querySubject')
+      this.subjectList = teacher.data || []
+    } catch {}
+  },
+  methods: {
+    onSubjectOpen() {},
+    onSelect() {},
+    onChoice(item: any) {
+      // teacherState.teacherCert.subjectId = item.join(',') || ''
+      console.log(item)
+      this.form.subjectId = item
+      this.subjectStatus = false
+    }
+  },
+  render() {
+    return (
+      <Form style={{ paddingTop: '15px' }}>
+        <ColFieldGroup>
+          <ColField
+            title="可教授乐器"
+            required
+            border={false}
+            v-slots={{
+              right: () => (
+                <Button
+                  class={styles.select}
+                  round
+                  type="primary"
+                  size="small"
+                  onClick={() => (this.subjectStatus = true)}
+                >
+                  选择
+                </Button>
+              )
+            }}
+          >
+            {this.choiceSubject && this.choiceSubject.length > 0 && (
+              <CheckboxGroup
+                modelValue={this.form.subjectId}
+                class={styles['checkbox-group']}
+                disabled
+              >
+                {this.choiceSubject.map((item: any) => (
+                  <Checkbox class={styles.checkbox}>
+                    <Tag
+                      plain={true}
+                      type={'primary'}
+                      round
+                      closeable
+                      size="medium"
+                      onClose={() => {
+                        console.log(1111)
+                      }}
+                    >
+                      {item.name}
+                    </Tag>
+                  </Checkbox>
+                ))}
+              </CheckboxGroup>
+            )}
+          </ColField>
+        </ColFieldGroup>
+        <ColFieldGroup>
+          <ColField title="单课时时长" required>
+            <Field
+              name="singleMins"
+              readonly
+              isLink
+              onClick={() => {
+                this.classTimeStatus = true
+              }}
+              rules={[{ required: true, message: '请选择单课时时长' }]}
+              placeholder="请选择单课时时长"
+              v-slots={{
+                button: () => <span>分钟</span>
+              }}
+            />
+          </ColField>
+        </ColFieldGroup>
+
+        <ColFieldGroup>
+          <ColField title="单课时时长" required>
+            <Field
+              name="singleMins"
+              readonly
+              isLink
+              rules={[{ required: true, message: '请选择单课时时长' }]}
+              placeholder="请选择单课时时长"
+            />
+          </ColField>
+        </ColFieldGroup>
+
+        <ColFieldGroup>
+          <ColField title="可陪练时间段" required>
+            <Field
+              name="singleMins"
+              readonly
+              isLink
+              rules={[{ required: true, message: '请选择可陪练时间段' }]}
+              placeholder="未设置"
+            />
+          </ColField>
+        </ColFieldGroup>
+
+        <ColFieldGroup>
+          <ColField required title="是否跳过节假日" border={false}>
+            <RadioGroup
+              class={styles['radio-group']}
+              modelValue={this.chargeType}
+              onUpdate:modelValue={val => (this.chargeType = val)}
+            >
+              {Object.keys(this.chargeTypeArr).map((item: string) => {
+                const isActive = Number(item) === this.chargeType
+                const type = isActive ? 'primary' : 'default'
+                return (
+                  <Radio class={styles.radio} name={item}>
+                    <Tag size="large" plain={isActive} type={type}>
+                      {this.chargeTypeArr[item]}
+                    </Tag>
+                  </Radio>
+                )
+              })}
+            </RadioGroup>
+          </ColField>
+        </ColFieldGroup>
+
+        <Sticky offsetBottom={0} position="bottom">
+          <div class={'btnGroup'}>
+            <Button block round type="primary" native-type="submit">
+              提交
+            </Button>
+          </div>
+        </Sticky>
+
+        <ColPopup v-model={this.subjectStatus}>
+          <SubjectModel
+            max={5}
+            single
+            subjectList={this.subjectList}
+            choiceSubjectIds={this.form.subjectId}
+            onChoice={this.onChoice}
+          />
+        </ColPopup>
+
+        <ActionSheet
+          v-model:show={this.classTimeStatus}
+          // actions={createState.minutes}
+          cancelText="取消"
+          closeOnClickAction
+          onSelect={this.onSelect}
+        />
+      </Form>
+    )
+  }
+})

+ 72 - 35
src/teacher/teacher-cert/cert-two.tsx

@@ -1,15 +1,15 @@
-import { defineComponent } from "vue";
-import ColField from "@/components/col-field";
-import SubjectModel from '../../business-components/subject-list';
-import styles from './cert-two.module.less';
-import { Button, Field, Icon, Popup, Tag } from "vant";
-import { teacherState } from "./teacherState";
+import { defineComponent } from 'vue'
+import ColField from '@/components/col-field'
+import SubjectModel from '../../business-components/subject-list'
+import styles from './cert-two.module.less'
+import { Button, Field, Icon, Popup, Tag } from 'vant'
+import { teacherState } from './teacherState'
 
-import icon1 from './images/icon_1.png';
-import icon2 from './images/icon_2.png';
-import ColPopup from "@/components/col-popup";
-import request from "@/helpers/request";
-import ColFieldGroup from "@/components/col-field-group";
+import icon1 from './images/icon_1.png'
+import icon2 from './images/icon_2.png'
+import ColPopup from '@/components/col-popup'
+import request from '@/helpers/request'
+import ColFieldGroup from '@/components/col-field-group'
 
 export default defineComponent({
   name: 'cert-two',
@@ -20,22 +20,28 @@ export default defineComponent({
     }
   },
   computed: {
-    choiceSubjectIds() { // 选择的科目编号
-      let ids = teacherState.teacherCert.subjectId ? teacherState.teacherCert.subjectId.split(',') : [];
+    choiceSubjectIds() {
+      // 选择的科目编号
+      let ids = teacherState.teacherCert.subjectId
+        ? teacherState.teacherCert.subjectId.split(',')
+        : []
       ids = ids.map((item: any) => Number(item))
       return ids
     },
-    subjectList() { // 学科列表
+    subjectList() {
+      // 学科列表
       return teacherState.subjectList || []
     },
-    choiceSubject() { // 选择的科目
+    choiceSubject() {
+      // 选择的科目
       let tempArr: any[] = []
       this.subjectList.forEach((parent: any) => {
-        parent.subjects && parent.subjects.forEach((sub: any) => {
-          if (this.choiceSubjectIds.includes(sub.id)) {
-            tempArr.push(sub as never)
-          }
-        })
+        parent.subjects &&
+          parent.subjects.forEach((sub: any) => {
+            if (this.choiceSubjectIds.includes(sub.id)) {
+              tempArr.push(sub as never)
+            }
+          })
       })
       return tempArr
     }
@@ -54,23 +60,50 @@ export default defineComponent({
     return (
       <div>
         <ColFieldGroup class={styles.items}>
-          <ColField title="可教授乐器(可多选)" border={false} required v-slots={{
-            icon: () => <Icon name={icon1} size="24" />,
-            right: () => <Button class={styles.select} round type="primary" size="small" onClick={this.onSubjectOpen}>选择</Button>
-          }}>
-            {this.choiceSubject && this.choiceSubject.length > 0 ? <div class={styles['tag-list']}>
-              {this.choiceSubject.map((item: any) => (
-                <Tag type="primary" plain round closeable size="medium">{item.name}</Tag>
-              ))}
-            </div> : null}
+          <ColField
+            title="可教授乐器(可多选)"
+            border={false}
+            required
+            v-slots={{
+              icon: () => <Icon name={icon1} size="24" />,
+              right: () => (
+                <Button
+                  class={styles.select}
+                  round
+                  type="primary"
+                  size="small"
+                  onClick={this.onSubjectOpen}
+                >
+                  选择
+                </Button>
+              )
+            }}
+          >
+            {this.choiceSubject && this.choiceSubject.length > 0 ? (
+              <div class={styles['tag-list']}>
+                {this.choiceSubject.map((item: any) => (
+                  <Tag type="primary" plain round closeable size="medium">
+                    {item.name}
+                  </Tag>
+                ))}
+              </div>
+            ) : null}
           </ColField>
         </ColFieldGroup>
 
         <ColFieldGroup class={styles.items}>
-          <ColField title="个人简介" border={false} v-slots={{
-            icon: () => <Icon name={icon2} size="24" />,
-            right: () => <div class={styles.limit}>{teacherState.teacherCert.introduction.length}/200</div>
-          }}>
+          <ColField
+            title="个人简介"
+            border={false}
+            v-slots={{
+              icon: () => <Icon name={icon2} size="24" />,
+              right: () => (
+                <div class={styles.limit}>
+                  {teacherState.teacherCert.introduction.length}/200
+                </div>
+              )
+            }}
+          >
             <Field
               v-model={teacherState.teacherCert.introduction}
               rows="3"
@@ -82,9 +115,13 @@ export default defineComponent({
         </ColFieldGroup>
 
         <ColPopup v-model={this.subjectStatus}>
-          <SubjectModel subjectList={this.subjectList} choiceSubjectIds={this.choiceSubjectIds} onChoice={this.onChoice} />
+          <SubjectModel
+            subjectList={this.subjectList}
+            choiceSubjectIds={this.choiceSubjectIds}
+            onChoice={this.onChoice}
+          />
         </ColPopup>
       </div>
     )
   }
-})
+})

+ 57 - 32
src/teacher/video-class/video-detail.tsx

@@ -1,14 +1,14 @@
-import CourseVideoItem from "@/business-components/course-video-item";
-import SectionDetail from "@/business-components/section-detail";
-import UserDetail from "@/business-components/user-detail";
-import UserList from "@/business-components/user-list";
-import { List, Tab, Tabs } from "vant";
-import { defineComponent } from "vue";
-import { state } from "@/state";
-import styles from './video-detail.module.less';
-import request from "@/helpers/request";
-import { group } from "console";
-import ColResult from "@/components/col-result";
+import CourseVideoItem from '@/business-components/course-video-item'
+import SectionDetail from '@/business-components/section-detail'
+import UserDetail from '@/business-components/user-detail'
+import UserList from '@/business-components/user-list'
+import { List, Tab, Tabs } from 'vant'
+import { defineComponent } from 'vue'
+import { state } from '@/state'
+import styles from './video-detail.module.less'
+import request from '@/helpers/request'
+import { group } from 'console'
+import ColResult from '@/components/col-result'
 export default defineComponent({
   name: 'VideoDetail',
   data() {
@@ -29,13 +29,16 @@ export default defineComponent({
   },
   async mounted() {
     try {
-      const res = await request.get('/api-teacher/videoLessonGroup/selectVideoLesson', {
-        params: {
-          groupId: this.params.groupId
+      const res = await request.get(
+        '/api-teacher/videoLessonGroup/selectVideoLesson',
+        {
+          params: {
+            groupId: this.params.groupId
+          }
         }
-      })
+      )
       const result = res.data || {}
-      const users = state.user.data || {};
+      const users = state.user.data || {}
       this.userInfo = {
         username: users.username,
         headUrl: users.headUrl,
@@ -48,7 +51,7 @@ export default defineComponent({
       this.detailList = result.detailList || []
 
       this.getList()
-    } catch { }
+    } catch {}
   },
   methods: {
     async getList() {
@@ -70,7 +73,7 @@ export default defineComponent({
         this.dataShow = this.buyUserList.length > 0
 
         this.userInfo.buyNum = result.totalCount || 0
-      } catch { }
+      } catch {}
     },
     onPlay(detail: any) {
       this.$router.push({
@@ -90,28 +93,50 @@ export default defineComponent({
           <p class={styles.introduction}>{this.userInfo.lessonDesc}</p>
         </SectionDetail>
 
-        <SectionDetail title="课程列表" icon="courseList" titleShow={false} contentStyle={{ paddingTop: '0' }}>
+        <SectionDetail
+          title="课程列表"
+          icon="courseList"
+          titleShow={false}
+          contentStyle={{ paddingTop: '0' }}
+        >
           <Tabs color="var(--van-primary)" lineWidth={20} sticky>
             <Tab title="课程" titleClass="van-hairline--bottom">
               {this.detailList.map((item: any) => (
-                <CourseVideoItem class={'mb12'} detail={{
-                  id: item.id,
-                  title: item.videoTitle,
-                  content: item.videoContent,
-                  imgUrl: item.coverUrl
-                }} onPlay={this.onPlay} />
+                <CourseVideoItem
+                  class={'mb12'}
+                  detail={{
+                    id: item.id,
+                    title: item.videoTitle,
+                    content: item.videoContent,
+                    imgUrl: item.coverUrl
+                  }}
+                  onPlay={this.onPlay}
+                />
               ))}
             </Tab>
             <Tab title="学员列表" titleClass="van-hairline--bottom">
-              {this.dataShow ? <List v-model:loading={this.loading} finished={this.finished} finishedText='没有更多了' onLoad={this.getList}>
-                {this.buyUserList.map(item => (
-                  <UserList class="mb12" />
-                ))}
-              </List> : <ColResult btnStatus={false} tips='暂无学生购买' />}
+              {this.dataShow ? (
+                <List
+                  v-model:loading={this.loading}
+                  finished={this.finished}
+                  finishedText="没有更多了"
+                  onLoad={this.getList}
+                >
+                  {this.buyUserList.map(item => (
+                    <UserList class="mb12" users={item} />
+                  ))}
+                </List>
+              ) : (
+                <ColResult
+                  btnStatus={false}
+                  classImgSize="SMALL"
+                  tips="暂无学生购买"
+                />
+              )}
             </Tab>
           </Tabs>
         </SectionDetail>
-      </div >
+      </div>
     )
   }
-})
+})

+ 22 - 7
src/views/404/index.tsx

@@ -1,17 +1,32 @@
-import { defineComponent } from "vue";
-import styles from './index.module.less';
-import img404 from '@/common/images/404.png';
-import { Button, Image } from "vant";
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+import img404 from '@/common/images/404.png'
+import { Button, Image } from 'vant'
+import { postMessage } from '@/helpers/native-message'
+import { browser } from '@/helpers/utils'
 
 export default defineComponent({
-  name: "NotFound",
+  name: 'NotFound',
   render() {
     return (
       <div class={styles.f404}>
         <Image src={img404} />
         <p>页面找不到了</p>
-        <Button type="primary" plain round onClick={() => this.$router.back()}>返回</Button>
+        <Button
+          type="primary"
+          plain
+          round
+          onClick={() => {
+            if (browser().iPhone) {
+              postMessage({ api: 'back' })
+            } else {
+              this.$router.back()
+            }
+          }}
+        >
+          返回
+        </Button>
       </div>
     )
   }
-})
+})

+ 33 - 13
src/views/order-detail/index.tsx

@@ -1,26 +1,32 @@
 import ColProtocol from '@/components/col-protocol'
-import { Button, Icon, Popup, Sticky } from 'vant'
+import { Button, Icon, Popup, Sticky, Toast } from 'vant'
+import ColPopup from '@/components/col-popup'
 import { defineComponent } from 'vue'
+import { postMessage } from '@/helpers/native-message'
 import styles from './index.module.less'
+import OrderVideo from './order-video'
+import OrderLive from './order-live'
+import UserAuth from './userAuth'
 
-import OrderVideo from './video'
+// 调用原生支付
+// postMessage({ api: 'paymentOrder', content: { orderNo: 0 } })
+// listenerMessage({ api: 'paymentResult', callback: (res: any) => {
+//   status: 'success | fail'
+// }})
 
 import iconTips from '@common/images/icon_tips.png'
-import ColPopup from '@/components/col-popup'
-import UserAuth from './userAuth'
 import Payment from './payment'
 
-type orderType = 'VIDEO' | 'LIVE' | 'PRACTICE' | 'GOODS' | 'VIP' | 'MUSIC'
-
 export default defineComponent({
   name: 'order-detail',
   data() {
     const query = this.$route.query
     return {
-      orderType: query.type as orderType,
+      orderType: query.orderType,
       agreeStatus: false,
       popupShow: false,
-      paymentStatus: false
+      paymentStatus: false,
+      orderPrice: 0 // 支付金额
     }
   },
   methods: {
@@ -30,19 +36,33 @@ export default defineComponent({
     },
     async onSubmit() {
       // this.popupShow = true
-      this.paymentStatus = true
-      return
+      if (!this.agreeStatus) {
+        Toast('请先阅读并同意《酷乐秀平台服务协议》')
+        return
+      }
+      // return
       console.log('submit', this.$refs.orderVideo)
-      if (this.$refs.orderVideo) {
+      if (this.$refs.orderVideo && this.orderType == 'VIDEO') {
         const result = await (this as any).$refs.orderVideo.onSubmit()
         console.log(result)
+      } else if (this.$refs.orderLive && this.orderType == 'LIVE') {
+        const result = await (this as any).$refs.orderLive.onSubmit()
+        if (result) {
+          console.log(result)
+        }
+        console.log(result)
       }
     }
   },
   render() {
     return (
       <div class={styles['order-detail']}>
-        {this.orderType === 'VIDEO' && <OrderVideo ref="orderVideo" />}
+        {this.orderType === 'LIVE' && (
+          <OrderLive ref="orderLive" v-model={this.orderPrice} />
+        )}
+        {this.orderType === 'VIDEO' && (
+          <OrderVideo ref="orderVideo" v-model={this.orderPrice} />
+        )}
 
         <div class={styles.tips}>
           <h3>
@@ -66,7 +86,7 @@ export default defineComponent({
             <div class={styles.price}>
               <span class={styles.priceUnit}>¥</span>
               <span class={styles.priceNum}>
-                {(this as any).$filters.moneyFormat(99)}
+                {(this as any).$filters.moneyFormat(this.orderPrice)}
               </span>
             </div>
           </div>

+ 49 - 0
src/views/order-detail/order-live/index.module.less

@@ -0,0 +1,49 @@
+.liveOrder {
+  .title {
+    font-size: 16px;
+    font-weight: 500;
+    color: #333333;
+    line-height: 22px;
+  }
+  .titleName {
+    font-size: 16px;
+    color: #333333;
+    line-height: 24px;
+    padding-left: 8px;
+  }
+  .price {
+    font-size: 16px;
+    font-weight: 500;
+    color: #ff3535;
+    line-height: 20px;
+    i {
+      font-style: normal;
+      font-size: 14px;
+    }
+  }
+  .userLogo {
+    width: 24px;
+    height: 24px;
+    overflow: hidden;
+    border-radius: 50%;
+  }
+  .classItem {
+    font-size: 14px;
+    color: #333333;
+    line-height: 20px;
+    padding-bottom: 10px;
+    .time {
+      padding-bottom: 6px;
+    }
+    p {
+      color: var(--van-primary);
+    }
+  }
+  :global {
+    .van-cell-group {
+      margin-bottom: 10px;
+      border-radius: 8px;
+      overflow: hidden;
+    }
+  }
+}

+ 116 - 0
src/views/order-detail/order-live/index.tsx

@@ -0,0 +1,116 @@
+import { Cell, CellGroup, Image } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+
+import iconTeacher from '@common/images/icon_teacher.png'
+import { orderStatus } from '../orderStatus'
+import request from '@/helpers/request'
+
+export default defineComponent({
+  name: 'OrderLive',
+  props: {
+    modelValue: {
+      type: Number,
+      default: 0
+    }
+  },
+  methods: {
+    async onSubmit() {
+      console.log('video submit')
+      try {
+        const res = await request.post('/api-student/userOrder/executeOrder', {
+          data: {
+            orderName: '直播课购买',
+            orderDesc: '直播课购买',
+            orderType: 'LIVE',
+            actualPrice: orderStatus.liveInfo.coursePrice || 0,
+            orderInfos: [
+              {
+                goodType: 'LIVE',
+                goodName: '直播课购买',
+                bizContent: {
+                  groupId: orderStatus.liveInfo.courseGroupId
+                }
+              }
+            ]
+          }
+        })
+        return res.data
+      } catch {
+        return false
+      }
+    }
+  },
+  computed: {
+    coursePlan() {
+      const live = orderStatus.liveInfo || {}
+      return live.courseInfo || []
+    }
+  },
+  mounted() {
+    const price = orderStatus.liveInfo.coursePrice || 0
+    this.$emit('update:modelValue', price)
+  },
+  render() {
+    return (
+      <div class={styles.liveOrder}>
+        <CellGroup border={false}>
+          <Cell titleClass={styles.title} title="课程名称" />
+          <Cell
+            title={orderStatus.liveInfo.courseGroupName}
+            v-slots={{
+              default: () => (
+                <span class={styles.price}>
+                  <i>¥</i>
+                  {(this as any).$filters.moneyFormat(
+                    orderStatus.liveInfo.coursePrice
+                  )}
+                </span>
+              )
+            }}
+          />
+        </CellGroup>
+
+        <CellGroup border={false}>
+          <Cell titleClass={styles.title} title="主讲老师" />
+          <Cell
+            class={styles.titleName}
+            title={orderStatus.liveInfo.teacherName}
+            v-slots={{
+              icon: () => (
+                <Image
+                  class={styles.userLogo}
+                  src={orderStatus.liveInfo.avatar || iconTeacher}
+                />
+              )
+            }}
+          />
+        </CellGroup>
+
+        <CellGroup border={false}>
+          <Cell
+            titleClass={styles.title}
+            title="上课时间"
+            value={`(共${this.coursePlan.length}课时)`}
+          />
+          <Cell
+            v-slots={{
+              title: () => (
+                <div>
+                  {this.coursePlan.map((item: any) => (
+                    <div class={styles.classItem}>
+                      <div class={styles.time}>{item.courseTime}</div>
+                      {/* <p>19:25 - 20:00</p>
+                      <p>19:25 - 20:00</p> */}
+                    </div>
+                  ))}
+                </div>
+              )
+            }}
+          />
+        </CellGroup>
+      </div>
+      // 视频课
+    )
+  }
+})

+ 0 - 0
src/views/order-detail/video/index.module.less → src/views/order-detail/order-video/index.module.less


+ 0 - 0
src/views/order-detail/video/index.tsx → src/views/order-detail/order-video/index.tsx


+ 6 - 0
src/views/order-detail/orderStatus.ts

@@ -0,0 +1,6 @@
+import { reactive } from 'vue'
+type orderType = 'VIDEO' | 'LIVE' | 'PRACTICE' | 'GOODS' | 'VIP' | 'MUSIC'
+export const orderStatus = reactive({
+  orderType: '' as orderType, // 购买类型
+  liveInfo: {} as any // 直播购买信息
+})

+ 127 - 231
src/views/protocol/privacy.tsx

@@ -6,344 +6,240 @@ export default defineComponent({
   render() {
     return (
       <div class={styles.container}>
-        <strong>发布日期:2019-11-22</strong>
+        版本更新时间
         <br />
-        <strong>最新更新日期:2021-05-24</strong>
+        <strong>更新日期:20224月18日</strong>
         <br />
-        管乐迷(下称“管乐迷”或“本公司”)尤其重视用户(下称“用户”或“您”)的隐私和个人信息保护。《隐私保护政策》(下称“本政策”)旨在向用户说明本公司如何收集、使用、处理、存储用户个人信息以及为用户提供访问、删除、更正等处理事宜。
+        <strong>生效日期:2022年4月18日</strong>
         <br />
-        <strong class={styles.line}>
-          在使用本公司提供的软件及相关服务前,请您务必仔细阅读并充分理解本政策,尤其是以加粗、下划线等标识的条款。当您使用本公司提供的软件及相关服务时,即表示您已经同意本公司按照本政策来收集、使用、共享和保护您的相关个人信息;用户不同意本政策的任何条款或内容的,请立即停止使用本公司提供的软件及相关服务。
-        </strong>
+        版本更新提示
         <br />
-        <strong class={styles.line}>
-          【针对未成年用户及其监护人的特别提示】
-        </strong>
+        我们可能适时修订本《隐私政策》的条款,该修订构成本《隐私政策》的一部分。如该修订造成您在本《隐私政策》下权利的实质减少,我们将在修订生效前通过在主页上显著位置提示或向您发送电子邮件或以其他方式通知您。在该种情况下,若您继续使用我们的服务,即表示同意受经修订的本《隐私政策》的约束。
         <br />
-        <strong class={styles.line}>
-          如果您是未满18周岁的未成年人,应在您的监护人的陪同下阅读本政策,并在监护人的解释和指导下理解本政策,在使用本公司提供的软件及服务或者提交信息之前获得您的监护人的指导并获得同意。未成年用户或者未成年用户的监护人点击同意本政策,或者未成年用户使用本公司提供的软件及服务,或者提交个人信息的,即表示未成年用户已经获得其监护人的同意,即监护人同意本公司按照本政策收集、使用、分享、转让、披露和存储未成年用户的个人信息。如果未成年用户或其监护人不同意本政策的任何条款或内容的,请立即停止使用本公司提供的软件及相关服务。
-        </strong>
+        引言
         <br />
-        <strong class={styles.line}>
-          如果您是未满14周岁的儿童用户,请务必通知您的监护人并共同阅读本公司的《儿童个人信息保护规则》,并务必在使用本公司提供的软件及服务或者提交信息之前获得监护人的指导并获得同意。
-        </strong>
+        酷乐秀是由武汉酷乐秀科技有限公司(以下简称“酷乐秀”)为您提供的一款找谱,智能练琴,社交学习平台,问答于一体的综合音乐服务产品。酷乐秀十分重视用户的个人信息和数据。您在使用我们的服务时,我们可能会收集和使用您的相关信息。我们希望通过本《隐私政策》向您说明,在使用我们的服务时,我们如何收集、使用、储存和分享这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。本《隐私政策》与您所使用的酷乐秀服务息息相关,希望您仔细阅读,在需要时,按照本《隐私政策》的指引,作出您认为适当的选择。本《隐私政策》中涉及的相关技术词汇,我们尽量以简明扼要的表述,并提供进一步说明的链接,以便您的理解。
         <br />
-        本公司收集、使用、共享和保护用户的个人信息,是在遵守国家法律法规规定的前提下,仅出于本政策所述的以下目的,遵循正当必要、知情同意、目的明确、安全保障、依法利用的原则收集、存储、使用、转移、披露儿童个人信息。
+        您使用或继续使用我们的服务,即意味着同意我们按照本《隐私政策》收集、使用、储存和分享您的相关信息。
         <br />
-        如果您对本政策有任何疑问的,请通过本政策中公布的联系方式与本公司联系。
+        我们如何收集的信息
         <br />
-        <h2>一、本公司收集和使用儿童用户个人信息</h2>
+        您在使用我们的产品与/或服务时,我们需要/可能需要收集和使用您的一些个人信息,我们收集和使用的您的个人信息类型包括两种: 第一种:我们产品与/或服务的核心业务功能所必需的信息:此类信息为产品与/或服务正常运行的必备信息,您须授权我们收集。如您拒绝提供,您将无法正常使用我们的产品与/或服务 第二种:我们产品与/或服务的附加业务功能可能需要收集的信息:此信息为非核心业务功能所需的信息,您可以选择是否授权我们收集。如您拒绝提供,将导致附加业务功能无法实现或无法达到我们拟达到的效果,但不影响您对核心业务功能的正常使用。
+        <br />
+        <h2>(一)账号注册/登录功能</h2>
         个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。
         <br />
         1. 用户账户信息:
+        当您使用账号注册功能时,我们会收集由您主动提供给我们的一些单独或者结合识别您实名身份的信息,包括:手机号码、验证码匹配结果,并创建密码。您的密码将以加密形式进行自动存储、传输、验证,我们不会以明文方式存储、传输、验证您的密码。您在保管、输入、使用您的密码时,应当对物理环境、电子环境审慎评估,以防密码外泄。我们收集这些信息是用以完成注册程序、为您持续稳定提供专属于注册用户的产品与/或服务,并保护您的账号安全。您应知悉,手机号码和验证码匹配结果属于您的个人敏感信息,我们收集该类信息是为了满足相关法律法规的要求,如您拒绝提供可能导致您无法使用我们的此功能,请您谨慎考虑后再提供。
+        <br />
+        需要说明的是,我们的一些产品支持您使用第三方平台的账号(例如:微信)进行登录,如您使用第三方平台的账号登录的,我们将根据您的授权获取该第三方账号下的相关信息(包括:昵称、头像,具体以您的授权内容为准)以及身份验证信息(个人敏感信息)。我们收集这些信息是用于为您提供账号登录服务以及保障您的账号安全,防范安全风险。如您拒绝授权此类信息的,您将无法使用第三方平台的账号登录我们平台,但不影响我们为您提供的其他产品和服务的正常使用。
+        <br />
+        <h2>(二)服务内容展示/浏览/播放/下载/上传功能</h2>
+        我们的产品与/或服务为您提供曲谱、视频、帖子服务内容的展示、浏览、播放、下载和上传功能,在此过程中,我们会根据您使用我们产品与/或服务的具体操作收集您的一些信息,包括如下个人信息:
+        <br />
+        设备信息:包括设备MAC地址、唯一设备识别码、登录IP地址、设备型号、设备名称、设备标识、浏览器类型和设置、语言设置、操作系统和应用程序版本、接入网络的方式、网络质量数据、移动网络信息(包括运营商名称)、产品版本号、设备所在位置相关信息(包括您授权我们获取的地理位置信息)。为了收集上述基本的个人设备信息,我们将会申请访问您的设备信息的权限并根据您的授权获取相关信息。
+        <br />
+        日志信息:当您使用我们的产品与/或服务时,我们会自动收集您的个人上网记录,并作为有关操作日志、服务日志保存,包括您的浏览记录、点赞/分享/评论/互动记录、收藏/关注记录、播放记录、播放时长、访问日期和时间。
+        <br />
+        获取运行中的进程:当您使用我们的产品与/或服务时,我们会不定期获取当前设备正在运行中的进程,以用来判定本App是否在前台运行,从而使App可以正常开展业务逻辑。获取的进程信息,仅用来做App是否在前台运行的判定,不会对该信息进行存储、上传、转发操作。
+        <br />
+        位置信息:附近的人,您通过具有定位功能的移动设备使用我们的服务时,通过GPS或WiFi方式收集的您的地理位置信息;您或其他用户提供的包含您所处地理位置的实时信息,例如您提供的账户信息中包含的您所在地区信息,您或其他人上传的显示您当前或曾经所处地理位置的共享信息,您或其他人共享的照片包含的地理标记信息;您可以通过关闭定位功能,停止对您的地理位置信息的收集。
         <br />
-        用户使用本公司提供的软件及相关服务前,需要在本公司提供的软件注册账户,此时我们需要您主动填写和提供注册信息,包括姓名、性别、出生日期、所在学校、所在班级、手机号码、家庭住址、创建的用户名(ID)等信息,这些信息是本公司为用户提供考勤、教学、排课、陪练、打分等服务所必要的,如果您不提供给本公司,您可能无法使用本公司提供的软件或相关服务。
+        录音信息:当前App的核心功能是通过录音信息分析来获取频率信息,所以我们需要获取您的设备录音(麦克风)的相关权限,以用来完成当前声音频率的识别。如果您不允许App使用录音权限,该App将无法正常使用。App获取录音信息后仅用于声音分析,不会对录音信息进行存储、上传操作
         <br />
-        2. 用户使用本公司提供的软件及相关服务信息:
+        软件安装列表:近期出现不法分子通过反编译、套壳一些非法手段生成盗版的“酷乐秀”App,可能会导致您的个人信息泄露,个人权益受损。获取软件安装列表是为了从安装列表中获取到“酷乐秀”App的安装包名,包体大小,以此来判定app是否已被盗版攻击,以更好的保护您的个人权益和隐私。
         <br />
-        用户通过电脑、平板电脑或手机等智能设备访问本公司提供的软件及其相关服务时,服务器会自动记录用户的登录IP地址、网络服务商、接入网络的方式、类型及状态、网络质量数据、使用的语言、设备类别、设备型号、设备识别码、操作系统、分辨率、访问日期及时间长度等信息,以及用户登录和使用本公司提供的软件及相关服务时,用户使用的设备所在的地理位置信息。
+        我们收集这些信息是为了向您提供我们最核心的服务内容展示/播放/下载服务,如您拒绝提供上述信息和/或权限将可能导致您无法使用我们的产品与服务。请您知悉,单独的设备信息、日志信息无法识别您的身份信息。
         <br />
-        用户使用本公司提供的软件及相关服务参加直播教学、录播教学等课程时,我们会收集用户提交的信息以及系统自动记录和存储的信息,包括但不限于视频、录像、音频、照片、截图以及这些信息产生时对应的日期、时间、地点等。
+        <h2>(三)信息统计、消息推送、分享、支付</h2>
+        为了完成支付、统计、推送、地图,分享功能,我们还集成了其他的SDK,如您在我们平台上使用这类由第三方提供的服务时,您同意将由其直接收集和处理您的信息(如以嵌入代码、插件形式)。目前我们产品中包含的第三方SDK服务以及隐私政策详情请参阅《酷乐秀第三方SDK目录及其隐私政策》。
         <br />
-        3. 交易信息和付款信息:
+        <h2>(四)信息制作、发布、上传、交流互动功能</h2>
+        当您在我们的部分产品与/或服务中使用视频剪辑创作、上传、发布、社区发帖、平台内交流互动、点赞、评论、分享服务/功能时,除注册登录账户之外,您可能会主动提供相关图文/视频内容、互动信息(包括但不限于帖子、点赞/评论/分享/交流互动信息)。我们会自动收集您的上述信息,并展示您的昵称、头像、发布的信息内容。请您知悉,您发布的信息中可能包含他人的个人信息,请您务必取得他人的合法授权,避免非法泄露他人的个人信息。如您不同意我们收集上述信息,您将无法使用我们的信息发布功能,但不影响您使用我们为您提供的其他产品和服务。
         <br />
-        用户使用本公司提供的软件及相关服务的过程中,购买课程或其他服务需要向本公司进行支付,
-        <strong class={styles.line}>
-          本公司建议由未成年用户的监护人完成支付交易的整个过程,如果支付交易是由未成年用户进行,则应当在向本公司提供支付信息之前,获得其监护人的同意、授权和指导。
-        </strong>
-        本公司会收集支付交易时使用的支付工具、支付账户、银行卡号、开户银行、支付状态信息,支付日期等信息。
-        <strong class={styles.line}>
-          如果您进行支付交易时直接跳转至第三方支付页面的,该第三方将会直接收集您的支付信息,此时您的支付信息的收集、使用、存储等规则将遵循该第三方的隐私政策,请您注意事先仔细查阅。
-        </strong>
-        如果您符合本公司相关服务协议里约定的退费情形,并要求退费时,本公司需要您提供姓名、银行卡号、开户银行等信息。
+        摄像头权限:当您需要上传个人中心头像跟背景图片或者上传帖子内容里面的图片、视频的时候,拍照功能需要调取您的摄像头权限,如果您拒绝授权,可能会影响您上传个人中心头像以及背景图片,发布帖子,由此带来的不便请您理解。
         <br />
-        4.
-        用户因请假、打卡签到或其他原因通过电话、电子邮件或其他线上或线下渠道与本公司取得联系时,本公司会收集和处理该用户向本公司提供或者反馈的信息,用户的姓名、联系方式,以及本公司为了处理该用户的请求而必须向其确认的事项,并可能会保留与用户的通话、通信记录,以便本公司及时与该用户联系和沟通并处理
+        <h2>(五)下单与交付</h2>
+        当您在我们的产品与/或服务中购买商品或服务的,我们需要根据商品或服务类型收集如下部分或全部的个人信息,包括:交易商品或服务信息、收货人信息(收货人姓名、收货地址及其联系电话)(个人敏感信息)、交易金额、下单时间、订单商户、订单编号、订单状态、支付方式、支付账号、支付状态(个人敏感信息),我们收集这些信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息、提供客户服务。
         <br />
-        5.
-        本公司还可能为了改进本公司服务,提高教学和服务质量等需要,用户联系和沟通,并在此过程中收集沟通时提供的相关信息
+        <h2>(六)客服、其他用户响应功能</h2>
+        当您与我们的客服互动时或使用其他用户响应功能时(包括:在线提交意见反馈、与在线/人工客服沟通、提出我们的产品与/或服务的售后申请、行使您的相关个人信息控制权、其他客户投诉和需求),为了您的账号与系统安全,我们可能需要您先行提供账号信息,并与您之前的个人信息相匹配以验证您的用户身份。在您使用客服或其他用户响应功能时,我们可能还会需要收集您的如下个人敏感信息:联系方式(您与我们联系时使用的电话号码/电子邮箱或您向我们主动提供的其他联系方式)、您与我们的沟通信息(包括文字/图片/音视频/通话记录形式)、与您需求相关联的其他必要信息。我们收集这些信息是为了调查事实与帮助您解决问题,如您拒绝提供可能导致您无法使用我们的客服用户响应机制。
         <br />
-        6.
-        本公司在教学和服务过程中必要时向用户发出与教学或服务有关的通知或推送
+        <h2>(七)产品安全保障功能</h2>
+        我们需要收集您的一些信息来保障您使用我们的产品与/或服务时的账号与系统安全,并协助提升我们的产品与/服务的安全性和可靠性,以防产生任何危害用户、酷乐秀、社会的行为,包括您的如下个人信息:账号登录地、个人常用设备信息(例如:硬件型号、设备MAC地址、IMEI、IMSI)、登录IP地址、产品版本号、语言模式、浏览记录、网络使用习惯、服务故障信息,以及个人敏感信息:交易信息、会员实名认证信息。我们会根据上述信息来综合判断您账号、账户及交易风险、进行身份验证、客户服务、检测及防范安全事件、诈骗监测、存档和备份用途,并依法采取必要的记录、审计、分析、处置措施,一旦我们检测出存在或疑似存在账号安全风险时,我们会使用相关信息进行安全验证与风险排除,确保我们向您提供的产品和服务的安全性,以用来保障您的权益不受侵害。同时,当发生账号或系统安全问题时,我们会收集这些信息来优化我们的产品和服务
         <br />
-        7.
-        检测和防止欺诈和IT安全威胁所需的信息:本公司收集检测,调查和预防欺诈,作弊、IT安全威胁、网络漏洞、黑客攻击、计算机病毒和其他违反用户协议和适用法律的行为所需的某些信息。此数据仅用于检测,调查,预防以及在适用的情况下对此类行为进行处理,并且仅在此目的所需的最短时间内存储。如果披露信息会影响本公司检测、调查、防止此类行为的机制,则可能无法向您披露为此目的而存储的特定信息。
+        此外,为确保您设备操作环境的安全以及提供我们的产品与/或服务所必需,防止恶意程序和反作弊,我们会在您同意本《隐私政策》后获取您设备上已安装或正在运行的必要的应用/软件列表信息(包括应用/软件来源、应用/软件总体运行情况、崩溃情况、使用频率)。请您知悉,单独的应用/软件列表信息无法识别您的特定身份。
         <br />
-        8.
-        如本公司要向用户的个人信息用于本政策未载明的其他用途时,将事先获得用户的同意;如本公司将基于特定目的而收集的用户个人信息用于其他目的时,将事先获得用户的同意。
+        例外情形,另外,您充分理解并同意,我们在以下情况下收集、使用您的个人信息无需您的授权同意:
         <br />
-        9.
-        为了保障您的账号安全、交易安全以及系统运行安全,满足法律法规和我们协议规则的相关要求,在您使用我们的产品/服务过程中,经您授权我们会获取您的设备信息,包括您使用的设备属性、连接和状态信息,例如设备型号、设备标识符(如IMEI/androidID/IDFA/OPENUDID/GUID/OAID、SIM卡IMSI、ICCID信息等)、设备MAC地址、软件列表、电信运营商等软硬件特征信息。
+        与我们履行法律法规规定的义务相关的;
         <br />
-        10. 我们可能间接收集的个人信息
+        与国家安全、国防安全直接相关的;
         <br />
-        您可以选择授权我们收集和使用个人信息的场景,为向您提供个性化的服务,您可以选择使用我们提供的拓展功能,我们会在符合法律规定并根据您具体授权的情况下收集并使用如下信息。这类信息将在您选择的具体功能和业务场景中进行收集,如果您不提供这些信息,不会影响您使用管乐迷的基本功能。
+        与公共安全、公共卫生、重大公共利益直接相关的;
         <br />
-        10.1 您需要授权我们收集和使用个人信息的场景
+        与犯罪侦查、起诉、审判和判决执行直接相关的;
         <br />
-        10.1.1 基于相机授权的拓展功能
+        出于维护您或其他个人的生命、财产重大合法权益但又很难得到您本人同意的;
         <br />
-        您可以选择开启系统的相机权限,通过使用拍照、录视频等功能授权管乐迷访问您的相机,以便于您通过拍摄照片或录制视频等方式发布内容,如果您需要录制并发布有声视频时,您还需开启麦克风权限。我们会收集您上传发布的上述信息,此项功能您可以在系统权限中关闭,一旦关闭您将可能无法通过拍摄图片、视频等方式进行更换头像、上传作业等,但不会影响您享受管乐迷的基本功能。
+        所收集的信息是您自行向社会公开的或者是从合法公开的渠道(如合法的新闻报道、政府信息公开渠道)中收集到的;
         <br />
-        10.1.2 基于相册授权的拓展功能
+        根据与您签订和履行相关协议或其他书面文件所必需的;
         <br />
-        您可以选择开启系统的相册权限,通过主动上传图片、视频等方式授权我们访问您的相册,以便于您通过上传照片或上传视频等方式发布内容。我们会收集您选择上传发布的上述信息,此项功能您可以在系统权限中关闭,一旦关闭您将可能无法通过上传图片、视频等方式进行更换头像、上传作业等,但不会影响您享受管乐迷的基本功能。
+        用于维护我们的产品与/或服务的安全稳定运行所必需的,例如发现、处置产品与/或服务的故障
         <br />
-        10.1.3 基于麦克风授权的拓展功能
+        有权机关的要求、法律法规规定的其他情形。
         <br />
-        您可以选择开启系统的麦克风权限,使用语音技术来实现录制音频作业等语音功能。我们会收集您在使用录音功能中录入的语音信息用于老师查看音频作业。此项功能您可以在系统权限中关闭,一旦关闭您将可能无法使用音频作业功能,但不会影响您享受管乐迷的基本功能。
+        我们如何使用Cookie和同类技术
         <br />
-        10.2 其他
+        (一)关于Cookie和同类技术
         <br />
-        如果我们将信息用于本政策未载明的其他用途,或者将基于特定目的收集而来的信息用于其他目的时,会单独征求您的授权同意。
+        Cookie是包含字符串的小文件,在您登入和使用网站或其他网络内容时发送、存放在您的计算机、移动设备或其他装置内(通常经过加密)。Cookie同类技术是可用于与Cookie类似用途的其他技术,例如:Web
+        Beacon、Proxy、嵌入式脚本。
         <br />
-        10.3 征得同意的例外
+        目前,我们主要使用Cookie收集您的个人信息。您知悉并同意,随着技术的发展和我们产品和服务的进一步完善,我们也可能会使用Cookie同类技术
         <br />
-        请您知悉,以下情形中,我们收集、使用个人信息无需征得您的授权同意:
+        (二)我们如何使用Cookie和同类技术
         <br />
-        10.3.1 与国家安全、国防安全有关的;
+        在您使用我们的产品与/或服务时,我们可能会使用Cookie和同类技术收集您的一些个人信息,包括:您访问网站的习惯、您的浏览信息、您的登录信息
         <br />
-        10.3.2 与公共安全、公共卫生、重大公共利益有关的;
+        如果您的浏览器允许,您可以通过您的浏览器的设置以管理、(部分/全部)拒绝Cookie与/或同类技术;或删除已经储存在您的计算机、移动设备或其他装置内的Cookie与/或同类技术,从而实现我们无法全部或部分追踪您的个人信息。您如需详细了解如何更改浏览器设置,请具体查看您使用的浏览器的相关设置页面。您理解并知悉:我们的某些产品/服务只能通过使用Cookie或同类技术才可得到实现,如您拒绝使用或删除的,您可能将无法正常使用我们的相关产品与/或服务或无法通过我们的产品与/或服务获得最佳的服务体验,同时也可能会对您的信息保护和账号安全性造成一定的影响。
         <br />
-        10.3.3 与犯罪侦查、起诉、审判和判决执行等有关的;
+        我们如何共享、转让、公开披露您的个人信息
         <br />
-        10.3.4
-        出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
+        除以下情形外,未经您同意,我们以及我们的关联公司不会与任何第三方分享您的个人信息:
         <br />
-        10.3.5 所收集的个人信息是个人信息主体自行向社会公众公开的;
+        我们以及我们的关联公司,可能将您的个人信息与我们的关联公司、合作伙伴及第三方服务供应商、承包商及代理(例如代表我们发出电子邮件或推送通知的通讯服务提供商、为我们提供位置数据的地图服务供应商)分享(他们可能并非位于您所在的法域),用作下列用途:
         <br />
-        10.3.6
-        从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道;但是您明确拒绝或者处理该信息侵害您重大利益的除外。
+        向您提供我们的服务;
         <br />
-        10.3.7 根据您的要求签订合同所必需的;
+        实现“我们可能如何使用信息”部分所述目的;
         <br />
-        10.3.8
-        用于维护所提供的产品与/或服务的安全稳定运行所必需的,例如发现、处置产品与/或服务的故障;
+        履行我们在《酷乐秀服务协议》或本《隐私政策》中的义务和行使我们的权利;
         <br />
-        10.3.9 为合法的新闻报道所必需的;
+        理解、维护和改善我们的服务。
         <br />
-        10.3.10
-        学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;
+        如我们或我们的关联公司与任何上述第三方分享您的个人信息,我们将努力确保该第三方在使用您的个人信息时遵守本《隐私政策》及我们要求其遵守的其他适当的保密和安全措施。
         <br />
-        10.3.11 法律法规规定的其他情形
+        随着我们业务的持续发展,我们以及我们的关联公司有可能进行合并、收购、资产转让或类似的交易,您的个人信息有可能作为此类交易的一部分而被转移。我们将在转移前通知您
         <br />
-        请注意,单独或与其他信息相结合无法识别您的身份或者与您直接建立联系的信息,不属于个人信息。如果我们将单独无法与任何特定个人建立联系的信息与其他信息结合用于识别自然人个人身份,或者将其与个人信息结合使用,则在结合使用期间,此类信息将被视为个人信息。
+        我们或我们的关联公司还可能为以下需要而保留、保存或披露您的个人信息:
         <br />
-        10.4 设备权限调用
+        遵守适用的法律法规;
         <br />
-        为确保相关业务功能的正常实现,我们需要根据具体的使用场景调用对应的必要权限,并在调用前向您弹窗询问,具体的权限调用说明请见下表:
+        遵守法院命令或其他法律程序的规定;
         <br />
-        <table style={{ borderWidth: '1px' }}>
-          <tr>
-            <th>设备权限</th>
-            <th>使用目的</th>
-            <th>是否询问</th>
-            <th>是否可关闭</th>
-          </tr>
-          <tr>
-            <td>相机</td>
-            <td>用于拍照、上传图片、录制视频</td>
-            <td>用户主动拍照、上传图片、录制视频时询问</td>
-            <td>是</td>
-          </tr>
-          <tr>
-            <td>麦克风</td>
-            <td>用户语音消息、音频作业、视频作业</td>
-            <td>用户发起语音输入前询问</td>
-            <td>是</td>
-          </tr>
-          <tr>
-            <td>照片</td>
-            <td>用于写入和读取用户相册信息</td>
-            <td>用户主动上传前询问</td>
-            <td>是</td>
-          </tr>
-        </table>
-        您可以在设备的设置中选择关闭部分或者全部权限,这可能导致对应的业务功能无法实现或者无法达到预期效果。
+        遵守相关政府机关的要求;
         <br />
-        <strong class={styles.line}>
-          本公司收集用户的个人信息后,可能会通过技术手段对已经收集的用户个人信息进行匿名化处理,使得用户个人信息主体无法被识别,且处理后的信息不能被复原,此时经过匿名化处理后的信息不再属于用户个人信息。本公司可能会将匿名化处理信息用于测试本公司的IT系统,研究,数据分析,改进服务,以及开发新服务、新产品和功能,以及向第三方分享、转让、披露,此时无需另行获得用户的授权同意。
-        </strong>
+        为遵守适用的法律法规、维护社会公共利益,或保护我们的客户、我们或我们的集团公司、其他用户或雇员的人身和财产安全或合法权益所合理必需的用途。
         <br />
-        <h2>二、本公司共享、转让、披露用户个人信息</h2>
-        1. 共享:
+        您对个人信息享有的控制权
         <br />
-        1.1在获取用户的明确同意或授权的情况共享;
+        您对我们产品与/或服务中的您的个人信息享有多种方式的控制权,包括:您可以访问、更正/修改、删除您的个人信息,也可以撤回之前作出的对您个人信息的同意,同时您也可以注销您的账号。为便于您行使您的上述控制权,我们在产品的相关功能页面为您提供了操作指引和操作设置,您可以自行进行操作,如您在操作过程中有疑惑或困难的可以通过文末的方式联系我们来进行控制,我们会及时为您处理。
         <br />
-        1.2根据法律法规规定,或者按照政府主管部门的强制性要求;
+        (一)访问权
         <br />
-        1.3为了向用户提供教学或服务,本公司可能会与关联方分享,但是本公司只会分享必要的个人信息,且此时受用户服务协议或本隐私政策中所声明的收集和使用之目的的约束,本公司的关联方如要改变个人信息的处理目的,将再次征求用户的授权同意;
+        您可以在我们的产品与/或服务中查询或访问您的相关个人信息,包括:
         <br />
-        1.4本公司还可以与提供与本公司提供的软件及相关服务相关的必要功能和支持服务的第三方(例如,提供或处理支付业务、网络定位服务、推送通知、电子邮件服务、税务和会计服务、分析服务)共享用户的个人信息数据,此时本公司仅会处于合法、正当、必要、特定、明确的目的共享用户的个人信息,并且只会共享提供服务所必要的信息,且此时本公司会与这些第三方主体签订保密协议,要求这些第三方主体按照相关法律法规规定、本政策及其他任何相关的保密和安全措施保护用户的个人信息。您可以通过以下链接查看第三方的数据使用和保护规则
+        账号信息:您可以通过相关产品页面随时登录您的个人账号,随时查询或访问您的账号中的个人资料信息,包括:头像、昵称、性别、个性签名。
         <br />
-        管乐迷接入第三方SDK目录
+        使用信息:您可以通过相关产品页面随时访问您的使用信息,包括:收藏记录、观看历史、离线下载记录、搜索记录、上传内容、订单信息。
         <br />
-        <table style={{ borderWidth: '1px' }}>
-          <tr>
-            <th style="width: .9rem;">使用目的</th>
-            <th>第三方名称</th>
-            <th>涉及个人信息</th>
-            <th>第三方官网链接</th>
-          </tr>
-          <tr>
-            <td rowspan="5">根据用户机型,为用户提供通知信息推送功能</td>
-            <td>极光</td>
-            <td>设备信息</td>
-            <td style="word-break: break-all;">
-              https://www.jiguang.cn/license/privacy
-            </td>
-          </tr>
-          <tr>
-            <td>华为</td>
-            <td>设备信息</td>
-            <td style="word-break: break-all;">
-              https://developer.huawei.com/consumer/cn/service/hms/pushservice.html
-            </td>
-          </tr>
-          <tr>
-            <td>小米</td>
-            <td>设备信息</td>
-            <td style="word-break: break-all;">
-              https://dev.mi.com/console/doc/detail?pId=1822
-            </td>
-          </tr>
-          <tr>
-            <td>VIVO</td>
-            <td>设备信息</td>
-            <td style="word-break: break-all;">
-              https://www.umeng.com/page/policy
-            </td>
-          </tr>
-          <tr>
-            <td>OPPO</td>
-            <td>设备信息</td>
-            <td style="word-break: break-all;">
-              https://open.oppomobile.com/wiki/doc#id=10194
-            </td>
-          </tr>
-          <tr>
-            <td>统计分析</td>
-            <td>友盟SDK</td>
-            <td>设备信息</td>
-            <td style="word-break: break-all;">
-              https://open.oppomobile.com/wiki/doc#id=10194
-            </td>
-          </tr>
-        </table>
-        2. 转让:
+        其他信息:如您在此访问过程中遇到操作问题的或如需获取其他前述无法获知的个人信息内容,您可通过文末提供的方式联系我们,我们将在核实您的身份后在合理期限内向您提供,但法律法规另有规定的或本政策另有约定的除外。
         <br />
-        2.1在获取用户的明确同意的情况下转让;
+        (二)更正/修改权
         <br />
-        2.2本公司发生合并、收购、资产转让或类似交易或者破产清算时,用户信息(包括用户的个人信息)可能会被转让给相关方,此时本公司会要求这些受让方继续遵守本政策的约束,如果这些受让方变更用户信息的使用目的时,应重新获得用户的同意和授权;
+        您可以在我们的产品与/或服务中更正/修改您的相关个人信息。为便于您行使您的上述权利,我们为您提供了在线自行更正/修改和向我们提出更正/修改申请两种方式。
         <br />
-        本公司向第三方转让用户个人信息时,将自行或委托第三方机构进行安全评估。
+        对于您的部分个人信息,我们在产品的相关功能页面为您提供了操作指引和操作设置,您可以直接进行更正/修改,例如:“头像/昵称/性别/个性签名”信息在“手机端APP”中的更正/修改路径为:我的—设置;
         <br />
-        3. 披露:
+        对于您在行使上述权利过程中遇到的困难,或其他可能未/无法向您提供在线自行更正/修改权限的,
+        经对您的身份进行验证,且更正不影响信息的客观性和准确性的情况下,您有权对错误或不完整的信息作出更正或修改,或在特定情况下,尤其是数据错误时,通过我们公布的反馈与报错措施将您的更正/修改申请提交给我们,要求我们更正或修改您的数据,但法律法规另有规定的除外。但出于安全性和身份识别的考虑,您可能无法修改注册时提交的某些初始注册信息。
         <br />
-        3.1在获取用户的要求或明确同意的情况下披露;
+        (三)注销权
         <br />
-        3.2根据法律法规规定、法院或政府主管部门的强制性要求时;
+        我们为您提供账号注销的多种途径,您可以通过在线申请注销或联系我们的客服或通过其他我们公示的方式申请注销您的账号。在您注销账号后,您将无法再以此账号登录和使用酷乐秀旗下的相关产品与服务;该账号在酷乐秀的产品与服务使用期间已产生的但未消耗完毕的权益及未来的预期利益全部权益将被清除;该账号下的内容、信息、数据、记录将会被删除或匿名化处理(但法律法规另有规定或监管部门另有要求的除外);同时,账号一旦注销超过一定时间,将无法恢复。
         <br />
-        3.3本公司发生资本市场活动(例如IPO等)时,可能需要接受其他主体的尽职调查,此时本公司可能会根据尽职调查的需要将用户的个人信息提供给必要的主体,但本公司会与实施调查的主体签订保密协议,要求这些第三方主体按照相关法律法规规定、本政策及其他任何相关的保密和安全措施来保护用户的个人信息。
+        (四)提前获知产品与/或服务停止运营权
         <br />
-        4.
-        本公司在下列情形时,无需获得用户的授权同意,即可分享、转让、披露用户的信息:
+        我们将持续为您提供优质服务,若因特殊原因导致我们的部分或全部产品与/或服务被迫停止运营,我们将提前在显著位置或向您发送推送消息或以其他方式通知您,并将停止对您个人信息的收集,同时在超出法律法规规定的必需且最短期限后,我们将会对所持有的您的个人信息进行删除或匿名化处理。
         <br />
-        4.1与国家安全、国防安全相关的;
+        (五)帮助反馈权
         <br />
-        4.2与公共安全、公共卫生、重大公共利益相关的;
+        我们为您提供了多种反馈渠道,联系客服,联系电话,帮助反馈。
         <br />
-        4.3与犯罪侦查、起诉、审判和判决执行等司法或行政执法相关的;
+        我们如何存储和保护您的个人信息
         <br />
-        4.4为了维护用户或其他个人的生命和财产等重大合法权利但又很难得到同意的情况下;
+        (一)个人信息的存储
         <br />
-        4.5用户自行向社会公开的信息;
+        存储地点:我们依照法律法规的规定,将您的个人信息存储于中华人民共和国境内。目前我们不存在跨境存储您的个人信息或向境外提供个人信息的场景。如需跨境存储或向境外提供个人信息的,我们会单独向您明确告知(包括出境的目的、接收方、使用方式与范围、使用内容、安全保障措施、安全风险)并再次征得您的授权同意,并严格要求接收方按照本《隐私政策》以及法律法规相关要求来处理您的个人信息;
         <br />
-        4.6从合法公开渠道获得的信息,如新闻报道、政府信息公开等渠道
+        存储期限:我们在为提供我们的产品和服务之目的所必需且最短的期间内保留您的个人信息,例如:当您使用我们的注册登录及会员功能时,我们需要收集您的手机号码,且在您提供后并在您使用该功能期间,我们需要持续为您保留您的手机号码,以向您正常提供该功能、保障您的账号和系统安全。在超出上述存储期限后,我们会对您的个人信息进行删除或匿名化处理。但您行使删除权、注销账号的或法律法规另有规定的除外(例如:《电子商务法》规定:商品和服务信息、交易信息保存时间自交易完成之日起不少于三年)。
         <br />
-        <h2>三、用户个人信息的保护、存储、跨境传输</h2>
-        1.
-        本公司会努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护用户的个人信息,防止用户的个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。本公司会采取一切合理可行的措施,保护用户的个人信息。
+        (二)个人信息的保护措施
         <br />
-        2.
-        本公司会采取加密等措施存储用户的个人信息,确保信息安全,并以最小授权为原则对本公司工作人员严格设置信息访问权限,控制用户个人信息知悉范围。工作人员需要访问用户个人信息的,应当经过本公司用户个人信息保护负责人或者其授权的管理人员审批,并且记录访问情况,采取技术措施,避免违法复制、下载用户个人信息。
+        我们一直都极为重视保护用户的个人信息安全,为此我们采用了符合行业标准的安全技术措施及组织和管理措施保护措施以最大程度降低您的信息被泄露、毁损、误用、非授权访问、非授权披露和更改的风险。
         <br />
-        3.
-        本公司将会采取一切合理可行的措施,确保未收集无关的用户个人信息,并只会在达成本政策所述目的所需的期限内存储和保留用户的个人信息,不会超过本政策所述目的所必需的期限,除非需要延长保留期或受到法律的允许。
+        未成年人保护
         <br />
-        4.
-        互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件或其他服务软件等与其他用户交流的方式无法确定是否完全加密,因此本公司建议用户使用此类工具时注意保护信息安全,并使用复杂密码,协助本公司保证用户的账户安全。
+        酷乐秀一直非常注重对未成年人的保护,致力于践行我们的企业社会责任。
         <br />
-        5.
-        互联网环境并非百分之白安全,本公司将尽力确保或担保用户发送给本公司的任何信息的安全性。如果本公司的物理、技术,或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改,或破坏,导致您的合法权益受损,本公司将承担相应的法律责任。
+        酷乐秀的绝大部分产品与/或服务主要面向成年人提供,针对这部分产品与/或服务,我们不会主动直接向未成年人收集其个人信息,如未成年人需要使用的,应首先取得其监护人的同意(包括本政策),在监护人同意后和指导下进行使用、提交个人信息;我们希望监护人亦能积极的教育和引导未成年人增强个人信息保护意识和能力,保护未成年人个人信息安全。酷乐秀会严格履行法律规定的未成年人保护义务与责任,我们只会在法律允许、监护人同意或保护未成年人所必要的情况下收集、使用、共享、转让或披露未成年人个人信息,如果我们发现未成年人在未事先获得其监护人同意的情况下使用了我们的产品与/或服务的,我们会尽最大努力与监护人取得联系,并在监护人要求下尽快删除相关未成年人个人信息。
         <br />
-        6.
-        本公司发现用户个人信息发生或可能发生泄露、毁损、灭失的,本公司将将立即启动应急预案,采取补救措施;造成或者可能造成严重后果的,会立即向有关主管部门报告,并将事件相关情况以邮件、信函、电话、推送通知等方式告知受影响的用户,难以逐一告知的,将会采取合理、有效的方式发布相关警示信息。包括但不限于安全事件的基本情况和可能的影响、本公司已采取或将要采取的处置措施、用户可自主防范和降低风险的建议、对用户的补救措施等。同时,本公司还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
+        本《隐私政策》的更新
         <br />
-        7.
-        本公司将用户的个人信息存储于中华人民共和国境内。如需跨境传输,本公司将依法征得用户的授权同意。
+        我们鼓励您在每次使用我们的产品或服务时都查阅我们的《隐私政策》。为了给您提供更好的服务,我们会根据产品的更新情况及法律法规的相关要求更新本《隐私政策》的条款,该更新构成本《隐私政策》的一部分。如该更新造成您在本《隐私政策》下权利的实质减少或重大变更,我们将在本政策生效前通过在显著位置提示或向您发送推送消息或以其他方式通知您,若您继续使用我们的服务,即表示您充分阅读、理解并同意受经修订的《隐私政策》的约束。为保障您的合法权益,我们建议您可以定期在我们平台的设置页面中查看本政策。
         <br />
-        8.
-        用户提供的上述信息,将在该用户使用本服务期间持续授权本公司使用。本公司停止运营软件或服务的,将会立即停止收集用户个人信息,并删除持有的用户个人信息,并将停止运营的通知及时通知用户;当该用户注销账号时,本公司将停止使用并删除上述信息。
+        上述的“重大变更”包括但不限于:
         <br />
-        <h2>四、用户的权利及其实现的途径和方法</h2>
-        1. 更正
+        我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息的类型、个人信息的使用方式;
         <br />
-        用户或一旦发现本公司收集、存储、使用、披露的用户个人信息有错误的,有权要求本公司予以更正,本公司将会及时采取措施予以更正。
+        我们在所有权结构、组织架构方面发生重大变化。如业务调整、破产并购引起的所有者变更;
         <br />
-        2. 删除
+        个人信息共享、转让或公开披露的主要对象发生变化;
         <br />
-        用户要求本公司删除其收集、存储、使用、披露的用户个人信息时,本公司将会及时采取措施予以删除,包括但不限于以下情形:
+        您参与个人信息处理方面的权利及其行使方式发生重大变化;
         <br />
-        2.1本公司违反法律、行政法规的规定或者双方的约定收集、存储、使用、转移、披露用户个人信息的
+        我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时
         <br />
-        2.2本公司超出目的范围或者必要期限收集、存储、使用、转移、披露用户个人信息的
+        个人信息安全影响评估报告表明存在高风险时
         <br />
-        2.3用户撤回授权同意的;
+        其他重要的或可能严重影响您的个人权益的情况发生时。
         <br />
-        2.4用户通过注销等方式终止使用本公司提供的软件及其相关服务的。
+        如何联系我们
         <br />
-        当本公司决定相应用户的删除请求时,本公司还将同时通知从本公司获得用户个人信息的实体,并要求其及时删除,除非法律法规另有规定,或这些实体获得了用户的独立授权。
+        (一)如您对本《隐私政策》的执行或使用我们的服务时遇到的与隐私保护相关的事宜有任何问题(包括问题咨询、投诉),我们专门为您提供了多种反馈通道,希望为您提供满意的解决方案:
         <br />
-        当用户从本公司的软件中删除信息后,本公司可能不会立即备份系统中删除相应的信息,但会在备份更新时删除这些信息。
-        3. 访问
+        在线客服/其他在线意见反馈通道:您可与我们平台上产品功能页面的在线客服联系或者在线提交意见反馈;
         <br />
-        用户有权访问该用户的个人信息,法律法规规定的例外情况除外。如果用户及其简化人希望访问、编辑、更改该用户的账户中的个人资料信息、更改密码、或关闭用户的账户等,均可以通过访问本公司提供的软件执行此类操作。如果用户无法通过本公司提供的软件访问这些个人信息,可以随时联系本公司。
+        人工客服通道:您可以拨打我们的任何一部客服电话与我们联系(400-018-5077);
         <br />
-        4.
-        在响应用户的上述请求时,为了保障安全,本公司可能要求提供书面请求,或以其他方式证明身份,本公司会验证用户身份后再处理该请求,并在30日内作出答复。在下列情形时,本公司无法响应用户的请求:
+        (二)我们会在收到您的意见及建议后,并在验证您的用户身份后的15个工作日内或法律法规规定的期限内尽快向您回复,一般情况下,我们不会因此对您收取服务费。但是,在以下情形下,您理解并知悉,我们将无法响应您的请求:
         <br />
-        4.1与国家安全、国防安全直接相关的;
+        与我们履行法律法规规定的义务相关的;
         <br />
-        4.2与公共安全、公共卫生、重大公共利益直接相关的;
+        与国家安全、国防安全直接相关的
         <br />
-        4.3与犯罪侦查、起诉、审判、执行等直接相关的;
+        与公共安全、公共卫生、重大公共利益直接相关的
         <br />
-        4.4有充分的证据表明用户存在主观恶意或滥用权利的;
+        与犯罪侦查、起诉和审判有关的;
         <br />
-        4.5响应用户的请求可能导致用户或者其他个人、组织的合法权益受到严重损害的;
+        有充分证据表明您存在主观恶意或滥用权利的;
         <br />
-        4.6涉及商业秘密的。
+        出于维护您或其他个人的生命、财产重大权益但又难得到本人授权同意的;
         <br />
-        <h2>五、关于Cookie及同类技术</h2>
-        为了确保本公司提供的软件及相关服务的正常运转,本公司会在用户的电脑或移动设备上存储名为Cookie的小数据文件。Cookie通常包含标识符、站点名称以及一些号码和字符。本公司不会将Cookie用于本政策所述目的之外的任何用途,用户可根据自己的偏好管理或删除Cookie,有关详情请参见AboutCookies.org。用户可以通过更改设置清除电脑或移动设备上保存的所有Cookie。
+        响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
         <br />
-        <h2>六、第三方链接及服务</h2>
-        <strong>
-          本政策仅适用于本公司收集的用户个人信息,本政策不适用于用户通过本公司提供的软件或服务而接入到第三方链接或服务时,该第三方收集和使用用户个人信息的行为及其结果,此时应适用该第三方链接或服务的隐私政策。
-        </strong>
+        涉及商业秘密的;
         <br />
-        <h2>七、本政策的更新</h2>
-        本公司可能会根据软件及其服务或教学的需要或者根据法律法规的规定修改本政策的全部或部分。如该等更新造成用户在本政策下权利的实质减少或重大变更的,本公司将在更新生效前通过网站公告、推送通知、弹窗提示或其他方式进行通知。用户如果不同意该等更新或变更的,可以选择停止使用本公司的软件及相关服务;如果用户继续使用本公司的软件及相关服务的,即表示用户已充分阅读、理解并同意受该等更新或变更后的本政策的约束。
+        法律法规规定的其他情形。
         <br />
-        <h2>八、本公司的联系方式</h2>
-        用户如有任何问题、意见或者建议,除本政策页首所述的联系方式以外,还可以通过以下方式与本公司联系。
+        其他
         <br />
-        电子邮箱:lexiaoyaVIP@163.com
+        (一)本《隐私政策》的解释及争议解决均应适用中华人民共和国大陆地区法律。如就本政策的签订、履行发生任何争议的,双方应尽量友好协商解决;协商不成时,任何一方均可向被告住所地享有管辖权的人民法院提起诉讼。
         <br />
-        联系电话:027-87718176
+        (二)本《隐私政策》的标题仅为方便及阅读而设,并不影响正文其中任何规定的含义或解释。
         <br />
-        开发者:武汉乐小雅网络科技有限公司
       </div>
     )
   }

+ 233 - 110
src/views/protocol/register.tsx

@@ -1,5 +1,5 @@
-import { defineComponent } from "vue";
-import styles from './index.module.less';
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
 
 export default defineComponent({
   name: 'register',
@@ -8,134 +8,257 @@ export default defineComponent({
       <div class={styles.container}>
         欢迎用户使用【管乐迷】应用软件(下称“本软件”),请用户在使用本软件前仔细阅读本协议。如用户不同意本协议任何条款,请勿在本软件注册账号或使用管乐迷基于本软件提供的服务(下称“本服务”)。用户在“注册”或“登录”时点击“同意”等按钮,即表示用户已审慎阅读、充分理解并完全接受本协议的全部内容,本协议即构成管乐迷与用户之间具有约束力的法律文件;如果用户不同意或不接受本协议任何条款,用户应立即停止注册、登录本软件或使用本服务。
         <h2>一、提示</h2>
-        1.用户在使用本软件或本服务前,应当认真阅读本协议。请用户务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、法律适用和争议解决条款。免除或者限制责任的条款将以粗体、下划线标识,用户应审慎阅读并充分理解后,自行选择接受或不接受。如用户对本协议有任何疑问,可联系管乐迷。<br />
-        2.管乐迷可以随时更新本协议的各项条款,包括但不限于增加新的服务类型或功能,更新后的协议条款一经管乐迷在本软件公布或更新即生效并取代原协议条款,该公布行为视为管乐迷已经向用户进行通知,管乐迷也可以弹窗等方式另行通知用户,此时用户点击“同意”按钮即表示用户已审慎阅读、充分理解并完全接受本协议的最新更新版本的全部内容;用户不接受本协议最新更新版本的,应立即停止使用本软件或本服务;用户继续使用本软件或本服务的,即视为用户接受本协议的最新更新版本。<br />
+        1.用户在使用本软件或本服务前,应当认真阅读本协议。请用户务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、法律适用和争议解决条款。免除或者限制责任的条款将以粗体、下划线标识,用户应审慎阅读并充分理解后,自行选择接受或不接受。如用户对本协议有任何疑问,可联系管乐迷。
+        <br />
+        2.管乐迷可以随时更新本协议的各项条款,包括但不限于增加新的服务类型或功能,更新后的协议条款一经管乐迷在本软件公布或更新即生效并取代原协议条款,该公布行为视为管乐迷已经向用户进行通知,管乐迷也可以弹窗等方式另行通知用户,此时用户点击“同意”按钮即表示用户已审慎阅读、充分理解并完全接受本协议的最新更新版本的全部内容;用户不接受本协议最新更新版本的,应立即停止使用本软件或本服务;用户继续使用本软件或本服务的,即视为用户接受本协议的最新更新版本。
+        <br />
         3.特别提醒:未满18周岁的用户应在法定监护人的陪同下阅读,并且应在法定监护人的同意和指导下注册和/或使用本软件及本服务。
-
         <h2>二、关于本软件及本服务的重要提示</h2>
         <div style="text-decoration: underline;">
-          1. 用户使用本服务需要下载本软件的客户端版本,本软件的客户端版本提供包括但不限于 iOS、安卓等多个应用版本,用户必须选择与所安装终端设备相匹配的软件版本。 用户可以直接从管乐迷的网站上获取本软件,也可以从得到管乐迷授权的第三方获取。如果用户从未经管乐迷授权的第三方获取本软件或与本软件名称相同的安装程序,管乐迷无法保证该软件能够正常使用,并对因此给用户造成的损失不予负责。下载安装程序后,用户需要按照该程序提示的步骤正确安装。<br />
-          2. 为了改善用户体验、完善服务内容,管乐迷将不断努力开发新的服务,并为用户不时提供软件更新(这些更新可能会采取软件替换、修改、功能强化、版本升级等形式)。管乐迷有权不经向用户特别通知而对本软件进行更新,或者对本软件的部分功能效果进行改变或限制。新版本发布后,旧版本的软件可能无法使用。管乐迷无法保证旧版本软件继续可用及相应的用户服务,请用户随时核对并下载最新版本。<br />
-          3. 用户理解并同意:为了向用户提供有效的服务,本软件会利用用户终端设备的处理器和带宽等资源,用户使用本软件时,需要接入互联网、移动互联网,此时可能产生数据流量的费用,用户需自行向运营商了解相关资费信息,并自行承担接入互联网、移动互联网所需的费用(包括但不限于上网费、通讯费)以及使用本软件及本服务必需的设备(包括但不限于电脑、手机等移动终端设备)。<br />
-          4. 管乐迷给予用户一项个人的、不可转让及非排他性的许可,以使用本软件。用户可以为非商业目的在单一台终端设备上安装、使用、显示、运行本软件。用户不得为商业运营目的安装、使用、运行本软件,不可以对该软件或者该软件运行过程中释放到任何计算机终端内存中的数据及该软件运行过程中客户端与服务器端的交互数据进行复制、更改、修改、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统。<br />
-          5. 管乐迷将在用户注册本软件、使用本服务的过程中,以电话、电子邮件、微信等形式进一步联系用户进行必要的确认及/或指导,用户注册本软件的行为即视为用户同意接受管乐迷以电话、电子邮件、微信等形式进行的确认及/或指导服务。<br />
-          6. 用户同意并接受,管乐迷在提供本软件或本服务的过程中,可以短信、电子邮件、应用软件内弹窗、推送等各种形式向用户投放商业性广告或向用户进行商业推广。<br />
-          7. 本协议其他条款未明示授权的其他一切权利仍由管乐迷保留,用户在行使这些权利时须另外取得管乐迷的书面许可。管乐迷如果未行使前述任何权利,并不构成对该权利的放弃。
+          1.
+          用户使用本服务需要下载本软件的客户端版本,本软件的客户端版本提供包括但不限于
+          iOS、安卓等多个应用版本,用户必须选择与所安装终端设备相匹配的软件版本。
+          用户可以直接从管乐迷的网站上获取本软件,也可以从得到管乐迷授权的第三方获取。如果用户从未经管乐迷授权的第三方获取本软件或与本软件名称相同的安装程序,管乐迷无法保证该软件能够正常使用,并对因此给用户造成的损失不予负责。下载安装程序后,用户需要按照该程序提示的步骤正确安装。
+          <br />
+          2.
+          为了改善用户体验、完善服务内容,管乐迷将不断努力开发新的服务,并为用户不时提供软件更新(这些更新可能会采取软件替换、修改、功能强化、版本升级等形式)。管乐迷有权不经向用户特别通知而对本软件进行更新,或者对本软件的部分功能效果进行改变或限制。新版本发布后,旧版本的软件可能无法使用。管乐迷无法保证旧版本软件继续可用及相应的用户服务,请用户随时核对并下载最新版本。
+          <br />
+          3.
+          用户理解并同意:为了向用户提供有效的服务,本软件会利用用户终端设备的处理器和带宽等资源,用户使用本软件时,需要接入互联网、移动互联网,此时可能产生数据流量的费用,用户需自行向运营商了解相关资费信息,并自行承担接入互联网、移动互联网所需的费用(包括但不限于上网费、通讯费)以及使用本软件及本服务必需的设备(包括但不限于电脑、手机等移动终端设备)。
+          <br />
+          4.
+          管乐迷给予用户一项个人的、不可转让及非排他性的许可,以使用本软件。用户可以为非商业目的在单一台终端设备上安装、使用、显示、运行本软件。用户不得为商业运营目的安装、使用、运行本软件,不可以对该软件或者该软件运行过程中释放到任何计算机终端内存中的数据及该软件运行过程中客户端与服务器端的交互数据进行复制、更改、修改、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统。
+          <br />
+          5.
+          管乐迷将在用户注册本软件、使用本服务的过程中,以电话、电子邮件、微信等形式进一步联系用户进行必要的确认及/或指导,用户注册本软件的行为即视为用户同意接受管乐迷以电话、电子邮件、微信等形式进行的确认及/或指导服务。
+          <br />
+          6.
+          用户同意并接受,管乐迷在提供本软件或本服务的过程中,可以短信、电子邮件、应用软件内弹窗、推送等各种形式向用户投放商业性广告或向用户进行商业推广。
+          <br />
+          7.
+          本协议其他条款未明示授权的其他一切权利仍由管乐迷保留,用户在行使这些权利时须另外取得管乐迷的书面许可。管乐迷如果未行使前述任何权利,并不构成对该权利的放弃。
         </div>
-
         <h2>三、服务内容</h2>
-        1. 本服务是基于互联网及移动互联网,通过本软件向用户提供【直播教学、学员管理】等功能服务。具体内容及具体规则还可参照管乐迷及/或本软件公示的内容。<br />
-        2. 本软件规则包括但不限于管乐迷通过官网、本软件等途径发布的全部规则、细则、解读、说明公告、弹窗、推送等,这些内容均与本协议具有同等法律效力。
-        3. 服务费用<br />
+        1.
+        本服务是基于互联网及移动互联网,通过本软件向用户提供【直播教学、学员管理】等功能服务。具体内容及具体规则还可参照管乐迷及/或本软件公示的内容。
+        <br />
+        2.
+        本软件规则包括但不限于管乐迷通过官网、本软件等途径发布的全部规则、细则、解读、说明公告、弹窗、推送等,这些内容均与本协议具有同等法律效力。
+        3. 服务费用
+        <br />
         用户使用本软件或本服务需要向管乐迷支付费用,具体费用以管乐迷向用户明确提示并与用户与管乐迷之间达成的约定为准;如果用户不向管乐迷支付费用,用户无法使用本软件或本服务的付费服务。
-
         <h2>四、用户账户注册、使用与管理</h2>
-        1. 用户资格<br />
-        用户开始使用本软件或本服务前,应当具备中华人民共和国法律规定的与用户行为相对应的民事行为能力,否则用户的法定监护人应依照法律规定承担因此而导致的一切后果。<br />
-        2. 账户说明<br />
-        用户使用本软件时,应当注册账户,注册时可以使用【手机号码】,用户应当以实名注册,并提供并填写真实、合法、准确、完整的资料和信息,并在相关信息变更时在1个工作日内在本软件更新。因用户提供或填写的资料、信息不符合上述要求而导致的任何问题及后果,应由用户自行承担,管乐迷不对此承担任何责任。当用户按照注册页面提示填写信息、阅读并同意本协议且完成全部注册程序后,用户可获得本软件账户并成为本软件用户。<br />
-        3. 账户安全规范<br />
-        3.1用户的账户由用户自行设置、保管及管理。用户应务必保管好用户的账户及密码,当用户每次使用完本软件时,应以正确步骤离开本软件。用户了解并同意,确保用户账户及密码的机密安全是用户的责任。用户将对利用该账户及密码所进行的一切行动及言论负完全的责任,并同意以下事项:<br />
-        3.1.1 用户主动泄露账户、密码或遭受他人攻击、诈骗等行为导致的损失及后果,均由用户自行承担;<br />
-        3.1.2 用户的账户只限用户本人使用,未经管乐迷事先书面同意,不得将账户提供、转让、许可、出售给任何第三方;<br />
-        3.1.3 擅自使用他人账户及密码的,管乐迷及其合法授权主体有权追究实际使用人的法律责任;<br />
-        3.1.4 用户应当设置符合本软件要求的密码,并妥善保管和保护密码,不得随意告诉他人,并定期更新密码。管乐迷同时还建议用户通过使用复杂密码等方式,不要使用过于简单的字母或数字,以保证用户的账号、密码安全;<br />
-        3.1.5 用户一旦发现任何未经授权使用用户账户访问和/或使用本软件或其他可能导致用户账户遭窃、遗失的情况的,请立即通知管乐迷。<br />
-        3.2管乐迷有权基于单方独立判断,在其认为可能发生危害交易安全等情形时,不经通知而先行暂停、中断或终止向用户提供本协议项下的全部或部分用户服务,且无需对用户或任何第三方承担任何责任。前述情形包括但不限于:<br />
-        3.2.1 管乐迷发现异常交易或有合理理由认为存在违法违规情形时;<br />
-        3.2.2 管乐迷认为用户账户被冒用或管乐迷认为存在风险的其他情形。<br />
-        4. 用户忘记或丢失账户、密码时,可以按照本软件提供的申诉途径凭初始注册资料找回账户,但管乐迷并不承诺用户忘记或丢失账户后一定能通过申诉途径找回该账户。本软件的账户或密码找回/重设机制仅负责识别用户在申诉申请上所填资料与系统记录资料的一致性,而无法识别申诉人是否系真正账户使用权人。用户因忘记或丢失账户或密码而遭致任何法律责任或损失的,用户应自行承担全部法律责任及损失,管乐迷不对此承担任何责任。<br />
-        5. 用户理解并同意,本软件同大多数互联网软件一样,可能会受多种因素影响,包括但不限于用户原因、网络服务质量、社会环境等;也可能会受各种安全问题的侵扰,包括但不限于他人非法利用用户资料,进行现实中的骚扰;用户下载安装的其他软件或访问的其他网站中可能含有病毒、木马程序或其他恶意程序,威胁用户的终端设备信息和数据安全,继而影响本软件的正常使用等。因此,用户应加强信息安全及个人信息的保护意识,注意密码保护,以免遭受损失。
-
+        1. 用户资格
+        <br />
+        用户开始使用本软件或本服务前,应当具备中华人民共和国法律规定的与用户行为相对应的民事行为能力,否则用户的法定监护人应依照法律规定承担因此而导致的一切后果。
+        <br />
+        2. 账户说明
+        <br />
+        用户使用本软件时,应当注册账户,注册时可以使用【手机号码】,用户应当以实名注册,并提供并填写真实、合法、准确、完整的资料和信息,并在相关信息变更时在1个工作日内在本软件更新。因用户提供或填写的资料、信息不符合上述要求而导致的任何问题及后果,应由用户自行承担,管乐迷不对此承担任何责任。当用户按照注册页面提示填写信息、阅读并同意本协议且完成全部注册程序后,用户可获得本软件账户并成为本软件用户。
+        <br />
+        3. 账户安全规范
+        <br />
+        3.1用户的账户由用户自行设置、保管及管理。用户应务必保管好用户的账户及密码,当用户每次使用完本软件时,应以正确步骤离开本软件。用户了解并同意,确保用户账户及密码的机密安全是用户的责任。用户将对利用该账户及密码所进行的一切行动及言论负完全的责任,并同意以下事项:
+        <br />
+        3.1.1
+        用户主动泄露账户、密码或遭受他人攻击、诈骗等行为导致的损失及后果,均由用户自行承担;
+        <br />
+        3.1.2
+        用户的账户只限用户本人使用,未经管乐迷事先书面同意,不得将账户提供、转让、许可、出售给任何第三方;
+        <br />
+        3.1.3
+        擅自使用他人账户及密码的,管乐迷及其合法授权主体有权追究实际使用人的法律责任;
+        <br />
+        3.1.4
+        用户应当设置符合本软件要求的密码,并妥善保管和保护密码,不得随意告诉他人,并定期更新密码。管乐迷同时还建议用户通过使用复杂密码等方式,不要使用过于简单的字母或数字,以保证用户的账号、密码安全;
+        <br />
+        3.1.5
+        用户一旦发现任何未经授权使用用户账户访问和/或使用本软件或其他可能导致用户账户遭窃、遗失的情况的,请立即通知管乐迷。
+        <br />
+        3.2管乐迷有权基于单方独立判断,在其认为可能发生危害交易安全等情形时,不经通知而先行暂停、中断或终止向用户提供本协议项下的全部或部分用户服务,且无需对用户或任何第三方承担任何责任。前述情形包括但不限于:
+        <br />
+        3.2.1 管乐迷发现异常交易或有合理理由认为存在违法违规情形时;
+        <br />
+        3.2.2 管乐迷认为用户账户被冒用或管乐迷认为存在风险的其他情形。
+        <br />
+        4.
+        用户忘记或丢失账户、密码时,可以按照本软件提供的申诉途径凭初始注册资料找回账户,但管乐迷并不承诺用户忘记或丢失账户后一定能通过申诉途径找回该账户。本软件的账户或密码找回/重设机制仅负责识别用户在申诉申请上所填资料与系统记录资料的一致性,而无法识别申诉人是否系真正账户使用权人。用户因忘记或丢失账户或密码而遭致任何法律责任或损失的,用户应自行承担全部法律责任及损失,管乐迷不对此承担任何责任。
+        <br />
+        5.
+        用户理解并同意,本软件同大多数互联网软件一样,可能会受多种因素影响,包括但不限于用户原因、网络服务质量、社会环境等;也可能会受各种安全问题的侵扰,包括但不限于他人非法利用用户资料,进行现实中的骚扰;用户下载安装的其他软件或访问的其他网站中可能含有病毒、木马程序或其他恶意程序,威胁用户的终端设备信息和数据安全,继而影响本软件的正常使用等。因此,用户应加强信息安全及个人信息的保护意识,注意密码保护,以免遭受损失。
         <h2>五、用户服务使用规则</h2>
-        1. 用户使用本软件或本服务时,不得实施下列行为:<br />
-        1.1 破坏宪法所确定的基本原则的;<br />
-        1.2 危害国家安全、泄露国家秘密、颠覆国家政权、破坏国家统一的;<br />
-        1.3 损害国家荣誉和利益的;<br />
-        1.4 煽动民族仇恨、民族歧视,破坏民族团结的;<br />
-        1.5 破坏国家宗教政策,宣扬邪教和封建迷信的;<br />
-        1.6 散布谣言,扰乱社会秩序,破坏社会稳定的;<br />
-        1.7 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;<br />
-        1.8 发布、传送、传播、储存侵害他人合法权益(包括但不限于隐私权、名誉权、肖像权、知识产权、商业秘密等)的内容;<br />
-        1.9 发布、传送、传播虚假、骚扰、营销、广告、诱导分享等相关的内容;<br />
-        1.10 违反法律法规或干扰、破坏管乐迷、本软件的正常运营的其他内容。<br />
-        2. 未经管乐迷事先书面同意,用户使用本软件时不得有下列行为:<br />
-        2.1以创建相同、类似或竞争服务为目的或其他非法目的访问本软件或使用本服务;<br />
-        2.2删除、遮掩、修改本软件及其副本上关于著作权的声明;<br />
-        2.3对本软件或本服务(包括但不限于服务或其内容中的广告、推广或赞助内容)进行任何形式的许可、出售、租赁、转让、发行或做其他商业用途或以其他任何方式侵犯管乐迷的合法权益;<br />
-        2.4通过修改或伪造软件运行中的指令、数据,或者增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论是否基于商业目的;<br />
-        2.5通过非管乐迷开发、授权的第三方软件、插件、外挂、系统,登录或使用本软件或本服务;<br />
-        2.6自行或者授权他人、第三方软件对本软件及其组件、模块、数据进行干扰,或在本软件或利用本服务上传或发布病毒、蠕虫、恶意代码、故意破坏或改变系统或数据的软件;<br />
-        2.7其他未经管乐迷明示授权的行为。<br />
-        3. 用户内容是指用户上传、提供信息和资料或以其他方式使用本软件与本服务时产生的所有内容(包括但不限于用户信息、资料、图片、音视频或其他内容),用户是用户内容的唯一的责任人,应当承担因用户内容披露而导致的用户或任何第三方被识别的风险。<br />
-        4. 用户充分了解并同意,用户必须为自己注册账号下的一切行为和结果负责,包括但不限于用户所发表的任何内容以及由此产生的任何后果。用户应对本服务中的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。管乐迷无法且不会对因前述风险而导致的任何损失或损害承担责任。
-
+        1. 用户使用本软件或本服务时,不得实施下列行为:
+        <br />
+        1.1 破坏宪法所确定的基本原则的;
+        <br />
+        1.2 危害国家安全、泄露国家秘密、颠覆国家政权、破坏国家统一的;
+        <br />
+        1.3 损害国家荣誉和利益的;
+        <br />
+        1.4 煽动民族仇恨、民族歧视,破坏民族团结的;
+        <br />
+        1.5 破坏国家宗教政策,宣扬邪教和封建迷信的;
+        <br />
+        1.6 散布谣言,扰乱社会秩序,破坏社会稳定的;
+        <br />
+        1.7 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;
+        <br />
+        1.8
+        发布、传送、传播、储存侵害他人合法权益(包括但不限于隐私权、名誉权、肖像权、知识产权、商业秘密等)的内容;
+        <br />
+        1.9 发布、传送、传播虚假、骚扰、营销、广告、诱导分享等相关的内容;
+        <br />
+        1.10 违反法律法规或干扰、破坏管乐迷、本软件的正常运营的其他内容。
+        <br />
+        2. 未经管乐迷事先书面同意,用户使用本软件时不得有下列行为:
+        <br />
+        2.1以创建相同、类似或竞争服务为目的或其他非法目的访问本软件或使用本服务;
+        <br />
+        2.2删除、遮掩、修改本软件及其副本上关于著作权的声明;
+        <br />
+        2.3对本软件或本服务(包括但不限于服务或其内容中的广告、推广或赞助内容)进行任何形式的许可、出售、租赁、转让、发行或做其他商业用途或以其他任何方式侵犯管乐迷的合法权益;
+        <br />
+        2.4通过修改或伪造软件运行中的指令、数据,或者增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论是否基于商业目的;
+        <br />
+        2.5通过非管乐迷开发、授权的第三方软件、插件、外挂、系统,登录或使用本软件或本服务;
+        <br />
+        2.6自行或者授权他人、第三方软件对本软件及其组件、模块、数据进行干扰,或在本软件或利用本服务上传或发布病毒、蠕虫、恶意代码、故意破坏或改变系统或数据的软件;
+        <br />
+        2.7其他未经管乐迷明示授权的行为。
+        <br />
+        3.
+        用户内容是指用户上传、提供信息和资料或以其他方式使用本软件与本服务时产生的所有内容(包括但不限于用户信息、资料、图片、音视频或其他内容),用户是用户内容的唯一的责任人,应当承担因用户内容披露而导致的用户或任何第三方被识别的风险。
+        <br />
+        4.
+        用户充分了解并同意,用户必须为自己注册账号下的一切行为和结果负责,包括但不限于用户所发表的任何内容以及由此产生的任何后果。用户应对本服务中的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。管乐迷无法且不会对因前述风险而导致的任何损失或损害承担责任。
         <h2>六、第三方链接及服务</h2>
-        1. 本软件或本服务可能保留有第三方网站或网址的链接,访问这些链接将由用户自己做出决定,管乐迷并不就这些链接上所提供的任何信息、数据、观点、图片、陈述或建议的准确性、完整性、充分性和可靠性提供承诺或保证。管乐迷没有审查过任何第三方网站,对这些网站及其内容不进行控制,也不负任何责任。如果用户决定访问任何与本站链接的第三方网站,其可能带来的结果和风险全部由用户自己承担。<br />
-        2. 用户在使用本软件中第三方提供的产品或服务时,除遵守本协议约定外,还应遵守该第三方的用户协议。管乐迷和第三方对可能出现的纠纷在法律规定和约定的范围内各自承担责任。因用户使用本软件或要求管乐迷提供特定服务时,本软件可能会调用第三方系统或者通过第三方支持用户的使用或访问,使用或访问的结果由该第三方提供(包括但不限于第三方通过公众账号提供的服务,或通过开放平台接入的内容等),管乐迷不保证通过第三方提供服务及内容的安全性、准确性、有效性及其他不确定的风险,由此若引发的任何争议及损害,与管乐迷无关,管乐迷不承担任何责任。<br />
-        3. 用户已知晓并同意管乐迷提供本服务(无论是免费服务还是付费服务)还可能基于第三方如合作单位(包括但不限于电信运营商)提供的技术支持等服务获得。如果因第三方提供的服务给用户增加任何成本或造成任何损失的,管乐迷会协助用户与第三方进行沟通和处理,如因此发生维修、更换等费用的,应由用户自行承担,管乐迷不对此承担任何法律责任和赔偿责任。
-
+        1.
+        本软件或本服务可能保留有第三方网站或网址的链接,访问这些链接将由用户自己做出决定,管乐迷并不就这些链接上所提供的任何信息、数据、观点、图片、陈述或建议的准确性、完整性、充分性和可靠性提供承诺或保证。管乐迷没有审查过任何第三方网站,对这些网站及其内容不进行控制,也不负任何责任。如果用户决定访问任何与本站链接的第三方网站,其可能带来的结果和风险全部由用户自己承担。
+        <br />
+        2.
+        用户在使用本软件中第三方提供的产品或服务时,除遵守本协议约定外,还应遵守该第三方的用户协议。管乐迷和第三方对可能出现的纠纷在法律规定和约定的范围内各自承担责任。因用户使用本软件或要求管乐迷提供特定服务时,本软件可能会调用第三方系统或者通过第三方支持用户的使用或访问,使用或访问的结果由该第三方提供(包括但不限于第三方通过公众账号提供的服务,或通过开放平台接入的内容等),管乐迷不保证通过第三方提供服务及内容的安全性、准确性、有效性及其他不确定的风险,由此若引发的任何争议及损害,与管乐迷无关,管乐迷不承担任何责任。
+        <br />
+        3.
+        用户已知晓并同意管乐迷提供本服务(无论是免费服务还是付费服务)还可能基于第三方如合作单位(包括但不限于电信运营商)提供的技术支持等服务获得。如果因第三方提供的服务给用户增加任何成本或造成任何损失的,管乐迷会协助用户与第三方进行沟通和处理,如因此发生维修、更换等费用的,应由用户自行承担,管乐迷不对此承担任何法律责任和赔偿责任。
         <h2>七、知识产权的保护以及保密</h2>
-        1. 管乐迷的商标、商号、Logo、图形及其组合,以及管乐迷的其他标识、产品和服务名称均为管乐迷或管乐迷关联公司所有,未经管乐迷书面授权,任何人不得以任何方式展示、使用或作其他处理,也不得向任何第三方表明或让其误认为用户或第三方有权展示、使用或作其他处理。<br />
-        2. 管乐迷向用户提供的培训、课程相关的全部内容(包括但不限于任何文本、图片、音视频、培训课程设置、培训课件、教材等)的知识产权均归管乐迷单独和完整所有。用户应当保护管乐迷的知识产权,只能用于自身学习之目的,未经管乐迷事先书面同意,不得擅自将培训课程相关的任何内容进行复制、复印、影音、拍摄或进行摘要、改编、汇编等措施后以发布、转让、出售、赠与或其他任何形式提供给任何第三方,或擅自以非自用目的使用,否则管乐迷有权追究其法律责任。<br />
-        3. 未经管乐迷事先同意,用户不得对授课内容录音、录像、直播或者组织多人同时观看,不得将管乐迷提供的任何资料进行复制、销售、出租或授权给任何第三方。如管乐迷发现用户存在上述行为的,有权暂停向用户提供本服务,并有权追究相关法律责任。<br />
-        4. 管乐迷为提供服务而使用的任何软件(包括但不限于软件中所含的任何图象、照片、动画、录像、录音、音乐、文字和附加程序、随附的帮助材料)的一切权利均属于该软件的著作权人,未经该软件的著作权人许可,用户不得对该软件进行反向工程(reverse engineer)、反向编译(decompile)或反汇编(disassemble)。<br />
-        5. 用户已经了解并同意:在管乐迷提供的所有服务器上的数据(包括但不限于虚拟物品等)全部归管乐迷所有。在不影响用户正常接收服务的情况下,管乐迷有权决定保留或不保留服务器上的全部或部分数据。<br />
-        6. 用户已经了解并同意:管乐迷有权将本协议项下管乐迷所有的知识产权授权第三方使用,在变更本软件或本服务运营商时,管乐迷可以将其运营的产品或服务以及与该在产品或服务相关的归管乐迷所有的知识产权转让给新的产品运营商。<br />
-        7. 用户使用管乐迷提供的本软件或本服务期间获取的文件、资料、表格等信息,包括但不限于有关合作资料、营销资料等,无论是口头、书面的或是电子文件形式的,均属管乐迷的商业秘密,用户必须对这些商业秘密严格遵守保密义务,不得向外透露,也不得使用这些商业秘密为自己或他人谋取利益。<br />
-        8. 对于用户上传至本软件的任何内容(包括但不限于资料、音视频),用户同意授权管乐迷在全世界范围内永久性、免费且不可撤销的非独家的许可,管乐迷有权对这些内容的全部或部分进行使用、复制、发行、展览展示、表演、放映、广播、修改或改编、翻译、汇编以及通过信息网络传播等。
-
+        1.
+        管乐迷的商标、商号、Logo、图形及其组合,以及管乐迷的其他标识、产品和服务名称均为管乐迷或管乐迷关联公司所有,未经管乐迷书面授权,任何人不得以任何方式展示、使用或作其他处理,也不得向任何第三方表明或让其误认为用户或第三方有权展示、使用或作其他处理。
+        <br />
+        2.
+        管乐迷向用户提供的培训、课程相关的全部内容(包括但不限于任何文本、图片、音视频、培训课程设置、培训课件、教材等)的知识产权均归管乐迷单独和完整所有。用户应当保护管乐迷的知识产权,只能用于自身学习之目的,未经管乐迷事先书面同意,不得擅自将培训课程相关的任何内容进行复制、复印、影音、拍摄或进行摘要、改编、汇编等措施后以发布、转让、出售、赠与或其他任何形式提供给任何第三方,或擅自以非自用目的使用,否则管乐迷有权追究其法律责任。
+        <br />
+        3.
+        未经管乐迷事先同意,用户不得对授课内容录音、录像、直播或者组织多人同时观看,不得将管乐迷提供的任何资料进行复制、销售、出租或授权给任何第三方。如管乐迷发现用户存在上述行为的,有权暂停向用户提供本服务,并有权追究相关法律责任。
+        <br />
+        4.
+        管乐迷为提供服务而使用的任何软件(包括但不限于软件中所含的任何图象、照片、动画、录像、录音、音乐、文字和附加程序、随附的帮助材料)的一切权利均属于该软件的著作权人,未经该软件的著作权人许可,用户不得对该软件进行反向工程(reverse
+        engineer)、反向编译(decompile)或反汇编(disassemble)。
+        <br />
+        5.
+        用户已经了解并同意:在管乐迷提供的所有服务器上的数据(包括但不限于虚拟物品等)全部归管乐迷所有。在不影响用户正常接收服务的情况下,管乐迷有权决定保留或不保留服务器上的全部或部分数据。
+        <br />
+        6.
+        用户已经了解并同意:管乐迷有权将本协议项下管乐迷所有的知识产权授权第三方使用,在变更本软件或本服务运营商时,管乐迷可以将其运营的产品或服务以及与该在产品或服务相关的归管乐迷所有的知识产权转让给新的产品运营商。
+        <br />
+        7.
+        用户使用管乐迷提供的本软件或本服务期间获取的文件、资料、表格等信息,包括但不限于有关合作资料、营销资料等,无论是口头、书面的或是电子文件形式的,均属管乐迷的商业秘密,用户必须对这些商业秘密严格遵守保密义务,不得向外透露,也不得使用这些商业秘密为自己或他人谋取利益。
+        <br />
+        8.
+        对于用户上传至本软件的任何内容(包括但不限于资料、音视频),用户同意授权管乐迷在全世界范围内永久性、免费且不可撤销的非独家的许可,管乐迷有权对这些内容的全部或部分进行使用、复制、发行、展览展示、表演、放映、广播、修改或改编、翻译、汇编以及通过信息网络传播等。
         <h2>八、违约条款</h2>
-        1. 用户违反本协议约定时即构成违约情形,管乐迷有权要求用户采取及时的补救措施,消除违约后果,并有权终止本协议。如用户的违约行为使管乐迷及/或关联公司遭受损失(包括自身的直接经济损失、商誉损失及对外支付的赔偿金、和解款、律师费、诉讼费等间接经济损失)的,用户应赔偿管乐迷及/或关联公司的上述全部损失。<br />
-        2. 用户理解并同意,如用户的行为导致第三方向管乐迷及/或关联公司主张权利或任何索赔、要求或损失的,管乐迷及/或关联公司在对第三人承担赔偿义务后可向用户追偿与此相关的全部损失。<br />
-
+        1.
+        用户违反本协议约定时即构成违约情形,管乐迷有权要求用户采取及时的补救措施,消除违约后果,并有权终止本协议。如用户的违约行为使管乐迷及/或关联公司遭受损失(包括自身的直接经济损失、商誉损失及对外支付的赔偿金、和解款、律师费、诉讼费等间接经济损失)的,用户应赔偿管乐迷及/或关联公司的上述全部损失。
+        <br />
+        2.
+        用户理解并同意,如用户的行为导致第三方向管乐迷及/或关联公司主张权利或任何索赔、要求或损失的,管乐迷及/或关联公司在对第三人承担赔偿义务后可向用户追偿与此相关的全部损失。
+        <br />
         <h2>九、协议变更、解除或终止</h2>
-        1. 管乐迷有权随时变更、暂停或终止部分或全部服务,此时若变更、暂停或终止的服务为付费服务的,管乐迷将提前在应用软件以公告通知、推送、弹窗等方式通知用户;如变更、暂停或终止的服务为免费服务的,管乐迷将不会另行通知用户,也不会对用户或第三方承担任何责任。<br />
-        2. 用户有权通过以下任一方式终止本协议:<br />
-        2.1用户自行注销用户的账户的;<br />
-        2.2变更事项生效或服务协议更新时,用户停止使用或以不点击“同意”按钮等方式明示不愿接受变更事项或更新后的服务协议的;<br />
-        2.3用户明确表示不愿继续使用本软件或本服务(包括但不限于拒绝付费、续费等),且符合本协议终止条件的。<br />
-        3. 出现以下情况时,管乐迷可以终止本协议:<br />
-        3.1用户违反本协议约定的(包括但不限于提供虚假资料、违反用户使用规则等),管乐迷依据违约条款终止本协议;<br />
-        3.2用户的账户被管乐迷依据本协议进行注销等处理的;<br />
-        3.3用户在使用本软件或本服务时存在侵犯他人合法权益或其他严重违法违规行为的;<br />
-        3.4根据相关法律法规规定管乐迷应当终止服务或管乐迷认为需终止服务的其他情形。<br />
-        4. 因不可抗力(指双方不可预见、或可以预见但不能避免并或克服的客观情况,该事件妨碍、影响或延误任何一方根据合同履行其全部或部分义务。该事件包括但不限于政府行为、法律或规定的发布或修订,自然灾害、战争、网络堵塞或中断、黑客袭击或任何其他类似事件)导致本协议不能履行的情形持续30天以上时,管乐迷与用户协商一致后,可以解除本协议。<br />
-        5. 协议终止后的处理<br />
-        本协议终止后,除法律有明确规定外,管乐迷无义务向用户或用户指定的第三方披露用户账户中的任何信息。<br />
-
+        1.
+        管乐迷有权随时变更、暂停或终止部分或全部服务,此时若变更、暂停或终止的服务为付费服务的,管乐迷将提前在应用软件以公告通知、推送、弹窗等方式通知用户;如变更、暂停或终止的服务为免费服务的,管乐迷将不会另行通知用户,也不会对用户或第三方承担任何责任。
+        <br />
+        2. 用户有权通过以下任一方式终止本协议:
+        <br />
+        2.1用户自行注销用户的账户的;
+        <br />
+        2.2变更事项生效或服务协议更新时,用户停止使用或以不点击“同意”按钮等方式明示不愿接受变更事项或更新后的服务协议的;
+        <br />
+        2.3用户明确表示不愿继续使用本软件或本服务(包括但不限于拒绝付费、续费等),且符合本协议终止条件的。
+        <br />
+        3. 出现以下情况时,管乐迷可以终止本协议:
+        <br />
+        3.1用户违反本协议约定的(包括但不限于提供虚假资料、违反用户使用规则等),管乐迷依据违约条款终止本协议;
+        <br />
+        3.2用户的账户被管乐迷依据本协议进行注销等处理的;
+        <br />
+        3.3用户在使用本软件或本服务时存在侵犯他人合法权益或其他严重违法违规行为的;
+        <br />
+        3.4根据相关法律法规规定管乐迷应当终止服务或管乐迷认为需终止服务的其他情形。
+        <br />
+        4.
+        因不可抗力(指双方不可预见、或可以预见但不能避免并或克服的客观情况,该事件妨碍、影响或延误任何一方根据合同履行其全部或部分义务。该事件包括但不限于政府行为、法律或规定的发布或修订,自然灾害、战争、网络堵塞或中断、黑客袭击或任何其他类似事件)导致本协议不能履行的情形持续30天以上时,管乐迷与用户协商一致后,可以解除本协议。
+        <br />
+        5. 协议终止后的处理
+        <br />
+        本协议终止后,除法律有明确规定外,管乐迷无义务向用户或用户指定的第三方披露用户账户中的任何信息。
+        <br />
         <h2>十、免责声明</h2>
         <div style="text-decoration: underline;">
-          1. 用户使用本软件或本服务的风险应由用户自行承担,管乐迷对本软件不作任何类型的担保,不论是明示的、默示的保证和条件,包括但不限于本软件的适销性、适用性、无病毒、无疏忽或无技术瑕疵问题、所有权和无侵权的明示或默示担保和条件,对在任何情况下因使用或不能使用本软件所产生的直接、间接、偶然、特殊及后续的损害及风险,管乐迷不承担任何责任。<br />
-          2. 管乐迷不担保本软件或本服务一定能满足用户的要求,也不对本服务的及时性、安全性、准确性作出任何保证。<br />
-          3. 用户明确理解和同意,管乐迷不对因下述任一情况而导致的损害赔偿承担责任,包括但不限于利润、商誉、使用、数据等方面的损失或其它无形损失的损害赔偿:<br />
-          3.1管乐迷向用户免费提供的任何产品或者服务;<br />
-          3.2管乐迷向用户赠送的任何产品或者服务;<br />
-          3.3对于用户使用本软件上可能涉及由第三方所有、控制或者运营的网站或平台提供的服务及其导致的风险;<br />
-          3.4因用户的过错导致的任何损失,该过错包括但不限于:决策失误、操作不当、遗忘或泄露密码、密码被他人破解、用户使用的计算机系统被第三方侵入、用户向管乐迷发送的指令信息不明确或存在歧义、用户下载非法或不明程序、用户委托他人代理交易时他人恶意或不当操作而造成的损失;<br />
-          3.5信息网络设备连接故障,电脑、通讯或其他系统出现故障,不能进行数据传输、保存的;<br />
-          3.6本软件或其服务器或设备停机检修维护期间,无论是定期还是不定期的;<br />
-          3.7不可抗力因素导致的任何损失;<br />
-          3.8管乐迷依据本协议约定终止协议时。<br />
-          4. 用户理解并同意,因管乐迷过错导致用户不能享受相应服务,管乐迷承担相应责任的最高限额不超过用户实际支付的当次服务费用总额。的其他一切权利仍由管乐迷保留,用户在行使这些权利时须另外取得管乐迷的书面许可。管乐迷如果未行使前述任何权利,并不构成对该权利的放弃。
+          1.
+          用户使用本软件或本服务的风险应由用户自行承担,管乐迷对本软件不作任何类型的担保,不论是明示的、默示的保证和条件,包括但不限于本软件的适销性、适用性、无病毒、无疏忽或无技术瑕疵问题、所有权和无侵权的明示或默示担保和条件,对在任何情况下因使用或不能使用本软件所产生的直接、间接、偶然、特殊及后续的损害及风险,管乐迷不承担任何责任。
+          <br />
+          2.
+          管乐迷不担保本软件或本服务一定能满足用户的要求,也不对本服务的及时性、安全性、准确性作出任何保证。
+          <br />
+          3.
+          用户明确理解和同意,管乐迷不对因下述任一情况而导致的损害赔偿承担责任,包括但不限于利润、商誉、使用、数据等方面的损失或其它无形损失的损害赔偿:
+          <br />
+          3.1管乐迷向用户免费提供的任何产品或者服务;
+          <br />
+          3.2管乐迷向用户赠送的任何产品或者服务;
+          <br />
+          3.3对于用户使用本软件上可能涉及由第三方所有、控制或者运营的网站或平台提供的服务及其导致的风险;
+          <br />
+          3.4因用户的过错导致的任何损失,该过错包括但不限于:决策失误、操作不当、遗忘或泄露密码、密码被他人破解、用户使用的计算机系统被第三方侵入、用户向管乐迷发送的指令信息不明确或存在歧义、用户下载非法或不明程序、用户委托他人代理交易时他人恶意或不当操作而造成的损失;
+          <br />
+          3.5信息网络设备连接故障,电脑、通讯或其他系统出现故障,不能进行数据传输、保存的;
+          <br />
+          3.6本软件或其服务器或设备停机检修维护期间,无论是定期还是不定期的;
+          <br />
+          3.7不可抗力因素导致的任何损失;
+          <br />
+          3.8管乐迷依据本协议约定终止协议时。
+          <br />
+          4.
+          用户理解并同意,因管乐迷过错导致用户不能享受相应服务,管乐迷承担相应责任的最高限额不超过用户实际支付的当次服务费用总额。的其他一切权利仍由管乐迷保留,用户在行使这些权利时须另外取得管乐迷的书面许可。管乐迷如果未行使前述任何权利,并不构成对该权利的放弃。
         </div>
-
         <h2>十一、隐私权保护政策</h2>
         管乐迷非常重视用户的隐私,用户及用户的监护人同意,管乐迷向用户提供本服务时,会收集、使用必要的用户个人信息,并将收集到的信息用于提供本服务必需的目的和场景。管乐迷不会收集与提供本服务无关的用户个人信息,具体隐私权保护政策详见管乐迷或本软件公示的《隐私政策》。
-
         <h2>十二、争议解决及适用法律</h2>
-        1. 本协议及其修订的有效性、履行、解释及争议解决,均适用中华人民共和国大陆地区法律。<br />
-        2. 用户与管乐迷之间就本协议发生的任何纠纷或争议,首先应友好协商解决,协商不成的,任何一方均有权向管乐迷所在地有管辖权的法院提起诉讼。<br />
-
+        1.
+        本协议及其修订的有效性、履行、解释及争议解决,均适用中华人民共和国大陆地区法律。
+        <br />
+        2.
+        用户与管乐迷之间就本协议发生的任何纠纷或争议,首先应友好协商解决,协商不成的,任何一方均有权向管乐迷所在地有管辖权的法院提起诉讼。
+        <br />
         <h2>十三、其他</h2>
-        1. 管乐迷在本协议项下对用户的通知可通过应用软件内弹窗、推送、电子邮件、短信或邮寄等方式进行,通过应用软件内弹窗、推送方式的,用户打开应用软件并首次遇到该弹窗、推送时视为送达完毕;以电子邮件、短信方式的,发送成功即视为送达完毕;以邮寄方式的,寄出后3个工作日后即视为送达完毕。<br />
-        2. 如本协议中的任何条款无论因何种原因导致全部或部分无效或不具有执行力的,则该条款应视为自始不存在且不影响本协议其他条款的效力,此时该条款可被新的条款所取代,以保证最大限度地接近双方意图、确保本协议要求的经济目的,以及实现原有条款的意图。<br />
-        3. 本协议中的标题仅为方便而设,本身并无实际涵义,不能作为本协议涵义解释的依据。<br />
-        4. 如用户对本软件、本服务或本协议内容有任何疑问、意见或建议,用户可联系管乐迷,<br />
-        联系电话:027-87718176,<br />
-        邮寄地址:武昌区武珞路230号绿洲广场B座1层<br />
+        1.
+        管乐迷在本协议项下对用户的通知可通过应用软件内弹窗、推送、电子邮件、短信或邮寄等方式进行,通过应用软件内弹窗、推送方式的,用户打开应用软件并首次遇到该弹窗、推送时视为送达完毕;以电子邮件、短信方式的,发送成功即视为送达完毕;以邮寄方式的,寄出后3个工作日后即视为送达完毕。
+        <br />
+        2.
+        如本协议中的任何条款无论因何种原因导致全部或部分无效或不具有执行力的,则该条款应视为自始不存在且不影响本协议其他条款的效力,此时该条款可被新的条款所取代,以保证最大限度地接近双方意图、确保本协议要求的经济目的,以及实现原有条款的意图。
+        <br />
+        3.
+        本协议中的标题仅为方便而设,本身并无实际涵义,不能作为本协议涵义解释的依据。
+        <br />
+        4.
+        如用户对本软件、本服务或本协议内容有任何疑问、意见或建议,用户可联系管乐迷,
+        <br />
+        联系电话:027-87718176,
+        <br />
+        邮寄地址:武昌区武珞路230号绿洲广场B座1层
+        <br />
         管乐迷将及时回复用户的请求。
       </div>
     )
   }
-})
+})