config.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <template>
  2. <HcNewCard action-size="lg" scrollbar>
  3. <div class="text-lg font-medium mb-4">
  4. 主题模式<span class="text-sm text-slate-400 font-light ml-4">深色模式还未适配,暂不推荐使用深色模式</span>
  5. </div>
  6. <div class="hc-theme-box mb-8">
  7. <el-radio-group v-model="UserTheme" @change="ThemeTabsUpdate">
  8. <template v-for="item in ThemeDatas">
  9. <div :class="UserTheme === item?.key ? 'active' : ''" class="item">
  10. <div :class="item?.key" class="demo">
  11. <img :src="ImgTheme" alt="">
  12. </div>
  13. <div class="action" @click="ThemeConfigClick(item)">
  14. <el-radio :value="item?.key" class="size-xl" size="large">{{ item?.name }}</el-radio>
  15. </div>
  16. </div>
  17. </template>
  18. </el-radio-group>
  19. </div>
  20. <div class="text-lg font-medium mb-4">主题色</div>
  21. <div class="hc-theme-box color-box mb-4">
  22. <template v-for="(item, index) in ColorConfigData">
  23. <div v-if="index < 5" :class="UserColorNmae === item.name ? 'active' : ''" class="item">
  24. <div :class="`bg-${item.name}`" class="demo">
  25. <img :src="ImgColor" alt="">
  26. </div>
  27. <div class="action" @click="ColorConfigClick(item)">
  28. <el-radio v-model="UserColorNmae" :value="item?.name" class="size-xl" size="large">
  29. {{ item?.label }}
  30. </el-radio>
  31. </div>
  32. </div>
  33. </template>
  34. </div>
  35. <div class="hc-theme-box color-box mb-8">
  36. <template v-for="(item, index) in ColorConfigData">
  37. <div v-if="index >= 5" :class="UserColorNmae === item.name ? 'active' : ''" class="item">
  38. <div :class="`bg-${item.name}`" class="demo">
  39. <img :src="ImgColor" alt="">
  40. </div>
  41. <div class="action" @click="ColorConfigClick(item)">
  42. <el-radio v-model="UserColorNmae" :value="item?.name" class="size-xl" size="large">
  43. {{ item?.label }}
  44. </el-radio>
  45. </div>
  46. </div>
  47. </template>
  48. </div>
  49. <div class="text-lg font-medium mb-2">首页背景</div>
  50. <div class="hc-theme-box home-bg-box mb-8">
  51. <template v-for="item in homeConfigData">
  52. <div
  53. :class="HomeTheme.name === item?.name ? 'active' : ''" class="item mt-2"
  54. @click="homeConfigClick(item)"
  55. >
  56. <img :src="item.bg" alt="" crossOrigin="anonymous">
  57. </div>
  58. </template>
  59. </div>
  60. <div class="text-lg font-medium mb-4">截图设置</div>
  61. <div class="hc-screenshot-box mb-4">
  62. <div class="item">
  63. <div class="label">WebRtc:</div>
  64. <el-popover :width="400" placement="top-start" trigger="hover">
  65. <template #reference>
  66. <el-switch
  67. v-model="webRtcVal" active-value="1" inactive-value="0" size="large"
  68. @change="webRtcUpdate"
  69. />
  70. </template>
  71. <div>
  72. <div>
  73. 是否启用WebRtc方式截图,WebRtc方式不会错版,但需要同意授权,调用的是浏览器的共享屏幕API
  74. (可能在某些浏览器上,不支持)。
  75. </div>
  76. <div class="mt-2 mb-2">
  77. 不启用WebRtc时,采用 html2canvas 实现截图,但支持的并不好,容易出现错版。
  78. </div>
  79. <div>但目前市面上,网页截图的仅有这两种方案,推荐使用第三方截图来手动上传图片。</div>
  80. </div>
  81. </el-popover>
  82. </div>
  83. <div class="item">
  84. <div class="label">全屏截图:</div>
  85. <el-popover :width="180" placement="top-start" trigger="hover">
  86. <template #reference>
  87. <el-switch
  88. v-model="fullScreenVal" active-value="1" inactive-value="0" size="large"
  89. @change="fullScreenUpdate"
  90. />
  91. </template>
  92. <div>单击截全屏的启用状态</div>
  93. </el-popover>
  94. </div>
  95. </div>
  96. <div class="text-lg font-medium mb-4">首页模式</div>
  97. <el-radio-group v-model="IndexModel" class="ml-4" @change="changeIndexModel">
  98. <el-radio value="1" size="large">精简模式</el-radio>
  99. <el-radio value="2" size="large">数据模式</el-radio>
  100. </el-radio-group>
  101. <template #action>
  102. <el-popover :width="180" placement="top" trigger="hover">
  103. <template #reference>
  104. <el-button :loading="saveLoading" hc-btn type="primary" @click="SaveConfigClick">
  105. <HcIcon name="save" />
  106. <span>保存配置</span>
  107. </el-button>
  108. </template>
  109. <div>下次登录后,会自动同步,并启用当前配置</div>
  110. </el-popover>
  111. <el-popover :width="180" placement="top-start" trigger="hover">
  112. <template #reference>
  113. <el-button hc-btn @click="CancelClick">
  114. <HcIcon name="arrow-go-back" />
  115. <span>取消</span>
  116. </el-button>
  117. </template>
  118. <div>如果没有保存配置,下次登录后,将恢复到上次保存的配置</div>
  119. </el-popover>
  120. </template>
  121. </HcNewCard>
  122. </template>
  123. <script setup>
  124. import { nextTick, ref } from 'vue'
  125. import { useRoute, useRouter } from 'vue-router'
  126. import { useAppStore } from '~src/store'
  127. import themeData from '~src/config/theme'
  128. import { userConfigSave } from '~api/other'
  129. import ImgTheme from '~src/assets/images/theme.png'
  130. import ImgColor from '~src/assets/images/color.png'
  131. import { setElementMainColor } from 'js-fast-way'
  132. import { useOsTheme } from 'hc-vue3-ui'
  133. //初始变量
  134. const router = useRouter()
  135. const useRoutes = useRoute()
  136. const useAppState = useAppStore()
  137. //配置变量
  138. const UserTheme = ref(useAppState.getTheme)
  139. const UserColor = ref(useAppState.getColor)
  140. const HomeTheme = ref(useAppState.getHomeTheme)
  141. const webRtcVal = ref(useAppState.getShotWebRtc)
  142. const fullScreenVal = ref(useAppState.getFullScreen)
  143. const UserColorNmae = ref(UserColor.value?.name || 'green')
  144. const IndexModel = ref(useAppState.getIndexModel)
  145. //颜色
  146. const ColorConfigData = ref(themeData.color)
  147. //更改主色调
  148. const ColorConfigClick = (item) => {
  149. useAppState.setColor(item)
  150. UserColorNmae.value = item?.name
  151. //设置主色调
  152. setElementMainColor(item?.color)
  153. nextTick(() => {
  154. UserColor.value = item
  155. })
  156. }
  157. //更改主题设置
  158. const ThemeDatas = ref([
  159. { key: 'auto', name: '跟随系统' },
  160. { key: 'light', name: '浅色模式' },
  161. { key: 'dark', name: '深色模式' },
  162. ])
  163. const ThemeConfigClick = (item) => {
  164. ThemeTabsUpdate(item?.key)
  165. }
  166. const ThemeTabsUpdate = (val) => {
  167. UserTheme.value = val
  168. useAppState.setTheme(val)
  169. if (val === 'auto') {
  170. useAppState.setThemeVal(useOsTheme())
  171. } else {
  172. useAppState.setThemeVal(val)
  173. }
  174. let colorName = UserColorNmae.value || 'green'
  175. document.documentElement.setAttribute('class', `${val} color-${colorName}`)
  176. }
  177. //更改首页主题
  178. const homeConfigData = ref(themeData.home)
  179. const homeConfigClick = (item) => {
  180. HomeTheme.value = item
  181. useAppState.setHomeTheme(item)
  182. }
  183. //更改截图方式
  184. const webRtcUpdate = (val) => {
  185. useAppState.setShotWebRtc(val)
  186. }
  187. //更改全屏截图方式
  188. const fullScreenUpdate = (val) => {
  189. useAppState.setFullScreen(val)
  190. }
  191. //更改首页模式
  192. const changeIndexModel = (val) => {
  193. useAppState.setIndexModel(val)
  194. }
  195. //取消配置
  196. const CancelClick = () => {
  197. router.back()
  198. }
  199. //首页模式
  200. const radio1 = ref('1')
  201. //保存配置
  202. const saveLoading = ref(false)
  203. const SaveConfigClick = async () => {
  204. //发起请求
  205. saveLoading.value = true
  206. const { error, code } = await userConfigSave({
  207. theme: UserTheme.value,
  208. color: UserColorNmae.value,
  209. homeTheme: HomeTheme.value?.name,
  210. shotWebRtc: webRtcVal.value,
  211. fullScreen: fullScreenVal.value,
  212. indexModel:IndexModel.value,
  213. })
  214. //判断状态
  215. saveLoading.value = false
  216. if (!error && code === 200) {
  217. window?.$message?.success('保存成功')
  218. router.back()
  219. } else {
  220. window?.$message?.error('保存失败,请稍后再试')
  221. }
  222. }
  223. </script>
  224. <style lang="scss" scoped>
  225. @import "../../styles/view/config.scss";
  226. </style>