Commit 594d6dc0 authored by 小费同学阿's avatar 小费同学阿 💬

Merge remote-tracking branch 'origin/master'

parents 91fa35de 252e3df7
...@@ -3,7 +3,7 @@ import request from '@/utils/request' ...@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询授权历史列表 // 查询授权历史列表
export function listHistory(query) { export function listHistory(query) {
return request({ return request({
url: '/business/history/list', url: '/system/history/list',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -12,7 +12,7 @@ export function listHistory(query) { ...@@ -12,7 +12,7 @@ export function listHistory(query) {
// 查询授权历史详细 // 查询授权历史详细
export function getHistory(id) { export function getHistory(id) {
return request({ return request({
url: '/business/history/' + id, url: '/system/history/' + id,
method: 'get' method: 'get'
}) })
} }
...@@ -20,7 +20,7 @@ export function getHistory(id) { ...@@ -20,7 +20,7 @@ export function getHistory(id) {
// 新增授权历史 // 新增授权历史
export function addHistory(data) { export function addHistory(data) {
return request({ return request({
url: '/business/history', url: '/system/history',
method: 'post', method: 'post',
data: data data: data
}) })
...@@ -29,7 +29,7 @@ export function addHistory(data) { ...@@ -29,7 +29,7 @@ export function addHistory(data) {
// 修改授权历史 // 修改授权历史
export function updateHistory(data) { export function updateHistory(data) {
return request({ return request({
url: '/business/history', url: '/system/history',
method: 'put', method: 'put',
data: data data: data
}) })
...@@ -38,7 +38,7 @@ export function updateHistory(data) { ...@@ -38,7 +38,7 @@ export function updateHistory(data) {
// 删除授权历史 // 删除授权历史
export function delHistory(id) { export function delHistory(id) {
return request({ return request({
url: '/business/history/' + id, url: '/system/history/' + id,
method: 'delete' method: 'delete'
}) })
} }
...@@ -5,14 +5,14 @@ let isFetching = false; ...@@ -5,14 +5,14 @@ let isFetching = false;
// 查询医院列表 // 查询医院列表
export function listHospital(query) { export function listHospital(query) {
return request({ return request({
url: '/business/hospital/list', url: '/system/hospital/list',
method: 'get', method: 'get',
params: query params: query
}) })
} }
export function listGetUserInfo(query) { export function listGetUserInfo(query) {
return request({ return request({
url: '/business/hospital/listGetUser', url: '/system/hospital/listGetUser',
method: 'get', method: 'get',
params: query params: query
}) })
...@@ -27,7 +27,7 @@ export function listHospitalAll() { ...@@ -27,7 +27,7 @@ export function listHospitalAll() {
// 查询医院详细 // 查询医院详细
export function getHospital(id) { export function getHospital(id) {
return request({ return request({
url: '/business/hospital/' + id, url: '/system/hospital/' + id,
method: 'get' method: 'get'
}) })
} }
...@@ -41,7 +41,7 @@ export async function addHospital(data) { ...@@ -41,7 +41,7 @@ export async function addHospital(data) {
try { try {
return request({ return request({
url: '/business/hospital', url: '/system/hospital',
method: 'post', method: 'post',
data: data data: data
}) })
...@@ -55,7 +55,7 @@ export async function addHospital(data) { ...@@ -55,7 +55,7 @@ export async function addHospital(data) {
// 修改医院 // 修改医院
export function updateHospital(data) { export function updateHospital(data) {
return request({ return request({
url: '/business/hospital', url: '/system/hospital',
method: 'put', method: 'put',
data: data data: data
}) })
...@@ -64,7 +64,16 @@ export function updateHospital(data) { ...@@ -64,7 +64,16 @@ export function updateHospital(data) {
// 删除医院 // 删除医院
export function delHospital(id) { export function delHospital(id) {
return request({ return request({
url: '/business/hospital/' + id, url: '/system/hospital/' + id,
method: 'delete' method: 'delete'
}) })
} }
// 获取所有医院ID
export function getHospitalIds(query) {
return request({
url: '/system/hospital/getHospitalIds',
method: 'get',
params: query
})
}
import request from '@/utils/request'
// 查询文档管理列表
export function listManagement(query) {
return request({
url: '/system/management/list',
method: 'get',
params: query
})
}
// 查询文档管理详细
export function getManagement(id) {
return request({
url: '/system/management/' + id,
method: 'get'
})
}
// 新增文档管理
export function addManagement(data) {
return request({
url: '/system/management',
method: 'post',
data: data
})
}
// 修改文档管理
export function updateManagement(data) {
return request({
url: '/system/management',
method: 'put',
data: data
})
}
// 删除文档管理
export function delManagement(id) {
return request({
url: '/system/management/' + id,
method: 'delete'
})
}
...@@ -112,6 +112,43 @@ export const constantRoutes = [ ...@@ -112,6 +112,43 @@ export const constantRoutes = [
] ]
}, },
// 文档管理
{
path: '/document-management',
component: Layout,
hidden: true,
permissions: ['*:*:*'],
children: [
{
path: 'privacy-policy',
props: true,
component: () => import('@/views/document-management/privacy-policy/privacy-policy'),
name: 'privacy-policy',
meta: { title: '隐私政策', icon: 'date' }
},
{
path: 'user-protocol',
props: true,
component: () => import('@/views/document-management/user-protocol/user-protocol'),
name: 'user-protocol',
meta: { title: '用户协议', icon: 'table' }
},
{
path: 'about-us',
props: true,
component: () => import('@/views/document-management/about-us/about-us.vue'),
name: 'about-us',
meta: { title: '关于我们', icon: 'github' }
},
{
path: 'entry-contract',
props: true,
component: () => import('@/views/document-management/entry-contract/entry-contract'),
name: 'entry-contract',
meta: { title: '合同文件', icon: 'component' }
}
]
},
// 文章 // 文章
{ {
path: '/article-management', path: '/article-management',
......
<template> <template>
<div> <div class="policy-container">
关于我们页面 <div class="title-paragraph">
</div> <span class="title-text">编辑内容</span>
</div>
<el-row>
<el-col :span="1.5" style="margin: 0 10px 0 75px">
<span>关于我们:</span>
</el-col>
<el-col v-if="isEdit===true" :span="19">
<rich-text v-model="privacyPolicy.content" :height="500" />
</el-col>
<el-col v-if="isEdit===false" :span="19">
<rich-text v-model="privacyPolicy.content" :height="500" :read-only="true" />
</el-col>
</el-row>
<el-row v-show="isEdit">
<el-col style="display: flex;justify-content: left;margin: 20px 0 0 135px">
<el-button type="primary" @click="submit">提 交</el-button>
</el-col>
</el-row>
</div>
</template> </template>
<script> <script>
import RichText from '../rich-text.vue'
import { listManagement,addManagement,updateManagement } from '@/api/business/policy'
import { getUserProfile } from '@/api/system/user'
export default { export default {
name: 'about-us' name: "privacy-policy",
components: { RichText },
data() {
return {
privacyPolicy: {
type:'2',
content: null
},
isAdd: true,
// 是否可编辑, 平台登录可以,其他不可以
isEdit: null,
}
},
mounted() {
getUserProfile().then(response => {
if (response.data.userType === '00') {
this.isEdit = true
} else {
this.isEdit = false
}
console.log('this.isEdit', this.isEdit)
});
this.getPrivacyPolicy()
},
methods: {
submit() {
console.log('隐私协议', this.privacyPolicy)
// 内容为空不能
if (this.privacyPolicy.content === null || this.privacyPolicy.content === '' || this.privacyPolicy.content === '<p><br></p>') {
this.$modal.msgError('内容不能为空')
return
}
if (this.isAdd) {
// 新增
addManagement(this.privacyPolicy).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess('修改成功')
}
})
} else {
// 修改
updateManagement(this.privacyPolicy).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess('修改成功')
}
})
}
},
getPrivacyPolicy() {
listManagement({type: '2'}).then(res => {
if (res.rows.length === 0) {
this.isAdd = true
} else {
this.privacyPolicy = res.rows[0]
this.isAdd = false
}
})
}
}
} }
</script> </script>
<style scoped> <style scoped lang="scss">
.policy-container {
padding: 10px 0 80px 0;
background-color: #FFFFFF;
.box-card {
margin: 20px 20px 0 20px;
}
.title-paragraph {
margin: 20px 0 20px 15px;
border-left: 5px solid #5FB54B;
.title-text {
margin-left: 10px;
}
}
}
::v-deep .el-card__header {
background-color: rgb(249, 249, 249);
}
</style> </style>
<template> <template>
<div>入驻合同</div> <div class="contract-container">
<div class="title-paragraph">
<span class="title-text">入驻合同</span>
</div>
<!-- 入驻合同表 -->
<el-table v-loading="loading" :data="entryContract" style="width: 90%;margin: 0 0 0 60px;">
<el-table-column prop="createTime" label="入驻时间">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column prop="authorizationDuration" label="授权类型">
<template slot-scope="scope">
<span v-if="scope.row.authorizationDuration < 99">非长期授权</span>
<span v-else>长期授权</span>
</template>
</el-table-column>
<el-table-column prop="authorizationDuration" label="授权时长">
<template slot-scope="scope">
<span v-if="scope.row.authorizationDuration < 99">{{scope.row.authorizationDuration}}</span>
<span v-else>永久</span>
</template>
</el-table-column>
<el-table-column prop="createByName" label="授权账号" />
<el-table-column prop="fileName" label="入驻合同">
<template slot-scope="scope">
<span>{{ scope.row.fileName || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button style="color: #5FB54B" type="text" @click="check(scope.row)">查看</el-button>
<el-button style="color: #5FB54B" type="text" @click="downloadPdf(scope.row)">下载</el-button>
</template>
</el-table-column>
</el-table>
<div class="title-paragraph" style="margin-top: 30px">
<span class="title-text">授权合同</span>
</div>
<!-- 授权合同表 -->
<el-table v-loading="loading" :data="authorizationHistory" style="width: 90%;margin: 0 0 0 60px;">
<el-table-column prop="createTime" label="授权时间">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column prop="authorizationDuration" label="授权类型">
<template slot-scope="scope">
<span v-if="scope.row.authorizationDuration < 99">非长期授权</span>
<span v-else>长期授权</span>
</template>
</el-table-column>
<el-table-column prop="authorizationDuration" label="授权时长">
<template slot-scope="scope">
<span v-if="scope.row.authorizationDuration < 99">{{scope.row.authorizationDuration}}</span>
<span v-else>长期</span>
</template>
</el-table-column>
<el-table-column prop="" label="授权截止日期">
<template slot-scope="scope">
<span>{{addDays(scope.row.currentTime, scope.row.authorizationDuration)}}</span>
</template>
</el-table-column>
<el-table-column prop="fileName" label="授权合同">
<template slot-scope="scope">
<span>{{ scope.row.fileName || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button style="color: #5FB54B" type="text" @click="check(scope.row)">查看</el-button>
<el-button style="color: #5FB54B" type="text" @click="downloadPdf(scope.row)">下载</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template> </template>
<script> <script>
import { listGetUserInfo } from '../../../api/business/hospital'
import { listHistory } from '../../../api/business/history'
export default { export default {
name: 'entry-contract' name: 'entry-contract',
data() {
return {
// 图片根据不同环境显示路径
baseUrl: process.env.VUE_APP_TEST_API,
// 授权合同
authorizationHistory: [],
// 入驻合同
entryContract: [],
// 当前登录的医院ID
currentHospitalId: '',
loading: true,
}
},
mounted() {
this.getCurrentHospital()
setTimeout(() => {
this.getContract()
}, 500)
},
methods: {
getContract() {
console.log('xxxx', this.currentHospitalId)
listHistory({ hospitalId: this.currentHospitalId }).then(res => {
const list = res.rows
console.log('授权历史312', list)
const lastData = list.pop()
console.log('---123', lastData)
this.entryContract.push(lastData)
this.authorizationHistory = list
console.log('授权合同', this.authorizationHistory)
console.log('入驻合同', this.entryContract)
this.loading = false
})
},
getCurrentHospital() {
listGetUserInfo().then(res => {
console.log('当前医院', res)
this.currentHospitalId = res.rows[0].id
console.log('医院ID', this.currentHospitalId)
})
},
check(row) {
console.log('pdf', row.contract)
console.log('pdf2', this.baseUrl)
window.open(this.baseUrl + row.contract)
},
downloadPdf() {
},
/** 通过授权历史获取到期日期 */
addDays(date, str) {
if (str === null) {
return null;
}
const days = str.split('.')[0]
if (parseInt(days) >= 99) {
return '长期'
}
const result = new Date(date)
result.setDate(result.getDate() + days * 365)
const formatTime = this.formatTime(result)
return formatTime
},
/** 格式化时间-年月日 */
formatTime(date) {
// 获取年月日
var year = date.getFullYear();
var month = date.getMonth() + 1; // 月份从0开始,需要加1
var day = date.getDate();
// 将年月日格式化为字符串
if (month < 10) {
month = '0' + month
}
if (day < 10) {
day = '0' + day
}
const formattedDate = year + '-' + month + '-' + day
return formattedDate;
},
}
} }
</script> </script>
<style scoped> <style scoped lang="scss">
.contract-container {
width: 1640px;
height: 880px;
//margin: 0 0 0 15px;
padding: 10px 0 80px 0;
background-color: #FFFFFF;
.title-paragraph {
margin: 20px 0 20px 15px;
border-left: 5px solid #5FB54B;
.title-text {
margin-left: 10px;
}
}
}
</style> </style>
<template> <template>
<div class="content"> <div class="policy-container">
<div>我们将通过《隐私权政策》(以下简称“本政策”)帮助您了解我们会如何收集、使用和存储您的个人信息及您享有何种权利。</div> <div class="title-paragraph">
<div>本政策适用于APP提供的产品或服务。如我们及关联公司产品或服务中使用了头像提供的产品或服务但未设独立法律声明及隐私权政策的,则本政策同样适用于该部分产品或服务。</div> <span class="title-text">编辑内容</span>
<div>本政策与您使用我们的服务关系紧密,我们建议您仔细阅读并理解本政策全部内容,在确认充分理解并同意后再开始使用。我们努力用通俗易懂、简明扼要的文字表达,并对本政策中与您的权益存在重大关系的条款,采用粗体字进行标注以提示您注意。</div>
<div>您使用或继续使用我们的服务,即意味若同意我们按照本政策收集、使用、储存和分享您的相关信息。</div>
<div>本政策将帮助您了解以下内容:</div>
<div>
1、我们如何收集和使用您的信息;<br/>
2、信息的存储;<br/>
3、信息安全;<br/>
4、我们如何使用信息;<br/>
5、对外提供;<br/>
6、您的权利;<br/>
7、变更;<br/>
8、未成年人保护;<br/>
9、与我们联系。
</div> </div>
<div>一、我们如何收集和使用您的个人信息</div> <el-row>
<div>在您使用我们的产品及/或服务时,我们需要/可能需要收集和使用的您的个人信息包括如下:</div> <el-col :span="1.5" style="margin: 0 10px 0 75px">
<div>1.为实现向您提供我们产品及/或服务的基本功能,您须授权我们收集、使用的必要的信息。如您拒绝提供相应信息,您将无法正常使用我们的产品及/或服务;</div> <span>用户协议:</span>
<div>2.为实现向您提供我们产品及/或服务的附加功能,经您选择授权我们收集、使用的信息。如您拒绝提供,您将无法正常使用相关附加功能或无法达到我们拟达到的功能效果,但并不会影响您正常使用我们产品及/或服务的基本功能。</div> </el-col>
<div>您理解并同意:</div> <el-col v-if="isEdit===true" :span="19">
<div>1.我们致力于打造各种各样的产品和服务以满足您的需求,因我们向您提供的产品和服务种类众多且不同用户选择使用的具体产品/服务范围存在差异,相应的,基本/附加功能及收集使用的个人信息类型、范围等会有所区别,请以具体的产品/服务功能为准;</div> <rich-text v-model="privacyPolicy.content" :height="500" />
<div>2.为给您带来更好的产品和服务体验,我们在持续努力改进我们的技术,随之我们可能会不时推出新的或优化后的功能,可能需要收集、使用新的个人信息或变更个人信息使用目的或方式。对此,我们将通过更新本政策、弹窗、页面提示等方式另行向您说明对应信息的收集目的、范围及使用方式,并为您提供自主选择同意的方式,且在征得您明示同意后收集、使用。在此过程中,如果您有任何疑问、意见或建议的,您可通过我们提供的各种联系方式与我们联系,我们会尽快为您作出解答。</div> </el-col>
<div>我们会实现本政策下述的各项功能,收集和使用您的个人信息∶</div> <el-col v-if="isEdit===false" :span="19">
<div>(—)帮助您成为我们的用户</div> <rich-text v-model="privacyPolicy.content" :height="500" :read-only="true" />
<div>为遵守法律法规的要求,在您注册成为我们的用户时,您需要提供您的手机号及短信功能以创建账号。如果您仅需使用浏览、搜索等基本服务,您不需要注册成为我们的用户及提供上述信息。</div> </el-col>
<div>对于需要通过动态壁纸主题大全账号才能使用的服务,我们可能会根据您提供的上述信息校验您的用户身份,确保我们是在为您本人提供服务。</div> </el-row>
<div>您在使用账号时,为维护您的基本资料,改善您的服务体验,您可以完善网络身份识别信息(如头像、用户名及登录密码等)</div> <el-row v-show="isEdit">
<div>授权登录:我们可能经您同意后向第三方共享您的账号信息(头像、昵称及其他经您同意共享的信息),使您可以便捷地实现第三方账号的注册或登录。此外,我们可能会根据您的授权从第三方处获取您的账号信息,并与您的头像账号进行绑定,使您可以通过第三方账号直接登录、使用我们的产品及/或服务或实现账号之间相关权益互通。我们将根据与第三方的约定,在您授权同意范围内使用您的相关信息。</div> <el-col style="display: flex;justify-content: left;margin: 20px 0 0 135px">
<div>(二)为您提供商品或服务信息展示</div> <el-button type="primary" @click="submit">提 交</el-button>
<div>在您使用我们服务过程中,为了解产品适配性、识别账号异常状态、向您提供更契合您需求的页面展示和搜索结果,我们可能会请求您提供或自动收集您的使用情况并储存为网络日志信息,包括:</div> </el-col>
<div>1.2.1位置信息:为了便捷您发现更多您喜爱的壁纸等服务信息,我们会基于您的地理位置信息为您提供服务。为服务用户的目的,可能与动态壁纸主题大全合作伙伴共享信息以便他们向用户发送其相关产品和服务的信息,我们共享您的信息时,我们会督促关联公司、联盟成员、合作伙伴或其他受信任的第三方供应商、服务商及代理商遵守隐私政策并要求其采取相关的保密和安全措施来处理上述信息。我们会使用有关技术对您的实际位置进行定位,这些技术包括IP地址、GPS以及能够提供相关信息的WlLAN接入点、蓝牙和基站等传感器技术。我们仅收集您当时所处的地理位置,但不会将您各时段的位置信息进行关联以判断您的行踪轨迹。 </el-row>
1.2.1位置信息:为了便捷您发现更多您喜爱的壁纸等服务信息,我们会基于您的地理位置信息为您提供服务。为服务用户的目的,可能与动态壁纸主题大全合作伙伴共享信息以便他们向用户发送其相关产品和服务的信息,我们共享您的信息时,我们会督促关联公司、联盟成员、合作伙伴或其他受信任的第三方供应商、服务商及代理商遵守隐私政策并要求其采取相关的保密和安全措施来处理上述信息。我们会使用有关技术对您的实际位置进行定位,这些技术包括IP地址、GPS以及能够提供相关信息的WlLAN接入点、蓝牙和基站等传感器技术。我们仅收集您当时所处的地理位置,但不会将您各时段的位置信息进行关联以判断您的行踪轨迹。
</div>
<div>1.2.2设备信息:我们会根据您在软件安装及使用中的具体操作,接收并记录您所使用的设备相关信息(包括设备型号、操作系统版本、设备设置、唯一设备标识符、使用的移动应用和其他软件信息等软硬件特征信息)、设备所在位置相关信息(包括您授权的GPS位置以及WlLAN接入点、蓝牙和基站等传感器信息)。</div>
<div>1.2.3服务日志信息:当您使用我们的网站或客户端提供的产品或服务时,我们会自动收集您对我们服务的详细使用情况,作为服务日志保存。包括浏览、点击查看、搜索查询、收藏、分享、下载以及IP地址、电信运营商、使用的语言、访问日期和时间。</div>
<div>请注意,单独的设备信息、日志信息、位置信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将这类信息做匿名化、去标识化处理。为向您提供更便捷、更符合您个性化需求的信息展示、搜索及推送服务,我们会根据您的设备信息、位置信息和服务日志信息,提取您的偏好特征,并基于特征标签进行间接人群画像,展示、推送信息。此外,我们也会为了不断改进和优化上述的功能来使用您的上述信息。</div>
<div>(三)为您提供收藏、下载设置与分享功能</div>
<div>在您浏览我们网站或客户端的过程中,您可以选择对感兴趣的商品及进行收藏、下载、分享。为此我们需要在您使用上述功能的过程中调用手机的存储功能。</div>
<div>(四)其他</div>
<div>1.若你提供的信息中含有其他用户的个人信息,在向我们提供这些个人信息之前,您需确保您已经取得合法的授权。</div>
<div>2.若我们将信息用于本政策未载明的其他用途,或者将基于特定目的收集而来的信息用于其他目的时,或者我们主动从第三方处获取您的个人信息,均会事先征求您的同意。</div>
<div>若我们从第三方处间接获取您的信息的,我们会在收集前明确以书面形式要求该第三方在已依法取得您同意后收集个人信息,并向您告知共享的信息内容,且涉及敏感信息的在提供给我们使用前需经过您的明确确认,要求第三方对个人信息来源的合法性和合规性作出承诺,如第三方有违反行为的,我们会明确要求对方承担相应法律责任;同时,我们的专业安全团队对个人信息会进行安全加固(包括敏感信息报备、敏感信息加密存储、访问权限控制等)。我们会使用不低于我们对自身用户个人信息同等的保护手段与措施对间接获取的个人信息进行保护。</div>
<div>3.征得授权同意的例外</div>
<div>您充分理解并同意,根据相关法律法规规定,我们在以下情形中收集、使用您的个人信息无需征得您的授权同意,且我们可能不会响应您提出的更正/修改、删除、注销、撤回同意、索取信息的请求:</div>
<div>1)与国家安全、国防安全有关的;</div>
<div>2)与公共安全、公共卫生、重大公共利益有关的;</div>
<div>3)与犯罪侦查、起诉、审判和判决执行等有关的;</div>
<div>4)出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;</div>
<div>5)所收集的个人信息是您自行向社会公众公开的;</div>
<div>6)从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;</div>
<div>7)根据您的要求签订合同所必需的;</div>
<div>8)用于维护所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务的故障;</div>
<div>9)为合法的新闻报道所必需的;</div>
<div>10)学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;</div>
<div>11)法律法规规定的其他情形。</div>
<div>4.如我们停止运营动态壁纸主题大全产品或服务,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐一送达或以公告的形式通知您,并对我们所持有的与已关停业务相关的个人信息进行删除或匿名化处理。</div>
<div>5.在您主动注销账号时,我们将根据适用法律法规的要求尽快使其匿名或删除您的个人信息。</div>
<div>二、信息的存储</div>
<div>2.1信息存储的地点</div>
<div>我们会按照法律法规规定,将境内收集的用户个人信息存储千中国境内。</div>
<div>目前我们不会跨境传输或存储您的个人信息。将来如需跨境传输或存储的,我们会向您告知信息出境的目的、接收方、安全保证措施和安全风险,并征得您的同意。</div>
<div>2.2信息存储的方式和期限</div>
<div>手机号或其他第三方账号:若您需要使用头像服务,我们需要一直保存您的账户,以保证您正常使用该服务,当您注销动漫头像制作帐户后,我们将删除相应的信息;</div>
<div>图片或视频:当您使用收藏等功能收藏了图片、视频,我们需要保存您上述信息及相关评论,以保证您正常使用;当您主动删除上述信息后,我们将删除相应的信息。当我们的产品或服务发生停止运营的情形时,我们将以推送通知、公告等形式通知您,并在合理的期限内删除您的个人信息或进行匿名化处理。</div>
<div>三 信息安全</div>
<div>3.1 安全保护措施</div>
<div>我们努力为用户的信息安全提供保障,以防止信息的泄露、丢失、不当使用、未经授权访问和披露等。我们使用多方位的安全保护措施,以确保用户的个人信息保护处于合理的安全水平,包括技术保护手段、管理制度控制、安全体系保障等诸多方面。此外,我们还通过了国家网络安全等级保护(三级)的测评和备案。</div>
<div>我们采用业界领先的技术保护措施。我们使用的技术手段包括但不限于防火墙、加密(例如SSL)、去标识化或匿名化处理、访问控制措施等。此外,我们还会不断加强安装在您设备端的软件的安全能力。例如,我们会在您的设备本地完成部分信息加密工作,以巩固安全传输;我们会了解您设备安装的应用信息和运行的进程信息,以预防病毒、木马等恶意程序。</div>
<div>我们建立了保障个人信息安全专门的管理制度、流程和组织。例如,我们严格限制访问信息的人员范围,要求他们遵守保密义务并进行审计,违反义务的人员会根据规定进行处罚。我们也会审查该管理制度、流程和组织,以防未经授权的人员擅自访问、使用或披露用户的信息。</div>
<div>3.2 安全事件处置措施</div>
<div>若发生个人信息泄露、损毁、丢失等安全事件,我们会启动应急预案,阻止安全事件扩大。安全事件发生后,我们会及时以推送通知、系统消息等形式告知您安全事件的基本情况、我们即将或已经采取的处置措施和补救措施,以及我们对您的应对建议。如果难以实现逐一告知,我们将通过公告等方式发布警示。</div>
<div>四 我们如何使用信息</div>
<div>我们严格遵守法律法规的规定以及与用户的约定,按照本隐私保护指引所述使用收集的信息,以向您提供更为优质的服务。</div>
<div>4.1 信息使用规则</div>
<div>我们会按照如下规则使用收集的信息:</div>
<div>1)我们会根据已收集的信息向您提供各项功能与服务,包括提供相应滤镜等服务</div>
<div>2)我们会使用cookie及相关技术收集您的账号号码、搜索记录、浏览历史、位置信息等特征为您提供个性化服务,包括基于对应账号号码的特征标签进行间接人群画像并向您提供更加精准和个性化的服务和内容等、向您展示更具相关性的广告或其他推广内容,优化个性化服务的体验,并评估、改善我们广告投放和其他推广活动的效果;</div>
<div>3)我们会根据您使用头像的频率、故障信息、性能信息等分析我们产品的运行情况,以确保服务的安全性并优化我们的产品,提高我们的服务质量。我们不会将我们存储在分析软件中的信息与您提供的个人身份信息相结合。</div>
<div>4)设置来电铃声时,我们将使用到以下权限</div>
</div> </div>
</template> </template>
<script> <script>
import RichText from '../rich-text.vue'
import { listManagement, addManagement, updateManagement } from '@/api/business/policy'
import { getUserProfile } from '@/api/system/user'
export default { export default {
name: "privacy-policy" name: 'privacy-policy',
components: { RichText },
data() {
return {
privacyPolicy: {
type: '0',
content: null
},
isAdd: true,
// 是否可编辑, 平台登录可以,其他不可以
isEdit: null,
}
},
mounted() {
getUserProfile().then(response => {
if (response.data.userType === '00') {
this.isEdit = true
} else {
this.isEdit = false
}
console.log('this.isEdit', this.isEdit)
});
this.getPrivacyPolicy()
},
methods: {
submit() {
console.log('隐私协议', this.privacyPolicy)
// 内容为空不能
if (this.privacyPolicy.content === null || this.privacyPolicy.content === '' || this.privacyPolicy.content === '<p><br></p>') {
this.$modal.msgError('内容不能为空')
return
}
if (this.isAdd) {
// 新增
addManagement(this.privacyPolicy).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess('修改成功')
}
})
} else {
// 修改
updateManagement(this.privacyPolicy).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess('修改成功')
}
})
}
},
getPrivacyPolicy() {
listManagement({type: '0'}).then(res => {
if (res.rows.length === 0) {
this.isAdd = true
} else {
this.privacyPolicy = res.rows[0]
this.isAdd = false
}
})
}
}
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.content { .policy-container {
div { padding: 10px 0 80px 0;
margin: 1px 2em; background-color: #FFFFFF;
.box-card {
margin: 20px 20px 0 20px;
} }
.title-paragraph {
margin: 20px 0 20px 15px;
border-left: 5px solid #5FB54B;
.title-text {
margin-left: 10px;
} }
}
}
::v-deep .el-card__header {
background-color: rgb(249, 249, 249);
}
</style> </style>
<template>
<div>
<el-upload
:action="uploadUrl"
:before-upload="handleBeforeUpload"
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
name="file"
:show-file-list="false"
:headers="headers"
style="display: none"
ref="upload"
v-if="this.type == 'url'"
>
</el-upload>
<div class="editor" ref="editor" :style="styles"></div>
</div>
</template>
<script>
import Quill from "quill";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
import { getToken } from "@/utils/auth";
export default {
name: "RichText",
props: {
/* 编辑器的内容 */
value: {
type: String,
default: "",
},
/* 高度 */
height: {
type: Number,
default: null,
},
/* 最小高度 */
minHeight: {
type: Number,
default: null,
},
/* 只读 */
readOnly: {
type: Boolean,
default: false,
},
// 上传文件大小限制(MB)
fileSize: {
type: Number,
default: 5,
},
/* 类型(base64格式、url格式) */
type: {
type: String,
default: "url",
}
},
data() {
return {
uploadUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
headers: {
Authorization: "Bearer " + getToken()
},
Quill: null,
currentValue: "",
options: {
theme: "snow",
bounds: document.body,
debug: "warn",
modules: {
// 工具栏配置
toolbar: [
["bold", "italic", "underline"], // 加粗 斜体 下划线 删除线
// ["blockquote", "code-block"], // 引用 代码块
[{ list: "ordered" }], // 有序、无序列表
[{ indent: "-1" }, { indent: "+1" }], // 缩进
// [{ size: ["small", false, "large", "huge"] }], // 字体大小
[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
// [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
[{ align: [] }], // 对齐方式
// ["clean"], // 清除文本格式
// ["link", "image", "video"] // 链接、图片、视频
],
},
placeholder: "请输入内容",
readOnly: this.readOnly,
},
};
},
computed: {
styles() {
let style = {};
if (this.minHeight) {
style.minHeight = `${this.minHeight}px`;
}
if (this.height) {
style.height = `${this.height}px`;
}
return style;
},
},
watch: {
value: {
handler(val) {
if (val !== this.currentValue) {
this.currentValue = val === null ? "" : val;
if (this.Quill) {
this.Quill.pasteHTML(this.currentValue);
}
}
},
immediate: true,
},
},
mounted() {
this.init();
},
beforeDestroy() {
this.Quill = null;
},
methods: {
init() {
const editor = this.$refs.editor;
this.Quill = new Quill(editor, this.options);
// 如果设置了上传地址则自定义图片上传事件
if (this.type == 'url') {
let toolbar = this.Quill.getModule("toolbar");
toolbar.addHandler("image", (value) => {
this.uploadType = "image";
if (value) {
this.$refs.upload.$children[0].$refs.input.click();
} else {
this.quill.format("image", false);
}
});
}
this.Quill.pasteHTML(this.currentValue);
this.Quill.on("text-change", (delta, oldDelta, source) => {
const html = this.$refs.editor.children[0].innerHTML;
const text = this.Quill.getText();
const quill = this.Quill;
this.currentValue = html;
this.$emit("input", html);
this.$emit("on-change", { html, text, quill });
});
this.Quill.on("text-change", (delta, oldDelta, source) => {
this.$emit("on-text-change", delta, oldDelta, source);
});
this.Quill.on("selection-change", (range, oldRange, source) => {
this.$emit("on-selection-change", range, oldRange, source);
});
this.Quill.on("editor-change", (eventName, ...args) => {
this.$emit("on-editor-change", eventName, ...args);
});
},
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件大小
if (this.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize;
if (!isLt) {
this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
return false;
}
}
return true;
},
handleUploadSuccess(res, file) {
// 获取富文本组件实例
let quill = this.Quill;
// 如果上传成功
if (res.code == 200) {
// 获取光标所在位置
let length = quill.getSelection().index;
// 插入图片 res.url为服务器返回的图片地址
quill.insertEmbed(length, "image", process.env.VUE_APP_BASE_API + res.fileName);
// 调整光标到最后
quill.setSelection(length + 1);
} else {
this.$message.error("图片插入失败");
}
},
handleUploadError() {
this.$message.error("图片插入失败");
},
},
};
</script>
<style>
.editor, .ql-toolbar {
white-space: pre-wrap !important;
line-height: normal !important;
}
.quill-img {
display: none;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {
content: "请输入链接地址:";
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
border-right: 0px;
content: "保存";
padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode="video"]::before {
content: "请输入视频地址:";
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {
content: "10px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {
content: "18px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
content: "32px";
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
content: "文本";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
content: "标题1";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
content: "标题2";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
content: "标题3";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
content: "标题4";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
content: "标题5";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
content: "标题6";
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
content: "标准字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
content: "衬线字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
content: "等宽字体";
}
</style>
<template> <template>
<div>用户协议</div> <div class="protocol-container">
<div class="title-paragraph">
<span class="title-text">编辑内容</span>
</div>
<el-row>
<el-col :span="1.5" style="margin: 0 10px 0 75px">
<span>用户协议:</span>
</el-col>
<el-col v-if="isEdit===true" :span="19">
<rich-text v-model="privacyPolicy.content" :height="500" />
</el-col>
<el-col v-if="isEdit===false" :span="19">
<rich-text v-model="privacyPolicy.content" :height="500" :read-only="true" />
</el-col>
</el-row>
<el-row v-show="isEdit">
<el-col style="display: flex;justify-content: left;margin: 20px 0 0 135px">
<el-button type="primary" @click="submit">提 交</el-button>
</el-col>
</el-row>
</div>
</template> </template>
<script> <script>
import RichText from '../rich-text.vue'
import { listManagement,addManagement,updateManagement } from '@/api/business/policy'
import { getUserProfile } from '@/api/system/user'
export default { export default {
name: 'user-protocol' name: "user-protocol",
components: { RichText },
data() {
return {
privacyPolicy: {
type:'1',
content: null
},
isAdd: true,
// 是否可编辑, 平台登录可以,其他不可以
isEdit: null,
}
},
mounted() {
getUserProfile().then(response => {
if (response.data.userType === '00') {
this.isEdit = true
} else {
this.isEdit = false
}
console.log('this.isEdit', this.isEdit)
});
this.getPrivacyPolicy()
},
methods: {
submit() {
console.log('隐私协议', this.privacyPolicy)
// 内容为空不能
if (this.privacyPolicy.content === null || this.privacyPolicy.content === '' || this.privacyPolicy.content === '<p><br></p>') {
this.$modal.msgError('内容不能为空')
return
}
if (this.isAdd) {
// 新增
addManagement(this.privacyPolicy).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess('修改成功')
}
})
} else {
// 修改
updateManagement(this.privacyPolicy).then(response => {
if (response.code === 200) {
this.$modal.msgSuccess('修改成功')
}
})
}
},
getPrivacyPolicy() {
listManagement({type: '1'}).then(res => {
if (res.rows.length === 0) {
this.isAdd = true
} else {
this.privacyPolicy = res.rows[0]
this.isAdd = false
}
})
}
}
} }
</script> </script>
<style scoped> <style scoped lang="scss">
.protocol-container {
padding: 10px 0 80px 0;
background-color: #FFFFFF;
.box-card {
margin: 20px 20px 0 20px;
}
.title-paragraph {
margin: 20px 0 20px 15px;
border-left: 5px solid #5FB54B;
.title-text {
margin-left: 10px;
}
}
}
::v-deep .el-card__header {
background-color: rgb(249, 249, 249);
}
</style> </style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment