index.wxml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <!--index.wxml-->
  2. <view class="container" hidden='{{clockShow}}' style="{{containerStyle}}">
  3. <!-- 时间滑块 -->
  4. <view class="time-picker-container" style="{{containerStyle}}">
  5. <view class="time-picker-header">
  6. <text class="time-picker-title" style="{{containerStyle}}">专注时长</text>
  7. <view class="time-value-display">
  8. <text class="time-number">{{time}}</text>
  9. <text class="time-unit">分钟</text>
  10. </view>
  11. </view>
  12. <view class="slider-container" style="{{containerStyle}}">
  13. <slider
  14. min="1"
  15. max="120"
  16. step="1"
  17. value="{{time}}"
  18. activeColor="{{sliderStyle || '#FF6B81'}}"
  19. backgroundColor="#F0F0F0"
  20. block-color="{{sliderStyle || '#FF6B81'}}"
  21. block-size="28"
  22. bindchange="slideChange"
  23. />
  24. <view class="slider-scale" style="{{containerStyle}}">
  25. <view class="scale-mark" style="left: 0%">
  26. <view class="scale-line"></view>
  27. <text class="scale-label">1</text>
  28. </view>
  29. <view class="scale-mark" style="left: 12.5%">
  30. <view class="scale-line"></view>
  31. <text class="scale-label">15</text>
  32. </view>
  33. <view class="scale-mark" style="left: 25%">
  34. <view class="scale-line"></view>
  35. <text class="scale-label">30</text>
  36. </view>
  37. <view class="scale-mark" style="left: 37.5%">
  38. <view class="scale-line"></view>
  39. <text class="scale-label">45</text>
  40. </view>
  41. <view class="scale-mark" style="left: 50%">
  42. <view class="scale-line major" style="background-color: {{sliderStyle || '#FF6B81'}}"></view>
  43. <text class="scale-label major-label" style="color: {{sliderStyle || '#FF6B81'}}">60</text>
  44. </view>
  45. <view class="scale-mark" style="left: 75%">
  46. <view class="scale-line"></view>
  47. <text class="scale-label">90</text>
  48. </view>
  49. <view class="scale-mark" style="left: 100%">
  50. <view class="scale-line major" style="background-color: {{sliderStyle || '#FF6B81'}}"></view>
  51. <text class="scale-label major-label" style="color: {{sliderStyle || '#FF6B81'}}">120</text>
  52. </view>
  53. </view>
  54. </view>
  55. </view>
  56. <!-- 任务选择区域 -->
  57. <view class='content-section' style="{{containerStyle}}">
  58. <view class='section-header'>
  59. <text class="section-title" style="{{containerStyle}}">选择一个任务</text>
  60. <text class="section-subtitle" style="{{containerStyle}}">在接下来的{{time}}分钟内,你将专注做这件事</text>
  61. </view>
  62. <view class='task-categories' style="{{containerStyle}}">
  63. <view wx:for="{{cateArr}}" class='category-item' wx:key="cate" bindtap='clickCate' data-index="{{index}}">
  64. <view class='category-icon {{index == cateActive && !selectedPlan ? "active":""}}'>
  65. <image src='../../images/{{item.icon}}.png'></image>
  66. </view>
  67. <view class='category-name'>{{item.text}}</view>
  68. </view>
  69. <view class='category-item' bindtap='showCustomTaskInput'>
  70. <view class='category-icon {{showCustomInput && !selectedPlan ? "active":""}}'>
  71. <text class="custom-icon">+</text>
  72. </view>
  73. <view class='category-name'>自定义</view>
  74. </view>
  75. </view>
  76. <!-- 自定义任务输入区域 -->
  77. <view class='custom-task-section' wx:if="{{showCustomInput}}" style="{{containerStyle}}">
  78. <input placeholder="请输入任务内容..." style="{{containerStyle}}" placeholder-class="placeholder"
  79. value="{{customTask}}" bindinput="inputCustomTask" class="task-input"/>
  80. <view class="action-buttons">
  81. <button bindtap="savePlan" class="save-btn">{{editMode ? '更新计划' : '保存计划'}}</button>
  82. <button bindtap="start" class="start-btn" wx:if="{{customTask}}">直接开始</button>
  83. </view>
  84. </view>
  85. <!-- 当前选择的任务展示 -->
  86. <view class="current-task-card" wx:if="{{selectedPlan || (cateActive !== null) || (showCustomInput && customTask)}}">
  87. <view class="task-card-header">
  88. <text class="card-title">当前任务</text>
  89. <view class="task-time-badge" style="{{containerStyle}}">{{time}}分钟</view>
  90. </view>
  91. <view class="task-content" style="{{containerStyle}}">
  92. {{selectedPlan ? selectedPlan.content : (cateActive !== null ? cateArr[cateActive].text : customTask)}}
  93. </view>
  94. <view class="task-actions" wx:if="{{selectedPlan}}">
  95. <view class='action-btn edit-btn' bindtap='editPlan' data-index="{{plans.indexOf(selectedPlan)}}" style="{{containerStyle}}">
  96. <image src="../../images/edit.png" class="action-icon"></image>
  97. <text>编辑</text>
  98. </view>
  99. <view class='action-btn delete-btn' bindtap='deletePlan' data-index="{{plans.indexOf(selectedPlan)}}" style="{{containerStyle}}">
  100. <image src="../../images/delete.png" class="action-icon"></image>
  101. <text>删除</text>
  102. </view>
  103. </view>
  104. <button bindtap="start" class="start-focus-btn" style="background-color: {{theme.primaryColor}}; color: {{theme.textColor}}">开始专注</button>
  105. </view>
  106. </view>
  107. <!-- 计划列表 -->
  108. <view class='content-section' wx:if="{{plans.length > 0}}" style="{{containerStyle}}">
  109. <view class='section-header'>
  110. <text class="section-title" style="{{containerStyle}}">我的计划</text>
  111. <text class="plan-count">共{{plans.length}}项任务</text>
  112. </view>
  113. <view wx:for="{{plans}}" wx:key="id" class='plan-card {{selectedPlan && selectedPlan.id == item.id ? "active":""}}'>
  114. <view class='plan-content' bindtap='selectPlan' data-index="{{index}}">
  115. <view class="plan-text" style="{{containerStyle}}">{{item.content}}</view>
  116. <view class="plan-meta">
  117. <text class="plan-time">{{item.time}}分钟</text>
  118. <text class="plan-date">{{util.formatDate(item.createdAt)}}</text>
  119. </view>
  120. </view>
  121. <view class='plan-actions'>
  122. <view class='action-btn edit-btn' bindtap='editPlan' data-index="{{index}}" style="{{containerStyle}}">
  123. <image src="../../images/edit.png" class="action-icon"></image>
  124. <text>编辑</text>
  125. </view>
  126. <view class='action-btn delete-btn' bindtap='deletePlan' data-index="{{index}}" style="{{containerStyle}}">
  127. <image src="../../images/delete.png" class="action-icon"></image>
  128. <text>删除</text>
  129. </view>
  130. </view>
  131. </view>
  132. </view>
  133. <!-- 开始按钮 -->
  134. <button class='primary-btn' bindtap='start' wx:if="{{!selectedPlan && cateActive === null && !showCustomInput}}" style="background-color: {{theme.primaryColor}}; color: {{theme.textColor}}">
  135. 开始专注
  136. </button>
  137. <view class='back' style="{{containerStyle}}"></view>
  138. </view>
  139. <!-- 专注时钟界面 -->
  140. <view class='focus-clock' hidden='{{!clockShow}}' style='height:{{clockHeight}}rpx'>
  141. <view class='progress-container'>
  142. <canvas canvas-id='progress_bg' class='progress-bg'></canvas>
  143. <canvas canvas-id='progress_active' class='progress-active'></canvas>
  144. <view class='time-display'>{{timeStr}}</view>
  145. <view class='task-name'>{{currentTask}}</view>
  146. </view>
  147. <view class='control-buttons'>
  148. <view class='action-button finish-btn' bindtap='ok' wx:if="{{okShow}}">
  149. <image src="../../images/check.png" class="btn-icon"></image>
  150. <text>完成</text>
  151. </view>
  152. <view class='action-button pause-btn' bindtap='pause' wx:if="{{pauseShow}}">
  153. <image src="../../images/pause.png" class="btn-icon"></image>
  154. <text>暂停</text>
  155. </view>
  156. <view class='action-buttons-group' wx:if="{{continueCancleShow}}">
  157. <view class='action-button continue-btn' bindtap='continue'>
  158. <image src="../../images/play.png" class="btn-icon"></image>
  159. <text>继续</text>
  160. </view>
  161. <view class='action-button cancel-btn' bindtap='cancle'>
  162. <image src="../../images/close.png" class="btn-icon"></image>
  163. <text>放弃</text>
  164. </view>
  165. </view>
  166. </view>
  167. </view>