Versions.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <div class="mt10 df aic jcsb">
  3. <div>
  4. <el-button type="primary" class="mb20 mr30" @click="isModalVisable = true"
  5. >添加版本记录</el-button
  6. >
  7. <el-popover placement="bottom" trigger="hover" :width="240">
  8. <div style="width: 100%; height: 80vh; overflow-y: scroll">
  9. <el-timeline>
  10. <el-timeline-item
  11. v-for="item in store.state.versions"
  12. center
  13. :timestamp="item.timer"
  14. placement="top"
  15. >
  16. <div class="log-card">
  17. <p style="margin-bottom: 10px">Version: {{ item.version }}</p>
  18. <div
  19. style="margin-bottom: 5px; font-size: 12px"
  20. v-for="(item1, index) in item.remarks"
  21. >
  22. {{ index + 1 }}. {{ item1.text }}
  23. </div>
  24. </div>
  25. </el-timeline-item>
  26. </el-timeline>
  27. </div>
  28. <template #reference>
  29. <el-badge value="new">
  30. <!-- <div class="log">新功能日志</div> -->
  31. <el-button> 新功能日志</el-button>
  32. </el-badge>
  33. </template>
  34. </el-popover>
  35. </div>
  36. <div>
  37. <!-- <el-button @click="">返回版本记录列表</el-button>
  38. <el-button class="mr20 ml20" type="warning" @click="trash"
  39. >回收站</el-button
  40. > -->
  41. </div>
  42. <el-dialog
  43. title="版本管理"
  44. width="500px"
  45. v-model="isModalVisable"
  46. @closed="cancel"
  47. >
  48. <el-form
  49. ref="ruleFormRef"
  50. :model="ruleForm"
  51. :rules="rules"
  52. class="demo-ruleForm"
  53. label-width="100px"
  54. label-position="left"
  55. >
  56. <el-form-item label="版本号" prop="version">
  57. <el-input style="width: 240px" v-model="ruleForm.version"></el-input>
  58. </el-form-item>
  59. <el-form-item label="发布时间" prop="timer">
  60. <el-date-picker
  61. style="width: 240px"
  62. v-model="ruleForm.timer"
  63. type="date"
  64. placeholder="请选择日期"
  65. format="YYYY/MM/DD"
  66. value-format="YYYY/MM/DD"
  67. >
  68. </el-date-picker>
  69. </el-form-item>
  70. <hr class="mb20" />
  71. <el-form-item
  72. v-for="(item, index) in ruleForm.remarks"
  73. :label="'发布内容 ' + parseInt(index + 1) + ' :'"
  74. prop="remarks"
  75. >
  76. <div class="df aic jcsb">
  77. <el-input
  78. type="textarea"
  79. style="width: 240px"
  80. v-model="item.text"
  81. autosize
  82. ></el-input>
  83. <el-button size="small" @click="deleteRemark(index)" type="danger"
  84. >删除</el-button
  85. >
  86. </div>
  87. </el-form-item>
  88. <div class="df aic jcfe">
  89. <el-button
  90. size="small"
  91. type="primary"
  92. @click="ruleForm.remarks.push({})"
  93. >添加一条记录</el-button
  94. >
  95. </div>
  96. <hr class="mt20 mb20" />
  97. <div class="df aic jcfe">
  98. <el-button @click="cancel(ruleFormRef)">取消</el-button>
  99. <el-button type="primary" @click="add(ruleFormRef)">提交</el-button>
  100. </div>
  101. </el-form>
  102. </el-dialog>
  103. </div>
  104. <el-table :data="versions">
  105. <el-table-column
  106. type="index"
  107. label="序号"
  108. min-width="120"
  109. align="center"
  110. ></el-table-column>
  111. <el-table-column
  112. prop="version"
  113. label="版本号"
  114. min-width="100"
  115. align="center"
  116. ></el-table-column>
  117. <el-table-column
  118. prop="timer"
  119. label="发布时间"
  120. min-width="100"
  121. align="center"
  122. ></el-table-column>
  123. <el-table-column label="版本内容" min-width="150" align="center">
  124. <template v-slot="scope">
  125. <div
  126. style="width: 100%; text-align: left"
  127. v-for="(item, index) in scope.row.remarks"
  128. >
  129. {{ index + 1 + ". " + item.text }}
  130. </div>
  131. </template>
  132. </el-table-column>
  133. <el-table-column label="状态" min-width="150" align="center">
  134. <template v-slot="scope">
  135. <el-switch
  136. v-model="scope.row.disabled"
  137. active-color="#13ce66"
  138. :active-value="false"
  139. :inactive-value="true"
  140. inactive-color="#ff4949"
  141. @change="changeSwitch($event, scope.row._id)"
  142. />
  143. </template>
  144. </el-table-column>
  145. <el-table-column label="操作" min-width="150" align="center">
  146. <template v-slot="scope">
  147. <el-button
  148. @click="detail(scope.row, scope.$index)"
  149. type="primary"
  150. size="small"
  151. >
  152. 修改
  153. </el-button>
  154. <el-button
  155. @click="deleteItem(scope.row._id, scope.$index)"
  156. type="danger"
  157. size="small"
  158. >
  159. 删除
  160. </el-button>
  161. </template>
  162. </el-table-column>
  163. </el-table>
  164. </template>
  165. <script setup>
  166. import { AnonymousLogin, tcb } from "apis/cloudLogin";
  167. import _ from "lodash";
  168. import { ElMessage, ElMessageBox } from "element-plus";
  169. import store from "../../store";
  170. const db = tcb.database();
  171. const v = db.collection("huihenduo_versions");
  172. const __ = db.command;
  173. import { reactive, ref, onMounted } from "vue";
  174. let versions = ref([]);
  175. let isModalVisable = ref(false);
  176. let ruleFormRef = ref(null);
  177. let currentPage = ref(1);
  178. let pageSize = ref(10);
  179. let currentVersionId = ref(null);
  180. function detail(item1) {
  181. let item = _.cloneDeep(item1);
  182. let { _id, version, timer, remarks } = item;
  183. currentVersionId.value = _id;
  184. ruleForm.value = { version, timer, remarks };
  185. isModalVisable.value = true;
  186. }
  187. async function deleteItem(_id) {
  188. ElMessageBox.confirm("确认删除版本日志?", "Warning", {
  189. confirmButtonText: "删除",
  190. cancelButtonText: "取消",
  191. type: "warning",
  192. })
  193. .then(async () => {
  194. let res = await v.doc(_id).update({
  195. deleted: true,
  196. });
  197. getAllVersions();
  198. })
  199. .catch(() => {
  200. ElMessage({
  201. type: "info",
  202. message: "取消删除",
  203. });
  204. });
  205. }
  206. async function changeSwitch(disabled, id) {
  207. let res = await v.doc(id).update({
  208. disabled,
  209. });
  210. getAllVersions();
  211. }
  212. function deleteRemark(index) {
  213. ruleForm.value.remarks.splice(index, 1);
  214. }
  215. async function add() {
  216. ruleFormRef.value.validate(async (valid) => {
  217. if (valid) {
  218. let res;
  219. for (let i in ruleForm.value.remarks) {
  220. if (!ruleForm.value.remarks[i].text) {
  221. ruleForm.value.remarks.splice(i, 1);
  222. }
  223. }
  224. if (currentVersionId.value) {
  225. res = await v.doc(currentVersionId.value).update({
  226. ...ruleForm.value,
  227. updateTime: db.serverDate(),
  228. });
  229. } else {
  230. res = await v.add({
  231. ...ruleForm.value,
  232. disabled: false,
  233. createTime: db.serverDate(),
  234. });
  235. }
  236. getAllVersions();
  237. cancel();
  238. } else {
  239. console.log("未提交", ruleForm.value);
  240. }
  241. });
  242. }
  243. async function getAllVersions(listType) {
  244. let res = await v
  245. .where({ deleted: __.neq(true) })
  246. .skip((currentPage.value - 1) * pageSize.value)
  247. .limit(pageSize.value)
  248. .get();
  249. versions.value = res.data.reverse();
  250. getAbledVersions();
  251. }
  252. let abledVersions = ref([]);
  253. async function getAbledVersions() {
  254. let res = await v
  255. .where({ disabled: false, deleted: __.neq(true) })
  256. .skip((currentPage.value - 1) * pageSize.value)
  257. .limit(pageSize.value)
  258. .get();
  259. abledVersions.value = res.data.reverse();
  260. store.commit("setVersions", abledVersions.value);
  261. }
  262. function cancel() {
  263. isModalVisable.value = false;
  264. ruleForm.value = {
  265. version: "",
  266. timer: "",
  267. remarks: [{}, {}, {}],
  268. };
  269. currentVersionId.value = null;
  270. }
  271. let ruleForm = ref({
  272. version: "",
  273. timer: "",
  274. remarks: [{}, {}, {}],
  275. });
  276. const rules = reactive({
  277. version: [
  278. {
  279. required: true,
  280. message: "请填写版本号",
  281. trigger: "blur",
  282. },
  283. ],
  284. timer: [
  285. {
  286. required: true,
  287. message: "请填写发布时间",
  288. trigger: "blur",
  289. },
  290. ],
  291. });
  292. async function init() {
  293. await AnonymousLogin();
  294. getAllVersions();
  295. }
  296. onMounted(() => {
  297. init();
  298. });
  299. </script>
  300. <style scoped>
  301. </style>