TokenControl.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <template>
  2. <div>
  3. <crumbs title="license维护" style="min-width: 980px">
  4. <el-form :inline="true" class="demo-form-inline">
  5. <!-- <el-form-item label="标签类型:">
  6. <el-select size="mini" v-model="filter.tagType[0]" placeholder="标签类型" clearable>
  7. <el-option v-for="item in tagTypes" :label="item.name" :value="item.val" :key="item.id"></el-option>
  8. </el-select>
  9. </el-form-item>
  10. <el-form-item label="标签归属:">
  11. <el-select size="mini" v-model="filter.tagAdscription" @change="getValue" placeholder="标签归属" clearable>
  12. <el-option v-for="item in Adscriptions" :label="item.name" :value="item.val" :key="item.id" ></el-option>
  13. </el-select>
  14. </el-form-item> -->
  15. <el-form-item label="服务商:">
  16. <el-input size="mini" v-model.trim="filter.server" placeholder="标签系统名称" maxlength="255" clearable></el-input>
  17. </el-form-item>
  18. <el-form-item label="医院:">
  19. <el-input size="mini" v-model.trim="filter.hospital" placeholder="标签系统名称" maxlength="255" clearable></el-input>
  20. </el-form-item>
  21. <el-form-item>
  22. <el-button size="mini" @click="filterDatas">确认</el-button>
  23. <el-button size="mini" type="warning" @click="addToken">新增license</el-button>
  24. </el-form-item>
  25. </el-form>
  26. </crumbs>
  27. <div class="contents">
  28. <el-table
  29. :data="list"
  30. border
  31. style="width: 100%">
  32. <el-table-column
  33. :resizable = "false"
  34. type="index"
  35. :index = 'indexMethod'
  36. label="编号"
  37. width="60">
  38. </el-table-column>
  39. <el-table-column
  40. :resizable = "false"
  41. prop="gmtModified"
  42. label="操作时间"
  43. width="180">
  44. </el-table-column>
  45. <el-table-column
  46. :resizable = "false"
  47. prop="server"
  48. label="服务商">
  49. </el-table-column>
  50. <el-table-column
  51. :resizable = "false"
  52. prop="hospital"
  53. label="医院">
  54. </el-table-column>
  55. <el-table-column
  56. :resizable = "false"
  57. prop="remainDay"
  58. label="license有效天数">
  59. </el-table-column>
  60. <el-table-column
  61. :resizable = "false"
  62. prop="validTime"
  63. label="token有效时间(分钟)">
  64. </el-table-column>
  65. <el-table-column
  66. :resizable = "false"
  67. prop="loginKey"
  68. label="loginKey">
  69. </el-table-column>
  70. <el-table-column
  71. :resizable = "false"
  72. prop="modifier"
  73. label="操作人">
  74. </el-table-column>
  75. <el-table-column
  76. :resizable = "false"
  77. prop="operate"
  78. label="操作">
  79. <template slot-scope="scope">
  80. <el-button @click="modifyTagGroup(scope.row, 'modify')" type="text" size="small">修改</el-button>
  81. <span style="margin:0 3px;">|</span>
  82. <el-button @click="downLoadFile(scope.row)" type="text" size="small">下载</el-button>
  83. <span style="margin:0 3px;">|</span>
  84. <el-button @click="showDelDialog(scope.row.id)" class="delete" type="text" size="small">删除</el-button>
  85. </template>
  86. </el-table-column>
  87. </el-table>
  88. <div class="pagination">
  89. <el-pagination :current-page.sync="currentPage"
  90. @current-change="currentChange"
  91. background
  92. :page-size="pageSize"
  93. :page-sizes="pageSizeArr"
  94. @size-change="handleSizeChange"
  95. :layout="pageLayout"
  96. :total="total">
  97. </el-pagination>
  98. </div>
  99. </div>
  100. </div>
  101. </template>
  102. <script>
  103. import api from '@api/safeControl.js';
  104. import config from '@api/config.js';
  105. import $ from 'jquery';
  106. export default {
  107. name: 'TokenControl',
  108. data: function() {
  109. return {
  110. list: [],
  111. filter: {
  112. hospital:'',
  113. server:''
  114. },
  115. currentPage: 1,
  116. modifier: '',
  117. pageSize: config.pageSize,
  118. pageSizeArr:config.pageSizeArr,
  119. pageLayout:config.pageLayout,
  120. total: 0,
  121. }
  122. },
  123. created() {
  124. const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
  125. this.modifier = userLoginDTO && userLoginDTO.linkman
  126. this.getDataList()
  127. },
  128. watch: {
  129. 'filter': {
  130. handler: function () {
  131. this.searched = false;
  132. },
  133. deep: true
  134. }
  135. },
  136. beforeRouteEnter(to, from, next) {
  137. next(vm => {
  138. //const pm = to.param;
  139. Object.assign(vm, to.params);
  140. vm.inCurrentPage=to.params.currentPage;
  141. })
  142. },
  143. methods: {
  144. handleSizeChange(val){
  145. this.pageSize = val;
  146. this.currentPage = utils.getCurrentPage(this.currentPage, this.total, this.pageSize);
  147. this.getDataList();
  148. },
  149. getDataList(isTurnPage) {
  150. const param = this.getFilterItems(isTurnPage);
  151. this.searched = true;
  152. const loading = this.$loading({
  153. lock: true,
  154. text: 'Loading',
  155. spinner: 'el-icon-loading',
  156. background: 'rgba(0, 0, 0, 0.7)'
  157. });
  158. api.tokenList(param).then((res) => {
  159. loading.close()
  160. const list = res.data.data.records
  161. this.list = list;
  162. this.total = res.data.data.total;
  163. if(this.inCurrentPage!==undefined){
  164. this.currentPage=this.inCurrentPage;
  165. this.inCurrentPage = undefined;
  166. }
  167. })
  168. },
  169. filterDatas() {
  170. this.currentPage = 1;
  171. this.getDataList();
  172. },
  173. addToken() {
  174. const pam = this.searched ? {
  175. currentPage: this.currentPage,
  176. pageSize:this.pageSize,
  177. filter: this.filter
  178. } : {currentPage: this.currentPage,
  179. pageSize:this.pageSize};
  180. this.$router.push({name: 'AddToken', params: pam});
  181. },
  182. modifyTagGroup(row, type) {
  183. api.tokenDetails({id:row.id}).then((res)=>{
  184. const {code,data,msg} = res.data;
  185. if(code=='0'){
  186. const item = Object.assign({},row,data);
  187. const pam = this.searched ? {
  188. currentPage: this.currentPage,
  189. filter: this.filter
  190. } : {currentPage: this.currentPage};
  191. // console.log('item', item)
  192. if(type == 'modify') {
  193. this.$router.push({
  194. name: 'AddToken',
  195. params: Object.assign(pam, {isEdit: true, data: item})
  196. });
  197. } else {
  198. return
  199. }
  200. }else{
  201. this.$message({
  202. message: msg,
  203. type: 'warning'
  204. });
  205. }
  206. });
  207. },
  208. downLoadFile(row) {
  209. const url = row.url.replace(/{imageUrlPrefix}/g,config.imgHost) + '?download=1'
  210. // var $form = $('<form method="GET"></form>');
  211. // $form.attr('action', url);
  212. // $form.appendTo($('body'));
  213. // $form.submit();
  214. this.download(url, 'license.properties')
  215. // const ele = document.createElement('a');
  216. //   ele.setAttribute('download' , 'download');//用于设置下载文件的文件名
  217. //   ele.setAttribute('href',url); //设置下载文件的url地址
  218. //   ele.click();
  219. },
  220. getBlob(url,cb) {
  221. var xhr = new XMLHttpRequest();
  222. xhr.open('GET', url, true);
  223. xhr.responseType = 'blob';
  224. xhr.onload = function() {
  225. if (xhr.status === 200) {
  226. cb(xhr.response);
  227. }
  228. };
  229. xhr.send();
  230. },
  231. saveAs(blob, filename) {
  232. if (window.navigator.msSaveOrOpenBlob) {
  233. navigator.msSaveBlob(blob, filename);
  234. } else {
  235. var link = document.createElement('a');
  236. var body = document.querySelector('body');
  237. link.href = window.URL.createObjectURL(blob);
  238. link.download = filename;
  239. // fix Firefox
  240. link.style.display = 'none';
  241. body.appendChild(link);
  242. link.click();
  243. body.removeChild(link);
  244. window.URL.revokeObjectURL(link.href);
  245. };
  246. },
  247. download(url, filename){
  248. const that = this
  249. that.getBlob(url, function(blob) {
  250. that.saveAs(blob, filename);
  251. });
  252. },
  253. currentChange(next) {
  254. this.currentPage = next;
  255. this.getDataList(true);
  256. },
  257. getFilterItems(isTurnPage) {
  258. //翻页时筛选条件没点确定则清空
  259. if(isTurnPage&&!this.searched){
  260. this.clearFilter();
  261. };
  262. const param = {
  263. current: this.inCurrentPage||this.currentPage,
  264. size: this.pageSize,
  265. hospital: this.filter.hospital,
  266. server: this.filter.server
  267. };
  268. return param;
  269. },
  270. indexMethod(index) {
  271. return ((this.currentPage - 1) * this.pageSize) + index + 1;
  272. },
  273. warning(msg,type){
  274. this.$message({
  275. showClose: true,
  276. dangerouslyUseHTMLString: true,
  277. message:'<p>'+msg+'</p>',
  278. type:type||'warning'
  279. })
  280. },
  281. showConfirmDialog(msg,resolve){
  282. this.$alert(msg, '提示', {
  283. confirmButtonText: '确定',
  284. type: 'warning'
  285. }).then(() => {
  286. resolve();
  287. }).catch(() => {});
  288. },
  289. clearFilter(){
  290. },
  291. showDelDialog(id){
  292. this.showConfirmDialog('是否删除该令牌?',()=>{
  293. const param = {id:id,creator:this.modifier}
  294. api.tokenDelete(param).then((res)=>{
  295. if(res.data.code=='0'){
  296. if(!this.searched){
  297. //未点确认时清空搜索条件
  298. this.clearFilter();
  299. }
  300. if(this.list.length==1){
  301. //当前在最后一页且只有一条数据时,删除后跳到前一页
  302. this.currentPage = this.currentPage===1?1:this.currentPage-1;
  303. }
  304. this.getDataList();
  305. this.warning(res.data.msg || '操作成功','success');
  306. }else{
  307. this.warning(res.data.msg);
  308. }
  309. }).catch((error)=>{
  310. this.warning(error);
  311. })
  312. });
  313. }
  314. }
  315. }
  316. </script>
  317. <style lang="less">
  318. @import "../../less/admin.less";
  319. .delete{
  320. color: red;
  321. }
  322. .delete:hover {
  323. color: red;
  324. }
  325. .pagination {
  326. min-width: 1010px;
  327. }
  328. </style>