uni-id-pages-agreements.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <view class="root" v-if="agreements.length">
  3. <template v-if="needAgreements">
  4. <checkbox-group @change="setAgree">
  5. <label class="checkbox-box">
  6. <checkbox :checked="isAgree" style="transform: scale(0.5);margin-right: -6px;" />
  7. <text class="text">同意</text>
  8. </label>
  9. </checkbox-group>
  10. <view class="content">
  11. <view class="item" v-for="(agreement,index) in agreements" :key="index">
  12. <text class="agreement text" @click="navigateTo(agreement)">{{agreement.title}}</text>
  13. <text class="text and" v-if="hasAnd(agreements,index)" space="nbsp"> 和 </text>
  14. </view>
  15. </view>
  16. </template>
  17. <!-- 弹出式 -->
  18. <uni-popup v-if="needAgreements||needPopupAgreements" ref="popupAgreement" type="center">
  19. <uni-popup-dialog confirmText="同意" @confirm="popupConfirm">
  20. <view class="content">
  21. <text class="text">请先阅读并同意</text>
  22. <view class="item" v-for="(agreement,index) in agreements" :key="index">
  23. <text class="agreement text" @click="navigateTo(agreement)">{{agreement.title}}</text>
  24. <text class="text and" v-if="hasAnd(agreements,index)" space="nbsp"> 和 </text>
  25. </view>
  26. </view>
  27. </uni-popup-dialog>
  28. </uni-popup>
  29. </view>
  30. </template>
  31. <script>
  32. import config from '@/uni_modules/uni-id-pages/config.js'
  33. let retryFun = ()=>console.log('为定义')
  34. /**
  35. * uni-id-pages-agreements
  36. * @description 用户服务协议和隐私政策条款组件
  37. * @property {String,Boolean} scope = [register|login] 作用于哪种场景如:register 注册(包括登录并注册,如:微信登录、苹果登录、短信验证码登录)、login 登录。默认值为:register
  38. */
  39. export default {
  40. name: "uni-agreements",
  41. computed: {
  42. agreements() {
  43. if(!config.agreements){
  44. return []
  45. }
  46. let {serviceUrl,privacyUrl} = config.agreements
  47. return [
  48. {
  49. url:serviceUrl,
  50. title:"用户服务协议"
  51. },
  52. {
  53. url:privacyUrl,
  54. title:"隐私政策条款"
  55. }
  56. ]
  57. }
  58. },
  59. props: {
  60. scope: {
  61. type: String,
  62. default(){
  63. return 'register'
  64. }
  65. },
  66. },
  67. methods: {
  68. popupConfirm(){
  69. this.isAgree = true
  70. retryFun()
  71. // this.$emit('popupConfirm')
  72. },
  73. popup(Fun){
  74. this.needPopupAgreements = true
  75. // this.needAgreements = true
  76. this.$nextTick(()=>{
  77. if(Fun){
  78. retryFun = Fun
  79. }
  80. this.$refs.popupAgreement.open()
  81. })
  82. },
  83. navigateTo({
  84. url,
  85. title
  86. }) {
  87. uni.navigateTo({
  88. url: '/uni_modules/uni-id-pages/pages/common/webview/webview?url=' + url + '&title=' + title,
  89. success: res => {},
  90. fail: () => {},
  91. complete: () => {}
  92. });
  93. },
  94. hasAnd(agreements, index) {
  95. return agreements.length - 1 > index
  96. },
  97. setAgree(e) {
  98. this.isAgree = !this.isAgree
  99. this.$emit('setAgree', this.isAgree)
  100. }
  101. },
  102. created() {
  103. this.needAgreements = (config?.agreements?.scope || []).includes(this.scope)
  104. },
  105. data() {
  106. return {
  107. isAgree: false,
  108. needAgreements:true,
  109. needPopupAgreements:false
  110. };
  111. }
  112. }
  113. </script>
  114. <style lang="scss" scoped>
  115. /* #ifndef APP-NVUE */
  116. view {
  117. display: flex;
  118. box-sizing: border-box;
  119. flex-direction: column;
  120. }
  121. /* #endif */
  122. .root {
  123. flex-direction: row;
  124. align-items: center;
  125. font-size: 12px;
  126. color: #8a8f8b;
  127. }
  128. .checkbox-box ,.uni-label-pointer{
  129. align-items: center;
  130. display: flex;
  131. flex-direction: row;
  132. }
  133. .item {
  134. flex-direction: row;
  135. }
  136. .text{
  137. line-height: 26px;
  138. }
  139. .agreement {
  140. color: #04498c;
  141. cursor: pointer;
  142. }
  143. .checkbox-box ::v-deep .uni-checkbox-input{
  144. border-radius: 100%;
  145. }
  146. .checkbox-box ::v-deep .uni-checkbox-input.uni-checkbox-input-checked{
  147. border-color: $uni-color-primary;
  148. color: #FFFFFF !important;
  149. background-color: $uni-color-primary;
  150. }
  151. .content{
  152. flex-wrap: wrap;
  153. flex-direction: row;
  154. }
  155. .root ::v-deep .uni-popup__error{
  156. color: #333333;
  157. }
  158. </style>