index.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item label="登录地址" prop="ipaddr">
  5. <el-input
  6. maxlength="128"
  7. v-model="queryParams.ipaddr"
  8. placeholder="请输入登录地址"
  9. clearable
  10. style="width: 240px;"
  11. />
  12. </el-form-item>
  13. <el-form-item label="用户账号" prop="userName">
  14. <el-input
  15. maxlength="50"
  16. v-model="queryParams.userName"
  17. placeholder="请输入用户账号"
  18. clearable
  19. style="width: 240px;"
  20. />
  21. </el-form-item>
  22. <el-form-item label="登录状态" prop="status">
  23. <el-select
  24. v-model="queryParams.status"
  25. placeholder="请选择登录状态"
  26. clearable
  27. style="width: 240px"
  28. >
  29. <el-option
  30. v-for="dict in statusOptions"
  31. :key="dict.value"
  32. :label="dict.label"
  33. :value="dict.value"
  34. />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="登录时间">
  38. <el-date-picker
  39. v-model="dateRange"
  40. style="width: 240px"
  41. value-format="yyyy-MM-dd"
  42. type="daterange"
  43. range-separator="-"
  44. start-placeholder="开始日期"
  45. end-placeholder="结束日期"
  46. ></el-date-picker>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  50. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  51. </el-form-item>
  52. </el-form>
  53. <el-row :gutter="10" class="mb8">
  54. <el-col :span="1.5">
  55. <el-button
  56. style="display:none"
  57. type="danger"
  58. plain
  59. icon="el-icon-delete"
  60. size="mini"
  61. @click="handleDelete"
  62. v-hasPermi="['auditManager:logininfor:remove']"
  63. >删除</el-button>
  64. </el-col>
  65. <el-col :span="1.5">
  66. <el-button
  67. style="display:none"
  68. type="danger"
  69. plain
  70. icon="el-icon-delete"
  71. size="mini"
  72. @click="handleClean"
  73. v-hasPermi="['auditManager:logininfor:remove']"
  74. >清空</el-button>
  75. </el-col>
  76. </el-row>
  77. <div style="padding-top: 10px">
  78. <vxe-table
  79. ref="tables"
  80. align="center"
  81. :loading="loading"
  82. class="mytable-style"
  83. auto-resize
  84. border
  85. resizable
  86. export-config
  87. highlight-current-row
  88. show-overflow
  89. max-height="700"
  90. :data="list"
  91. :radio-config="{trigger: 'row'}"
  92. @sort-change="sortChangeEvent"
  93. :sort-config="{remote:'true'}"
  94. >
  95. <!-- <vxe-column type="radio" width="60"/>-->
  96. <vxe-table-column field="infoId" title="访问编号"/>
  97. <vxe-table-column field="userName" title="用户账号" :sortable="true"/>
  98. <vxe-table-column field="ipaddr" title="登录地址" width="130"/>
  99. <vxe-table-column field="loginLocation" title="登录地点"/>
  100. <vxe-table-column field="browser" title="浏览器"/>
  101. <vxe-table-column field="os" title="操作系统"/>
  102. <vxe-table-column field="status" title="登录状态" :formatter="statusFormat"/>
  103. <vxe-table-column field="msg" title="操作信息"/>
  104. <vxe-table-column field="loginTime" title="登录日期" :sortable="true"/>
  105. </vxe-table>
  106. <vxe-pager
  107. v-show="showTable"
  108. perfect
  109. :current-page.sync="currentPage"
  110. :page-size.sync="pageSize"
  111. :total="total"
  112. :page-sizes="[10,50,100]"
  113. :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
  114. @page-change="handlePageChange"
  115. >
  116. </vxe-pager>
  117. </div>
  118. </div>
  119. </template>
  120. <script>
  121. import {debounce} from "lodash";
  122. export default {
  123. name: "Logininfor",
  124. data() {
  125. return {
  126. showTable: true,
  127. currentPage: 1,
  128. pageSize: 10,
  129. // 总条数
  130. total: 0,
  131. statusOptions: [
  132. {value: '0', label: '成功'},
  133. {value: '1', label: '失败'}
  134. ],
  135. // 遮罩层
  136. loading: true,
  137. // 选中数组
  138. ids: [],
  139. // 非单个禁用
  140. single: true,
  141. // 非多个禁用
  142. multiple: true,
  143. // 选择用户名
  144. selectName: "",
  145. // 显示搜索条件
  146. showSearch: true,
  147. // 表格数据
  148. list: [],
  149. // 日期范围
  150. dateRange: [],
  151. // 默认排序
  152. defaultSort: {prop: 'loginTime', order: 'descending'},
  153. // 查询参数
  154. queryParams: {
  155. ipaddr: undefined,
  156. userName: undefined,
  157. status: undefined
  158. },
  159. sortOrder: 'loginTime&desc',
  160. };
  161. },
  162. created() {
  163. this.getList();
  164. },
  165. methods: {
  166. sortChangeEvent({column, property, order}) {
  167. if (order == null) {
  168. order = 'desc'
  169. }
  170. this.currentPage = 1
  171. this.sortOrder = property+'&'+order
  172. this.getList()
  173. },
  174. handlePageChange({currentPage, pageSize}) {
  175. this.currentPage = currentPage
  176. this.pageSize = pageSize
  177. this.getList()
  178. },
  179. // 列表状态格式化
  180. statusFormat({cellValue}) {
  181. let belongTo = '未知的类型'
  182. for (let i = 0; i < this.statusOptions.length; i++) {
  183. if (cellValue == "0") {
  184. belongTo = "成功"
  185. } else if (cellValue == "1") {
  186. belongTo = "失败"
  187. }
  188. }
  189. return belongTo
  190. },
  191. /** 查询登录日志列表 */
  192. getList:debounce(async function(){
  193. let sysTime
  194. let lk
  195. await this.$axios.get('/sysPolicyController/getLicenseKey').then((res) => {
  196. sysTime = res.data.sysTime
  197. lk = res.data.lk
  198. }).catch((error) => {
  199. })
  200. this.loading = true;
  201. let _startOperTime;
  202. let _endOperTime;
  203. if (this.dateRange == null) {
  204. _startOperTime = ''
  205. _endOperTime = ''
  206. } else {
  207. _startOperTime = this.dateRange[0]
  208. _endOperTime = this.dateRange[1]
  209. }
  210. var searchParams = {
  211. currentPage: this.currentPage,
  212. pageSize: this.pageSize,
  213. ipaddr: this.queryParams.ipaddr,
  214. userName: this.queryParams.userName,
  215. status: this.queryParams.status,
  216. startLoginTime:_startOperTime,
  217. endLoginTime:_endOperTime,
  218. sortOrder: this.sortOrder,
  219. sysTime: sysTime,
  220. lk: lk
  221. }
  222. await this.$axios.get('/sysLogininforController/getAll',
  223. {params: searchParams}).then((res) => {
  224. this.list = res.data.records
  225. this.total = res.data.total
  226. if (res.data.records == '') {
  227. this.showTable = false
  228. } else {
  229. this.showTable = true
  230. }
  231. this.loading = false
  232. }).catch((error) => {
  233. this.loading = false;
  234. // this.$message.error(error)
  235. })
  236. },1000),
  237. /** 搜索按钮操作 */
  238. handleQuery() {
  239. this.currentPage = 1
  240. this.pageSize = 10
  241. this.getList();
  242. },
  243. /** 重置按钮操作 */
  244. resetQuery() {
  245. this.dateRange = [];
  246. this.resetForm("queryForm");
  247. },
  248. /** 删除按钮操作 */
  249. handleDelete() {
  250. const _selectData = this.$refs.tables.getRadioRecord(true)
  251. if (_selectData == null) {
  252. this.$message({
  253. type: 'warning',
  254. message: '请选择记录!'
  255. });
  256. return
  257. }
  258. this.$confirm('是否确认删除用户?', '提示', {
  259. confirmButtonText: '确定',
  260. cancelButtonText: '取消',
  261. type: 'warning'
  262. }).then(() => {
  263. this.doDelete(_selectData)
  264. }).catch(() => {
  265. });
  266. },
  267. /**
  268. * 删除提交
  269. */
  270. doDelete:debounce(function(_selectData){
  271. const param = {
  272. infoId: _selectData.infoId
  273. }
  274. this.$axios.post('/sysLogininforController/delLoginInfo', param).then((res) => {
  275. if (res.code == 0) {
  276. this.$message({
  277. type: 'success',
  278. message: '删除成功!'
  279. });
  280. this.getList();
  281. } else {
  282. this.$message({
  283. type: 'error',
  284. message: res.data
  285. });
  286. }
  287. }).catch((error) => {
  288. this.$message({
  289. type: 'error',
  290. message: '删除失败!'
  291. });
  292. this.loading = false
  293. })
  294. },1000),
  295. /** 清空按钮操作 */
  296. handleClean() {
  297. if (this.list=='') {
  298. this.$message({
  299. type: 'warning',
  300. message: '没有记录不能清空!'
  301. });
  302. return
  303. }
  304. this.$confirm('是否确认清空所有登录日志数据项?', '提示', {
  305. confirmButtonText: '确定',
  306. cancelButtonText: '取消',
  307. type: 'warning'
  308. }).then(() => {
  309. this.cleanLogininfor();
  310. }).catch(() => {
  311. })
  312. },
  313. /**
  314. * 清空提交
  315. */
  316. cleanLogininfor:debounce(function(){
  317. this.$axios.post('/sysLogininforController/cleanLogininfor',{}).then((res) => {
  318. if (res.code == 0) {
  319. this.$message({
  320. type: 'success',
  321. message: '清空成功!'
  322. });
  323. this.getList();
  324. } else {
  325. this.$message({
  326. type: 'error',
  327. message: res.data
  328. });
  329. }
  330. }).catch((error) => {
  331. this.$message({
  332. type: 'error',
  333. message: '清空失败!'
  334. });
  335. this.loading = false
  336. })
  337. },1000)
  338. }
  339. };
  340. </script>