index.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <template>
  2. <div class="__normal-page">
  3. <div class="__normal-content">
  4. <div class="block">
  5. <div class="block-title">
  6. <span>01 签卡设置</span>
  7. <img class="icon" src="./icon.png"/>
  8. </div>
  9. <div class="block-content">
  10. <div class="item">
  11. <div class="item-label">签到时间:</div>
  12. <div class="item-form" v-loading="loading['sign.begin.time']">
  13. <CusFormColumn
  14. :span="24"
  15. link="time"
  16. v-model:param="form['sign.begin.time']"
  17. :clearable="false"
  18. @change="editKey('sign.begin.time')"/>
  19. </div>
  20. </div>
  21. <div class="item">
  22. <div class="item-label">签到提醒时间:</div>
  23. <div class="item-form" v-loading="loading['sign.remind.time']">
  24. <CusFormColumn
  25. :span="24"
  26. link="select"
  27. v-model:param="form['sign.remind.time']"
  28. :options="$store.state.dictionary.configSignRemindTimeList"
  29. :clearable="false"
  30. @change="editKey('sign.remind.time')"/>
  31. </div>
  32. </div>
  33. <div class="item">
  34. <div class="item-label">签退时间:</div>
  35. <div class="item-form" v-loading="loading['sign.end.time']">
  36. <CusFormColumn
  37. :span="24"
  38. link="time"
  39. v-model:param="form['sign.end.time']"
  40. :clearable="false"
  41. @change="editKey('sign.end.time')"/>
  42. </div>
  43. </div>
  44. </div>
  45. </div>
  46. <div class="block">
  47. <div class="block-title">
  48. <span>02 日志设置</span>
  49. <img class="icon" src="./icon.png"/>
  50. </div>
  51. <div class="block-content">
  52. <div class="item">
  53. <div class="item-label">截止提交时间:</div>
  54. <div class="item-form" v-loading="loading['log.submit.time']">
  55. <CusFormColumn
  56. :span="24"
  57. link="time"
  58. v-model:param="form['log.submit.time']"
  59. :clearable="false"
  60. @change="editKey('log.submit.time')"/>
  61. </div>
  62. </div>
  63. <div class="item">
  64. <div class="item-label">日志提交提醒时间:</div>
  65. <div class="item-form" v-loading="loading['log.remind.time']">
  66. <CusFormColumn
  67. :span="24"
  68. link="select"
  69. v-model:param="form['log.remind.time']"
  70. :options="$store.state.dictionary.configLogRemindTimeList"
  71. :clearable="false"
  72. @change="editKey('log.remind.time')"/>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <div class="block">
  78. <div class="block-title">
  79. <span>03 周报设置</span>
  80. <img class="icon" src="./icon.png"/>
  81. </div>
  82. <div class="block-content">
  83. <div class="item">
  84. <div class="item-label">截止提交时间:</div>
  85. <div class="item-form week">
  86. <div class="col" v-loading="loading['week.submit.date']">
  87. {{$store.state.dictionary.configWeekSubmitDateMap.get(form['week.submit.date'])}}
  88. <!-- <CusFormColumn-->
  89. <!-- :span="24"-->
  90. <!-- link="select"-->
  91. <!-- v-model:param="form['week.submit.date']"-->
  92. <!-- :options="$store.state.dictionary.configWeekSubmitDateList"-->
  93. <!-- :clearable="false"-->
  94. <!-- @change="editKey('week.submit.date')"/>-->
  95. </div>
  96. <div class="col" v-loading="loading['week.submit.time']">
  97. <CusFormColumn
  98. :span="24"
  99. link="time"
  100. v-model:param="form['week.submit.time']"
  101. :clearable="false"
  102. @change="editKey('week.submit.time')"/>
  103. </div>
  104. </div>
  105. </div>
  106. <div class="item">
  107. <div class="item-label">周报提交提醒时间:</div>
  108. <div class="item-form" v-loading="loading['week.remind.time']">
  109. <CusFormColumn
  110. :span="24"
  111. link="select"
  112. v-model:param="form['week.remind.time']"
  113. :options="$store.state.dictionary.configWeekRemindTimeList"
  114. :clearable="false"
  115. @change="editKey('week.remind.time')"/>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. </template>
  123. <script lang="ts">
  124. import {
  125. defineComponent,
  126. computed,
  127. onMounted,
  128. ref,
  129. reactive,
  130. watch,
  131. getCurrentInstance,
  132. ComponentInternalInstance,
  133. toRefs,
  134. nextTick
  135. } from 'vue'
  136. import {useStore} from 'vuex'
  137. import {useRouter, useRoute} from 'vue-router'
  138. import { ElMessage } from 'element-plus';
  139. export default defineComponent({
  140. name: '',
  141. components: {},
  142. setup(props, {emit}) {
  143. const store = useStore();
  144. const router = useRouter();
  145. const route = useRoute();
  146. const that = (getCurrentInstance() as ComponentInternalInstance).appContext.config.globalProperties
  147. const state = reactive({
  148. form: {
  149. 'sign.begin.time': '',
  150. 'sign.remind.time': '',
  151. 'sign.end.time': '',
  152. 'log.submit.time': '',
  153. 'log.remind.time': '',
  154. 'week.submit.date': '',
  155. 'week.submit.time': '',
  156. 'week.remind.time': '',
  157. },
  158. loading: {
  159. 'sign.begin.time': false,
  160. 'sign.remind.time': false,
  161. 'sign.end.time': false,
  162. 'log.submit.time': false,
  163. 'log.remind.time': false,
  164. 'week.submit.date': false,
  165. 'week.submit.time': false,
  166. 'week.remind.time': false,
  167. }
  168. })
  169. const initDictionary = () => {
  170. store.dispatch('dictionary/LOAD_DICT_LIST', 'config_sign_remind_time')
  171. store.dispatch('dictionary/LOAD_DICT_LIST', 'config_log_remind_time')
  172. store.dispatch('dictionary/LOAD_DICT_LIST', 'config_week_remind_time')
  173. store.dispatch('dictionary/LOAD_DICT_LIST', 'config_week_submit_date')
  174. }
  175. const initKey = (key) => {
  176. state.loading[key] = true
  177. store.dispatch('app/LOAD_PUBLIC_CONFIG', key).then(res => {
  178. state.loading[key] = false
  179. })
  180. }
  181. const editKey = (key) => {
  182. // select onChange方法有延迟,为了兼容time和select,加个延时
  183. setTimeout(() => {
  184. state.loading[key] = true
  185. store.dispatch('app/LOAD_PUBLIC_CONFIG', {
  186. key: key,
  187. value: state.form[key]
  188. }).then(res => {
  189. state.form[key] = JSON.parse(JSON.stringify(store.state.app.publicConfig[key]))
  190. state.loading[key] = false
  191. })
  192. }, 100)
  193. }
  194. onMounted(() => {
  195. initDictionary()
  196. state.form = JSON.parse(JSON.stringify(store.state.app.publicConfig))
  197. })
  198. return {
  199. ...toRefs(state),
  200. editKey
  201. }
  202. },
  203. })
  204. </script>
  205. <style scoped lang="scss">
  206. .__normal-content {
  207. display: grid;
  208. grid-template-columns: repeat(3, 1fr);
  209. column-gap: 32px;
  210. padding-top: 40px;
  211. padding-right: 30px;
  212. .block {
  213. display: flex;
  214. flex-direction: column;
  215. .block-title {
  216. width: 100%;
  217. height: 45px;
  218. background-image: url("./title-bg.png");
  219. background-repeat: no-repeat;
  220. background-size: 100% 100%;
  221. display: flex;
  222. align-items: center;
  223. padding-left: 20px;
  224. font-size: 17px;
  225. font-family: Microsoft YaHei-Bold, Microsoft YaHei;
  226. font-weight: bold;
  227. color: #FFFAF9;
  228. box-sizing: border-box;
  229. >span {
  230. margin-right: 8px;
  231. }
  232. }
  233. .block-content {
  234. flex: 1;
  235. margin-top: 24px;
  236. background-color: rgba(0,108,255,0.1);
  237. border-radius: 8px;
  238. border: 1px solid rgba(54,155,255,0.2);
  239. padding: 24px;
  240. .item {
  241. .item-label {
  242. font-size: 16px;
  243. font-family: PingFang SC-Medium, PingFang SC;
  244. font-weight: 500;
  245. color: rgba(255,255,255,0.6);
  246. margin-bottom: 10px;
  247. }
  248. .item-form {
  249. display: flex;
  250. align-items: center;
  251. justify-content: space-between;
  252. &.week {
  253. .col:first-child {
  254. width: 80px;
  255. line-height: 34px;
  256. align-self: flex-start;
  257. }
  258. .col:last-child {
  259. width: calc(100% - 80px);
  260. }
  261. }
  262. }
  263. }
  264. }
  265. }
  266. }
  267. </style>