index.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <div id="app" v-cloak>
  2. <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  3. <div slot="header">
  4. <span>操作日志</span>
  5. </div>
  6. <div class="table-body">
  7. <el-form ref="form" style="margin-bottom: 10px;" :model="search" label-width="96px" size="mini">
  8. <el-row :gutter="24">
  9. <el-col :span="4" style="padding-left: 0;" class="top_form">
  10. <el-form-item label="操作员ID">
  11. <el-input v-model="search.operate_id" placeholder="操作员ID" clearable></el-input>
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="6" class="top_form">
  15. <el-form-item label="操作员名称">
  16. <el-input v-model="search.operate_name" placeholder="操作员名称" clearable></el-input>
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="4" class="top_form">
  20. <el-form-item label="模块">
  21. <el-select v-model="search.modules" placeholder="请选择模块">
  22. <el-option v-for="(name,title) in modules_arr" :label="name" :value="title" :key="name"></el-option>
  23. </el-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="4" style="padding-left: 0;" class="top_form">
  27. <el-form-item label="模型ID">
  28. <el-input v-model="search.model_id" placeholder="模型ID" clearable></el-input>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="6">
  32. <el-button type="primary" size="mini" @click="toSearch" >搜索</el-button>
  33. <el-button type="danger" size="mini" @click="resetSearch" >清除</el-button>
  34. </el-col>
  35. </el-row>
  36. <el-row :gutter="24">
  37. <el-col :span="4" style="padding-left: 0;" class="top_form">
  38. <el-form-item label="模型">
  39. <el-input v-model="search.model" placeholder="模型" clearable></el-input>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="4" class="top_form">
  43. <el-form-item label="时间">
  44. <el-date-picker
  45. style="margin-right: 20px;"
  46. size="small"
  47. v-model="search.selectDate"
  48. type="daterange"
  49. value-format="yyyy-MM-dd"
  50. range-separator="至"
  51. start-placeholder="开始日期"
  52. end-placeholder="结束日期">
  53. </el-date-picker>
  54. </el-form-item>
  55. </el-col>
  56. </el-row>
  57. </el-form>
  58. <el-table :data="list" stripe v-loading="loading" size="small" style="margin-bottom: 15px;">
  59. <el-table-column prop="id" label="日志ID" align="center"></el-table-column>
  60. <el-table-column prop="operate_name" label="操作人名称" align="center"></el-table-column>
  61. <el-table-column label="模块" prop="modules" align="center">
  62. <template slot-scope="scope">
  63. <el-tag size="small">{{ modules_arr[scope.row.modules] }}</el-tag>
  64. </template>
  65. </el-table-column>
  66. <el-table-column label="模型" prop="model" align="center"></el-table-column>
  67. <el-table-column label="模型ID" prop="model_id" align="center"></el-table-column>
  68. <el-table-column label="操作行为" prop="remark">
  69. <template slot-scope="scope">
  70. {{ model_arr[scope.row.model] ?? '' }} {{ scope.row.remark }}
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="更新前" prop="before_content" width="350">
  74. <template slot-scope="scope">
  75. <div style="width: 100%; max-height: 48px; overflow: hidden;">
  76. {{ scope.row.before_content }}
  77. </div>
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="更新后" prop="after_content" width="350">
  81. <template slot-scope="scope">
  82. <div style="width: 100%; max-height: 48px; overflow: hidden;">
  83. {{ scope.row.after_content }}
  84. </div>
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="IP" prop="operate_ip" align="center" width="120"></el-table-column>
  88. <el-table-column label="操作时间" align="center" width="160">
  89. <template slot-scope="scope">
  90. {{scope.row.created_at|dateTimeFormat('Y-m-d H:i:s')}}
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="操作" align="center">
  94. <template slot-scope="scope">
  95. <el-button type="text" @click="getJsonStr(scope.row.before_content, scope.row.after_content)">查看</el-button>
  96. </template>
  97. </el-table-column>
  98. </el-table>
  99. <div style="text-align: right;margin: 20px 0;">
  100. <el-pagination @current-change="pagination" background layout="prev, pager, next" :page-count="pageCount"></el-pagination>
  101. </div>
  102. </div>
  103. </el-card>
  104. <el-dialog title="变更信息" :visible.sync="dialogVisible" center width="60%" :before-close="handleClose" :close-on-click-modal="false">
  105. <el-row>
  106. <el-col :span="11">
  107. <el-card class="box-card">
  108. <div slot="header" class="clearfix">
  109. <span>变更前</span>
  110. </div>
  111. <el-input type="textarea" :rows="25" v-model="before_content"></el-input>
  112. </el-card>
  113. </el-col>
  114. <el-col :span="2"><div style="width: 100%; color: #fff; text-align: center;">|</div></el-col>
  115. <el-col :span="11">
  116. <el-card class="box-card">
  117. <div slot="header" class="clearfix">
  118. <span>变更后</span>
  119. </div>
  120. <el-input type="textarea" :rows="25" v-model="after_content"></el-input>
  121. </el-card>
  122. </el-col>
  123. </el-row>
  124. </el-dialog>
  125. </div>
  126. <script>
  127. const app = new Vue({
  128. el: '#app',
  129. data: {
  130. loading: false,
  131. dialogVisible: false,
  132. page: 1,
  133. pageCount: 0,
  134. list: [],
  135. search: {
  136. operate_id: null,
  137. operate_name: null,
  138. modules: null,
  139. selectDate:'',
  140. model_id:'',
  141. model:'',
  142. },
  143. model_arr: [],// 模型
  144. modules_arr: [],// 模块
  145. before_content: "",
  146. after_content: "",
  147. },
  148. mounted() {
  149. this.loadData();
  150. },
  151. methods: {
  152. //获取列表信息
  153. loadData() {
  154. this.loading = true;
  155. let params = {
  156. r: 'mall/backend-log/index',
  157. page:this.page,
  158. };
  159. params = Object.assign(params, this.search);
  160. request({
  161. params: params,
  162. method: 'get'
  163. }).then(e => {
  164. this.loading = false;
  165. if (e.data.code == 0) {
  166. this.list = e.data.data.list.list;
  167. this.model_arr = e.data.data.model_arr;
  168. this.modules_arr = e.data.data.modules_arr;
  169. this.pageCount = e.data.data.list.page_count;
  170. this.page = e.data.data.list.page;
  171. } else {
  172. this.$message.error(e.data.msg);
  173. }
  174. }).catch(e => {
  175. this.loading = false;
  176. });
  177. },
  178. pagination(currentPage) {
  179. let self = this;
  180. self.page = currentPage;
  181. self.loadData();
  182. },
  183. //搜索
  184. toSearch() {
  185. this.page = 1;
  186. this.loadData();
  187. },
  188. //清空搜索
  189. resetSearch() {
  190. this.search = {};
  191. this.loadData();
  192. },
  193. handleClose() {
  194. this.dialogVisible = false
  195. },
  196. getJsonStr(before_content, after_content) {
  197. this.dialogVisible = true;
  198. this.before_content = JSON.stringify(JSON.parse(before_content), null, '\t');
  199. this.after_content = JSON.stringify(JSON.parse(after_content), null, '\t');
  200. }
  201. }
  202. });
  203. </script>