Browse Source

更新判断

lex 2 years ago
parent
commit
05b4e04f2a

File diff suppressed because it is too large
+ 668 - 0
public/muic-standard/index.html


BIN
public/muic-standard/云教练合奏制作规范 30261a2610e645b782f9b6c26ce79a7a/Untitled 1.png


BIN
public/muic-standard/云教练合奏制作规范 30261a2610e645b782f9b6c26ce79a7a/Untitled 2.png


BIN
public/muic-standard/云教练合奏制作规范 30261a2610e645b782f9b6c26ce79a7a/Untitled 3.png


BIN
public/muic-standard/云教练合奏制作规范 30261a2610e645b782f9b6c26ce79a7a/Untitled 4.png


BIN
public/muic-standard/云教练合奏制作规范 30261a2610e645b782f9b6c26ce79a7a/Untitled 5.png


BIN
public/muic-standard/云教练合奏制作规范 30261a2610e645b782f9b6c26ce79a7a/Untitled.png


+ 0 - 348
public/privacyProtocol.html

@@ -1,348 +0,0 @@
-<!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>

+ 6 - 0
src/constant/music.ts

@@ -46,3 +46,9 @@ export const teachershowHasBeatType = {
   0: '否',
   0: '否',
   1: '是'
   1: '是'
 }
 }
+
+/** 老师端展示是否包含节拍器类型 */
+export const teacherStyleType = {
+  HOMEMODE: '自制伴奏',
+  COMMON: '普通伴奏'
+}

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

@@ -280,7 +280,7 @@ export default defineComponent({
           <Sticky offsetBottom={0} position="bottom">
           <Sticky offsetBottom={0} position="bottom">
             <div class={['btnGroup', styles.btnMore]}>
             <div class={['btnGroup', styles.btnMore]}>
               <Button block round type="primary" onClick={this.onBuy}>
               <Button block round type="primary" onClick={this.onBuy}>
-                立即购买
+                {this.live.coursePrice <= 0 ? '免费领取' : `立即购买`}
               </Button>
               </Button>
             </div>
             </div>
           </Sticky>
           </Sticky>

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

@@ -182,7 +182,7 @@ export default defineComponent({
           <Sticky offsetBottom={0} position="bottom">
           <Sticky offsetBottom={0} position="bottom">
             <div class={['btnGroup', styles.btnMore]}>
             <div class={['btnGroup', styles.btnMore]}>
               <Button block round type="primary" onClick={this.onBuy}>
               <Button block round type="primary" onClick={this.onBuy}>
-                立即购买
+                {this.userInfo.lessonPrice <= 0 ? '免费领取' : `立即购买`}
               </Button>
               </Button>
             </div>
             </div>
           </Sticky>
           </Sticky>

+ 32 - 1
src/teacher/music/upload/index.module.less

@@ -7,7 +7,7 @@
   min-height: 100vh;
   min-height: 100vh;
   margin: 14px 0;
   margin: 14px 0;
   .area {
   .area {
-    padding: 20px;
+    padding: 20px 20px 0;
     margin-bottom: 12px;
     margin-bottom: 12px;
   }
   }
   .select {
   .select {
@@ -112,3 +112,34 @@
     font-size: 24px;
     font-size: 24px;
   }
   }
 }
 }
+
+.tips {
+  font-size: 12px;
+  color: #e0945a;
+  line-height: 18px;
+  padding: 15px 11px;
+  background: #fff3eb;
+  border-radius: 10px;
+  margin: 0 14px 12px;
+
+  .tipsTitle {
+    font-size: 14px;
+    font-weight: 600;
+    color: #e0945a;
+    line-height: 20px;
+    padding-bottom: 6px;
+  }
+
+  span {
+    color: #5aa9e0;
+  }
+}
+
+.imgContainer {
+  width: 150px;
+  height: 150px;
+  border-radius: 10px;
+  overflow: hidden;
+  margin: 0 0 12px;
+  position: relative;
+}

+ 198 - 55
src/teacher/music/upload/index.tsx

@@ -18,13 +18,15 @@ import ColFieldGroup from '@/components/col-field-group'
 // import { MusicType } from 'src/teacher/music/list/item.d'
 // import { MusicType } from 'src/teacher/music/list/item.d'
 import SubjectModel from '@/business-components/subject-list'
 import SubjectModel from '@/business-components/subject-list'
 import ColField from '@/components/col-field'
 import ColField from '@/components/col-field'
+
 import {
 import {
   teachercanEvaluateType,
   teachercanEvaluateType,
   teacherChargeType,
   teacherChargeType,
   teachershowAudiType,
   teachershowAudiType,
   teachershowFingeringType,
   teachershowFingeringType,
   teachershowHasBeatType,
   teachershowHasBeatType,
-  teacherNotationType
+  teacherNotationType,
+  teacherStyleType
 } from '@/constant/music'
 } from '@/constant/music'
 import { getXmlInfo, FormatXMLInfo } from '@/helpers/music-xml'
 import { getXmlInfo, FormatXMLInfo } from '@/helpers/music-xml'
 import Upload from './upload'
 import Upload from './upload'
@@ -36,12 +38,24 @@ import { teacherState } from '@/teacher/teacher-cert/teacherState'
 import request from '@/helpers/request'
 import request from '@/helpers/request'
 import requestOrigin from 'umi-request'
 import requestOrigin from 'umi-request'
 import UploadIcon from './upload.svg'
 import UploadIcon from './upload.svg'
+import ColUpload from '@/components/col-upload'
+import { verifyNumberIntegerAndFloat } from '@/helpers/toolsValidate'
 
 
 export type BackgroundMp3 = {
 export type BackgroundMp3 = {
   url?: string
   url?: string
   track?: string
   track?: string
 }
 }
 
 
+// 校验函数返回 true 表示校验通过,false 表示不通过
+export const validator = val => {
+  console.log(val)
+  if (Number(val) <= 0) {
+    return '收费金额必须大于0'
+  } else {
+    return true
+  }
+}
+
 export default defineComponent({
 export default defineComponent({
   name: 'MusicUpload',
   name: 'MusicUpload',
   data() {
   data() {
@@ -60,6 +74,8 @@ export default defineComponent({
       composer: '',
       composer: '',
       speed: '',
       speed: '',
       hasBeat: 0,
       hasBeat: 0,
+      titleImg: '',
+      accompanimentType: 'HOMEMODE',
       chargeType: 0,
       chargeType: 0,
       showFingering: 1,
       showFingering: 1,
       canEvaluate: 1,
       canEvaluate: 1,
@@ -184,6 +200,8 @@ export default defineComponent({
         }
         }
 
 
         this.xmlFileUrl = res.data.xmlFileUrl
         this.xmlFileUrl = res.data.xmlFileUrl
+        this.accompanimentType = res.data.accompanimentType
+        this.titleImg = res.data.titleImg
 
 
         // this.audioType = res.data.mp3Type
         // this.audioType = res.data.mp3Type
 
 
@@ -223,6 +241,8 @@ export default defineComponent({
         sourceType: 'TEACHER',
         sourceType: 'TEACHER',
         mp3Type,
         mp3Type,
         hasBeat: this.hasBeat,
         hasBeat: this.hasBeat,
+        accompanimentType: this.accompanimentType,
+        titleImg: this.titleImg,
         // url: this.hasBeat ? '' : this.mp3Url,
         // url: this.hasBeat ? '' : this.mp3Url,
         // metronomeUrl: this.hasBeat ? this.mp3Url : '',
         // metronomeUrl: this.hasBeat ? this.mp3Url : '',
         audioFileUrl: this.mp3Url,
         audioFileUrl: this.mp3Url,
@@ -271,6 +291,9 @@ export default defineComponent({
       }, 800)
       }, 800)
       console.log(vals)
       console.log(vals)
     },
     },
+    onFormatter(val: any) {
+      return verifyNumberIntegerAndFloat(val)
+    },
     getSubjectListNames(list) {
     getSubjectListNames(list) {
       const data = {}
       const data = {}
       for (const item of list) {
       for (const item of list) {
@@ -378,6 +401,24 @@ export default defineComponent({
     },
     },
     removeBackground(index: number) {
     removeBackground(index: number) {
       this.backgroundMp3s.splice(index, 1)
       this.backgroundMp3s.splice(index, 1)
+    },
+    onDetail(type: string) {
+      let url = `${location.origin}/teacher/#/registerProtocol`
+
+      if (type === 'question') {
+        // url = `${location.origin}/teacher/muic-standard/index.html`
+      } else if (type === 'music') {
+        url = `${location.origin}/teacher/muic-standard/index.html`
+      }
+
+      postMessage({
+        api: 'openWebView',
+        content: {
+          url,
+          orientation: 1,
+          isHideTitle: false
+        }
+      })
     }
     }
   },
   },
   render() {
   render() {
@@ -389,6 +430,20 @@ export default defineComponent({
           <NoticeBar wrapable scrollable={false} text={this.reason} />
           <NoticeBar wrapable scrollable={false} text={this.reason} />
         )}
         )}
         <div class={styles.container}>
         <div class={styles.container}>
+          <div class={styles.tips}>
+            <div class={styles.tipsTitle}>注意事项:</div>
+            <div class={styles.tipsContent}>
+              1、必须是上传人自己参与制作的作品。
+              <br />
+              2、歌曲及歌曲信息中请勿涉及政治、宗教、广告、涉毒、犯罪、色情、低俗、暴力、血腥、消极等违规内容,违反者直接删除内容。多次违反将封号。
+              <br />
+              3、点击查看{' '}
+              <span onClick={() => this.onDetail('protocol')}>
+                《用户注册协议》
+              </span>
+              ,如果您上传了文件,即认为您完全同意并遵守该协议的内容;
+            </div>
+          </div>
           <ColFieldGroup class={styles.area}>
           <ColFieldGroup class={styles.area}>
             <ColField border={false} required title="MusicXML文件">
             <ColField border={false} required title="MusicXML文件">
               <Field
               <Field
@@ -416,12 +471,32 @@ export default defineComponent({
                           accept=".xml"
                           accept=".xml"
                           formatFile={this.readerFile}
                           formatFile={this.readerFile}
                         />
                         />
-                        <div style={{marginLeft: '8px'}}>{this.fileName(this.xmlFileUrl)}</div>
+                        <div style={{ marginLeft: '8px' }}>
+                          {this.fileName(this.xmlFileUrl)}
+                        </div>
                       </>
                       </>
                     )
                     )
                 }}
                 }}
               />
               />
             </ColField>
             </ColField>
+          </ColFieldGroup>
+          <div class={styles.tips}>
+            <div class={styles.tipsTitle}>曲谱审核标准:</div>
+            <div class={styles.tipsContent}>
+              1、文件大小不要超过5MB,不符合版面规范的乐谱,审核未通过的不予上架,详情参考
+              <span onClick={() => this.onDetail('music')}>
+                《曲谱排版规范》
+              </span>
+              ; 1、必须是上传人自己参与制作的作品。
+              <br />
+              2、XML与MIDI文件内容必须一致,推荐使用Sibelius打谱软件。导出设置:导出XML-未压缩(*.xml)/导出MIDI:音色-其他回放设备General
+              MIDI、MIDI、MIDI文件类型-类型0、不要勾选“将弱拍小节导出为具有休止符的完整小节”。点击查看
+              <span onClick={() => this.onDetail('question')}>
+                《常见问题》
+              </span>
+            </div>
+          </div>
+          <ColFieldGroup class={styles.area}>
             <ColField required title="播放类型" border={false}>
             <ColField required title="播放类型" border={false}>
               <RadioGroup
               <RadioGroup
                 class={styles['radio-group']}
                 class={styles['radio-group']}
@@ -462,6 +537,25 @@ export default defineComponent({
                     })}
                     })}
                   </RadioGroup>
                   </RadioGroup>
                 </ColField>
                 </ColField>
+                <ColField required title="伴奏类型" border={false}>
+                  <RadioGroup
+                    class={styles['radio-group']}
+                    modelValue={this.accompanimentType}
+                    onUpdate:modelValue={val => (this.accompanimentType = val)}
+                  >
+                    {Object.keys(teacherStyleType).map((item: string) => {
+                      const isActive = item === String(this.accompanimentType)
+                      const type = isActive ? 'primary' : 'default'
+                      return (
+                        <Radio class={styles.radio} name={item}>
+                          <Tag size="large" plain={isActive} type={type}>
+                            {teacherStyleType[item]}
+                          </Tag>
+                        </Radio>
+                      )
+                    })}
+                  </RadioGroup>
+                </ColField>
                 <ColField border={false} title="伴奏文件">
                 <ColField border={false} title="伴奏文件">
                   <Field
                   <Field
                     name="mp3Url"
                     name="mp3Url"
@@ -486,59 +580,14 @@ export default defineComponent({
                               onUpdate:modelValue={val => (this.mp3Url = val)}
                               onUpdate:modelValue={val => (this.mp3Url = val)}
                               accept=".mp3"
                               accept=".mp3"
                             />
                             />
-                            <div style={{marginLeft: '8px'}}>{this.fileName(this.mp3Url)}</div>
+                            <div style={{ marginLeft: '8px' }}>
+                              {this.fileName(this.mp3Url)}
+                            </div>
                           </>
                           </>
                         )
                         )
                     }}
                     }}
                   />
                   />
                 </ColField>
                 </ColField>
-                {this.backgroundMp3s.map((item, index) => (
-                  <ColField
-                    required
-                    border={false}
-                    title={(item.track || '') + '原音文件'}
-                    // @ts-ignore
-                    vSlots={{
-                      right: () =>
-                        this.backgroundMp3s.length > 1 ? (
-                          <Button
-                            onClick={() => this.removeBackground(index)}
-                            style={{ border: 'none' }}
-                            icon="cross"
-                          ></Button>
-                        ) : null
-                    }}
-                  >
-                    <Field
-                      name="url"
-                      modelValue={this.bgmp3Url}
-                      // @ts-ignore
-                      vSlots={{
-                        input: () =>
-                          browserInfo.isApp ? (
-                            <Button
-                              icon={UploadIcon}
-                              class={styles.upbtn}
-                              onClick={this.naiveBGMp3File}
-                              loading={this.bgmp3Loading}
-                            >
-                              {this.bgmp3Url
-                                ? this.fileName(this.bgmp3Url)
-                                : '上传文件'}
-                            </Button>
-                          ) : (
-                            <>
-                              <Upload
-                                onUpdate:modelValue={val => (this.bgmp3Url = val)}
-                                accept=".mp3"
-                              />
-                              <div style={{marginLeft: '8px'}}>{this.fileName(this.bgmp3Url)}</div>
-                            </>
-                          )
-                      }}
-                    />
-                  </ColField>
-                ))}
               </>
               </>
             ) : (
             ) : (
               <ColField border={false} required title="MIDI文件">
               <ColField border={false} required title="MIDI文件">
@@ -566,7 +615,9 @@ export default defineComponent({
                             onUpdate:modelValue={val => (this.midiUrl = val)}
                             onUpdate:modelValue={val => (this.midiUrl = val)}
                             accept=".mid"
                             accept=".mid"
                           />
                           />
-                          <div style={{marginLeft: '8px'}}>{this.fileName(this.midiUrl)}</div>
+                          <div style={{ marginLeft: '8px' }}>
+                            {this.fileName(this.midiUrl)}
+                          </div>
                         </>
                         </>
                       )
                       )
                   }}
                   }}
@@ -574,7 +625,68 @@ export default defineComponent({
               </ColField>
               </ColField>
             )}
             )}
           </ColFieldGroup>
           </ColFieldGroup>
+          <div class={styles.tips}>
+            <div class={styles.tipsContent}>
+              1、推荐上传自制伴奏,伴奏和谱面必须对齐。自制伴奏可以设置更高的收费标准。
+              <br />
+              2、普通伴奏如果涉及到版权纠纷,根据
+              <span onClick={() => this.onDetail('protocol')}>
+                《用户注册协议》
+              </span>
+              平台有权进行下架处理。
+            </div>
+          </div>
           <ColFieldGroup class={styles.area}>
           <ColFieldGroup class={styles.area}>
+            {this.audioType === 'MP3' &&
+              this.backgroundMp3s.map((item, index) => (
+                <ColField
+                  required
+                  border={false}
+                  title={(item.track || '') + '原音文件'}
+                  // @ts-ignore
+                  vSlots={{
+                    right: () =>
+                      this.backgroundMp3s.length > 1 ? (
+                        <Button
+                          onClick={() => this.removeBackground(index)}
+                          style={{ border: 'none' }}
+                          icon="cross"
+                        ></Button>
+                      ) : null
+                  }}
+                >
+                  <Field
+                    name="url"
+                    modelValue={this.bgmp3Url}
+                    // @ts-ignore
+                    vSlots={{
+                      input: () =>
+                        browserInfo.isApp ? (
+                          <Button
+                            icon={UploadIcon}
+                            class={styles.upbtn}
+                            onClick={this.naiveBGMp3File}
+                            loading={this.bgmp3Loading}
+                          >
+                            {this.bgmp3Url
+                              ? this.fileName(this.bgmp3Url)
+                              : '上传文件'}
+                          </Button>
+                        ) : (
+                          <>
+                            <Upload
+                              onUpdate:modelValue={val => (this.bgmp3Url = val)}
+                              accept=".mp3"
+                            />
+                            <div style={{ marginLeft: '8px' }}>
+                              {this.fileName(this.bgmp3Url)}
+                            </div>
+                          </>
+                        )
+                    }}
+                  />
+                </ColField>
+              ))}
             <ColField required title="曲目名称">
             <ColField required title="曲目名称">
               <Field
               <Field
                 clearable
                 clearable
@@ -586,14 +698,37 @@ export default defineComponent({
                 onUpdate:modelValue={val => (this.musicSheetName = val)}
                 onUpdate:modelValue={val => (this.musicSheetName = val)}
               />
               />
             </ColField>
             </ColField>
-            <ColField required title="作曲人">
+            <ColField border={false} required title="曲谱封面">
+              <ColUpload
+                cropper
+                bucket="cloud-coach"
+                options={{
+                  autoCropWidth: 600,
+                  autoCropHeight: 600
+                }}
+                v-model={this.titleImg}
+                class={styles.imgContainer}
+              />
+            </ColField>
+          </ColFieldGroup>
+          <div class={styles.tips}>
+            <div class={styles.tipsContent}>
+              1、同一首曲目不可重复上传,如有不同版本统一用“()”补充。举例:人生的旋转木马(长笛二重奏版)。
+              <br />
+              2、曲目名后可添加曲目信息备注,包含但不限于曲目类型等。曲目名《xxxx》,举例:人生的旋转木马《哈尔的移动城堡》(长笛二重奏版)
+              <br />
+              3、其他信息不要写在曲目名里,如歌手、上传人员昵称等。
+            </div>
+          </div>
+          <ColFieldGroup class={styles.area}>
+            <ColField required title="艺术家">
               <Field
               <Field
                 clearable
                 clearable
                 class={styles['clear-px']}
                 class={styles['clear-px']}
-                placeholder="请输入作曲人姓名"
+                placeholder="请输入艺术家姓名"
                 name="composer"
                 name="composer"
                 modelValue={this.composer}
                 modelValue={this.composer}
-                rules={[{ required: true, message: '请输入作曲人姓名' }]}
+                rules={[{ required: true, message: '请输入艺术家姓名' }]}
                 onUpdate:modelValue={val => (this.composer = val)}
                 onUpdate:modelValue={val => (this.composer = val)}
               />
               />
             </ColField>
             </ColField>
@@ -622,6 +757,11 @@ export default defineComponent({
               ></Field>
               ></Field>
             </ColField>
             </ColField>
           </ColFieldGroup>
           </ColFieldGroup>
+          <div class={styles.tips}>
+            <div class={styles.tipsContent}>
+              XML文件中,选择的曲目声部需要在总谱的置顶位置。
+            </div>
+          </div>
           <ColFieldGroup class={styles.area}>
           <ColFieldGroup class={styles.area}>
             <ColField
             <ColField
               border={false}
               border={false}
@@ -752,9 +892,12 @@ export default defineComponent({
                   clearable
                   clearable
                   class={styles['clear-px']}
                   class={styles['clear-px']}
                   placeholder="请输入收费价格"
                   placeholder="请输入收费价格"
+                  formatter={this.onFormatter}
                   v-slots={{ button: () => '元' }}
                   v-slots={{ button: () => '元' }}
                   modelValue={this.musicPrice}
                   modelValue={this.musicPrice}
-                  rules={[{ required: true, message: '请输入收费价格' }]}
+                  rules={[
+                    { required: true, validator, message: '请输入收费价格' }
+                  ]}
                   onUpdate:modelValue={val => (this.musicPrice = val)}
                   onUpdate:modelValue={val => (this.musicPrice = val)}
                 />
                 />
               </ColField>
               </ColField>

Some files were not shown because too many files changed in this diff