app-list.blade.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. @extends('layouts.base')
  2. @section('title', 'app版本管理')
  3. @section('content')
  4. <link rel="stylesheet" type="text/css" href="{{static_url('yunshop/goods/vue-goods1.css')}}"/>
  5. <link rel="stylesheet" type="text/css" href="{{static_url('yunshop/goods/vue-ohter.css')}}"/>
  6. <style>
  7. .edit-i {
  8. display: none;
  9. }
  10. .el-table_1_column_2:hover .edit-i {
  11. font-weight: 900;
  12. padding: 0;
  13. margin: 0;
  14. display: inline-block;
  15. }
  16. .el-tabs__item, .is-top {
  17. font-size: 16px
  18. }
  19. .el-tabs__active-bar {
  20. height: 3px;
  21. }
  22. /*.el-select .el-input {*/
  23. /* width: 120px;*/
  24. /*}*/
  25. .input-with-select .el-input-group__prepend {
  26. background-color: #fff;
  27. }
  28. </style>
  29. <div class="all">
  30. <div id="app" v-cloak>
  31. <div class="vue-head">
  32. <div class="vue-search">
  33. <el-form :inline="true" :model="search_form" class="demo-form-inline">
  34. <el-form-item label="">
  35. <el-input v-model="search_form.version" placeholder="版本号"></el-input>
  36. </el-form-item>
  37. <el-form-item label="">
  38. <el-input v-model="search_form.log" placeholder="更新日志关键词"></el-input>
  39. </el-form-item>
  40. <el-form-item>
  41. <el-select v-model="search_form.time_search" placeholder="不搜索时间">
  42. <el-option
  43. v-for="(item,index) in ts_arr"
  44. :key="index"
  45. :label="item.label"
  46. :value="item.value">
  47. </el-option>
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item>
  51. <div class="block">
  52. <span class="demonstration"></span>
  53. <el-date-picker
  54. v-model="search_form.time_arr"
  55. type="datetimerange"
  56. :picker-options="pickerOptions"
  57. range-separator="至"
  58. start-placeholder="开始日期"
  59. end-placeholder="结束日期"
  60. value-format="timestamp"
  61. align="right">
  62. </el-date-picker>
  63. </div>
  64. </el-form-item>
  65. <el-button type="primary" @click="changeForm()">搜索</el-button>
  66. </el-form>
  67. </div>
  68. </div>
  69. <div class="vue-main">
  70. <div class="vue-main-form">
  71. <div class="vue-main-title" style="margin-top:-10px">
  72. <div class="title"><span
  73. style="width: 4px;height: 18px;background-color: #29ba9c;margin-right:15px;display:inline-block;"></span><b>app版本管理</b>
  74. </div>
  75. <el-button style="margin-left: 7px" @click="openUrl(download_page_url)" type="primary"
  76. size="small">下载链接
  77. </el-button>
  78. <el-button style="margin-left: 7px" @click="showAppModal()" type="success " size="small">添加版本
  79. </el-button>
  80. </div>
  81. </div>
  82. <div style="margin-bottom:20px">
  83. </div>
  84. <el-table :data="list" style="width: 100%;" align="center" :fit="true">
  85. <el-table-column min-width="15%" prop="id" label="ID" align="center"></el-table-column>
  86. <el-table-column min-width="15%" prop="created_at" label="添加时间" align="center"></el-table-column>
  87. <el-table-column min-width="15%" prop="version" label="版本号" align="center"></el-table-column>
  88. <el-table-column min-width="20%" prop="show_log" align="center" label="更新日志"></el-table-column>
  89. <el-table-column min-width="15%" label="状态" align="center">
  90. <template slot-scope="scope">
  91. <el-switch
  92. :active-value="1"
  93. :inactive-value="0"
  94. v-model="scope.row.state"
  95. active-color="#13ce66"
  96. inactive-color="#ff4949"
  97. @change="openState(scope.row)"
  98. >
  99. </el-switch>
  100. </template>
  101. </el-table-column>
  102. <el-table-column min-width="20%" label="操作" align="center">
  103. <template slot-scope="scope">
  104. <el-button type="" @click="showEditModal(scope.row)" icon="el-icon-edit-outline"
  105. circle></el-button>
  106. <el-button @click="openUrl(scope.row.url,'复制下载链接成功')" type="primary" icon="el-icon-download"
  107. circle></el-button>
  108. <el-button @click="openUrl(scope.row.download_page_url)" type="warning"
  109. icon="el-icon-paperclip" circle></el-button>
  110. <el-button @click="delApp(scope.row)" type="danger"
  111. icon="el-icon-delete" circle></el-button>
  112. </template>
  113. </el-table-column>
  114. </el-table>
  115. </div>
  116. <div class="vue-page" v-if="total > 0">
  117. <el-row>
  118. <el-col align="right">
  119. <el-pagination layout="prev, pager, next,jumper" @current-change="getData" :total="total"
  120. :page-size="per_page" :current-page="current_page" background
  121. ></el-pagination>
  122. </el-col>
  123. </el-row>
  124. </div>
  125. <el-dialog title="上传app" :visible.sync="app_show" width="30%">
  126. <el-upload
  127. class="upload-demo"
  128. drag
  129. :action="upload_url"
  130. :before-upload="beforeAppUpload"
  131. :on-success="uploadSuccess"
  132. :on-error="uploadFailed"
  133. :limit=1
  134. :file-list="app_list"
  135. ref="app-upload"
  136. multiple>
  137. <i class="el-icon-upload"></i>
  138. <div v-if="app_modal_text1" class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  139. <div v-if="app_modal_text2" class="el-upload__text">文件上传中,请稍后....</div>
  140. <div class="el-upload__tip" slot="tip">只能上传安卓apk文件</div>
  141. </el-upload>
  142. </el-dialog>
  143. <el-dialog title="编辑版本" :visible.sync="edit_modal.show" width="50%">
  144. <div>
  145. <el-row>
  146. <el-col :span="3" align="right">
  147. <el-image style="width: 100%;height: 100%;" :src="edit_modal.image"></el-image>
  148. </el-col>
  149. <el-col :span="19" align="left" style="margin-left: 20px">
  150. <p>[[edit_modal.version]]([[edit_modal.apk_name]])</p>
  151. <p>[[edit_modal.name]]</p>
  152. </el-col>
  153. </el-row>
  154. </div>
  155. <div style="margin-top:20px;">
  156. <el-row>
  157. <el-col :span="2">
  158. <label>更新日志</label>
  159. </el-col>
  160. <el-col :span="20" align="left" style="margin-left: 5px">
  161. <el-input type="textarea" v-model="edit_modal.log" style="width: 80%;" rows="10"
  162. placeholder="请输入app更新日志"></el-input>
  163. </el-col>
  164. </el-row>
  165. </div>
  166. <span slot="footer" class="dialog-footer">
  167. <el-button type="primary" @click="editApp()">提交</el-button>
  168. <el-button @click="edit_modal.show = false">取 消</el-button>
  169. </span>
  170. </el-dialog>
  171. </div>
  172. <!-- 分页 -->
  173. </div>
  174. </div>
  175. <script>
  176. var app = new Vue({
  177. el: "#app",
  178. delimiters: ['[[', ']]'],
  179. name: 'test',
  180. data() {
  181. return {
  182. list: [],
  183. total: 1,
  184. per_page: 1,
  185. current_page: 1,
  186. upload_url: '',
  187. download_page_url: '',
  188. app_show: false,
  189. app_modal_text1: true,
  190. app_modal_text2: false,
  191. app_list: [],
  192. edit_modal: {
  193. show: false,
  194. id: 0,
  195. log: '',
  196. name: '',
  197. apk_name: '',
  198. version: '',
  199. image: '',
  200. },
  201. search_form: {
  202. 'time_search': '0',
  203. 'time_arr': [new Date().getTime(), new Date().getTime()],
  204. 'log': '',
  205. 'version': ''
  206. },
  207. ts_arr: [
  208. {value: '0', label: '不搜索时间'},
  209. {value: '1', label: '创建时间'}
  210. ],
  211. search_data: {},
  212. pickerOptions: {
  213. shortcuts: [{
  214. text: '最近一周',
  215. onClick(picker) {
  216. const end = new Date();
  217. const start = new Date();
  218. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  219. picker.$emit('pick', [start, end]);
  220. }
  221. }, {
  222. text: '最近一个月',
  223. onClick(picker) {
  224. const end = new Date();
  225. const start = new Date();
  226. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  227. picker.$emit('pick', [start, end]);
  228. }
  229. }, {
  230. text: '最近三个月',
  231. onClick(picker) {
  232. const end = new Date();
  233. const start = new Date();
  234. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  235. picker.$emit('pick', [start, end]);
  236. }
  237. }]
  238. },
  239. }
  240. },
  241. created() {
  242. // this.address_select.province = this.address_list.province;
  243. },
  244. mounted() {
  245. this.search();
  246. },
  247. methods: {
  248. copyUrl(url,msg) {
  249. let oInput = document.createElement('input');
  250. oInput.value = url;
  251. document.body.appendChild(oInput);
  252. oInput.select(); // 选择对象;
  253. console.log(oInput.value);
  254. document.execCommand("Copy"); // 执行浏览器复制命令
  255. this.$message({message: msg, type: 'success'});
  256. oInput.remove()
  257. },
  258. delApp(row) {
  259. this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
  260. confirmButtonText: '确定',
  261. cancelButtonText: '取消',
  262. type: 'warning'
  263. }).then(() => {
  264. this.$http.post('{!! yzWebFullUrl('plugin.aggregation-cps.admin.app-version.delApp') !!}', {
  265. 'id': row.id
  266. }).then(function (response) {
  267. if (response.data.result) {
  268. this.$message({message: response.data.msg, type: 'success'})
  269. location.reload()
  270. }
  271. }, function (response) {
  272. this.$message({message: response.data.msg, type: 'error'})
  273. });
  274. }).catch(() => {
  275. this.$message({
  276. type: 'info',
  277. message: '已取消删除'
  278. });
  279. });
  280. },
  281. editApp: function () {
  282. this.$http.post('{!! yzWebFullUrl('plugin.aggregation-cps.admin.app-version.edit') !!}', {
  283. 'id': this.edit_modal.id, 'log': this.edit_modal.log
  284. }).then(function (response) {
  285. console.log(response);
  286. if (response.data.result) {
  287. this.$message({message: response.data.msg, type: 'success'});
  288. this.search();
  289. this.edit_modal.show = false;
  290. } else {
  291. this.$message({message: response.data.msg, type: 'error'});
  292. this.search();
  293. }
  294. }, function (response) {
  295. this.$message({message: response.data.msg, type: 'error'});
  296. this.search();
  297. });
  298. },
  299. showEditModal: function (data) {
  300. this.edit_modal.id = data.id;
  301. this.edit_modal.log = data.log;
  302. this.edit_modal.name = data.name;
  303. this.edit_modal.apk_name = data.apk_name;
  304. this.edit_modal.version = data.version;
  305. this.edit_modal.image = data.image;
  306. this.edit_modal.show = true;
  307. },
  308. openUrl: function (url) {
  309. window.open(url);
  310. },
  311. beforeAppUpload: function (file) {
  312. if (file == 'undefined') {
  313. return false;
  314. }
  315. this.app_modal_text1 = false;
  316. this.app_modal_text2 = true;
  317. },
  318. showAppModal: function () {
  319. this.app_list = [];
  320. this.app_show = true;
  321. this.app_modal_text1 = true;
  322. this.app_modal_text2 = false;
  323. this.showUploaderEl = true;
  324. },
  325. clearUpload() {
  326. this.$refs['app-upload'].clearFiles();
  327. },
  328. uploadSuccess: function (res, file) {
  329. console.log('上传成功回调');
  330. this.app_modal_text1 = true;
  331. this.app_modal_text2 = false;
  332. if (res.result == 1) {
  333. this.$message({message: res.msg, type: 'success'});
  334. this.app_show = false;
  335. this.search();
  336. this.showEditModal(res.data);
  337. } else {
  338. this.$message({message: res.msg, type: 'error'});
  339. }
  340. this.clearUpload();
  341. },
  342. uploadFailed: function (res) {
  343. console.log('上传失败回调');
  344. this.app_modal_text1 = true;
  345. this.app_modal_text2 = false;
  346. this.clearUpload();
  347. this.$message({message: '上传失败', type: 'error'});
  348. },
  349. openState: function (data) {
  350. var new_state = data.state;
  351. this.$http.post('{!! yzWebFullUrl('plugin.aggregation-cps.admin.app-version.changeOpenState') !!}', {
  352. 'id': data.id, 'state': new_state
  353. }).then(function (response) {
  354. console.log(response);
  355. if (response.data.result) {
  356. this.$message({message: response.data.msg, type: 'success'});
  357. this.search();
  358. } else {
  359. this.$message({message: response.data.msg, type: 'error'});
  360. this.search();
  361. }
  362. }, function (response) {
  363. this.$message({message: response.data.msg, type: 'error'});
  364. this.search();
  365. });
  366. },
  367. search: function () {
  368. this.$http.post('{!! yzWebFullUrl('plugin.aggregation-cps.admin.app-version.index') !!}', {
  369. 'page': this.current_page,
  370. 'is_json': 1,
  371. 'search_data': this.search_data,
  372. }).then(function (response) {
  373. console.log(response);
  374. if (response.data.result) {
  375. let this_data = response.data.data.list;
  376. this.upload_url = response.data.data.upload_url;
  377. this.download_page_url = response.data.data.download_page_url;
  378. this.current_page = this_data.current_page;
  379. this.list = this_data.data;
  380. this.total = this_data.total;
  381. this.per_page = this_data.per_page;
  382. } else {
  383. this.$message({message: response.data.msg, type: 'error'});
  384. }
  385. }, function (response) {
  386. this.$message({message: response.data.msg, type: 'error'});
  387. })
  388. },
  389. getData: function (val) {
  390. this.current_page = val;
  391. this.search();
  392. },
  393. changeForm: function () {
  394. this.search_data = this.search_form;
  395. this.current_page = 1;
  396. this.search();
  397. }
  398. },
  399. })
  400. </script>
  401. @endsection